【解决】Dify接入MCP服务报错: PluginInvokeError: {“args“:{“description“:“[models] Error: ‘description‘“}
本文介绍了在使用dify接入mcp服务时遇到的报错问题,最终定位为本地mcp服务未设置参数description导致。通过调试发现,成功调用的工具描述包含description字段,而报错的工具描述缺少该字段。解决方案包括修改mcp服务添加description或调整插件代码为缺失字段赋默认值。文章还提问为何ReAct策略不会报错,引发读者思考。
说在前面
大家在使用dify接入mcp服务时可能会遇到类似报错:
Exception: read llm model failed: request failed: [tongyi] Error: req_id:
db6c8ce0bb PluginInvokeError: {"args":{"description":"[models] Error:
'description'"},"error_type":"InvokeError","message":"[models] Error: 'description'"}
目前dify mcp智能体策略使用最多的就是
dify-plugin-agent-mcp_sse
假如你使用的是插件的Function Calling策略,可能就会出现这种报错。
开门见山
问题最终定位是由于我本地启动的mcp服务,没有给参数设置description,导致dify后台直接报错。无关插件,无关大模型。
历程
大模型问题
遇到这个问题之后,根据提示,我以为是大模型报错了,还有req_id信息,我直接联系了百炼的官方技术支持,最终得到的反馈是,这个请求并没有发送到他们那边,言外之意,这个错误是dify发出的。
更换ReAct策略
当策略更换之后,报错信息消失了,整个智能体是可以完成从工具的判断到调用再到最终结果的返回的,只不过消息的回复没办法做到流式返回,这个在之前的文章有解释过原因。
但是单凭这点信息也没办法定位到具体原因。
调试
目前其实已经没有更好的办法了,因为dify和插件都是封装好的,没有办法看到内部更详细的日志信息。
具体的过程不多说了,官网都有详细的介绍,直接说一下最后的结果。
我打印了能成功调用的工具描述:
{'name': 'weekday', 'description': '计算指定日期为星期几的工具。', 'parameters':
{'type': 'object',
'properties':
{'year': {'type': <ToolParameterType.NUMBER: 'number'>, 'description': ''},
'month': {'type': <ToolParameterType.NUMBER: 'number'>, 'description': ''},
'day': {'type': <ToolParameterType.NUMBER: 'number'>, 'description': ''}},
'required': ['year', 'month', 'day']}},
这是从本地mcp server获取的工具描述(报错):
{'name': 'get_book_info', 'description': '获取图书信息', 'parameters': {
'properties': {'book_name': {'title': 'Book Name', 'type': 'string'}},
'required': ['book_name'],
'title': 'get_book_infoArguments', 'type': 'object'}}
通过数次调试,最终问题定位在了这里,经过分析,我感觉应该是2个可能。
- 自己定义的
mcp-server没有成功传递参数的description - 参数的type信息必须要是dify官方提供的,比如用
'type': <ToolParameterType.NUMBER: 'number'来代替type: 'number'。
第一个解决起来比较简单,通过修改插件,给不存在description的情况加默认赋值空字符串,问题到此也就解决了。
因为中间解决思路有点离开主线,所以整个过程耗时将近3天。
问题解决思路
添加参数描述信息
这个是最简单的办法,需要对mcp服务进行改造。
修改插件
strategies\function_calling.py _init_prompt_mcp_tools方法,遍历parameters,当description 不存在时设置为空字符串
for tool in mcp_tools:
parameters = tool.get("inputSchema")
for key, value in parameters['properties'].items():
if 'description' not in value: value['description'] = ""
说到最后
问题解决了,请你思考一下,为什么使用ReAct策略时不会报错?
可以尝试看下源码,思考思考,答案见评论区。
更多推荐

所有评论(0)