自然语言数据库查询工具

Rasdaman MCP Server 是一个允许用户通过自然语言与 rasdaman 数据库交互的工具,将自然语言查询转换为 WCS/WCPS 查询。

  • by rvardiashvili
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 rvardiashvili/rasdaman-mcp

使用说明

Rasdaman MCP服务器

该工具使用户能够在自然语言环境中与rasdaman进行交互。 通过MCP协议将rasdaman功能作为工具公开,LLM可以查询数据库以回答以下问题:

  • “有哪些数据立方体可用?”
  • “‘Sentinel2_10m’的覆盖范围有多大?”
  • “创建2025年6月12日的NDVI图像。”

MCP服务器将这些工具调用转换为rasdaman可以理解的实际WCS/WCPS查询,然后将结果返回给LLM。

安装

pip install rasdaman-mcp

用法

首先,需要通过环境变量配置从MCP服务器到rasdaman的连接:

  • RASDAMAN_URL:rasdaman服务器的URL
  • RASDAMAN_USERNAME:身份验证用户名
  • RASDAMAN_PASSWORD:身份验证密码

或命令行参数 rasdaman-mcp 工具:

  • --rasdaman-url:rasdaman服务器的URL(默认 RASDAMAN_URL env变量或 http://localhost:8080/rasdaman/ows).
  • --username:身份验证用户名(默认 RASDAMAN_USERNAME env变量或 rasguest).
  • --password:设置身份验证密码(默认值 RASDAMAN_PASSWORD env变量或 rasguest).

然后,MCP准备好以两种模式之一与AI代理工具一起使用: stdio (默认)或 http.

stdio 模式

用于与接管管理服务器进程并通过标准输入/输出与之通信的客户端直接集成。 通常,在您的AI工具中,您需要指定要运行的命令 rasdaman-mcp:

rasdaman-mcp --username rasguest --password rasguest --rasdaman-url "..."

在gemini cli中启用它的示例:

gemini mcp add rasdaman-mcp "rasdaman-mcp --username rasguest --password rasguest"

优点:

  • 简单:无需管理单独的服务器进程或端口。
  • 无缝集成:工具在客户端环境中透明地提供给LLM。

http 模式

此模式启动在指定主机/端口上侦听的独立Web服务器,例如:

rasdaman-mcp --transport http --host 127.0.0.1 --port 8000 --rasdaman-url "..."

要在AI代理中配置的MCP服务器URL为 http://127.0.0.1:8000/mcp 与运输 streamable-http. 例如,对于Mistral Vibe,用这样的部分扩展config.toml:

[[mcp_servers]]
name = "rasdaman-mcp"
transport = "streamable-http"
url = "http://127.0.0.1:8000/mcp/"

优点:

  • 可扩展性:MCP服务器可以容器化(例如,使用Docker)并作为单独的微服务部署。
  • 解耦:任何可以说HTTP的客户端(例如。, curlPython脚本、web应用程序、其他LLM客户端)可以与这些工具交互。
  • 测试:允许直接进行API测试和调试,独立于LLM客户端。

AI智能体

一旦AI代理配置了访问权限 rasdaman-mcp,它能够使用多种工具:

  • 列出已配置rasdaman中的覆盖范围
  • 获取特定报道的详细信息
  • 基于自然语言的描述执行处理/分析查询

示例

以下示例演示了使用rasdaman MCP服务器与AI代理的交互。

列表封面

描述覆盖范围

执行查询

查询结果可视化

自然语言查询建议

发展

设置

  1. 克隆 Git 仓库:

    git clone https://github.com/rasdaman/rasdaman-mcp.git
    cd rasdaman-mcp/
    
  2. 创建虚拟环境(如果没有):

    uv venv
    
  3. 激活虚拟环境:

    source .venv/bin/activate
    
  4. 从源代码安装:

    uv pip install -e .
    

核心组件

  • 主要应用(main.py):此脚本初始化FastMCP应用程序。它处理传输选择、rasdaman URL、, 用户名和密码。然后,它实例化 RasdamanActions 类并装饰其方法,以将其作为工具公开。
  • RasdamanActions 班级(rasdaman_actions.py):封装与rasdaman WCS/WCPS端点的所有交互。 它使用服务器URL和凭据进行初始化,其方法包含列出覆盖范围、描述覆盖范围和执行查询的逻辑。
  • WCPS速成课程(wcps_crash_course.py):WCPS语法的简短摘要,允许LLM生成更准确的查询。

定义工具

以下方法作为工具公开:

  • list_coverages():列出所有可用的数据立方体。
  • describe_coverage(coverage_id):检索特定数据立方体的元数据。
  • wcps_query_crash_course():返回WCPS语法速成课程,其中包含示例和最佳实践。
  • execute_wcps_query(wcps_query):执行原始WCPS查询,并直接以字符串(标量或小json)或文件路径返回结果。

文档

要构建文档,请执行以下操作:

# install dependencies
uv pip install '.[docs]'

sphinx-build docs docs/_build

然后,您可以打开 docs/_build/index.html 在浏览器中。

自动化测试

要运行测试,请执行以下操作:

# install dependencies
uv pip install '.[tests]'

pytest

手动测试

与独立HTTP服务器交互 手动地 需要使用特定的3步流程 curl. 这 fastmcp 协议是有状态的,需要显式初始化会话。

  1. 首先,发送一个 initialize 请求。这将返回一个 200 OK 最重要的是, 会话ID mcp-session-id 响应标头(在接下来的步骤中需要)。

    curl -i -X POST \
    -H "Accept: text/event-stream, application/json" \
    -H "Content-Type: application/json" \
    -d '{
          "jsonrpc": "2.0",
          "method": "initialize",
          "params": {
            "protocolVersion": "2024-11-05",
            "capabilities": {},
            "clientInfo": { "name": "curl-client", "version": "1.0.0" }
          },
          "id": 1
        }' \
    "http://127.0.0.1:8000/mcp"
    
  2. 接下来,向服务器发送通知以确认会话已准备就绪。使用步骤1中的会话ID mcp-session-id 头球 此请求不会在响应中生成正文。

    SESSION_ID="<YOUR_SESSION_ID>"
    
    curl -X POST \
    -H "Accept: text/event-stream, application/json" \
    -H "Content-Type: application/json" \
    -H "Mcp-Session-Id: $SESSION_ID" \
    -d '{
          "jsonrpc": "2.0",
          "method": "notifications/initialized"
        }' \
    "http://127.0.0.1:8000/mcp"
    
  3. 最后,您可以使用 tools/call 方法。这 params 对象必须包含 name 工具和 一 arguments 带有该工具参数的对象。服务器将在JSON-RPC响应中返回工具调用的结果。

    SESSION_ID="<YOUR_SESSION_ID>"
    
    # Example: Calling the 'list_coverages' tool
    curl -X POST \
    -H "Accept: text/event-stream, application/json" \
    -H "Content-Type: application/json" \
    -H "Mcp-Session-Id: $SESSION_ID" \
    -d '{
          "jsonrpc": "2.0",
          "method": "tools/call",
          "params": {
            "name": "list_coverages",
            "arguments": {}
          },
          "id": 2
        }' \
    "http://127.0.0.1:8000/mcp"