Question: How to get a resource argument containing “/” ?

在 MCP Python SDK 中使用 @mcp.resource 装饰器定义资源模板时,用户希望路径参数(如 {path} )能够匹配包含斜杠( / )的完整路径,例如 folder://xxx/abc/zzz/ ,以便实现嵌套目录的资源访问。

Question: How to get a resource argument containing "/" ?

Question: How to get a resource argument containing “/” ?

快速结论:在 MCP Python SDK 中使用 @mcp.resource("folder://{path}") 定义资源模板时,如果路径参数中包含斜杠(如 folder://xxx/abc/zzz/),默认的正则匹配规则 [^/]+ 无法匹配带斜杠的参数。该问题尚未被正式修复,社区正在讨论引入类似 FastAPI/Starlette 的 {path:path} 语法来支持路径通配符。

问题场景

在 MCP Python SDK 中使用 @mcp.resource 装饰器定义资源模板时,用户希望路径参数(如 {path})能够匹配包含斜杠(/)的完整路径,例如 folder://xxx/abc/zzz/,以便实现嵌套目录的资源访问。

报错原文

# 当前正则匹配失败,params 返回 None
params = template.matches("folder://xxx/abc/zzz/")
assert params is not None  # 断言失败

原因分析

可能原因:MCP Python SDK 的 ResourceTemplate 默认使用 [^/]+ 作为路径参数的正则匹配模式,该模式不支持斜杠字符。当 URI 中包含嵌套路径(如 xxx/abc/zzz)时,正则无法正确提取完整路径参数,导致 matches() 方法返回 None

环境排查

  • 确认使用 MCP Python SDK 的版本(该 Issue 当前未指定版本号)
  • 检查是否使用了 ResourceTemplate.from_function()@mcp.resource() 装饰器
  • 确认 URI 格式是否符合预期:如 folder://{path}

解决步骤

当前 Issue 尚未提供最终修复方案,以下为社区讨论的解决思路(可优先尝试):

  1. 等待官方修复:社区提议参考 FastAPI/Starlette 的 Path Convertor 语法,支持 {path:path} 格式,使参数可以包含斜杠。该功能当前处于讨论阶段,标签为 ready for work,尚未被实现。
  2. 临时替代方案:在官方修复前,可以通过对 URI 进行预处理,将斜杠替换为其他分隔符(如 _-),然后在回调函数中还原。例如:定义 @mcp.resource("folder://{path}"),但实际传入 folder://xxx_abc_zzz,并在 folder_contents 函数中将 path 中的 _ 替换回 /
  3. 自行修改正则:如果有 SDK 源码访问权限,可以尝试修改 ResourceTemplate 中的正则模式,将 [^/]+ 替换为 .+? 或其他允许斜杠的模式。注意这可能会影响参数绑定的精确性。

验证方法

通过 template.matches() 验证参数提取是否成功:如果 params 返回正确的路径字典(如 {"path": "xxx/abc/zzz/"}),则问题解决。

# 期望输出
params = template.matches("folder://xxx/abc/zzz/")
print(params)  # 应输出:{'path': 'xxx/abc/zzz/'}

参考来源

modelcontextprotocol/python-sdk #436:Question: How to get a resource argument containing “/” ?

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

celebrityanime
celebrityanime
文章: 10198

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注