关于 🧠 Ultimate MCP Client
面向使用外部工具和上下文数据的 AI 模型用户的异步 Python MCP 客户端,提供交互式命令行和 Web UI,并支持服务发现、对话分支与监控。
主要功能
- 01交互式命令行和响应式 Web UI
- 02通过 stdio、SSE 和 streaming HTTP 连接
- 03发现本地、网络及注册表中的服务
- 04分支化并持久化对话
- 05通过 OpenTelemetry 和仪表板监控
- 06按可配置 TTL 缓存工具结果
适用场景
- 01让 Claude 使用 MCP 服务的工具进行对话
- 02查找并连接本地网络中的 MCP 服务
- 03探索不同的对话分支
- 04检查服务健康状况和工具活动
MCP 相关
通过 stdio、SSE 和 streaming HTTP 连接并管理 MCP 服务。它从本地路径、mDNS、端口扫描和远程注册表发现服务,并将模型的工具调用路由到相应服务。
详细介绍
🧠 Ultimate MCP 客户端
一款功能全面的异步客户端,适用于 Model Context Protocol (MCP)。它连接了 Anthropic 的 Claude 等强大的 AI 模型与种类繁多的外部工具、本地/远程服务和上下文数据源,使复杂的有状态交互成为可能。

由 Jeffrey Emanuel 构建
🎯 目的与动机
Model Context Protocol (MCP) 对 AI 模型与外部功能(工具、资源、提示词)的交互方式进行了标准化。本客户端致力于成为使用 MCP 的终极接口,提供:
- 稳健的连接能力: 通过内置的弹性机制、高级错误处理和智能发现,可靠地连接各种 MCP 服务(
stdio、sse)。 - 丰富的用户体验: 同时提供强大的交互式命令行界面和现代化的响应式 Web UI,满足各种工作流的使用需求。
- 高级状态管理: 不止于简单的聊天记录,还支持可分叉的对话图、跨会话持久化状态和智能上下文优化技术。
- 开发者洞察: 通过 OpenTelemetry 指标和追踪提供深入的可观测性,并配备实时仪表板,用于监控客户端和服务的运行状况与性能。
- 无缝集成: 轻松发现并集成本地文件系统脚本、本地网络 (mDNS) 服务、本地端口扫描结果、远程注册表条目,甚至是 Claude 桌面应用等现有工具的配置。
本项目致力于应对重大的工程挑战,尤其是可靠的 stdio 通信、异步状态管理,以及在命令行界面和 Web 界面之间提供一致的体验,从而打造真正全面的 MCP 客户端解决方案。
🔌 主要功能
-
双界面:Web UI 与命令行界面
- Web UI: 基于 Alpine.js、DaisyUI 和 Tailwind CSS 构建的精美响应式界面。支持通过 WebSockets 实时流式传输聊天内容、服务/工具管理弹窗、对话分支可视化视图、设置配置、多主题切换(代码高亮支持浅色/深色模式),以及直接执行工具。
- 命令行界面: 功能丰富的交互式 Shell(支持
/commands、自动补全和 Rich Markdown 渲染),并可通过 Typer 批量运行。还包含用于监控的实时 Textual 用户界面 (TUI) 仪表板。
-
强大的服务连接与管理
- 支持
stdio、sse(HTTP Server-Sent Events)和streaming-httpMCP 服务。 - **高级 STDIO 处理(重点工程投入):**采用自定义的
RobustStdioSession,旨在妥善处理可能存在噪声或不符合规范的stdio服务。其功能包括:- *噪声过滤:*忽略可能破坏协议的非 JSON-RPC 输出。
- *直接解析 Future:*避免复杂的排队机制,以更快地处理响应。
- *进程生命周期管理:*可靠地启动、监控、终止和结束
stdio服务进程。 - **关键 STDIO 安全保障:**多层防护系统(
StdioProtectionWrapper、safe_stdout上下文管理器、get_safe_console()函数)可防止意外写入sys.stdout破坏stdio通道,确保多个stdio服务与用户输出安全共存(必要时将用户输出重定向到stderr)。这对稳定性至关重要。
- **弹性:**使用指数退避机制自动重试连接,并为故障服务启用熔断器(
@retry_with_circuit_breaker)。后台健康监控(ServerMonitor)会检查服务的响应能力。
- 支持
-
现代传输协议支持
- **Streaming-HTTP:**通过 FastMCP 库原生支持现代
streaming-http传输协议。该传输协议可通过 HTTP 实现高效的双向通信,并内置流式处理能力,非常适合现代 MCP 服务部署。 - **智能传输协议检测:**根据服务 URL 和发现信息自动检测并建议适当的传输类型:
- 本地文件路径 →
stdio - 路径中包含
/sse或/events的 URL →sse - 一般 HTTP/HTTPS URL →
streaming-http(现代服务的默认类型)
- 本地文件路径 →
- **Streaming-HTTP:**通过 FastMCP 库原生支持现代
-
智能服务发现
- 在配置的文件系统路径中自动发现本地
stdio服务(Python/JS 脚本)。 - **mDNS 发现(Zeroconf):**实时发现本地网络上的 MCP 服务(
_mcp._tcp.local.)并发送通知。提供交互式命令(/discover list、/discover connect等)来管理局域网服务。 - **本地端口扫描:**主动扫描可配置范围内的本地端口(例如 8000-9000),并尝试进行
initialize握手以发现 MCP 服务。支持检测所有传输类型(stdio、sse、streaming-http)。可通过/config port-scan ...命令进行配置。 - **注册表集成:**连接到配置中指定的远程 MCP 注册表,以查找并添加共享服务。
- **Claude Desktop 导入:**自动检测项目根目录中的
claude_desktop_config.json。智能适配配置:- 将
wsl.exe ... bash -c "cmd"调用映射为直接执行 Linux shell 命令(/bin/bash -c "cmd")。 - 使用
adapt_path_for_platform将参数中的 Windows 风格路径(C:\...)转换为对应的 Linux/WSL 路径(/mnt/c/...),实现无缝集成。
- 将
- 在配置的文件系统路径中自动发现本地
-
强大的 AI 集成与流式处理
- 通过官方
anthropicSDK 深度集成 Claude 模型,支持多轮工具调用场景。 - 实时流式处理:通过 WebSockets(Web UI)和实时
Rich渲染(CLI)流式传输 AI 响应和工具状态更新。支持处理复杂的流式事件,包括为需要结构化输入的工具累积部分 JSON 输入(input_json_delta)。 - **智能工具路由:**根据已加载的功能,将工具调用路由到正确的来源服务;为兼容 API 使用经过清理的名称,同时在内部跟踪原始名称。
- **直接执行工具:**通过
/tool命令(CLI)或专用弹窗(Web UI),使用自定义 JSON 参数运行指定工具。
- 通过官方
-
高级对话管理
- 分支功能: 可分叉的对话图(
ConversationGraph)允许探索不同的交互路径,同时保留历史记录。在 Web UI 中以可视化方式呈现和导航。 - 持久化: 对话图(包括所有分支和消息)自动保存到配置目录中的 JSON 文件,跨会话保留状态。
- 上下文优化: 使用指定的 AI 大模型(可配置)自动或手动汇总(
/optimize)长对话历史,以保持在上下文限制内。 - 动态提示词: 使用
/prompt命令将从服务获取的预定义提示词模板注入当前对话上下文。 - 导入/导出: 轻松保存(
/export)和加载(/import)整个对话分支,采用便携式 JSON 格式,便于共享或备份。
- 分支功能: 可分叉的对话图(
-
可观测性与监控
- OpenTelemetry: 集成的指标(使用
opentelemetry-sdk的计数器、直方图)和追踪(跨度),用于监控客户端操作、服务请求和工具执行性能。可启用控制台导出器进行调试。 - 实时仪表板:
- 命令行: 使用
Rich构建的实时 TUI 仪表板(/dashboard),显示服务健康状况、工具使用统计和客户端信息。 - Web UI: 动态更新服务器状态、健康指标和功能计数。
- 命令行: 使用
- OpenTelemetry: 集成的指标(使用
-
智能缓存
- 可选的磁盘(
diskcache)和内存中缓存,用于工具结果,以提高速度并降低成本。 - 可配置的按工具类别生存时间(TTL)(例如
weather、filesystem)。 - 依赖跟踪: 定义工具之间的关系。使一个工具的缓存失效(例如
stock:lookup)可以自动使依赖缓存失效(例如stock:analyze)。通过/cache dependencies查看图表。
- 可选的磁盘(
📸 截图
Ultimate MCP 客户端的界面概览:
交互式命令行:带有工具调用/结果的流式响应。 |
实时 TUI 仪表板:实时服务器和工具监控( | |
Web UI:主聊天界面,展示消息和工具交互。 |
Web UI:服务器管理选项卡,包含连接状态和控制。 |
Web UI:对话选项卡,展示分支图结构。 |
说明: 某些截图展示了
llm_gateway:generate_completion等工具。这些工具由 LLM Gateway MCP 服务提供,这是同一作者的另一个项目。该服务充当 MCP 本机网关,使高级 Agent(如本客户端使用的 Claude)能够智能地将任务委托给各种其他大模型(例如 Gemini、GPT-4o-mini),通常可优化成本和性能。
🚀 快速开始
安装依赖
需要 Python 3.13+
首先,安装 uv(推荐的快速 Python 包管理器):
# macOS / Linux
curl -LsSf https://astral.sh/uv/install.sh | sh
# Windows
powershell -c "irm https://astral.sh/uv/install.ps1 | iex"
然后克隆仓库,使用 Python 3.13+ 设置虚拟环境,并安装包:
git clone https://github.com/Dicklesworthstone/ultimate_mcp_client
cd ultimate_mcp_client
# Create venv using uv (recommended)
uv venv --python 3.13
# Or using standard venv
# python3.13 -m venv .venv
# Activate environment
source .venv/bin/activate # Linux/macOS
# .venv\Scripts\activate # Windows Powershell
# .\venv\Scripts\activate.bat # Windows CMD
# Install dependencies using uv (fastest)
uv sync --all-extras
# Or using pip (slower)
# pip install -e . # Installs only core dependencies
配置 API 密钥
将 Anthropic API 密钥设置为环境变量:
export ANTHROPIC_API_KEY="sk-ant-..."
# Or add ANTHROPIC_API_KEY="sk-ant-..." to a .env file in the project root
或者,稍后在交互式命令行中使用 /config api-key ... 命令或通过 Web UI 设置面板进行设置。
启动 Web UI(推荐)
mcpclient run --webui
然后在浏览器中打开 http://127.0.0.1:8017(或配置的主机/端口)。
你可以自定义主机和端口:
mcpclient run --webui --host 0.0.0.0 --port 8080
运行交互式命令行模式
mcpclient run --interactive
运行单次查询
mcpclient run --query "What's the weather in New York?"
显示命令行仪表板
mcpclient run --dashboard
配置端口扫描
# Enable port scanning (if disabled)
mcpclient config port-scan enable true
# Set the range (example)
mcpclient config port-scan range 8000 8999
导入和导出对话
# Export current conversation branch to a default filename
mcpclient export
# Export current branch to a specific file
mcpclient export --output my_conversation.json
# Export specific conversation branch by ID (first 8 chars often suffice)
mcpclient export --id 12345678 --output specific_branch.json
# Import a conversation file (creates a new branch under the current node)
mcpclient import-conv my_conversation.json
🌐 Web UI 功能
Web UI(mcpclient run --webui)基于 Alpine.js、Tailwind CSS 和 DaisyUI 构建,提供现代、易用的界面:
- 实时聊天: 通过 WebSockets 流式接收 Claude 的响应,支持丰富的 Markdown 渲染(通过
Marked.js)、代码块语法高亮(通过highlight.js)和复制按钮,并清晰显示系统消息和状态更新。 - 工具交互: 在聊天流程中直观地区分并显示工具调用(参数)及其结果(成功或错误)。用户可通过模态框使用自定义 JSON 参数直接执行任何可用工具,以便测试和调试。
- 服务管理: 专用侧边栏标签页会列出已配置的服务。用户可以:
- 通过模态表单添加新服务(STDIO/SSE/Streaming-HTTP)。
- 连接或断开与服务的连接,并查看状态指示器(加载中、已连接、已断开、错误)。
- 启用或禁用服务(禁用时会自动断开连接)。
- 移除服务配置。
- 查看基本运行状况/状态,以及每个服务提供的工具数量。
- 发现: Servers 标签页中的按钮可触发发现扫描(本地文件系统、远程注册表、mDNS)。发现的服务会显示在列表中,用户只需单击一次即可将其添加到配置中。
- 对话分支: Conversation 标签页中的交互式树视图可直观呈现
ConversationGraph。用户可以单击切换到不同分支(更新聊天视图),也可以从当前节点分叉以创建新分支。 - 上下文管理: Conversation 标签页中的按钮可清除当前分支的消息(重置为父级/根状态),或通过 API 触发上下文优化/摘要生成。
- 导入/导出: Conversation 标签页中的按钮可将当前分支导出为 JSON 文件,或通过选择文件导入之前导出的 JSON 文件(上传至后端)。
- 设置: 专用侧边栏标签页可查看和修改关键配置选项(API Key、默认模型、最大令牌数、温度、流式传输、缓存、自动发现、mDNS 等功能开关),修改后的设置会保存到服务端配置文件。
- 主题切换: 下拉菜单提供多种 DaisyUI 主题供选择。界面会即时适配,代码高亮也会根据所选主题自动切换浅色/深色样式。
- 状态指示器: 页眉中会显示 WebSocket 实时连接状态图标、服务连接总数和可用工具总数。聊天输入框下方会显示临时状态消息(例如“正在执行工具……”)。
🔌 API 服务
使用 --webui 运行时,FastAPI 服务会提供程序化访问能力:
GET /api/status - Client overview (model, servers, tools, history count, current node)
GET /api/config - Get current (non-sensitive) configuration
PUT /api/config - Update configuration settings (e.g., { "temperature": 0.8 })
GET /api/servers - List all configured servers with status, health, tools
POST /api/servers - Add a new server configuration (Supports stdio/sse/streaming-http transports)
DELETE /api/servers/{server_name} - Remove a server configuration
POST /api/servers/{server_name}/connect - Connect to a specific server
POST /api/servers/{server_name}/disconnect - Disconnect from a specific server
PUT /api/servers/{server_name}/enable?enabled={true|false} - Enable/disable a server
GET /api/tools - List all available tools from connected servers
GET /api/resources - List all available resources
GET /api/prompts - List all available prompts
GET /api/conversation - Get current conversation state (messages, current node ID/name, full node graph)
POST /api/conversation/fork - Create a fork (optionally named) from the current conversation node
POST /api/conversation/checkout - Switch the current context to a different conversation node/branch (by ID)
POST /api/conversation/clear - Clear messages on the current node and switch to root
POST /api/conversation/optimize - Trigger context summarization for the current node (optional model/token args)
POST /api/tool/execute - Execute a specific tool with given parameters (Requires ToolExecuteRequest model)
WS /ws/chat - WebSocket endpoint for streaming chat (`query`, `command`), receiving updates (`text_chunk`, `status`, `query_complete`, `error`, `state_update`).
(注意:ServerAddRequest、ToolExecuteRequest 等实际请求/响应模型定义在 Python 代码中,并由 FastAPI 用于验证。)
⚙️ 命令
CLI 选项
运行 mcpclient --help 或 mcpclient [COMMAND] --help 查看详情。
交互式 Shell 命令(mcpclient run --interactive)
输入 / 后接命令:
/help Show this help message
/exit, /quit Exit the client
/config Manage configuration (api-key, model, max-tokens, history-size, auto-discover, discovery-path, port-scan)
/servers Manage MCP servers (list, add, remove, connect, disconnect, enable, disable, status)
/discover Discover/manage LAN servers (list, connect <NAME>, refresh, auto <on|off>)
/tools List available tools (optionally filter by server: /tools <server_name>)
/tool Directly execute a tool: /tool <tool_name> '{"param": "value"}'
/resources List available resources (optionally filter by server: /resources <server_name>)
/prompts List available prompt templates (optionally filter by server: /prompts <server_name>)
/prompt Apply a prompt template to the current conversation context: /prompt <prompt_name>
/model View or change the current AI model: /model [<model_name>]
/fork Create a new branch from the current conversation point: /fork [Optional Branch Name]
/branch Manage branches (list, checkout <node_id_prefix>)
/export Export current branch: /export [--id <node_id>] [--output <file.json>]
/import Import conversation file: /import <file.json>
/history View recent conversation history (optionally specify number: /history 10)
/cache Manage tool cache (list, clear [--all|tool_name], clean, dependencies [tool_name])
/dashboard Show the live Textual User Interface (TUI) dashboard (requires separate run)
/optimize Summarize current conversation context: /optimize [--model <model>] [--tokens <num>]
/reload Disconnect, reload capabilities, and reconnect to enabled servers
/clear Clear messages in the current branch and optionally reset to root
🏗️ 架构与工程亮点
此客户端采用了多种技术,以提供稳健且功能丰富的体验:
- 异步核心: 完全基于 Python 的
asyncio构建,可高效处理网络 I/O(HTTP、WebSockets、SSE)、子进程通信(stdio)、文件系统操作(aiofiles)以及并发后台任务(监控、发现、端口扫描)。 - 基于组件的设计: 为便于使用,软件主要打包为单个脚本,但内部按职责划分为不同的类:
MCPClient:主应用类,负责协调 UI 循环、命令处理和核心逻辑。ServerManager:负责服务配置、生命周期(连接、断开连接、重启)、发现机制、能力汇总(工具、资源、提示词),并管理服务进程和会话。使用AsyncExitStack确保可靠地清理资源。支持所有传输类型,包括通过 FastMCP 集成的现代streaming-http协议。RobustStdioSession(关键工程工作): 专为stdio服务定制的mcp.ClientSession实现。其逻辑包括:- 过滤服务
stdout中非 JSON-RPC 输出,以防止协议错误。 - 通过直接解析与请求 ID 关联的
asyncio.Future对象来处理响应,这可能比基于队列的方案性能更好。 - 管理用于读取
stdout以及异步将捕获的stderr写入日志文件的后台任务。 - 妥善处理进程终止和清理。
- 过滤服务
- STDIO 安全机制(至关重要): 通过多层防护,避免意外污染
stdout;这对基于stdio的协议而言是致命问题:StdioProtectionWrapper:全局包装sys.stdout以拦截写入;如果有任何stdio服务处于活动状态,则将写入内容重定向到stderr。safe_stdout():上下文管理器,在关键操作(如连接服务)期间临时将stdout重定向到stderr。get_safe_console()/safe_print():实用函数,可确保 UI 输出(通过Rich)根据活动的stdio服务使用正确的流(stdout或stderr)。- 这些措施使客户端 UI 和日志记录即使在与对
stdio敏感的服务通信时,也能正常运行。
ConversationGraph:使用ConversationNode对象管理非线性、分支式的对话结构,并负责与 JSON 之间的持久化。ToolCache:使用diskcache实现缓存逻辑,以便持久化,并通过内存层提高速度。包含 TTL 管理和依赖项失效机制。ServerRegistry/ServerMonitor:负责 mDNS/Zeroconf 发现和注册,以及通过恢复尝试进行后台服务健康检查。
- 双界面实现:
- Web 后端: 使用
FastAPI构建简洁的 REST API 结构,使用uvicorn作为 ASGI 服务,并使用websockets实现双向实时聊天。FastAPIlifespan上下文管理器可确保在启动时正确初始化MCPClient,并在关闭时完成清理。依赖注入使端点能够访问客户端实例。 - Web 前端: 直接在 HTML 中使用
Alpine.js实现轻量级响应式和组件逻辑。Tailwind CSS和DaisyUI提供样式和预构建组件。Marked.js、highlight.js和DOMPurify负责安全、美观地渲染 Markdown 和代码。Tippy.js提供工具提示。 - CLI/TUI: 使用
Typer定义命令行界面并解析参数。大量使用Rich实现格式化控制台输出、表格、进度条、Markdown 渲染、语法高亮和实时 TUI 仪表板。通过谨慎的管理(_run_with_progress、_run_with_simple_progress辅助函数),避免在复杂操作期间出现嵌套Rich Live显示问题。
- Web 后端: 使用
- 弹性与错误处理: 使用装饰器(
@retry_with_circuit_breaker、@with_tool_error_handling)处理常见模式,例如重试和工具执行期间的标准化错误报告。整个项目广泛使用结构化的try...except...finally块来增强健壮性。 - 可观测性: 集成
OpenTelemetry,用于结构化指标(请求计数器、延迟直方图、工具执行情况)和分布式跟踪(跨度跟踪查询处理、服务连接、工具调用等操作)。这有助于性能分析和调试。 - 配置: 灵活的配置系统,使用
config.yaml文件、环境变量(尤其是ANTHROPIC_API_KEY等敏感密钥),以及可将更改持久化回 YAML 文件的交互式命令或 Web UI 设置。
🔄 智能缓存依赖跟踪
智能缓存依赖系统允许工具声明对其他工具的依赖:
- 当某个工具的缓存失效时,所有依赖该工具的工具缓存都会自动失效
- 服务声明工具关系时,会注册依赖项
- 使用
/cache dependencies查看依赖关系图 - 确保相关工具使用最新数据,从而提高数据一致性
依赖流程示例:
weather:current → weather:forecast → travel:recommendations
如果当前天气数据更新,天气预报和旅行建议的缓存都会自动失效。
🔍 工具与服务发现
此客户端提供多种方式来查找和集成 MCP 服务:
- 已配置路径: 在
config.yaml(discovery_paths下)指定的目录中搜索本地stdio服务脚本(例如,.py、.js)。默认路径包括:.mcpclient_config/servers(位于项目根目录)~/mcp-servers~/modelcontextprotocol/servers
- Claude Desktop 配置(
claude_desktop_config.json): 如果此文件存在于项目根目录中,客户端会在设置期间自动从中导入服务定义。- 智能命令适配:
- 检测
wsl.exe ... <shell> -c "command ..."模式。 - 提取 Linux
<shell>(例如,bash、sh)和"command ..."。 - 将配置改为使用识别出的 Linux shell 直接执行命令(例如,
/bin/bash -c "command ..."),绕过wsl.exe。 - 对于其他命令类型(例如,
npx ...),会使用adapt_path_for_platform扫描参数中的 Windows 风格路径(C:\Users\...),并将其转换为对应的/mnt/c/Users/...路径,以确保客户端在 WSL/Linux 中运行时兼容。
- 检测
- 智能命令适配:
- 远程注册表: 连接到
config.yaml(registry_urls)中定义的 MCP 注册表服务 URL,以发现公开可用或共享的服务(通常使用 SSE)。 - 本地网络(mDNS/Zeroconf):
- 使用
zeroconf库监听本地网络上以_mcp._tcp.local.名称广播的服务。 - 当新服务出现或消失时,在交互式 CLI 中提供实时通知。
/discover命令组可用于管理发现的服务:/discover list:查看当前可见的 LAN 服务详情。/discover connect <NAME>:将发现的服务添加到配置文件并尝试连接。/discover refresh:手动触发网络重新扫描。/discover auto [on|off]:切换持续的后台 mDNS 扫描(需要在配置中设置enable_local_discovery: true)。
- 使用
- 本地端口扫描:
- 如果已启用(在
config.yaml中设置enable_port_scanning: true,或通过/config port-scan enable true启用),则会在启动发现期间主动扫描指定本地 IP 地址上的一系列端口。 - 尝试在每个端口进行基本的 MCP
initialize握手,以检测响应的 MCP 服务。支持根据服务响应和 HTTP 标头自动检测sse和streaming-http传输类型。 - 适用于查找未使用 mDNS 广播的服务。
- 可通过
config.yaml或/config port-scan ...命令配置端口范围、目标 IP、并发数和超时时间。 - 找到的服务会与其他已发现的服务一同列出,供用户选择是否添加到配置中。
- 如果已启用(在
📡 遥测 + 调试
- OpenTelemetry: 为关键操作生成追踪和指标。默认情况下会收集数据,但不会导出。将
mcpclient.py顶部附近的use_console_exporter = True设置为启用控制台输出,以便调试追踪和指标(输出内容较多)。在生产环境中,请配置合适的 OTel 导出器(例如 Jaeger、Prometheus)。 - 仪表板:
- CLI: 运行
mcpclient run --dashboard,即可启动由Rich驱动的实时 TUI 监控视图。此视图显示服务状态、运行状况、连接状态、基本工具使用统计信息和客户端信息,并会定期刷新。 - Web UI: “Servers”选项卡以可视化方式显示服务状态(通过图标显示连接状态和运行状况),标题栏则显示总体计数。
- CLI: 运行
- 日志记录: 使用 Python 标准库
logging,并通过RichHandler美化控制台输出(输出到stderr,以避免与stdio冲突)。- 使用
--verbose或-v标志可将日志级别提高到 DEBUG,以查看详细的内部信息。 - 详细模式还会启用
stdio会话详细日志记录(USE_VERBOSE_SESSION_LOGGING = True),以查看原始 JSON-RPC 消息(有助于调试 MCP 服务)。
- 使用
- 错误回溯: 在运行前设置环境变量
MCP_CLIENT_DEBUG=1,可让 CLI 在发生意外错误时打印完整的 Python 回溯信息,便于调试客户端问题。 - STDIO 服务日志: 异步捕获
stdio服务的stderr输出,并将其写入配置目录中的日志文件(例如.mcpclient_config/<server_name>_stderr.log),这对于诊断服务端问题至关重要。
📦 配置
- 主配置文件: 配置从项目根目录下的
.mcpclient_config/config.yaml加载,并保存到此文件。 - 环境变量:
ANTHROPIC_API_KEY是提供 API 密钥的主要方式,并会覆盖配置文件中保存的密钥。EDITOR用于/config edit。MCP_CLIENT_DEBUG=1可启用回溯信息。 - 交互式 CLI:
/config命令可用于查看和修改api-key、model、max-tokens、discovery-path、端口扫描参数等设置。更改会保存回config.yaml。 - Web UI 设置: Web UI 中的“Settings”选项卡提供了常用配置选项的控件。在此处所做的更改会通过 API 发送并保存到
config.yaml。
查看当前配置:
mcpclient config --show
# OR in interactive mode:
/config
手动编辑配置文件:
mcpclient config --edit
# (This will open .mcpclient_config/config.yaml in the editor specified by your $EDITOR environment variable)
🧪 开发说明
- 核心: Python 3.13+、
asyncio - CLI:
Typer、Rich - Web:
FastAPI、Uvicorn、WebSockets、Alpine.js、Tailwind CSS、DaisyUI - MCP:
mcpSDK(mcp>=1.0.0)、fastmcp(用于 streaming-http 传输) - AI:
anthropicSDK(anthropic>=0.15.0) - 可观测性:
opentelemetry-sdk、opentelemetry-api、opentelemetry-instrumentation - 实用工具:
httpx、PyYAML、python-dotenv、psutil、aiofiles、diskcache、tiktoken、zeroconf、colorama - 代码检查/格式化: 已在
pyproject.toml中配置ruff。使用uv run lint或ruff check . && ruff format .。 - 类型检查: 已在
pyproject.toml中配置mypy。使用uv run typecheck或mypy mcpclient.py。
项目主要集中在 mcpclient.py 中,以便于分发和自省,同时保留内部基于类的模块化结构。Web UI 由独立的 mcp_client_ui.html 文件提供服务,并使用 CDN 托管的库以简化部署。健壮的 stdio 处理和异步管理等关键复杂逻辑,位于 RobustStdioSession 和 ServerManager 等专用类中。
📝 许可证
MIT License(附带 OpenAI/Anthropic 补充条款)。请参阅 LICENSE。
评论
一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。