mcpField
Y
Yet Sparql Mcp Server

Yet Sparql Mcp Server

本地服务
github.com/yet-market数据库574 周前更新

关于 Yet Sparql Mcp Server

Yet Sparql Mcp Server 将 MCP 客户端连接到可配置的 SPARQL 端点,支持各种有效的 SPARQL 查询,并提供多种结果格式和缓存选项,可通过 stdio 或 HTTP 部署。

主要功能

  1. 01执行 SELECT、ASK、CONSTRUCT、DESCRIBE 查询
  2. 02输出标准 JSON、简化 JSON 或表格
  3. 03使用 LRU、LFU 或 FIFO 缓存结果
  4. 04配置端点、超时和缓存参数
  5. 05支持 stdio、HTTP、守护进程和 systemd

适用场景

  1. 01通过 MCP 客户端查询语义数据
  2. 02将查询结果整理为应用表格
  3. 03缓存重复查询以减少端点请求

MCP 相关

向 MCP 客户端提供执行 SPARQL 查询的 `query` 工具,以及管理缓存的 `cache` 工具。支持 stdio 和 HTTP 传输。

配置

本地服务的配置在各客户端中通用,复制后粘贴到客户端的 MCP 配置文件即可。

暂未收录安装方式

我们还没有获取到这个服务的安装包或远程地址,请按项目 README 中的说明安装。

代码仓库

工具

还没有获取到工具列表

本地服务需要在你的电脑上运行后才能读取工具,维护者暂未提供工具列表。

详细介绍

MCP SPARQL Server

License: AGPL-3.0 Python: 3.8+

一款灵活而强大的 SPARQL MCP(Model Context Protocol)服务

🌟 概述

MCP SPARQL Server 是一款高性能、可配置的服务,可连接到任意 SPARQL 端点,并提供结果格式化和缓存等增强功能。它基于 FastMCP 框架构建,实现了 Model Context Protocol(MCP),为 AI 助手提供无缝接口,以查询语义数据。

✨ 功能

  • 通用端点支持:连接到任意兼容 SPARQL 的端点
  • 完整的 SPARQL 支持:执行任何有效的 SPARQL 查询(SELECT、ASK、CONSTRUCT、DESCRIBE)
  • 智能结果格式化:
    • 标准 JSON(兼容标准 SPARQL 客户端)
    • 简化 JSON(更便于在应用中使用)
    • 表格格式(可直接用于 UI 表格展示)
  • 高性能缓存:
    • 多种缓存策略(LRU、LFU、FIFO)
    • 可配置的 TTL(生存时间)
    • 缓存管理工具
  • 灵活的部署选项:
    • 使用 stdio 或 HTTP 传输,以前台模式运行
    • 作为后台守护进程运行
    • 部署为 systemd 服务
    • HTTP 服务模式,可集成 nginx 反向代理
  • 全面的配置方式:
    • 命令行参数
    • 环境变量
    • 无硬编码值

📋 要求

  • Python 3.8 或更高版本
  • SPARQLWrapper 库
  • fastmcp 框架
  • 用于配置的 pydantic
  • 用于后台运行的 python-daemon

🚀 安装

从源代码安装
# Clone the repository
git clone https://github.com/yet-market/yet-sparql-mcp-server.git
cd yet-sparql-mcp-server

# Install dependencies
pip install -r requirements.txt

# Install the package
pip install -e .
从 PyPI 安装
pip install mcp-server-sparql
使用安装脚本

如需完整安装并配置 systemd 服务:

# Download the repository
git clone https://github.com/yet-market/yet-sparql-mcp-server.git
cd yet-sparql-mcp-server

# Run the installation script (as root for systemd service)
sudo ./install.sh

安装程序会自动:

  • 设置虚拟环境并安装依赖
  • 创建并启动 systemd 服务
  • 提供便于管理的脚本
  • 配置可与 nginx 集成的 HTTP 服务
快速管理

安装后,使用提供的脚本:

# Check status
./status.sh

# Start/stop services
./start.sh [stdio|http]    # Start service (http is default)
./stop.sh [stdio|http]     # Stop service
./logs.sh [stdio|http]     # View logs

# Examples
./start.sh http            # Start HTTP service for nginx
./logs.sh http             # View HTTP service logs
./test.sh                  # Test server functionality
./stop.sh                  # Stop all services
测试安装

使用内置测试套件测试服务:

# Run comprehensive tests
./test.sh

# Run specific tests
./test.sh endpoint         # Test HTTP connectivity
./test.sh service          # Test service status
./test.sh config           # Test configuration
./test.sh mcp              # Test MCP protocol
./test.sh client           # Test with FastMCP client
./test.sh info             # Show connection info

测试脚本会验证:

  • ✅ 服务状态和运行状况
  • ✅ HTTP 端点连通性
  • ✅ MCP 协议兼容性
  • ✅ 配置有效性
  • ✅ SPARQL 端点可达性
  • ✅ FastMCP 客户端集成

🔍 用法

基本用法(stdio 传输)

指定 SPARQL 端点以启动服务:

python server.py --endpoint https://dbpedia.org/sparql
HTTP 服务模式(用于 nginx/网页集成)

将服务作为 HTTP 服务运行:

# Basic HTTP server
python server.py --transport http --endpoint https://dbpedia.org/sparql

# Custom host and port
python server.py --transport http --host 0.0.0.0 --port 8080 --endpoint https://dbpedia.org/sparql

# Using environment variables
export MCP_TRANSPORT=http
export MCP_HOST=0.0.0.0
export MCP_PORT=8000
export SPARQL_ENDPOINT=https://dbpedia.org/sparql
python server.py
作为守护进程运行

将服务作为后台进程运行(stdio 传输):

python server.py --endpoint https://dbpedia.org/sparql --daemon \
  --log-file /var/log/mcp-sparql.log \
  --pid-file /var/run/mcp-sparql.pid

将 HTTP 服务作为守护进程运行:

python server.py --transport http --host 0.0.0.0 --port 8000 \
  --endpoint https://dbpedia.org/sparql --daemon \
  --log-file /var/log/mcp-sparql.log \
  --pid-file /var/run/mcp-sparql.pid
使用 Systemd

如果安装时启用了 systemd 支持:

  1. 在环境文件中配置端点:

    sudo nano /etc/mcp-sparql/env
    
  2. 启动服务:

    sudo systemctl start sparql-server
    
  3. 设置为开机启动:

    sudo systemctl enable sparql-server
    
客户端查询示例

启动服务后,可通过任何兼容 MCP 的客户端或 FastMCP 客户端使用该服务:

使用 FastMCP 客户端和 stdio 传输(Python)
import asyncio
from fastmcp.client import Client, PythonStdioTransport

async def query_server():
    # Connect to the server
    transport = PythonStdioTransport(
        script_path="server.py",
        args=["--endpoint", "https://dbpedia.org/sparql"]
    )
    
    async with Client(transport) as client:
        # Execute a SPARQL query
        result = await client.call_tool("query", {
            "query_string": "SELECT * WHERE { ?s ?p ?o } LIMIT 5",
            "format": "simplified"
        })
        
        print(result[0].text)

asyncio.run(query_server())
使用 FastMCP 客户端和 HTTP 传输(Python)
import asyncio
from fastmcp.client import Client, HttpTransport

async def query_server():
    # Connect to HTTP server
    transport = HttpTransport("http://localhost:8000")
    
    async with Client(transport) as client:
        # Execute a SPARQL query
        result = await client.call_tool("query", {
            "query_string": "SELECT * WHERE { ?s ?p ?o } LIMIT 5",
            "format": "simplified"
        })
        
        print(result[0].text)

asyncio.run(query_server())
使用不同格式进行查询
# JSON format (default)
result = await client.call_tool("query", {
    "query_string": "SELECT * WHERE { ?s ?p ?o } LIMIT 5",
    "format": "json"
})

# Tabular format
result = await client.call_tool("query", {
    "query_string": "SELECT * WHERE { ?s ?p ?o } LIMIT 5",
    "format": "tabular"
})
缓存管理
# Get cache statistics
cache_stats = await client.call_tool("cache", {"action": "stats"})

# Clear the cache
cache_clear = await client.call_tool("cache", {"action": "clear"})

⚙️ 配置

命令行参数
参数描述默认值
--endpoint URLSPARQL 端点 URL必需
--timeout SECONDS请求超时时间(秒)30
--format FORMAT结果格式(json、simplified、tabular)json
--cache-enabled BOOL启用结果缓存true
--cache-ttl SECONDS缓存存活时间(秒)300
--cache-max-size SIZE最大缓存大小100
--cache-strategy STRATEGY缓存替换策略(lru、lfu、fifo)lru
--pretty-print美化 JSON 输出false
--include-metadata BOOL在结果中包含查询元数据true
--daemon作为后台守护进程运行false
--log-file FILE作为守护进程运行时的日志文件位置/var/log/mcp-sparql-server.log
--pid-file FILE作为守护进程运行时的 PID 文件位置/var/run/mcp-sparql-server.pid
--transport TRANSPORT传输类型(stdio 或 http)stdio
--host HOSTHTTP 服务要绑定的主机localhost
--port PORTHTTP 服务要绑定的端口8000
环境变量
变量描述默认值
SPARQL_ENDPOINTSPARQL 端点 URL无(必需)
SPARQL_TIMEOUT请求超时时间(秒)30
SPARQL_FORMAT默认结果格式json
SPARQL_CACHE_ENABLED启用缓存true
SPARQL_CACHE_TTL缓存存活时间(秒)300
SPARQL_CACHE_MAX_SIZE最大缓存大小100
SPARQL_CACHE_STRATEGY缓存替换策略lru
SPARQL_PRETTY_PRINT美化 JSON 输出false
SPARQL_INCLUDE_METADATA在结果中包含查询元数据true
MCP_TRANSPORT传输类型(stdio 或 http)stdio
MCP_HOSTHTTP 服务要绑定的主机localhost
MCP_PORTHTTP 服务要绑定的端口8000

🌐 Nginx 集成

使用 HTTP 传输时,可以将服务与 nginx 集成,作为反向代理:

1. 以 HTTP 模式启动服务
python server.py --transport http --host localhost --port 8000 --endpoint https://your-sparql-endpoint.com/sparql
2. 配置 nginx

将此配置添加到 nginx 服务块中:

upstream mcp_sparql {
    server localhost:8000;
    # Add more servers for load balancing if needed
    # server localhost:8001;
    # server localhost:8002;
}

server {
    listen 80;
    server_name your-domain.com;

    location /api/sparql {
        proxy_pass http://mcp_sparql;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        
        # Optional: Add CORS headers
        add_header Access-Control-Allow-Origin *;
        add_header Access-Control-Allow-Methods "GET, POST, OPTIONS";
        add_header Access-Control-Allow-Headers "Content-Type, Authorization";
    }
}
3. 使用 systemd 部署到生产环境

为 HTTP 模式创建 systemd 服务:

# /etc/systemd/system/mcp-sparql-http.service
[Unit]
Description=MCP SPARQL Server (HTTP)
After=network.target

[Service]
Type=simple
User=mcp-sparql
Group=mcp-sparql
WorkingDirectory=/opt/mcp-sparql
Environment=MCP_TRANSPORT=http
Environment=MCP_HOST=localhost
Environment=MCP_PORT=8000
Environment=SPARQL_ENDPOINT=https://your-sparql-endpoint.com/sparql
ExecStart=/opt/mcp-sparql/venv/bin/python server.py
Restart=always
RestartSec=3

[Install]
WantedBy=multi-user.target

启用并启动服务:

sudo systemctl enable mcp-sparql-http
sudo systemctl start mcp-sparql-http

📊 结果格式

服务支持三种不同的输出格式:

1. JSON 格式(默认)

返回标准的 SPARQL JSON 结果格式,并可选择包含元数据。

{
  "head": {
    "vars": ["s", "p", "o"]
  },
  "results": {
    "bindings": [
      {
        "s": { "type": "uri", "value": "http://example.org/resource" },
        "p": { "type": "uri", "value": "http://example.org/property" },
        "o": { "type": "literal", "value": "Example Value" }
      }
    ]
  },
  "metadata": {
    "variables": ["s", "p", "o"],
    "count": 1,
    "query": "SELECT * WHERE { ?s ?p ?o } LIMIT 1"
  }
}
2. 简化格式

返回更易于使用的简化 JSON 结构,将变量绑定转换为简单的键值对象。

{
  "type": "SELECT",
  "results": [
    {
      "s": "http://example.org/resource",
      "p": "http://example.org/property",
      "o": "Example Value"
    }
  ],
  "metadata": {
    "variables": ["s", "p", "o"],
    "count": 1,
    "query": "SELECT * WHERE { ?s ?p ?o } LIMIT 1"
  }
}
3. 表格格式

以包含列和行的表格形式返回结果,适合用于表格展示。

{
  "type": "SELECT",
  "columns": [
    { "name": "s", "label": "s" },
    { "name": "p", "label": "p" },
    { "name": "o", "label": "o" }
  ],
  "rows": [
    [
      "http://example.org/resource",
      "http://example.org/property",
      "Example Value"
    ]
  ],
  "metadata": {
    "variables": ["s", "p", "o"],
    "count": 1,
    "query": "SELECT * WHERE { ?s ?p ?o } LIMIT 1"
  }
}

🔄 缓存策略

服务支持三种缓存替换策略:

1. LRU(最近最少使用)

优先淘汰最近最少访问的项目。这是默认策略,适用于大多数场景,因为它会优先将最近访问的项目保留在缓存中。

2. LFU(最不经常使用)

优先淘汰访问频率最低的项目。此策略适用于某些查询远比其他查询常见的场景,因为它会优先将经常访问的项目保留在缓存中。

3. FIFO(先进先出)

无论访问模式如何,都优先淘汰最早加入的项目。此策略较为简单,在需要纯粹基于时间的缓存方式时很有用。

🔍 高级 SPARQL 示例

服务支持所有 SPARQL 功能。以下是一些可尝试的示例查询:

基本三元组模式
SELECT * WHERE { ?s ?p ?o } LIMIT 10
按属性类型筛选
PREFIX rdf: <http://www.w3.org/1999/02/22-rdf-syntax-ns#>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?subject ?label
WHERE {
    ?subject rdf:type rdfs:Class ;
             rdfs:label ?label .
}
LIMIT 10
使用正则表达式
PREFIX foaf: <http://xmlns.com/foaf/0.1/>

SELECT ?person ?name
WHERE {
    ?person foaf:name ?name .
    FILTER(REGEX(?name, "Smith", "i"))
}
LIMIT 10
包含多个模式的复杂查询
PREFIX dbo: <http://dbpedia.org/ontology/>
PREFIX dbp: <http://dbpedia.org/property/>
PREFIX rdfs: <http://www.w3.org/2000/01/rdf-schema#>

SELECT ?city ?name ?population ?country ?countryName
WHERE {
    ?city a dbo:City ;
          rdfs:label ?name ;
          dbo:population ?population ;
          dbo:country ?country .
    ?country rdfs:label ?countryName .
    FILTER(?population > 1000000)
    FILTER(LANG(?name) = 'en')
    FILTER(LANG(?countryName) = 'en')
}
ORDER BY DESC(?population)
LIMIT 10

⚠️ 故障排除

常见问题
  • 连接被拒绝:检查 SPARQL 端点 URL 是否正确且可访问
  • 查询超时:使用 --timeout 选项增大超时时间
  • 大型结果集导致内存问题:在查询中添加 LIMIT 子句,或减小缓存大小
  • 日志/PID 文件权限被拒绝:检查目录权限,或使用适当的权限运行
日志记录

以前台模式运行时,日志会输出到控制台。以守护进程模式运行时,日志会写入指定的日志文件(默认:/var/log/mcp-sparql-server.log)。

如需提高详细程度,可以在源代码中设置 Python 日志级别。

🛠️ 开发

项目结构
mcp-server-sparql/
├── sparql_server/             # Main package
│   ├── core/                  # Core functionality
│   │   ├── __init__.py        # Package exports
│   │   ├── config.py          # Configuration management
│   │   └── server.py          # Main SPARQL server
│   ├── formatters/            # Result formatters
│   │   ├── __init__.py        # Package exports
│   │   ├── formatter.py       # Base formatter class
│   │   ├── json_formatter.py  # JSON formatter
│   │   ├── simplified_formatter.py # Simplified JSON formatter
│   │   └── tabular_formatter.py # Tabular formatter
│   ├── cache/                 # Caching implementation
│   │   ├── __init__.py        # Package exports
│   │   ├── query_cache.py     # Base cache interface
│   │   ├── lru_cache.py       # LRU cache implementation
│   │   ├── lfu_cache.py       # LFU cache implementation
│   │   └── fifo_cache.py      # FIFO cache implementation
│   └── __init__.py            # Package exports
├── server.py                  # Main entry point
├── setup.py                   # Package setup
├── install.sh                 # Installation script
├── requirements.txt           # Python dependencies
├── sparql-server.service      # Systemd service file
├── README.md                  # This file
└── LICENSE                    # License file
运行测试
# Test stdio transport
python test_sparql_server.py

# Test HTTP transport (start server first)
# Terminal 1:
python server.py --transport http --endpoint https://dbpedia.org/sparql
# Terminal 2:
# Run HTTP-specific tests (if available)

🔒 安全注意事项

  • 服务不实现身份验证或授权,而是依赖底层 SPARQL 端点的安全性
  • 用于生产环境时,请考虑将其部署在安全代理之后
  • 请谨慎处理不受信任的查询,因为它们可能会消耗大量资源

📄 许可证

本项目采用双重许可模式:

  • 开源:开源使用适用 GNU Affero General Public License v3.0 (AGPL-3.0)
  • 商业:商业或专有用途可使用专有商业许可证

详情请参阅 LICENSE 文件。

本软件由 Temkit Sid-Ali 为 Yet.lu 构思并开发,并由 Claude (Anthropic)、GitHub Copilot/Codex (OpenAI) 和 GPT-o3 (OpenAI) 提供 AI 辅助。

🚀 路线图

我们对未来有令人期待的规划!查看详细路线图,了解接下来的计划,包括:

  • 🔒 增强安全性和身份验证
  • 🌐 用于探索查询的 Web 界面
  • 🤖 由 AI 驱动的自然语言转 SPARQL
  • 📊 高级数据可视化和分析
  • 🏢 企业级功能和可扩展性改进

🤝 参与贡献

欢迎贡献!请随时提交 Pull Request。

  1. Fork 此代码库
  2. 创建功能分支(git checkout -b feature/amazing-feature)
  3. 提交更改(git commit -m 'Add some amazing feature')
  4. 推送到分支(git push origin feature/amazing-feature)
  5. 发起 Pull Request

请参阅我们的贡献指南,了解详细的开发环境设置和规范。

🙏 致谢

本项目基于多个优秀的开源项目构建:

  • FastMCP - Joel Lowin 开发的高级 Python 框架,用于构建 MCP 服务和客户端
  • SPARQLWrapper - RDFLib 团队开发的 Python SPARQL 端点接口
  • Pydantic - Samuel Colvin 和 Pydantic 团队开发的使用 Python 类型提示进行数据验证的工具
  • python-daemon - 用于创建 Unix 守护进程的库

特别感谢:

  • Model Context Protocol (MCP) 社区开发了该协议规范
  • Anthropic 在 AI 助手和 MCP 生态系统方面所做的工作
  • 语义网和RDF社区所做的奠基性工作
  • W3C 制定了 SPARQL 规范和标准
  • AI 开发伙伴:
    • Claude (Anthropic) - 主要开发助手,负责架构设计、代码实现和文档编写
    • GitHub Copilot/Codex (OpenAI) - 代码补全和加速开发
    • GPT-o3 (OpenAI) - 提供高级推理和问题解决协助

📬 联系方式


由 Temkit Sid-Ali 倾心打造,献给 Yet.lu
与 Claude (Anthropic)、GitHub Copilot/Codex 和 GPT-o3 (OpenAI) 共同开发
© 2025 Yet.lu - 保留所有权利

评论

支持 Markdown

第一次接触 MCP?

从协议是什么,到在客户端里装上第一个服务,这几条回答覆盖了大多数入门问题。

一个开放协议,规定了 AI 应用如何以统一方式连接外部工具与数据源。客户端负责与模型对话,MCP 服务负责提供工具、资源和提示模板,两者通过标准消息通信,同一个服务可以被不同客户端复用。