Skip to content

MCP 发现容错 + 工具描述截断优化 #4308

Description

@nsfoxer

问题描述

  1. 部分MCP服务(如IntelliJ IDEA配套MCP服务)仅实现tools/list接口,调用resources/listprompts/list时会阻塞挂起。原有逻辑会将资源、提示词发现作为强制流程,一旦阻塞就导致整个MCP连接初始化失败,服务无法就绪。
  2. 命令行 codewhale-tui mcp tools <server> 展示工具列表时,会完整打印工具全部多行描述文本,大量前置条件、行为说明内容刷屏,输出冗长难以阅读。

复现步骤

  1. 配置CodeWhale连接IntelliJ IDEA MCP服务(该服务仅支持工具查询,资源/提示词查询会阻塞)
  2. 启动MCP服务连接初始化流程
  3. 执行 codewhale-tui mcp tools <服务名> 查看工具列表

预期行为

  1. 只要工具列表查询成功,MCP连接即可正常进入就绪状态;资源、提示词查询超时或失败仅输出警告日志,不阻断连接。
  2. 终端展示工具描述时,仅保留首行前80个字符,超长内容末尾添加省略号,避免大量冗余文本刷屏。

实际行为

  1. 连接初始化卡在资源/提示词查询步骤无限阻塞,MCP连接直接初始化失败,完全无法使用该服务的工具能力。
  2. 工具描述完整输出全部多行内容,单条工具信息占数十行,终端输出杂乱冗长。

影响范围

  • 复现概率:100%,所有仅实现tools/list、不支持资源/提示词接口的MCP服务都会触发问题。
  • 工作流阻塞程度:严重阻断,无法使用JetBrains IDE等配套MCP服务;工具列表可读性极差,排查工具信息效率极低。

运行环境

  • 操作系统:Windows 11
  • CodeWhale版本:提交 8fbc95a688d78e0a2680ff00a1ad544b1c5063cc
  • 安装方式:源码本地编译构建
  • codewhale doctor 输出:开发环境无相关输出
  • 模型/服务商:无关联,属于MCP传输层问题
  • 终端程序:Windows Terminal
  • Shell:PowerShell

日志、截图、相关代码变更

本次提交补丁信息

提交说明:fix(mcp): 增强资源/提示词发现容错性 + 截断工具描述文本
修改文件:

  1. crates/tui/src/mcp.rs:新增29行,删减3行
  2. crates/tui/src/tui/mcp_routing.rs:新增25行,删减7行
    总计:新增44行,删除10行

代码改动核心说明

1. mcp.rs:MCP发现流程容错改造

  1. McpConnection结构体新增connect_timeout_secs字段存储连接总超时时长;
  2. 调整初始化发现逻辑:仅discover_tools()为强制步骤,失败直接报错;资源、资源模板、提示词查询改为非强制;
  3. 计算单步查询自适应超时时间:总连接超时÷3,下限2秒,上限为读取超时,保证三步查询总耗时不超过连接超时;
  4. 使用tokio超时接口包裹资源、提示词查询,超时或接口报错仅打印警告日志,不中断整个连接流程,兼容仅提供工具接口的第三方MCP服务。

2. mcp_routing.rs:终端工具列表展示优化

  1. 提取工具描述仅第一行文本,舍弃后续所有换行内容;
  2. 按Unicode字符截断至80字符,超过长度则末尾添加...
  3. 简化输出格式,解决超长工具说明刷屏问题,提升终端可读性。

修复前后日志对比

修复前(连接失败):

ERROR mcp: server=idea-mcp error=resources/list 请求超时,终止MCP连接
ERROR mcp: 连接初始化失败,标记服务断开

修复后(正常就绪):

WARN mcp: server=idea-mcp error=资源查询超时(非致命错误)
INFO mcp: MCP连接就绪,工具加载完成

兼容性说明

  1. 完全兼容标准完整实现resources/prompts/list的MCP服务;
  2. 兼容仅实现tools/list的轻量化IDE MCP服务(JetBrains IDE系列);
  3. 无需新增配置项,改动自动生效,无需用户额外操作。

patch文件

0001-fix-mcp-make-resource-prompt-discovery-resilient-tru.patch

Metadata

Metadata

Assignees

No one assigned

    Labels

    bugSomething isn't workingtuiTerminal UI behavior, rendering, or interaction

    Projects

    Status
    Backlog

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions