MCP服务器示例
通过HTTP访问的MCP服务器的完整原型(基于HTTP的MCP协议)。连接到cursor(已验证)。 我试图遵循Anthropic的安全最佳实践,因为我有条件地认为这是一个安全的MCP(模型上下文协议)服务器。 代码堆积在一起,T。附录我想展示解决方案的实施。对于那些不能忍受这种面条的人,我建议自己完善代码样式:)
在特定的MCP实现中,Cursor可以连接到服务器并获取当前时间。
更多细节
MCP Time Server提供工具 get_current_time 获取不同格式的当前日期和时间。服务器在Fastapi上实现,支持:
- JSON-RPC 2.0 MCP客户端协议
- HTTP 传输 从Cursor连接
- 安全:Bearer Token身份验证、速率限制、输入验证
- 集装箱化:带有只读文件系统的Docker/Podman
- 监测:Health Check Endpoint
是的,你可以使用FastMCP,但这个例子的好处是你可以看到它是如何工作的。
机会
工具
get_current_time-以指定格式返回当前日期和时间
- 支持的格式: iso, timestamp, rfc3339,以及自定义strftime格式 - 安全验证格式以防止注射
安全
如前所述,我试图遵循Anthropic的安全最佳实践:
- Bearer Token认证(可选)
- 速率限制(100个查询/分钟默认)
- 输入数据的验证和卫生
- CORS支持
- trusted hosts下载
- 容器中的只读文件系统
- 从非特权用户启动
如果你被黑客通过这个服务器-这不是我的错。
要求
- Python 3.11+
- Docker 或 Podman
- Docker作曲илиPodman作曲
快速启动
1.克隆存储库
git clone https://github.com/SPIDER-L33T/mcphttp_sample.git MCP-sample
cd MCP-sample2.配置环境变量
创建文件 .env 在项目的根:
# Обязательные переменные
API_KEY=your-secret-api-key-here
SECRET_KEY=your-secret-key-here
# Опциональные переменные
ENABLE_AUTH=true # Включить аутентификацию (по умолчанию: true)
RATE_LIMIT_PER_MINUTE=100 # Лимит запросов в минуту (по умолчанию: 100)
ALLOWED_ORIGINS= # Разрешенные CORS origins (через запятую)
ALLOWED_HOSTS=localhost,127.0.0.1 # Разрешенные хосты (через запятую)
ENABLE_DOCS=false # Включить Swagger документацию (по умолчанию: false)
ENV=production # Окружение: production или development
PORT=8000 # Порт сервера (по умолчанию: 8000)3.使用Docker Compose启动
docker-compose up -d --build4.使用Podman Compose启动
podman-compose up -d --build5.核实工作
# Health check
curl http://localhost:8000/health
# Проверка корневого эндпоинта
curl http://localhost:8000/Cursor配置
要将服务器连接到Cursor,请将以下配置添加到Cursor设置中:
{
"mcpServers": {
"mcp-time-server": {
"url": "http://localhost:8000/",
"transport": "http",
"headers": {
"Authorization": "Bearer YOUR_API_KEY_HERE"
}
}
}
}替换 YOUR_API_KEY_HERE 环境变量值 API_KEY. 并替换 url 如果您的服务器部署在单独的主机上,例如 "url": "http://mytime.mydomen.com:8000/"
API文档
mcp json-rpc结束点
发布 /
MCP JSON-RPC请求的主要Endpoint。
支持的方法:
initialize-初始化连接
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {
"name": "client-name",
"version": "1.0.0"
}
}
}mcp/listOfferings-获取服务器信息
{
"jsonrpc": "2.0",
"id": 2,
"method": "mcp/listOfferings"
}tools/list-可用工具列表
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/list"
}tools/call-呼叫工具
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"name": "get_current_time",
"arguments": {
"format": "iso"
}
}
}格式示例 get_current_time:
"iso"ISO 8601格式(默认):2025-12-29T14:30:00.123456Z"timestamp"-Unix时间戳:1735477800.123456"rfc3339"RFC 3339格式:2025-12-29T14:30:00.123456Z- 自定义strftime格式:
"%Y-%m-%d %H:%M:%S","%d.%m.%Y",等等。D.其他事项
REST API Endpoints
获取 /health
检查服务器状态。
答复:
{
"status": "healthy",
"timestamp": "2025-12-29T14:30:00.123456Z",
"version": "2.0.0",
"service": "mcp-time-server"
}获取 /
包含服务器信息的根终端。
获取 /tools
可用工具列表(需要身份验证)。
发布 /tools/call
调用工具(需要身份验证)。
使用示例
使用Curl
# Инициализация
curl -X POST http://localhost:8000/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {"name": "test", "version": "1.0"}
}
}'
# Получение списка инструментов
curl -X POST http://localhost:8000/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list"
}'
# Вызов инструмента get_current_time
curl -X POST http://localhost:8000/ \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"name": "get_current_time",
"arguments": {
"format": "iso"
}
}
}'使用Python
import requests
import json
API_KEY = "your-api-key"
BASE_URL = "http://localhost:8000"
headers = {
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}"
}
# Вызов инструмента
response = requests.post(
f"{BASE_URL}/",
headers=headers,
json={
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_current_time",
"arguments": {
"format": "iso"
}
}
}
)
result = response.json()
print(result["result"]["content"][0]["text"])安全
产品建议
- 使用强大的密钥:
# Генерация безопасного API_KEY
openssl rand -hex 32
# Генерация SECRET_KEY
python -c "import secrets; print(secrets.token_urlsafe(32))"- 启用身份验证:
ENABLE_AUTH=true- 配置CORS:
ALLOWED_ORIGINS=https://your-domain.com- 限制主机:
ALLOWED_HOSTS=your-domain.com- 使用HTTPS (设定反向代理,例如nginx)
- 配置防火墙 要限制访问(仅允许此服务器端口上的连接到受信任的IP)
速率限制
默认情况下,每个IP地址的请求限制为每分钟100次。如果超过限制,HTTP 429将返回标题:
X-RateLimit-Limit-最大请求数X-RateLimit-Remaining剩余请求数X-RateLimit-Reset-重置时间限制
监测和记录
日志
日志显示在stdout中,可以通过以下方式查看:
# Docker Compose
docker-compose logs -f mcp-server
# Podman Compose
podman-compose logs -f mcp-server
# Podman напрямую
podman logs -f mcp-sample_mcp-server_1健康检查
容器通过健康检查端点自动检查状态 /health 每30秒。
审计
所有操作都记录为:
- 行动(Action)
- 查询详情
- 客户端IP地址
开发
无Docker本地启动
# Установка зависимостей
pip install -r requirements.txt
# Настройка переменных окружения
export API_KEY=test-key
export SECRET_KEY=test-secret
export ENABLE_AUTH=false
export ENV=development
# Запуск сервера
python main.py启用Swagger文档
您可以启用Swagger UI:
ENABLE_DOCS=true文件可在以下网址查阅: http://localhost:8000/docs
项目结构
MCP-sample/
├── main.py # Основной файл приложения
├── requirements.txt # Python зависимости
├── Dockerfile # Docker образ
├── docker-compose.yml # Docker Compose конфигурация
├── README.md # Документация
└── .env # Переменные окружения (создать вручную)故障排除
Оибка“不允许使用405方法”
确保您正在使用Post Endpoint查询 / 对于MCP JSON-RPC请求。
“401未经授权”
检查:
- 授权标题中APIu KEY的正确性
- enable_auth=true(或禁用测试)
“429太多请求”
超过请求限制。请稍等或放大 RATE_LIMIT_PER_MINUTE.
容器无法启动
检查日志:
podman logs mcp-sample_mcp-server_1确保:
- 端口8000不占用另一个进程
- 环境变量配置正确
- Docker/Podman发布
- 手上没有大便的气味。闻起来像屁股一样长:)
许可证
Mozilla公共许可证版本2.0
作者
蜘蛛-133t
支持
- 写信,用鸽子或气压邮件发送。
- 你可以把佛罗多和萨姆作为邮递员徒步送去(魔多已经到了,我也会到的)。
