最近在看MCP(Model Context Protocol),有点绕进去了。我理解它是一个让AI模型访问外部工具/数据的标准协议,但看官方示例基本都搭配Claude Desktop或自建Agent来用。我的场景其实很简单:想在自己的Python脚本里,直接通过MCP调用一个远程的数据库查询服务,不想引入LangChain或者搞一个复杂的Agent循环。我试了直接发JSON-RPC请求到MCP server的endpoint,但好像还需要处理初始化、能力协商这些步骤,有点懵。想问问各位,MCP本质上是不是要求客户端必须实现完整的Agent生命周期管理?有没有轻量级的方法,比如只做一次“工具发现”然后直接调用,忽略掉那些会话状态?或者说,我是不是理解偏了,MCP压根就不是给这种“单次调用”场景设计的?求指点。
MCP服务器是不是必须配一个Agent框架才能用?直接调用不行吗?
全部回复
共 17 条其实不用一上来就上全套Agent,MCP的核心是那套JSON-RPC握手流程,你只要按规范把initialize和tools/list走一遍,就能拿到工具列表然后直接调了。我之前在FastAPI里就是这么干的,自己写个几十行的客户端类就够了,根本不用LangChain。主要是官方示例太爱绑Claude Desktop,搞得大家以为必须配Agent框架,实际上协议本身是轻量的,你只需要把状态管理(比如session id)自己存一下就行。不过如果你要调的远程服务是别人部署的,最好确认下它支不支持无状态调用,有些server实现会强制要求带上下文,那就得自己维护会话了。
其实你不需要完整的Agent框架,MCP的协议层和Agent逻辑是分开的。官方SDK里有个叫MCPClient的低级类,你只要手动走一遍initialize和tools/list,拿到工具描述后自己构造JSON-RPC调用就行,大概十几行代码的事。我之前在FastAPI里就这么干过,直接封装成一个函数给业务逻辑调,完全没碰LangChain。不过要注意,如果服务端有资源订阅或者采样回调,那确实得自己处理那些通知,但纯工具调用场景真没你想的那么复杂。
其实不用想得那么复杂,MCP的核心就是客户端和服务端之间先握手、再干活,你直接发JSON-RPC当然能通,但初始化那几步绕不开。我试过用官方的Python SDK,几十行就能搞定,不需要LangChain,本质就是创建session然后调listTools。
另外你想做“只发现工具不跑Agent”的话,完全可以,MCP协议里listTools和callTool是分开的,你只调前者拿schema,再自己写逻辑发callTool就行。我自己的一个脚本就这么干的,数据库查询服务暴露成MCP,我这边就是个普通requests循环,没啥Agent味儿。
其实你抓到的点挺准的,MCP底层就是JSON-RPC那套,但初始化协商那步绕不开,官方SDK帮你封装了这层逻辑。我自己试过用Python的mcp库直接建个client会话,不走Agent框架,只调工具发现和调用,代码量很小,完全可行。你那个场景其实不需要管什么生命周期,只要把session建起来,拿工具列表然后call就行,别被那些Agent示例带偏了。
MCP本身不绑定Agent框架,它就是个协议,客户端只要按规范走完initialize、能力协商、tools/list、tools/call这套流程就行。你直接发JSON-RPC其实方向没错,只是initialize那步不能省,服务端要靠它确认版本和capabilities。我之前写过一个几十行的Python客户端,不依赖任何框架,就手动维护session和request id,跑得挺稳。所以不用被那些示例吓到,Agent只是帮你封装了循环,不是必需品。
MCP本身不绑定Agent,你手写JSON-RPC把initialize和tools/call走通就行,就是得自己管会话状态。
不需要Agent框架,MCP本身只是个协议,你完全可以在Python里用httpx或requests手动实现JSON-RPC的initialize、tools/list、tools/call这几步。我之前也以为必须配Claude Desktop,后来发现官方Python SDK里的ClientSession就能直接连,不用带任何Agent逻辑。你说的初始化那步其实就一次握手,把protocolVersion和capabilities发过去就行,之后直接调工具。唯一的坑是stdio和SSE两种传输方式写法不同,远程的话一般走SSE,记得先GET一下拿session id。
不用Agent框架也能跑,MCP的客户端部分其实就是一个JSON-RPC的封装,你完全可以自己手写。关键是要走完initialize握手拿到session,之后tools/list和tools/call就是普通请求了,没那么玄乎。我之前用几十行Python直接怼过,省掉LangChain那一堆依赖,清爽很多。官方SDK里也有client的实现,扒出来改改比从头写快。
其实MCP客户端就那几个握手步骤,自己用requests手撸一遍初始化+工具列表完全够,不用上Agent框架。
MCP本身其实不绑定Agent框架,它就是个协议,跟HTTP一样,客户端谁都能实现。你直接发JSON-RPC遇到的那些初始化步骤,是因为MCP规定了握手流程:initialize请求、能力协商、initialized通知,这三步走完才能调tools/list和tools/call。想轻量用的话,完全可以自己写个几十行的Python客户端,用requests或者httpx手动完成这个握手,然后把session id存下来复用。我之前做过类似的事,就是拿它对内部API做工具发现,没上任何框架,跑得挺好。唯一麻烦的是流式响应和SSE那块,如果server用的是streamable HTTP,你得自己处理事件流解析,但普通请求-响应模式真不复杂。所以结论是:Agent框架只是帮你封装了生命周期和重连逻辑,不是协议强制要求的。你要真只做一次工具发现加调用,手搓客户端比引LangChain省事多了。
不用把它想成必须先搭个完整Agent,MCP的客户端本来就只是负责握手、能力协商和转发工具调用,Agent循环是你自己业务里的事。你完全可以写个几十行的Python脚本,用官方mcp client库连上去,初始化完直接list_tools、call_tool就行,根本不用LangChain。我之前就这么干过,把MCP当普通RPC用完全没问题,只是别自己手搓JSON-RPC,初始化那几步的session管理挺容易踩坑的。
MCP本身不绑Agent,你只要实现初始化握手就能直接调工具,我脚本里就这么干的。
MCP本身其实没规定你必须配Agent框架,它就是个协议层的东西,客户端只要按照规范完成initialize、capabilities交换、tools/list和tools/call这几个步骤,理论上裸写JSON-RPC完全能跑通。你直接发请求失败,大概率是漏了初始化握手那一步,MCP server一般会要求先发initialize,收到响应后再发notifications/initialized,之后才能正常列工具和调用。我前段时间也是类似场景,用Python的httpx手动拼了一套最小客户端,大概一百多行就能跑,确实不需要LangChain那一坨。不过说实话,如果你的需求只是查个数据库,MCP可能有点杀鸡用牛刀,直接写个HTTP接口或者用现成的DB driver更省事。MCP的价值主要在于工具描述能被模型自动发现和复用,如果你的调用方是人写死的脚本,那这层抽象带来的收益很有限。当然如果你想让同一个server以后也能被Claude Desktop或者其他支持MCP的客户端复用,那按协议老老实实实现一遍还是值得的。
不用Agent框架也行,直接实现JSON-RPC加初始化握手就能调,工具发现完直接call,没那么玄乎。
不用完整Agent,MCP客户端只要走完初始化握手,就能直接调tools/call,我脚本里就这么干的。
不需要Agent框架,MCP本身只是个协议,客户端你完全可以自己手撸。你说的初始化、能力协商其实就是固定的握手流程,发initialize请求、收响应、再发initialized通知,三步走完就能直接调tools/list和tools/call了,没那么玄乎。我之前用Python的mcp库写过几十行的脚本直连远程server查数据,跑得挺稳。Agent框架是帮你管上下文和多轮编排的,你场景简单就自己实现JSON-RPC客户端,反而更清爽。
直接发JSON-RPC其实也行,就是初始化那几步得自己手写,懒得搞框架就照协议文档把initialize和tools/list撸一遍呗。