feat(mcp-py,dispatcher): 自主 agent 工具动态发现覆盖 mcp-py
把动态工具发现从 mcp-go 扩到两台 MCP: - mcp-py:TOOL_META 改成与 mcp-go 同形(cn/desc/agent/params/inject), list_tools 上报这些;run_code 标 agent 可用(params: code)→ 自主 agent 可执行 Python 代码做计算/数据处理。 - dispatcher:agentTools 拆出 discoverTools(subject),分别探 mcp-go / mcp-py 的 list_tools 并合并;某台 MCP 离线即跳过(降级,不阻断)。 验收:mcp-py 未启动时自主 agent 仍正常(探测秒跳过),一次自主调用了 history_get + memory_get 两个动态发现的 go 工具(注入 session_id/user_id); go 全绿、mcp-py py_compile 通过。mcp-py 起着时 run_code 即自动入 agent 菜单。 Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -25,12 +25,18 @@ log = logging.getLogger("mcp_py")
|
||||
SUBJECT_PY_ALL = "sundynix.tools.py.>"
|
||||
QUEUE_PY = "mcp-py-workers"
|
||||
|
||||
# 工具元信息:名称 → (中文名, 作用简述)。list_tools 据此上报给管理端展示。
|
||||
# 工具元信息(与 mcp-go 注册表同形):list_tools 上报给管理端展示 + dispatcher 动态构建自主 agent 工具集。
|
||||
# agent=是否暴露给自主 agent;params=模型可填参数;inject=服务端注入参数(不暴露给模型)。
|
||||
TOOL_META = {
|
||||
"echo": ("回显", "原样返回入参(调试用)"),
|
||||
"run_code": ("代码执行", "静态守卫 + Docker 隔离沙箱运行代码(标准档 256m/10s)"),
|
||||
"parse_document": ("文档解析", "文件 → 纯文本(MinerU / PaddleOCR)"),
|
||||
"secure_sandbox": ("安全沙箱", "更严资源档(128m/5s)的隔离执行,用于高风险代码"),
|
||||
"echo": {"cn": "回显", "desc": "原样返回入参(调试用)"},
|
||||
"run_code": {
|
||||
"cn": "代码执行",
|
||||
"desc": "在隔离沙箱里执行 Python 代码(静态守卫 + Docker,256m/10s)。用于计算、数据处理、逻辑验证。",
|
||||
"agent": True,
|
||||
"params": [{"name": "code", "type": "string", "desc": "要执行的 Python 代码", "required": True}],
|
||||
},
|
||||
"parse_document": {"cn": "文档解析", "desc": "文件 → 纯文本(MinerU / PaddleOCR)"},
|
||||
"secure_sandbox": {"cn": "安全沙箱", "desc": "更严资源档(128m/5s)的隔离执行,用于高风险代码"},
|
||||
}
|
||||
|
||||
|
||||
@@ -102,10 +108,18 @@ class McpGateway:
|
||||
return str(args.get("text", ""))
|
||||
|
||||
async def _list_tools(self, args: dict) -> str:
|
||||
"""自省:上报业务工具清单(名称 + 中文名 + 作用),供管理端探活 + 展示。"""
|
||||
"""自省:上报业务工具清单(名称/中文名/作用 + agent 暴露元信息),供管理端展示 + dispatcher 动态发现。"""
|
||||
tools = [
|
||||
{"name": n, "cn": cn, "desc": d}
|
||||
for n, (cn, d) in TOOL_META.items()
|
||||
{
|
||||
"name": n,
|
||||
"cn": m["cn"],
|
||||
"desc": m["desc"],
|
||||
"agent_exposed": m.get("agent", False),
|
||||
"agent_name": m.get("agent_name", ""),
|
||||
"params": m.get("params", []),
|
||||
"inject": m.get("inject", []),
|
||||
}
|
||||
for n, m in TOOL_META.items()
|
||||
if n in self._tools # 仅上报真正注册的业务工具(list_tools 自身不计入)
|
||||
]
|
||||
return json.dumps({"service": "mcp-py", "tools": tools})
|
||||
|
||||
Reference in New Issue
Block a user