MCP ERPNext
Provides tools for managing ERPNext entities including timesheets (create, edit, submit, cancel), leave applications (apply, check balance, submit, cancel), projects and tasks listing, and software release creation with auto-detection from GitLab MRs.
Enables retrieval of merge request details including Redmine IDs, version, patch URLs, and test reports to automate software release creation in ERPNext.
Allows fetching issue titles and details to populate software release fields automatically during release creation.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@MCP ERPNextCreate weekly timesheet for project PROJ-0460"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
devflow-mcp
An MCP (Model Context Protocol) server that exposes engineering-workflow operations to MCP clients such as Claude Code, Claude Desktop, or any other MCP-compatible assistant. It wraps four systems behind one stdio server: ERPNext (timesheets, leave applications, projects, Developer Tasks, Software Release documents), Taiga (user stories, tasks, attachments), Redmine (issue read/create/update, attachments), and GitLab (merge request listing, analysis, and release-note generation from MRs). All 52 tools are registered in a single process; ERPNext credentials are mandatory, the other three services activate only when their credentials are present.
Prerequisites
Node.js >= 18 (declared in
package.jsonengines). No build step — the server runs plain ESM JavaScript fromsrc/.ERPNext account — required. The server exits at startup without it.
GitLab personal access token — optional; needed for merge-request and software-release tools.
Redmine API key — optional; needed for Redmine issue and attachment tools, and for auto-fetching ticket titles during release creation.
Taiga credentials (token, or user + password) — optional; needed for all Taiga tools.
Related MCP server: ERPNext MCP Server
Installation
git clone https://gitlab.credenceanalytics.com/Sharat/devflow-mcp.git
cd devflow-mcp
npm installThere is no build step. Verify it starts:
npm start # or: node src/index.jsIt should print MCP ERPNext Server running on stderr and then wait for stdio input (Ctrl+C to exit).
Configuration
Create a .env file in the repository root. src/index.js loads it relative to the package root, not the working directory, so the file must sit next to package.json.
ERPNEXT_URL=https://erp.example.com
ERPNEXT_USERNAME=you@example.com
ERPNEXT_PASSWORD=your-password
ERPNEXT_TOTP_SECRET=BASE32SECRET
GITLAB_URL=https://gitlab.example.com
GITLAB_TOKEN=glpat-xxxxxxxxxxxxxxxxxxxx
REDMINE_URL=https://redmine.example.com
REDMINE_API_KEY=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
TAIGA_HOST=https://taiga.example.com/api/v1
TAIGA_USER=you@example.com
TAIGA_PASS=your-password
# TAIGA_TOKEN=eyJ0eXAi... # alternative to TAIGA_USER + TAIGA_PASSVariable | Required | Default | What it is / where to get it |
| Yes | — | Base URL of your ERPNext/Frappe instance, no trailing path. |
| Yes | — | ERPNext login, usually your email address. |
| Yes | — | Password for that ERPNext login. |
| No | — | Base32 TOTP seed, only if your ERPNext enforces 2FA. Shown as the "manual entry" secret when you set up the authenticator app. |
| No |
| Base URL of your GitLab instance. |
| No | — | Personal access token with |
| No |
| Base URL of your Redmine instance. |
| No | — | Redmine REST API key: Redmine → My account → API access key → Show. Needs write permission for the issue-create/update tools. |
| No |
| Taiga API base URL — must include the |
| No | — | Taiga username or email (used with |
| No | — | Password for |
| No | — | Pre-issued Taiga auth token. Use this or |
Credentials may also be supplied through the MCP client's env block instead of .env (see below); the process environment wins where both are set.
Client setup
Add the server to your MCP client config. Use an absolute path to src/index.js.
Claude Desktop — %APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"devflow": {
"command": "node",
"args": ["D:\\devflow-mcp\\src\\index.js"],
"env": {
"ERPNEXT_URL": "https://erp.example.com",
"ERPNEXT_USERNAME": "you@example.com",
"ERPNEXT_PASSWORD": "your-password",
"GITLAB_TOKEN": "glpat-xxxxxxxxxxxxxxxxxxxx",
"REDMINE_API_KEY": "xxxxxxxxxxxxxxxxxxxxxxxx",
"TAIGA_HOST": "https://taiga.example.com/api/v1",
"TAIGA_USER": "you@example.com",
"TAIGA_PASS": "your-password"
}
}
}
}Claude Code — same block inside .mcp.json (project scope) or ~/.claude.json (user scope), or register it in one command:
claude mcp add devflow -- node /absolute/path/to/devflow-mcp/src/index.jsWindows path notes:
In JSON, backslashes must be escaped:
"D:\\devflow-mcp\\src\\index.js". Forward slashes ("D:/devflow-mcp/src/index.js") also work and avoid the issue.Keeping credentials in
.envand omitting theenvblock entirely is simpler — the server finds.envfrom its own location regardless of where the client launches it from.
Usage
Once the server is connected, ask the assistant in plain language:
"Create my weekly timesheet for project PROJ-0460." Calls
erpnext_create_weekly_timesheet, which creates Mon–Fri entries of 7h Billable + 2h Non-Billable, validates that no time ranges overlap, and returns the draft timesheet name for review before you submit it."Preview a software release for https://gitlab.example.com/team/repo/-/merge_requests/412 using https://erp.example.com/app/software-release/PROD-v1.2.0 as the template." Calls
erpnext_preview_software_release: pulls commits and notes from the MR, extracts Redmine ids from the description, fetches their titles from Redmine, inherits Product/Customer/Reviewer from the template release, and shows every field plus its source. Nothing is written until you follow up witherpnext_create_software_release."Show the tasks under this Taiga user story and the commits they reference." Calls
erpnext_get_user_story_tasks, returning each task's full description along with the merge-commit SHAs and Redmine issue ids found in it — useful for assembling a cherry-pick list for a release branch."Apply for leave from 25 Dec to 27 Dec, and show my leave balance first." Calls
erpnext_get_leave_balance, thenerpnext_apply_leaveto create the application as a draft;erpnext_submit_leave_applicationsends it for approval as a separate, explicit step.
See USAGE.md for longer worked examples.
Tool reference
52 tools, registered in src/definitions/ and dispatched from src/handlers/.
Auth
Tool | Description | Required params |
| Log in to ERPNext with the configured username/password and optional TOTP. Call before other operations. | — |
| Get the Employee record linked to the logged-in user. | — |
Timesheets
Tool | Description | Required params |
| List available activity types for timesheets. | — |
| Create a timesheet with an array of time logs. |
|
| Create a timesheet for today with a single entry. |
|
| Create a Mon–Fri week of 7h Billable + 2h Non-Billable per day (hours and days configurable). | — |
| Create a timesheet from fully custom entries. |
|
| List timesheets, filterable by employee, status and date range. | — |
| Get one timesheet's details. |
|
| List all draft timesheets for the current employee. | — |
| Append a time log to an existing draft timesheet. |
|
| Edit hours, times, project, activity type or description of one log in a draft. |
|
| Remove one time log from a draft (cannot remove the last one). |
|
| Update the note on a draft timesheet. |
|
| Delete a draft (unsubmitted) timesheet. |
|
| Submit a draft timesheet. |
|
| Cancel a submitted timesheet. |
|
Leave
Tool | Description | Required params |
| List available leave types. | — |
| Get leave balance for the current employee, optionally for one leave type. | — |
| List leave applications, filterable by status, type and date range. | — |
| Get one leave application's details. |
|
| List pending leave applications for the current employee. | — |
| List approved leave applications for the current employee. | — |
| Apply for leave, single or multiple days, with half-day support. |
|
| Submit a leave application for approval. |
|
| Cancel a leave application. |
|
Tasks & Projects
Tool | Description | Required params |
| List ERPNext projects, optionally filtered by status. | — |
| List tasks for a project. |
|
| Create ERPNext tasks from a prior merge-request analysis, marked Completed and assigned to the current employee. |
|
| Get Developer Tasks for a developer (default: logged-in user) with date/status/product/subject filters, plus a per-client breakdown. | — |
Taiga
Tool | Description | Required params |
| Validate a user story by URL and return its id, title and project. |
|
| Create a user story in a Taiga project; returns id, ref and URL. |
|
| Create one or more tasks under a user story, resolving assignees from project members and setting custom attributes (complexity, task type) where they exist. |
|
| Get tasks assigned to a user (default: authenticated user) with descriptions and attachment metadata; open tasks only by default. | — |
| Get all tasks under a user story (any assignee) with full descriptions, plus merge-commit SHAs and Redmine ids referenced in them. |
|
| Update a task's status and/or description, identified by | — |
| Download a task attachment to disk by URL or attachment id; returns the saved path and a text preview where applicable. | — |
| Export tasks to ERPNext as Developer Task documents, resolving the employee code, mapping task type to an ERP category and normalizing complexity. |
|
Redmine
Tool | Description | Required params |
| Get an issue's title/subject from its id or URL. |
|
| Get full issue content: description, status, priority, assignee, done ratio, comments, attachments, sub-tasks and relations. |
|
| Create a new issue in a project, with optional tracker, assignee, dates, parent and custom fields. Needs create permission. |
|
| Add a note and/or change fields (status by id or name, assignee, priority, done ratio, subject, description, dates). Needs write permission. |
|
| Download an issue attachment to disk by attachment id or download URL; returns the saved path, metadata and a text preview where applicable. |
|
All Redmine tools require REDMINE_API_KEY.
GitLab merge requests
Tool | Description | Required params |
| List MRs in a project, filterable by state, author, target branch and creation date range. |
|
| Analyze one or more MRs: extract commits, group them by type (features/fixes/refactors) and identify Redmine issues, returning a suggested task breakdown for review. | — (pass |
| Get MR details including auto-detected customer, version, Redmine ids from the description and patch/test-report URLs from the notes. |
|
Software releases
Tool | Description | Required params |
| Show what the release document will contain — auto-detected fields, their sources and anything still missing — without creating it. |
|
| Create the Software Release document in ERPNext from GitLab MR URL(s), auto-filling Product/Customer/Reviewer from a template release and pulling Redmine ids, ticket titles, patch URLs and test-report URLs. |
|
| Get an existing release by URL or name (commonly used as the template reference). | — (pass |
| List recent releases, filterable by product and customer. | — |
| List products (Brands) available for release selection. | — |
| List customers available for release selection. | — |
Resources
Read-only endpoints exposed alongside the tools:
URI | Contents |
| Draft timesheets for the current employee |
| Available timesheet activity types |
| All projects |
| Available leave types |
| Pending leave applications |
Troubleshooting
Server exits immediately with "ERPNEXT_URL, ERPNEXT_USERNAME, and ERPNEXT_PASSWORD are required".
The .env file is missing or not in the repository root. It is loaded from the package root (next to package.json), not from the client's working directory. Either move it there or pass the values in the client's env block.
ERPNext login fails / 401.
Run erpnext_login explicitly and read the error. If the account has 2FA enabled, ERPNEXT_TOTP_SECRET must be the Base32 seed — not a 6-digit code. Check that ERPNEXT_URL has no trailing slash or path segment.
Redmine tools return an error about the API key.
REDMINE_API_KEY is unset or lacks permission. Creating and updating issues needs write access on the target project; a read-only key will fail only on those tools.
Taiga tools fail to authenticate.
Supply either TAIGA_TOKEN or both TAIGA_USER and TAIGA_PASS. TAIGA_HOST must point at the API base and include /api/v1 — a plain site URL will 404.
GitLab / release tools fail.
GITLAB_TOKEN needs api scope and access to the project the MR lives in. Confirm GITLAB_URL matches the instance hosting that MR.
The server does not appear in the client.
Restart the client fully after editing its config — MCP servers are launched at startup.
Check the path in
argsis absolute and the file exists; in JSON, backslashes must be doubled.Run
node /absolute/path/to/src/index.jsin a terminal. If the process printsMCP ERPNext Server runningand hangs, the server is fine and the problem is the client config; any other output is the actual error.In Claude Code,
claude mcp listshows registered servers and their connection status.
License
MIT — see LICENSE.
Author
Sharat Yaragatti — GitHub
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseBqualityFmaintenanceThis is a TypeScript-based MCP server that provides integration with ERPNext/Frappe API. It enables AI assistants to interact with ERPNext data and functionality through the Model Context Protocol.6112MIT
- Alicense-qualityCmaintenanceThis MCP server connects ChatGPT to ERPNext, enabling AI-powered business analytics, report generation, and document management.MIT
- Alicense-qualityAmaintenanceMCP server that enables LLMs to interact with ERPNext/Frappe sites for document CRUD, search, reports, workflows, and analytics, respecting user permissions and logging all actions.282AGPL 3.0
- Alicense-qualityCmaintenanceEnables AI assistants to interact with ERPNext data and functionality through the Model Context Protocol, including document CRUD, report running, and API method calls.MIT
Related MCP Connectors
A comprehensive Model Context Protocol (MCP) server that enables AI assistants to interact with yo…
MCP (Model Context Protocol) server for Appwrite
Self-hosted MCP gateway: turn any API, database or MCP server into AI connectors — no code.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/sharat9703/mcp-erpnext-taiga-gitlab-redmine'
If you have feedback or need assistance with the MCP directory API, please join our Discord server