zenhub-mcp
# 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
## Installation
### For Development
```bash
npm install
npm run build
```
### Setup API Key
1. Get your ZenHub API key from [ZenHub Settings](https://app.zenhub.com/settings/tokens)
2. Set the environment variable:
```bash
export ZENHUB_API_KEY=your_api_key_here
```
Or create a `.env` file (copy from `.env.example`):
```bash
cp .env.example .env
# Edit .env and add your API key
```
### For Claude Desktop
1. Build the server:
```bash
npm install
npm run build
```
2. Add to your Claude Desktop config (`~/Library/Application Support/Claude/claude_desktop_config.json` on macOS):
```json
{
"mcpServers": {
"zenhub": {
"command": "npx",
"args": ["zenhub-mcp-server"],
"env": {
"ZENHUB_API_KEY": "your_api_key_here"
}
}
}
}
```
### For Cursor
1. Build the server:
```bash
npm install
npm run build
```
2. In Cursor, go to Settings > MCP Servers and add:
```json
{
"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:
```json
{
"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
```bash
npm run dev
```
## Environment Variables
- `ZENHUB_API_KEY` (required): Your ZenHub API key from [ZenHub Settings](https://app.zenhub.com/settings/tokens)
- `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`TDQS
Scored across 51 tools
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.
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.
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.
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.