A command line tool for interfacing with Drupal.org and GitLab (git.drupalcode.org). Uses the Drupal.org REST API and GitLab REST API.
- PHP 8.1 or higher, with cURL support
- Git - Currently required to apply and create patches. Very useful for contributing patches back to an issue.
-
Download the
drupalorg.pharfile from the latest release.curl -OL https://github.com/mglaman/drupalorg-cli/releases/latest/download/drupalorg.phar
-
Rename the file to
drupalorg, ensure it is executable, and move it into a directory in your PATH (useecho $PATHto see your options).chmod +x drupalorg.phar mv drupalorg.phar /usr/local/bin/drupalorg
-
Run
drupalorgand verify you can see the list of available commands.
Use the following command to install the command line tool via Composer:
composer global require mglaman/drupalorg-cli
drupalorg comes with completion support for all commands, excluding options.
To activate it, either source the completion file or add it to the system-wide completion directory, normally /etc/bash_completion.d/.
In your .bashrc (or .profile) add
source [...]/vendor/mglaman/drupalorg-cli/drupalorg-cli-completion.bash
drupalorg comes with namespace-aware completion out of the box. If jq is installed, the Zsh completion script upgrades itself to use drupalorg list --format=json once per shell session and can complete:
- commands and namespace-prefixed commands
- documented long and short options (i.e. flags)
- command aliases such as
isandpi - positional argument placeholders such as
<nid>
In those placeholders, angle brackets mean the argument is required, and square brackets mean it is optional. For example, <nid> is required and [nid] is optional.
Without jq, the script falls back to the original command and namespace completion behavior.
Copy the Zsh completion file to ~/.zsh/completions/_drupalorg:
mkdir -p ~/.zsh/completions
curl -L https://raw.githubusercontent.com/mglaman/drupalorg-cli/refs/heads/main/drupalorg-cli-completion.zsh -o ~/.zsh/completions/_drupalorgIn your ~/.zshrc add (if not already present):
fpath=(~/.zsh/completions $fpath)
autoload -Uz compinit
compinitRestart your shell or run source ~/.zshrc.
Automatic updating is not yet supported. You will need to manually download new releases.
Use the 'list' command to see available commands.
drupalorg list
Available commands:
help Display help for a command
list List commands
issue
issue:apply Applies the latest patch from an issue.
issue:branch Creates a branch for the issue.
issue:checkout Check out a branch from the GitLab issue fork.
issue:get-fork Show the GitLab issue fork URLs and branches.
issue:interdiff Generate an interdiff for the issue from committed local changes.
issue:link Opens an issue
issue:patch Generate a patch for the issue from committed local changes.
issue:search [is] Searches issues for a project by title keyword.
issue:setup-remote Add the GitLab issue fork as a git remote and fetch it.
issue:show Show a given issue information.
maintainer
maintainer:issues [mi] Lists issues for a user, based on maintainer.
maintainer:release-notes [rn|mrn] Generate release notes.
mcp
mcp:config Output the Claude Desktop MCP configuration snippet.
mcp:serve Start a Model Context Protocol server over stdio.
mr
mr:diff Show the unified diff for a merge request.
mr:files List changed files in a merge request.
mr:list [mrl] List merge requests for a Drupal.org issue fork or project.
mr:logs Show failed job traces from the latest pipeline for a merge request.
mr:status Show the pipeline status for a merge request.
project
project:issues [pi] Lists issues for a project.
project:kanban Opens project kanban
project:link Opens project page
project:release-notes [prn] View release notes for a release
project:releases Lists available releases
skill
skill:install Installs the drupalorg-cli discovery skill into .claude/skills/ in the current directory.
skill:get Outputs current skill content for agent consumption.
Some Drupal.org projects have migrated their issue queues to GitLab work items at git.drupalcode.org. These projects are detected automatically via field_project_has_issue_queue on the project node.
project:issues fetches from the GitLab API instead of Drupal.org for these projects.
The following commands accept a work item reference in place of a Drupal.org issue NID:
# Full URL
drupalorg issue:show https://git.drupalcode.org/project/ai_context/-/work_items/3586157
# Explicit path
drupalorg issue:show project/ai_context#3586157
# Shorthand (project/ prefix assumed)
drupalorg issue:show ai_context#3586157The same formats work for issue:get-fork and mr:list. MR URLs also work directly:
drupalorg mr:list https://git.drupalcode.org/project/ai_context/-/merge_requests/131drupalorg-cli ships with skills for Claude Code and other AI agents that support the skills format.
Install via npx skills
npx skills add mglaman/drupalorg-cliRun this inside your Drupal project directory:
drupalorg skill:installBoth methods install a discovery stub into .claude/skills/drupalorg-cli/. The stub tells agents to call drupalorg skill:get for current instructions, so skills never go stale between releases.
| Skill | Description |
|---|---|
drupalorg-cli |
Full CLI reference — commands, output formats, error handling |
drupalorg-work-on-issue |
End-to-end GitLab MR contribution workflow |
drupalorg-issue-search |
Search issues across API, Drupal.org scrape, and web |
drupalorg-issue-summary-update |
Analyse and draft updated issue summaries |
Fetch any skill on demand:
drupalorg skill:get drupalorg-cli
drupalorg skill:get drupalorg-work-on-issueIf you want to use this to generate patches that you can contribute back to a Drupal project, it's best to work within a cloned repo of that project. To get instructions for cloning a project's repo, visit the "Version Control" tab on the project page.
From within the directory of the project we're working on:
drupalorg issue:apply [issue number]- Create a new branch for the given issue, apply the latest patch on the issue to the new branch, then commit the changes locally.drupalorg issue:patch [issue number]- Create a new patch for the given issue from the changes committed locally.
- Clone the repository
- In the drupalorg-cli directory, run
composer install - Run the script with
./drupalorg