@redcollar/ganttpro-mcp
v1.0.1
Published
Local Model Context Protocol (MCP) server exposing the full app.ganttpro.com REST API as tools.
Downloads
181
Maintainers
Readme
ganttpro-mcp
A local Model Context Protocol (MCP) server that exposes the full app.ganttpro.com REST API (https://api.ganttpro.com/v1.0) as MCP tools. Runs locally over stdio — your API key and data never pass through a third party.
What it covers
One MCP tool per documented GanttPRO endpoint (43 tools) across every resource group:
| Group | Tools |
|-------|-------|
| Projects | list_projects, create_project, get_project, update_project, get_task_fields, get_calendars, create_custom_day, update_custom_day, delete_custom_day |
| Tasks | list_tasks, create_task, get_task, update_task, delete_task, assign_resource, update_assigned_resource, unassign_resource |
| Comments | list_comments, get_comments_by_project, create_comment, update_comment, delete_comment |
| Links | create_link, get_link, update_link, delete_link |
| Time logs | list_time_logs, get_time_logs_by_project, create_time_log, update_time_log, delete_time_log |
| Resources | list_resources |
| Attachments | list_attachments, create_attachment, delete_attachment |
| Team / Users | get_team, list_users, get_user, update_user |
| Roles / Reference | get_account_roles, get_project_roles, get_languages, get_colors |
All tools are prefixed ganttpro_ (e.g. ganttpro_create_task).
Write endpoints (
create_*/update_*) accept any extra body field beyond the documented ones (additionalProperties: true), so the server keeps working if GanttPRO adds new fields.
Quick start (no clone, no install)
The only prerequisite is Node.js (LTS). The server runs straight from npm via npx — no clone, no npm install, no paths:
# verify your API key works
GANTTPRO_API_KEY=xxxx npx -y @redcollar/ganttpro-mcp check
# print a ready-to-paste config for your client
npx -y @redcollar/ganttpro-mcp config claude # or: cursor | cherry | librechat | (none = all)Get your API key from app.ganttpro.com → Account settings → API. It is sent on every request as the X-API-KEY header.
CLI commands
| Command | Purpose |
|---------|---------|
| npx -y @redcollar/ganttpro-mcp | Run the MCP server on stdio (how clients launch it) |
| npx -y @redcollar/ganttpro-mcp check | Verify the API key (lists projects, prints ✅/❌) |
| npx -y @redcollar/ganttpro-mcp config [client] | Print a ready-to-paste config (claude, cursor, cherry, librechat) |
| npx -y @redcollar/ganttpro-mcp help | Usage |
Environment variables
| Var | Required | Default | Purpose |
|-----|----------|---------|---------|
| GANTTPRO_API_KEY | ✅ | — | Your GanttPRO API key |
| GANTTPRO_BASE_URL | — | https://api.ganttpro.com/v1.0 | API base URL override |
| GANTTPRO_ARRAY_FORMAT | — | brackets | Array/object query serialization: brackets (id[]=1), repeat (id=1&id=2), or comma (id=1,2) |
Add to a client
Paste this into your client config (Claude Desktop claude_desktop_config.json, Cursor ~/.cursor/mcp.json, or .mcp.json):
{
"mcpServers": {
"ganttpro": {
"command": "npx",
"args": ["-y", "@redcollar/ganttpro-mcp"],
"env": { "GANTTPRO_API_KEY": "your-api-key-here" }
}
}
}Or, in Claude Code:
claude mcp add ganttpro --env GANTTPRO_API_KEY=your-api-key-here -- npx -y @redcollar/ganttpro-mcpThen restart the client and check it connects.
Which clients work
Local stdio servers run in desktop apps (Claude Desktop, Cursor, Cherry Studio) and self-hosted LibreChat (admin-configured via librechat.yaml). The web ChatGPT supports MCP only over remote HTTP, and the web DeepSeek has no MCP client — for those, use a desktop app (with ChatGPT/DeepSeek as the model) and connect GanttPRO there.
Local development
cd ganttpro-mcp
npm install
npm test # offline unit + handshake tests (27)
GANTTPRO_API_KEY=xxxx node index.js # run the server directly from sourceUsage notes
- Rate limit: GanttPRO allows ~5 write requests/second (insert/update/delete). The server forwards calls 1:1 — batch large operations accordingly.
- Dates: pass dates as strings in the format your GanttPRO account expects (e.g.
"2026-06-04"). - Filtering tasks: range filters (
progress,duration,startDate, …) take objects like{ "from": 0, "to": 0.5 }; list filters (status,priority, …) take arrays. - Each tool result is
HTTP <status> OK/ERRORfollowed by the JSON response body. Non-2xx responses come back withisError: true.
Layout
ganttpro-mcp/
├── index.js # CLI dispatcher: server (default) / check / config / help
├── src/
│ ├── endpoints.js # data-only catalog of every API endpoint
│ ├── client.js # request building + fetch (unit-testable)
│ ├── tools.js # endpoint specs -> MCP tools + dispatch
│ ├── server.js # MCP Server wiring (ListTools / CallTool)
│ ├── cli.js # check / config / help logic
│ └── config-snippets.js # per-client config templates (npx-based)
└── test/
├── smoke.test.js # client/tools unit tests (mocked fetch)
├── server.test.js # real Client<->Server handshake
└── cli.test.js # check / config / help testsLicense
MIT
