厦门网站设计培训公司网站建设优化项目
厦门网站设计培训公司,网站建设优化项目,网店买卖有哪些平台,怎么做网站zwnet本次主要分享 OpenSpec 的整体开发流程#xff0c;并以 MCP 工具作为示例进行演示。该示例功能简单#xff0c;但覆盖了从需求、设计到实现的完整过程#xff0c;既能帮助理解 OpenSpec 的使用方式#xff0c;也能让大家掌握 MCP 工具的基本开发流程。首先对 MCP 与 OpenSp…本次主要分享 OpenSpec 的整体开发流程并以 MCP 工具作为示例进行演示。该示例功能简单但覆盖了从需求、设计到实现的完整过程既能帮助理解 OpenSpec 的使用方式也能让大家掌握 MCP 工具的基本开发流程。首先对 MCP 与 OpenSpec 进行一点概念普及。一、MCP 协议简介MCPModel Context Protocol是 Anthropic 推出的开放协议用于规范 AI 应用与外部数据源的交互。解决了什么问题传统模式下让 AI 访问数据库、文件系统、第三方 API每接一个数据源都要写一套对接代码认证、数据格式解析、错误处理... 重复劳动多维护成本高。MCP 规范了一套统一接口数据源按标准实现后AI 就能直接调用。核心能力Tools- AI 可调用的函数Resources- AI 可读取的数据Prompts- 预定义的提示模板协议本身与传输层无关JSON-RPC 2.0 格式通信。二、OpenSpec 流程简介OpenSpec是一个工件驱动的开发方法通过结构化的文档规范开发过程。解决了什么问题AI 辅助编程时经常出现需求理解偏差、代码偏离原始意图、后期验证困难等问题。OpenSpec 通过前置设计和后期验证减少 AI 开发中的需求偏差和返工。核心工件工件描述提示词Proposal设计提案记录决策和权衡我需要为 xxx 功能创建一个提案包含技术选型、架构设计决策Tasks任务拆分基于上面的提案帮我拆解成具体的开发任务Design详细设计基于任务列表帮我设计类结构、接口定义Implementation代码实现按照设计文档实现具体的代码Verification验证归档验证实现是否完整整理归档OpenSpec 流程的价值在 AI 辅助编程场景下OpenSpec 流程能解决几个常见问题• 避免开发过程中需求漂移• 每一步都有明确的产出物• 后期验证有据可依• 归档后可追溯决策过程三、MCP工具开发功能目标用 SpringBoot3 SSE 实现一个基础的 MCP 服务器 Demo• 支持 Tools 能力• 代码结构清晰• 便于演示和讲解OpenSpec 工件清单本项目将产出以下工件工件内容Proposal技术选型、架构设计决策Tasks任务拆分和依赖关系Design类设计、接口定义Implementation核心代码实现Verification测试结果和归档四、Proposal设计提案提示词模板我想用 SpringBoot3 SSE 实现一个 MCP 服务器 Demo帮我创建一个提案。 需求 - 实现 Tools 能力initialize、tools/list、tools/call - 提供一个示例工具查询日程get_calendar_events - 代码结构清晰便于演示技术选型决策传输层选型最初考虑了三种方案Stdio、WebSocket、SSE。• Stdio 最简单官方示例都用这个但我们的项目是 Web 应用集成起来不够自然• WebSocket 功能最强双向通信但实现相对复杂• SSE 基于 HTTP 长连接实现简单也符合 MCP 的推送模式本示例项目使用sse方案。核心抽象设计MCP 协议定义了多种能力本 Demo 先聚焦 Tools工具。工具是 AI 可调用的函数后续可根据需求扩展。协议方法初步确定实现以下方法initialize - 初始化握手协商协议版本 tools/list - 返回所有可用工具 tools/call - 执行指定工具五、Tasks任务拆分提示词模板基于上面的提案帮我拆解成具体的开发任务。第一次拆解根据提案把开发拆成以下任务任务描述依赖T1项目初始化添加 Web、SSE 依赖无T2实现 JSON-RPC 协议模型T1T3实现 SSE ControllerT1T4实现协议路由器T2, T3T5实现 Tool 接口和注册中心T2T6实现示例工具T5六、Design详细设计提示词模板基于任务列表帮我做详细设计类结构、核心接口、数据流转。整体架构AI Client │ SSE │ ┌─────────────────────────────────────┐ │ SpringBoot Server │ │ │ │ ┌─────────────────────────────┐ │ │ │ MCP Protocol Handler │ │ │ └─────────────────────────────┘ │ │ │ │ │ ┌───────────────┼───────────────┐ │ │ ▼ ▼ ▼ │ │ Tool Registry Resource Registry Prompt │ │ │ │ │ │ │ ▼ ▼ ▼ │ │ 工具实现 资源实现 提示实现 │ └─────────────────────────────────────┘类设计思考协议层•JsonRpcRequest/JsonRpcResponse- 纯粹的 POJO只做序列化/反序列化•McpHandler- 负责请求路由不关心传输细节注册中心•ToolRegistry- 工具注册中心利用 Spring 的ListTool自动注入• 这样的好处是新增工具只需写一个类不用改配置Controller• 接收 HTTP POST 请求• 返回SseEmitter实现服务端推送• 超时时间设为 60 秒工具接口设计public interface McpTool { String getName(); // 工具名字 String getDescription(); // 描述告诉 AI 什么时候用它 MapString, Object getInputSchema(); // 参数格式 String execute(MapString, Object arguments); // 执行逻辑 }七、Implementation实现提示词模板按照设计文档实现以下功能 1. JSON-RPC 协议模型JsonRpcRequest、JsonRpcResponse 2. 协议处理器initialize、tools/list、tools/call 3. SSE ControllerSseEmitter 4. Tool 接口和注册中心 5. 日程查询工具GetCalendarEventsTool根据日期查询日程 使用 SpringBoot3 Spring Web用 Component、Autowired 进行依赖注入。以下代码均由AI根据提案相关内容生成此处主要为了方便理解贴出了部分关键代码。7.1 项目初始化用start.spring.io生成项目骨架添加了 Spring Web 依赖。7.2 JSON-RPC 协议模型协议格式是 MCP 规范定义好的直接照搬public class JsonRpcRequest { private String jsonrpc 2.0; private String method; private Object params; private Object id; }7.3 协议处理器的实现这部分是核心路由逻辑如下public JsonRpcResponse handle(JsonRpcRequest request) { return switch (request.getMethod()) { case initialize - handleInitialize(request); case tools/list - handleListTools(request); case tools/call - handleCallTool(request); default - JsonRpcResponse.error(-32601, 方法不存在, request.getId()); }; }7.4 SSE 接口SSE 接口实现PostMapping(value /mcp, produces MediaType.TEXT_EVENT_STREAM_VALUE) public ResponseBodyEmitter handle(RequestBody JsonRpcRequest request) { SseEmitter emitter new SseEmitter(60_000L); CompletableFuture.runAsync(() - { try { JsonRpcResponse response mcpHandler.handle(request); emitter.send(SseEmitter.event() .data(objectMapper.writeValueAsString(response))); emitter.complete(); } catch (Exception e) { emitter.completeWithError(e); } }); return emitter; }7.5 工具注册利用 Spring 的依赖注入Component public class ToolRegistry { private final MapString, Tool tools new ConcurrentHashMap(); Autowired public void registerAllTools(ListTool toolList) { toolList.forEach(tool - tools.put(tool.getName(), tool)); } }这样所有实现Tool接口的Component都会自动注册进来。7.6 示例工具写了一个简单的日程查询工具Component public class GetCalendarEventsTool implements Tool { Override public String getName() { return get_calendar_events; } Override public String getDescription() { return 查询指定日期的日历事件; } Override public String execute(MapString, Object arguments) { String date (String) arguments.get(date); return 2026-02-10 有 3 个会议; } }八、Verification验证与归档提示词模板验证实现是否完整帮我生成归档报告。 需要验证 - JSON-RPC 协议解析和响应initialize、tools/list、tools/call - SSE 传输层 - 日程查询工具get_calendar_events调用测试结果正向测试→ POST /mcp {method:tools/list,id:1} ← {jsonrpc:2.0,result:{tools:[{name:get_calendar_events,...}]},id:1} → POST /mcp {method:tools/call,params:{name:get_calendar_events,arguments:{date:2026-02-10}},id:2} ← {jsonrpc:2.0,result:{content:[{type:text,text:...}]},id:2}异常测试→ POST /mcp {method:unknown,id:1} ← {jsonrpc:2.0,error:{code:-32601,message:方法不存在},id:1}归档openspec archive --change change-name九、在 Claude Code 中测试 MCP 服务器前置条件确保 MCP 服务器已启动# 编译并启动 SpringBoot 应用 ./gradlew bootRun # 服务器默认在 http://localhost:8080 运行配置方法SSE 方式需要在 MCP 客户端和服务器之间建立 HTTP 连接。一种简单方式是使用 npx 直接调用# 启动 MCP 服务器另一个终端 # 添加MCP服务 claude mcp add --transport http --scope user calendar-mcp http://localhost:8080/mcp在 Claude Code 中使用1. 确保 MCP 服务器已启动运行2. 在 Claude Code 对话中直接测试请调用 get_calendar_events 工具查询今天的日程3. 如果配置正确Claude Code 会自动发现可用工具并调用验证步骤1. 服务器启动后确认控制台输出Started McpServerApplication in x seconds2. 测试接口是否正常返回curl -X POST http://localhost:8080/mcp \ -H Content-Type: application/json \ -d {jsonrpc:2.0,method:tools/list,id:1}验证配置1. 重启 Claude Code2. 对话中尝试调用工具• 列出所有可用工具• 查询今天的日程3. 如果工具正常返回说明 MCP 服务器配置成功十、总结本文基于 SpringBoot3 和 SSE 实现最小可用 MCP 服务器并通过 OpenSpec 工件驱动流程从提案到实现完整演示 AI 辅助后端开发的技术落地实践希望和能给大家一些关于OpenSpec 与 MCP 开发使用的参考。https://github.com/yuboon/ai-examples/tree/main/002-springboot-mcp