01-MCP协议入门指南

概述

Model Context Protocol (MCP) 是一个开放的协议标准,用于在大语言模型(LLM)和外部工具之间建立标准化的通信机制。本文将介绍 MCP 协议的基本概念、核心组件、应用场景以及如何在实际项目中使用 MCP。

MCP协议简介

MCP 是由 Anthropic 推出的开源协议,旨在解决 LLM 与外部工具集成的标准化问题。通过 MCP,开发者可以:

  • 定义统一的工具接口规范
  • 实现跨平台的工具调用机制
  • 构建可扩展的 AI 应用架构

核心优势

  • 标准化接口: 统一的协议定义,降低集成复杂度
  • 语言无关: 支持多种编程语言实现
  • 传输灵活: 支持 stdio、HTTP 等多种传输方式
  • 易于扩展: 支持自定义工具、资源和提示模板

MCP的核心组件

MCP 协议定义了四个核心组件,每个组件都有明确的职责和接口规范。

1. Prompts (提示模板)

Prompts 是可重用的提示模板,用于定义 AI 助手的行为模式和响应风格。

作用:

  • 定义系统角色的行为准则
  • 提供标准化的对话模板
  • 支持动态参数注入

示例场景:

  • 数学问题求解提示: 引导 AI 逐步解决数学问题
  • 代码审查提示: 定义代码检查的标准流程
  • 文档生成提示: 规范文档结构和格式

2. Resources (资源)

Resources 是静态或动态的数据源,通过 URI(统一资源标识符)进行访问。

特性:

  • 支持模板 URI(如 greeting://{name})
  • 可返回文本、JSON 等多种格式
  • 支持动态数据生成

示例场景:

  • 配置文件读取: config://app
  • 个性化问候: greeting://{username}
  • 常量数据: constant://pi

3. Tools (工具)

Tools 是可执行的函数,供 AI 助手调用以完成特定任务。

特点:

  • 明确的参数类型定义
  • 标准化的返回格式
  • 支持错误处理机制

示例场景:

  • 数学运算: 加减乘除、幂运算、平方根
  • 数据查询: 数据库检索、API 调用
  • 文件操作: 读写文件、目录遍历

4. Transport (传输层)

Transport 定义了客户端和服务器之间的通信机制。

支持的传输方式:

传输方式 适用场景 优势 局限
stdio 本地开发、测试 低延迟、简单易用 不支持远程访问
HTTP 生产环境、分布式部署 支持跨机器访问 需要网络配置

MCP协议工作原理

通信流程

MCP 采用客户端-服务器架构,通信流程如下:

客户端                          服务器
  │                              │
  ├────── initialize() ──────────>│
  │<───── capabilities ──────────┤
  │                              │
  ├────── list_prompts() ───────>│
  │<───── prompts list ──────────┤
  │                              │
  ├────── list_resources() ──────>│
  │<───── resources list ─────────┤
  │                              │
  ├────── list_tools() ──────────>│
  │<───── tools list ────────────┤
  │                              │
  ├────── get_prompt() ──────────>│
  │<───── prompt content ─────────┤
  │                              │
  ├────── read_resource() ───────>│
  │<───── resource content ───────┤
  │                              │
  ├────── call_tool() ────────────>│
  │<───── tool result ────────────┤

消息格式

MCP 使用 JSON-RPC 格式进行消息交换:

{
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "name": "add",
    "arguments": {
      "a": 10,
      "b": 20
    }
  },
  "id": 1
}

实战案例:数学计算 MCP 服务器

项目结构

mcp_demo/
├── math_mcp_server_stdio.py      # Stdio 模式服务器
├── math_mcp_server_http.py       # HTTP 模式服务器
├── math_mcp_client_stdio.py      # Stdio 模式客户端
├── math_mcp_client_http.py       # HTTP 模式客户端
└── pyproject.toml                # 项目配置

安装依赖

使用 uv(推荐)或 pip 安装依赖:

# 使用 uv
uv sync

# 或使用 pip
pip install fastmcp mcp

服务器代码示例

以下是一个简单的数学计算 MCP 服务器实现:

from mcp.server.fastmcp import FastMCP
import math

# 创建 MCP 服务器实例
mcp = FastMCP("Math")

# 定义工具
@mcp.tool()
def add(a: int, b: int) -> str:
    """加法运算"""
    result = a + b
    return f"{a} + {b} = {result}"

@mcp.tool()
def multiply(a: int, b: int) -> str:
    """乘法运算"""
    result = a * b
    return f"{a} * {b} = {result}"

# 定义资源
@mcp.resource("constant://pi")
def get_pi() -> str:
    """圆周率常数"""
    return f"{math.pi}"

# 定义提示模板
@mcp.prompt()
def system_prompt() -> str:
    """系统提示模板"""
    return """
You are an AI assistant specialized in mathematical calculations.
- Use the available tools when needed
- Show step-by-step solutions
- Provide clear answers
"""

if __name__ == "__main__":
    mcp.run()  # 默认使用 stdio 传输

客户端代码示例

import asyncio
from mcp.client.stdio import stdio_client
from mcp import ClientSession, StdioServerParameters

async def main():
    # 配置服务器参数
    server_params = StdioServerParameters(
        command="python",
        args=["math_mcp_server_stdio.py"]
    )

    # 连接到服务器
    async with stdio_client(server_params) as (read, write):
        async with ClientSession(read, write) as session:
            # 初始化会话
            await session.initialize()

            # 列出可用工具
            tools = await session.list_tools()
            print(f"可用工具: {[tool.name for tool in tools.tools]}")

            # 调用工具
            result = await session.call_tool("add", {"a": 10, "b": 20})
            print(f"计算结果: {result.content[0].text}")

if __name__ == "__main__":
    asyncio.run(main())

运行步骤

  1. 启动服务器:
python math_mcp_server_stdio.py
  1. 在另一个终端启动客户端:
python math_mcp_client_stdio.py
  1. 观察输出:
可用工具: ['add', 'multiply']
计算结果: 10 + 20 = 30

MCP的应用场景

1. 数据分析助手

通过 MCP 集成数据分析工具:

  • Tools: Pandas 数据处理、SQL 查询、统计计算
  • Resources: 数据集元数据、分析报告模板
  • Prompts: 数据分析标准流程、可视化指导

2. 开发辅助工具

构建智能开发助手:

  • Tools: 代码执行、测试运行、依赖分析
  • Resources: 项目文档、代码规范
  • Prompts: 代码审查标准、重构指导

3. 运维自动化

实现自动化运维系统:

  • Tools: 服务器监控、日志分析、故障诊断
  • Resources: 系统配置、运维手册
  • Prompts: 故障处理流程、最佳实践

4. 企业知识库

构建企业级知识管理系统:

  • Tools: 文档检索、内容生成、知识推荐
  • Resources: 企业文档、培训材料
  • Prompts: 问答模板、写作规范

MCP生态与工具

框架和库

  1. FastMCP: Python MCP 服务器框架

    • 快速构建 MCP 服务器
    • 简化的 API 设计
    • 自动类型推断
  2. MCP SDK: 官方 Python SDK

    • 完整的协议实现
    • 客户端和服务器支持
    • 多传输方式
  3. LangChain MCP Adapters: LangChain 集成适配器

    • 与 LangChain 无缝集成
    • 支持工具调用
    • 状态管理

相关技术

  • LangChain: LLM 应用框架
  • LangGraph: 状态机工作流引擎
  • OpenAI API: 大语言模型服务

常见问题

Q1: MCP 和 LangChain Tools 有什么区别?

MCP 是传输层协议,定义了标准化的通信接口;LangChain Tools 是应用层的工具抽象。MCP 可以与 LangChain 集成,提供标准化的工具调用机制。

Q2: 如何选择传输方式?

  • 本地开发: 使用 stdio,简单快速
  • 生产部署: 使用 HTTP,支持远程访问
  • 混合场景: 可以同时使用两种方式

Q3: MCP 支持哪些编程语言?

MCP 协议本身是语言无关的,目前已有 Python、TypeScript、Go 等语言的实现。

Q4: 如何调试 MCP 应用?

  1. 使用日志记录通信消息
  2. 检查 JSON-RPC 消息格式
  3. 验证工具参数类型
  4. 测试不同传输方式

学习路线图

建议按照以下顺序学习 MCP:

  1. 入门阶段 (本篇)

    • 理解 MCP 基本概念
    • 学习核心组件
    • 运行示例代码
  2. 实践阶段 (下一篇)

    • 构建 MCP 服务器
    • 开发 MCP 客户端
    • 实现自定义工具
  3. 进阶阶段 (后续文章)

    • LLM 集成
    • 多服务器架构
    • 最佳实践

阅读顺序建议

  1. 01-MCP协议入门指南: 了解 MCP 基本概念和核心组件
  2. 02-快速构建MCP服务器: 使用 FastMCP 构建服务器
  3. 03-MCP客户端开发实战: 开发 stdio 和 HTTP 客户端
  4. 04-LLM与MCP集成实践: 集成到 LangGraph 构建智能代理
  5. 05-多服务器架构与最佳实践: 多服务器架构和生产部署

总结

MCP 协议为 LLM 与外部工具的集成提供了标准化的解决方案。通过定义清晰的组件和接口,MCP 大大降低了 AI 应用的开发复杂度,提高了可维护性和可扩展性。

在下一篇《02-快速构建MCP服务器》中,我们将详细介绍如何使用 FastMCP 框架构建完整的 MCP 服务器,包括工具、资源和提示模板的实现。

参考资源

文章标签

MCP协议, Model Context Protocol, AI应用开发, LLM集成, Python开发, 工具调用, 标准化协议, 开源协议
Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐