Model Context Protocol Server
使用 FastAPI 实现的模型上下文协议服务器: ```python from fastapi import FastAPI, Request, HTTPException from pydantic import BaseModel from typing import Dict, Any, Optional app = FastAPI() # 定义请求和响应模型 class ContextRequest(BaseModel): model_id: str context: Dict[str, Any] request_id: Optional[str] = None # 可选的请求 ID,用于跟踪 class ContextResponse(BaseModel): model_id: str context: Dict[str, Any] request_id: Optional[str] = None # 响应中返回请求 ID # 模拟的模型上下文存储 model_contexts: Dict[str, Dict[str, Any]] = {} @app.post("/context") async def update_context(request: ContextRequest) -> ContextResponse: """ 更新指定模型的上下文。 Args: request: 包含模型 ID 和上下文数据的 ContextRequest 对象。 Returns: 包含更新后的模型 ID 和上下文数据的 ContextResponse 对象。 """ model_id = request.model_id context = request.context request_id = request.request_id # 检查模型 ID 是否存在 if model_id not in model_contexts: model_contexts[model_id] = {} # 更新上下文 model_contexts[model_id].update(context) # 构建响应 response = ContextResponse(model_id=model_id, context=model_contexts[model_id], request_id=request_id) return response @app.get("/context/{model_id}") async def get_context(model_id: str) -> Dict[str, Any]: """ 获取指定模型的上下文。 Args: model_id: 要获取上下文的模型 ID。 Returns: 指定模型的上下文数据。 Raises: HTTPException: 如果模型 ID 不存在。 """ if model_id not in model_contexts: raise HTTPException(status_code=404, detail=f"Model ID '{model_id}' not found") return model_contexts[model_id] @app.delete("/context/{model_id}") async def delete_context(model_id: str) -> Dict[str, str]: """ 删除指定模型的上下文。 Args: model_id: 要删除上下文的模型 ID。 Returns: 一个包含删除结果的消息。 Raises: HTTPException: 如果模型 ID 不存在。 """ if model_id not in model_contexts: raise HTTPException(status_code=404, detail=f"Model ID '{model_id}' not found") del model_contexts[model_id] return {"message": f"Context for model ID '{model_id}' deleted successfully."} if __name__ == "__main__": import uvicorn uvicorn.run(app, host="0.0.0.0", port=8000) ``` **代码解释:** * **`from fastapi import FastAPI, Request, HTTPException`**: 导入 FastAPI 及其相关模块。 * **`from pydantic import BaseModel`**: 导入 Pydantic 的 `BaseModel` 用于定义数据模型。 * **`from typing import Dict, Any, Optional`**: 导入类型提示,提高代码可读性。 * **`app = FastAPI()`**: 创建 FastAPI 应用实例。 * **`ContextRequest` 和 `ContextResponse`**: 使用 Pydantic 定义请求和响应的数据模型。 `ContextRequest` 包含 `model_id` (模型 ID), `context` (上下文数据,一个字典), 和可选的 `request_id`。 `ContextResponse` 包含相同的信息,用于返回更新后的上下文。 * **`model_contexts: Dict[str, Dict[str, Any]] = {}`**: 一个字典,用于存储模型上下文。 键是 `model_id` (字符串),值是另一个字典,表示该模型的上下文数据。 这只是一个内存中的存储,在实际应用中,你可能需要使用数据库或其他持久化存储。 * **`@app.post("/context")`**: 定义一个 POST 路由,用于更新模型的上下文。 * `async def update_context(request: ContextRequest) -> ContextResponse:`: 定义异步函数 `update_context`,它接收一个 `ContextRequest` 对象作为参数,并返回一个 `ContextResponse` 对象。 * 函数首先从请求中提取 `model_id` 和 `context`。 * 然后,它检查 `model_id` 是否已经存在于 `model_contexts` 中。如果不存在,则创建一个新的条目。 * 接下来,它使用 `update()` 方法将请求中的 `context` 合并到现有的模型上下文中。 * 最后,它创建一个 `ContextResponse` 对象并返回。 * **`@app.get("/context/{model_id}")`**: 定义一个 GET 路由,用于获取指定模型的上下文。 * `async def get_context(model_id: str) -> Dict[str, Any]:`: 定义异步函数 `get_context`,它接收一个 `model_id` 作为参数,并返回一个字典,表示该模型的上下文数据。 * 函数首先检查 `model_id` 是否存在于 `model_contexts` 中。如果不存在,则抛出一个 `HTTPException`,状态码为 404 (Not Found)。 * 如果 `model_id` 存在,则返回 `model_contexts[model_id]`。 * **`@app.delete("/context/{model_id}")`**: 定义一个 DELETE 路由,用于删除指定模型的上下文。 * `async def delete_context(model_id: str) -> Dict[str, str]:`: 定义异步函数 `delete_context`,它接收一个 `model_id` 作为参数,并返回一个字典,包含删除结果的消息。 * 函数首先检查 `model_id` 是否存在于 `model_contexts` 中。如果不存在,则抛出一个 `HTTPException`,状态码为 404 (Not Found)。 * 如果 `model_id` 存在,则使用 `del model_contexts[model_id]` 删除该模型的上下文。 * 最后,返回一个包含成功消息的字典。 * **`if __name__ == "__main__":`**: 确保代码只在直接运行脚本时执行,而不是作为模块导入时执行。 * **`uvicorn.run(app, host="0.0.0.0", port=8000)`**: 使用 Uvicorn 启动 FastAPI 应用。 `host="0.0.0.0"` 表示监听所有网络接口,`port=8000` 表示监听 8000 端口。 **如何运行:** 1. **安装 FastAPI 和 Uvicorn:** ```bash pip install fastapi uvicorn ``` 2. **保存代码:** 将代码保存为 `main.py` (或其他你喜欢的名字)。 3. **运行应用:** ```bash python main.py ``` 或者,如果你安装了 `uvicorn` 作为全局命令: ```bash uvicorn main:app --reload ``` `--reload` 标志会在代码更改时自动重新加载服务器,方便开发。 **如何使用:** 你可以使用 `curl` 或任何 HTTP 客户端来与服务器交互。 * **更新上下文 (POST):** ```bash curl -X POST -H "Content-Type: application/json" -d '{"model_id": "my_model", "context": {"key1": "value1", "key2": 123}, "request_id": "req123"}' http://localhost:8000/context ``` * **获取上下文 (GET):** ```bash curl http://localhost:8000/context/my_model ``` * **删除上下文 (DELETE):** ```bash curl -X DELETE http://localhost:8000/context/my_model ``` **重要注意事项:** * **错误处理:** 代码包含基本的错误处理 (例如,检查模型 ID 是否存在)。 在实际应用中,你需要更完善的错误处理机制,例如记录错误日志、返回更详细的错误信息等。 * **安全性:** 此代码没有包含任何安全措施。 在生产环境中,你需要添加身份验证、授权、输入验证等安全措施。 * **持久化存储:** 此代码使用内存中的字典来存储模型上下文。 这意味着,当服务器重启时,所有上下文数据都会丢失。 在实际应用中,你需要使用数据库或其他持久化存储来保存上下文数据。 常见的选择包括 Redis、PostgreSQL、MongoDB 等。 * **并发:** FastAPI 是一个异步框架,可以处理并发请求。 但是,如果你的模型上下文存储是线程不安全的,你需要采取措施来保护它,例如使用锁。 * **模型集成:** 此代码只是一个模型上下文协议服务器的框架。 你需要将其与你的实际模型集成。 这可能涉及到加载模型、调用模型进行推理、以及将模型的结果存储到上下文中。 * **数据验证:** 你可以使用 Pydantic 的验证功能来确保上下文数据符合预期的格式和类型。 This provides a basic implementation of a Model Context Protocol server using FastAPI. Remember to adapt it to your specific needs and consider the important notes above for production deployments.
tian1ll1
README
模型上下文协议服务器
一个基于 FastAPI 实现的模型上下文协议 (MCP) 服务器,用于处理模型上下文管理、会话处理和协议操作。
特性
- 基于 FastAPI 的 REST API 服务器
- 模型上下文管理
- 会话处理和持久化
- WebSocket 支持实时更新
- 身份验证和授权
- 请求验证和错误处理
- Swagger/OpenAPI 文档
- Docker 支持
项目结构
mcp-protocol-server/
├── app/
│ ├── __init__.py
│ ├── main.py
│ ├── config.py
│ ├── core/
│ │ ├── __init__.py
│ │ ├── context.py
│ │ ├── session.py
│ │ └── protocol.py
│ ├── api/
│ │ ├── __init__.py
│ │ ├── endpoints/
│ │ │ ├── __init__.py
│ │ │ ├── context.py
│ │ │ └── session.py
│ │ └── dependencies.py
│ ├── models/
│ │ ├── __init__.py
│ │ ├── context.py
│ │ └── session.py
│ └── utils/
│ ├── __init__.py
│ └── security.py
├── tests/
│ ├── __init__.py
│ ├── conftest.py
│ ├── test_context.py
│ └── test_session.py
├── docker/
│ ├── Dockerfile
│ └── docker-compose.yml
├── requirements.txt
├── .env.example
└── README.md
安装
- 克隆仓库:
git clone https://github.com/tian1ll1/mcp-protocol-server.git
cd mcp-protocol-server
- 创建并激活虚拟环境:
python -m venv venv
source venv/bin/activate # 在 Windows 上: venv\Scripts\activate
- 安装依赖:
pip install -r requirements.txt
- 复制示例环境变量文件并配置您的设置:
cp .env.example .env
运行服务器
开发模式
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
生产模式
uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4
使用 Docker
docker-compose up -d
API 文档
服务器运行后,您可以通过以下地址访问 API 文档:
- Swagger UI: http://localhost:8000/docs
- ReDoc: http://localhost:8000/redoc
测试
运行测试套件:
pytest
配置
服务器可以使用环境变量或 .env 文件进行配置。 有关可用选项,请参见 .env.example。
许可证
该项目基于 MIT 许可证 - 有关详细信息,请参见 LICENSE 文件。
推荐服务器
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
MCP Package Docs Server
促进大型语言模型高效访问和获取 Go、Python 和 NPM 包的结构化文档,通过多语言支持和性能优化来增强软件开发。
Claude Code MCP
一个实现了 Claude Code 作为模型上下文协议(Model Context Protocol, MCP)服务器的方案,它可以通过标准化的 MCP 接口来使用 Claude 的软件工程能力(代码生成、编辑、审查和文件操作)。
@kazuph/mcp-taskmanager
用于任务管理的模型上下文协议服务器。它允许 Claude Desktop(或任何 MCP 客户端)在基于队列的系统中管理和执行任务。
mermaid-mcp-server
一个模型上下文协议 (MCP) 服务器,用于将 Mermaid 图表转换为 PNG 图像。
Jira-Context-MCP
MCP 服务器向 AI 编码助手(如 Cursor)提供 Jira 工单信息。
Linear MCP Server
一个模型上下文协议(Model Context Protocol)服务器,它与 Linear 的问题跟踪系统集成,允许大型语言模型(LLM)通过自然语言交互来创建、更新、搜索和评论 Linear 问题。
Sequential Thinking MCP Server
这个服务器通过将复杂问题分解为顺序步骤来促进结构化的问题解决,支持修订,并通过完整的 MCP 集成来实现多条解决方案路径。
Curri MCP Server
通过管理文本笔记、提供笔记创建工具以及使用结构化提示生成摘要,从而实现与 Curri API 的交互。