如何通过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使用三个主要概念来公开功能:
- 资源(Resources):这些类似于只读数据端点。资源由URI标识(例如,
todo://list
)并向模型提供数据。资源旨在将上下文加载到模型中(如获取文档、数据库记录或任务列表)。它们类似于GET请求,通常不会改变状态。 - 工具(Tools):这些是模型可以调用的操作——本质上是带有参数和返回值的函数,LLM可以调用它们。工具可以有副作用或执行计算。可以将工具视为”AI可以调用的函数”。
- 提示(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
命令在您的浏览器中启动交互式开发仪表板。该仪表板允许您:
- 查看您的MCP服务器名称和可用的工具/资源
- 测试
todo://list
资源 - 它应该返回当前任务列表 - 测试
add_task
工具 - 输入任务标题并执行 - 在历史记录面板中验证结果并查看日志
这个仪表板对于开发和调试非常宝贵。它使用的是与真实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助手的代码编辑器。要连接:
- 在Cursor的设置中找到”Model Context Protocol”
- 通过提供
todo_mcp_server.py
的路径添加您的MCP服务器 - 指定传输方式(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服务器(每个服务一个)并将它们全部连接到客户端。