提交qiming-mcp-proxy

This commit is contained in:
Codex
2026-06-01 13:03:20 +08:00
parent 9e9486b7c2
commit afb3d9f4e6
394 changed files with 124494 additions and 0 deletions

View File

@@ -0,0 +1 @@
registry=https://registry.npmmirror.com/

View File

@@ -0,0 +1,79 @@
# 多阶段构建 Dockerfile用于跨平台编译 document-parser 和 voice-cli
FROM rust:1.90 AS builder
# 安装必要的构建依赖
RUN apt-get update && apt-get install -y \
pkg-config \
libssl-dev \
openssl \
ca-certificates \
# C/C++ 开发环境
build-essential \
libc6-dev \
gcc \
g++ \
# LLVM/Clang (bindgen 需要)
libclang-dev \
clang \
# CMake (whisper-rs-sys 需要)
cmake \
make \
&& rm -rf /var/lib/apt/lists/*
# 验证基础环境
RUN echo "=== Verifying build environment ===" && \
gcc --version && \
cmake --version && \
echo "=== Build environment verified ==="
# 设置工作目录
WORKDIR /app
# 添加 glibc 目标和 rustfmt 组件
RUN rustup target add x86_64-unknown-linux-gnu
RUN rustup target add aarch64-unknown-linux-gnu
RUN rustup component add rustfmt
# 复制整个项目
COPY . .
# 设置 libclang 路径 (bindgen 需要)
ENV LIBCLANG_PATH=/usr/lib/llvm-14/lib
# 根据目标架构编译所有包
ARG TARGETARCH
RUN echo "=== Starting build process ==="
RUN echo "Target architecture: $TARGETARCH"
RUN if [ "$TARGETARCH" = "arm64" ]; then \
echo "Building for ARM64 architecture..." && \
apt-get update && apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu && \
else \
echo "Building for x86_64 architecture..." && \
fi
RUN cargo build --release
# 复制编译好的二进制文件到指定位置
RUN mkdir -p /output && \
if [ "$TARGETARCH" = "arm64" ]; then \
cp target/aarch64-unknown-linux-gnu/release/document-parser /output/ && \
cp target/aarch64-unknown-linux-gnu/release/voice-cli /output/; \
else \
cp target/x86_64-unknown-linux-gnu/release/document-parser /output/ && \
cp target/x86_64-unknown-linux-gnu/release/voice-cli /output/; \
fi
# 最终阶段 - 创建最小运行时镜像document-parser
FROM scratch AS runtime
COPY --from=builder /output/document-parser /document-parser
ENTRYPOINT ["/document-parser"]
# 最终阶段 - 创建最小运行时镜像voice-cli
FROM scratch AS runtime-voice-cli
COPY --from=builder /output/voice-cli /voice-cli
ENTRYPOINT ["/voice-cli"]
# 导出阶段 - 用于提取所有二进制文件
FROM scratch AS export
COPY --from=builder /output/document-parser /document-parser
COPY --from=builder /output/voice-cli /voice-cli

View File

@@ -0,0 +1,139 @@
# Dockerfile for mcp-proxy
# 多阶段构建,用于构建 mcp-proxy
# 与线上环境保持依赖一致
# ==============================================================================
# 第一阶段:构建阶段
# ==============================================================================
FROM rust:1.92 AS builder
# 设置环境变量避免交互式提示
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
# 设置 ARG TARGETARCH
ARG TARGETARCH
# 设置工作目录
WORKDIR /build
# 安装构建依赖
RUN apt-get update && apt-get install -y \
pkg-config \
libssl-dev \
openssl \
ca-certificates \
build-essential \
libc6-dev \
gcc \
g++ \
libclang-dev \
clang \
cmake \
make \
&& rm -rf /var/lib/apt/lists/*
# 设置 libclang 路径 (bindgen 需要)
ENV LIBCLANG_PATH=/usr/lib/llvm-14/lib
# 复制源代码(复制所有 workspace 成员)
COPY Cargo.toml Cargo.lock ./
COPY mcp-common/ ./mcp-common/
COPY mcp-sse-proxy/ ./mcp-sse-proxy/
COPY mcp-streamable-proxy/ ./mcp-streamable-proxy/
COPY mcp-proxy/ ./mcp-proxy/
COPY oss-client/ ./oss-client/
COPY document-parser/ ./document-parser/
COPY voice-cli/ ./voice-cli/
COPY fastembed/ ./fastembed/
# 根据 TARGETARCH 设置交叉编译环境
RUN echo "=== Starting build process ==="
RUN echo "Target architecture: $TARGETARCH"
RUN if [ "$TARGETARCH" = "arm64" ]; then echo "Building for ARM64 architecture..." && apt-get update && apt-get install -y gcc-aarch64-linux-gnu g++-aarch64-linux-gnu; else echo "Building for x86_64 architecture..."; fi
# 构建 mcp-stdio-proxy
RUN cargo build --release --bin mcp-proxy
# ==============================================================================
# 第二阶段:运行阶段
# ==============================================================================
FROM rust:1.92 AS runtime
# 设置环境变量
ENV DEBIAN_FRONTEND=noninteractive
ENV TZ=Asia/Shanghai
ENV PATH="/root/.deno/bin:/root/.cargo/bin:/root/.local/bin:${PATH}"
ENV UV_INDEX_URL=https://mirrors.aliyun.com/pypi/simple
# 安装基础依赖
RUN apt-get update && apt-get install -y \
python3 \
python3-venv \
python3-dev \
python3-pip \
curl \
vim \
net-tools \
gettext-base \
telnet \
wget \
ffmpeg \
&& rm -rf /var/lib/apt/lists/* \
&& ln -snf /usr/share/zoneinfo/$TZ /etc/localtime \
&& echo $TZ > /etc/timezone
# 安装 Node.js
RUN curl -fsSL https://deb.nodesource.com/setup_22.x | bash - \
&& apt-get install -y nodejs
# 安装 Deno
RUN curl -fsSL https://deno.land/install.sh | sh
# 添加uv到PATH
ENV PATH="/root/.local/bin:${PATH}"
# 安装 uv
RUN curl -LsSf https://astral.sh/uv/install.sh | sh && \
/root/.local/bin/uv --version
# 创建虚拟环境
RUN uv venv
# 设置 uv 镜像加速地址
ENV UV_INDEX_URL=https://mirrors.aliyun.com/pypi/simple
# ==============================================================================
# 应用配置
# ==============================================================================
# 设置工作目录
WORKDIR /app
# 复制构建产物
COPY --from=builder /build/target/release/mcp-proxy ./mcp-proxy
# 复制默认配置文件
COPY docker/config.yml /app/config.yml
# 复制 npm 配置文件(配置国内镜像源)
COPY docker/.npmrc /root/.npmrc
# 复制 pip 配置文件(配置国内镜像源)
COPY docker/pip.conf /etc/pip.conf
# 创建日志目录
RUN mkdir -p /app/logs
# ==============================================================================
# 暴露端口和健康检查
# ==============================================================================
# 暴露端口
EXPOSE 8080
# 健康检查
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8080/health || exit 1
# 入口点 - 服务器模式会自动加载 /app/config.yml
ENTRYPOINT ["/app/mcp-proxy"]

View File

@@ -0,0 +1,198 @@
# Docker 配置说明
本目录包含 mcp-proxy 项目的所有 Docker 相关配置文件,与线上环境保持依赖一致。
## 文件说明
### Dockerfile.mcp-proxy
mcp-proxy 的 Docker 构建文件,采用多阶段构建:
**构建阶段:**
- 基础镜像:`rust:1.90`
- 设置时区:`Asia/Shanghai`
- 构建命令:`cargo build --release --bin mcp-proxy`
**运行阶段:**
- 基础镜像:`rust:1.90`
- 包含完整的运行时环境(与线上环境一致)
- 支持 Node.js 22.x、Python 3、Deno、Go 1.24.3
### Dockerfile.document-parser
document-parser 和 voice-cli 的 Docker 构建文件,采用多阶段构建:
**构建阶段:**
- 基础镜像:`rust:1.90`
- 构建命令:`cargo build --release`
**运行阶段:**
- 使用 `scratch` 基础镜像(最小化镜像)
- 支持两个目标:
- `runtime` - document-parser 运行时
- `runtime-voice-cli` - voice-cli 运行时
- `export` - 导出所有二进制文件
### config.yml
mcp-proxy 的默认配置文件。
### docker-compose.yml
Docker Compose 配置文件,用于快速启动 mcp-proxy 服务。
### .npmrc
npm 国内镜像源配置(淘宝镜像),用于 Node.js 包管理:
```ini
registry=https://registry.npmmirror.com/
```
### pip.conf
pip 国内镜像源配置(清华大学镜像),用于 Python 包管理:
```ini
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
```
## 运行时环境
### mcp-proxy 容器
| 环境 | 版本 | 用途 |
|------|------|------|
| Rust | 1.90 | 基础运行时 |
| Node.js | 22.x | run_code 功能执行 Node.js 代码 |
| Python | 3.x + uv | run_code 功能执行 Python 代码 |
| Deno | 最新版 | run_code 功能执行 TypeScript/JavaScript 代码 |
| Go | 1.24.3 | run_code 功能执行 Go 代码 |
### 额外工具
| 工具 | 用途 |
|------|------|
| ffmpeg | 音视频处理 |
| vim | 文本编辑 |
| net-tools | 网络工具 |
| telnet | 网络调试 |
| wget | 文件下载 |
### document-parser/voice-cli 容器
使用 `scratch` 基础镜像,仅包含二进制文件,无额外依赖。
## 国内镜像源配置
容器内已配置以下国内镜像源:
| 工具 | 镜像源 | 配置位置 |
|------|--------|----------|
| npm | 淘宝镜像 | `/root/.npmrc` |
| pip | 清华大学镜像 | `/etc/pip.conf` |
| uv | 阿里云镜像 | `UV_INDEX_URL` 环境变量 |
## Go MCP 工具
mcp-proxy 容器内预装了 `go-mcp-mysql` 工具用于测试:
```bash
go install -v github.com/Zhwt/go-mcp-mysql@latest
```
## 使用方法
### 构建 mcp-proxy 镜像
```bash
# 使用 docker build
docker build -f docker/Dockerfile.mcp-proxy -t mcp-proxy:latest ..
# 或使用 Make 命令
make build-image
# 构建 ARM64 镜像
docker build -f docker/Dockerfile.mcp-proxy --platform linux/arm64 -t mcp-proxy:latest ..
```
### 构建 document-parser 镜像
```bash
# 使用 docker build
docker build -f docker/Dockerfile.document-parser --target runtime -t document-parser:latest ..
# 或使用 Make 命令
make build-image-document-parser
# 构建 voice-cli 镜像
docker build -f docker/Dockerfile.document-parser --target runtime-voice-cli -t voice-cli:latest ..
```
### 使用 docker-compose推荐
```bash
# 启动服务
cd docker && docker-compose up
# 后台启动
cd docker && docker-compose up -d
# 查看日志
cd docker && docker-compose logs -f
# 停止服务
cd docker && docker-compose down
```
### 使用 Make 命令
```bash
# mcp-proxy 相关
make build-mcp-proxy-x86_64 # 构建 mcp-proxy x86_64 版本
make build-image # 构建 mcp-proxy Docker 镜像
make run-compose # 使用 docker-compose 启动
# document-parser 相关
make build-document-parser-x86_64 # 构建 document-parser x86_64 版本
make build-image-document-parser # 构建 document-parser Docker 镜像
# voice-cli 相关
make build-voice-cli-x86_64 # 构建 voice-cli x86_64 版本
```
## 环境变量
### mcp-proxy 容器
| 环境变量 | 说明 | 默认值 |
|----------|------|--------|
| RUST_LOG | 日志级别 | info |
| TZ | 时区 | Asia/Shanghai |
| UV_INDEX_URL | uv 镜像源 | https://mirrors.aliyun.com/pypi/simple |
## 挂载目录
### mcp-proxy 容器
- `./config.yml` - 配置文件(只读)
- `./logs` - 日志目录(持久化)
## 健康检查
mcp-proxy 容器包含健康检查,定期检查 `/health` 端点:
- 检查间隔30 秒
- 超时时间10 秒
- 重试次数3 次
- 启动等待5 秒
## 线上环境一致性
本目录的 Dockerfile 与线上环境保持依赖一致:
- `Dockerfile.mcp-proxy` 对应 `/Volumes/soddygo/git_work/build-agent-docker/build_config/mcp_proxy/Dockerfile`
## 目录结构
```
docker/
├── Dockerfile.mcp-proxy # mcp-proxy Docker 构建文件
├── Dockerfile.document-parser # document-parser/voice-cli Docker 构建文件
├── config.yml # mcp-proxy 默认配置
├── docker-compose.yml # Docker Compose 配置
├── .npmrc # npm 国内镜像源配置
├── pip.conf # pip 国内镜像源配置
└── README.md # 本文档
```

View File

@@ -0,0 +1,15 @@
# mcp-proxy 默认配置文件(用于 Docker 环境)
server:
# 监听端口
port: 8080
# 监听地址
host: 0.0.0.0
log:
# 日志级别: trace, debug, info, warn, error
level: info
# 日志文件路径Docker 环境下输出到 stdout此配置仅用于本地文件日志
path: /app/logs
# 保留最近 N 个日志文件
retain_days: 3

View File

@@ -0,0 +1,37 @@
# Docker Compose 配置文件 for mcp-proxy
# 用于快速启动和测试 mcp-proxy 服务
version: '3.8'
services:
mcp-proxy:
build:
context: ..
dockerfile: docker/Dockerfile.mcp-proxy
image: mcp-proxy:latest
container_name: mcp-proxy
ports:
- "8080:8080"
volumes:
# 挂载配置文件(可选,用于覆盖默认配置)
- ./config.yml:/app/config.yml:ro
# 挂载日志目录(可选,用于持久化日志)
- ./logs:/app/logs
environment:
# 日志级别(可通过环境变量覆盖配置文件)
- RUST_LOG=info
# 服务端口(可通过环境变量覆盖配置文件)
- MCP_PROXY_PORT=8080
restart: unless-stopped
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8080/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 5s
networks:
- mcp-network
networks:
mcp-network:
driver: bridge

View File

@@ -0,0 +1,3 @@
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn

View File

@@ -0,0 +1,256 @@
###############################################################################
# MCP Proxy API 测试文件
# 使用 VS Code REST Client 扩展或 IntelliJ HTTP Client 执行
###############################################################################
#
# 测试流程:
# 1. 先调用 /check_status 接口创建 MCP 服务(服务会异步启动)
# 2. 再次调用 /check_status 确认服务状态变为 Ready
# 3. 使用返回的 SSE/Stream URL 在 MCP 客户端中连接
#
# SSE 协议 URL 格式:
# - 连接: {{baseUrl}}/mcp/sse/proxy/{mcp_id}/sse
# - 消息: {{baseUrl}}/mcp/sse/proxy/{mcp_id}/message
#
# Streamable HTTP 协议 URL 格式:
# - 请求: {{baseUrl}}/mcp/stream/proxy/{mcp_id}
#
###############################################################################
@baseUrl = http://localhost:8085
@ssePrefix = /mcp/sse
@streamPrefix = /mcp/stream
###############################################################################
# 环境变量(根据实际情况修改)
###############################################################################
# 如果需要认证,取消下行注释并设置 token
# @token = your-auth-token-here
# Coze API Token用于测试 Coze MCP 服务)
# 从环境变量 COZE_API_TOKEN 读取,使用前请设置: export COZE_API_TOKEN=your_token_here
@cozeApiToken = {{$dotenv COZE_API_TOKEN}}
###############################################################################
# 健康检查接口
###############################################################################
### 健康检查
GET {{baseUrl}}/health
### 就绪检查
GET {{baseUrl}}/ready
###############################################################################
# SSE 协议 - MCP 服务状态检查与创建
###############################################################################
### 检查/创建 SSE 协议的 MCP 服务 - Time MCP (stdio)
# @name checkTimeMcpSse
POST {{baseUrl}}{{ssePrefix}}/check_status
Content-Type: application/json
{
"mcpId": "time-mcp-sse",
"mcpJsonConfig": "{\"mcpServers\":{\"time\":{\"command\":\"uvx\",\"args\":[\"mcp-server-time\"]}}}",
"mcpType": "OneShot"
}
### 检查/创建 SSE 协议的 MCP 服务 - Coze Plugin (remote URL)
# @name checkCozeMcpSse
POST {{baseUrl}}{{ssePrefix}}/check_status
Content-Type: application/json
{
"mcpId": "coze_plugin_tianyancha",
"mcpJsonConfig": "{\"mcpServers\":{\"coze_plugin_tianyancha\":{\"url\":\"https://mcp.coze.cn/v1/plugins/7407724292865130515\",\"headers\":{\"Authorization\":\"Bearer {{cozeApiToken}}\"}}}}",
"mcpType": "OneShot"
}
### SSE 连接端点 - 连接 Time MCP
# 在 MCP 客户端中使用此 URL
# SSE URL: {{baseUrl}}{{ssePrefix}}/proxy/time-mcp-sse/sse
# Message URL: {{baseUrl}}{{ssePrefix}}/proxy/time-mcp-sse/message
GET {{baseUrl}}{{ssePrefix}}/proxy/time-mcp-sse/sse
Accept: text/event-stream
### SSE 连接端点 - 连接 Coze Plugin
# SSE URL: {{baseUrl}}{{ssePrefix}}/proxy/coze_plugin_tianyancha/sse
# Message URL: {{baseUrl}}{{ssePrefix}}/proxy/coze_plugin_tianyancha/message
GET {{baseUrl}}{{ssePrefix}}/proxy/coze_plugin_tianyancha/sse
Accept: text/event-stream
### SSE 发送消息示例
POST {{baseUrl}}{{ssePrefix}}/proxy/time-mcp-sse/message
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}
###############################################################################
# Streamable HTTP 协议 - MCP 服务状态检查与创建
###############################################################################
### 检查/创建 Stream 协议的 MCP 服务 - Time MCP (stdio)
# @name checkTimeMcpStream
POST {{baseUrl}}{{streamPrefix}}/check_status
Content-Type: application/json
{
"mcpId": "time-mcp-stream",
"mcpJsonConfig": "{\"mcpServers\":{\"time\":{\"command\":\"uvx\",\"args\":[\"mcp-server-time\"]}}}",
"mcpType": "OneShot"
}
### 检查/创建 Stream 协议的 MCP 服务 - Coze Plugin (remote URL)
# @name checkCozeMcpStream
POST {{baseUrl}}{{streamPrefix}}/check_status
Content-Type: application/json
{
"mcpId": "coze_plugin_tianyancha_stream",
"mcpJsonConfig": "{\"mcpServers\":{\"coze_plugin_tianyancha\":{\"url\":\"https://mcp.coze.cn/v1/plugins/7407724292865130515\",\"headers\":{\"Authorization\":\"Bearer {{cozeApiToken}}\"}}}}",
"mcpType": "OneShot"
}
### Streamable HTTP 请求 - Time MCP
# 在 MCP 客户端中使用此 URL
# Stream URL: {{baseUrl}}{{streamPrefix}}/proxy/time-mcp-stream
POST {{baseUrl}}{{streamPrefix}}/proxy/time-mcp-stream
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}
### Streamable HTTP 请求 - Coze Plugin
POST {{baseUrl}}{{streamPrefix}}/proxy/coze_plugin_tianyancha_stream
Content-Type: application/json
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}
###############################################################################
# 查询服务状态GET 方式)
###############################################################################
### 查询 Time MCP SSE 服务状态
GET {{baseUrl}}/mcp/check/status/time-mcp-sse
### 查询 Coze Plugin SSE 服务状态
GET {{baseUrl}}/mcp/check/status/coze_plugin_tianyancha
### 查询 Time MCP Stream 服务状态
GET {{baseUrl}}/mcp/check/status/time-mcp-stream
###############################################################################
# 添加路由(/mcp/sse/add- 同步方式创建服务
# 注意:此接口使用 snake_case 参数名
###############################################################################
### 添加 Time MCP 服务(同步创建)
POST {{baseUrl}}{{ssePrefix}}/add
Content-Type: application/json
{
"mcp_json_config": "{\"mcpServers\":{\"time\":{\"command\":\"uvx\",\"args\":[\"mcp-server-time\"]}}}",
"mcp_type": "OneShot"
}
### 添加 Coze Plugin 服务(同步创建)
POST {{baseUrl}}{{ssePrefix}}/add
Content-Type: application/json
{
"mcp_json_config": "{\"mcpServers\":{\"coze_plugin_tianyancha\":{\"url\":\"https://mcp.coze.cn/v1/plugins/7407724292865130515\",\"headers\":{\"Authorization\":\"Bearer {{cozeApiToken}}\"}}}}",
"mcp_type": "OneShot"
}
###############################################################################
# MCP 客户端配置示例
###############################################################################
### 在 Claude Desktop 或其他 MCP 客户端中使用以下配置:
# SSE 协议配置Time MCP:
# {
# "mcpServers": {
# "time-proxy": {
# "url": "http://localhost:3000/mcp/sse/proxy/time-mcp-sse/sse"
# }
# }
# }
# SSE 协议配置Coze Plugin:
# {
# "mcpServers": {
# "coze-proxy": {
# "url": "http://localhost:3000/mcp/sse/proxy/coze_plugin_tianyancha/sse"
# }
# }
# }
# Streamable HTTP 协议配置Time MCP:
# {
# "mcpServers": {
# "time-proxy-stream": {
# "url": "http://localhost:3000/mcp/stream/proxy/time-mcp-stream",
# "type": "streamable-http"
# }
# }
# }
###############################################################################
# 常用 MCP 服务配置示例
###############################################################################
### 文件系统 MCP
POST {{baseUrl}}{{ssePrefix}}/check_status
Content-Type: application/json
{
"mcpId": "filesystem-mcp",
"mcpJsonConfig": "{\"mcpServers\":{\"filesystem\":{\"command\":\"npx\",\"args\":[\"-y\",\"@modelcontextprotocol/server-filesystem\",\"/tmp\"]}}}",
"mcpType": "OneShot"
}
### GitHub MCP
POST {{baseUrl}}{{ssePrefix}}/check_status
Content-Type: application/json
{
"mcpId": "github-mcp",
"mcpJsonConfig": "{\"mcpServers\":{\"github\":{\"command\":\"npx\",\"args\":[\"-y\",\"@modelcontextprotocol/server-github\"],\"env\":{\"GITHUB_PERSONAL_ACCESS_TOKEN\":\"your-github-token\"}}}}",
"mcpType": "OneShot"
}
### SQLite MCP
POST {{baseUrl}}{{ssePrefix}}/check_status
Content-Type: application/json
{
"mcpId": "sqlite-mcp",
"mcpJsonConfig": "{\"mcpServers\":{\"sqlite\":{\"command\":\"uvx\",\"args\":[\"mcp-server-sqlite\",\"--db-path\",\"/tmp/test.db\"]}}}",
"mcpType": "OneShot"
}
###############################################################################
# 删除服务路由
###############################################################################
### 删除 Time MCP SSE 服务
DELETE {{baseUrl}}/mcp/config/delete/time-mcp-sse
### 删除 Coze Plugin SSE 服务
DELETE {{baseUrl}}/mcp/config/delete/coze_plugin_tianyancha
### 删除 Time MCP Stream 服务
DELETE {{baseUrl}}/mcp/config/delete/time-mcp-stream