140 lines
2.6 KiB
Markdown
140 lines
2.6 KiB
Markdown
|
|
你是一个资深 Java 后端工程师,请在当前 Spring Boot(Java8)项目中实现一个完整的 MCP Server,并加入“AI 自动选 Tool(RAG + Tool Routing)”能力。
|
|||
|
|
|
|||
|
|
# 一、基础 MCP 能力(必须实现)
|
|||
|
|
|
|||
|
|
1. 提供统一入口:
|
|||
|
|
POST /mcp
|
|||
|
|
|
|||
|
|
2. 实现 JSON-RPC 2.0:
|
|||
|
|
|
|||
|
|
* initialize
|
|||
|
|
* tools/list
|
|||
|
|
* tools/call
|
|||
|
|
|
|||
|
|
3. 返回格式:
|
|||
|
|
{
|
|||
|
|
"jsonrpc": "2.0",
|
|||
|
|
"id": "...",
|
|||
|
|
"result": ...
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
# 二、流式能力(必须)
|
|||
|
|
|
|||
|
|
1. 禁止使用 SseEmitter
|
|||
|
|
2. 使用 HttpServletResponse + OutputStream
|
|||
|
|
3. 实现 chunked streaming(write + flush)
|
|||
|
|
|
|||
|
|
# 三、Tool 注册中心(必须)
|
|||
|
|
|
|||
|
|
实现:
|
|||
|
|
|
|||
|
|
* McpToolRegistry
|
|||
|
|
* register / get / list
|
|||
|
|
|
|||
|
|
Tool结构:
|
|||
|
|
|
|||
|
|
* name
|
|||
|
|
* description(非常重要,用于向量检索)
|
|||
|
|
* inputSchema
|
|||
|
|
* handler
|
|||
|
|
|
|||
|
|
# 四、RAG Tool 检索模块(新增重点)
|
|||
|
|
|
|||
|
|
实现一个 ToolRetriever 组件:
|
|||
|
|
|
|||
|
|
1. 构建向量索引(简化实现):
|
|||
|
|
|
|||
|
|
* 使用内存存储 List<ToolEmbedding>
|
|||
|
|
* ToolEmbedding:
|
|||
|
|
|
|||
|
|
* toolName
|
|||
|
|
* description
|
|||
|
|
* embedding(double[])
|
|||
|
|
|
|||
|
|
2. 提供方法:
|
|||
|
|
List<McpTool> retrieve(String query, int topK)
|
|||
|
|
|
|||
|
|
3. embedding 实现(简化):
|
|||
|
|
|
|||
|
|
* 可使用:
|
|||
|
|
|
|||
|
|
* 简单 TF-IDF
|
|||
|
|
* 或 mock embedding(字符串相似度)
|
|||
|
|
* 不依赖外部服务(保证可运行)
|
|||
|
|
|
|||
|
|
# 五、Tool Router(核心)
|
|||
|
|
|
|||
|
|
实现 ToolRouter:
|
|||
|
|
|
|||
|
|
流程:
|
|||
|
|
|
|||
|
|
1. 接收用户问题 query
|
|||
|
|
2. 调用 ToolRetriever → 获取 topK tools
|
|||
|
|
3. 构建 prompt(只包含候选 tools)
|
|||
|
|
4. 返回候选 tools 给上层(或直接选)
|
|||
|
|
|
|||
|
|
要求:
|
|||
|
|
|
|||
|
|
* 不允许返回全部 tools
|
|||
|
|
* 默认 topK = 3~5
|
|||
|
|
|
|||
|
|
# 六、tools/call 升级(关键)
|
|||
|
|
|
|||
|
|
当 method = tools/call 时:
|
|||
|
|
|
|||
|
|
1. 如果请求未指定 tool:
|
|||
|
|
|
|||
|
|
* 自动触发 ToolRouter
|
|||
|
|
* 选出最优 tool
|
|||
|
|
|
|||
|
|
2. 如果指定 tool:
|
|||
|
|
|
|||
|
|
* 直接执行
|
|||
|
|
|
|||
|
|
# 七、默认内置工具
|
|||
|
|
|
|||
|
|
实现:
|
|||
|
|
|
|||
|
|
1. hello
|
|||
|
|
输入:name
|
|||
|
|
输出:hello xxx
|
|||
|
|
|
|||
|
|
2. meeting.summary
|
|||
|
|
输入:text
|
|||
|
|
输出:模拟总结
|
|||
|
|
|
|||
|
|
# 八、架构分层(必须)
|
|||
|
|
|
|||
|
|
* controller
|
|||
|
|
* service
|
|||
|
|
* registry
|
|||
|
|
* retriever(新增)
|
|||
|
|
* router(新增)
|
|||
|
|
|
|||
|
|
# 九、扩展能力(必须预留)
|
|||
|
|
|
|||
|
|
1. 支持替换为真实向量数据库(如 Milvus / ES)
|
|||
|
|
2. 支持 embedding API(OpenAI / 本地模型)
|
|||
|
|
3. 支持多 MCP Server(未来扩展)
|
|||
|
|
|
|||
|
|
# 十、输出要求
|
|||
|
|
|
|||
|
|
1. 输出完整代码:
|
|||
|
|
|
|||
|
|
* McpController
|
|||
|
|
* McpService
|
|||
|
|
* McpToolRegistry
|
|||
|
|
* ToolRetriever
|
|||
|
|
* ToolRouter
|
|||
|
|
* ToolEmbedding
|
|||
|
|
* ToolInitializer
|
|||
|
|
* McpRequest
|
|||
|
|
|
|||
|
|
2. 代码必须:
|
|||
|
|
|
|||
|
|
* 可运行
|
|||
|
|
* 无伪代码
|
|||
|
|
* 包含必要注释
|
|||
|
|
* 代码生成目录在ruoyi-sip/src/main/java/com/ruoyi/sip/llm
|
|||
|
|
3. 不要解释,只输出代码
|