项目简介
EnrichMCP是一个Python框架,旨在帮助AI代理更好地理解和导航您的数据。它基于Model Context Protocol (MCP) 构建,能够将您现有或自定义的数据模型转化为类型化、可发现的语义化工具,就像是AI的ORM(对象关系映射)。通过EnrichMCP,您可以轻松构建一个MCP服务器,向大型语言模型(LLM)客户端提供结构化的数据访问、功能调用和上下文信息。
主要功能点
- 自动化工具生成: 从您的Python数据模型(如Pydantic模型或SQLAlchemy模型)自动生成可供AI代理调用的、带有类型定义的工具。
- 关系管理: 自动处理实体之间(如用户到订单、订单到产品)的复杂关系,使AI能够自然地遍历数据。
- Schema探索: 提供AI代理探索整个数据模型Schema的能力,帮助它们理解数据结构、字段类型和语义。
- 类型安全与验证: 基于Pydantic模型对所有输入/输出进行严格的类型检查和数据验证。
- 多后端支持: 能够与各种数据后端集成,包括数据库、REST API或自定义业务逻辑。
- CRUD操作: 支持生成数据的创建(Create)、读取(Retrieve)、更新(Update)和删除(Delete)工具。
- 内置分页: 为处理大量数据提供内置的分页(PageResult/CursorResult)机制。
- 上下文与认证: 允许在请求上下文中传递认证信息、数据库连接或其他自定义数据。
- 请求缓存: 提供多种粒度(请求、用户、全局)的缓存机制,减少数据源负载。
- 服务器端LLM采样: 允许MCP服务器通过LLM客户端请求LLM完成(采样),实现更智能的业务逻辑。
- 多种传输协议: 支持通过标准输出 (Stdio)、HTTP (Streamable HTTP) 等多种协议提供服务。
安装步骤
首先,请确保您的Python版本为3.11或更高。
- 基础安装:
pip install enrichmcp - 带SQLAlchemy支持的安装 (如果您计划从SQLAlchemy模型自动生成API):
pip install enrichmcp[sqlalchemy] - 开发环境设置 (如果您想为项目贡献或进行深度开发):
# 克隆仓库 git clone https://github.com/featureform/enrichmcp.git cd enrichmcp # 创建虚拟环境并安装依赖 make setup source .venv/bin/activate
服务器配置 (MCP客户端使用)
MCP客户端需要配置服务器的启动命令和参数,以便连接到EnrichMCP服务器。以下是一个基本的JSON格式配置示例,您需要根据实际部署的EnrichMCP应用来调整 'command' 和 'args':
{ "mcpServers": { "your_server_name": { "command": "python", "args": [ "/path/to/your/enrichmcp_app.py" ], "description": "这是您的EnrichMCP服务器的描述,例如:一个提供用户和订单数据的电商API。", "url": "可选:如果您的EnrichMCP应用运行在HTTP模式,可以提供URL,例如 'http://localhost:8000/mcp'" } } }
- 'your_server_name': 您为这个MCP服务器实例定义的名称,如 'E-commerce Data' 或 'Analytics Platform'。这个名称将在MCP客户端的配置中用作服务器的标识。
- 'command': 启动Python解释器的命令,通常是 '"python"' 或您的虚拟环境中的Python路径。
- 'args': 启动您的EnrichMCP应用程序的Python脚本的完整路径。例如,如果您有一个名为 'myapp.py' 的文件包含您的EnrichMCP应用定义,这里就填写其完整路径。
- 'description': 对您的MCP服务器功能的简短说明,这将帮助LLM客户端理解其用途和可用能力。
- 'url': 如果您的EnrichMCP应用程序通过HTTP(而不是默认的Stdio)运行,您可以在此处提供服务器的URL。例如,如果运行 'app.run(transport="streamable-http")',则默认URL通常是 'http://localhost:8000/mcp'。
基本使用方法
以下是一个简单的EnrichMCP应用程序示例,展示了如何定义一个实体和一个检索资源,并通过 'app.run()' 启动服务器。
1. 创建您的EnrichMCP应用程序文件 (例如 'myapp.py'):
from enrichmcp import EnrichMCP, EnrichModel from pydantic import Field from datetime import datetime, UTC # 创建EnrichMCP应用实例 app = EnrichMCP( title="My Simple API", instructions="提供用户数据的简单API", ) # 定义一个实体(数据模型) @app.entity(description="系统中的用户账户") class User(EnrichModel): id: int = Field(description="用户唯一标识符") name: str = Field(description="用户全名") email: str = Field(description="用户邮箱地址") created_at: datetime = Field(default_factory=lambda: datetime.now(UTC), description="账户创建时间") # 模拟数据存储 USERS_DB = { 1: User(id=1, name="Alice Smith", email="[email protected]", created_at=datetime(2023, 1, 10, tzinfo=UTC)), 2: User(id=2, name="Bob Johnson", email="[email protected]", created_at=datetime(2023, 3, 15, tzinfo=UTC)), } # 定义一个检索资源(工具) @app.retrieve(description="根据ID获取单个用户") async def get_user(user_id: int) -> User: """根据用户ID检索用户账户信息。""" user = USERS_DB.get(user_id) if user: return user # 返回一个表示未找到的User对象,或者抛出NotFoundError return User(id=0, name="Not Found", email="[email protected]", created_at=datetime(1970, 1, 1, tzinfo=UTC)) # 运行服务器 if __name__ == "__main__": print("启动My Simple API...") app.run()
2. 运行EnrichMCP服务器: 在终端中,导航到 'myapp.py' 所在的目录,然后执行:
python myapp.py
服务器将启动,并通过标准输出/输入(Stdio)等待MCP客户端连接。如果您希望通过HTTP运行,可以修改 'app.run()' 为 'app.run(transport="streamable-http")'。
3. 从MCP客户端调用API (示例使用 'mcp_use' 客户端): 配置好MCP客户端的JSON文件后,您的MCP客户端(例如,一个LLM代理)就可以发现并调用 'get_user' 这个工具了。
例如,通过 'mcp_use' 库(一个MCP客户端库):
from mcp_use import MCPClient import asyncio import os from pathlib import Path async def main(): # 假设 myapp.py 位于当前运行脚本的同级目录 app_path = Path(__file__).parent / "myapp.py" if not app_path.exists(): print(f"错误: 找不到应用程序文件 '{app_path}'。请确保文件存在或修改路径。") return config = { "mcpServers": { "My Simple API": { "command": "python", "args": [str(app_path)], "description": "一个提供用户数据的简单API。" } } } client = MCPClient(config=config) session = await client.create_session("My Simple API") print("\n调用 'get_user' 工具获取用户ID为1的信息...") result = await session.connector.call_tool("get_user", {"user_id": 1}) print(f"返回结果: {result.content[0].text}") # 预期输出示例: {"id": 1, "name": "Alice Smith", "email": "[email protected]", "created_at": "2023-01-10T00:00:00Z"} print("\n调用 'get_user' 工具获取用户ID为999的信息 (不存在)...") result_not_found = await session.connector.call_tool("get_user", {"user_id": 999}) print(f"返回结果: {result_not_found.content[0].text}") # 预期输出示例: {"id": 0, "name": "Not Found", "email": "[email protected]", "created_at": "1970-01-01T00:00:00Z"} await client.close_all_sessions() print("\n客户端会话已关闭。") if __name__ == "__main__": asyncio.run(main())
要运行上述客户端代码,请将其保存为 'client_example.py' 并在 'myapp.py' 同级目录运行 'python client_example.py'。
信息
分类
开发者工具