内容
答应用 MCP 服务器
使用 FastMCP 构建的 Python MCP(模型上下文协议)服务器。提供以下工具:
- **Claude Desktop**,本地,通过 stdio
- **.ai**,远程,通过 HTTP(在 Render 上部署)
可选 SQLAlchemy 使用 MySQL 数据库。
## 项目布局
```
.
├── server.py # 入口点 — 根据 RENDER 环境变量分支(stdio vs # 加载 .env,公开共享的 SQLAlchemy 引擎
├── tools/
│ ├── __init__.py
│ └── quiz.py # 工具定义 — register(mcp) 将它们添加到 FastMCP 实例中
├── .env # 机密 — 永远不要提交
├── .env.example
└── requirements.txt
```
```powershell
python venv venv
.\venv\Scripts\pip install -.txt
copy .env.example .env
# 用实际的数据库凭证(如果未使用,请删除 DB_* 行)
```
## 本(stdio)
```powershell
.\venv\Scripts\python.exe server```
或使用 MCP 检查器手动调用工具:
```powershell
.\venv\Scripts\python.exe -m mcp dev server.py
```
到 Claude Desktop
添加到 `%APPDATA%\Claude\claude_desktop_config.json`:
```json
{
"mcpServers "quizapp": {
"command": "C:\\path\\project\\venv\\Scripts\\python.exe",
"args"::\\path\\to\\project\\server.py"]
}
}
重启 Claude Desktop — 工具会自动出现。
## 部署到 Render,用于 claude.ai)
1. 推送到 GitHub(` 被 gitignore — 永远不要提交它)。
2. 创建一个Web 服务**,连接到仓库。
3. 仪表板环境变量:
| 变量 | 值 |
|----------------|
| `RENDER` | `true` | `DB_HOST` | 您的 |
DB_USER` | 您的数据库用户 |
| `` | 您的数据库密码 |
| `DB_NAME` | 您的数据库名称 |
4. 启动命令:`python server.py 在 `server.py` 中,将 `RENDER` 分支BASE_URL` 更新为实际的 Render URL。
6. 在 **.ai → 设置 → 连接器** 中,添加:`https://your-app.onrender.com/mcp`
**当前 HTTP 端点上没有配置** — 任何拥有 URL 的人都可以调用每个工具,包括基于数据库的工具。这是目前为了保持设置简单而做出的明确选择;在公开任何之前请重新审视(参见下面的安全部分)。
出于暂时原因,HTTP 端点的 OAuth 已被移除 —将 claude.ai 与此服务器的数据库/工具一起使用,因此不额外的复杂性。如有需要,后续可以添加回来。
###活动
Render 的免费层在闲置 15 分钟后睡眠状态,这会导致睡眠后第一次请求变慢(30–60或超时。已经实施了缓解措施:
- `server.py后台线程每 10 分钟 ping `/health` 一次。
https://your-app.onrender.com/health` 上添加外部监(例如 UptimeRobot),每 5 分钟一次 — ** `/mcp`## 添加新工具
打开 `tools/quiz.py` 并在 `register(mcp)` 中添加一个函数:
```python
@mcp.tool()
def my_new_tool(param1: str, param2: int) -> dict:
"""
此工具执行操作的简要描述。
代理读取此文档字符串以决定何时调用工具。
参数:
param1: 此字符串参数的含义。
param2: 此整数参数的含义。
"""
result = do_something(param1, param2)
return {"result":```
无需单独的注册步骤 — `register(mcp)` 被 stdio 和 HTTP 实例。
## 安全
- `.env` 被 — 永远不要提交它。
- 工具从不返回原始 SQL 或公开数据库架构。
- 所有查询都使用参数化 SQL(("... WHERE id = :id")`,而不是字符串插值)。
任何用户提供的表/列名都应在用于 SQL 之前与允许列表进行检查。
- Render HTTP 端点没有身份验证其视为公共的。在添加身份验证之前,不要添加暴露敏感数据性数据库操作的工具。