Skip to content

fix: 将 MCP 工具名 sanitize 为 OpenAI 兼容格式 - #255

Open
zhaji2333 wants to merge 2 commits into
Ed1s0nZ:mainfrom
zhaji2333:fix/250-sanitize-mcp-tool-names
Open

fix: 将 MCP 工具名 sanitize 为 OpenAI 兼容格式#255
zhaji2333 wants to merge 2 commits into
Ed1s0nZ:mainfrom
zhaji2333:fix/250-sanitize-mcp-tool-names

Conversation

@zhaji2333

Copy link
Copy Markdown

Fixes #250

问题

通过 OpenAI 兼容网关(如 OpenRouter、DashScope)使用模型时,MCP 工具名含 .::(如 fs.readserver.execnezha::fs.read)会被网关以 400 拒绝:

Invalid 'tools[60].function.name': string does not match pattern. Expected a string that matches the pattern '^[a-zA-Z0-9_-]+$'.

根因:toolInfoFromDefinition 将 MCP 原始工具名直接作为 OpenAI 的 function.name

修复

  • 新增 sanitizeOpenAIToolName::__._,其余非法字符 → _
  • 仅对展示给模型的 ToolInfo.Name 做 sanitize;执行路径仍使用原始 mcpBridgeTool.namerunMCPToolInvocation 按原始名调用 MCP),不受影响;
  • 附带单元测试覆盖 fs.readnezha::fs.read、大小写/数字/连字符/中文等用例。

验证

  • go build ./... 全项目编译通过;
  • go test ./internal/einomcp/ 通过(含新增 TestSanitizeOpenAIToolName)。

execute 流式 shell 硬编码 /bin/sh -c,Windows 平台直接报
exec: "/bin/sh": executable file not found。按 runtime.GOOS 选择:
Windows 走 cmd /c,类 Unix 保持 /bin/sh -c 不变;同时 Windows
下跳过 sh 专用命令预处理(export、/dev/null 等),避免 cmd 执行失败。
为依赖 sh 语法断言的流式测试补充 Windows skip(修复前后在 Windows
均无法通过)。
MCP 工具名含 . 或 ::(如 fs.read、nezha::fs.read)时,作为
OpenAI function.name 提交会被网关拒绝:不符合 ^[a-zA-Z0-9_-]+$。
在 toolInfoFromDefinition 中对展示给模型的 ToolInfo.Name 做
sanitize(:: → __、. → _、其余非法字符 → _);执行路径仍使用
原始 mcpBridgeTool.name,不受影响。附带 sanitize 单元测试。
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

fix: tool names with dots/double-colons violate OpenAI ^[a-zA-Z0-9_-]+$ pattern, causing 400 errors

1 participant