MCP

MCP服务构建、使用

MCP 服务简介

MCP(Model Context Protocol,模型上下文协议)是一个开放协议,用于标准化 AI 应用程序(如大语言模型 LLM)如何与外部数据源、工具和服务进行交互。它类似于 AI 领域的“USB-C 接口”,允许客户端(如 Claude Desktop、VS Code 或自定义 AI 工具)通过统一方式连接到各种 MCP 服务器,实现工具调用、资源访问和提示注入等功能。MCP 采用客户端-服务器架构,支持 JSON-RPC 2.0 通信,通常通过 stdio(标准输入输出)或网络方式实现。

MCP 服务(MCP Server)是核心组件,它暴露工具(Tools)、资源(Resources)和提示(Prompts),供客户端调用。构建 MCP 服务可以帮助 AI 模型访问本地文件、网络数据、API 等外部资源,而无需碎片化集成。

下面,我将基于常见开源实践和官方文档,逐步说明 MCP 服务的构建使用。示例主要使用 Python(最流行语言),并参考 Spring AI(Java 集成)。如果您使用其他语言(如 C#、TypeScript),可以参考 Microsoft Learn 或官方 SDK。

MCP 服务构建步骤

构建 MCP 服务通常涉及环境准备、代码编写、测试和部署。以下是保姆级教程,假设您使用 Python 环境(推荐 uv 或 pip 管理依赖)。

1. 环境准备

  • 安装依赖管理工具:推荐使用 uv(更快、更现代)。在终端运行:
  curl -LsSf https://astral.sh/uv/install.sh | sh  # macOS/Linux
  # Windows: 使用 PowerShell 执行 irm https://astral.sh/uv/install.ps1 | iex
  • 初始化项目
  uv init mcp-server  # 创建项目目录
  cd mcp-server
  uv venv  # 创建虚拟环境
  source .venv/bin/activate  # 激活(Windows: .venv\Scripts\activate)
  uv add "mcp[cli]" httpx aiohttp asyncio  # 添加核心 MCP SDK 和常用库(如 httpx 用于 API 调用)
  • 创建服务器文件:新建 server.py 文件。

2. 编写 MCP 服务器代码

MCP 服务器核心是定义工具(Tools)。以下是一个简单示例:构建一个“天气查询”MCP 服务,使用美国国家气象局 API 获取天气数据。

server.py 中写入以下代码(基于 FastMCP 类,自动生成工具定义):

from typing import Any
import httpx
from mcp.server.fastmcp import FastMCP

# 初始化 MCP 服务器
mcp = FastMCP("weather-app")  # 服务器名称

# 常量
NWS_API_BASE = "https://api.weather.gov"
USER_AGENT = "weather-app/1.0"

# 定义工具:获取指定位置的天气警报
@mcp.tool()
def get_weather_alerts(latitude: float, longitude: float) -> str:
    """获取指定经纬度的天气警报。

    Args:
        latitude: 纬度
        longitude: 经度

    Returns:
        天气警报描述
    """
    url = f"{NWS_API_BASE}/alerts/active?point={latitude},{longitude}"
    headers = {"User-Agent": USER_AGENT}
    response = httpx.get(url, headers=headers)
    if response.status_code == 200:
        data = response.json()
        alerts = data.get("features", [])
        if alerts:
            return alerts[0]["properties"]["headline"]
        return "无活跃警报"
    return "查询失败"

# 运行服务器(stdio 模式,本地进程通信)
if __name__ == "__main__":
    mcp.run(transport="stdio")  # 或 "sse" 用于网络传输
  • 解释
  • @mcp.tool() 装饰器使用 Python 类型提示和 docstring 自动生成工具 schema(JSON 定义),供客户端发现和调用。
  • 支持三种功能:Tools(可调用函数)、Resources(静态数据,如文件内容)、Prompts(预设提示模板)。
  • 对于更复杂场景(如股票查询),可以集成 yfinance 库添加另一个工具。

3. 构建和打包

  • 运行测试
  uv run python server.py

这会启动 stdio 服务器,等待客户端连接。

  • 打包发布(可选):
  • 对于 Python:使用 setup.py 打包为 wheel,或直接分享脚本。
  • 对于 Java(Spring AI 集成):克隆示例仓库 git clone https://github.com/yuyuanweb/mcp-mianshiya-server,然后 mvn clean package 构建 JAR 包。
  • 对于 NuGet(.NET):参考 Microsoft Learn,使用 C# SDK 创建最小服务器并发布。

4. 测试 MCP 服务器

  • 使用官方 Inspector 工具(调试界面):
  • 安装:pip install mcp[cli] 或从 GitHub 下载。
  • 运行:mcp-inspector --server server.py(连接您的服务器,测试工具调用)。
  • 预期输出:工具列表显示 get_weather_alerts,调用后返回天气数据。

常见扩展

  • 集成大模型:如 DeepSeek、Ollama 或 vLLM。示例代码:
  from mcp.client.stdio import stdio_client
  from mcp import ClientSession, StdioServerParameters
  import asyncio
  # ... (初始化 OpenAI 或其他模型)
  async def process_query(query: str) -> str:
      # 使用 LLM 识别工具调用
      messages = [{"role": "user", "content": query}]
      # 调用 MCP 工具
      # ...
  • 自定义工具示例
  • 文件读取:@mcp.tool() def read_file(path: str) -> str: return open(path).read()
  • 搜索:集成 DuckDuckGo API 实现网络搜索。

MCP 服务使用步骤

一旦构建好 MCP 服务,您需要一个 MCP 客户端来连接和调用它。客户端可以是现成工具(如 Claude、Cline)或自定义。

1. 使用现成客户端

  • Claude Desktop 或 Cline(推荐新手):
  • 将服务器添加到客户端:复制 server.py 到客户端目录,或配置路径。
  • 示例:在 Cline 中运行 python server.py,然后查询“北京的天气如何?”——客户端会自动调用工具。
  • VS Code 或 GitHub Copilot
  • 启用 MCP 扩展,添加服务器路径。测试:输入“生成随机数”,服务器响应。
  • Cherry Studio(AI 客户端)
  • 克隆示例仓库,运行 JAR 包,连接 MCP 服务进行面试模拟。

2. 自定义客户端使用

  • Python 示例(连接服务器并调用工具):
  import asyncio
  from mcp.client.stdio import stdio_client
  from mcp import ClientSession, StdioServerParameters

  server_params = StdioServerParameters(
      command="uv",  # 或 "python"
      args=["run", "server.py"]
  )

  async def main():
      async with stdio_client(server_params) as (stdio, write):
          async with ClientSession(stdio, write) as session:
              await session.initialize()
              # 列出工具
              tools = await session.list_tools()
              print(tools)
              # 调用工具
              result = await session.call_tool("get_weather_alerts", {"latitude": 39.9, "longitude": 116.4})
              print(result)

  asyncio.run(main())
  • 集成到 AI 对话:使用 OpenAI API 的 function calling,让 LLM 自动决定何时调用 MCP 工具。

3. 部署和安全

  • 本地运行:stdio 模式,适合开发。
  • 远程部署:使用 SSE(Server-Sent Events)传输,部署到云服务器。
  • 安全提示:使用环境变量存储 API 密钥(如 .env 文件),避免硬编码。MCP 支持权限控制,只暴露必要工具。

常见问题与资源

  • 调试:如果工具未调用,检查 VS Code 工具列表或日志。确保版本兼容(MCP 1.0+)。
  • 性能:stdio 适合本地,网络模式用于分布式。
  • 进一步学习
  • 官方文档:https://modelcontextprotocol.io/ (英文),中文站:https://mcpcn.com/docs
  • GitHub 示例:https://github.com/liaokongVFX/MCP-Chinese-Getting-Started-Guide
  • Java 教程:https://www.cnblogs.com/yupi/p/18814281
  • .NET 快速入门:https://learn.microsoft.com/zh-cn/dotnet/ai/quickstarts/build-mcp-server

通过以上步骤,您可以快速构建一个功能性的 MCP 服务,并集成到 AI 工作流中。如果需要特定语言或工具的更多细节,请提供更多上下文!

分类: MCP
文章已创建 2965

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

相关文章

开始在上面输入您的搜索词,然后按回车进行搜索。按ESC取消。

返回顶部