Enables Claude Code to manage the entire GitHub workflow from creating issues and branches to opening pull requests and handling reviews.
Also known as neturely/okffs, @neturely/okffs
- Stars
- 2
- Tools
- 24
- Downloads, 30 days
- —
- Latest version
- 0.15.0
- Last commit
- Nov 3, 2026
- License
- MIT
What is okffs MCP?
okffs enables Claude Code to manage the entire GitHub workflow from creating issues and branches to opening pull requests and handling reviews. It exposes 24 tools, such as create_issue, create_issues_from_list, plan.
Summary generated from the project's README
About okffs MCP server
Managing the complete GitHub lifecycle from within Claude Code is what okffs enables for developers. It provides a structured workflow that connects issues, branches, and pull requests through natural language commands. By using this server, you can transform a simple conversation into a series of organized GitHub actions, including creating issues, planning complex work, and handling pull request reviews.
Setup is straightforward and requires little configuration if you already have the GitHub CLI signed in to your repository. You can use the npx setup wizard to handle authentication and environment variables, or simply use the /okffs:setup slash command within Claude Code to configure it conversationally. The server works locally by connecting to your existing repository environment.
This tool distinguishes itself by offering an autopilot mode for hands-off sessions and specialized tools for release management. It can automate version bumping, changelog generation, and branch promotion. It also includes advanced features like monitoring GitHub Actions check runs and managing GitHub Projects boards to keep your task priority and effort synchronized.
What you can do with it
- 1Automated task planningConvert a high-level description of a feature into a structured set of linked GitHub issues and branches.
- 2Streamlined pull request reviewsAutomatically address feedback from inline review comments by applying fixes and pushing updates.
- 3Hands-off development sessionsDrive an issue through the entire lifecycle to a merged pull request using minimal manual intervention.
Written from the project's README. Every use case is checked against a quote from it.
How to install okffs MCP
Formats verified 10 Nov 2026Add to CursorAdd to GooseInstall okffs MCP in Claude Code
$ claude mcp add --env 'GITHUB_TOKEN=<YOUR_GITHUB_TOKEN>' okffs -- npx -y @neturely/okffsInstall okffs MCP in Cursor
~/.cursor/mcp.json
{
"mcpServers": {
"okffs": {
"command": "npx",
"args": [
"-y",
"@neturely/okffs"
],
"env": {
"GITHUB_TOKEN": "<YOUR_GITHUB_TOKEN>"
}
}
}
}Install okffs MCP in VS Code
.vscode/mcp.json
{
"servers": {
"okffs": {
"type": "stdio",
"command": "npx",
"args": [
"-y",
"@neturely/okffs"
],
"env": {
"GITHUB_TOKEN": "<YOUR_GITHUB_TOKEN>"
}
}
}
}Install okffs MCP in VS Code CLI
$ code --add-mcp '{"name":"okffs","type":"stdio","command":"npx","args":["-y","@neturely/okffs"],"env":{"GITHUB_TOKEN":"<YOUR_GITHUB_TOKEN>"}}'Install okffs MCP in Claude Desktop
claude_desktop_config.json
{
"mcpServers": {
"okffs": {
"command": "npx",
"args": [
"-y",
"@neturely/okffs"
],
"env": {
"GITHUB_TOKEN": "<YOUR_GITHUB_TOKEN>"
}
}
}
}Install okffs MCP in Codex
$ codex mcp add okffs --env 'GITHUB_TOKEN=<YOUR_GITHUB_TOKEN>' -- npx -y @neturely/okffsInstall okffs MCP in Codex config.toml
~/.codex/config.toml
[mcp_servers.okffs] command = "npx" args = ["-y", "@neturely/okffs"] [mcp_servers.okffs.env] GITHUB_TOKEN = "<YOUR_GITHUB_TOKEN>"
Install okffs MCP in Gemini CLI
$ gemini mcp add -s user -e 'GITHUB_TOKEN=<YOUR_GITHUB_TOKEN>' okffs npx -- -y @neturely/okffsInstall okffs MCP in Gemini settings.json
~/.gemini/settings.json
{
"mcpServers": {
"okffs": {
"command": "npx",
"args": [
"-y",
"@neturely/okffs"
],
"env": {
"GITHUB_TOKEN": "<YOUR_GITHUB_TOKEN>"
}
}
}
}okffs MCP tools 24
Detected from the READMEcreate_issuecreate_issues_from_listplanlist_issuesget_issuecomment_issuelink_issuesclose_issuecreate_pull_requestcommit_and_updatemerge_pull_requestget_pr_checks
| create_issue | — | |
| create_issues_from_list | — | |
| plan | — | |
| list_issues | — | |
| get_issue | — | |
| comment_issue | — | |
| link_issues | — | |
| close_issue | — | |
| create_pull_request | — | |
| commit_and_update | — | |
| merge_pull_request | — | |
| get_pr_checks | — |
Show all 24 toolsShow fewer tools
fix_into_basepromote_branchlist_pr_review_commentsreply_to_review_commentresolve_review_threadprepare_releaseupdate_project_statusset_issue_fieldsupdate_issueconfiguredelete_issuedelete_branch
| fix_into_base | — | |
| promote_branch | — | |
| list_pr_review_comments | — | |
| reply_to_review_comment | — | |
| resolve_review_thread | — | |
| prepare_release | — | |
| update_project_status | — | |
| set_issue_fields | — | |
| update_issue | — | |
| configure | — | |
| delete_issue | — | |
| delete_branch | — |
Configuration
GITHUB_TOKENSecretGitHub PAT (fine-grained recommended). Falls back to `gh auth token` if unset.
GITHUB_OWNERTarget repo owner. Auto-detected from the git origin remote if unset.
GITHUB_REPOTarget repo name. Auto-detected from the git origin remote if unset.
OKFFS_PROJECT_ENABLEDOKFFS_PROJECT_ID
| Name | Description | |
|---|---|---|
| GITHUB_TOKEN | GitHub PAT (fine-grained recommended). Falls back to `gh auth token` if unset. | Secret |
| GITHUB_OWNER | Target repo owner. Auto-detected from the git origin remote if unset. | |
| GITHUB_REPO | Target repo name. Auto-detected from the git origin remote if unset. | |
| OKFFS_PROJECT_ENABLED | — | |
| OKFFS_PROJECT_ID | — |
Automated checks
Ran Nov 12, 2026Full report →Passed our automated checks. That is not a security audit: read the code and give the server the narrowest access it needs. How checks work
- Source repository linked and reachablePass
- Open source license (OSI)Pass
- Commit or release in the last yearPass
- Package name not close to a popular packagePass
- Remote endpoint uses HTTPSNot checked
- Destructive tools are labelledNot checked
- No hidden instructions to the modelPass
- No critical advisory in the package or its dependenciesPass
README
View on GitHubokffs
Turn a conversation with Claude into GitHub issues, branches, and pull requests — without leaving Claude Code.
okffs is a Model Context Protocol server that gives Claude Code a clean issue → branch → PR → close workflow on GitHub. Talk through the work in plain language; okffs creates the issues, matching branches, and pull requests, keeps them linked, and (optionally) syncs a GitHub Projects board — all in one shot.
- One-shot planning — describe a chunk of work and get every issue + branch created, with relationships wired up.
- The whole loop — create, comment, commit, open PRs, handle review feedback, and close, each as a simple ask.
- Sensible defaults — Claude infers labels, priority, and effort from the task; GitHub stays the single source of truth.
- Little to no config — signed in with the
ghCLI inside your repo? You're ready.
Quick start
1. Run the setup wizard from your project root:
npx @neturely/okffs setup
It walks you through auth, repo, and any optional features, writes a .env, then runs a quick GitHub sanity check. Re-run it any time (e.g. after upgrading okffs) — it only asks about options that are new since your last run. If you're happy relying on the GitHub CLI (gh auth login) and working inside the repo you want to manage, you can skip this step entirely — okffs works with no config at all.
Already in Claude Code? Once okffs is connected you can configure it conversationally instead — run the
/okffs:setupslash command and Claude will interview you and write the.envfor you (no terminal needed). okffs also nudges you to run it after an upgrade introduces new options.
2. Add a .mcp.json to your project root:
{
"mcpServers": {
"okffs": {
"command": "npx",
"args": ["@neturely/okffs@latest"]
}
}
}
That's it — npx fetches okffs on first use, and Claude Code picks up the tools automatically. To use a token or a different repo instead of the gh/auto-detect defaults, run okffs setup (above) or edit .env by hand — see Configuration.
Now just ask Claude:
- "Create an issue called 'Fix login button' and start a branch for it."
- "Plan the work for adding user authentication and create the issues."
- "Create issues from this task list: …"
- "List all open issues."
- "Mark issue #5 as blocked by issue #3."
- "Done with issue #42 — open a PR and close it."
- "Address the review comments on PR #42."
Claude infers labels (bug, enhancement, …) from the title and description and merges them with any you've set as defaults.
Tools
| Tool | What it does |
|---|---|
create_issue |
Creates an issue and a matching branch (an Epic gets no branch or draft PR — work lands on its children). Infers labels, a board priority/effort, and a native Issue Type from the task (toggle with OKFFS_INFER_PRIORITY/OKFFS_INFER_EFFORT/OKFFS_INFER_TYPE). Optional assignees, labels, milestone, priority, effort, type. Opens a draft PR immediately when OKFFS_AUTO_PR=true. |
create_issues_from_list |
Creates many issues + branches from a task list in one shot. Confirms first. Per-task labels, assignees, milestone, priority, effort, type. |
plan |
Give it a free-text description plus the breakdown Claude generates (titles, descriptions, labels, priority/effort/type, relationships); it creates every issue + branch, wires up relationships, and opens draft PRs when OKFFS_AUTO_PR=true. Confirms first. |
list_issues |
Lists open issues with branch, linked PR, board column, priority:/effort:, native type:, and relationships as a tree — ordered by priority so the most important work is on top. |
get_issue |
Full details for one issue: title, body, labels, assignees, branch, status. |
comment_issue |
Posts a comment — handy for logging what a branch did. |
link_issues |
Links two issues (blocked_by, blocking, parent), stored under a ## Relationships section. |
close_issue |
Closes an issue and tips you to /clear before the next one. |
create_pull_request |
Opens a PR for an issue branch — generates the title/body, pushes the branch, always includes Closes #N, and comments back. Can write changelog fragments when OKFFS_UPDATE_DOCS=true. Pass allow_empty: true to backfill a draft tracking PR on a branch with no commits (pushes an empty init commit to diverge it). |
commit_and_update |
Stages tracked changes (untracked need include_untracked: true), commits (your message verbatim, or an auto-generated one), pushes, and posts a progress comment to the issue. Refuses secret-looking files. |
merge_pull_request |
Autonomously merges a green, review-resolved issue PR into the base branch (e.g. develop) using OKFFS_BASE_MERGE_METHOD, then closes the issue. Opt-in (OKFFS_AUTO_MERGE_BASE=true) and heavily gated — never touches OKFFS_PROTECTED_BRANCH, independently verifies checks/mergeability/threads. wait_for_checks: true waits (bounded, default 90s) for pending checks instead of refusing. |
get_pr_checks |
Read-only: lists a PR's statuses and check runs with their states, plus the last ~50 log lines of each failed GitHub Actions job (needs Actions: read). Pass ref (a tag, branch or sha) to watch the deploy run a push or tag triggered, wait_for_checks to wait (bounded) for it, and log_match (a regex, e.g. \[health\] applied) to confirm a line appeared in the run's log. |
fix_into_base |
Opens (and, under the same OKFFS_AUTO_MERGE_BASE gates, merges) an issue-less fix PR into the base branch — for small cleanups such as review-comment fixes. Never targets OKFFS_PROTECTED_BRANCH. |
promote_branch |
Opens the issue-less promotion PR (e.g. develop → main), boards it, optionally requests reviewers, and lists the releases it carries per app. A re-run reports unresolved review threads and — when you opt in — merges the gate PR (OKFFS_AUTO_MERGE_PROTECTED) and tags the merged release(s) (OKFFS_TAG_RELEASE). See Releases and the promotion gate. |
list_pr_review_comments |
Fetches a PR's inline review threads and summaries. |
reply_to_review_comment |
Replies to an inline review thread by id. |
resolve_review_thread |
Resolves a review thread — only when OKFFS_RESOLVE_THREADS=true. |
prepare_release |
Bumps the version (package.json, or a plain VERSION file when there is none — created on the first release), rolls the CHANGELOG, commits on a release branch, and opens a PR. Confirms first; does not tag or publish. Per app under multisite. |
update_project_status |
Moves an issue between board columns (Backlog, Ready, In Progress, Review). Needs OKFFS_PROJECT_ENABLED. |
set_issue_fields |
Sets board Priority/Effort and/or the native Issue Type on an existing issue. Priority/Effort handle project-native and org-level Issue Fields (needs OKFFS_PROJECT_ENABLED); type is org-native and works independently. create_issue only sets these at creation; use this afterwards. Status stays with update_project_status. |
update_issue |
Edits an existing issue's core fields — title, assignees, labels, milestone, body — via one PATCH with the configured token. labels/assignees replace the whole set ([] clears). For Priority/Effort/Type use set_issue_fields; for Status use update_project_status. |
configure |
Writes okffs config to .env — the backend for the /okffs:setup prompt. Reuses the okffs setup wizard's manifest/serializer: updates only okffs's marked block, preserving your own variables and comments. app: "finance" writes finance/.env instead; makes sure .gitignore covers .env at every depth. Usually driven by /okffs:setup, not called directly. |
delete_issue |
Closes an issue and deletes its branch. Destructive — needs confirmed: true. |
delete_branch |
Deletes a branch and closes its issue. Destructive — needs confirmed: true. |
Destructive tools (delete_issue, delete_branch) always warn on the first call and only act when re-called with confirmed: true, posting a comment to the issue before doing anything.
Handling PR reviews
okffs has a built-in loop for review feedback — just ask ("address the review comments on PR #42"). Claude reads the threads, fixes the valid ones, commits and pushes, replies per thread, and posts a summary. Claude brings the judgment and the fixes; okffs handles the GitHub plumbing. There's also a slash command, /okffs:address_pr_review (takes a PR number), that runs the same loop.
By default review threads are left open for you to resolve; set OKFFS_RESOLVE_THREADS=true to have okffs resolve them once addressed.
Autopilot (minimum interference)
For a hands-off session, ask Claude to "fully handle this" (or "minimum interference") — or set OKFFS_AUTOPILOT=true to make it the default. In autopilot, Claude stops asking you to choose between options for reversible decisions, takes the recommended option at each fork, and drives an issue all the way to a PR into the base branch (and a base merge when OKFFS_AUTO_MERGE_BASE=true) — then posts an "Autopilot decisions" report (one line per choice, with a one-line why) to the PR and the issue, so you can redirect anything in a single message.
It removes confirmation friction; it does not grant new powers. The hard stops always interrupt, even in autopilot: destructive tools (delete_issue / delete_branch), and anything into OKFFS_PROTECTED_BRANCH (merge/tag/publish), billable, or irreversible that you have not opted into. An explicit env opt-in is the consent and is never re-asked: OKFFS_PROMOTION_AUTO_REVIEW (the Copilot review is your own GitHub billing choice), OKFFS_AUTO_MERGE_PROTECTED, OKFFS_TAG_RELEASE. Correctness stops — a failing check, a pending review, an unresolved thread, a moved branch tip — are never overridden by a flag. And for a real missing-information call — where only you hold the context — Claude still asks one quick question rather than guess. Off by default.
Releases and the promotion gate
prepare_release bumps the version and rolls the changelog on a release/X.Y.Z branch into your base branch. promote_branch then opens the issue-less promotion PR (e.g. develop → main), boards it, optionally requests reviewers such as Copilot, and lists the releases the promotion carries. From there, each further step is your call, or an explicit opt-in:
| Step | Manual (default) | Opt-in |
|---|---|---|
| Review feedback | Re-run promote_branch to see unresolved threads; fix via /okffs:address_pr_review + fix_into_base. |
— |
| Merge the gate PR | You merge it on GitHub. | OKFFS_AUTO_MERGE_PROTECTED=true — a re-run merges once every gate passes (checks green, review landed, threads resolved). |
| Tag the release | You push the tag (v0.13.0, or finance-1.3.0 per app). |
OKFFS_TAG_RELEASE=true — the re-run after the merge tags the release(s) on the merge commit. |
| Sync back | You merge main → develop with a merge commit. |
OKFFS_SYNC_BACK=true — the same run opens and merges the main → develop PR as a merge commit (never squash) and checks it has 2 parents. |
With both flags on, the loop is: promote_branch → review lands → address it → re-run promote_branch merges and tags. okffs still refuses, and tells you why, when a check fails, a requested review is pending, a thread is open, or the target branch moved past the merge commit. A tag usually triggers your CI publish, which cannot be undone — turn these on deliberately.
Keeping CLAUDE.md in sync
The /okffs:update_guidance slash command reviews the changes on the current branch and maintains one okffs-owned section of your CLAUDE.md — ## Project Guidance (okffs usage), delimited by HTML markers — without ever touching your hand-written content. It's guidance curation (tools, env vars, conventions), not a changelog. Set OKFFS_UPDATE_GUIDANCE=true to have create_pull_request nudge Claude to run it at PR time; the command is always available.
Automatic doc updates
With OKFFS_UPDATE_DOCS=true, create_pull_request writes doc updates onto the branch so they land in the PR diff:
- CHANGELOG.md — a per-issue Keep a Changelog fragment under
.changes/unreleased/, assembled intoCHANGELOG.mdat release time byprepare_release. Uniquely-named fragments avoid merge conflicts across parallel branches. - SECURITY.md — updated when security-related keywords are detected (only if the file exists).
CLAUDE.md, CONTRIBUTING.md, and README.md are intentionally left for you to maintain. Exclude specific files per repo with OKFFS_EXCLUDE_DOCS (valid: CHANGELOG.md, SECURITY.md).
GitHub Projects v2
okffs can keep a Projects v2 board in step with your workflow. It's opt-in with zero overhead when off:
OKFFS_PROJECT_ENABLED=true
OKFFS_PROJECT_ID=PVT_kwHO... # the board's GraphQL node ID
Once enabled, list_issues shows each issue's column, priority, and effort (ordered by priority); update_project_status moves issues between Backlog, Ready, In Progress, and Review; and create_issue can set priority/effort and an initial column. Done is deliberately left to GitHub's native automation (PR merge / issue close → Done) so two systems never fight over the terminal state.
Priority & Effort work as either a project-native single-select field (any Projects-capable token) or a GitHub org-level Issue Field. Org-level Issue Fields live outside the project and need a classic PAT with admin:org plus OKFFS_CLASSIC_PAT=true — fine-grained PATs can't reach them yet, so okffs skips that path and asks you to set the value in the UI. Claude infers priority/effort per task by default, falling back to the OKFFS_DEFAULT_* values.
Auto-add (OKFFS_PROJECT_AUTO_ADD) is a fallback for boards without GitHub's native "Auto-add to project" workflow — leave it false if your board already auto-adds.
Token permission: Projects v2 is GraphQL-only and needs a Projects-capable token — a fine-grained PAT with Organization → Projects: Read and write, or a classic PAT with the project scope. A single classic token with repo + project + admin:org covers everything, including org-level Issue Fields. Missing permission surfaces a clear [okffs] error naming what's needed.
Multisite (several apps in one repo)
One repository can host several apps — say finance/ and health/ — that share the issue tracker, board, branches and token but need independent versions, changelogs, fragments, tags and release lines. okffs calls this multisite. Off unless you configure it; a flat single-app repo behaves exactly as before.
repo/
├── .env # shared: token, board, branches, merge methods, OKFFS_APPS=finance,health
├── finance/
│ ├── .env # OKFFS_APP=finance (inherits ../.env — a value here wins)
│ ├── package.json or VERSION
│ ├── CHANGELOG.md
│ └── .changes/unreleased/
└── health/
└── …
- Each app directory has its own
.envnaming the app (OKFFS_APP). It inherits the git-root.env, so shared values live once. Start Claude Code (orokffs) inside the app directory, with a.mcp.jsonthere or okffs registered at user scope, and that session acts as that app. OKFFS_APPSin the root.envis the registry — used to validate app names, drive the migration warnings, and letpromote_branchname every app's release.- With an app active: tags are
{app}-X.Y.Z(nov), release branchesrelease/{app}-X.Y.Z, the app name is always an issue label and the default branch identifier (42-finance-add-budget-view), and the changelog, fragments and version file live under the app directory.create_issue/plan/create_issues_from_listaccept a per-callappoverride;list_issuesshowsapp:per issue. - Versioning:
package.jsonif the app has one, else a plainVERSIONfile thatprepare_releasecreates on the app's first release. - Root as an app: set
OKFFS_APPin the root.envtoo. Leave it unset and a root session keeps the plainvtag and root changelog. - Setup:
okffs setupat the root asks forOKFFS_APPSand offers to write each app's.env; run inside an app directory it configures just that app. Both make sure.gitignoreignores.envat every depth — an anchored/.envwould leavefinance/.envcommittable.
Migrating an existing repo. Only needed when you turn multisite on. Move each app's changelog, .changes/unreleased/ fragments and version file under its directory; okffs warns at startup about pending root fragments no app release would assemble, an OKFFS_APP missing from OKFFS_APPS, and a root session with a registry but no OKFFS_APP. Existing vX.Y.Z tags stay as they are; an app's first release links its tag rather than a compare range. Single-site users need do nothing.
Configuration
The quickest way to configure okffs is the wizard — npx @neturely/okffs setup — which writes and maintains the .env described below for you. The rest of this section documents what it (or you, by hand) can set.
okffs resolves a token and a target repository with fallbacks, so most users need little config.
Token (first match wins):
GITHUB_TOKENin a.envfile — either a fine-grained PAT (recommended; least privilege) with Issues, Contents, Pull requests (read/write), Metadata (read), and Administration (read/write) on the repo, or a classic PAT with thereposcope (broader — grants access across all your repos).- Otherwise the GitHub CLI token — if you've run
gh auth login, it just works.
Repository (first match wins):
GITHUB_OWNER/GITHUB_REPOin.env.- Otherwise auto-detected from the
origingit remote of the directory okffs runs in.
okffs loads .env automatically from that directory — no --env-file flag needed. A minimal explicit .env:
GITHUB_TOKEN=ghp_your_token_here
# Optional — auto-detected from the git origin remote when omitted:
GITHUB_OWNER=your-github-username
GITHUB_REPO=your-repo-name
okffs MCP questions
How do I add okffs MCP to Claude Code?
Run claude mcp add --env 'GITHUB_TOKEN=<YOUR_GITHUB_TOKEN>' okffs -- npx -y @neturely/okffs in your terminal. Add --scope user to make it available in every project.
How do I add okffs MCP to Cursor?
Open ~/.cursor/mcp.json and add the server under mcpServers, using the Cursor config shown in the install section above.
What tools does okffs MCP provide?
It exposes 24 tools, including create_issue, create_issues_from_list, plan, list_issues, get_issue.
Does okffs require complex configuration?
No, it requires little to no configuration. If you are already signed in with the GitHub CLI (gh) inside your repo, it works with no config at all.
What is Autopilot mode?
Autopilot mode allows Claude to make recommended decisions for reversible actions to reduce confirmation friction, driving an issue all the way to a PR.