Skip to content

[Bug]MCP 外接工具与内置工具重名时,会因提取规则与清洗规则导致彻底失效 #5821

@Renyus

Description

@Renyus

What happened / 发生了什么

当接入 MCP Server(例如提供 web_search 的搜索插件)时,如果该工具名与 AstrBot 原生内置的未开启/已停用工具(如自带的 web_search)重名,不仅 MCP 工具无法被使用,还会引发连坐反应,导致最终发送给大模型的 Tool Calling Schema 中连这个名字的工具都完全丢失,引发大模型拒答。
修复建议
修复 1:修改 func_tool_manager.py 中的 get_func 让它优先匹配已激活的项。
def get_func(self, name) -> FuncTool | None: # 优先返回 activated 的 for f in self.func_list: if f.name == name and getattr(f, "active", False): return f # 退化则拿最后一个覆盖的原生(后加载的覆盖前面的) for f in reversed(self.func_list): if f.name == name: return f return None
修复 2:修改 func_tool_manager.py 中 get_full_tool_set() 的逻辑,利用 add_tool 的正常防冲突能力进行填充,抛弃危险的列表指针直给。
def get_full_tool_set(self) -> ToolSet: tool_set = ToolSet() for tool in self.func_list: tool_set.add_tool(copy.deepcopy(tool)) # 这样同名 MCP 就会正确覆盖原生挂掉的工具 return tool_set

Reproduce / 如何复现?

系统内存在一个名为 web_search 且设为停用(active=False)的原生插件或工具。
通过配置 MCP Server,又挂载了名为 web_search 的 MCP 工具,并在管理端看到它亮绿灯(active=True)。

AstrBot version, deployment method (e.g., Windows Docker Desktop deployment), provider used, and messaging platform used. / AstrBot 版本、部署方式(如 Windows Docker Desktop 部署)、使用的提供商、使用的消息平台适配器

4.19.2,Ubuntu,minimax-coding-plan MCP server, deepseek,minimax,onebot v11

OS

Linux

Logs / 报错日志

控制台没有报错日志,但是代码问题如下:

func_tool_manager.py

def get_func(self, name) -> FuncTool | None:
for f in self.func_list:
if f.name == name:
return f # 永远只返回按启动顺序排在最前面的那个内置停用工具

astr_main_agent.py - _ensure_persona_and_skills()

if (persona and persona.get("tools") is None) or not persona:
persona_toolset = tmgr.get_full_tool_set()
for tool in list(persona_toolset):
if not tool.active:
persona_toolset.remove_tool(tool.name) # 这里触发了清洗

tool.py

def remove_tool(self, name: str) -> None:
"""Remove a tool by its name."""
self.tools = [tool for tool in self.tools if tool.name != name] # 瞬间将无论是原生的还是 MCP 获取的合法 web_search 连坐清零

Are you willing to submit a PR? / 你愿意提交 PR 吗?

  • Yes!

Code of Conduct

Metadata

Metadata

Assignees

No one assigned

    Labels

    area:coreThe bug / feature is about astrbot's core, backendbugSomething isn't workingfeature:pluginThe bug / feature is about AstrBot plugin system.

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions