Skip to main content

mcp

mcp 和tools skills 区别

一个典型的完整调用链是: Agent 通过 MCP 协议,连接到一个外部服务,该服务以 Skill 的形式提供了一个强大的能力,这个能力内部封装并调用了多个底层 Tools。

所以,三者不是互相排斥的选择,而是分层协作的关系,共同解决了从通信发现,到能力组织,再到原子执行的问题。

内部能力 vs 通信标准 Tools 和 Skills 的关键区别:说明书

心智模型

MCP (Model Context Protocol) 是一个开放协议,它标准化了应用程序如何为 LLM 提供工具和上下文。通过 langchain-mcp-adapters 库,LangChain Agent 能像调用本地工具一样,无缝发现并调用远程或本地子进程中运行的 MCP 服务。其核心是充当一个动态工具接入层,通过拦截器(Interceptor)弥补外部进程无法访问 LangGraph 运行时上下文的裂隙。

二级标题及内容

  • 【快速开始】Quickstart 使用 MultiServerMCPClient 统一管理多个 MCP 服务器连接(支持本地 stdio 子进程和远程 http 协议),通过 client.get_tools() 获取所有工具并传给 create_agent。默认无状态,每次工具调用创建新会话并清理。

  • 【自定义服务器】Custom servers 使用 FastMCP 库可以快速创建自定义 MCP 服务,通过装饰器暴露 Python 函数为工具。示例展示了数学(stdio)和天气(http)两种传输方式。

  • 【传输方式】Transports

    • HTTP:使用 url 连接远程服务。支持通过 headers 字段传递自定义请求头(如认证令牌),也支持自定义 httpx.Auth 接口实现更复杂的认证。
    • stdio:适用于本地工具,客户端以子进程形式启动服务,通过标准输入输出通信。
  • 【有状态会话】Stateful sessions 若需保持跨调用的服务器上下文,可用 client.session() 创建持久会话,然后将会话传给 load_mcp_tools 加载工具,使工具在会话生命周期内保持状态。

  • 【核心功能】Core features

    • 工具:通过 client.get_tools() 加载。支持返回结构化内容(存于 ToolMessage.artifact,可用拦截器追加到消息历史)和多模态内容(通过 content_blocks 访问标准化格式)。
    • 资源:通过 client.get_resources() 加载,返回统一的 Blob 对象,用于处理文件和数据库记录等数据。
    • 提示:通过 client.get_prompt() 加载服务器定义的可复用提示模板,返回可直接使用的 messages 列表。
  • 【高级功能】Advanced features

    • 工具拦截器:核心是弥合 MCP 进程无法访问 LangGraph 运行时(State, Store, Context)的差距。拦截器可注入用户凭证、读取用户偏好、根据认证状态拦截敏感工具、实现重试/错误处理逻辑,甚至通过 Command 控制图执行流。
    • 进度通知:通过 Callbacks(on_progress=...) 订阅长时间运行工具的执行进度。
    • 日志:通过 Callbacks(on_logging_message=...) 接收 MCP 服务器端日志。
    • 引导获取 (Elicitation):允许 MCP 工具在执行中通过 ctx.elicit() 向用户请求额外输入,客户端通过 on_elicitation 回调处理请求并决定 accept/decline/cancel

最佳实践

  • 注意默认无状态:除非显式管理会话,否则每次工具调用都是独立的,不保留服务器端状态。
  • 善用拦截器注入上下文:MCP 工具自身无法访问 Runtime,必须通过拦截器将用户 ID、权限等关键信息注入到工具参数中。
  • 利用结构化内容:MCP 工具返回的 structuredContent 存于 ToolMessage.artifact,若需模型可见,应通过拦截器拼接回 content
  • 处理多模态:工具可能返回文本和图片混合内容,应通过 content_blocks 属性以提供商无关的方式读取标准化内容块。

MCP 的使用场景本质上围绕一个核心需求:让 Agent 能够安全、动态地调用外部环境中的工具和数据。

具体的应用场景可以归纳为以下几类:

1. 集成企业内部工具与数据源

这是最典型的场景。企业通常有大量现有的 API、数据库和内部系统,通过将它们封装为 MCP 服务,Agent 就能直接安全地调用,无需为每个 Agent 重写集成代码。

  • 场景实例:Agent 需要查询 CRM 系统中的客户信息、在 Jira 中创建工单、或从公司内部知识库检索文档。
  • 相关特性:工具、资源、HTTP 传输、认证。

2. 执行本地代码与脚本

当 Agent 需要进行精确的数学计算、运行特定的本地脚本,或与本地文件系统交互时,可以通过本地 stdio 子进程方式来调用,保证主应用环境的隔离和安全。

  • 场景实例:一个数据分析 Agent,通过本地 MCP 服务运行一个高性能 Python 脚本来处理用户上传的 CSV 文件,并将结果可视化。
  • 相关特性:工具、stdio 传输。

3. 跨 Agent 或多步骤工作流

在复杂的多步骤业务流程中,不同的 Agent 可以通过各自暴露的 MCP 服务互相调用,实现流程编排。

  • 场景实例:一个“订单处理”Agent 调用“库存查询”MCP 服务确认库存后,再调用“物流下单”MCP 服务来完成发货。
  • 相关特性:工具、拦截器、有状态会话。

4. 需要“即插即用”的客户环境

对于允许用户添加自定义集成的产品,MCP 提供了一种标准化的方式,让 Agent 能发现并调用用户配置的自定义工具,而无需平台预先支持所有可能的集成。

  • 场景实例:一个第三方 AI 助手,允许用户在其设置页面配置自己的 Notion 或 Google Drive 的 MCP 服务地址,助手即能访问用户个人数据。
  • 相关特性:MultiServerMCPClient、HTTP 传输 (带认证)。

5. 混合“信息检索”与“执行操作”

MCP 统一了“工具”(执行操作)和“资源”(读取数据)的接口,让 Agent 能在一次对话中无缝切换。这点特别重要,因为它意味着 Agent 在查资料的同时,可以直接操作。

  • 场景实例:Agent 先通过“资源”读取一份故障排查手册 (file:///docs/cookbook.md),然后通过“工具”调用 restart_service 来应用手册中的修复步骤。
  • 相关特性:工具、资源。

总的来说,只要你需要让 Agent 与任何本地进程或远程服务进行安全、标准化的交互,就是使用 MCP 的最佳时机。