使用说明

项目简介

attestable-mcp-server 是一个基于 Model Context Protocol (MCP) 的服务器实现,其核心特点是远程可信证明 (Remote Attestation)。这意味着 MCP 客户端可以验证服务器端代码的完整性和运行环境的安全性,从而确保数据交互的机密性和可信度。该项目利用 Intel SGX 等可信执行环境技术和 RA-TLS 协议,为 MCP 应用提供更高级别的安全保障。

主要功能点

  • MCP 服务器核心功能: 实现了 MCP 协议定义的核心服务器功能,包括资源管理、工具注册与执行、Prompt 模板支持等 (虽然仓库代码中目前只展示了工具功能,但框架已搭建完成)。
  • 远程可信证明 (RA-TLS): 使用 RA-TLS 协议,允许 MCP 客户端验证服务器是否运行在可信执行环境 (TEE) 中,以及运行的代码是否与预期一致,增强数据安全性和服务可信度。
  • 基于 Gramine 构建: 利用 Gramine 框架在 SGX 环境中运行服务器,简化 TEE 环境的部署和管理。
  • 支持 SSE 和 Stdio 传输: 提供 SSE (Server-Sent Events) 和 Stdio 两种传输协议,方便不同场景下的客户端连接。
  • Docker 部署: 提供 Docker 镜像,方便快速部署和运行服务器,支持在本地开发环境和安全硬件环境中运行。

安装步骤

  1. 安装依赖: 确保你的系统满足以下依赖:

    • Intel SGX 硬件 (如果需要在 SGX 环境中运行)
    • Gramine (用于 SGX 环境)
    • Python 3.13 或更高版本
    • Ubuntu 22.04 (推荐)
    • Intel SGX SDK & PSW (如果需要在 SGX 环境中运行)
  2. 克隆仓库:

    git clone https://github.com/co-browser/attestable-mcp-server.git
    cd attestable-mcp-server
  3. 构建 Docker 镜像:

    uv sync  # 安装 Python 依赖 (使用 uv 工具,仓库中可能需要先安装 uv)
    docker build -t attestable-mcp-server .
  4. 生成 SGX 密钥 (仅在 SGX 环境中需要):

    gramine-sgx-gen-private-key
  5. 构建 Gramine 镜像 (仅在 SGX 环境中需要):

    git clone https://github.com/gramineproject/gsc docker/gsc
    cd docker/gsc
    uv run ./gsc build-gramine --rm --no-cache -c ../gramine_base.config.yaml gramine_base
    uv run ./gsc build -c ../attestable-mcp-server.config.yaml --rm attestable-mcp-server ../attestable-mcp-server.manifest
    uv run ./gsc sign-image -c ../attestable-mcp-server.config.yaml  attestable-mcp-server "$HOME"/.config/gramine/enclave-key.pem
    uv run ./gsc info-image gsc-attestable-mcp-server

服务器配置

以下是 MCP 客户端连接 'attestable-mcp-server' 时所需的服务器配置信息 (JSON 格式)。客户端需要根据选择的传输协议 (SSE 或 Stdio) 以及运行环境 (安全硬件或本地开发机) 选择相应的配置。

1. SSE 传输 (安全硬件环境 - SGX):

{
  "serverName": "attestable-mcp-server-sse-sgx",
  "command": "docker",
  "args": [
    "run",
    "-itp",
    "--device=/dev/sgx_provision:/dev/sgx/provision",
    "--device=/dev/sgx_enclave:/dev/sgx/enclave",
    "-v", "/var/run/aesmd/aesm.socket:/var/run/aesmd/aesm.socket",
    "-p", "8000:8000",
    "--rm",
    "gsc-attestable-mcp-server",
    "python", "-m", "server", "--transport", "sse"
  ],
  "transport": "sse",
  "baseUrl": "https://your-server-ip:8000/sse"  // 请替换为你的服务器 IP 地址或域名
}

参数注释:

  • 'serverName': 服务器名称,客户端用于标识连接。
  • 'command': 启动服务器的命令,这里使用 'docker'。
  • 'args': Docker 运行参数,包括:
    • 'run': Docker 运行命令。
    • '-itp': 交互式终端,端口映射。
    • '--device=/dev/sgx_provision:/dev/sgx/provision --device=/dev/sgx_enclave:/dev/sgx/enclave': 将 SGX 设备映射到 Docker 容器 (SGX 环境必需)。
    • '-v /var/run/aesmd/aesm.socket:/var/run/aesmd/aesm.socket': 挂载 AESM socket 文件 (SGX 环境必需)。
    • '-p 8000:8000': 将容器 8000 端口映射到主机 8000 端口。
    • '--rm': 容器退出后自动删除。
    • 'gsc-attestable-mcp-server': Gramine SGX 镜像名称。
    • 'python', '-m', 'server', '--transport', 'sse': 在容器内执行的命令,启动 Python 服务器并指定 SSE 传输。
  • 'transport': 传输协议,设置为 'sse'。
  • 'baseUrl': SSE 连接的基础 URL,客户端通过此 URL 与服务器建立 SSE 连接。请务必将 'your-server-ip' 替换为你的服务器实际 IP 地址或域名。 由于使用了 RA-TLS,请使用 'https' 协议。

2. SSE 传输 (本地开发机):

{
  "serverName": "attestable-mcp-server-sse-local",
  "command": "docker",
  "args": [
    "run",
    "-p", "8000:8000",
    "--rm",
    "gsc-attestable-mcp-server",
    "python", "-m", "server", "--transport", "sse"
  ],
  "transport": "sse",
  "baseUrl": "http://localhost:8000/sse" // 本地开发机可以使用 http
}

参数注释: 与 SGX 环境配置类似,但移除了 SGX 相关的设备和 socket 挂载参数。'baseUrl' 可以使用 'http' 协议进行本地测试。

3. Stdio 传输 (任何环境):

{
  "serverName": "attestable-mcp-server-stdio",
  "command": "docker",
  "args": [
    "run",
    "--rm",
    "gsc-attestable-mcp-server",
    "python", "-m", "server" // 默认 transport 为 stdio,可省略 "--transport stdio"
  ],
  "transport": "stdio"
}

参数注释:

  • 'transport': 传输协议,设置为 'stdio'。
  • 无需 'baseUrl',Stdio 传输通过标准输入/输出流进行通信。

注意:

  • 远程证明验证: 要充分利用远程证明功能,MCP 客户端需要支持 RA-TLS 协议,并配置相应的验证参数 (仓库中 'src/gramine-ratls/verify.py' 提供了客户端验证的示例代码,但需要集成到 MCP 客户端中)。
  • 安全证书: 在生产环境中,建议配置有效的 SSL/TLS 证书,并使用 HTTPS 协议,以确保通信安全。 (当前配置使用了 'gramine-ratls' 生成的证书,用于 RA-TLS,但可能需要根据实际情况进行调整)。
  • 工具功能: 当前仓库提供的示例服务器仅实现了一个 'fetch' 工具,你可以根据 MCP 协议规范扩展更多工具和资源管理功能。

基本使用方法

  1. 启动 MCP 服务器: 根据上述服务器配置,使用 MCP 客户端配置中提供的 'command' 和 'args' 启动服务器。例如,对于 SSE 传输 (安全硬件环境),在终端执行配置中 'args' 数组中的命令即可。

  2. 配置 MCP 客户端: 在你的 MCP 客户端应用中,配置连接到 'attestable-mcp-server'。 你需要提供服务器配置信息 (JSON) 给客户端,客户端会根据配置信息与服务器建立连接并进行通信。

  3. 调用工具: 客户端连接成功后,可以向服务器发送 MCP 请求,例如调用 'fetch' 工具来获取网页内容。具体的请求格式和参数需要参考 MCP 协议文档和客户端 SDK 的使用说明。

例如,使用 MCP 客户端 SDK (如 Python SDK) 调用 'fetch' 工具的示例代码 (伪代码,具体代码请参考 MCP 客户端 SDK 文档):

# 假设 client 是已连接到 MCP 服务器的 MCP 客户端实例
result = client.call_tool(
    tool_name="fetch",
    arguments={"url": "https://www.example.com"}
)
print(result) # 打印获取的网页内容

请参考 MCP 协议文档和 MCP 客户端 SDK 的文档,了解更详细的使用方法和 API。

信息

分类

AI与计算