laravel prod mcp
A. 安全生产MCP服务器 (STDIO)允许 Codex CLI 跑 *常见,阅读最多* a的生产诊断 拉瑞维尔 应用 不授予shell访问权限.
建筑
- Codex CLI⇄ (stdio)⇄ 此MCP服务器(在本地运行)
- 此MCP服务器⇄ (SSH)⇄
laravel-diag远程运行器(在生产主机上运行) laravel-diag执行严格的诊断列表并返回JSON
为什么会分裂?它避免了公开暴露MCP服务器,并允许您使用SSH+强制命令+分配列表来加强访问。
______________________________________________________________________
你得到了什么(工具)
应用程序/级别
health--检查Laravel健康端点(/up默认情况下)artisan_version—php artisan --versionartisan_about—php artisan aboutartisan_migrate_status—php artisan migrate:statusartisan_schedule_list—php artisan schedule:listartisan_queue_failed—php artisan queue:failedartisan_horizon_status—php artisan horizon:status(如果已安装)file_list--列出应用程序根目录下的文件/目录(可选递归)file_read--按相对路径读取应用程序根目录下的任何文件env_read--阅读Laravel.env*来自应用程序根目录的文件(已尽最大努力编辑)
日志
logs_list--列出中的日志文件storage/logslogs_tail--尾部最后N行(默认为最新日志文件)logs_grep--日志中的固定字符串搜索(带上限)logs_last_error--启发式“显示最后一个错误查找行”
系统
sys_info--未修改/日期/正常运行时间/哇sys_disk--df-hsys_memory--free-m(或/proc回退)sys_top--ps快照(CPU和内存)php_version--php-vphp_extensions--php-m
Laravel缓存工件(安全)
cache_status--列表bootstrap/cache/*.php具有mtime+大小的文件
数据库(只读)
database_connections--列出配置的Laravel DB连接和默认连接database_schema--检查表/列/索引/外键(带可选过滤器)database_query--执行只读SQL(SELECT/SHOW/EXPLAIN/DESCRIBE)带行帽
碎玻璃突变(默认禁用)
artisan_optimize_clear—php artisan optimize:clearartisan_config_cache—php artisan config:cacheartisan_queue_restart—php artisan queue:restartartisan_queue_retry—php artisan queue:retryartisan_pulse_restart—php artisan pulse:restart(如果已安装)
两者都是 双栅极:
- 当地:
LARAVEL_PROD_ENABLE_MUTATIONS=1 - 远程:
LARAVEL_DIAG_ENABLE_MUTATIONS=1
______________________________________________________________________
需求
本地
- Node.js>=18
- 已安装Codex CLI
- SSH访问prod
远程(生产主机)
- PHP CLI可用(适用于运行者)
- 公用设施:
sh,tail,grep,df,ps,curl(或至少卷曲health) - 专用锁定用户(推荐)
______________________________________________________________________
安装(本地)
git clone laravel-prod-mcp
cd laravel-prod-mcp
npm install构建输出
此repo可以在两种模式下运行:
A) Dev/TS模式(最初推荐):
npm run dev
# (runs: tsx src/index.ts)B) 内置JS模式(建议稳定后使用):
npm run build
ls -la dist/index.js
npm start
# (runs: node dist/index.js)如果dist/index.js之后不存在npm run build,使用TS模式(npm run dev)并指向Codextsx src/index.ts.
______________________________________________________________________
安装(远程/生产)
1) 创建受限用户(推荐)
示例(Ubuntu/Debian):
sudo adduser --disabled-password --gecos "" codexdiag2) 安装远程运行器
将运行器复制到服务器(或使用您的部署机制):
# from your local machine
scp scripts/remote/laravel-diag root@prod.example.com:/tmp/laravel-diag
scp scripts/remote/laravel-diag.env.example root@prod.example.com:/tmp/laravel-diag.env.example在服务器上:
sudo install -m 0755 /tmp/laravel-diag /usr/local/bin/laravel-diag
sudo install -m 0640 /tmp/laravel-diag.env.example /etc/laravel-diag.env
sudo nano /etc/laravel-diag.env # set LARAVEL_DIAG_APP_DIR etc(或者运行 scripts/remote/install-remote.sh 根。)
3) 配置 /etc/laravel-diag.env (必填)
您至少必须设置:
LARAVEL_DIAG_APP_DIR=/absolute/path/to/your/app # folder where artisan lives例子:
LARAVEL_DIAG_APP_DIR=/home/easytoday/domains/app.easytoday.se/app
LARAVEL_DIAG_LOG_DIR=/home/easytoday/domains/app.easytoday.se/app/storage/logs
LARAVEL_DIAG_ARTISAN=/home/easytoday/domains/app.easytoday.se/app/artisan
LARAVEL_DIAG_PHP_BIN=php
LARAVEL_DIAG_HEALTH_URL=http://127.0.0.1/up
LARAVEL_DIAG_TIMEOUT_SEC=25
LARAVEL_DIAG_MAX_OUTPUT_CHARS=200000
LARAVEL_DIAG_ENABLE_MUTATIONS=04) 权限说明(DirectAdmin/通用主机)
SSH用户必须能够 遍历 (+x)以及(适用于工匠) 读 应用程序目录。
在某些DirectAdmin设置中, /home//domains 是否受组限制(例如组 access). 如果你看到 Permission denied 当检查应用程序路径时 codexdiag,将其添加到该组:
sudo usermod -aG access codexdiag
# then reconnect SSH so the new group is active验证:
ssh codexdiag@prod.example.com 'id'
ssh codexdiag@prod.example.com 'ls -la /path/to/app/artisan'5) SSH硬化(强烈推荐)
输入您的公钥 ~codexdiag/.ssh/authorized_keys 和使用 强制命令.
看 scripts/remote/authorized_keys.example.
这使得OpenSSH始终执行 /usr/local/bin/laravel-diag (并忽略任何客户端提供的命令)。
______________________________________________________________________
配置MCP服务器(本地)
创建 .env 在repo根目录中(复制自 .env.example):
cp .env.example .env
nano .env最小值:
LARAVEL_PROD_HOST=prod.example.com
LARAVEL_PROD_USER=codexdiag
LARAVEL_PROD_SSH_KEY=/home/alex/.ssh/codexdiag_ed25519______________________________________________________________________
将Codex CLI连接到此MCP服务器
选项A:使用 codex mcp add (推荐)
TS/dev模式(最初推荐):
codex mcp add laravelProd --env LARAVEL_PROD_HOST=prod.example.com --env LARAVEL_PROD_USER=codexdiag --env LARAVEL_PROD_SSH_KEY=/home/alex/.ssh/codexdiag_ed25519 -- npx tsx /ABS/PATH/laravel-prod-mcp/src/index.ts内置JS模式(一次 dist/index.js 存在):
codex mcp add laravelProd --env LARAVEL_PROD_HOST=prod.example.com --env LARAVEL_PROD_USER=codexdiag --env LARAVEL_PROD_SSH_KEY=/home/alex/.ssh/codexdiag_ed25519 -- node /ABS/PATH/laravel-prod-mcp/dist/index.js选项B:编辑 ~/.codex/config.toml
重要提示:enabled_tools必须低于[mcp_servers.laravelProd](不低于.env).
TS/dev模式:
[mcp_servers.laravelProd]
command = "npx"
args = ["tsx", "/ABS/PATH/laravel-prod-mcp/src/index.ts"]
startup_timeout_sec = 20
tool_timeout_sec = 60
enabled_tools = [
"health",
"logs_list",
"logs_tail",
"logs_grep",
"logs_last_error",
"sys_info",
"sys_disk",
"sys_memory",
"sys_top",
"php_version",
"php_extensions",
"cache_status",
"file_list",
"file_read",
"env_read",
"database_connections",
"database_schema",
"database_query",
"artisan_version",
"artisan_about",
"artisan_migrate_status",
"artisan_schedule_list",
"artisan_queue_failed",
"artisan_horizon_status",
]
[mcp_servers.laravelProd.env]
LARAVEL_PROD_HOST = "prod.example.com"
LARAVEL_PROD_USER = "codexdiag"
LARAVEL_PROD_SSH_KEY = "/home/alex/.ssh/codexdiag_ed25519"内置JS模式:
[mcp_servers.laravelProd]
command = "node"
args = ["/ABS/PATH/laravel-prod-mcp/dist/index.js"]
startup_timeout_sec = 20
tool_timeout_sec = 60
enabled_tools = [
"health",
"logs_list",
"logs_tail",
"logs_grep",
"logs_last_error",
"sys_info",
"sys_disk",
"sys_memory",
"sys_top",
"php_version",
"php_extensions",
"cache_status",
"file_list",
"file_read",
"env_read",
"database_connections",
"database_schema",
"database_query",
"artisan_version",
"artisan_about",
"artisan_migrate_status",
"artisan_schedule_list",
"artisan_queue_failed",
"artisan_horizon_status",
]
[mcp_servers.laravelProd.env]
LARAVEL_PROD_HOST = "prod.example.com"
LARAVEL_PROD_USER = "codexdiag"
LARAVEL_PROD_SSH_KEY = "/home/alex/.ssh/codexdiag_ed25519"______________________________________________________________________
操作说明
在哪里 /up 来自?
Laravel提供了一个内置的健康端点 /up 在现代骨骼中。
在prod中关闭APP_DEBUG
该工具集假设您是通过日志/诊断进行调试的,而不是通过启用APP_DEBUG。
输出大小、超时
MCP服务器和远程运行器都强制执行超时和输出上限。
______________________________________________________________________
故障排除
MCP握手失败
- 确保MCP服务器 不 打印到stdout(仅JSON-RPC)。对日志使用stderr。
- 验证入口点路径是否存在:
- TS模式: src/index.ts - 构建模式: dist/index.js 之后 npm run build
SSH连接
确认SSH以非交互方式工作:
ssh -i /path/to/key codexdiag@prod.example.com 'echo ok'如果使用强制命令,请运行 ssh codexdiag@prod.example.com 将等待JSON输入;这是意料之中的。
Invalid app dir /权限被拒绝
- 验证
codexdiag可以遍历应用程序的完整路径:
ssh codexdiag@prod.example.com 'namei -l /path/to/app'- 在DirectAdmin上,您可能需要:
sudo usermod -aG access codexdiaghealth 失败
- 确认
curl服务器上存在。 - 确认健康URL是环回的,并且可以从服务器访问:
curl -i http://127.0.0.1/upArtisan命令失败
- 确认PHP CLI可用。
- 确认SSH用户有权读取应用程序并运行
php artisan .... - 确认
LARAVEL_DIAG_APP_DIR指向正确的版本/当前符号链接。
______________________________________________________________________
安全检查表
- 用一 专用SSH用户
- 使用 强制命令 在
authorized_keys - 保留此工具集 只读;仅在玻璃破碎的情况下启用突变
- 保密;仍然将输出视为敏感
- 文件读取仅限于在应用程序根目录下解析的文件(
LARAVEL_DIAG_APP_DIR) - SQL执行仅限于只读分配语句
______________________________________________________________________
许可证
麻省理工学院
