AI Agent 接入 MCP 工具后的部署排查:依赖、目录、权限
现象
这次排查的是一个 AI Agent 工具环境。Agent 页面本身可以正常对话,但一接 MCP 工具,问题就分散开了:
Git 工具能看到仓库名,读 diff 时 permission denied
Playwright MCP 容器启动慢,偶尔卡在依赖下载
数据库工具能连上,但账号权限过大
Agent 能写文件,但工作区边界不清楚
日志散在 Agent 应用、MCP Server 和工具容器里
这类问题不要只按“模型效果不好”处理。Agent 接入 MCP 以后,排查重点要从模型层扩展到工具调用和运行边界。
适合落地的 Agent 场景
先说明一下这类环境为什么值得搭。AI Agent 接入工具后,适合处理的是“需要上下文 + 需要动作”的工作,而不只是普通问答。
常见场景:
| 场景 | Agent 可以做什么 | 需要接入的工具 |
|---|---|---|
| 代码仓库巡检 | 看 diff、整理影响范围、生成变更摘要 | Git MCP、文件工具 |
| PR 辅助 | 生成测试建议、检查配置变更 | Git MCP、知识库 |
| Web 测试巡检 | 打开测试环境、截图、收集报错 | Playwright MCP |
| 数据排查 | 查询只读库、整理异常指标 | DB MCP |
| 运维 runbook | 按步骤查服务状态和日志 | Shell MCP、容器日志 |
| 内部知识库 | 结合文档、工单和代码回答问题 | 文档检索、Git 工具 |
这些场景的收益是减少重复整理和跨系统切换。也因为 Agent 会真实调用工具,所以后面必须把依赖、目录、权限和日志排清楚。
我这次按这个顺序排:
依赖检查 -> Compose 启动 -> 工作区挂载 -> 工具权限 -> 日志和回滚
1. 先把不同来源的依赖拆开
MCP 工具服务经常不止一个依赖。GitHub MCP Server、浏览器工具、Postgres、Redis 可能来自不同制品源。如果直接 docker compose up -d,失败时不容易判断是哪个环节卡住。
先拆关键依赖:
docker pull ghcr.1ms.run/github/github-mcp-server
docker pull mcr.1ms.run/playwright/mcp
docker pull docker.1ms.run/postgres:16-alpine
docker pull docker.1ms.run/redis:7-alpine
docker pull docker.1ms.run/python:3.12-slim
这里的目标不是“优化所有问题”,只是先确认这些工具依赖能进入当前环境。依赖层能启动,再继续看权限和沙箱。
2. Compose 先把应用和工具拆开
下面是我会保留的最小 compose 结构。真实环境里替换 token、依赖版本和启动命令即可。
services:
agent-api:
image: docker.1ms.run/python:3.12-slim
container_name: agent-api
working_dir: /app
command: ["python", "server.py"]
env_file:
- .env.agent
volumes:
- ./app:/app:ro
- ./workspace:/workspace
depends_on:
- mcp-github
- mcp-browser
- postgres
- redis
mcp-github:
image: ghcr.1ms.run/github/github-mcp-server
container_name: mcp-github
env_file:
- .env.github.readonly
read_only: true
cap_drop:
- ALL
mcp-browser:
image: mcr.1ms.run/playwright/mcp
container_name: mcp-browser
shm_size: "1gb"
cap_drop:
- ALL
postgres:
image: docker.1ms.run/postgres:16-alpine
environment:
POSTGRES_DB: agent
POSTGRES_USER: agent_readonly
POSTGRES_PASSWORD: change_me
volumes:
- ./data/postgres:/var/lib/postgresql/data
redis:
image: docker.1ms.run/redis:7-alpine
这里有几个有用的边界:
agent-api和 MCP 工具服务分开,出问题能单独看日志。/app只读,避免 Agent 修改应用代码。/workspace单独可写,用来放输出文件。- GitHub MCP 使用只读 token。
- Browser MCP 单独限制能力和资源。
3. 启动以后不要只看 running
docker compose pull
docker compose up -d
docker compose ps
很多时候 ps 看着正常,但工具调用还是失败。继续看日志:
docker compose logs --tail=120 agent-api
docker compose logs --tail=120 mcp-github
docker compose logs --tail=120 mcp-browser
再检查目录边界:
docker exec agent-api test -w /workspace
docker exec agent-api test ! -w /app
预期结果是:/workspace 可写,/app 不可写。如果 /app 也可写,说明 compose 挂载需要调整。
4. 文件工具不要碰宿主机大目录
我不建议这样挂:
/
/root
/home
/var/run/docker.sock
尤其是 /var/run/docker.sock。Agent 如果能控制宿主机 Docker,很多容器隔离就没有意义了。
如果 Agent 需要读某个仓库,可以单独挂载只读目录:
volumes:
- ./repo:/repo:ro
- ./workspace:/workspace
这样 Agent 可以读代码,也能把分析结果写到工作区,但不能顺手改掉代码目录。
5. 数据库和 Git 权限先从只读开始
数据库账号可以先这样处理:
CREATE USER agent_readonly WITH PASSWORD 'change_me';
GRANT CONNECT ON DATABASE agent TO agent_readonly;
GRANT USAGE ON SCHEMA public TO agent_readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA public TO agent_readonly;
Git token 也一样,先只读,再按任务需要逐步开放。不要为了 Demo 方便,把个人全权限 token 塞进 MCP Server。
6. 常见错误怎么分
context deadline exceeded
先判断是不是依赖启动层:
docker pull ghcr.1ms.run/github/github-mcp-server
依赖能拉,再看 MCP Server 访问外部服务是否超时。
permission denied
先看容器用户和目录:
docker compose exec agent-api id
ls -lah ./workspace
如果是 Git 工具报错,再看 token 权限和仓库范围。
工具调用成功但没人能复盘
至少要记录:
Agent 会话 ID
工具名称
参数摘要
执行结果
错误原因
对应容器日志
7. 最后保留一张检查单
工具依赖来源明确,可单独验证
Agent 应用和 MCP 工具服务分开
应用目录只读
工作区单独挂载
不挂 Docker socket
Git token 只读起步
数据库账号只读起步
工具调用有日志
Agent 和 MCP Server 可独立回滚
总结
AI Agent 的价值在于把代码、测试、数据、运维和知识库这些动作串起来,减少重复整理和来回切系统的成本。接入 MCP 工具后,部署排查不能只看模型和提示词。工具服务能不能启动、Agent 能访问哪些目录、token 权限多大、数据库是否只读、日志能不能追到调用链,这些才是上线前最容易出问题的地方。
依赖检查只解决第一层:让 Git 工具、浏览器工具、数据库和缓存先进入可启动状态。后面的目录、权限、网络、Secret 和审计,仍然要逐层确认。
AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。
更多推荐


所有评论(0)