SQLite Database Demo
好的,以下是一些在模型上下文协议 (Model Context Protocol, MCP) 中构建服务器、客户端测试的示例。由于 MCP 是一个比较宽泛的概念,我将提供一些通用的示例,并假设你指的是一种基于消息传递的协议,用于在服务器和客户端之间传递模型相关的信息。 **假设场景:** 我们假设有一个简单的场景,服务器提供一个模型推理服务,客户端发送数据给服务器,服务器使用模型进行推理,并将结果返回给客户端。 **1. 服务器端 (Server-side)** * **Python (使用 `socket` 模块):** ```python import socket import json # 假设的模型推理函数 def infer_model(data): # 模拟模型推理过程 # 这里可以替换成你的实际模型推理代码 result = {"prediction": data["input"] * 2} # 简单示例:将输入乘以2 return result def handle_client(conn, addr): print(f"Connected by {addr}") try: while True: data = conn.recv(1024) # 接收数据,最大1024字节 if not data: break # 客户端断开连接 try: # 尝试将接收到的数据解析为 JSON request = json.loads(data.decode('utf-8')) print(f"Received: {request}") # 调用模型推理函数 response = infer_model(request) # 将结果转换为 JSON 并发送回客户端 conn.sendall(json.dumps(response).encode('utf-8')) print(f"Sent: {response}") except json.JSONDecodeError: print("Invalid JSON received.") conn.sendall(b'{"error": "Invalid JSON"}') except Exception as e: print(f"Error processing request: {e}") conn.sendall(b'{"error": "Internal Server Error"}') except ConnectionResetError: print(f"Connection reset by {addr}") finally: conn.close() print(f"Connection closed with {addr}") def start_server(host='localhost', port=12345): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((host, port)) s.listen() print(f"Server listening on {host}:{port}") while True: conn, addr = s.accept() handle_client(conn, addr) if __name__ == "__main__": start_server() ``` * **代码解释:** * `infer_model(data)`: 模拟模型推理过程,你需要替换成你实际的模型推理代码。 * `handle_client(conn, addr)`: 处理客户端连接,接收数据,调用模型推理,并将结果返回给客户端。 * `start_server(host, port)`: 启动服务器,监听指定端口。 * 使用 `json` 模块进行数据的序列化和反序列化,方便传递复杂的数据结构。 * 异常处理,确保服务器的健壮性。 **2. 客户端 (Client-side)** * **Python (使用 `socket` 模块):** ```python import socket import json def send_request(host='localhost', port=12345, data=None): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: try: s.connect((host, port)) print(f"Connected to {host}:{port}") # 将数据转换为 JSON 并发送 message = json.dumps(data).encode('utf-8') s.sendall(message) print(f"Sent: {data}") # 接收服务器的响应 response = s.recv(1024) if response: try: response_data = json.loads(response.decode('utf-8')) print(f"Received: {response_data}") return response_data except json.JSONDecodeError: print("Invalid JSON received from server.") return None else: print("No data received from server.") return None except ConnectionRefusedError: print(f"Connection refused by {host}:{port}") return None except Exception as e: print(f"An error occurred: {e}") return None if __name__ == "__main__": # 示例数据 request_data = {"input": 10} # 发送请求并接收响应 response = send_request(data=request_data) if response: print(f"Final Result: {response}") ``` * **代码解释:** * `send_request(host, port, data)`: 连接到服务器,发送数据,接收响应。 * 使用 `json` 模块进行数据的序列化和反序列化。 * 异常处理,处理连接错误和数据接收错误。 **3. 测试 (Testing)** * **手动测试:** 1. 先运行服务器端代码。 2. 再运行客户端代码,观察客户端的输出,以及服务器端的日志。 3. 可以修改客户端的 `request_data`,测试不同的输入。 * **自动化测试 (使用 `unittest` 模块):** ```python import unittest import socket import json import threading import time # 导入服务器端代码 (假设保存在 server.py 文件中) import server class ServerClientTest(unittest.TestCase): @classmethod def setUpClass(cls): # 启动服务器 (在后台线程中) cls.server_thread = threading.Thread(target=server.start_server, daemon=True) cls.server_thread.start() time.sleep(0.5) # 等待服务器启动 @classmethod def tearDownClass(cls): # 关闭服务器 (这里需要一种关闭服务器的机制,例如设置一个全局变量) # 注意:这个例子中没有实现优雅的关闭服务器,需要根据你的实际情况修改 pass def test_valid_request(self): # 测试发送有效请求 request_data = {"input": 5} response = self.send_request(data=request_data) self.assertIsNotNone(response) self.assertEqual(response["prediction"], 10) # 期望结果 def test_invalid_request(self): # 测试发送无效请求 (例如,非 JSON 数据) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('localhost', 12345)) s.sendall(b"This is not JSON") response = s.recv(1024) self.assertIn(b"Invalid JSON", response) def send_request(self, host='localhost', port=12345, data=None): # 客户端代码 (与上面的客户端代码类似) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: try: s.connect((host, port)) message = json.dumps(data).encode('utf-8') s.sendall(message) response = s.recv(1024) if response: return json.loads(response.decode('utf-8')) else: return None except Exception as e: print(f"An error occurred: {e}") return None if __name__ == '__main__': unittest.main() ``` * **代码解释:** * `setUpClass()`: 在所有测试用例运行之前启动服务器。 * `tearDownClass()`: 在所有测试用例运行之后关闭服务器。 **注意:** 这个例子中没有实现优雅的关闭服务器,需要根据你的实际情况修改。 通常,你需要一种机制来通知服务器停止监听连接。 * `test_valid_request()`: 测试发送有效的 JSON 请求,并验证服务器返回的结果是否符合预期。 * `test_invalid_request()`: 测试发送无效的 JSON 请求,并验证服务器是否返回错误信息。 * `send_request()`: 与上面的客户端代码相同,用于发送请求并接收响应。 **重要注意事项:** * **错误处理:** 在实际应用中,需要更完善的错误处理机制,例如重试机制、超时处理等。 * **数据格式:** 根据你的实际需求,选择合适的数据格式,例如 JSON, Protocol Buffers, Avro 等。 * **并发处理:** 如果服务器需要处理大量的并发请求,需要考虑使用多线程、多进程或异步编程。 * **安全性:** 如果服务器需要处理敏感数据,需要考虑安全性问题,例如身份验证、授权、加密等。 * **优雅关闭服务器:** 在测试和生产环境中,都需要一种优雅关闭服务器的机制,避免数据丢失或连接错误。 这通常涉及到向服务器发送一个信号,让它停止监听连接,并等待所有正在处理的请求完成。 **总结:** 这些示例提供了一个基本的框架,你可以根据你的实际需求进行修改和扩展。 关键在于理解 MCP 的核心思想:通过定义明确的消息格式和协议,实现服务器和客户端之间的可靠通信。 在实际应用中,你需要根据你的具体场景选择合适的技术和工具,并进行充分的测试,确保系统的稳定性和可靠性。 **中文翻译:** 好的,以下是一些在模型上下文协议 (Model Context Protocol, MCP) 中构建服务器、客户端测试的示例。由于 MCP 是一个比较宽泛的概念,我将提供一些通用的示例,并假设你指的是一种基于消息传递的协议,用于在服务器和客户端之间传递模型相关的信息。 **假设场景:** 我们假设有一个简单的场景,服务器提供一个模型推理服务,客户端发送数据给服务器,服务器使用模型进行推理,并将结果返回给客户端。 **1. 服务器端 (Server-side)** * **Python (使用 `socket` 模块):** ```python import socket import json # 假设的模型推理函数 def infer_model(data): # 模拟模型推理过程 # 这里可以替换成你的实际模型推理代码 result = {"prediction": data["input"] * 2} # 简单示例:将输入乘以2 return result def handle_client(conn, addr): print(f"Connected by {addr}") try: while True: data = conn.recv(1024) # 接收数据,最大1024字节 if not data: break # 客户端断开连接 try: # 尝试将接收到的数据解析为 JSON request = json.loads(data.decode('utf-8')) print(f"Received: {request}") # 调用模型推理函数 response = infer_model(request) # 将结果转换为 JSON 并发送回客户端 conn.sendall(json.dumps(response).encode('utf-8')) print(f"Sent: {response}") except json.JSONDecodeError: print("Invalid JSON received.") conn.sendall(b'{"error": "Invalid JSON"}') except Exception as e: print(f"Error processing request: {e}") conn.sendall(b'{"error": "Internal Server Error"}') except ConnectionResetError: print(f"Connection reset by {addr}") finally: conn.close() print(f"Connection closed with {addr}") def start_server(host='localhost', port=12345): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.bind((host, port)) s.listen() print(f"Server listening on {host}:{port}") while True: conn, addr = s.accept() handle_client(conn, addr) if __name__ == "__main__": start_server() ``` * **代码解释:** * `infer_model(data)`: 模拟模型推理过程,你需要替换成你实际的模型推理代码。 * `handle_client(conn, addr)`: 处理客户端连接,接收数据,调用模型推理,并将结果返回给客户端。 * `start_server(host, port)`: 启动服务器,监听指定端口。 * 使用 `json` 模块进行数据的序列化和反序列化,方便传递复杂的数据结构。 * 异常处理,确保服务器的健壮性。 **2. 客户端 (Client-side)** * **Python (使用 `socket` 模块):** ```python import socket import json def send_request(host='localhost', port=12345, data=None): with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: try: s.connect((host, port)) print(f"Connected to {host}:{port}") # 将数据转换为 JSON 并发送 message = json.dumps(data).encode('utf-8') s.sendall(message) print(f"Sent: {data}") # 接收服务器的响应 response = s.recv(1024) if response: try: response_data = json.loads(response.decode('utf-8')) print(f"Received: {response_data}") return response_data except json.JSONDecodeError: print("Invalid JSON received from server.") return None else: print("No data received from server.") return None except ConnectionRefusedError: print(f"Connection refused by {host}:{port}") return None except Exception as e: print(f"An error occurred: {e}") return None if __name__ == "__main__": # 示例数据 request_data = {"input": 10} # 发送请求并接收响应 response = send_request(data=request_data) if response: print(f"Final Result: {response}") ``` * **代码解释:** * `send_request(host, port, data)`: 连接到服务器,发送数据,接收响应。 * 使用 `json` 模块进行数据的序列化和反序列化。 * 异常处理,处理连接错误和数据接收错误。 **3. 测试 (Testing)** * **手动测试:** 1. 先运行服务器端代码。 2. 再运行客户端代码,观察客户端的输出,以及服务器端的日志。 3. 可以修改客户端的 `request_data`,测试不同的输入。 * **自动化测试 (使用 `unittest` 模块):** ```python import unittest import socket import json import threading import time # 导入服务器端代码 (假设保存在 server.py 文件中) import server class ServerClientTest(unittest.TestCase): @classmethod def setUpClass(cls): # 启动服务器 (在后台线程中) cls.server_thread = threading.Thread(target=server.start_server, daemon=True) cls.server_thread.start() time.sleep(0.5) # 等待服务器启动 @classmethod def tearDownClass(cls): # 关闭服务器 (这里需要一种关闭服务器的机制,例如设置一个全局变量) # 注意:这个例子中没有实现优雅的关闭服务器,需要根据你的实际情况修改 pass def test_valid_request(self): # 测试发送有效请求 request_data = {"input": 5} response = self.send_request(data=request_data) self.assertIsNotNone(response) self.assertEqual(response["prediction"], 10) # 期望结果 def test_invalid_request(self): # 测试发送无效请求 (例如,非 JSON 数据) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: s.connect(('localhost', 12345)) s.sendall(b"This is not JSON") response = s.recv(1024) self.assertIn(b"Invalid JSON", response) def send_request(self, host='localhost', port=12345, data=None): # 客户端代码 (与上面的客户端代码类似) with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: try: s.connect((host, port)) message = json.dumps(data).encode('utf-8') s.sendall(message) response = s.recv(1024) if response: return json.loads(response.decode('utf-8')) else: return None except Exception as e: print(f"An error occurred: {e}") return None if __name__ == '__main__': unittest.main() ``` * **代码解释:** * `setUpClass()`: 在所有测试用例运行之前启动服务器。 * `tearDownClass()`: 在所有测试用例运行之后关闭服务器。 **注意:** 这个例子中没有实现优雅的关闭服务器,需要根据你的实际情况修改。 通常,你需要一种机制来通知服务器停止监听连接。 * `test_valid_request()`: 测试发送有效的 JSON 请求,并验证服务器返回的结果是否符合预期。 * `test_invalid_request()`: 测试发送无效的 JSON 请求,并验证服务器是否返回错误信息。 * `send_request()`: 与上面的客户端代码相同,用于发送请求并接收响应。 **重要注意事项:** * **错误处理:** 在实际应用中,需要更完善的错误处理机制,例如重试机制、超时处理等。 * **数据格式:** 根据你的实际需求,选择合适的数据格式,例如 JSON, Protocol Buffers, Avro 等。 * **并发处理:** 如果服务器需要处理大量的并发请求,需要考虑使用多线程、多进程或异步编程。 * **安全性:** 如果服务器需要处理敏感数据,需要考虑安全性问题,例如身份验证、授权、加密等。 * **优雅关闭服务器:** 在测试和生产环境中,都需要一种优雅关闭服务器的机制,避免数据丢失或连接错误。 这通常涉及到向服务器发送一个信号,让它停止监听连接,并等待所有正在处理的请求完成。 **总结:** 这些示例提供了一个基本的框架,你可以根据你的实际需求进行修改和扩展。 关键在于理解 MCP 的核心思想:通过定义明确的消息格式和协议,实现服务器和客户端之间的可靠通信。 在实际应用中,你需要根据你的具体场景选择合适的技术和工具,并进行充分的测试,确保系统的稳定性和可靠性。
anhnx000
README
SQLite 数据库演示
此项目演示了在 FastMCP 应用程序中使用支持异步操作的 SQLite 数据库。
功能特性
- 使用
aiosqlite
实现异步 SQLite 数据库操作 - 自动数据库初始化,包含示例数据
- 类型安全的数据库上下文管理
- 正确的连接生命周期管理
前提条件
- Python 3.7+
- pip (Python 包管理器)
安装
- 克隆此仓库
- 安装所需的依赖项:
pip install -r requirements.txt
项目结构
server.py
: 主 FastMCP 服务器实现,包含数据库上下文管理database.py
: SQLite 数据库实现,支持异步操作demo.db
: SQLite 数据库文件 (首次运行时自动创建)
数据库模式
演示数据库包含一个 users
表,结构如下:
CREATE TABLE users (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name TEXT NOT NULL,
email TEXT UNIQUE NOT NULL
)
首次运行时会自动插入示例数据:
- John Doe (john@example.com)
- Jane Smith (jane@example.com)
使用方法
- 启动服务器:
python server.py
-
数据库将在首次运行时自动使用示例数据进行初始化。
-
使用
query_db
工具从数据库检索数据。
数据库操作
Database
类提供以下方法:
connect()
: 创建新的数据库连接并初始化模式query()
: 执行示例查询以检索所有用户disconnect()
: 关闭数据库连接
自定义
要修改数据库模式或添加新表:
- 编辑
database.py
中的_init_db()
方法 - 向
Database
类添加新方法以进行自定义查询 - 更新
server.py
中的query_db
工具以使用新方法
错误处理
数据库实现包括:
- 服务器关闭时自动清理连接
- 正确的异步上下文管理
- 使用 Python 类型提示保证类型安全
依赖项
- aiosqlite>=0.19.0: 异步 SQLite 数据库驱动程序
- pandas>=2.0.0: 数据操作库
- numpy>=1.24.0: 数值计算库
推荐服务器
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 的交互。