1. 定义

🔌 MCP(模型上下文协议)深度解析

MCP(Model Context Protocol)是由 Anthropic 于 2024 年 11 月推出的开放标准协议,旨在为大型语言模型(LLM)与外部工具/数据源提供统一的交互框架,被类比为“AI 领域的 USB-C 接口”。

🔧 一、核心设计目标
  1. 解决数据孤岛与协议碎片化

    • 传统痛点:LLM 需为每个数据源(数据库、API、文件系统)单独开发适配层,导致集成成本高、维护复杂。
    • MCP 方案:通过标准化协议统一交互接口,实现“即插即用”的资源调用,减少重复开发。
  2. 支持动态双向交互

    • 区别于传统 API 的单次请求响应,MCP 支持持久化双向通信(类似 WebSockets),允许 AI 主动触发工具调用并实时获取数据流。

⚙️ 二、技术架构与核心组件

MCP 采用客户端-服务器架构,包含三层角色:

  1. MCP 主机(Host)

    • 运行 AI 应用的执行环境(如 Claude Desktop、VS Code),负责收集用户上下文(如代码结构、光标位置)并管理交互状态。
  2. MCP 客户端(Client)

    • 作为 Host 与 Server 的“翻译官”,将自然语言指令转化为标准化请求,并处理能力交换(Capability Exchange)。
  3. MCP 服务器(Server)

    • 轻量级程序,通过三类接口暴露功能:
      • 工具(Tools):封装可执行函数(如发送邮件、执行 SQL 查询)。
      • 资源(Resources):提供结构化数据访问(如数据库记录、本地文件)。
      • 提示模板(Prompts):预定义工作流模板(如代码生成模板),确保输出一致性。

动态能力交换机制:客户端启动时自动获取服务器能力描述,新增功能无需修改客户端代码(如天气服务新增温度单位参数)。


🔄 三、工作流程(以查询数据库为例)
  1. 发现与握手:主机启动时连接 MCP 服务器,验证身份并交换能力列表。
  2. 任务解析:用户输入“查询上周销售数据”,LLM 判断需调用数据库工具。
  3. 执行与返回
    • 客户端将指令转为 SQL 请求 → 服务器执行查询 → 返回格式化结果 → LLM 生成图表并邮件发送。
  4. 上下文保持:支持跨步骤任务(如“先查数据再生成报告”),避免传统 RAG 的单次检索局限。

2. 上手

2.1 使用别人的 MCP 工具

  1. 创建百度地图 mcp 调用应用

  1. 接入客户端,这里选择 cherry-studio


3. 开始使用,需要注意的是,cherry-studio 强制需要具备 fuction-call 的 model 才能调用 mcp 功能

2.2 如何开发自己的 MCP server

2.2.1 使用 sdk 开发

modelcontextprotocol

首先要下载 sdk

2.2.2 编写案例 [https://github.com/modelcontextprotocol/python-sdk](https://github.com/modelcontextprotocol/python-sdk)

2.2.2.1 标准化流程 6️⃣
1. 创建 uv 项目,建议通过 uv 来做
# 创建项目
uv init xxx
  1. 修改.toml 源
# 换源
[tool.uv]
index-url = "https://mirrors.tuna.tsinghua.edu.cn/pypi/web/simple"
  1. Then add MCP to your project dependencies:
uv add "mcp[cli]"
  1. 编写主代码逻辑-- demo
"""
FastMCP quickstart example.

cd to the `examples/snippets/clients` directory and run:
    uv run server fastmcp_quickstart stdio
"""

from mcp.server.fastmcp import FastMCP

# Create an MCP server
mcp = FastMCP("Demo")


# Add an addition tool
@mcp.tool()
def add(a: int, b: int) -> int:
    """Add two numbers"""
    return a + b


# Add a dynamic greeting resource
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
    """Get a personalized greeting"""
    return f"Hello, {name}!"


# Add a prompt
@mcp.prompt()
def greet_user(name: str, style: str = "friendly") -> str:
    """Generate a greeting prompt"""
    styles = {
        "friendly": "Please write a warm, friendly greeting",
        "formal": "Please write a formal, professional greeting",
        "casual": "Please write a casual, relaxed greeting",
    }

    return f"{styles.get(style, styles['friendly'])} for someone named {name}."

if __name__ == "__main__":
    mcp.run(transport='stdio')

2.2.3 运行测试 [studio 协议 ]

2.2.3.1 使用代码运行:
```python uv run xxx.py ```
2.2.3.2 链接到 cherry-studio 客户端

--directory
/Volumes/momo/Code/MCP-learning # 路径文件夹
run # 执行command
main.py # 执行逻辑主文件

2.2.3.3 移动到 vscode 等
通过 cherry-studio 来导出本地 mcp 服务的 json 文件


2.2.4 SSE 协议

开发端口远程调用,
if __name__ == "__main__":
    # mcp.run(transport='stdio')
    # 切换为sse模式
    mcp.run(transport='sse')

复制监听地址传入到 cherry-studio 中


2.2.5 发布本地服务到公网

2.2.5.1 方法一:上传 python 代码,打包后传到 pypi 上

  1. 创建文件包环境

  1. 添加 mcp 依赖

  1. 替换逻辑到 init.py

协议选择 stdio

  1. 打包
uv build

  1. 注册 pypi 获取 apitonken

  2. 推送
uv publish --token xxxxxxxxxxxxxxxxxx

  1. 使用客户端链接 pypi 上的 mcp 服务包(uvx)

记得是 uvx

就可以使用发布到 pypi 上的托管 mcp 了,同时还可以按照之前的操作导出来 json 文件,给你的朋友们使用。

2.2.5.2 方法二:将服务部署到远程服务器开启公网访问服务
找到一台 linux 服务器,安装 uv 环境,使用 FTP 移动代码包到远程 linux 上,将主代码逻辑协议 stdio 改为 sse

# 配置虚拟环境
uv venv
# 安装依赖
uv pip install . 
# 启动主逻辑文件
uv run main.py

一旦启动成功,就可以使用客户端来链接,配置如下

2.2.6 注意点

在编写mcp代码主要逻辑时 类型修饰符一定要写 函数注释一定要写
Logo

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

更多推荐