如何自定义扩展MCP协议?
摘要:本文探讨如何定制MCP协议,强制要求tool参数必须包含描述信息。通过分析MCP协议和Java SDK源码,发现协议层面并未强制要求参数描述。本文给出了一种自定义实现逻辑,供参考。
MCP有多火就不说了,这半年搞AI的都在谈MCP。
但是,如果你是一个AI行业的程序员,应该不满足于只是谈论。还在不断演进的原生的MCP协议和你的业务不会完美契合。
如果,出于某个目的,你想对MCP协议进行定制,你该怎么做?
比如,当你发现,MCP协议里边对tool参数的描述不是强制的,会影响模型调用的准确性,你想对协议进行修改,将tool参数的描述定义改为强制的,如果没有定义就会造成MCP服务启动失败或者MCP客户端连接失败,该怎么做?
例如:图一里的用java语言实现的查询中国城市天气的mcp server tool,可以正常启动。
但是你期望的接口是长图二这样,专门定义一个@ToolParam注解描述参数(如果你有耐心看到最后,你会发现还有别的定义方式)
你期望图一的mcp server启动时候报错,提示开发者必须给参数添加描述信息,你该怎么做?
对了,很多人可能还不知道怎么看MCP协议,入口在这:
https://github.com/modelcontextprotocol/modelcontextprotocol/blob/main/schema/2025-03-26/schema.ts
回来,你该怎么做?
第一步:肯定是看协议,看了协议你会发现,别说对tool参数的描述了,tool本身的描述在协议层面都是可有可无。
是的,那个问号(?)的意思就是可有可无。
第二步:找你熟悉的一门语言的mcp sdk,看看源码,比如java的,
https://github.com/spring-projects/spring-ai
源码看不明白可以debug下代码,
看源码很考验程序员的功底,我这篇文章教不会你,就不说了。
会看源码的你会发现,mcp server启动时候,会执行
MethodToolCallbackProvider类的validateToolCallbacks()方法对tool进行校验。
校验的逻辑很简单,只是校验了一个mcp server的tools列表里的工具名称不重复而已。
这时候,问题来了,你想添加的“将tool参数的描述定义改为强制的”的代码逻辑应该加在哪里?
加在validateToolCallbacks()方法里吗?
你会发现ToolCallback对象里关于tool参数的定义信息已经变成了一个string,
难道做一次反序列化吗?似乎有点麻烦,
分析源码,在生成ToolDefinition信息的时候可能是个不错的时机,
分析源码,你也可以发现,定义MCP Server tool的时候,你给参数添加
mcp的@ToolParam注解、jackson的@JsonPropertyDescription注解、swagger的@Schema注解,最终都有可能会提取作为参数的描述。
既然提取参数的描述已经这么拼了,为何不强制让开发者填写呢?
好了,代码改完了,编译、打包、测试,当server代码里的tool参数没有参数定义时,启动会报错:
好的,server启动时候的校验逻辑加上了,那么client连接server时候,也增加这个逻辑,该如何实现呢?
代码加在哪里?
更多推荐
所有评论(0)