requirements-analysis
Version:
简化的需求分析MCP服务 - 基于AI软件工程(优化版)6步流程
154 lines (124 loc) • 5.87 kB
JavaScript
/**
* 模拟真实的MCP调用流程
* 这个测试模拟Claude Desktop实际调用MCP工具的方式
*/
const { Server } = require('@modelcontextprotocol/sdk/server/index.js');
const { StdioServerTransport } = require('@modelcontextprotocol/sdk/server/stdio.js');
const fs = require('fs').promises;
const path = require('path');
// 导入我们的服务器类
const { RequirementsAnalysisServer } = require('./dist/index.js');
async function testRealMCPCall() {
console.log('🧪 测试真实的MCP调用流程');
try {
// 创建服务器实例
const analysisServer = new RequirementsAnalysisServer();
// 模拟MCP工具调用
console.log('\n📋 模拟start_requirements_analysis工具调用...');
// 直接调用内部方法,模拟MCP框架的调用
const startArgs = {
projectName: "真实MCP测试项目",
projectType: "new",
industry: "电子商务",
background: "当前电商平台缺乏智能推荐系统,用户体验不佳,转化率低,需要建立个性化推荐引擎提升用户购买体验和平台收益",
objectives: "建立智能推荐系统,提升用户转化率30%,增加平台收入500万/年,提升用户满意度和留存率",
budget: "100万",
timeline: "6个月"
};
// 调用startRequirementsAnalysis方法
const startResult = await analysisServer.startRequirementsAnalysis(startArgs);
console.log('✅ start_requirements_analysis调用成功');
// 从返回的内容中提取sessionId
const resultText = startResult.content[0].text;
console.log('📄 返回内容:', resultText.substring(0, 200) + '...');
const sessionIdMatch = resultText.match(/"sessionId":\s*"([a-z0-9]+)"/i);
if (!sessionIdMatch) {
throw new Error('无法从返回结果中提取sessionId');
}
const sessionId = sessionIdMatch[1];
console.log('📝 提取到sessionId:', sessionId);
// 等待一下,确保初始化完成
await new Promise(resolve => setTimeout(resolve, 100));
// 模拟execute_step工具调用
console.log('\n📝 模拟execute_step工具调用(第1步)...');
const step1Args = {
sessionId: sessionId,
stepNumber: 1,
result: `=== 标准化项目信息 ===
【项目基本信息】
- 项目名称:真实MCP测试项目(经验证,名称明确具体,符合电商行业项目命名规范)
- 项目类型:新建系统(符合当前业务发展阶段和技术成熟度)
- 所属行业:电子商务(目标市场明确,技术需求匹配度高)
- 项目背景:当前电商平台缺乏智能推荐系统,用户体验不佳,转化率低
- 核心目标:建立智能推荐系统,提升用户转化率30%,增加平台收入500万/年
【约束条件】
- 项目预算:100万(预算充足,符合同类项目投入水平)
- 项目周期:6个月(时间安排合理,可分阶段实施)
- 团队规模:待确定
- 部署要求:待确定
- 特殊要求:无
【验证结果】
- 信息完整度:90%(基本信息齐全,部分细节需要补充)
- 目标明确度:高(目标量化清晰,可衡量性强)
- 可行性评估:高(技术成熟,市场需求明确)
- 风险等级:中(主要风险在于算法复杂度和数据质量)
【后续建议】
1. 建议明确推荐算法的技术选型(协同过滤、深度学习等)
2. 建议确定数据源和数据质量要求
3. 建议制定A/B测试和效果评估方案
4. 建议考虑用户隐私保护和合规要求
=== 验证完成 ===`
};
// 调用executeStep方法
const step1Result = await analysisServer.executeStep(
step1Args.sessionId,
step1Args.stepNumber,
step1Args.result
);
console.log('✅ execute_step第1步调用成功');
console.log('📄 返回内容:', step1Result.content[0].text.substring(0, 200) + '...');
// 检查文档是否保存
console.log('\n📁 检查文档保存情况...');
const outputDir = path.join('outputs', '真实MCP测试项目');
try {
const files = await fs.readdir(outputDir);
console.log('📂 输出目录内容:', files);
const step1File = files.find(f => f.startsWith('step1-'));
if (step1File) {
console.log('✅ 第1步文档已保存:', step1File);
const filePath = path.join(outputDir, step1File);
const content = await fs.readFile(filePath, 'utf-8');
console.log('📄 文档内容长度:', content.length, '字符');
console.log('📄 文档开头:', content.substring(0, 200) + '...');
// 检查文档是否只包含结果,不包含提示词
if (content.includes('你是一位') || content.includes('请对以下')) {
console.log('⚠️ 警告:文档包含提示词内容');
} else {
console.log('✅ 文档格式正确:只包含结果内容');
}
} else {
console.log('❌ 第1步文档未找到');
console.log('📂 可用文件:', files);
}
} catch (error) {
console.log('❌ 无法读取输出目录:', error.message);
console.log('📂 尝试检查父目录...');
try {
const parentFiles = await fs.readdir('outputs');
console.log('📂 outputs目录内容:', parentFiles);
} catch (parentError) {
console.log('❌ 无法读取outputs目录:', parentError.message);
}
}
console.log('\n🎉 真实MCP调用测试完成');
} catch (error) {
console.error('\n❌ 测试失败:', error.message);
console.error('错误详情:', error);
console.error('错误堆栈:', error.stack);
}
}
// 运行测试
if (require.main === module) {
testRealMCPCall().catch(console.error);
}