drush mcp
通过Drush为Drupal提供MCP服务器。允许AI代理(Claude Code、Gemini CLI等)通过执行Drush命令与任何Drupal 10+/11+站点进行交互,可以在本地、通过SSH或通过Docker。
两个包:
@bloomidea/drush-mcp(npm)-TypeScript MCP服务器bloomidea/drush-mcp-bridge(Composer)-用于结构化实体操作的PHP Drush桥
需求
- Node.js 18+
- PHP 8.1+
- 德鲁士语12+或13+
- Drupal 10+或11+
快速开始
安装MCP服务器:
npm install -g @bloomidea/drush-mcp在Drupal站点上安装Drush桥:
composer require bloomidea/drush-mcp-bridge添加 代理技能 因此,您的代理知道如何使用Drupal实体、字段和组:
npx skills add Bloomidea/drush-mcp*“在Atrium组中创建任务”* / *“列出所有已发表的文章”* / *“检查Drupal状态”* / *“向节点123添加注释”* 适用于 Claude Code、Cursor、Codex、Gemini、Windsurf和37+代理商.
在克劳德代码(本地)中注册:
claude mcp add drupal -- drush-mcp --local --command "drush"或者使用SSH:
claude mcp add drupal -- drush-mcp --ssh --host example.com --user deploy --root /var/www/html配置
三种方法:CLI标志、YAML配置文件或环境变量。
CLI标志
# Local
drush-mcp --local --command "ddev drush"
# SSH
drush-mcp --ssh --host example.com --user deploy --root /var/www/html
# Docker (static container name)
drush-mcp --docker --host example.com --user deploy --container mycontainer
# Docker (dynamic container lookup via filter)
drush-mcp --docker --host example.com --user deploy --container-filter "label=coolify.serviceName=myapp"配置文件
创建 drush-mcp.yml 在项目根目录或主目录中,或传递 --config path:
sites:
production:
transport: ssh
host: example.com
user: deploy
root: /var/www/html
local:
transport: local
command: ddev drush
defaults:
timeout: 30德鲁什网站别名
如果您的项目已经使用 Drush网站别名 (drush/sites/self.site.yml),字段直接映射到 drush-mcp.yml:
| Drush别名字段 | Drush-mcp等效项 |
|---|---|
host | host |
user | user |
root | root |
uri | uri |
docker.service | container |
所以德鲁什人的别名是这样的:
# drush/sites/self.site.yml
live:
host: example.com
user: deploy
root: /var/www/html
uri: https://example.com成为:
# drush-mcp.yml
sites:
live:
transport: ssh
host: example.com
user: deploy
root: /var/www/html
uri: https://example.com主要区别在于drush-mcp需要一个明确的 transport 字段,并支持其他选项,如 containerFilter 用于动态Docker容器查找。
文件上传设置(每个站点)
drupal_file_upload 和 drupal_file_attach 接受可选 file_upload 中的设置 drush-mcp.yml (所有键都是可选的,显示默认值):
sites:
production:
transport: ssh
host: example.com
user: deploy
root: /var/www/html
uri: https://example.com # required to get a real public URL back
file_upload:
max_size: 10485760 # 10 MB; further capped by upload_max_filesize / post_max_size
allowed_extensions: [txt, md, pdf, png, jpg, jpeg, gif, svg, log, sql, json, yaml, yml, zip, tar, gz]
default_uid: 0 # 0 = anonymous; set to a real user ID for attribution
destination_prefix: mcp-uploads # files land in ://
//没有a uri 为站点配置后,该工具仍然可以工作,但 url 在响应中是 null (CLI模式下的drush没有 --uri 无法构建可路由的公共URL)。
环境变量
| 变量 | 描述 |
|---|---|
DRUSH_MCP_TRANSPORT | local, ssh,或 docker |
DRUSH_MCP_HOST | SSH/Docker主机 |
DRUSH_MCP_USER | SSH/Docker用户 |
DRUSH_MCP_ROOT | Drupal根路径 |
DRUSH_MCP_COMMAND | 本地命令(例如。 ddev drush) |
DRUSH_MCP_CONTAINER | Docker容器名称 |
DRUSH_MCP_CONTAINER_FILTER | 用于动态容器查找的Docker过滤器 |
动态容器分辨率
当使用基于Docker的托管平台(Coolify、Docker Swarm等)时,容器名称在每次部署时都会发生变化。使用 --container-filter 或 containerFilter 带有任何有效配置选项 docker ps --filter 表达式:
# Coolify: match by service name label
drush-mcp --docker --host example.com --user root --container-filter "label=coolify.serviceName=myapp-web"
# Docker Compose: match by compose service
drush-mcp --docker --host example.com --user root --container-filter "label=com.docker.compose.service=web"
# Match by image name
drush-mcp --docker --host example.com --user root --container-filter "ancestor=myimage:latest"或在 drush-mcp.yml:
sites:
production:
transport: docker
host: example.com
user: root
containerFilter: "label=coolify.serviceName=myapp-web"容器名称在每次命令时都会通过以下方式重新解析 docker ps --filter,因此它在部署后会自动拾取新的容器。
冷却设置
如果你的Drupal网站运行在 冷却:
- 在Coolify中设置服务名称: 配置>通用>名称 (例如。,
atrium-web) - 使用标签过滤器:
claude mcp add drupal-production -- drush-mcp \
--docker --host your-server.com --user root \
--container-filter "label=coolify.serviceName=atrium-web"- 在Drupal站点上安装网桥:
composer require bloomidea/drush-mcp-bridge - 部署-桥接命令立即可用
工具
无论运输方式如何,所有19种工具都可用:
| 工具 | 说明 |
|---|---|
drupal_entity_create | 从JSON字段创建实体 |
drupal_entity_read | 按类型+ID加载实体 |
drupal_entity_update | 更新现有实体上的字段 |
drupal_entity_list | 使用筛选器查询实体 |
drupal_entity_delete | 按类型+ID删除实体 |
drupal_introspect | 发现实体类型、捆绑包、字段 |
drupal_cache_rebuild | 清除所有缓存 |
drupal_watchdog | 查看最近的日志条目 |
drupal_status | 网站信息(版本、数据库、PHP) |
drupal_config_get | 读取配置值 |
drupal_config_set | 写入配置值 |
drupal_field_info | 实体类型的字段定义 |
drupal_user_create | 创建用户帐户 |
drupal_user_block | 阻止用户帐户 |
drupal_file_upload | 上传字节并创建托管文件实体 |
drupal_file_attach | 在一次往返中上传字节并附加到节点、注释或其他实体上的文件/图像字段 |
drupal_drush | 运行任何Drush命令 |
drupal_php_eval | 执行PHP代码 |
drupal_sql_query | 运行SQL查询 |
多站点
配置多个站点时,所有工具都接受 site 参数以针对特定站点。配置单个站点后,它会自动解析。
德鲁什桥命令
这 bloomidea/drush-mcp-bridge Composer包提供Drush自动发现的结构化实体命令:
| 命令 | 描述 |
|---|---|
mcp:entity-create | 创建实体 |
mcp:entity-read | 读取实体 |
mcp:entity-update | 更新实体 |
mcp:entity-list | 查询实体 |
mcp:introspect | 内省实体类型和字段 |
mcp:file-upload | 上传字节(从stdin读取)并创建托管文件实体 |
mcp:file-attach | 上传字节并附加到实体上的文件/图像字段,使用 file.usage 注册失败后回滚 |
通过Composer安装,Drush会自动获取它们,无需额外注册。
重要提示: 桥接命令类文件必须命名 *DrushCommands.php (不是 *Commands.php)Drush 12的PSR-4发现。该类还提供了一个静态 create() Drupal服务容器中依赖注入的工厂方法。
这与Drupal MCP服务器模块有何不同?
这 MCP服务器 Drupal模块采用了一种不同的方法:它运行MCP服务器 里面 Drupal作为一个PHP模块,通过HTTP和OAuth 2.1身份验证公开工具。
drush mcp跑步 外面 Drupal是一个独立的TypeScript进程,通过shell、SSH或Docker执行Drush命令。这导致了几个实际差异:
| drush-mcp | mcp服务器模块 | |
|---|---|---|
| 在Drupal上安装 | 可选Composer包(桥接) | 必需模块+工具API+简单OAuth |
| 运行为 | 外部Node.js进程 | Drupal的PHP运行时内部 |
| 运输 | STDIO(本地shell、SSH、Docker) | HTTP端点(/_mcp) |
| 身份验证模型 | SSH密钥/shell访问 | OAuth 2.1令牌 |
| 配置 | YAML文件或CLI标志 | Drupal配置实体 |
| 工具 | 17个固定工具+任意Drush | 可通过工具API插件扩展 |
| 多站点 | 内置(一台服务器,多个站点) | 每个Drupal站点一个实例 |
| 无需更改Drupal即可工作 | 是(内置Drush命令无需桥接即可工作) | 否(必须安装和配置模块) |
何时使用drush mcp: 您已经可以通过SSH/shell访问您的站点,希望通过一个MCP服务器连接多个Drupal站点,或者不希望安装额外的Drupal模块。适用于DDEV/Lando的开发工作流程和管理多个站点的运维团队。
何时使用MCP服务器模块: 您需要细粒度的基于OAuth的访问控制,想要公开自定义工具API插件,或者更喜欢将所有内容保留在Drupal的生态系统中。
安全
没有人为的能力层次。如果你有Drush访问网站的权限,你就可以访问所有工具。
安全边界是传输访问:SSH密钥、Docker套接字权限或本地进程访问。桥接命令(mcp:entity-*)强制Drupal的实体访问检查。电动工具(drupal_drush, drupal_php_eval, drupal_sql_query)不要——相应地对待他们。
许可证
麻省理工学院
