理解mcp
mcp是个协议,
存在 client和 server两部分
以claude desktop为例:
claude desktop的视线代码就集成了client这部分,
当你添加一个mcp server的时候他们就可以交流了
流程是这样的:
启动claude->client向server发出tools/list请求->mcpserver(常见stdio方式,不走网络)进行回应,列出内部tools
当你给llm发消息: 消息请求体会携带这些tools,llm决定调用什么tool,claude再去和server交互->server操作并返回结果。
典型的启动流程:
1. Client 启动 (如 Claude Desktop, VS Code)
2. Client 根据配置启动 Server 进程
3. Client 与 Server 建立连接
4. 进行 MCP 协议握手
5. 开始正常通信
为什么是 Client 先启动?
Client 是用户直接交互的应用程序
Client 知道需要什么功能,因此决定启动哪些 Server
Client 管理 Server 的生命周期(启动、停止、重启)
这符合"按需启动"的设计理念
协议栈:
┌─────────────────────────────────────┐
│ Application Layer │
│ (MCP Protocol Messages) │
├─────────────────────────────────────┤
│ Protocol Layer │
│ (JSON-RPC 2.0) │
├─────────────────────────────────────┤
│ Transport Layer │
│ (stdio/SSE/WebSocket/HTTP) │
├─────────────────────────────────────┤
│ Network Layer │
│ (TCP/Unix Socket/Pipe) │
└─────────────────────────────────────┘
*注意:这里的client和server,并不是传统意义的只有client能向server发送,而是它们能互相发送,他们本质都是jsonrpc端点,比如一个filesystem mcp server首次启动的时候会请求server.listRoots()来向客户端请求MCP Roots(这个是vscode中的工作目录,更换时候就会更新,或是claude desktop界面中你设置的允许的目录)。
资料:https://modelcontextprotocol.io/docs/develop/build-client#node