CMDC.MCP.Bridge (cmdc v0.4.1)

Copy Markdown View Source

MCP 工具桥接器 — 将 MCP server 工具包装为 CMDC.Tool behaviour 模块。

Anubis 客户端连接并完成协商后,Bridge 查询每个客户端的可用工具, 将其包装为实现 CMDC.Tool 接口的匿名模块。 这样 Agent 可以像调用内置工具一样调用 MCP 工具,无需特殊分发逻辑。

工具命名

MCP 工具默认保留原始名称(如 get_weathersearch_issues)。 当两个 server 暴露同名工具时,在名称前加 server 前缀以消歧: weather_get_weatherbackup_get_weather

与已存在的 native 工具同名时同样触发前缀。

工具模块生命周期

生成的模块名为 CMDC.MCP.Tool.<ServerName><ToolName>(驼峰化)。 重新发现工具时,旧模块版本会被清除(purge + delete), 确保重连后的新工具定义生效。

Summary

Functions

在运行时为 MCP 工具创建实现 CMDC.Tool 行为的模块。

从所有配置的 MCP server 发现工具。

从所有 MCP server 发现工具并生成 CMDC.Tool 行为实现模块。

从单个命名 MCP client 发现工具,返回 CMDC 兼容的工具信息 map 列表。

Functions

create_tool_module(server_name, tool, resolved_name)

@spec create_tool_module(String.t(), map(), String.t()) :: module()

在运行时为 MCP 工具创建实现 CMDC.Tool 行为的模块。

生成的模块通过 Anubis client 路由工具调用。 重连后若工具定义有变,旧版本模块会被清除并重新生成。

discover_all_tools(mcp_servers)

@spec discover_all_tools([map()]) :: [map()]

从所有配置的 MCP server 发现工具。

接受 server config map 列表(每个包含 :name key), 返回所有 server 工具的扁平列表。

discover_tool_modules(mcp_servers, existing_names \\ MapSet.new())

@spec discover_tool_modules([map()], MapSet.t()) :: [module()]

从所有 MCP server 发现工具并生成 CMDC.Tool 行为实现模块。

使用原始工具名,同名时加 server 前缀消歧。 existing_names 是已注册的 native 工具名 MapSet,也会触发前缀。

discover_tools(server_name)

@spec discover_tools(String.t()) :: [map()]

从单个命名 MCP client 发现工具,返回 CMDC 兼容的工具信息 map 列表。

每个 map 包含:

  • :name — 工具名称(可能加了 server 前缀)
  • :description — MCP server 提供的工具描述
  • :parameters — JSON Schema input schema
  • :server — MCP server 名称(String)
  • :original_name — 工具在 MCP server 上的原始名称

client 未连接或发现失败时返回 []