Skip to main content
Glama

ZenHub MCP Server

An MCP (Model Context Protocol) server that provides full access to the ZenHub GraphQL API.

Features

  • Full GraphQL Access: Execute any GraphQL query against the ZenHub API

  • Common Operations: Built-in tools for frequent tasks like creating issues, epics, workspaces, and sprints

  • Secure Authentication: API key-based authentication for all requests

  • Error Handling: Comprehensive error handling and validation

Related MCP server: Linear MCP Server

Installation

For Development

npm install
npm run build

Setup API Key

  1. Get your ZenHub API key from ZenHub Settings

  2. Set the environment variable:

export ZENHUB_API_KEY=your_api_key_here

Or create a .env file (copy from .env.example):

cp .env.example .env
# Edit .env and add your API key

For Claude Desktop

  1. Build the server:

npm install
npm run build
  1. Add to your Claude Desktop config (~/Library/Application Support/Claude/claude_desktop_config.json on macOS):

{
  "mcpServers": {
    "zenhub": {
      "command": "npx",
      "args": ["zenhub-mcp-server"],
      "env": {
        "ZENHUB_API_KEY": "your_api_key_here"
      }
    }
  }
}

For Cursor

  1. Build the server:

npm install
npm run build
  1. In Cursor, go to Settings > MCP Servers and add:

{
  "name": "zenhub",
  "command": "node",
  "args": ["/path/to/zenhub-mcp/dist/index.js"],
  "env": {
    "ZENHUB_API_KEY": "zh_",
    "GITHUB_PAT": "github_pat_"
  }
}

Or use the development server:

{
  "name": "zenhub-dev",
  "command": "npm",
  "args": ["run", "dev"],
  "cwd": "/path/to/zenhub-mcp",
  "env": {
    "ZENHUB_API_KEY": "your_api_key_here"
  }
}

Tools

The server provides 54 tools across 10 categories, implementing the most commonly used ZenHub operations:

No API key required in tool calls - Set ZENHUB_API_KEY environment variable once and use all tools!

Query Tools (7 tools)

zenhub_query

Execute any GraphQL query against the ZenHub API.

  • query (required): GraphQL query string

  • variables (optional): Variables for the query

zenhub_search_issues

Search for issues in a pipeline.

  • pipeline_id (required): Pipeline ID to search in

  • query (optional): Search query for title

  • filters (optional): Object with filters for labels and assignees

zenhub_search_issues_in_repository

Search and filter issues inside repository.

  • repository_id (required): Repository ID to search in

  • query (optional): Search query

  • filters (optional): Filter options

zenhub_get_workspace_issues

Get all issues in a workspace (paginated).

  • workspace_id (required): Workspace ID

  • after (optional): Cursor for pagination

zenhub_get_viewer

Get current ZenHub user information.

zenhub_get_issue_by_info

Lookup an issue by repository and issue number.

  • repository_gh_id (required): GitHub repository ID

  • issue_number (required): Issue number

zenhub_get_repositories

Lookup repositories by their GitHub IDs.

  • repository_gh_ids (required): Array of GitHub repository IDs

Issue Management (13 tools)

zenhub_create_issue

Create a new GitHub issue via ZenHub.

  • title (required): Issue title

  • repository_id (required): Repository ID

  • body (optional): Issue description

  • labels (optional): Array of label names

  • assignees (optional): Array of GitHub usernames

zenhub_close_issues

Close one or more issues.

  • issue_ids (required): Array of issue IDs

zenhub_reopen_issues

Reopen one or more closed issues.

  • issue_ids (required): Array of issue IDs

  • pipeline_id (required): Pipeline ID to move issues to

  • position (optional): Position in pipeline (START or END)

zenhub_move_issue

Move issues to a position in a pipeline.

  • issue_ids (required): Array of issue IDs

  • pipeline_id (required): Pipeline ID to move issues to

  • position (optional): Position in pipeline (0-based)

zenhub_add_assignees_to_issues

Add assignees to multiple issues.

  • issue_ids (required): Array of issue IDs

  • assignees (required): Array of GitHub usernames

zenhub_add_labels_to_issues

Add labels to multiple issues.

  • issue_ids (required): Array of issue IDs

  • labels (required): Array of label names

zenhub_set_estimate

Set an estimate for an issue.

  • issue_id (required): Issue ID

  • value (required): Estimate value

zenhub_set_multiple_estimates

Set estimates on multiple issues.

  • estimates (required): Array of issue ID and estimate value pairs

zenhub_add_issues_to_epics

Add issues to epics.

  • issue_ids (required): Array of issue IDs

  • epic_ids (required): Array of epic IDs

Epic Management (1 tool)

zenhub_create_epic

Create a new epic in ZenHub.

  • title (required): Epic title

  • repository_id (required): Repository ID

  • body (optional): Epic description

Workspace Management (4 tools)

zenhub_get_user_workspaces

Get all workspaces accessible to the current user.

  • query (optional): Search query to filter workspaces

  • first (optional): Number of workspaces to return (default: 20)

zenhub_get_user_organizations

Get all ZenHub organizations accessible to the current user.

  • query (optional): Search query to filter organizations

  • first (optional): Number of organizations to return (default: 10)

zenhub_get_organization_workspaces

Get all workspaces within a specific ZenHub organization.

  • organization_id (required): ZenHub organization ID

  • query (optional): Search query to filter workspaces

  • first (optional): Number of workspaces to return (default: 20)

zenhub_create_workspace

Create a new workspace in ZenHub.

  • name (required): Workspace name

  • description (optional): Workspace description

  • organization_id (required): ZenHub organization ID

  • repository_ids (required): Array of GitHub repository IDs

  • default_repository_id (optional): Default repository ID

Sprint Management (2 tools)

zenhub_create_sprint

Create a new sprint.

  • name (required): Sprint name

  • start_date (required): Start date (ISO format)

  • end_date (required): End date (ISO format)

  • workspace_id (required): Workspace ID

  • timezone (optional): Timezone identifier

  • settings (optional): Sprint settings object

zenhub_add_issues_to_sprints

Add issues to sprints.

  • issue_ids (required): Array of issue IDs

  • sprint_ids (required): Array of sprint IDs

Architecture

The server uses a modular architecture for easy expansion:

src/
├── index.ts           # Main MCP server
├── types.ts           # TypeScript interfaces
└── tools/
    ├── index.ts       # Tool registry
    ├── base.ts        # Base tool class
    ├── queries.ts     # Query tools
    ├── issues.ts      # Issue management tools
    ├── epics.ts       # Epic management tools
    ├── workspaces.ts  # Workspace management tools
    └── sprints.ts     # Sprint management tools

Adding New Tools

  1. Create a new tool class extending BaseTool in the appropriate category file

  2. Add it to the tool export array

  3. The tool will automatically be registered with the MCP server

Available Operations Reference

All 176 available ZenHub GraphQL operations are documented in:

  • zenhub_api_operations.json - Complete operation list with descriptions

  • mutations.json - All 157 mutations

  • queries.json - All 19 queries

Current implementation covers 54 of 176 operations (30.7%)

Development

npm run dev

Environment Variables

  • ZENHUB_API_KEY (required): Your ZenHub API key from ZenHub Settings

  • ZENHUB_MCP_CUSTOM_INSTRUCTIONS (optional): Provide additional instructions for the MCP server. If set, this value will be appended to the default instructions that the server sends to the model. Use regular newlines or \n escape sequences to format multi-line prompts.

GraphQL Endpoint

This server connects to: https://api.zenhub.com/public/graphql

Available Tools

51 tools
zenhub_add_assignees_to_issuesC

Add assignees to multiple issues

Inputs: issue_ids (required), assignees (required).

zenhub_add_issues_to_sprintsC

Add issues to sprints

Inputs: issue_ids (required), sprint_ids (required).

zenhub_add_labels_to_issuesB

Add labels to multiple issues

Inputs: issue_ids (required), labels (required).

zenhub_add_milestone_to_issuesC

Add milestone to multiple issues

Inputs: issue_ids (required), milestone_id (required).

zenhub_add_repository_to_workspaceB

Add a GitHub repository to a workspace

Inputs: workspace_id (required), repository_github_id (required).

zenhub_add_subissues_to_epicB

Add existing issues as sub-issues to an epic.

Inputs: child_issue_ids (required), parent_epic_id.

zenhub_close_issuesC

Close one or more issues

Inputs: issue_ids (required).

zenhub_create_epicA

Create a new epic in ZenHub. Optionally, you can also specify existing issue IDs that should be added as children of the new epic.

Inputs: title (required), repository_id (required), body, epic_child_ids.

zenhub_create_github_labelC

Create a GitHub label

Inputs: repository_id (required), name (required), color (required), description.

zenhub_create_issueC

Create a new GitHub issue via ZenHub

Inputs: title (required), repository_id (required), body, labels, +1 more.

zenhub_create_issue_dependencyB

Create a dependency between two issues (blocking → blocked)

Inputs: blocking_repository_gh_id (required), blocking_issue_number (required), blocked_repository_gh_id (required), blocked_issue_number (required).

zenhub_create_milestoneC

Create a milestone

Inputs: title (required), repository_id (required), description, due_date, +1 more.

zenhub_create_sprintC

Create a new sprint

Inputs: name (required), start_date (required), end_date (required), workspace_id (required), +2 more.

zenhub_create_workspaceB

Create a new workspace in ZenHub

Inputs: name (required), organization_id (required), repository_ids (required), description, +1 more.

zenhub_create_zenhub_labelC

Create a ZenHub label

Inputs: workspace_id (required), name (required), color (required), description.

zenhub_delete_issue_dependencyA

Delete a dependency between two issues (blocking → blocked)

Inputs: blocking_repository_gh_id (required), blocking_issue_number (required), blocked_repository_gh_id (required), blocked_issue_number (required).

zenhub_get_epicC

Get an epic

Inputs: epic_id (required).

zenhub_get_issue_by_infoA

Lookup an issue by repository and issue number

Inputs: repository_gh_id (required), issue_number (required).

zenhub_get_organization_workspacesC

Get all workspaces within a specific ZenHub organization

Inputs: query, first.

zenhub_get_owner_by_gh_idB

Lookup a GitHub user/organization by GitHub ID

Inputs: github_id (required).

zenhub_get_owner_by_loginA

Lookup a GitHub user/organization by login

Inputs: login (required).

zenhub_get_repositoriesC

Lookup repositories by their GitHub IDs

Inputs: repository_gh_ids (required).

zenhub_get_repositories_by_github_idsB

Lookup repositories by their GitHub IDs

Inputs: github_ids (required).

zenhub_get_repository_assignable_usersA

Get users who can be assigned to issues in a repository

Inputs: repository_id (required).

zenhub_get_repository_collaboratorsC

Get all collaborators for a repository who can be assigned to issues (Note: Repository collaborators not available in ZenHub API - use workspace users instead)

Inputs: repository_id (required).

zenhub_get_repository_detailsB

Get detailed information about a specific repository

Inputs: repository_id (required).

zenhub_get_repository_labelsB

Get all labels in a repository

Inputs: repository_id (required).

zenhub_get_user_organizationsA

Get all ZenHub organizations accessible to the current user

Inputs: query, first.

zenhub_get_user_workspacesB

Get all workspaces accessible to the current user

Inputs: query, first.

zenhub_get_viewerA

Get current authenticated user's ZenHub and GitHub profile information

Inputs: no named parameters.

zenhub_get_workspace_issuesC

Get all issues in a workspace (paginated)

Inputs: workspace_id (required), after.

zenhub_get_workspace_labelsB

Get all ZenHub labels in a workspace

Inputs: workspace_id (required).

zenhub_get_workspace_overviewA

Get workspace overview including basic metadata, pipelines with issue counts, repositories with issue counts, default repository and its issue types, epic summaries, and workspace users

Inputs: workspace_id (required).

zenhub_get_workspace_pipelinesB

Get all pipelines in a workspace

Inputs: workspace_id (required).

zenhub_get_workspace_repositoriesA

Get all repositories for a workspace

Inputs: workspace_id (required).

zenhub_get_workspace_sprintsB

Get all sprints in a workspace

Inputs: workspace_id (required).

zenhub_get_workspace_usersB

Get all users in a workspace who can be assigned to issues

Inputs: workspace_id (required).

zenhub_move_issueC

Move issues to a position in a pipeline

Inputs: issue_ids (required), pipeline_id (required), position.

zenhub_query_potentially_dangerousB

FALLBACK: Execute custom GraphQL queries when specific tools don't meet your needs. IMPORTANT: Mutations but have EXPLICT appoval from the user by repeating back a super minimal confirmation message.

Inputs: query (required), variables.

zenhub_remove_assignees_from_issuesB

Remove assignees from multiple issues

Inputs: issue_ids (required), assignees (required).

zenhub_remove_labels_from_issuesC

Remove labels from multiple issues

Inputs: issue_ids (required), labels (required).

zenhub_reopen_issuesB

Reopen one or more closed issues

Inputs: issue_ids (required), pipeline_id (required), position.

zenhub_search_issuesB

Search and filter issues within a specific pipeline by title, labels, or assignees

Inputs: pipeline_id (required), query, filters.

zenhub_search_issues_in_repositoryA

Search and filter issues in a workspace by user, repository, and pipeline. Use zenhub_get_workspace_overview to get repository IDs and pipeline IDs before using this tool.

Inputs: workspace_id (required), query (required), repo_ids (required), pipeline_ids (required).

zenhub_set_estimateC

Set an estimate for an issue

Inputs: issue_id (required), value (required).

zenhub_set_multiple_estimatesB

Set estimates on multiple issues

Inputs: estimates (required).

zenhub_update_epicC

Update an epic

Inputs: epic_id (required), title, description.

zenhub_update_epic_datesB

Update epic's start and end dates

Inputs: epic_id (required), start_date, end_date.

zenhub_update_issueC

Update an existing issue

Inputs: issue_id (required), title, body.

zenhub_update_milestoneD

Update a milestone

Inputs: milestone_id (required), title, description, due_date, +1 more.

zenhub_update_sprintC

Update an existing sprint

Inputs: sprint_id (required), name, start_date, end_date, +1 more.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    C2.9/5.0

    Scored across 51 tools

    Disambiguation3/5

    Most tools have distinct purposes, but the presence of 'zenhub_query_potentially_dangerous' allows arbitrary GraphQL queries, creating ambiguity and overlap with all other tools. Additionally, some tools like 'search_issues' and 'search_issues_in_repository' are similar but separate, adding slight confusion.

    Naming Consistency5/5

    All tools follow a consistent 'zenhub_verb_noun' pattern, with verbs like add, create, get, update, delete, close, reopen, move, set, etc. This pattern is uniform across all 51 tools, making the naming highly predictable and systematic.

    Tool Count2/5

    With 51 tools, the server is overly granular for its domain. Many operations could be consolidated (e.g., single vs. bulk variants of add/remove assignees, labels, and estimates). This count exceeds typical well-scoped MCP servers (3-15 tools) and feels bloated.

    Completeness4/5

    The tool set covers a comprehensive range of ZenHub operations: CRUD for issues, epics, milestones, sprints, workspaces, labels, dependencies, and estimates. Minor gaps exist (e.g., no pipeline create/update/delete), but the fallback query tool mitigates missing operations. Overall, core workflows are well-covered.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers