☰
MCP-给模型接工具的插座
2026/10/29 2:14:24 网站建设 项目流程

MCP:给模型接工具的插座

每接一个新工具,就要改一遍 agent 的代码、发一次版。工具一多,agent 就成了工具的搬运工。MCP 的思路和 USB 一样,把「接工具」变成插插座:工具方实现一个标准服务,agent 这边插上就能看见工具清单、能派工单。这篇用后端已经会的东西讲清 MCP,顺便让你发现,它就是一种你熟悉的 RPC。

一个三角,一种报文

MCP 的全称是 Model Context Protocol,规格(核验于 2026-10-25,当前版本 2026-07-28)用一句话概括:基于 JSON-RPC 2.0 消息,让模型应用和外部工具、数据源之间有标准的连接方式。参与方有三个。
Host,宿主,就是你的 agent 应用或者 AI 编辑器。Client,宿主内部发起连接的部件。Server,工具方,实现标准接口的那个服务。

JSON-RPC 2.0

Host
你的 agent 应用

Client
发起连接

MCP Server
工具方

工具 A

工具 B

传输层有两个标准选项:stdio(子进程收发)和 Streamable HTTP,前者适合本地工具,后者适合远程服务。

和工单循环的关系

之前讲的工单循环没有消失,它被标准化了。在 MCP 之前,每个 agent 框架自己定义工具清单和调用格式,工具方要为每个框架写一遍适配。MCP 把工具清单(tools/list)和工具调用(tools/call)定义成两个标准方法,工具方实现一次,所有支持 MCP 的宿主都能用。

模型那边的 tool_use 没变,还是写工单。变的是工单的传递方式,从框架私有格式,变成 JSON-RPC 的标准信封。

后端视角:它就是一种 RPC

把这张对照表一放,MCP 立刻变得毫无神秘感。

你熟悉的MCP 里的
RPC 的方法列表tools/list 暴露的工具清单
RPC 的方法调用tools/call 派工单
接口文档(字段与说明)工具的 name、description、JSON Schema
HTTP 或 gRPC 传输stdio 或 Streamable HTTP
服务注册与发现宿主配置 server 连接

写一个 MCP Server,就是在写一个薄薄的 RPC 服务:暴露方法、校验参数、干活、返回结果。鉴权、限流、幂等这些后端手艺原样适用;工具暴露等于权限暴露,那道门还是要在你的代码里把着。

亲手跑一个最小 Server

下面用一段 Python 写一个最小 MCP 服务端,处理 initialize、tools/list、tools/call 三个方法,收发就是 stdin/stdout 上的 JSON 行。直接运行python mcp_minimal.py,标准库就够。

# 运行:python mcp_minimal.py# 最小 MCP 服务端:JSON-RPC 2.0 over stdio,三个方法。importjsonimportsys TOOLS=[{"name":"get_weather","description":"查询指定城市的当前天气","inputSchema":{"type":"object","properties":{"city":{"type":"string","description":"城市名"}},"required":["city"],},}]defhandle(request):method=request.get("method")rid=request.get("id")ifmethod=="initialize":result={"protocolVersion":"2026-07-28","capabilities":{"tools":{}},"serverInfo":{"name":"mini-mcp","version":"0.1"}}elifmethod=="tools/list":result={"tools":TOOLS}elifmethod=="tools/call":args=request.get("params",{}).get("arguments",{})city=args.get("city","未知")result={"content":[{"type":"text","text":f"{city},晴,25 度"}]}else:return{"jsonrpc":"2.0","id":rid,"error":{"code":-32601,"message":f"unknown method:{method}"}}return{"jsonrpc":"2.0","id":rid,"result":result}defmain():forlineinsys.stdin:line=line.strip()ifnotline:continuerequest=json.loads(line)response=handle(request)sys.stdout.write(json.dumps(response,ensure_ascii=False)+"\n")sys.stdout.flush()if__name__=="__main__":main()

跑起来之后,往 stdin 里丢三行就能走完一圈(id 和参数对上就行):

{"jsonrpc":"2.0","id":1,"method":"initialize","params":{}} {"jsonrpc":"2.0","id":2,"method":"tools/list","params":{}} {"jsonrpc":"2.0","id":3,"method":"tools/call","params":{"name":"get_weather","arguments":{"city":"北京"}}}

三行回三行,工具清单和工单执行都在标准信封里。记住一句话:MCP 是把工具接线标准化的插座,插座里面跑的还是你的 RPC。

适用边界

这一篇管 MCP 的核心机制。Resources 和 Prompts 等其他能力、鉴权流程(OAuth 那套在远程 Server 上的应用)、以及各家 SDK 的封装,是另外的题。规格版本从 2024-11-05 到 2025-03-26 再到 2025-11-25 和 2026-07-28 一直在演进,字段细节以官方规格为准,本文报文按 2026-07-28 口径整理。动手顺序建议是先跑通这个最小 Server,再决定你的工具库要不要做成 MCP 形态,插不插插座,取决于你的工具要被多少个宿主用到。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询