下面是一个最精简的 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. 运行示例

  1. 首先安装必要的依赖:

bash

pip install mcp
  1. 在一个终端中运行服务器:

bash

python mcp_server.py
  1. 在另一个终端中运行客户端:

bash

python mcp_client.py

4. 公网发布说明

要将此服务发布到公网,你需要:

  1. 修改服务器使用网络接口而不是标准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])
  1. 使用反向代理(如 Nginx)和 SSL 证书确保安全连接

  2. 配置适当的身份验证机制

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 服务器。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐