mirror of
https://github.com/zhayujie/chatgpt-on-wechat.git
synced 2026-06-02 09:37:38 +08:00
Allows CowAgent to dynamically load tools from any MCP server at startup,
extending the agent from a fixed toolset to an open, extensible tool ecosystem.
## What's added
- `agent/tools/mcp/mcp_client.py`: lightweight JSON-RPC client supporting both
stdio (subprocess) and SSE (HTTP) transports — zero extra dependencies
- `agent/tools/mcp/mcp_tool.py`: `McpTool` wraps a single MCP tool as a
`BaseTool`, with dynamic name/description/params set at instance level
- `agent/tools/tool_manager.py`: new `_load_mcp_tools()` loads MCP servers at
startup via `McpClientRegistry`; falls back gracefully on any error; no-op
when `mcp_servers` is not configured
- `config.py`: registers `mcp_servers` in `available_setting` with inline docs
## Design
- No new dependencies — JSON-RPC implemented from scratch using stdlib only
- MCP clients are long-lived (initialized once, shared across tool calls)
- `McpClientRegistry` holds all subprocess handles and shuts them down cleanly
- Server init failures are non-fatal: logged as warnings, agent continues normally
- Zero overhead when `mcp_servers` is absent from config
## Config example
```json
"mcp_servers": [
{
"name": "filesystem",
"type": "stdio",
"command": "npx",
"args": ["-y", "@modelcontextprotocol/server-filesystem", "/tmp"]
}
]
```
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
150 lines
4.8 KiB
Python
150 lines
4.8 KiB
Python
# Import base tool
|
|
from agent.tools.base_tool import BaseTool
|
|
from agent.tools.tool_manager import ToolManager
|
|
|
|
# Import file operation tools
|
|
from agent.tools.read.read import Read
|
|
from agent.tools.write.write import Write
|
|
from agent.tools.edit.edit import Edit
|
|
from agent.tools.bash.bash import Bash
|
|
from agent.tools.ls.ls import Ls
|
|
from agent.tools.send.send import Send
|
|
|
|
# Import memory tools
|
|
from agent.tools.memory.memory_search import MemorySearchTool
|
|
from agent.tools.memory.memory_get import MemoryGetTool
|
|
|
|
# Import tools with optional dependencies
|
|
def _import_optional_tools():
|
|
"""Import tools that have optional dependencies"""
|
|
from common.log import logger
|
|
tools = {}
|
|
|
|
# EnvConfig Tool (requires python-dotenv)
|
|
try:
|
|
from agent.tools.env_config.env_config import EnvConfig
|
|
tools['EnvConfig'] = EnvConfig
|
|
except ImportError as e:
|
|
logger.error(
|
|
f"[Tools] EnvConfig tool not loaded - missing dependency: {e}\n"
|
|
f" To enable environment variable management, run:\n"
|
|
f" pip install python-dotenv>=1.0.0"
|
|
)
|
|
except Exception as e:
|
|
logger.error(f"[Tools] EnvConfig tool failed to load: {e}")
|
|
|
|
# Scheduler Tool (requires croniter)
|
|
try:
|
|
from agent.tools.scheduler.scheduler_tool import SchedulerTool
|
|
tools['SchedulerTool'] = SchedulerTool
|
|
except ImportError as e:
|
|
logger.error(
|
|
f"[Tools] Scheduler tool not loaded - missing dependency: {e}\n"
|
|
f" To enable scheduled tasks, run:\n"
|
|
f" pip install croniter>=2.0.0"
|
|
)
|
|
except Exception as e:
|
|
logger.error(f"[Tools] Scheduler tool failed to load: {e}")
|
|
|
|
# WebSearch Tool (conditionally loaded based on API key availability at init time)
|
|
try:
|
|
from agent.tools.web_search.web_search import WebSearch
|
|
tools['WebSearch'] = WebSearch
|
|
except ImportError as e:
|
|
logger.error(f"[Tools] WebSearch not loaded - missing dependency: {e}")
|
|
except Exception as e:
|
|
logger.error(f"[Tools] WebSearch failed to load: {e}")
|
|
|
|
# WebFetch Tool
|
|
try:
|
|
from agent.tools.web_fetch.web_fetch import WebFetch
|
|
tools['WebFetch'] = WebFetch
|
|
except ImportError as e:
|
|
logger.error(f"[Tools] WebFetch not loaded - missing dependency: {e}")
|
|
except Exception as e:
|
|
logger.error(f"[Tools] WebFetch failed to load: {e}")
|
|
|
|
# Vision Tool (conditionally loaded based on API key availability)
|
|
try:
|
|
from agent.tools.vision.vision import Vision
|
|
tools['Vision'] = Vision
|
|
except ImportError as e:
|
|
logger.error(f"[Tools] Vision not loaded - missing dependency: {e}")
|
|
except Exception as e:
|
|
logger.error(f"[Tools] Vision failed to load: {e}")
|
|
|
|
return tools
|
|
|
|
# Load optional tools
|
|
_optional_tools = _import_optional_tools()
|
|
EnvConfig = _optional_tools.get('EnvConfig')
|
|
SchedulerTool = _optional_tools.get('SchedulerTool')
|
|
WebSearch = _optional_tools.get('WebSearch')
|
|
WebFetch = _optional_tools.get('WebFetch')
|
|
Vision = _optional_tools.get('Vision')
|
|
GoogleSearch = _optional_tools.get('GoogleSearch')
|
|
FileSave = _optional_tools.get('FileSave')
|
|
Terminal = _optional_tools.get('Terminal')
|
|
|
|
|
|
# BrowserTool (requires playwright)
|
|
def _import_browser_tool():
|
|
from common.log import logger
|
|
try:
|
|
from agent.tools.browser.browser_tool import BrowserTool
|
|
return BrowserTool
|
|
except ImportError as e:
|
|
logger.info(
|
|
f"[Tools] BrowserTool not loaded - missing dependency: {e}\n"
|
|
f" To enable browser tool, run:\n"
|
|
f" pip install playwright\n"
|
|
f" playwright install chromium"
|
|
)
|
|
return None
|
|
except Exception as e:
|
|
logger.error(f"[Tools] BrowserTool failed to load: {e}")
|
|
return None
|
|
|
|
BrowserTool = _import_browser_tool()
|
|
|
|
# MCP Tools (no extra dependencies, loaded on demand)
|
|
def _import_mcp_tools():
|
|
"""导入 MCP 工具模块(无额外依赖,按需加载)"""
|
|
from common.log import logger
|
|
try:
|
|
from agent.tools.mcp.mcp_tool import McpTool
|
|
from agent.tools.mcp.mcp_client import McpClientRegistry
|
|
return {'McpTool': McpTool, 'McpClientRegistry': McpClientRegistry}
|
|
except Exception as e:
|
|
logger.warning(f"[Tools] MCP tools not loaded: {e}")
|
|
return {}
|
|
|
|
_mcp_tools = _import_mcp_tools()
|
|
McpTool = _mcp_tools.get('McpTool')
|
|
McpClientRegistry = _mcp_tools.get('McpClientRegistry')
|
|
|
|
# Export all tools (including optional ones that might be None)
|
|
__all__ = [
|
|
'BaseTool',
|
|
'ToolManager',
|
|
'Read',
|
|
'Write',
|
|
'Edit',
|
|
'Bash',
|
|
'Ls',
|
|
'Send',
|
|
'MemorySearchTool',
|
|
'MemoryGetTool',
|
|
'EnvConfig',
|
|
'SchedulerTool',
|
|
'WebSearch',
|
|
'WebFetch',
|
|
'Vision',
|
|
'BrowserTool',
|
|
'McpTool',
|
|
]
|
|
|
|
"""
|
|
Tools module for Agent.
|
|
"""
|