The Aha! MCP server, but useful.
A supercharged fork of aha-develop/aha-mcp with 60+ tools covering the full Aha! API β features, ideas, releases, epics, requirements, comments, todos, goals, strategic models, workflows, integrations, and more. Read and write. Built for people who actually want to do things in Aha! from Claude Desktop, not just read a feature title.
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β Upstream aha-mcp: 3 read-only GraphQL tools β
β @dvermagithub/aha-mcp: 60+ tools, full CRUD, REST β
ββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
The upstream server is a proof of concept β three GraphQL tools that read a feature, a page, and search. That's it. You can't list your releases, can't see your epics, can't update a status, can't leave a comment, can't even find out who you are.
This fork fixes that.
| Upstream | @dvermagithub/aha-mcp |
|
|---|---|---|
| Read features, pages, search | β | β |
| Read releases, epics, ideas, requirements | β | β |
| Read goals, initiatives, strategic models | β | β |
| Read your own assignments & todos | β | β |
| Read workflows, integrations, record links | β | β |
| Create/update/delete features, ideas, comments, todos | β | β |
| Auto-resolve any reference number | β | β |
| Multi-type global search | β | β |
| Delete guardrails | β | β
confirm: true required |
| Rich GraphQL responses (status, assignee, dates, estimates, tags) | β | β |
1. Get an Aha! API token secure.aha.io/settings/api_keys β Create new API key
2. Add to your MCP client
Edit %APPDATA%\Claude\claude_desktop_config.json (Windows) or ~/Library/Application Support/Claude/claude_desktop_config.json (macOS):
{
"mcpServers": {
"aha-mcp": {
"command": "npx",
"args": ["-y", "@dvermagithub/aha-mcp"],
"env": {
"AHA_API_TOKEN": "your_token_here",
"AHA_DOMAIN": "yourcompany"
}
}
}
}Fully quit Claude Desktop (tray β Quit) and reopen. You're live.
Same config shape β see AI Tools & Editors below.
"What's the status of DEVELOP-123?"
"Show me active releases for PROD"
"Who's assigned to epics in the next release?"
"Find all ideas mentioning AI from last month"
"What comments are on ADT-123-1?"
"What's on my plate this week?"
"Create a feature called 'Dark mode support' in release DEVELOP-R-5"
"Update DEVELOP-123 β set status to 'In development' and assign it to jane@company.com"
"Add a comment to DEVELOP-123 summarizing our call"
"Create an idea under PROD with a description from this conversation"
"Mark my todo #42 as complete"
"What are our current goals and key results?"
"Show me the strategic model for Q2"
"Which initiatives are active this quarter?"
Core records
| Resource | List | Get |
|---|---|---|
| Features | list_features |
get_feature_rest, get_record |
| Requirements | list_requirements |
get_requirement_rest, get_record |
| Ideas | list_ideas |
get_idea |
| Epics | list_epics |
get_epic |
| Releases | list_releases |
get_release |
| Release phases | list_release_phases |
get_release_phase |
| Pages | list_pages |
get_page, get_page_rest |
| Notebooks | list_notebooks |
β |
Strategy
| Resource | List | Get |
|---|---|---|
| Goals | list_goals |
get_goal |
| Key results | list_key_results |
get_key_result |
| Initiatives | list_initiatives |
get_initiative |
| Strategic models | list_strategic_models |
get_strategic_model |
Org & people
| Resource | List | Get |
|---|---|---|
| Products | list_products |
get_product |
| Users | list_users |
get_user |
| Workflows | list_workflows |
get_workflow |
| Integrations | list_integrations |
get_integration |
| Competitors | list_competitors |
get_competitor |
Activity
| Resource | List | Get |
|---|---|---|
| Comments | list_comments |
get_comment |
| Todos | list_todos |
get_todo |
| Record links | list_record_links |
get_record_link |
| Idea endorsements | list_idea_endorsements |
get_idea_endorsement |
| Idea organizations | list_idea_organizations |
get_idea_organization |
| Custom table records | list_custom_table_records |
get_custom_table_record |
resolve_referenceβ pass any reference (PROD-123,PROD-I-45,PROD-R-1,PROD-E-7,PROD-N-12,PROD-123-1). Auto-detects type, returns the record.search_globalβ search across Features, Epics, Ideas, Requirements, and Pages in a single call.get_meβ who the API token belongs to.list_my_assignedβ everything assigned to you.list_my_pending_tasksβ your open todos.
All updates are partial β send only what you want to change. Deletes require confirm: true as a guardrail. Every write tool accepts common fields (name, description, workflow_status, assigned_to_user, tags, start_date, due_date) plus an extra_fields escape hatch for custom fields and specialized attributes.
| Resource | Create | Update | Delete |
|---|---|---|---|
| Features | create_feature |
update_feature |
delete_feature |
| Requirements | create_requirement |
update_requirement |
delete_requirement |
| Ideas | create_idea |
update_idea |
delete_idea |
| Comments | create_comment |
update_comment |
delete_comment |
| Todos | create_todo |
update_todo |
delete_todo |
| Epics | create_epic |
update_epic |
delete_epic |
| Releases | create_release |
update_release |
delete_release |
| Goals | β | update_goal |
β |
| Initiatives | β | update_initiative |
β |
queryβ full-text searchupdated_sinceβ ISO 8601 timestamptagβ filter by tagassigned_to_userβ id or emailpage(default 1),per_page(default 30, max 200)include_custom_fieldsβ settrueto include custom fields in the responsefieldsβ comma-separated field list for sparse responses
Nested scopes auto-route to the efficient endpoint. Example: list_features with release_id hits /releases/:id/features, with epic_id hits /epics/:id/features, etc.
| Variable | Required | Description |
|---|---|---|
AHA_API_TOKEN |
β | Your Aha! API token |
AHA_DOMAIN |
β | Your Aha! subdomain (e.g. yourcompany for yourcompany.aha.io) |
Works with any MCP-compatible client. Config shape is always the same β command: "npx", args: ["-y", "@dvermagithub/aha-mcp"], env vars for auth.
VS Code
Add to .vscode/settings.json:
{
"mcp": {
"servers": {
"aha-mcp": {
"command": "npx",
"args": ["-y", "@dvermagithub/aha-mcp"]
}
}
}
}See VS Code MCP docs.
Cursor
Settings β MCP β Add new Global MCP Server:
{
"mcpServers": {
"aha-mcp": {
"command": "npx",
"args": ["-y", "@dvermagithub/aha-mcp"]
}
}
}Cline
Edit cline_mcp_settings.json via Cline MCP Server settings:
{
"mcpServers": {
"aha-mcp": {
"command": "npx",
"args": ["-y", "@dvermagithub/aha-mcp"]
}
}
}RooCode
Settings β Edit MCP Settings:
{
"mcpServers": {
"aha-mcp": {
"command": "npx",
"args": ["-y", "@dvermagithub/aha-mcp"]
}
}
}Use your preferred secure secret management to inject
AHA_API_TOKENandAHA_DOMAIN. Don't hardcode tokens in shared configs.
git clone https://github.com/dvermagithub/aha-mcp.git
cd aha-mcp
npm install
npm run buildPoint your MCP client at node /absolute/path/to/aha-mcp/build/index.js while iterating locally.
src/
βββ index.ts # MCP server + tool dispatch
βββ rest-client.ts # REST v1 client (GET/POST/PUT/DELETE, 429/404 handling)
βββ rest-tools.ts # REST tool schemas
βββ rest-handlers.ts # REST tool handlers
βββ cud-tools.ts # Create/update/delete tool schemas
βββ cud-handlers.ts # Write handlers with extra_fields merging + confirm guardrail
βββ ergonomic-tools.ts # resolve_reference, search_global
βββ handlers.ts # Original GraphQL handlers
βββ queries.ts # GraphQL queries
βββ types.ts # Shared types & reference regexes
One dispatch pipeline in index.ts: GraphQL tools β ergonomic β CUD β REST. First match wins.
PRs welcome. Keep the dispatch order intact and maintain the confirm: true guardrail on any new delete tools.
Why both REST and GraphQL? GraphQL gives richer markdown bodies and cross-type search; REST covers way more resources and supports writes cleanly. This server uses whichever fits each operation best.
Why scoped package? To avoid colliding with the upstream aha-mcp on npm and to make it clear this is a personal fork.
Why confirm: true on deletes? Claude Desktop already prompts before every tool call, but a second guardrail at the schema level prevents an accidental approval from wiping a feature.
What's not here?
- Strategic roadmaps, milestones, and tags don't have dedicated REST endpoints β skipped. Milestones are modeled as features with
feature_type=milestone; filterlist_featuresby type instead. For tags, use thetagfilter on anylist_*tool. - Admin operations (create user, modify workflow, etc.) β low LLM value, high blast radius.
Tools don't show up in Claude Desktop
- Fully quit Claude Desktop (tray icon β Quit, not just close the window).
- Check logs:
%APPDATA%\Claude\logs\mcp-server-aha-mcp.logon Windows. - Verify your config JSON is valid.
- Confirm
AHA_API_TOKENandAHA_DOMAINare set in theenvblock.
401 / 403 errors
- Check that
AHA_API_TOKENis correct and hasn't expired. - Confirm
AHA_DOMAINis the subdomain only (e.g.acme, notacme.aha.io). - Ensure the token has permission on the records you're touching.
Rate limit (429)
Aha! rate-limits per API token. The server surfaces the Retry-After value in the error. Slow down or stagger bulk operations.
"Unrecognized reference format"
resolve_reference accepts: PROD-123 (feature), PROD-123-1 (requirement), PROD-I-45 (idea), PROD-R-1 (release), PROD-E-7 (epic), PROD-N-12 (page). If yours doesn't match, use the specific get_* tool.
- npm: https://www.npmjs.com/package/@dvermagithub/aha-mcp
- Upstream: https://github.com/aha-develop/aha-mcp
- Aha! REST API docs: https://www.aha.io/api/resources
- Aha! GraphQL schema: https://www.aha.io/api/graphql
- Model Context Protocol: https://modelcontextprotocol.io
ISC β same as upstream.