mcpField
M
mcp-chaining

mcp-chaining

github.com/parcadeiAgent 工作流3.9k483 次安装39 周前更新
代码仓库

关于 mcp-chaining

一个从研究到实现的流程示例,将 5 个 MCP 工具用于文档搜索、代码查找、质量检查和 Git 操作。面向构建多工具 MCP 工作流的开发者,并展示可选工具处理与错误捕获。

主要功能

  1. 01跨流程步骤串联 5 个 MCP 工具
  2. 02搜索文档和代码模式
  3. 03执行代码质量检查与 Git 操作
  4. 04单个工具不可用时继续运行
  5. 05捕获步骤错误而不中止流程

适用场景

  1. 01构建多工具 MCP 研究流程
  2. 02探索工具不可用时的降级处理
  3. 03排查 MCP 环境变量传递问题

MCP 相关

演示调用 nia、ast-grep、morph、qlty 和 git MCP 服务所暴露工具的流程。每个工具均为可选项,工具不可用时可跳过并继续执行。

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/parcadei/continuous-claude-v3 --skill mcp-chaining

安装后在 Claude Code 中输入/mcp-chaining确认已加载。

详细介绍

MCP 链式处理流水线

将 5 个 MCP 工具串联起来的研究到实现流水线,支持端到端工作流。

适用场景

  • 构建多工具 MCP 流水线
  • 了解如何通过优雅降级串联 MCP 调用
  • 调试 MCP 环境变量问题
  • 学习不同 MCP 服务的工具命名约定

构建内容

串联以下工具的流水线:

步骤服务工具 ID用途
1niania__search搜索库文档
2ast-grepast-grep__find_code查找 AST 代码模式
3morphmorph__warpgrep_codebase_search快速搜索代码库
4qltyqlty__qlty_check验证代码质量
5gitgit__git_status执行 Git 操作

关键文件

  • scripts/research_implement_pipeline.py - 流水线主要实现
  • scripts/test_research_pipeline.py - 使用独立沙盒的测试工具
  • workspace/pipeline-test/sample_code.py - 测试示例代码

使用示例

# Dry-run pipeline (preview plan without changes)
uv run python -m runtime.harness scripts/research_implement_pipeline.py \
    --topic "async error handling python" \
    --target-dir "./workspace/pipeline-test" \
    --dry-run --verbose

# Run tests
uv run python -m runtime.harness scripts/test_research_pipeline.py --test all

# View the pipeline script
cat scripts/research_implement_pipeline.py

关键修复:环境变量

MCP SDK 的 get_default_environment() 只包含基本变量(PATH、HOME 等),不包含 os.environ。我们修改了 src/runtime/mcp_client.py,以传递完整环境:

# In _connect_stdio method:
full_env = {**os.environ, **(resolved_env or {})}

这可确保 ~/.claude/.env 中的 API 密钥传递给子进程。

优雅降级模式

每个工具都是可选的。如果工具不可用(已禁用、没有 API 密钥等),流水线会继续运行:

async def check_tool_available(tool_id: str) -> bool:
    """Check if an MCP tool is available."""
    server_name = tool_id.split("__")[0]
    server_config = manager._config.get_server(server_name)
    if not server_config or server_config.disabled:
        return False
    return True

# In step function:
if not await check_tool_available("nia__search"):
    return StepResult(status=StepStatus.SKIPPED, message="Nia not available")

工具名称参考

nia(文档搜索)
nia__search              - Universal documentation search
nia__nia_research        - Research with sources
nia__nia_grep            - Grep-style doc search
nia__nia_explore         - Explore package structure
ast-grep(结构化代码搜索)
ast-grep__find_code      - Find code by AST pattern
ast-grep__find_code_by_rule - Find by YAML rule
ast-grep__scan_code      - Scan with multiple patterns
morph(快速文本搜索与编辑)
morph__warpgrep_codebase_search  - 20x faster grep
morph__edit_file                 - Smart file editing
qlty(代码质量)
qlty__qlty_check         - Run quality checks
qlty__qlty_fmt           - Auto-format code
qlty__qlty_metrics       - Get code metrics
qlty__smells             - Detect code smells
git(版本控制)
git__git_status          - Get repo status
git__git_diff            - Show differences
git__git_log             - View commit history
git__git_add             - Stage files

流水线架构

                    +----------------+
                    |   CLI Args     |
                    | (topic, dir)   |
                    +-------+--------+
                            |
                    +-------v--------+
                    | PipelineContext|
                    | (shared state) |
                    +-------+--------+
                            |
    +-------+-------+-------+-------+-------+
    |       |       |       |       |       |
+---v---+---v---+---v---+---v---+---v---+
| nia   |ast-grp| morph | qlty  | git   |
|search |pattern|search |check  |status |
+---+---+---+---+---+---+---+---+---+---+
    |       |       |       |       |
    +-------v-------v-------v-------+
                    |
            +-------v--------+
            | StepResult[]   |
            | (aggregated)   |
            +----------------+

错误处理

流水线会捕获错误,但不会导致整个运行失败:

try:
    result = await call_mcp_tool("nia__search", {"query": topic})
    return StepResult(status=StepStatus.SUCCESS, data=result)
except Exception as e:
    ctx.errors.append(f"nia: {e}")
    return StepResult(status=StepStatus.FAILED, error=str(e))

创建自己的流水线

  1. 复制 scripts/research_implement_pipeline.py 中的模式
  2. 将各个步骤定义为异步函数
  3. 使用 check_tool_available() 实现优雅降级
  4. 通过 PipelineContext 传递结果
  5. 使用 print_summary() 汇总结果

评论

支持 Markdown