Back

如何通过MCP向大语言模型(LLM)公开您现有的API:全面指南

如何通过MCP向大语言模型(LLM)公开您现有的API:全面指南

将大语言模型(LLM)与您现有的API集成可能具有挑战性。传统上,您需要自定义连接器或特定平台的插件来使AI能够访问您的服务。**模型上下文协议(Model Context Protocol, MCP)**提供了一种更好的方式。

什么是模型上下文协议(MCP)?

MCP是Anthropic提出的开放标准(现已成为开源项目),它标准化了AI助手如何连接外部数据和工具。可以将MCP视为通用适配器——AI应用程序的”USB-C端口”。与其为每个模型或平台构建一次性集成,您可以通过MCP一次性公开您的API,任何支持MCP的LLM都可以使用它。

MCP的主要优势

  • 标准化:用单一、一致的协议替代分散的集成方式
  • 可重用性:将您的API连接器构建为MCP服务器,多个AI客户端可以利用它
  • 控制:MCP服务器在您的环境中运行,因此您可以强制执行安全措施并精确管理模型可以访问的内容

MCP充当LLM的通用插件系统,为AI提供了一种结构化的方式来调用函数或从外部源检索数据。

理解MCP基本元素

MCP使用三个主要概念来公开功能:

  1. 资源(Resources):这些类似于只读数据端点。资源由URI标识(例如,todo://list)并向模型提供数据。资源旨在将上下文加载到模型中(如获取文档、数据库记录或任务列表)。它们类似于GET请求,通常不会改变状态。
  2. 工具(Tools):这些是模型可以调用的操作——本质上是带有参数和返回值的函数,LLM可以调用它们。工具可以有副作用或执行计算。可以将工具视为”AI可以调用的函数”。
  3. 提示(Prompts):MCP允许定义可重用的对话模板或工作流。提示就像预定义的对话片段,服务器可以提供给客户端。

总结:资源加载数据给模型,工具执行操作提示引导交互

实现:分步指南

让我们逐步了解如何使用MCP向AI助手公开简单的REST API。

步骤1:设置简单的REST API示例

我们将使用基本的待办事项列表API作为示例。以下是使用Flask的最小实现:

from flask import Flask, request, jsonify

app = Flask(__name__)
tasks = [ {"id": 1, "title": "Sample Task", "done": False} ]

@app.route('/tasks', methods=['GET'])
def get_tasks():
    # Return the full list of tasks
    return jsonify(tasks)

@app.route('/tasks', methods=['POST'])
def create_task():
    # Add a new task from the JSON request body
    data = request.get_json()
    new_task = {
        "id": len(tasks) + 1,
        "title": data.get("title"),
        "done": False
    }
    tasks.append(new_task)
    return jsonify(new_task), 201

# Run with: flask run

这个API有两个端点:

  • GET /tasks - 检索所有任务
  • POST /tasks - 添加新任务

在实际场景中,这可以是任何具有数据库后端的现有API。

步骤2:创建MCP服务器来包装API

现在我们将创建一个Python MCP服务器,将我们的待办事项API公开给LLM:

首先,安装MCP包:

pip install "mcp[cli]"

然后创建一个名为todo_mcp_server.py的文件:

from mcp.server.fastmcp import FastMCP
import requests  # we'll use requests to call our REST API

# Initialize an MCP server with a descriptive name
mcp = FastMCP("To-Do API MCP Server")

# Define a Resource for reading tasks (like a GET endpoint)
@mcp.resource("todo://list")
def list_tasks() -> list:
    """Fetch all to-do tasks from the API."""
    response = requests.get("http://localhost:5000/tasks")
    response.raise_for_status()
    return response.json()  # return the list of tasks

# Define a Tool for adding a new task (like a POST operation)
@mcp.tool()
def add_task(title: str) -> dict:
    """Add a new task via the API and return the created task."""
    payload = {"title": title}
    response = requests.post("http://localhost:5000/tasks", json=payload)
    response.raise_for_status()
    return response.json()  # return the new task data

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

让我们分析一下发生了什么:

  • 我们创建了一个名为"To-Do API MCP Server"FastMCP实例,它设置服务器并注册我们的工具/资源。
  • 我们使用@mcp.resource("todo://list")来公开返回任务列表的资源。这对应于我们API的GET端点。
  • 我们使用@mcp.tool()来公开添加新任务的工具。这对应于我们API的POST端点。
  • 每个函数的文档字符串很重要 - 当LLM决定如何使用工具时,它会看到这些描述。
  • 我们使用mcp.run(transport="stdio")运行服务器,它使用标准I/O进行通信(适合本地开发)。

此时,我们有一个具有两种功能的MCP服务器:资源todo://list(获取任务)和工具add_task(创建任务)。这些对应于我们API的功能。实际上,我们已经用MCP包装了REST API。

步骤3:在本地运行和测试MCP服务器

在运行MCP服务器之前,确保您的Flask API正在运行(例如,使用flask run)。

现在以开发模式启动MCP服务器:

mcp dev ./todo_mcp_server.py

mcp dev命令在您的浏览器中启动交互式开发仪表板。该仪表板允许您:

  1. 查看您的MCP服务器名称和可用的工具/资源
  2. 测试todo://list资源 - 它应该返回当前任务列表
  3. 测试add_task工具 - 输入任务标题并执行
  4. 在历史记录面板中验证结果并查看日志

这个仪表板对于开发和调试非常宝贵。它使用的是与真实LLM客户端相同的MCP协议,但提供了用于测试的GUI界面。

步骤4:将MCP服务器连接到LLM客户端

现在让我们将我们的MCP服务器连接到实时的LLM。几个AI助手和工具支持MCP,包括:

与Claude桌面版连接

Anthropic的Claude桌面应用内置了对本地MCP服务器的支持。要集成:

mcp install ./todo_mcp_server.py

这会向Claude注册您的服务器。在Claude的界面中,您应该能看到您的”To-Do API MCP Server”可用。现在当您与Claude对话时,您可以:

  • 询问:“列出我的待办任务” - Claude将使用todo://list资源
  • 请求:“添加一个购买牛奶的待办事项” - Claude将使用add_task工具

当AI决定使用它时,Claude将处理运行MCP服务器和路由请求。

与Cursor IDE连接

Cursor是一个带有支持MCP的AI助手的代码编辑器。要连接:

  1. 在Cursor的设置中找到”Model Context Protocol”
  2. 通过提供todo_mcp_server.py的路径添加您的MCP服务器
  3. 指定传输方式(stdIo)

连接后,Cursor将检测您服务器的工具和资源。然后您可以向Cursor助手提问,如”我的待办事项列表中有哪些任务?“或”将’写博客文章’添加到我的任务中。“

关于LLM客户端的一般说明

具体连接步骤因客户端而异:

  • 对于Claude桌面版,使用mcp install或应用程序的UI
  • 对于Cursor,在设置中配置服务器
  • 其他环境可能有不同的方法

连接后,通过以鼓励工具使用的方式提示AI进行测试。许多MCP客户端会在AI使用工具时进行视觉指示。

安全说明:连接MCP服务器时,LLM将有权访问该服务器公开的所有内容。MCP服务器通常在本地或您的基础设施内运行,这对安全性有利。如果您的API需要身份验证,您可以在MCP服务器代码中包含这些凭据。

将MCP与传统方法进行比较

让我们比较使用MCP公开API与其他集成方法的区别:

直接LLM API调用(不使用MCP)

没有MCP,您可能会:

  • 使用特定平台的函数调用或插件(绑定到OpenAI或特定环境)
  • 在提示中嵌入API详情,这容易出错 - 模型可能会产生幻觉端点或发送不正确的格式

GraphQL或其他查询语言

使用GraphQL,您可以让LLM构建查询,但:

  • 模型仍需要了解架构和查询语法
  • 您可能需要自定义集成层来验证模型的查询

MCP的优势

使用MCP将这些细节抽象为标准化接口:

  • LLM不需要了解HTTP方法或查询语法
  • 它向MCP服务器查询可用的工具和资源,这些工具和资源具有人类可读的名称和描述
  • 该过程关注能力而非低级调用
  • 同一个MCP服务器适用于任何支持该协议的客户端

以下是详细比较:

方面 传统API集成 使用MCP集成 标准化 没有统一标准 - 每个平台都有自己的集成方法或插件格式 跨平台的一个开放标准 - 构建一次,随处使用 操作发现 LLM必须被告知哪些端点/查询可用,或者它们是硬编码的 LLM客户端可以以编程方式列出MCP服务器中可用的工具/资源 数据访问 API响应通常通过提示发送,达到上下文限制 MCP资源以管理方式直接将数据加载到LLM的上下文中 编码工作量 高 - 为每个模型自定义HTTP调用、解析和错误处理 简化 - MCP SDK处理协议细节;您只需编写Python函数 安全性和控制 如果不加限制,模型可能会生成任意HTTP调用 MCP服务器充当看门人 - 您决定确切公开什么 灵活性 难以适应新的LLM或用例 非常灵活 - 模型可以编排多个MCP调用;轻松添加新工具

简而言之,MCP在您的API之上提供了更加AI友好的层。模型不是处理原始HTTP调用,而是与在对话中有意义的命名操作和数据交互。

结论

通过MCP向LLM公开您现有的REST API可以大大简化集成。您不必为每个AI平台创建一次性连接,而是实现模型上下文协议一次,就能与任何支持的客户端兼容。

MCP提供了一种标准化、安全且灵活的方式来连接AI和您的数据。它将您的API转变为任何高级AI都可以负责任、智能地使用的模块化组件。这开启了新的可能性:您的LLM驱动的助手可以在同一个统一框架内将您的API与其他MCP连接器结合使用。

常见问题

是的。MCP非常灵活 - 只要您能编写代码访问它,就可以包装任何API或外部服务。无论您的API返回JSON、XML还是其他格式,您都可以在Python中处理它并返回Python数据类型(MCP将处理为LLM序列化它)。

LLM本身并不'会说'MCP - 而是模型加上MCP客户端的组合使这成为可能。截至2025年,Claude、Cursor、Zed、Replit等正在集成MCP客户端。如果您想在没有完整UI客户端的情况下编写LLM与MCP服务器之间的交互,还有一个官方Python客户端库。

它们解决类似的目标 - 让AI调用外部API - 但MCP是一个开放标准,适用于不同的AI系统。ChatGPT插件是OpenAI的ChatGPT界面专有的,GPT-4中的函数调用特定于OpenAI的API。一个MCP服务器可以为许多不同的模型/客户端提供服务。

MCP仍然相对较新但正在迅速成熟。在安全性方面:因为MCP允许AI执行代码或检索数据,所以应像对待API一样谨慎对待您的MCP服务器。只公开必要的内容。AI只能调用您定义的工具,不能调用其他工具。MCP的一个优势是您可以在防火墙内或本地运行服务器,减少暴露。

Python目前拥有最成熟的SDK,但MCP与语言无关。协议本身(通常使用JSON-RPC通过stdio或SSE)可以用任何语言实现。其他语言(包括C#和JavaScript)也有SDK和示例。

当然可以。MCP服务器可以公开多个工具和资源,即使它们与不同的系统相关。您可以创建一个具有待办事项API、天气API工具和本地数据库文件资源的单个MCP服务器。或者,您可以运行多个MCP服务器(每个服务一个)并将它们全部连接到客户端。