MCP入门教程2 -- 一个最精简的代码实例
MCP 服务器和 Web 服务器的主要区别在于它们的协议设计目标和目标用户:Web 服务器主要为人类用户和传统应用程序设计MCP 服务器专门为 AI 模型和智能体设计,提供更适合 AI 交互的协议和语义选择哪种方式取决于你的使用场景:如果需要为 AI 助手提供扩展功能,MCP 是更合适的选择;如果需要构建传统的 Web API,则应使用 Web 服务器。
下面是一个最精简的 MCP (Model Context Protocol) 示例,包含一个加法服务器和一个客户端。
1. MCP 服务器 (加法服务)
首先创建 mcp_server.py
:
python
#!/usr/bin/env python3
import asyncio
import json
from mcp.server import Server
from mcp.server.stdio import stdio_server
# 创建服务器实例
server = Server("math-server")
# 注册加法工具
@server.tool()
async def add(a: float, b: float) -> str:
"""将两个数字相加"""
result = a + b
return f"{a} + {b} = {result}"
async def main():
# 使用标准输入输出运行服务器
async with stdio_server() as (read_stream, write_stream):
await server.run(read_stream, write_stream)
if __name__ == "__main__":
asyncio.run(main())
2. MCP 客户端
创建 mcp_client.py
:
python
#!/usr/bin/env python3
import asyncio
import json
from mcp.client import ClientSession
from mcp.client.stdio import stdio_client
async def main():
# 连接到标准输入输出的服务器
async with stdio_client() as (read, write):
# 创建会话
session = ClientSession(read, write)
# 初始化连接
await session.initialize()
# 列出可用工具
tools = await session.list_tools()
print("可用工具:", [t.name for t in tools.tools])
# 调用加法工具
result = await session.call_tool(
"add",
arguments={"a": 5, "b": 3.5}
)
print("加法结果:", result.content[0].text)
# 结束会话
await session.close()
if __name__ == "__main__":
asyncio.run(main())
3. 运行示例
-
首先安装必要的依赖:
bash
pip install mcp
-
在一个终端中运行服务器:
bash
python mcp_server.py
-
在另一个终端中运行客户端:
bash
python mcp_client.py
4. 公网发布说明
要将此服务发布到公网,你需要:
-
修改服务器使用网络接口而不是标准IO:
python
# 替代 stdio_server,使用网络服务器
from mcp.server.socket import socket_server
async def main():
# 在本地主机的8000端口上运行
async with socket_server("localhost", 8000) as streams:
await server.run(streams[0], streams[1])
-
使用反向代理(如 Nginx)和 SSL 证书确保安全连接
-
配置适当的身份验证机制
MCP 服务器与 Web 服务器的区别
是的,MCP(Model Context Protocol)客户端访问 MCP 服务器与浏览器访问 Web 服务器有几个关键区别:
1. 协议和通信模式不同
Web 服务器 (HTTP/HTTPS):
-
使用请求-响应模式
-
基于无状态的 HTTP 协议
-
通常使用 RESTful API 或 GraphQL
MCP 服务器:
-
使用双向通信(类似于 JSON-RPC 2.0)
-
支持服务器主动推送更新
-
专门为 AI/LLM 上下文扩展设计
2. 交互模式不同
浏览器访问 Web 服务器:
javascript
// 典型的前端调用方式
fetch('https://api.example.com/add', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({a: 5, b: 3})
})
.then(response => response.json())
.then(data => console.log(data));
MCP 客户端访问 MCP 服务器:
python
# MCP 调用方式(更接近自然语言交互)
result = await session.call_tool(
"add",
arguments={"a": 5, "b": 3}
)
3. 身份验证和会话管理
Web 服务器:
-
通常使用 cookies、JWT 或 OAuth
-
会话状态由客户端或服务器维护
MCP 服务器:
-
使用更简单的身份验证机制
-
设计用于短期、任务特定的会话
4. 数据格式和语义
Web 服务器:
-
返回结构化数据(JSON、XML 等)
-
客户端需要理解 API 规范
MCP 服务器:
-
返回富文本内容(可能包含标记)
-
专为 AI 模型消费设计
5. 部署和扩展考虑
Web 服务器公网部署:
nginx
# 典型的 Nginx 配置
server {
listen 443 ssl;
server_name api.example.com;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
}
}
MCP 服务器公网部署:
nginx
# MCP 通常使用 WebSocket 或 SSE
server {
listen 443 ssl;
server_name mcp.example.com;
location /mcp/ {
proxy_pass http://localhost:8000;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
}
}
6. 实际应用场景
Web 服务器适合:
-
人类用户直接交互的应用程序
-
需要广泛客户端兼容性的服务
-
传统的 Web 和移动应用后端
MCP 服务器适合:
-
AI 助手和大型语言模型的扩展
-
需要动态上下文感知的服务
-
专门为 AI 交互设计的工具
示例:MCP 服务器公网部署
以下是修改后的支持公网访问的 MCP 服务器示例:
python
#!/usr/bin/env python3
import asyncio
import json
from mcp.server import Server
from mcp.server.socket import socket_server
# 创建服务器实例
server = Server("math-server")
# 注册加法工具
@server.tool()
async def add(a: float, b: float) -> str:
"""将两个数字相加"""
result = a + b
return f"{a} + {b} = {result}"
async def main():
# 在指定端口上运行服务器(允许外部连接)
host = "0.0.0.0" # 允许所有外部连接
port = 8000
print(f"启动 MCP 服务器在 {host}:{port}")
async with socket_server(host, port) as streams:
await server.run(streams[0], streams[1])
if __name__ == "__main__":
asyncio.run(main())
对应的客户端需要修改为网络连接:
python
#!/usr/bin/env python3
import asyncio
from mcp.client import ClientSession
from mcp.client.socket import socket_client
async def main():
# 连接到远程 MCP 服务器
host = "mcp.example.com" # 你的服务器域名或 IP
port = 8000
async with socket_client(host, port) as (read, write):
session = ClientSession(read, write)
# 初始化连接
await session.initialize()
# 调用加法工具
result = await session.call_tool(
"add",
arguments={"a": 5, "b": 3.5}
)
print("远程加法结果:", result.content[0].text)
await session.close()
if __name__ == "__main__":
asyncio.run(main())
总结
MCP 服务器和 Web 服务器的主要区别在于它们的协议设计目标和目标用户:
-
Web 服务器主要为人类用户和传统应用程序设计
-
MCP 服务器专门为 AI 模型和智能体设计,提供更适合 AI 交互的协议和语义
选择哪种方式取决于你的使用场景:如果需要为 AI 助手提供扩展功能,MCP 是更合适的选择;如果需要构建传统的 Web API,则应使用 Web 服务器。
更多推荐
所有评论(0)