什么是MCP?MCP服务端代码实例初体验
MCP(模型上下文协议)是一种标准化AI模型与外部工具交互的通信协议,定义了工具、资源和提示三种核心元素。它支持多种通信模式:STDIO用于本地高效通信,SSE实现单向实时推送,Streamable HTTP提供双向流式交互。通过Python的fastmcp库可快速搭建MCP服务,使用装饰器定义功能模块,并集成到Cherry Studio等开发工具中调用。该协议简化了AI系统与外部服务的集成,适用
求职中:luozirong7@163.com
MCP 技术深度解析:从概念到实践
什么是 MCP?
MCP (Model Context Protocol),也被称为模型上下文协议,是一种专为AI模型和工具交互而设计的通信协议。它的核心思想是提供一种标准化的机制,让 AI 客户端(如 LLM)能够以统一的方式调用外部工具和服务。
MCP 协议通过定义清晰的工具(Tool)、资源(Resource) 和提示(Prompt) 三种核心元素,将外部能力进行抽象和封装。开发者可以通过简单的装饰器(Decorator)来暴露服务的功能,而无需关心底层的通信细节。这极大地简化了 AI 代理和外部服务之间的集成过程,使 AI 能够更智能地调用外部功能。
MCP 的通信模式:STDIO、SSE 和 Streamable HTTP
MCP 提供了多种通信模式,以适应不同的应用场景。
STDIO (Standard Input/Output)
STDIO 是一种基于标准输入/输出流的通信模式。它主要用于本地进程间通信。
- 工作原理:当一个 MCP 客户端(如 Cherry Studio)需要调用一个 STDIO 模式的 MCP 服务器时,它会在本地将服务器程序作为一个子进程启动。客户端通过服务器的标准输入流(
stdin
)发送请求,并通过标准输出流(stdout
)接收响应。 - 适用场景:这种模式非常适合本地开发、调试和命令行工具。它的优点是低延迟、高效率,因为没有网络栈的开销。但缺点是它只能在同一台机器上工作,且通常是一对一的客户端-服务器关系。
SSE (Server-Sent Events)
SSE 是一种基于 HTTP 的通信模式,允许服务器向客户端单向推送数据。
- 工作原理:SSE 模式下,MCP 服务器会启动一个 Web 服务。客户端通过一个 HTTP GET 请求与服务器建立一个长连接。服务器可以利用这个连接持续地向客户端发送事件流,而客户端则不需要不断地发起请求。客户端也可以通过一个独立的 HTTP POST 请求向服务器发送消息。
- 适用场景:SSE 非常适合需要实时数据更新的场景,比如实时日志、进度更新或通知。它可以在网络上工作,支持多个客户端连接,但它的通信是单向的,如果要实现双向通信需要额外的机制。
Streamable HTTP
Streamable HTTP
是 MCP 中一种现代且灵活的通信模式,它结合了 HTTP 的请求-响应机制和流式传输的能力。
- 工作原理:它利用 HTTP POST 请求发送数据,并利用 HTTP 的流式传输特性,允许服务器在响应中持续地向客户端发送数据流。这实现了双向的流式通信,比 SSE 更加强大和灵活。
- 适用场景:
Streamable HTTP
是目前官方推荐的远程通信标准,适用于需要更灵活、双向实时交互的分布式系统。它可以支持复杂的实时交互,并可以更好地利用 HTTP 生态中的各种技术。
如何搭建一个简易的 MCP(Python)
接下来,通过 Python 搭建一个简单的 MCP 服务。这个例子将展示如何定义工具、资源和提示。
首先,确保你已经安装了 fastmcp
库。
pip install fastmcp
现在,我们创建一个 Python 文件,比如 mcp_server.py
,并将以下代码粘贴进去。为了方便本地测试,我们将 host
设置为本地地址。
from mcp.server.fastmcp import FastMCP
# 创建一个 MCP 服务器实例
# host 127.0.0.1 方便本地测试
mcp = FastMCP(name="Demo", host="127.0.0.1")
# 添加一个加法工具 (Tool)
@mcp.tool()
def add(a: int, b: int) -> int:
"""Add two numbers"""
return a + b
# 添加一个动态问候资源 (Resource)
@mcp.resource("greeting://{name}")
def get_greeting(name: str) -> str:
"""Get a personalized greeting"""
return f"Hello, {name}!"
# 添加一个提示 (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="sse")
如何通过 Cherry Studio 调用自己的 MCP
Cherry Studio 是一个强大的开发工具,能够方便地发现和调用 MCP 服务。一旦你的 MCP 服务运行起来,你就可以将其注册到 Cherry Studio 中。
首先,让我们启动你刚刚编写的 MCP 服务。
uv run mcp_server.py
或者:Python mcp_server.py
执行后,你应该会看到服务器启动的日志,它会提示你服务运行在 http://127.0.0.1:8000/sse
地址上。
接下来,打开 Cherry Studio。在工具的配置界面中,你需要添加你的 MCP 服务器。
- 在 Cherry Studio 中找到 MCP 服务器配置页面:这通常在设置或连接管理部分。
- 添加新的 MCP 服务器:点击“添加”按钮,输入你的服务器信息。
- 名称:自定义,比如 “我的 MCP 服务”。
- 类型:选择
sse
。 - 基地址:输入服务器地址
http://127.0.0.1:8000/sse
。
{
"mcpServers": {
"UKC-5sC_3f_G6IQ-Ev4EY": {
"isActive": true,
"name": "MCP 服务器",
"type": "sse",
"description": "",
"baseUrl": "http://192.168.10.230:8000/sse"
}
}
}
执行效果如下:
更多推荐
所有评论(0)