GraphQL MCP服务器
一个模型上下文协议(MCP)服务器,使LLM能够与GraphQL API交互。此服务器通过GraphQL端点提供自省、查询和修改数据的工具。
当前版本: 1.5.0
特性
核心GraphQL工具
- GraphQL反思:发现模式、类型、查询、突变和字段
- 查询执行:使用变量执行GraphQL查询
- 突变支持:通过GraphQL突变执行数据修改
- 模式检索:获取SDL格式的人类可读模式
- 查询透明度:每个响应都包括所使用的查询/变异和结果
实用工具
- 纪元转换器:使用时区支持将Unix时间戳转换为人类可读的日期/时间
- NTP时间:通过时钟偏移计算从NTP服务器获取准确的时间
- IP信息:获取IP地理位置、时区和网络详细信息(通过IP-api.com,免费)
- 网页搜索:使用DuckDuckGo搜索网页(免费,无需API密钥)
基础设施
- 多个传输:支持stdio和HTTP/SSE传输
- Docker支持:使用Docker和Docker Compose在容器中运行
- Kubernetes就绪:完整的K8s包含HPA、网络策略等
- OAuth 2.1身份验证:GitHub OAuth,基于用户/组织的访问控制
- API令牌认证:简单的基于令牌的身份验证选项
- MCP系统提示:内置GraphQL帮助提示
- 查询日志记录:查询和身份验证事件的审核日志记录
Docker快速入门
# Clone and enter directory
cd /github/Graphql_MCP
# Set your GraphQL endpoint
export GRAPHQL_ENDPOINT="https://rickandmortyapi.com/graphql"
# Build and run
docker-compose up -d
# Test it
curl http://localhost:8000/health
curl http://localhost:8000/tools看 医生_SSE_GUIDE.md 获取完整的Docker和SSE文档。
看 KUBERNETES_GUIDE.md Kubernetes部署说明。
看 用于GitHub OAuth身份验证设置。
安装(无Docker)
- 克隆存储库:
cd /github/Graphql_MCP- 安装依赖项:
python3 -m venv venv
source venv/bin/activate
pip install -r requirements.txt- 配置环境变量:
cp .env.example .env
# Edit .env with your GraphQL endpoint and credentials配置
创建一个 .env 包含以下变量的文件:
# Required: Your GraphQL endpoint
GRAPHQL_ENDPOINT=https://api.example.com/graphql
# Optional: Authentication token for GraphQL API
GRAPHQL_AUTH_TOKEN=your_bearer_token_here
# Optional: Custom headers as JSON for GraphQL API
GRAPHQL_HEADERS={"X-Custom-Header": "value"}
# Optional: HTTP server configuration (for HTTP/SSE transport)
MCP_HOST=0.0.0.0
MCP_PORT=8000
# Optional: API Token Authentication (simple token-based auth)
API_TOKENS=token1,token2,token3
# Optional: GitHub OAuth (for user/org-based access control)
GITHUB_CLIENT_ID=your_github_client_id
GITHUB_CLIENT_SECRET=your_github_client_secret
GITHUB_ALLOWED_ORGS=your-org-name
GITHUB_ALLOWED_USERS=username1,username2
# Optional: Logging configuration
LOG_LEVEL=INFO
STRUCTURED_LOGGING=false
# Optional: Redis for session storage (for distributed deployments)
REDIS_URL=redis://localhost:6379用法
选项1:克劳德桌面集成(推荐)
使用此MCP服务器的最简单方法是使用Claude Desktop。将以下配置添加到您的Claude Desktop设置中:
步骤1:找到您的Claude Desktop配置文件
- macOS:
~/Library/Application Support/Claude/claude_desktop_config.json - 视窗:
%APPDATA%\Claude\claude_desktop_config.json - Linux:
~/.config/Claude/claude_desktop_config.json
步骤2:添加MCP服务器配置
编辑配置文件并添加GraphQL MCP服务器:
{
"mcpServers": {
"graphql": {
"command": "/path/to/Graphql_MCP/venv/bin/python",
"args": ["/path/to/Graphql_MCP/server.py"],
"env": {
"GRAPHQL_ENDPOINT": "https://your-graphql-api.com/graphql",
"GRAPHQL_AUTH_TOKEN": "your_optional_bearer_token"
}
}
}
}步骤3:示例配置
公共API(Rick和Morty):
{
"mcpServers": {
"graphql": {
"command": "/github/Graphql_MCP/venv/bin/python",
"args": ["/github/Graphql_MCP/server.py"],
"env": {
"GRAPHQL_ENDPOINT": "https://rickandmortyapi.com/graphql"
}
}
}
}GitHub GraphQL API:
{
"mcpServers": {
"github-graphql": {
"command": "/github/Graphql_MCP/venv/bin/python",
"args": ["/github/Graphql_MCP/server.py"],
"env": {
"GRAPHQL_ENDPOINT": "https://api.github.com/graphql",
"GRAPHQL_AUTH_TOKEN": "ghp_your_github_token"
}
}
}
}Hasura/带标题的自定义API:
{
"mcpServers": {
"hasura": {
"command": "/github/Graphql_MCP/venv/bin/python",
"args": ["/github/Graphql_MCP/server.py"],
"env": {
"GRAPHQL_ENDPOINT": "https://your-hasura-instance.hasura.app/v1/graphql",
"GRAPHQL_HEADERS": "{\"x-hasura-admin-secret\": \"your-secret\"}"
}
}
}
}步骤4:重新启动克劳德桌面
保存配置文件后,完全重新启动Claude Desktop以加载新的MCP服务器。
步骤5:验证连接
在Claude Desktop中,您现在应该可以看到可用的GraphQL工具。试着问克劳德:
- “有哪些GraphQL查询可用?”
- “显示GraphQL模式”
- “查询API中的所有字符”
选项2:标准传输(适用于其他MCP客户端)
使用stdio传输运行服务器:
python server.py此模式适用于与通过stdin/stdout通信的MCP客户端直接集成。
选项3:HTTP/SSE传输(用于基于web的客户端和VS代码)
使用HTTP和服务器发送事件运行服务器:
python server_mcp_http_stateful.py服务器将于启动 http://0.0.0.0:8000 (可通过环境变量配置)。
配置VS代码以通过HTTP使用MCP
- 启动MCP服务器 (见上文或使用Docker Compose)
- 配置VS代码设置 -打开设置JSON(
Cmd/Ctrl + ,→ 打开设置JSON图标)并添加:
{
"mcp": {
"servers": {
"graphql": {
"type": "http",
"url": "http://localhost:8000"
}
}
}
}- 重新启动VS代码 加载MCP服务器
- 验证连接 在VS Code终端中:
curl http://localhost:8000/health对于远程服务器,请使用 http://your-server-ip:8000。有关详细的VS代码配置、网络设置和故障排除,请参阅 VSCODE_集成.md.
HTTP端点
GET /health-健康检查GET /tools-列出可用工具POST /execute-执行工具GET /sse-服务器发送的事件流
HTTP请求示例
# List available tools
curl http://localhost:8000/tools
# Execute introspection
curl -X POST http://localhost:8000/execute \
-H "Content-Type: application/json" \
-d '{"tool": "graphql_introspection", "arguments": {}}'
# Execute a query
curl -X POST http://localhost:8000/execute \
-H "Content-Type: application/json" \
-d '{
"tool": "graphql_query",
"arguments": {
"query": "{ users { id name email } }"
}
}'
# Execute a query with variables
curl -X POST http://localhost:8000/execute \
-H "Content-Type: application/json" \
-d '{
"tool": "graphql_query",
"arguments": {
"query": "query GetUser($id: ID!) { user(id: $id) { id name email } }",
"variables": {"id": "123"}
}
}'可用工具
1.graphql_观察
执行GraphQL自检以发现完整的模式。
参数: 无
退货:
{
"query_used": "GraphQL Introspection Query",
"result": { /* Full introspection result */ }
}2.graphql_get_schema
获取SDL格式的人类可读GraphQL架构。
参数: 无
退货:
{
"query_used": "GraphQL Introspection Query (converted to SDL)",
"result": {
"schema": "type Query { ... }"
}
}3.graphql_query
执行GraphQL查询。
参数:
query(string,必填):要执行的GraphQL查询variables(object,可选):查询的变量
退货:
{
"query_used": "{ users { id name } }",
"variables": null,
"result": { /* Query result */ }
}4.graphql_mutation
执行GraphQL变异。
参数:
mutation(string,必填):要执行的GraphQL变异variables(object,可选):突变变量
退货:
{
"mutation_used": "mutation { createUser(input: {...}) { id } }",
"variables": {...},
"result": { /* Mutation result */ }
}5.划时代可读
将Unix纪元时间戳转换为具有时区支持的人类可读日期/时间格式。
参数:
epoch(数字,必填):Unix纪元时间戳(自1970年1月1日以来的秒数)format(string,可选):strftime格式字符串(默认值:'%Y-%m-%d %H:%M:%S UTC')timezone(字符串,可选):时区名称(默认值:'UTC').示例:'US/Eastern','Europe/London','Asia/Tokyo'
退货:
{
"epoch": 1703894400,
"readable": "2023-12-30 00:00:00 UTC",
"format": "%Y-%m-%d %H:%M:%S UTC",
"timezone": "UTC"
}6.ntp_te
通过可选的时钟偏移计算从NTP(网络时间协议)服务器获取准确的时间。
参数:
server(字符串,可选):要查询的NTP服务器(默认值:'dk.pool.ntp.org').示例:'time.google.com','pool.ntp.org'include_offset(布尔值,可选):包括本地时钟偏移计算(默认值:true)
退货:
{
"ntp_time": "2025-12-30 12:34:56.789 UTC",
"server": "dk.pool.ntp.org",
"local_time": "2025-12-30 12:34:56.123 UTC",
"offset_seconds": 0.666
}7.ip_info
使用IP-api.com获取IP信息,包括时区、位置和网络详细信息(免费,不需要api密钥)。速率限制:45个请求/分钟。
参数:
ip(字符串,可选):要查找的IP地址(例如。,'8.8.8.8').如果未提供,则使用MCP客户端的IP地址。
退货:
{
"ip": "8.8.8.8",
"country": "United States",
"city": "Mountain View",
"timezone": "America/Los_Angeles",
"local_time": "2025-12-30 04:34:56",
"isp": "Google LLC",
"lat": 37.386,
"lon": -122.0838
}8.网络搜索
使用DuckDuckGo(免费,无需API密钥)搜索网页。返回包含标题、URL和片段的搜索结果。
参数:
query(string,必填):搜索查询字符串max_results(整数,可选):返回的最大结果数(默认值:10,最大值:25)
退货:
{
"status": "success",
"query": "graphql best practices",
"results_count": 10,
"results": [
{
"position": 1,
"title": "GraphQL Best Practices",
"url": "https://example.com/graphql-best-practices",
"snippet": "Learn the best practices for designing GraphQL APIs..."
}
]
}示例工作流
发现模式
- 使用
graphql_introspection获取完整的模式结构 - 或使用
graphql_get_schema为了获得更易读的SDL格式
查询数据
- 首先,反思以了解可用的查询
- 使用以下命令执行查询
graphql_query使用适当的字段 - 使用变量进行动态查询
变异数据
- 通过内省发现可用的突变
- 使用以下方法执行突变
graphql_mutation - 始终检查返回的查询/变异以进行调试
时间和位置实用程序
- 使用
epoch_to_readable将Unix时间戳转换为人类可读格式 - 使用
ntp_time获取准确的网络时间并检查时钟同步 - 使用
ip_info查找IP地址的地理位置和时区信息
网络研究
- 使用
web_search查找文档、教程或最新信息 - 结合GraphQL查询,用外部信息丰富数据
MCP系统提示
服务器提供内置系统提示,以实现一致的LLM行为:
- graphql助手:GraphQL API交互帮助的系统提示
- graphql资源管理器:用于探索和发现GraphQL模式的系统提示
安全考虑
- 将敏感令牌存储在
.env文件(从不提交版本控制) - 在生产环境中为GraphQL端点使用HTTPS
- 配置适当的身份验证标头
- 在生产环境中执行查询之前,对其进行审查和清理
- 为生产部署启用OAuth 2.1或API令牌身份验证
- 使用结构化日志记录(
STRUCTURED_LOGGING=true)用于SIEM集成 - 审查
logs/queries.log和logs/logons.log用于审计跟踪 - 默认情况下启用速率限制以防止滥用
故障排除
连接错误
- 验证
GRAPHQL_ENDPOINT正确且可访问 - 如果需要,请检查身份验证令牌
- 确保与GraphQL服务器的网络连接
查询错误
- 回顾
query_used调试响应中的字段 - 根据架构验证查询语法
- 检查变量类型是否符合架构要求
发展
运行测试
# Add your test commands here
pytest贡献
- 克隆该仓库
- 创建要素分支
- 进行更改
- 提交拉取请求
许可证
MIT许可证
脚本和实用程序
设置、测试和示例的帮助脚本在 脚本/ 目录:
- setup.sh -自动化环境设置
- run.sh -方便的服务器运行程序
- test_setup.py -设置验证工具
- example_client.py -使用示例
看 scripts/README.md 了解详细的使用说明。
文档
有关综合文档,请参阅 docs/ 目录:
支持
有关问题和疑问,请在GitHub上打开问题。
