Skip to main content
Glama

phabricator-mcp

An MCP (Model Context Protocol) server that wraps Phabricator's Conduit API, enabling any MCP client to interact with Phabricator tasks, code reviews, repositories, and more.

Star History

Star History Chart

Related MCP server: Phabricator MCP Server

Installation

Claude Code (CLI)

claude mcp add --scope user phabricator -- npx @freelancercom/phabricator-mcp@latest

Or with environment variables (if not using ~/.arcrc):

claude mcp add --scope user phabricator \
  -e PHABRICATOR_URL=https://phabricator.example.com \
  -e PHABRICATOR_API_TOKEN=api-xxxxx \
  -- npx @freelancercom/phabricator-mcp@latest

The --scope user flag installs the server globally, making it available in all projects.

Codex (OpenAI CLI)

Add to your Codex config (~/.codex/config.json):

{
  "mcpServers": {
    "phabricator": {
      "command": "npx",
      "args": ["@freelancercom/phabricator-mcp@latest"],
      "env": {
        "PHABRICATOR_URL": "https://phabricator.example.com",
        "PHABRICATOR_API_TOKEN": "api-xxxxxxxxxxxxx"
      }
    }
  }
}

opencode

Add to your opencode config (~/.config/opencode/config.json):

{
  "mcp": {
    "servers": {
      "phabricator": {
        "command": "npx",
        "args": ["@freelancercom/phabricator-mcp@latest"],
        "env": {
          "PHABRICATOR_URL": "https://phabricator.example.com",
          "PHABRICATOR_API_TOKEN": "api-xxxxxxxxxxxxx"
        }
      }
    }
  }
}

VS Code with Claude Extension

Add to your VS Code settings.json:

{
  "claude.mcpServers": {
    "phabricator": {
      "command": "npx",
      "args": ["@freelancercom/phabricator-mcp@latest"],
      "env": {
        "PHABRICATOR_URL": "https://phabricator.example.com",
        "PHABRICATOR_API_TOKEN": "api-xxxxxxxxxxxxx"
      }
    }
  }
}

Cursor

Add to your Cursor MCP config (~/.cursor/mcp.json):

{
  "mcpServers": {
    "phabricator": {
      "command": "npx",
      "args": ["@freelancercom/phabricator-mcp@latest"],
      "env": {
        "PHABRICATOR_URL": "https://phabricator.example.com",
        "PHABRICATOR_API_TOKEN": "api-xxxxxxxxxxxxx"
      }
    }
  }
}

GitHub Copilot (VS Code)

Add to your VS Code settings.json:

{
  "github.copilot.chat.mcp.servers": {
    "phabricator": {
      "command": "npx",
      "args": ["@freelancercom/phabricator-mcp@latest"],
      "env": {
        "PHABRICATOR_URL": "https://phabricator.example.com",
        "PHABRICATOR_API_TOKEN": "api-xxxxxxxxxxxxx"
      }
    }
  }
}

Upgrading

The default install uses @freelancercom/phabricator-mcp@latest, which tells npx to check for updates on each run. No action needed.

If you pinned a specific version (e.g. @freelancercom/phabricator-mcp@1.0.0) or omitted the version suffix, npx caches the package and won't pick up new versions. To upgrade:

npx clear-npx-cache

Then restart your MCP client.

Migrating from github:freelancer/phabricator-mcp

If you previously installed using the GitHub URL, update your config to use the npm package instead:

# Remove old server
claude mcp remove phabricator -s user

# Add new one
claude mcp add --scope user phabricator -- npx @freelancercom/phabricator-mcp@latest

For JSON configs, replace ["github:freelancer/phabricator-mcp"] with ["@freelancercom/phabricator-mcp@latest"] in your args.

Configuration

The server automatically reads configuration from ~/.arcrc (created by Arcanist). No additional configuration is needed if you've already set up arc.

Alternatively, set environment variables (which take precedence over .arcrc):

  • PHABRICATOR_URL - Phabricator instance URL

  • PHABRICATOR_API_TOKEN - Conduit API token

You can get an API token from your Phabricator instance at: Settings > Conduit API Tokens

By default, Claude Code will prompt you for permission each time a Phabricator tool is called. It's recommended to allowlist the read-only tools so they run without prompts, while keeping write operations (create, edit, comment) behind a confirmation step.

Add to your ~/.claude/settings.json:

{
  "permissions": {
    "allow": [
      "mcp__phabricator__phabricator_task_search",
      "mcp__phabricator__phabricator_task_status_search",
      "mcp__phabricator__phabricator_task_priority_search",
      "mcp__phabricator__phabricator_revision_search",
      "mcp__phabricator__phabricator_diff_search",
      "mcp__phabricator__phabricator_diff_raw",
      "mcp__phabricator__phabricator_revision_paths",
      "mcp__phabricator__phabricator_revision_inline_search",
      "mcp__phabricator__phabricator_repository_search",
      "mcp__phabricator__phabricator_commit_search",
      "mcp__phabricator__phabricator_repository_browse",
      "mcp__phabricator__phabricator_repository_file_content",
      "mcp__phabricator__phabricator_branch_search",
      "mcp__phabricator__phabricator_tag_search",
      "mcp__phabricator__phabricator_repository_file_history",
      "mcp__phabricator__phabricator_repository_code_search",
      "mcp__phabricator__phabricator_user_whoami",
      "mcp__phabricator__phabricator_user_search",
      "mcp__phabricator__phabricator_project_search",
      "mcp__phabricator__phabricator_column_search",
      "mcp__phabricator__phabricator_paste_search",
      "mcp__phabricator__phabricator_document_search",
      "mcp__phabricator__phabricator_blog_search",
      "mcp__phabricator__phabricator_blog_post_search",
      "mcp__phabricator__phabricator_file_search",
      "mcp__phabricator__phabricator_file_info",
      "mcp__phabricator__phabricator_buildable_search",
      "mcp__phabricator__phabricator_build_search",
      "mcp__phabricator__phabricator_build_target_search",
      "mcp__phabricator__phabricator_build_log_search",
      "mcp__phabricator__phabricator_build_plan_search",
      "mcp__phabricator__phabricator_owners_search",
      "mcp__phabricator__phabricator_feed_query",
      "mcp__phabricator__phabricator_conpherence_read",
      "mcp__phabricator__phabricator_audit_query",
      "mcp__phabricator__phabricator_phid_lookup",
      "mcp__phabricator__phabricator_phid_query",
      "mcp__phabricator__phabricator_transaction_search",
      "mcp__phabricator__phabricator_version"
    ]
  }
}

To allowlist all tools including write operations, use "mcp__phabricator__*" instead.

Available Tools

The server hides tools that Phabricator cannot serve, such as the Conpherence tools when Conpherence is not installed. It learns which Conduit methods the instance offers from conduit.query and caches the list in ~/.cache/phabricator-mcp/, so later starts don't wait for Phabricator. Each start refreshes the cache in the background, and if the list has changed, for example after an upgrade, the server tells the client its tool list changed. On the first start the server waits up to 5 seconds for the list; if it gets no answer, every tool is listed.

Task Management (Maniphest)

Tool

Description

phabricator_task_search

Search tasks with filters (status, assignee, project, etc.)

phabricator_task_create

Create a new task

phabricator_task_edit

Edit an existing task, including its due date

phabricator_task_add_comment

Add a comment to a task

phabricator_task_status_search

List all available task statuses on the instance

phabricator_task_priority_search

List all available task priorities on the instance

phabricator_task_edit's dueDate sets the Deadline field of Freelancer's Phabricator extension (maniphest:deadline in phabricator_task_search): a YYYY-MM-DD date with the full year, read as the start of that day in your Phabricator timezone; null removes it. An epoch is also accepted, but only to copy one back from maniphest:deadline.epoch: a computed one is easily a day out in another timezone. A Phabricator without that field, or with a version of the extension that cannot set it through Conduit, refuses the whole edit (has invalid type "maniphest:deadline") and changes nothing.

Code Reviews (Differential)

Tool

Description

phabricator_revision_search

Search code review revisions

phabricator_revision_edit

Edit a revision (accept, reject, abandon, add reviewers, comment, etc.)

phabricator_revision_inline_comment

Create a draft inline comment on a line or character range, optionally with a suggested edit, or a threaded reply to a published one

phabricator_revision_inline_search

List a revision's inline comments with side, range, suggested edit and Done state

phabricator_revision_inline_publish

Publish your draft inline comments as one review, like "Submit" in the web UI

phabricator_revision_inline_done

Check or uncheck "Done" on an inline comment

phabricator_revision_inline_edit

Replace the text and suggested edit of your draft inline comment

phabricator_revision_inline_delete

Delete your draft inline comment

phabricator_diff_raw

Get the raw diff/patch content for a diff by ID

phabricator_diff_search

Search diffs (code change snapshots within a revision)

phabricator_revision_paths

Get the list of changed file paths for a revision

The phabricator_revision_inline_* tools call the differential.inline.* Conduit methods, which stock Phabricator does not ship. Without them, phabricator_revision_inline_comment still creates plain line comments through differential.createinline, but those drafts cannot be published through Conduit. Replies (replyToInlineID) need a version of the extension that supports them; an older one refuses the call (does not define these parameters: 'replyToInlineID') and creates nothing.

Repositories (Diffusion)

Tool

Description

phabricator_repository_search

Search repositories

phabricator_commit_search

Search commits

phabricator_repository_browse

Browse a repository directory tree

phabricator_repository_file_content

Read a file's text from a repository, whole or by line range

phabricator_branch_search

List branches in a repository

phabricator_tag_search

List tags in a repository

phabricator_repository_file_history

Get commit history for a file path

phabricator_repository_code_search

Search (grep) file contents within a repository

phabricator_repository_edit

Create or edit a Diffusion repository

Users

Tool

Description

phabricator_user_whoami

Get current authenticated user

phabricator_user_search

Search users

Projects

Tool

Description

phabricator_project_search

Search projects

phabricator_project_edit

Create or edit a project

phabricator_column_search

Search workboard columns

Pastes

Tool

Description

phabricator_paste_search

Search pastes

phabricator_paste_create

Create a paste

phabricator_paste_edit

Edit an existing paste

Wiki (Phriction)

Tool

Description

phabricator_document_search

Search wiki documents

phabricator_document_create

Create a new wiki document

phabricator_document_edit

Edit a wiki document title or content

phabricator_document_add_comment

Add a comment to a wiki document

Blogs (Phame)

Tool

Description

phabricator_blog_search

Search Phame blogs

phabricator_blog_edit

Create or edit a Phame blog

phabricator_blog_post_search

Search blog posts

phabricator_blog_post_create

Create a new blog post

phabricator_blog_post_edit

Edit an existing blog post

phabricator_blog_post_add_comment

Add a comment to a blog post

Transactions

Tool

Description

phabricator_transaction_search

Search transactions (comments, status changes, etc.) on any object

phabricator_transaction_comment_edit

Replace the text of your published comment on any object

phabricator_transaction_comment_edit calls the transaction.comment.edit Conduit method, which stock Phabricator does not ship; the server hides the tool on an instance without it.

Files

Tool

Description

phabricator_file_upload

Upload a file and get an ID for embedding in descriptions/comments via {F<id>}

phabricator_file_search

Search for files

phabricator_file_info

Get file metadata (name, size, MIME type, URI)

Builds (Harbormaster)

Tool

Description

phabricator_buildable_search

Search buildables (revisions/commits with builds)

phabricator_build_search

Search builds (CI/build results)

phabricator_build_target_search

Search build targets (individual build steps)

phabricator_build_log_search

Search build logs (output from build steps)

phabricator_build_command

Report build status to Harbormaster (pass, fail, work)

phabricator_build_plan_search

Search build plans (CI pipeline configurations)

Code Ownership (Owners)

Tool

Description

phabricator_owners_search

Search code ownership packages

Activity Feed

Tool

Description

phabricator_feed_query

Query the activity feed (recent task updates, revision changes, commits, etc.)

Chat (Conpherence)

Tool

Description

phabricator_conpherence_create

Create a new chat room/thread, with you as a participant

phabricator_conpherence_edit

Edit a chat room (rename, manage participants)

phabricator_conpherence_read

Read messages from a chat thread

phabricator_conpherence_send

Send a message to a chat thread

Audits

Tool

Description

phabricator_audit_query

Search commit audit requests

PHID Utilities

Tool

Description

phabricator_phid_lookup

Look up PHIDs by name (e.g., "T123", "@username")

phabricator_phid_query

Get details about PHIDs

Server

Tool

Description

phabricator_version

Get the version of the running phabricator-mcp server

Usage

Once connected, just ask your AI assistant to perform Phabricator tasks in natural language:

Tasks

  • "Show my assigned tasks"

  • "Create a task titled 'Fix login bug' in project Backend"

  • "Add a comment to T12345 saying the fix is ready for review"

  • "Close task T12345"

  • "What custom fields are available for incident tasks?"

  • "Set the start date and root cause category on T12345"

  • "Set the due date of T12345 to 20 November 2026"

  • "Make T456 a subtask of T123"

  • "Upload this screenshot and add it to the description of T789"

Code Reviews

  • "Show my open diffs"

  • "What's the status of D6789?"

  • "Review the code changes in D6789"

  • "Add @alice as a reviewer to D6789"

  • "Accept D6789"

  • "Leave an inline comment on line 42 of src/index.ts in D6789"

  • "Suggest an edit for lines 10-12 of src/config.ts in D6789, then publish my review"

  • "Reword my draft inline comment on src/config.ts in D6789, and delete the one on line 12"

  • "Address the unresolved inline comments on D6789"

  • "Reply to the inline comments on D6789 that ask me a question, then publish"

Repositories & Builds

  • "Show me the contents of src/config.ts in repo Backend"

  • "Browse the /src directory in the main repo"

  • "Is the build passing on D6789?"

  • "Show me the build logs for D6789"

  • "Who owns the code in /src/auth/?"

Search & Lookup

  • "Find user john.doe"

  • "Search for projects with 'backend' in the name"

  • "Search commits by author alice"

  • "Look up T123 and D456"

  • "Show me the comments on D6789"

  • "Fix the typo in my last comment on T12345"

Wiki & Pastes

  • "Find wiki pages about deployment"

  • "Create a paste with this error log"

Blogs

  • "Search for blog posts about release notes"

  • "Create a new draft blog post titled 'Q1 Update' on the engineering blog"

  • "Publish blog post J42"

  • "Add a comment to blog post J15"

The appropriate tools are called automatically based on your request.

Development

git clone https://github.com/freelancer/phabricator-mcp.git
cd phabricator-mcp
npm install
npm run build
npm test
npm run dev  # watch mode

See CONTRIBUTING.md for how to check a change against a real Phabricator before opening a pull request.

Architecture

  • src/index.ts - Entry point, MCP server with stdio transport

  • src/config.ts - Config loader (reads ~/.arcrc or env vars)

  • src/client/conduit.ts - Phabricator Conduit API client

  • src/tools/*.ts - Tool implementations per Phabricator application

License

MIT

Available Tools

65 tools
phabricator_audit_queryA
Read-only

Search commit audit requests using the legacy audit.query endpoint. For most use cases, prefer phabricator_commit_search with the auditors attachment. This frozen endpoint provides audit-specific status filtering not available in the modern API.

Inputs: limit, offset, status, commitPHIDs, +1 more.

phabricator_blog_editA
Destructive

Create or edit a Phame blog. Omit objectIdentifier to create a new blog (name is required for creation).

Inputs: name, status, subtitle, parentSite, +6 more.

phabricator_blog_post_add_commentC

Add a comment to a Phame blog post

Inputs: comment (required), objectIdentifier (required).

phabricator_blog_post_createC

Create a new Phame blog post

Inputs: body (required), title (required), blogPHID (required), subtitle, +2 more.

phabricator_blog_post_editC
Destructive

Edit an existing Phame blog post

Inputs: objectIdentifier (required), body, title, comment, +5 more.

phabricator_blog_post_searchC
Read-only

Search Phame blog posts

Inputs: after, limit, order, before, +3 more.

phabricator_build_commandA
Destructive

Send a command to a Harbormaster build target. Report build status (pass/fail/work) with optional unit test and lint results.

Inputs: type (required), buildTargetPHID (required), lint, unit.

phabricator_conpherence_createB

Create a Conpherence room; you are always a participant.

Inputs: title (required), topic, message, participantPHIDs.

phabricator_conpherence_editB
Destructive

Edit a Conpherence chat room/thread. Rename it or manage participants.

Inputs: objectIdentifier (required), title, topic, comment, +2 more.

phabricator_conpherence_readA
Read-only

Read messages from a Conpherence chat room/thread (returned in reverse chronological order). Uses conpherence.querytransaction (the only Conduit method that returns message content).

Inputs: limit, offset, roomID, roomPHID.

phabricator_conpherence_sendB

Send a message to a Conpherence chat room/thread

Inputs: message (required), objectIdentifier (required).

phabricator_diff_rawA
Read-only

Get the raw diff/patch content for a Differential diff by diff ID. Use phabricator_diff_search to find the diff ID from a revision PHID first.

Inputs: diffID (required).

phabricator_document_add_commentB

Add a comment to a Phriction wiki document

Inputs: comment (required), objectIdentifier (required).

phabricator_document_createB

Create a new Phriction wiki document. Uses phriction.create (the only method that can create documents).

Inputs: slug (required), title (required), content (required), description.

phabricator_document_editB
Destructive

Edit an existing Phriction wiki document title or content. Uses phriction.edit (the only method that can update document content).

Inputs: slug (required), title, content, description.

phabricator_feed_queryB
Read-only

Query the Phabricator activity feed. Returns recent activity (task updates, revision changes, commits, etc.) as an object keyed by story PHID. Uses feed.query (the only Conduit method for feed data).

Inputs: view, after, limit, before, +1 more.

phabricator_file_infoA
Read-only

Get metadata about a file (name, size, MIME type, URI). Use the returned URI to download. Provide at least one of id or phid. Uses file.info (the only Conduit method that returns download URIs).

Inputs: id, phid.

phabricator_file_uploadA

Upload a file to Phabricator. Returns a file PHID that can be used with phabricator_file_info to get the file ID for embedding in Remarkup via {F}.

Inputs: data_base64 (required), name, canCDN, viewPolicy.

phabricator_paste_createC

Create a new Phabricator paste

Inputs: content (required), title, status, language, +2 more.

phabricator_paste_editC
Destructive

Edit an existing Phabricator paste

Inputs: objectIdentifier (required), title, status, comment, +6 more.

phabricator_phid_lookupB
Read-only

Look up PHIDs by human-readable names (e.g., "T123", "D456", "@username")

Inputs: names (required).

phabricator_phid_queryA
Read-only

Get handle information (name, URI, type, status) for PHIDs. For full object data, use application-specific search tools (e.g., phabricator_task_search, phabricator_revision_search).

Inputs: phids (required).

phabricator_project_editA
Destructive

Create or edit a Phabricator project. Omit objectIdentifier to create a new project (name is required for creation).

Inputs: icon, name, slug, color, +7 more.

phabricator_repository_browseB
Read-only

Browse a repository directory tree at a given path and commit/branch. Pass a branch name via the commit parameter.

Inputs: path, limit, commit, offset, +2 more.

phabricator_repository_editA
Destructive

Create or edit a Diffusion repository. To create, omit objectIdentifier and provide vcs + name.

Inputs: vcs, name, space, status, +7 more.

phabricator_repository_file_contentA
Read-only

Read a file's text at a path and commit/branch. Long files are paged: follow the closing note or set startLine/lineCount. A branch or other ref is resolved to a commit, which the note names so later pages read the same version. Binary files return metadata; files over byteLimit return tooHuge.

Inputs: path (required), commit (required), branch, timeout, +5 more.

phabricator_repository_file_historyB
Read-only

Get commit history for a file or directory path in a Diffusion repository

Inputs: path (required), commit (required), limit, branch, +5 more.

phabricator_revision_editB
Destructive

Edit a Differential revision. Supports actions like accept, reject, abandon, request-review, plan-changes, and commandeer. Can also add/remove reviewers, subscribers, and comments.

Inputs: objectIdentifier (required), draft, title, action, +17 more.

phabricator_revision_inline_commentA

Create a draft inline comment on a Differential diff, optionally highlighting a character range and attaching a suggested edit, or a draft reply to a published inline comment (replyToInlineID). Drafts are visible only to you until you call phabricator_revision_inline_publish; a plain comment via phabricator_revision_edit does NOT publish them. Ranges, suggestions and replies need the differential.inline.* Conduit extension; without it, plain line comments fall back to differential.createinline.

Inputs: content (required), revisionID (required), diffID, filePath, +7 more.

phabricator_revision_inline_deleteA
Destructive

Delete your own draft inline comment. Published comments cannot be deleted. Needs the differential.inline.* Conduit extension.

Inputs: inlineID (required).

phabricator_revision_inline_doneA
DestructiveIdempotent

Check or uncheck "Done" on a Differential inline comment. Allowed for the revision author, or for the comment author while it is still a draft. A check by the revision author stays pending (isDonePending) until they next publish, e.g. with phabricator_revision_inline_publish. Needs the differential.inline.* Conduit extension.

Inputs: isDone (required), inlineID (required).

phabricator_revision_inline_editA
DestructiveIdempotent

Replace the text and suggested edit of your own draft inline comment, keeping its place in the diff. Published comments cannot be edited. Needs the differential.inline.* Conduit extension.

Inputs: content (required), inlineID (required), suggestionText.

phabricator_revision_inline_publishA
Destructive

Publish your draft inline comments on a Differential revision, with an optional top-level comment, as one review: the same as pressing "Submit" in the web UI. Also publishes pending "Done" changes you made as the revision author. Without inlineIDs, EVERY draft you have on the revision is published, including ones started in a browser. Needs "Can Edit" on the revision and the differential.inline.* Conduit extension. If a call times out, search before retrying: naming an already-published inline fails.

Inputs: revisionID (required), message, inlineIDs.

phabricator_revision_pathsB
Read-only

Get the list of changed file paths for a Differential revision. Returns an array of file path strings.

Inputs: revision_id (required).

phabricator_task_add_commentB

Add a comment to a Maniphest task

Inputs: comment (required), objectIdentifier (required).

phabricator_task_createC

Create a new Maniphest task

Inputs: title (required), space, points, status, +12 more.

phabricator_task_editC
Destructive

Edit an existing Maniphest task

Inputs: objectIdentifier (required), space, title, points, +21 more.

phabricator_transaction_comment_editA
Destructive

Edit your own published comment (saves a new version). Not for inline comments.

Inputs: content (required), transactionPHID (required), objectIdentifier (required).

phabricator_user_whoamiA
Read-only

Get information about the current authenticated user

Inputs: no named parameters.

phabricator_versionA
Read-only

Get the version of the running phabricator-mcp server

Inputs: no named parameters.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

    TDQS

    B3.1/5.0

    Scored across 65 tools

    Disambiguation4/5

    Tools are strongly namespaced by application (task_, revision_, diff_, repository_, document_, blog_, build_, conpherence_) so most are trivially distinguishable. Minor overlaps remain: revision_inline_comment vs revision_edit (which also adds comments), transaction_search vs the inline/search tools for comments, and phid_lookup vs phid_query are near-neighbors that require reading descriptions to separate.

    Naming Consistency4/5

    The set overwhelmingly follows a phabricator_<domain>_<verb>_<noun> snake_case convention (task_create, revision_search, build_target_search), which is predictable. Deviations exist: version, user_whoami, diff_raw, revision_paths, phid_lookup/phid_query, and inconsistent use of search vs query (feed_query, audit_query, but task_search).

    Tool Count2/5

    65 tools is far beyond a manageable surface for an agent, even accounting for Phabricator's breadth across ~11 applications. Individual applications are reasonably scoped, but the aggregate is too large and includes deep clusters (five differential.inline.* tools alone) that push selection cost high.

    Completeness4/5

    Coverage spans tasks, revisions, diffs, repositories, users, projects, pastes, wiki docs, blogs, files, builds, owners, feed, chat, and audit — genuinely broad with create/edit/search per domain. Notable gaps: no way to create a Differential revision or upload a diff (create-side of code review is missing), and project columns are search-only (no column create/edit), plus no user or flag editing.

    Maintenance

    ActivityMaintained
    ResponsivenessLimited data

    Related MCP Connectors

    Related MCP Servers