Claude Platform Docs
MessagesMCP 隧道

MCP 隧道快速入门

使用本地 Docker Compose 部署将 Claude 连接到私有 MCP 服务器。

本快速入门将带您从零开始,直到 Claude 通过隧道调用私有 MCP 服务器。它使用 Docker Compose 并采用手动凭证配置(credential provisioning),这是本地测试的最短路径。对于生产部署,请参阅使用 Helm 部署使用 Docker Compose 部署

您将构建的内容

一个由两个容器组成的隧道栈(tunnel stack,包括代理(proxy)和 cloudflared),以及一个与之并行运行的示例 MCP 服务器。当一切运行起来后,即使没有任何服务在公共端口上监听,Claude 也可以通过 https://echo.<your-tunnel-domain>/mcp 访问该示例服务器。

您需要准备的内容

  1. 创建隧道

    在 Claude Console 侧边栏中,前往 Manage > MCP tunnels 并点击 New tunnel。为其命名。保持 Set up programmatic access 为关闭状态;本快速入门使用手动凭证配置。

    创建完成后,打开该隧道。从 Connection 部分复制两个值:

    • Domain(形如 abcd1234.tunnel.anthropic.com
    • Token(点击眼睛图标,然后复制)
  2. 设置部署目录

    mkdir -p mcp-tunnel/{config,data}
    cd mcp-tunnel
    export TUNNEL_DOMAIN=YOUR_TUNNEL_DOMAIN_HERE   # from step 1
    export TUNNEL_TOKEN='eyJ...'            # from step 1
  3. 生成 CA 和服务器证书

    代理使用由您控制的 CA 签发的证书来终止内层 TLS(inner TLS)。生成这两者:

    openssl req -x509 -newkey rsa:2048 -nodes \
      -keyout data/ca.key -out data/ca.crt \
      -days 3650 -subj "/CN=mcp-tunnel-ca" \
      -addext "basicConstraints=critical,CA:TRUE" \
      -addext "keyUsage=critical,keyCertSign,cRLSign" \
      -addext "subjectKeyIdentifier=hash"
    
    cat > data/tls.ext <<EOF
    subjectAltName = DNS:${TUNNEL_DOMAIN},DNS:*.${TUNNEL_DOMAIN}
    authorityKeyIdentifier = keyid,issuer
    extendedKeyUsage = serverAuth
    EOF
    
    openssl req -newkey rsa:2048 -nodes \
      -keyout data/tls.key -out /tmp/server.csr \
      -subj "/CN=${TUNNEL_DOMAIN}"
    openssl x509 -req -in /tmp/server.csr \
      -CA data/ca.crt -CAkey data/ca.key -CAcreateserial \
      -out data/tls.crt -days 90 -extfile data/tls.ext
    
    chmod 644 data/tls.key

    回到 Console,在隧道详情页面上,点击 Add certificate 并上传 data/ca.crt(或粘贴其内容)。隧道状态将变为 Active

  4. 编写示例 MCP 服务器

    cat > hello_server.py <<'EOF'
    from mcp.server.fastmcp import FastMCP
    
    mcp = FastMCP("hello-server", host="0.0.0.0", port=9000)
    
    
    @mcp.tool()
    def hello(name: str = "world") -> str:
        """Say hello to someone."""
        return f"Hello, {name}!"
    
    
    if __name__ == "__main__":
        mcp.run(transport="streamable-http")
    EOF
  5. 编写代理配置和 compose 文件

    cat > config/mcp-proxy.yaml <<EOF
    listen_addr: ":8080"
    tunnel_domain: ${TUNNEL_DOMAIN}
    tls:
      cert_file: /data/tls.crt
      key_file: /data/tls.key
    routes:
      echo: http://hello-mcp:9000
    EOF
    
    cat > docker-compose.yaml <<'EOF'
    services:
      mcp-proxy:
        image: us-docker.pkg.dev/anthropic-public-registry/images/mcp-proxy@sha256:efb27b299d627e4134815663cb8896641eeaee025d734c0f695582b4df38f013
        volumes:
          - ./config/mcp-proxy.yaml:/etc/mcp-gateway/config.yaml:ro
          - ./data:/data:ro
        restart: unless-stopped
    
      cloudflared:
        image: cloudflare/cloudflared@sha256:6b599ca3e974349ead3286d178da61d291961182ec3fe9c505e1dd02c8ac31b0
        command: tunnel --no-autoupdate run --url http://localhost:8080
        environment:
          - TUNNEL_TOKEN
        network_mode: "service:mcp-proxy"
        restart: unless-stopped
    
      hello-mcp:
        image: python:3.13-slim
        working_dir: /app
        volumes:
          - ./hello_server.py:/app/hello_server.py:ro
        command: sh -c "pip install --quiet mcp && python hello_server.py"
        restart: unless-stopped
    EOF
  6. 启动

    docker compose up -d
    docker compose logs mcp-proxy | grep "route configured"
    docker compose logs cloudflared | grep "Registered tunnel connection"

    您应该会看到一行针对 echoroute configured 日志,以及四行 Registered tunnel connection 日志。容器需要几秒钟才能启动;如果日志命令返回为空,请重新运行。

  7. 从 Claude 调用

    在 Console 中,前往 Managed Agents > Sessions 并创建一个会话。在智能体选择器中选择 Create new agent,为智能体命名,并保留预填的模型。点击 + MCP Server,选择您的隧道,将 Subdomain 设置为 echo,将 Path 设置为 mcp。然后提问:

    Use the hello tool to greet tunnel.

    您应该会看到一次工具调用,随后是其结果。

后续步骤

隧道已完成端到端验证。要换用您自己的 MCP 服务器,请将其添加到 docker-compose.yaml(或在同一 Docker 网络上运行它),在 config/mcp-proxy.yaml 中为其添加一条路由,然后重启代理(docker compose restart mcp-proxy)。

对于生产部署:

经过加固的单主机部署,可选择是否启用编程访问。

具有自动凭证管理的 Kubernetes 部署。

Was this page helpful?