Devflow Mcp

io.github.cocaxcodePublished by GitHub account cocaxcodev0.1.8Updated Oct 24, 2026

MCP server connecting Jira (Cloud + Server) with GitHub/GitLab. Branches, issues, PRs, flows.

Overview

AI-generated overview

A local MCP server that connects an AI assistant to Jira and GitHub/GitLab so it can manage issues, branches, pull requests and repeatable workflows.

What you can do
Configure, list, switch and delete projects, each with its own Jira instance, git provider, branch conventions and directory scopes, resolved automatically from the current directory or overridden for a session. Read and act on Jira issues: list assigned issues, view details, check transitions, move status, assign and comment. Work with git branches and remotes: create feat/fix branches, find a branch by issue key, check out, pull, push, merge, and open a pull request or merge request. Define, edit and delete YAML flow playbooks that chain tool steps for repeatable tasks such as starting or finishing a task. Create, toggle and delete global or per-project rules that block or warn on risky Jj
When to use it
Use it when your team tracks work in Jira and keeps code in GitHub or GitLab and you want the assistant to carry a task from issue to branch, commit, pull request and status update without switching to a browser. It suits developers working across several repositories with different Jira instances and credentials.
Requirements
Runs locally over stdio, typically launched with npx, so Node.js is needed. No credentials are declared in the manifest; you supply a Jira URL, email and API token (Cloud) or personal access token (Server), plus a GitHub or GitLab token, when setting up each project. Network access to Jira and the git provider is required, and the git CLI must be available for branch and push operations.
Before you install
Stores Jira tokens and GitHub/GitLab personal access tokens in plain JSON files under the home directory, so protect that directory and use scoped tokens. It can push, merge, create pull requests, transition issues and post comments; several of these ask for explicit confirmation, but review previews before approving. Default rules block direct merges to main, closing issues and editing others' issues, and can be disabled per project. Credentials are sent only to the configured Jira and git APIs

Installation

In SourceWeft

  1. Open Devflow Mcp in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

@cocaxcode/devflow-mcp

Your Jira + GitHub/GitLab workflow, handled by your AI assistant.
One MCP server. 32 tools. Say what you need, it gets done.

[npm version] [downloads] [tools] [tests] [node] [license]

Overview · Just Talk to It · Installation · Project Scopes · Tools · Flows · Rules · Storage · Compatibility · Architecture


Overview

The most complete MCP server for developer workflow automation. 32 tools that connect Jira (Cloud + Server) with GitHub/GitLab (cloud + self-hosted) — so your AI assistant can manage issues, branches, PRs, and deployments without you ever opening a browser tab.

It auto-detects your Jira version and git provider, enforces configurable safety rules, and lets you define custom YAML flow playbooks for repeatable workflows. Projects are configured once and remembered — each with its own Jira instance, git provider, branch conventions, credentials, and directory scopes. The project that matches your current directory activates automatically (default), or you can switch to another for the session (active). All credentials stay local in ~/.devflow-mcp/ — nothing is synced, nothing is tracked, nothing leaves your machine.


Just Talk to It

You don't memorize tool names. You talk naturally and the assistant picks the right tools.

"Set up a project for my Jira + GitHub"

> df_project_setup with:    name: "my-backend"    jiraUrl: "https://myteam.atlassian.net"    jiraEmail: "[email protected]"    jiraToken: "ATATT3x..."    jiraProjectKey: "PROJ"    gitToken: "ghp_..."
Auto-detects:  - Jira Cloud (API v3)  - GitHub (org/my-backend)  - Base branch: main  - Scope: C:/repos/my-backend (your CWD, auto-added)

"List my projects"

Projects:  my-backend    [default] [active]   scopes: C:/repos/my-backend  my-frontend                        scopes: C:/repos/my-frontend

"Switch to my-frontend for this session"

Active project switched to: my-frontend (session only)Default remains: my-backend (based on your current directory)

"Let's work on PROJ-123"

> Reading PROJ-123...  Title: Add OAuth login  Status: To Do | Priority: High
> Branch feat/PROJ-123 not found. Creating...  branch: feat/PROJ-123-add-oauth-login  base: main  Confirm? (confirm: true to execute)
> Moved PROJ-123 → In Progress> Assigned to you

"Show me my tasks for the ACME project"

ACME-45  Fix OAuth login             In Progress  HighACME-52  Dashboard refactor          To Do        MediumACME-61  Update dependencies         To Do        Low

"Push my changes"

Preview:  branch: feat/PROJ-123-add-oauth-login  pending commits:    - a1b2c3d feat: add login component    - d4e5f6g feat: add auth service
Confirm? (confirm: true to execute)

"Merge main into my current branch"

Conflict detected:  - src/auth/login.ts  - src/config/routes.ts
Resolve the files and commit to complete the merge.

"Create a PR titled 'feat: add OAuth login'"

PR created:  url: https://github.com/org/repo/pull/42  title: feat: add OAuth login  provider: github

"Comment on PROJ-123 that the PR is ready for review"

Preview:  issue: PROJ-123  comment: "PR ready for review: https://github.com/org/repo/pull/42"
Confirm? (confirm: true to publish)

"Create a fix branch for PROJ-456 with description fix-oauth-redirect"

Preview:  branch: fix/PROJ-456-fix-oauth-redirect  base: main  actions: checkout main → pull → create branch
Confirm? (confirm: true to execute)

Installation

Claude Code (recommended)

bash
# Global — available across all your projectsclaude mcp add --scope user devflow -- npx -y @cocaxcode/devflow-mcp@latest
# Per-projectclaude mcp add devflow -- npx -y @cocaxcode/devflow-mcp@latest

Claude Desktop

macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
json
{  "mcpServers": {    "devflow": {      "command": "npx",      "args": ["-y", "@cocaxcode/devflow-mcp@latest"]    }  }}
Windows: %APPDATA%\Claude\claude_desktop_config.json
json
{  "mcpServers": {    "devflow": {      "command": "npx",      "args": ["-y", "@cocaxcode/devflow-mcp@latest"]    }  }}

Cursor / Windsurf

json
// .cursor/mcp.json or .windsurf/mcp.json{  "mcpServers": {    "devflow": {      "command": "npx",      "args": ["-y", "@cocaxcode/devflow-mcp@latest"]    }  }}

VS Code / Codex / Gemini CLI

json
{  "mcpServers": {    "devflow": {      "command": "npx",      "args": ["-y", "@cocaxcode/devflow-mcp@latest"]    }  }}

Project Scopes

Each project has paths (scopes) — the directories that belong to it. A directory can only be the scope of one project.

This gives you two concepts:

  • Default project: The project whose scope matches your current working directory. This is automatic and persistent — if you are inside C:/repos/my-backend and that directory is a scope of my-backend, then my-backend is the default. No action needed.

  • Active project: The project you are currently working with. By default it equals the default project, but you can switch it manually with df_project_switch for the current session. This resets to the default when you restart.

df_project_list shows both the default and active indicators so you always know where you stand.

Practical example

"Set up a project called my-backend"  → CWD (C:/repos/my-backend) is auto-added as scope
"Set up another called my-frontend"  → Run from C:/repos/my-frontend, that directory becomes its scope
"List projects"  → my-backend   [default] [active]    scopes: C:/repos/my-backend     my-frontend                        scopes: C:/repos/my-frontend
"Switch to my-frontend"  → Session switches. Now my-frontend is active for checking issues, etc.
"List projects"  → my-backend   [default]             scopes: C:/repos/my-backend     my-frontend  [active]              scopes: C:/repos/my-frontend
Close and reopen → my-backend is active again (matches CWD = default)

This means you can work across multiple projects with different Jira instances and git providers — the right credentials are always selected based on where you are, and you can always override for the session when needed.


Tools

32 tools organized in 5 categories.

Projects (5)

ToolDescription
df_project_setupConfigure a new project (Jira + Git, auto-detects everything)
df_project_updateModify project configuration
df_project_listList all configured projects (shows default + active)
df_project_switchSwitch the active project for the current session
df_project_deleteDelete a project
Example: setting up a project
df_project_setup with:  name: "my-project"  jiraUrl: "https://myteam.atlassian.net"  jiraEmail: "[email protected]"  jiraToken: "ATATT3x..."  jiraProjectKey: "PROJ"  gitToken: "ghp_..."
Auto-detects:  - Jira Cloud (API v3)  - GitHub (org/my-project)  - Base branch: main  - Scope: your CWD (auto-added)

Jira (6)

ToolDescriptionConfirmation
df_issuesList my assigned issues (filters by project)--
df_issueFull issue detail--
df_statusesAvailable transitions for an issue--
df_transitionMove issue to another statusYes
df_assignAssign issue to current user--
df_commentComment on an issueYes

Git (7)

ToolDescriptionConfirmation
df_branchCreate branch (feat/ or fix/) from baseYes
df_find_branchSearch branch by issue key--
df_checkoutSwitch branch (with safety guard)--
df_pullPull current branch from remote--
df_pushPush current branch to remoteYes
df_mergeMerge a branch into the current oneYes
df_prCreate PR (GitHub) or MR (GitLab)--

Important: df_branch, df_checkout, and df_push verify the working directory before executing. They block if there are uncommitted files or unpushed commits, listing exactly what needs attention. This prevents accidental work loss.

Flows (5)

ToolDescription
df_flow_createCreate a custom flow
df_flow_listList all flows
df_flow_getView flow details
df_flow_updateModify an existing flow
df_flow_deleteDelete a flow (protects start-task)

Rules (9)

ToolDescriptionLevel
df_rule_createCreate a global ruleGlobal
df_rule_listList all rulesGlobal
df_rule_getView rule detailsGlobal
df_rule_updateModify a ruleGlobal
df_rule_toggleEnable/disable a ruleGlobal
df_rule_deleteDelete a ruleGlobal
df_rule_project_overrideEnable/disable a global rule for a projectProject
df_rule_project_addCreate a project-only ruleProject
df_rule_project_removeRemove a project rule or overrideProject

Flows

Flows are YAML playbooks that define step sequences. They don't run automatically -- you tell the assistant when to use them.

Default: start-task

Triggered when you say something like "let's work on PROJ-123":

yaml
name: start-tasktrigger: "when the user says 'let's work on', 'start task', 'new task' + issue ID"steps:  - tool: df_issue    note: "Read issue detail and summarize the task"  - tool: df_find_branch    note: "Check if a branch already exists for this issue"  - tool: df_branch    confirm: true    note: "Only if no existing branch was found"  - tool: df_statuses    note: "Get transitions to find the 'In Progress' transition ID"  - tool: df_transition    target: "In Progress"    confirm: true  - tool: df_assign    note: "Assign the issue if it has no assignee"

Custom flows

Create your own by asking naturally:

"Create a flow called 'finish-task' that pushes, creates a PR, and comments on Jira"

yaml
name: finish-tasktrigger: "when the user says 'finish task', 'wrap up' + issue ID"steps:  - tool: df_push    confirm: true    note: "Push pending commits"  - tool: df_pr    note: "Create PR/MR to base branch"  - tool: df_comment    confirm: true    note: "Comment on the issue with the PR link"

The start-task flow can be modified but not deleted. Use df_flow_update to change any flow's steps, trigger, or name.


Rules

Rules are configurable guards that block or warn about actions. Two levels: global and per-project.

Default rules

RuleScopeActionWhat it does
no-merge-to-basegitblockPrevent direct push/merge to main/master
no-merge-from-devgitblockPrevent merging dev/develop/int branches out
no-close-issuesjirablockPrevent closing issues (Done, Closed, Resolved...)
only-own-issuesjirablockPrevent modifying issues assigned to others

Project overrides

Each project can override global rules or define its own:

# Disable a global rule for one projectdf_rule_project_override: name="no-close-issues", enabled=false
# Add a project-only ruledf_rule_project_add: name="no-push-friday", scope="git", action="warn"
# Remove an override or project ruledf_rule_project_remove: name="no-close-issues"

Custom rules

df_rule_create:  name: "no-push-friday"  description: "Warn when pushing on Fridays"  scope: "git"       # git | jira | all  action: "warn"     # block | warn

Note: Rule resolution order: Global rules load first, then project overrides are applied (project wins), then project-specific rules are added. Rules are filtered by scope and enabled state before evaluation.


Storage

Everything lives in ~/.devflow-mcp/ — your home directory, never inside any git repository. Jira tokens, GitHub PATs, GitLab tokens — all stored locally with 600 permissions (owner-only read/write). Nothing gets committed, nothing gets pushed, nothing leaves your machine.

~/.devflow-mcp/├── projects/              # Project configs (.json) — credentials included│   ├── my-project.json    # Jira URL, token, GitHub PAT, branch rules, scopes│   └── other-project.json├── flows/                 # Flow definitions (.yaml)│   └── start-task.yaml├── rules/                 # Global rules (.json)│   ├── no-merge-to-base.json│   ├── no-merge-from-dev.json│   ├── no-close-issues.json│   └── only-own-issues.json├── active-project         # Current active project (plain text)└── config.json            # Server configuration

Project resolution works automatically: devflow-mcp matches your current working directory against each project's paths (scopes). The matching project becomes the default. You can override it for the session with df_project_switch, which sets the active project. On restart, the active project resets to whatever the default is for your CWD. If no match is found and no active project is set, it prompts you to configure with df_project_setup.


Compatibility

Jira

TypeAPIAuthentication
Jira CloudREST API v3Email + API Token (Basic)
Jira Server / Data CenterREST API v2Personal Access Token (Bearer)

Auto-detection via /rest/api/2/serverInfo -- no manual configuration needed.

Git providers

ProviderAPI
GitHub (cloud)REST API v3
GitHub EnterpriseREST API v3 (custom URL)
GitLab (cloud)REST API v4
GitLab self-hostedREST API v4 (custom URL)

Auto-detection by parsing the repository's remote URL.


Architecture

src/├── index.ts              # Entry point (stdio transport)├── server.ts             # Factory: createServer() + instructions├── lib/│   ├── types.ts          # Interfaces, defaults, valid tool names│   ├── storage.ts        # CRUD: projects, flows, rules, config│   ├── git-exec.ts       # Git CLI wrapper (execFile)│   ├── jira/│   │   ├── client.ts     # JiraClient (Cloud v3 + Server v2)│   │   └── types.ts      # Raw Jira API response shapes│   └── git/│       ├── detect.ts     # parseRemoteUrl (SSH/HTTPS, GitHub/GitLab)│       ├── github.ts     # GitHubClient (REST API v3)│       ├── gitlab.ts     # GitLabClient (REST API v4)│       ├── factory.ts    # createGitProviderClient()│       └── types.ts      # Git provider interfaces└── tools/    ├── project.ts        # 5 tools: setup, update, list, switch, delete    ├── jira.ts           # 6 tools: issues, issue, statuses, transition, assign, comment    ├── git.ts            # 7 tools: branch, find_branch, checkout, pull, push, merge, pr    ├── flow.ts           # 5 tools: create, list, get, update, delete    └── rule.ts           # 9 tools: CRUD global + 3 project-level

Stack: TypeScript · MCP SDK · Zod · YAML · tsup

Tests: 4 suites · 51 tests (Vitest + InMemoryTransport)


MIT · Built by cocaxcode

Source: README.md at commit cf9e2b0

Tools

0
SourceWeft has not started this package in its sandbox yet, so its tools are not known.

Version history

1
  1. v0.1.8LatestSep 16, 2026

Score

50% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts

    Keep the endpoint answering the MCP handshake; SourceWeft probes it every 30 days.

  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listed15 pts

    Answer tools/list without a credential, or ship a package that starts in a sandbox without one.

  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts