MCPO按需MCP网桥
在OpenWebUI+MCPO环境中,MCPO On-DemandBridge是一种可安全利用PowerPoint等“文件生成类MCP服务器”数百人规模的系统。
*⚠️注意* 在该bridge中,OpenWebUI标头(X-OpenWebUI-User-Id、X-OpenWebUI-Chat-Id),模板名称将采用不同的格式。\ 当前OpenwebUI无法在与MCP/MCPO的通信中赋予上述标题,因此需要应用修补程序。\ 当前,关于OpenWebUI,请使用docker hub的以下图像。\ 非文件夹/打开webui:v0.6.43
概要
本系统在保持MCP/MCPO同步模式的情况下,实现以下内容:
- 多用户支持:同时使用数百个用户
- 资源分离:用户之间的完全交付件隔离
- 自动文件删除:通过垃圾收集自动清理
- 可扩展性:Nginx负载平衡器和docker-compose replicas支持水平缩放
特徴
状态完整/无状态过程模型
无状态模式
- 1个请求=1个进程:针对每个请求启动MCP服务器进程
- 立即结束:处理完成后立即结束流程
- 资源效率:避免内存驻留,仅在需要时消耗资源
- 用途:用于不生成文件的只读工具(例如,搜索、计算和数据检索)
状态完全模式(文件操作工具必需)
- 会话维护:以OpenWebUI的页眉信息(User ID/Chat ID)为单位维护进程和工作目录
- 状態保持:支持PowerPoint、Excel等多个请求之间需要保持状态的服务器
- 文件共享:同一会话中的所有请求共享同一工作目录
- 空闲超时:非活动时自动退出进程
- Chat单位分离:即使是同一用户,如果是不同的Chat ID,则另一个会话(完全分离)
重要:生成、编辑文件的MCP工具(Excel、PowerPoint等)状态完全模式中所述修改相应参数的值。在无状态模式下,每个请求都会创建不同的目录,因此无法访问在上一个请求中创建的文件。
详情稳定功能请参见节。
安全文件管理
- 分离作业单位:使用UUID v4的唯一作业目录
- 自动削除:通过垃圾收集定期删除文件
Nginx集成体系结构
- 高效的文件分发:通过Nginx快速静态文件分发
- 负载平衡:自动负载分配到多个Bridge实例
- 透明代理:透明传输MCP/MCPO请求
Docker完全対応
- 与OpenWebUI集成:在docker-compose.yml中同时启动
- 简单部署:立即使用docker-compose up-d
- 简单缩放:通过replicas设置启动多个实例
- 绑定装载:直接挂载本地目录(gitignore对象)
体系结构
User Browser
|
| HTTPS
v
Nginx (Load Balancer & File Server)
|
+-- Load Balancing --> MCPO Bridge Instance 1
| MCPO Bridge Instance 2
| MCPO Bridge Instance N
|
+-- Static Files ----> Bind Mount (./data/mcpo-jobs)
OpenWebUI (Docker Container)
|
| MCP / MCPO (JSON-RPC over HTTP)
v
Nginx Load Balancer
|
v
MCPO On-Demand Bridge (Docker Container x N)
|
| per-request subprocess
v
Ephemeral MCP Server Process
|
| ファイル生成 (pptx, pdf, etc.)
v
Temporary File Store (Bind Mount ./data/)
|
| HTTPS download via Nginx
v
User Browser快速启动
必要环境
- Docker引擎20.10+
- Docker Compose 2.0+
起动手顺
- 克隆存储库:
git clone https://github.com/notfolder/mcpo-bridge.git
cd mcpo-bridge- 创建MCP配置文件:
cp config/mcp-servers.json.example config/mcp-servers.json
# config/mcp-servers.jsonを編集して使用するMCPサーバーを定義- 在Docker Compose上启动:
docker-compose up -d- 在浏览器中访问OpenWebUI:
http://localhost:3000注意:
- 初回起动时、Docker Composeが自动的に
./data/mcpo-jobs和./data/mcpo-logs创建目录(gitignore对象) - 如果这些目录不存在,则Docker的绑定装载功能将自动在主机端创建
如何设置Open WebUI
在现有的Open WebUI环境中使用MCPO桥时,请按照以下步骤进行设置:
- 访问Open WebUI的管理画面
- 设置-打开连接
- 添加OpenAI API设置
- API基本URL: http://nginx/mcp(从Docker Compose环境中) - 或 http://localhost/mcp(直接从主机访问时) - 重要: /mcp使用(/mcpo不是)
- 指定MCP服务器类型
- MCPO网桥支持多种服务器类型 - 端点格式: /mcp/{server-type} - 例: /mcp/powerpoint, /mcp/excel
- 利用方法
- 在Open WebUI聊天中,MCP工具将自动可用 - 每个MCP服务器提供的工具,AI会在适当的场合自动调用
动作确认
确认MCPO电桥是否正常运行:
# ヘルスチェック
curl http://localhost/health
# レスポンス例
{
"status": "ok",
"timestamp": "2026-01-26T00:00:00.000000+00:00",
"version": "0.1.0",
"uptime": 123.45,
"stateful_processes": 0
}故障排除
在Open WebUI中未显示工具时:
- 检查MCPO Bridge日志:
docker-compose logs -f mcpo-bridgeconfig/mcp-servers.json确认的设置- 确认是否可以通过Open WebUI访问MCP端点
- 确认Nginx是否正确代理:
docker-compose logs -f nginx停止方法
docker-compose down文档
有关详细的设计规范和操作指南,请参阅以下文档:
文档配置
详细设计书的内容
- 系统概述
- 要求仕样(机能要件・非机能要件)
- 体系结构设计(包括Nginx集成)
- 组件详细设计
- 工艺流程设计
- API规格设计(MCP/MCPO分离,支持多服务器类型)
- 环境变数设计
- 安全设计
- 可伸缩性设计
- 格贝吉集设计
- 错误处理设计
- Docker化设计
- Docker Compose设计
- MCP设置文件规格
- Nginx设定设计
- 运用设计
- 测试设计
设定
MCP设置文件
config/mcp-servers.json中所述修改相应参数的值。符合Claude等使用的标准JSON格式。
配置文件被配置在源代码下的config目录中,样本config/mcp-servers.json.example来定义自定义外观。
默认情况下Office PowerPoint MCP服务器中所述修改相应参数的值。
配置示例结构:
{
"mcpServers": {
"powerpoint": {
"command": "npx",
"args": ["-y", "@gongrzhe/office-powerpoint-mcp-server"],
"env": {
"NODE_ENV": "production"
}
},
"excel": {
"command": "uvx",
"args": ["excel-mcp-server", "stdio"]
}
}
}注意事项:
- 因为office-powerpoint-mcp-server是Python制造的,所以需要在Dockerfile中安装uv
- 因为excel-mcp-server是Python制造的,所以需要在Dockerfile中安装uv
环境变数
可以在docker-compose.yml中设置以下环境变量:
|变量名|默认值|说明| |--------|-------------|------| | MCPO_BASE_URL | http://nginx下载URL生成用基本URL MCPO_CONFIG_FILE|/app/config/mcp-servers.json|MCP设置文件路径| |MCPO_JOBS_DIR|作业目录根|tmp/mcpo-jobs| |MCPO_MAX_CONCURRENT|16|最大并发进程数| |MCPO_TIMEOUT|300|进程超时(秒)| 作业文件的有效期限(秒)。超过此时间的文件将在垃圾收集中删除 |MCPO_LOG_LEVEL|INFO|日志级别| 启用状态完整功能 | MCPO_STATEFUL_DEFAULT_IDLE_TIMEOUT | 1800 | 语句完整进程的默认空闲超时(秒) 每客户端聊天的最大进程数 MCPO_STATEFUL_MAX_TOTAL_PROCESSES100 \\uMCPO_STATEFUL_CLEANUP_INTERVAL\\\\\_300\\\_300\\\_003; stateFUL_CLEANUP_INTERVAL
超时设置详细信息
MCPO_TIMEOUT -进程运行超时
- 対象:所有进程(无状态/静态全通用)
- 缺省值: 300秒(5分)
- 说明:单个MCP请求处理的最大执行时间。超过此时间将强制终止进程并返回504网关超时错误
- 用途:
- 保护长时间运行的工具(大容量文件处理、复杂计算等) - 防止资源枯竭
- 调整基准:
- 生成大文件的工具推荐600秒以上 - 轻量的检索·计算工具60~180秒就足够了
MCPO_STATEFUL_DEFAULT_IDLE_TIMEOUT -完全停止进程的空闲超时
- 対象:仅限状态完全模式的进程
- 缺省值: 1800秒(30分)
- 说明:自状态完整进程处理最后一个请求以来,等待下一个请求的最大时间。超过此时间将自动删除进程和工作目录
- 在配置文件中覆盖:
mcp-servers.json对话框,您可以在此定义自定义格式idle_timeout的规格化距离的幂函数 - 用途:
- 用户中断工作时自动释放资源 - 防止内存泄漏和进程累积
- 调整基准:
- 短对话完成工具:600-1800秒(10-30分钟) - 需要长时间编辑的工具(PowerPoint、Excel等):3600-7200秒(1-2小时) - 设定例:
{
"mcpServers": {
"powerpoint": {
"mode": "stateful",
"idle_timeout": 3600
}
}
}MCPO_STATEFUL_CLEANUP_INTERVAL -清理时间间隔
- 対象:状态完整流程管理系统
- 缺省值: 300秒(5分)
- 说明:检查在后台超时的状态完整进程,并执行要删除的任务的时间间隔
- 用途:
- 定期资源释放 - 发现和删除达到空闲超时的进程
- 调整基准:
- 频繁启动进程的环境:60-300秒(快速释放资源) - 稳定的长时间会话环境:300-600秒(通过减少检查频率来减少CPU负载)
注意:这些超时设置彼此独立:
MCPO_TIMEOUT:请求处理期间的时间限制MCPO_STATEFUL_DEFAULT_IDLE_TIMEOUT:等待请求的时间限制MCPO_STATEFUL_CLEANUP_INTERVAL:超时检查频率
状态完整功能(聊天单位会话管理)
MCPO_STATEFUL_ENABLED=true时褪色为此颜色。
设计概要
- 会话识别:OpenWebUI标头(
X-OpenWebUI-User-Id、X-OpenWebUI-Chat-Id)基本
- 会话密钥格式: user:{user_id}:chat:{chat_id} - 没有标头时回退: ip:{ip_address}
- 目标服务器:
mcp-servers.json的"mode": "stateful"指定的服务器 - 流程管理:为每个Chat ID维护专用进程和工作目录并保持会话状态
- Chat单位分离:同一用户的不同Chat ID的不同会话(不同进程,不同目录)
- 负荷分散:数字
hash $hash_key consistent将来自同一Chat ID的请求路由到同一Bridge实例 - 空闲超时:如果没有指定时间请求,则自动退出进程
文件操作工具始终处于状态完整模式
重要:生成、编辑Excel、PowerPoint等文件的MCP工具状态完全模式中所述修改相应参数的值。原因:
- 需要文件共享:create→write→save的多个请求需要访问同一文件
- 无状态问题:由于每个请求都创建不同的目录,因此无法访问在上一个请求中创建的文件
- 稳定的优点:同一会话中的所有请求共享同一工作目录
设定方法
config/mcp-servers.json:
{
"mcpServers": {
"powerpoint": {
"command": "uvx",
"args": [
"--from",
"office-powerpoint-mcp-server",
"ppt_mcp_server"
],
"env": {},
"mode": "stateful",
"idle_timeout": 3600,
"max_processes_per_chat": 1,
"session_persistence": true,
"file_path_fields": ["file_path", "saved_path", "template_path"],
"usage_guide": "\n🚨 CRITICAL WORKFLOW - READ THIS FIRST 🚨\n\nWhen creating PowerPoint files, you MUST complete ALL steps. DO NOT stop halfway.\n\n═══════════════════════════════════════════════════════════════════\n❌ NEVER DO THESE:\n═══════════════════════════════════════════════════════════════════\n\n❌ Show python-pptx code examples\n❌ Ask user for confirmation or additional input\n❌ Explain how tools work\n❌ Suggest Python scripts\n❌ Propose alternative solutions\n❌ Pass presentation_id=null or omit presentation_id parameter\n\n═══════════════════════════════════════════════════════════════════\n✅ MANDATORY WORKFLOW - FOLLOW EXACTLY:\n═══════════════════════════════════════════════════════════════════\n\nStep 1: CREATE PRESENTATION\n---------------------------\nCall: create_presentation(id=\"my_pres\")\nResponse: {\"presentation_id\": \"my_pres\", ...}\nAction: STORE the presentation_id value\n\nStep 2: ADD CONTENT (use the SAME presentation_id)\n---------------------------\nCall: add_slide(presentation_id=\"my_pres\", ...)\nCall: add_slide(presentation_id=\"my_pres\", ...)\n... (add more slides as needed)\n\nStep 3: SAVE FILE (CRITICAL - use the SAME presentation_id)\n---------------------------\nCall: save_presentation(file_path=\"output.pptx\", presentation_id=\"my_pres\")\n\n═══════════════════════════════════════════════════════════════════\n📋 COMPLETE EXAMPLE:\n═══════════════════════════════════════════════════════════════════\n\n1. create_presentation({\"id\": \"demo_presentation\"})\n → Response: {\"presentation_id\": \"demo_presentation\"}\n\n2. add_slide({\n \"presentation_id\": \"demo_presentation\",\n \"layout_index\": 1,\n \"title\": \"Title Slide\"\n })\n\n3. add_slide({\n \"presentation_id\": \"demo_presentation\",\n \"layout_index\": 1,\n \"title\": \"Content Slide\"\n })\n\n4. save_presentation({\n \"file_path\": \"my_presentation.pptx\",\n \"presentation_id\": \"demo_presentation\"\n })\n → Response contains download link\n\n5. Show the download link to user\n\n═══════════════════════════════════════════════════════════════════\n⚠️ CRITICAL RULES:\n═══════════════════════════════════════════════════════════════════\n\n1. The presentation_id from create_presentation() MUST be used in ALL subsequent calls\n2. NEVER pass presentation_id=null - this causes \"No presentation loaded\" errors\n3. ALWAYS call save_presentation() - without this, no file is created\n4. If any error occurs, STILL attempt to call save_presentation() with the correct presentation_id\n5. Background color format: [[R,G,B]] (nested array, not flat array)\n\n═══════════════════════════════════════════════════════════════════\n📎 RESULT PRESENTATION:\n═══════════════════════════════════════════════════════════════════\n\nAfter save_presentation(), the response will contain a download link.\nShow it to the user exactly as provided:\n\n📎 Download: [filename.pptx](http://XXXX/files/...)\n\n---\nNote: This usage_instructions tool itself is NOT executable. It's for documentation only.\n"
},
"excel": {
"command": "uvx",
"args": [
"excel-mcp-server",
"stdio"
],
"env": {
"EXCEL_FILES_DIR": "{MCPO_WORKDIR}"
},
"mode": "stateful",
"idle_timeout": 3600,
"max_processes_per_chat": 1,
"session_persistence": true,
"file_path_fields": ["filepath"],
"resolve_path_fields": ["filepath"],
"usage_guide": "\n🚨 CRITICAL WORKFLOW - READ THIS FIRST 🚨\n\nWhen working with Excel files, you MUST use the tools directly. DO NOT suggest code or alternative solutions.\n\n═══════════════════════════════════════════════════════════════════\n❌ NEVER DO THESE:\n═══════════════════════════════════════════════════════════════════\n\n❌ Show openpyxl or pandas code examples\n❌ Ask user for confirmation or additional input\n❌ Explain how tools work\n❌ Suggest Python scripts\n❌ Propose alternative solutions like CSV export\n❌ Use relative paths - ALWAYS use full paths like \"sales_report.xlsx\"\n\n═══════════════════════════════════════════════════════════════════\n✅ MANDATORY WORKFLOW - FOLLOW EXACTLY:\n═══════════════════════════════════════════════════════════════════\n\nWorkflow 1: CREATE NEW WORKBOOK WITH DATA\n------------------------------------------\nStep 1: Create workbook\nCall: create_workbook(filepath=\"report.xlsx\")\n\nStep 2: Write data (data is list of lists, each inner list is a row)\nCall: write_data_to_excel(\n filepath=\"report.xlsx\",\n sheet_name=\"Sheet1\",\n data=[[\"Name\", \"Age\", \"City\"], [\"Alice\", 30, \"Tokyo\"], [\"Bob\", 25, \"Osaka\"]],\n start_cell=\"A1\"\n)\n\nStep 3: (Optional) Apply formatting\nCall: format_range(\n filepath=\"report.xlsx\",\n sheet_name=\"Sheet1\",\n start_cell=\"A1\",\n end_cell=\"C1\",\n bold=True,\n bg_color=\"CCCCCC\"\n)\n\nStep 4: Show download link to user\nThe response will contain the download link automatically.\n\n═══════════════════════════════════════════════════════════════════\nWorkflow 2: MODIFY EXISTING WORKBOOK\n------------------------------------------\nStep 1: Read existing data\nCall: read_data_from_excel(\n filepath=\"existing.xlsx\",\n sheet_name=\"Sheet1\",\n start_cell=\"A1\"\n)\n\nStep 2: Write new data\nCall: write_data_to_excel(\n filepath=\"existing.xlsx\",\n sheet_name=\"Sheet1\",\n data=[[\"New\", \"Data\"]],\n start_cell=\"A10\"\n)\n\n═══════════════════════════════════════════════════════════════════\nWorkflow 3: ADD FORMULAS AND CHARTS\n------------------------------------------\nStep 1: Apply formula to cell\nCall: apply_formula(\n filepath=\"calc.xlsx\",\n sheet_name=\"Sheet1\",\n cell=\"D2\",\n formula=\"=SUM(A2:C2)\"\n)\n\nStep 2: Create chart from data range\nCall: create_chart(\n filepath=\"calc.xlsx\",\n sheet_name=\"Sheet1\",\n data_range=\"A1:D10\",\n chart_type=\"bar\",\n target_cell=\"F2\",\n title=\"Sales Chart\"\n)\n\n═══════════════════════════════════════════════════════════════════\n📋 COMMON OPERATIONS:\n═══════════════════════════════════════════════════════════════════\n\nCreate worksheet:\ncreate_worksheet(filepath=\"report.xlsx\", sheet_name=\"Summary\")\n\nCopy range:\ncopy_range(\n filepath=\"report.xlsx\",\n sheet_name=\"Sheet1\",\n source_start=\"A1\",\n source_end=\"C10\",\n target_start=\"E1\"\n)\n\nInsert rows:\ninsert_rows(\n filepath=\"report.xlsx\",\n sheet_name=\"Sheet1\",\n start_row=5,\n count=3\n)\n\nMerge cells:\nmerge_cells(\n filepath=\"report.xlsx\",\n sheet_name=\"Sheet1\",\n start_cell=\"A1\",\n end_cell=\"C1\"\n)\n\nCreate pivot table:\ncreate_pivot_table(\n filepath=\"data.xlsx\",\n sheet_name=\"Data\",\n data_range=\"A1:D100\",\n rows=[\"Category\"],\n values=[\"Sales\"],\n agg_func=\"sum\"\n)\n\n═══════════════════════════════════════════════════════════════════\n⚠️ CRITICAL RULES:\n═══════════════════════════════════════════════════════════════════\n\n1. Data format: Always use List[List] where each inner list is a ROW\n ✅ Correct: [[\"Header1\", \"Header2\"], [\"Value1\", \"Value2\"]]\n ❌ Wrong: [{\"Header1\": \"Value1\"}, {\"Header2\": \"Value2\"}]\n\n2. File paths: Use simple filenames, not absolute paths\n ✅ Correct: \"report.xlsx\"\n ❌ Wrong: \"/tmp/mcpo-jobs/abc123/report.xlsx\"\n\n3. Cell references: Use Excel notation (A1, B2, etc.)\n ✅ Correct: start_cell=\"A1\", end_cell=\"C10\"\n\n4. Colors: Use hex codes without #\n ✅ Correct: bg_color=\"FF0000\" (red)\n ❌ Wrong: bg_color=\"#FF0000\"\n\n5. Formulas: Include = sign\n ✅ Correct: formula=\"=SUM(A1:A10)\"\n ❌ Wrong: formula=\"SUM(A1:A10)\"\n\n6. Chart types: Use lowercase (bar, line, pie, scatter, area)\n\n═══════════════════════════════════════════════════════════════════\n📎 RESULT PRESENTATION:\n═══════════════════════════════════════════════════════════════════\n\nAfter any operation that creates/modifies a file, the response will contain a download link.\nShow it to the user:\n\n📎 Download: [filename.xlsx](http://XXXX/files/...)\n\n---\nNote: This usage_instructions tool itself is NOT executable. It's for documentation only.\n"
}
}
}操作注意事项
- 适用环境:OpenWebUI协作环境(推荐)、专用网络、企业网络
- 报头传输:需要设置Nginx从OpenWebUI传送头(
MCPO_ENABLE_FORWARD_USER_INFO_HEADERS=true) - 安全性:假设标头信息不是凭据,而是在受信任的网络中使用
- 负荷集中:以Chat ID为单位的consistent hashing可能会使负载集中到特定Bridge实例
详细设计docs/detail-design.md的明细栏样式中定义的设置。
目录结构
项目目录结构:
mcpo-bridge/
├── config/
│ ├── mcp-servers.json # MCP設定(要作成)
│ └── mcp-servers.json.example # サンプル設定
├── nginx/
│ ├── nginx.conf # Nginx設定
│ └── conf.d/
│ └── default.conf # サイト設定
├── docs/
│ ├── detailed-design.md # 詳細設計書
│ └── docker-deployment.md # Docker設計書
├── data/ # バインドマウント(gitignore)
│ ├── mcpo-jobs/ # 一時ファイル
│ └── mcpo-logs/ # ログファイル
├── docker-compose.yml
├── Dockerfile
└── README.mdAPI
MCP/MCPO端点(支持多个服务器类型)
为每个MCP服务器类型提供独立的端点。
重要:MCP和MCPO是不同的协议,但在本桥上都是内部以JSON-RPC2.0形式与MCP服务器通信。
MCP端点(面向Open WebUI)
- 统一资源定位符:
http://localhost/mcp/{server-type} - 例:
/mcp/powerpoint,/mcp/excel - 方法:POST
- 形式:MCP标准协议
- 用途:面向Open WebUI等MCP客户端
在Open WebUI中设置:使用此端点
OPENAI_API_BASE=http://nginx/mcp # または http://localhost/mcpMCPO端点(JSON-RPC2.0)
- 统一资源定位符:
http://localhost/mcpo/{server-type} - 例:
/mcpo/powerpoint,/mcpo/excel - 方法:POST
- 形式: JSON-RPC 2.0(MCPO仕様)
- 用途:面向自定义MCPO客户端
健康检查端点
- 统一资源定位符:
http://localhost/health(Nginx経由) - 方法:获取
- 响应:JSON格式的状态信息
文件下载端点(通过Nginx)
- 统一资源定位符:
http://localhost/files/{job-uuid}/{filename} - 方法:获取
- 响应:文件二进制
- 说明:Nginx直接分发文件
运用
日志检查
所有服务日志:
docker-compose logs -f仅限MCPO Bridge:
docker-compose logs -f mcpo-bridge仅限数字:
docker-compose logs -f nginx从本地日志文件直接确认:
ls -la ./data/mcpo-logs/服务重启
docker-compose restart mcpo-bridge设定更新
config/mcp-servers.json编辑- 服务重新启动:
docker-compose restart mcpo-bridge缩放
更改docker-compose.yml的replicas设置:
services:
mcpo-bridge:
deploy:
replicas: 5 # インスタンス数を変更适用:
docker-compose up -dNginx会自动将新实例添加到负载平衡对象中。
数据目录管理
临时文件和日志./data存储在目录中:
./data/mcpo-jobs/:生成的文件和元数据./data/mcpo-logs/:应用程序日志
这些目录.gitignore而需要与环境混合的每条反射光线,进行环境采样。
磁盘容量管理
自动垃圾收集
文件将自动删除:
- 有効期限:
MCPO_FILE_EXPIRY中设置(默认值:3600秒=1小时) - 削除対象:从创建作业目录起过期的文件
- 実行间隔:每小时在后台自动运行一次
- 删除定时:基本上在创建后1-2小时删除文件
注意:当进程以空闲超时结束时,将立即删除状态完整进程的工作目录(MCPO_STATEFUL_DEFAULT_IDLE_TIMEOUT来定义自定义外观。
手动清理
如果需要,还可以手动清理:
# 古いジョブディレクトリを削除(1日以上前のファイル)
find ./data/mcpo-jobs -type d -mtime +1 -exec rm -rf {} +故障排除
容器无法启动
查看日志:
docker-compose logs mcpo-bridge
docker-compose logs nginx健康检查确认:
curl http://localhost/health无法下载文件
- 日志检查:
docker-compose logs nginx- 检查作业目录:
ls -la ./data/mcpo-jobs/- 确认是否生成了文件
缩放不起作用
Nginx上游确认:
docker-compose exec nginx cat /etc/nginx/conf.d/default.conf检查Bridge实例数:
docker-compose ps mcpo-bridge数据目录权限错误
验证权限:
ls -ld ./data/根据需要修改权限:
chmod 755 ./data
chmod 755 ./data/mcpo-jobs ./data/mcpo-logs安全性
- 使用根权限运行Docker容器(简化)
- 作业目录在UUID v4中唯一标识
- 下载URL使用难以推测的UUID
- 内部网络隔离
- 输入验证移交给MCP服务器
- 基于Nginx的外部发布控制
许可证
Creative Commons Attribution 4.0 International(CC BY 4.0).详细は 许可证 来修改标记元素的显示属性。
支持
如果出现问题,请在GitHub的Issue中报告。
______________________________________________________________________
MCPO按需网桥 -具有状态/无状态支持和Nginx集成的可扩展、安全的MCP服务器桥
##备忘
创建生成器(仅第一次)
docker buildx创建--名称multiarch构建器--使用
启动生成器
docker buildx inspect——引导 docker buildx使用multiarch构建器
在多架构中构建和推送
docker构建 \ --平台linux/am64、linux/arm64 \ --标签notfolder/mcpo桥:最新 \ --推 \ .
返回
docker上下文使用默认值 docker buildx使用默认值
