1. 客户端配置详解
1.1 mcp.json
标准格式
json
{
"version": "1.0",
"mcpServers": {
"my_ai_tools": {
"command": "python",
"args": ["/path/to/server.py"],
"env": {
"OPENAI_API_KEY": "sk-xxx",
"DB_URL": "mysql://user:pass@localhost/db"
},
"description": "AI工具集(数据库/天气API)"
}
}
}
关键字段说明:
command
:启动命令(如python
、uvicorn
等)args
:命令行参数(支持相对路径)env
:环境变量(敏感信息建议通过外部注入)description
:客户端展示的服务描述
1.2 配置位置
- 全局配置 :
~/.config/mcp/config.json
- 项目级配置 :
./.mcp/mcp.json
- IDE特定配置 :如Cursor会在工作区查找
.vscode/mcp.json
1.3 环境变量管理
bash
# 推荐使用.env文件(需配合python-dotenv)
echo "DB_PASSWORD=123456" > .env
然后在代码中加载:
python
from dotenv import load_dotenv
load_dotenv()
2. 部署模式对比
2.1 STDIO模式(开发环境首选)
json
{
"command": "python",
"args": ["server.py"]
}
- 优点 :
- 零延迟通信
- 调试方便(日志直接输出)
- 限制 :
- 必须与客户端同机部署
- 无跨进程隔离
2.2 SSE模式(生产环境必选)
json
{
"command": "uvicorn",
"args": ["server:app", "--port", "8000"]
}
需要FastAPI封装:
python
# server.py
from fastapi import FastAPI
from fastmcp import FastMCP
app = FastAPI()
mcp = FastMCP("ProductionTools")
@app.post("/mcp")
async def handle_mcp():
return await mcp.handle_request()
# 注册工具...
3. 生产环境部署实战
3.1 使用Gunicorn+Uvicorn
bash
gunicorn -w 4 -k uvicorn.workers.UvicornWorker server:app
对应mcp.json
:
json
{
"command": "curl",
"args": ["http://localhost:8000/mcp"]
}
3.2 容器化部署(Docker)
dockerfile
FROM python:3.10
WORKDIR /app
COPY . .
RUN pip install -r requirements.txt
CMD ["gunicorn", "-w", "4", "-k", "uvicorn.workers.UvicornWorker", "server:app"]
3.3 健康检查配置
python
@app.get("/health")
def health_check():
return {"status": "ok"}
4. 安全加固方案
4.1 认证鉴权
python
from fastapi.security import HTTPBearer
security = HTTPBearer()
@app.post("/mcp")
async def handle_mcp(token: str = Depends(security)):
if token != os.getenv("API_TOKEN"):
raise HTTPException(status_code=403)
return await mcp.handle_request()
4.2 限流保护
python
from fastapi.middleware import Middleware
from slowapi import Limiter
from slowapi.util import get_remote_address
limiter = Limiter(key_func=get_remote_address)
app.state.limiter = limiter
@app.post("/mcp")
@limiter.limit("10/minute")
async def handle_mcp():
return await mcp.handle_request()
5. 监控与日志
5.1 Prometheus监控
python
from prometheus_fastapi_instrumentator import Instrumentator
Instrumentator().instrument(app).expose(app)
5.2 结构化日志
python
import logging
import json_logging
json_logging.init_fastapi(enable_json=True)
logger = logging.getLogger("mcp-server")
附录:部署检查清单
- 测试STDIO和SSE两种模式
- 配置环境变量加密方案
- 设置健康检查端点
- 实现基础认证鉴权
- 配置日志和监控系统
- 压力测试(推荐使用locust)