MCP 协议到底解决了什么问题 本文面向想理解 MCP 协议设计动机、或想把自己的能力暴露给 AI 工具的开发者。预计阅读时间12 分钟最终效果理解 MCP 的 Host / Client / Server 模型、stdio 传输、工具注册以及它与 Function Calling 的区别和适用边界。一个恼人的现实你有 10 个 AI 编程工具——Claude Code、Cursor、Copilot、Windsurf、Cline……每个都能调用外部工具。你想让它们都能访问你的 ChatCrystal 知识库。没有 MCP 的世界里你需要为每个工具写一个插件/扩展适配各自的工具注册格式处理每个工具不同的通信协议有的用 stdio有的用 HTTP有的用 WebSocket维护 N 个独立的集成代码每次 API 变更都要同步更新这就是 MCP 要解决的问题给 AI 工具的外部能力集成定义一个统一标准。MCP 是什么MCPModel Context Protocol是 Anthropic 在 2024 年底发布的开放协议。它的定位很清晰MCP 是一个开放协议标准化了应用程序向 LLM 提供上下文的方式。用一个类比USB-C 统一了充电接口MCP 统一了 AI 工具的能力接口。不管你是 Claude Code 还是 Cursor只要支持 MCP 协议就能接入任何 MCP Server 提供的工具。核心概念MCP 定义了三个角色HostAI 应用本身如 Claude Code、CursorClientHost 内部的 MCP 客户端负责与 Server 通信Server提供工具/资源的服务端如 ChatCrystal 的 MCP Server┌─────────────────────────────────────────┐ │ Host (Claude Code / Cursor / ...) │ │ ┌─────────────────────────────────┐ │ │ │ MCP Client │ │ │ │ ← stdio / HTTP → │ │ │ └─────────────────────────────────┘ │ └─────────────────────────────────────────┘ ↕ ┌─────────────────────────────────────────┐ │ MCP Server (ChatCrystal) │ │ - search_knowledge │ │ - get_note │ │ - list_notes │ │ - get_relations │ │ - recall_for_task │ │ - validate_task_memory │ │ - write_task_memory │ └─────────────────────────────────────────┘传输层stdio 是主力MCP 支持两种传输方式stdio标准输入/输出最常用的方式。Host 启动 MCP Server 作为子进程通过 stdin/stdout 通信{mcpServers:{chatcrystal:{command:crystal,args:[mcp]}}}当 Claude Code 启动时它会执行crystal mcp这个进程在后台持续运行。Claude Code 通过 stdin 发送 JSON-RPC 请求MCP Server 通过 stdout 返回响应。stdio 的优势是零配置不需要端口、不需要网络、不需要认证。Host 进程和 Server 进程在同一个机器上通信走操作系统管道延迟极低。HTTPStreamable HTTP适用于远程场景——MCP Server 部署在服务器上多个客户端通过网络访问。ChatCrystal 目前使用 stdio 模式因为它的定位是本地知识库工具。工具注册声明式定义MCP Server 通过server.tool()注册工具声明工具名称、描述和参数 schemaconstservernewMcpServer({name:chatcrystal,version:0.2.0,});server.tool(search_knowledge,Semantic search across your AI conversation knowledge base.,{query:z.string().describe(Search query text),limit:z.number().optional().default(10).describe(Maximum results),},async({query,limit}){constresultsawaitclient.search(query,limit);return{content:[{type:text,text:JSON.stringify(results,null,2)}],};},);参数用 Zod schema 定义MCP SDK 自动转换为 JSON Schema 发送给 Host。Host 的 LLM 看到工具描述和参数 schema就能在对话中决定何时调用、传什么参数。这个设计和 OpenAI 的 Function Calling 非常相似但有一个关键区别MCP 是跨进程、跨应用的标准协议而 Function Calling 是单次 API 调用内的工具定义。MCP vs Function Calling这是最常被问到的问题MCP 和 Function Calling 有什么区别Function CallingFunction Calling 是 LLM API 的一部分。你在调用generateText时传入tools参数LLM 在回复中决定是否调用工具constresultawaitgenerateText({model,tools:{search:{description:搜索知识库,parameters:z.object({query:z.string()}),execute:async({query})awaitsearch(query),},},prompt:用户的问题,});特点工具定义和执行在同一个进程内每次 API 调用都需要重新声明工具工具的execute函数直接在应用代码中MCPMCP 是一个独立的协议层。工具定义在 MCP Server 中Host 通过协议发现和调用特点工具定义在独立进程中可以跨应用复用Server 启动时注册一次Host 持续可用通信走 stdio 或 HTTP天然支持远程部署什么时候用哪个场景选择工具逻辑简单在应用内完成Function Calling工具需要访问外部服务数据库、APIFunction Calling 服务封装工具要被多个 AI 应用共享MCP工具需要独立部署和更新MCP用户想手动配置工具集MCPChatCrystal 选择 MCP 的原因是它的知识库工具需要被 Claude Code、Cursor 等多个 AI 编程工具使用。如果用 Function Calling每个工具都需要单独集成用 MCP一套 Server 代码所有 Host 都能用。ChatCrystal 的 7 个 MCP 工具ChatCrystal 的 MCP Server 暴露了 7 个工具分为两类只读知识工具search_knowledge— 语义搜索知识库返回按相关性排序的笔记get_note— 获取单条笔记的完整内容标题、摘要、结论、代码片段、标签list_notes— 浏览笔记列表支持按标签或关键词过滤get_relations— 获取笔记的关联关系类型、置信度记忆循环工具recall_for_task— 为当前任务回忆相关知识优先项目级记忆补充全局记忆validate_task_memory— 预检任务记忆候选不产生副作用返回是否可接受write_task_memory— 持久化高质量的任务记忆仅当内容满足质量门槛时写入只读工具让 AI 编程助手能回忆你之前的经验——比如搜索Fastify 插件注册找到之前总结的最佳实践。记忆循环工具更进一步AI 助手在完成任务后可以把有价值的经验写回知识库形成用中学、学中用的闭环。write_task_memory有严格的质量门槛它要求具体的标题、实质性的摘要、有意义的结论以及可复用的经验教训陷阱、修复、决策、模式。模糊的进度日志、一次性环境检查、空洞的健壮性声明会被拒绝。MCP SDK 的实现ChatCrystal 使用modelcontextprotocol/sdk官方 SDK。MCP Server 的核心代码非常精简——整个server.ts不到 150 行import{McpServer}frommodelcontextprotocol/sdk/server/mcp.js;import{StdioServerTransport}frommodelcontextprotocol/sdk/server/stdio.js;constservernewMcpServer({name:chatcrystal,version:0.2.0});// 注册工具...server.tool(search_knowledge,...);server.tool(get_note,...);// ...// 连接 stdio 传输层consttransportnewStdioServerTransport();awaitserver.connect(transport);SDK 封装了 JSON-RPC 协议细节、工具注册的 schema 转换、stdio 的消息分帧。你只需要关注工具的业务逻辑。MCP 的生态现状MCP 发布后迅速获得了生态支持Claude Code原生支持 MCP Server 配置Cursor支持 MCP 工具集成Windsurf / Cline支持 MCPVS Code Copilot通过扩展支持 MCP服务端方面社区已经贡献了大量 MCP ServerGitHub、Slack、数据库、文件系统、搜索引擎……ChatCrystal 是其中一个——专注于 AI 对话知识管理。MCP 的价值在于网络效应每新增一个支持 MCP 的 Host所有 MCP Server 都获得了新的分发渠道每新增一个 MCP Server所有 Host 都获得了新的能力。这是标准化协议的典型正反馈循环。小结MCP 解决的问题很简单让 AI 工具能以标准化方式接入外部能力。它不是什么革命性的技术突破——本质上是把 Function Calling 从单次 API 调用扩展成了跨进程的协议。但正是这个简单的标准化让 ChatCrystal 的知识库能被所有支持 MCP 的 AI 编程工具访问。用户不需要为 Claude Code 写一个插件、为 Cursor 写另一个插件、为 Copilot 写第三个插件。一个crystal mcp命令所有工具都能用。对开发者而言MCP Server 的开发成本也很低。ChatCrystal 的 MCP Server 核心代码不到 150 行大部分工作量在工具背后的业务逻辑搜索、检索、记忆写入而不是协议适配。如果你有想要暴露给 AI 工具的能力MCP 是目前最值得投入的集成方式。项目地址github.com/ZengLiangYi/ChatCrystal如有疑问欢迎在 GitHub Issues 或私信交流很乐意解答。