mini-cc 的 MCP 协议:给 AI 装个 USB-C 接口

发布时间:2026/5/30 18:22:12

mini-cc 的 MCP 协议:给 AI 装个 USB-C 接口 前言今天咱们聊一个稍微硬核一点的话题MCPModel Context Protocol。这东西是 Anthropic 在 2024 年底提出来的一套开放标准目标是让 AI 应用能以一种标准化的方式跟外部工具和数据源对接。什么是 MCP你可以把 MCP 理解为AI 世界的 USB-C 接口。以前要往 AI 里加一个新能力比如查天气、查数据库、发邮件每个系统都得单独写一套对接代码。M 个模型 × N 个工具维护成本直接爆炸。MCP 要解决的就是这个问题——标准化。用上 MCP 之后事情从 M×N 变成了 MN。任何一个 MCP 客户端都能接任何一个 MCP 服务器就像 USB-C 一样接口统一了。MCP 的三个核心概念根据官方规范MCP 定义了几类服务器能提供的功能。我这里重点说三个Tools工具AI 能主动调用的函数比如查天气“读文件”。这是最核心的能力AI 自己决定什么时候用。Resources资源被动提供的数据比如文件内容、API 数据。AI 不能主动调用只能在需要的时候读取。Prompts提示词模板预定义好的提示词模板用户可以一键调用。举个例子一个 MCP Server 可以同时提供搜索文档Tool和项目说明文档ResourceAI 既能自己决定什么时候需要搜索也能在你问的时候直接读取文档。架构Host → Client → ServerMCP 采用的是三层架构Host你直接打交道的 AI 应用比如 Claude Desktop、Cursor或者 mini-cc。ClientHost 内部维护的模块每个 MCP Server 对应一个 Client负责具体的 JSON-RPC 通信。Server真正干活的后台可以用任何语言写——Python、Node.js、Go、Rust 都行。通信走的是 JSON-RPC传输方式支持 stdio本地进程间通信和 HTTP/SSE远程服务。mini-cc 中的 MCP 实现那 mini-cc 里这套东西具体怎么整的看我们的源码其实没想象的那么复杂。预加载策略mini-cc 用的是预加载策略不是按需加载。启动的时候把所有 MCP Server 连好把工具塞到工具注册中心。我当时也纠结过是每次需要工具再去连接还是一启动就连上后来选了预加载。因为 mini-cc 运行过程中子 Agent 会频繁创建如果每个子 Agent 创建时都去重新连 MCP Server延迟会明显变高。启动时慢一点点没关系子 Agent 创建顺畅就值了。当然预加载也有代价——如果哪个 MCP Server 挂了启动可能变慢或者整个挂掉。所以我做了容错某个 Server 连不上就打句警告继续启动不影响核心功能。启动流程大概是这样启动 mini-cc ↓ 扫描 MCP Server 配置 ↓ 全部连接获取工具列表 ↓ 注册到全局 ToolRegistry ↓ Agent 循环可以直接使用配置文件的优先级MCP Server 的配置放在.minicc/mcp.json文件里。配置文件的查找是有优先级的先找当前工作目录下的.minicc/mcp.json找不到再找用户的~/.minicc/mcp.json都找不到就当没有 MCP Server。环境变量的优先级更高环境变量 项目配置 全局配置。这样做的好处是你可以在某个特定项目里配置特殊的 MCP Server而不影响其他项目的配置。两种 Server 连接方式mini-cc 支持两种 MCP Server 连接方式stdio 模式本地进程通过标准输入输出通信最常用。配置示例{mcpServers:{filesystem:{command:npx,args:[-y,modelcontextprotocol/server-filesystem,/Users/me/Desktop],env:{DEBUG:true}}}}HTTP/SSE 模式远程服务通过 HTTP 加 Server-Sent Events 通信。适合需要中心化部署的场景。配置里还支持环境变量自动展开格式${ENV_VAR}或者带默认值的${ENV_VAR:-default}。工具适配器mini-cc 里有个MCPToolAdapter干的事情很直接把 MCP Server 返回的工具定义拿过来包装成 mini-cc 自己的Tool接口格式然后在execute方法里把调用转发给 MCP Client 等结果。classMCPToolAdapterimplementsTool{name:string;description:string;inputSchema:JSONSchema;asyncexecute(args:any,context:ToolUseContext):PromiseToolResult{constresultawaitthis.client.callTool(this.name,args);returnresult;}}这样 Agent 在调用工具的时候根本不知道这个工具是内置的还是 MCP 插件——接口把这一切都给抹平了。MCP 客户端的核心逻辑MCP 客户端的核心其实不复杂就是通过 stdio 跟 Server 进程通信用 JSON-RPC 发请求、解析响应。但我当时为了写好客户端花了半天研究ChildProcess的标准输入输出怎么正确处理。数据粘包多个响应拼在一起或者解析卡死的问题很容易碰到。后来发现官方 MCP SDKmodelcontextprotocol/sdk已经把底层逻辑封装好了直接拿来用就行。mini-cc 里也引了这个包。自己写 MCP 客户端的话建议直接用 SDK别重复造轮子。MCP 的安全特性说句实在话MCP 协议本身不负责安全安全得自己实现。MCP 的角色是运输层不是安全层。但 mini-cc 也做了几层防护1. 进程隔离每个 MCP Server 是独立进程崩了不会影响主程序。还做了资源限制constprocessspawn(serverPath,[],{stdio:[pipe,pipe,pipe],resourceLimits:{maxCPU:1000,// 最多跑 1 秒 CPU 时间maxMemory:512*1024*1024// 限制 512MB 内存}});2. 严格模式如果你希望某个环境必须有 MCP Server可以通过MINICC_MCP_STRICT1环境变量让启动失败场景普通模式严格模式缺少 MCP 依赖警告 跳过启动失败MCP 配置文件格式错误警告 跳过启动失败MCP Server 连不上警告 跳过启动失败没有 MCP 配置文件正常运行正常运行这个设计很实用。本地开发时 MCP 不是必需品连不上就跳过但在 CI/CD 流水线上如果没有配置好 MCP 测试环境就应该提前报错而不是把问题带到生产环境。3. 用户审批敏感操作需要用户明确授权这在前面工具系统的文章里详细讲过。MCP 官方网站对安全有三条核心建议用户同意涉及数据访问和操作必须用户明确同意数据隐私不能未经同意把用户数据传给第三方工具安全工具本质上是可执行任意代码的调用前必须用户确认这些原则 mini-cc 在设计时基本都考虑到了。测试你的 MCP Server开发 MCP Server 的时候怎么调试官方提供了一个MCP Inspector工具npx modelcontextprotocol/inspectornodeyour-server.js打开浏览器就能看到 Server 暴露了什么 Tools 和 Resources还可以交互式地测试调用。我写第一个 MCP Server 时就靠这个工具一步步验证省了不少时间。一个简单的 MCP Server 示例一个最简单的 Node.js 天气插件长这样#!/usr/bin/env nodeconst{Server}require(modelcontextprotocol/sdk/server);const{StdioServerTransport}require(modelcontextprotocol/sdk/server/stdio);constservernewServer({name:weather-server,version:1.0.0});server.setRequestHandler(list_tools,async()({tools:[{name:get_weather,description:获取城市天气,inputSchema:{type:object,properties:{city:{type:string,description:城市名称}},required:[city]}}]}));server.setRequestHandler(call_tool,async(request){if(request.params.nameget_weather){constcityrequest.params.arguments.city;constweathercities[city]||{temp:未知,condition:未知};return{content:${city}天气:${weather.temp}°C${weather.condition}};}});consttransportnewStdioServerTransport();server.connect(transport);配置好之后重启 mini-ccget_weather工具就会出现在 Agent 的工具列表里。用户在聊天中提到天气Agent 会自己决定调用这个工具。总结MCP 协议是 mini-cc 插件生态的基石标准化接口统一的工具定义和调用方式不用再给每个 AI 单独写对接了语言无关插件可以用任何语言编写——Python、Node.js、Go、Rust 都行安全隔离插件运行在独立进程中崩了不会影响主程序预加载策略启动时全部加载并缓存子 Agent 创建时零延迟如果你觉得 mini-cc 自带工具不够用随时可以自己开发 MCP 插件来扩展功能。P.S.关于安全这块MCP 协议本身只定义消息怎么发安全还得靠上层 Host 自己做。我写了一套审批流程敏感工具调用前会弹出来让你确认。如果要在生产环境用 MCP建议加一个网关做权限控制、审计和限流不然日志和审计会比较头疼。最后问一句你想开发什么样的 MCP 插件欢迎在评论区聊聊 如果觉得有用⭐ Star 一下GitHub 仓库 关注博客后续还会更新更多内容你的支持是我继续写的动力

相关新闻