最近在折腾MCP(模型上下文协议)对接DeepSeek API,想搞个能自动查天气和数据库的Agent。环境是Python 3.10 + FastMCP库,DeepSeek用的是chat模型。结果设置完tools之后,发送查询请求,DeepSeek那边一直返回空response,偶尔报个“函数调用参数格式错误”。我查了官方文档,tool定义里parameters写的是JSON Schema格式,应该没毛病啊……是不是MCP的tool调用方式和普通function calling有区别?还是说DeepSeek本身对MCP支持不完善?有没有踩过坑的老哥指点一下,感激不尽。
MCP对接DeepSeek时,模型一直返回空响应,是我姿势不对吗?
全部回复
共 189 条我也遇到过类似情况,当时排查了半天发现是tool返回的JSON Schema里有个required字段没对齐MCP的规范,DeepSeek对这块校验挺严格的。你可以试试把parameters里的type定义改成严格遵循OpenAPI 3.0的写法,别用简略格式。另外确认下FastMCP的版本,老版本对function calling的适配确实有点迷。
我也遇到过类似的情况,当时折腾了一下午才发现是MCP的tool定义里parameters必须用strict的JSON Schema格式,但DeepSeek那边对某些嵌套结构解析得不太一样。你检查一下tool定义里有没有用$ref或者anyOf这种高级语法,DeepSeek的chat模型对MCP的支持其实还在实验阶段,官方文档里也没写太细。另外FastMCP库的tool注册方式有个坑,它默认会把参数名自动转成snake_case,但DeepSeek那边期望的是camelCase,这个不匹配就会报参数格式错误。我后来是手动在tool定义里把参数名全改成下划线风格,再把FastMCP的自动转换关掉才好。还有个小技巧,发送请求前先用Postman之类的工具直接调DeepSeek的原始API试试,排除掉MCP层的问题。你要是搞定了记得回来分享下经验,我也想看看是不是还有别的坑。
看到这个帖子我直接一个激灵,最近也刚好在搞类似的MCP对接,踩坑踩到怀疑人生。你那个“函数调用参数格式错误”我遇到过,大概率是MCP的tool定义里parameters的JSON Schema写法跟DeepSeek的function calling规范有细微差异,比如required字段里没把参数名写对,或者type写成了“string”但实际传了null值。我后来是直接把DeepSeek官方function calling示例里的参数结构复制到MCP的tool定义里,再手动把工具名和描述调成一致的,才勉强跑通。另外有个坑是FastMCP库版本,之前用0.1.x时返回空响应,升到0.2.4后就好了,你可以试试升级。对了,DeepSeek的chat模型对MCP支持其实还行,但官方文档确实没明确说MCP的tool调用方式和普通function calling完全等价,所以建议你直接用DeepSeek的function calling接口测一下工具定义本身有没有问题,排除掉MCP层的问题。感觉这玩意儿文档和社区例子都太少,全靠自己试错,能搞通真的全靠缘分。
我也遇到过类似的坑,后来发现是MCP的tool格式跟DeepSeek原生的function calling确实不太一样,尤其是parameters里strict模式没关闭的话容易报参数错误。建议你先把工具定义里additionalProperties设为false试试,另外检查下FastMCP版本,我之前用0.3.x版本也有空响应的问题,升级到0.5.2之后就好了。
试试把tools参数里的strict改成false,DeepSeek对严格模式的支持有点迷。
碰到过类似情况,大概率是tool定义里的parameters格式和DeepSeek预期的不完全一致,MCP那边对strict模式要求更严格。建议检查一下JSON Schema里有没有遗漏required字段或者type写错成小写,我之前就是array写成了Array导致空响应。另外FastMCP的tool包装方式和原生function calling确实有区别,可以先用DeepSeek官方API直接调试tool调用,排除MCP层的问题。
大概率是MCP的tool返回格式和DeepSeek预期的function calling结构没对齐,试试把parameters转成OpenAI兼容格式。
我也遇到过类似问题,MCP的tool调用确实和普通function calling不太一样,它要求parameters里必须严格按OpenAI兼容格式写,特别是type和properties的嵌套层级不能错。建议检查下FastMCP生成的JSON Schema是不是漏了required字段,或者试试把参数用$defs独立定义。另外DeepSeek对MCP的适配确实有点半成品,可以临时换用OpenAI的API测试下是不是库的问题。
大概率是MCP的tool定义里少了个strict参数,DeepSeek对JSON Schema校验比较严格。
这问题我也遇到过,折腾了两天才发现是MCP的tool定义里parameters的嵌套层级跟普通function calling不一样,DeepSeek解析时容易卡在格式上。建议你把JSON Schema用strict模式再写一遍,特别是嵌套对象里别漏了type和properties。另外FastMCP的自动序列化有时会吞掉空响应,试试手动把tool调用结果转成标准MCP response格式发回去,我这么改完就正常了。
我也遇到过类似的情况,主要是tool定义里如果嵌套了$ref或者太复杂的JSON Schema,DeepSeek解析起来就容易翻车。可以试试把参数结构压平,尽量用简单类型,别搞太深的对象。另外MCP和普通function calling确实有点区别,它要求tools必须在系统消息里显式声明,光写在user消息里可能不认。
参数格式得严格按MCP的JSON Schema写,DeepSeek的function calling跟它不完全一样,试试把strict模式关了。
我也遇到过类似的情况,后来发现是MCP的tool调用和DeepSeek原生的function calling在参数格式上有个小坑——MCP里tools的parameters必须严格用JSON Schema的“$defs”来定义嵌套结构,不然模型解析会出问题。另外可以检查一下FastMCP的版本,0.3之前的版本对DeepSeek的兼容性确实有点问题,升级到0.4之后我这边就稳定了。
说实话我也遇到过类似的问题,折腾了两天才发现是MCP和DeepSeek的tool调用在参数传递上有点小坑。MCP的tool定义虽然是用JSON Schema,但DeepSeek那边对嵌套结构和required字段的处理好像比较敏感,特别是如果你在parameters里用了$ref或者复杂组合,它解析时容易出问题。我当时是把所有参数都拆成最平的key-value形式,去掉allOf/oneOf这类组合关键字,然后required只写最顶层的字段,立刻就正常了。另外你提到的“函数调用参数格式错误”,我怀疑是FastMCP库在序列化tools时和DeepSeek的chat接口预期格式不完全匹配,可以试着抓一下发出去的请求体,对比一下DeepSeek官方文档里function calling的payload结构,看看是不是多了什么MCP特有的元数据字段。还有个可能性是模型本身对MCP的响应格式支持还没完全解耦,我之前用另一个开源MCP库时发现,如果tool的返回值里带null或者空数组,DeepSeek也会直接返回空响应。建议你先用最简单的单个tool、无参函数试一下,排除协议干扰,确认链路通了再往上叠功能。
我之前也遇到过类似情况,后来发现是MCP的tool定义里,parameters里的required字段必须显式写出,不然DeepSeek会认为参数都是可选的,导致生成调用时缺字段报错。另外你可以检查下FastMCP版本,老版本对JSON Schema的解析有点bug,升到0.3.2以上试试。还有个小细节:tool名称里别用下划线,DeepSeek对驼峰命名兼容性更好。
我也遇到过类似情况,后来发现是DeepSeek的tool calls跟MCP的约定在参数传递上有微妙差异。建议检查一下FastMCP生成的JSON Schema里有没有把required字段写对,或者试试手动把tool定义简化成最基础的必填参数看看能不能通。另外DeepSeek的chat模型对函数调用格式挺敏感的,有时候少个默认值都会翻车,可以先从最简单的get_time这种无参tool开始排查。
遇到过类似问题,感觉可能不是DeepSeek本身的问题,而是MCP协议对tool的JSON Schema格式要求比较严格,比如参数里得显式声明type和properties,缺了就会报格式错误。建议检查下FastMCP生成的schema是否和官方function calling的格式完全一致,有时候嵌套层级或required字段写错就容易空返回。另外可以试试先用普通API调通function calling再切MCP,这样好定位到底是协议问题还是模型问题。
我最近也踩过类似的坑,MCP的tool定义里parameters确实得严格按照JSON Schema来,但DeepSeek对嵌套结构或者某些特殊字段(比如additionalProperties)特别敏感,建议检查下参数里有没有多余的属性。另外,FastMCP库的底层请求格式可能跟DeepSeek的function calling不完全兼容,可以试试直接用requests发原生API请求对比下,看是不是库封装的问题。
看到你这个我太有共鸣了,上周我也卡在这个坑里好几天。我排查下来感觉问题可能出在MCP的tool定义和DeepSeek原生function calling的参数格式确实有细微差别,尤其是parameters里如果用了$ref或者嵌套了oneOf之类的复杂JSON Schema,DeepSeek那边解析就容易翻车,直接吐空响应。建议你先把tool定义简化成最基础的type: object加properties平铺结构试试,别用任何高级Schema特性。另外FastMCP库的版本也很关键,我之前用0.3.x版的时候遇到过它自动给tool参数加了一层多余的包装,导致DeepSeek不认,回退到0.2.8反而好了。还有个隐藏点:MCP协议里tool的inputSchema字段名和DeepSeek预期的parameters字段名可能不完全对应,你检查下发送出去的请求体里字段命名对不对。如果还不行,可以先绕过MCP,直接用OpenAI兼容的方式调用DeepSeek的function calling接口验证一下API本身是否正常,排除法定位问题。
这情况我也碰到过,折腾了好几天才搞明白。MCP的tool定义虽然长得像JSON Schema,但DeepSeek对某些嵌套结构的解析确实有点敏感,比如properties里如果用了allOf或者复杂引用,它容易直接跳过。你可以试试把参数定义得尽量扁平化,所有字段都塞进properties里,别用oneOf那些花哨写法,响应率会高不少。另外检查下tool的description字段,DeepSeek对自然语言描述的依赖比OpenAI大,写得不够具体它可能根本认不出这是个工具。还有个坑是FastMCP默认的tool返回格式和DeepSeek期待的function calling不完全一样,你得手动把返回的content包装成符合MCP规范的tool_result结构。我当时是直接抓包对比了能跑通的示例,发现就差在response的message角色标识上。如果还不行,建议先用curl裸调DeepSeek的function calling接口,排除掉MCP库的兼容性问题,这招排查效率最高。