zenhub_add_assignees_to_issues
Add assignees to multiple issues
Run a ZenHub workspace from chat — issues, epics, sprints, pipelines, milestones, labels and blocking dependencies — with a raw GraphQL fallback for whatever the tool list does not cover.
LABSCO SUMMARY
The bulk-first design is the strength — issue_ids plurals across close, reopen, move, assignee, label and milestone edits mean a board reshuffle is a single request rather than a loop, and zenhub_get_workspace_overview is the entry point the rest of the list assumes you called first. The thing to weigh is zenhub_query_potentially_dangerous: it executes arbitrary GraphQL including mutations, and its only protection is an instruction in its own description telling the caller to obtain explicit approval, which is guidance to a model rather than a check. One documented dead end is worth noting too — zenhub_get_repository_collaborators states that repository collaborators are not available through the ZenHub API and points at zenhub_get_workspace_users instead.
A ZenHub workspace client with 51 tools covering issue creation and editing, bulk assignee, label, estimate and milestone changes, epics and sub-issues, workspaces and repositories, sprints, pipelines, blocking dependencies, label creation on both the GitHub and ZenHub side, user lookup, search, and a raw GraphQL escape hatch.
ZENHUB_API_KEY. Past that, identifiers are the real prerequisite: the write tools address a workspace_id, repository_id, pipeline_id or issue_ids, and zenhub_get_user_organizations, zenhub_get_user_workspaces and zenhub_get_workspace_overview are how you come by them. zenhub_get_viewer confirms which ZenHub and GitHub identity the key resolves to.
One command plus a key — npx zenhub-mcp-server, then supply credentials
USE CASES
Read the workspace to get its pipelines and their issue counts, move the tickets that belong elsewhere into position, and set estimates across the batch in one go.
Create the epic with its existing issues attached as children, add any that turn up later, and put start and end dates on it.
Find the issues sitting in the done pipeline, close them all in one call, and tag the batch so the release notes can find it later.
Look the issues up by repository and number, declare the blocking relationship between them, and remove it once the dependency clears.
Create the sprint with its dates and timezone, check what sprints the workspace already has, then map the chosen issues onto it.
List the repositories the workspace covers, ask which users a repository will accept as assignees, and fall back to the workspace roster when it will not answer.
Counted once with only startup setup. Other versions, modes or optional credentials may expose a different list.
zenhub_add_assignees_to_issuesAdd assignees to multiple issues
zenhub_add_issues_to_sprintsAdd issues to sprints
zenhub_add_labels_to_issuesAdd labels to multiple issues
zenhub_add_milestone_to_issuesAdd milestone to multiple issues
zenhub_add_repository_to_workspaceAdd a GitHub repository to a workspace
zenhub_add_subissues_to_epicAdd existing issues as sub-issues to an epic.
zenhub_close_issuesClose one or more issues
zenhub_create_epicCreate a new epic in ZenHub. Optionally, you can also specify existing issue IDs that should be added as children of the new epic.
zenhub_create_github_labelCreate a GitHub label
zenhub_create_issueCreate a new GitHub issue via ZenHub
zenhub_create_issue_dependencyCreate a dependency between two issues (blocking → blocked)
zenhub_create_milestoneCreate a milestone
zenhub_create_sprintCreate a new sprint
zenhub_create_workspaceCreate a new workspace in ZenHub
zenhub_create_zenhub_labelCreate a ZenHub label
zenhub_delete_issue_dependencyDelete a dependency between two issues (blocking → blocked)
zenhub_get_epicGet an epic
zenhub_get_issue_by_infoLookup an issue by repository and issue number
zenhub_get_organization_workspacesGet all workspaces within a specific ZenHub organization
zenhub_get_owner_by_gh_idLookup a GitHub user/organization by GitHub ID
zenhub_get_owner_by_loginLookup a GitHub user/organization by login
zenhub_get_repositoriesLookup repositories by their GitHub IDs
zenhub_get_repositories_by_github_idsLookup repositories by their GitHub IDs
zenhub_get_repository_assignable_usersGet users who can be assigned to issues in a repository
zenhub_get_repository_collaboratorsGet all collaborators for a repository who can be assigned to issues (Note: Repository collaborators not available in ZenHub API - use workspace users instead)
zenhub_get_repository_detailsGet detailed information about a specific repository
zenhub_get_repository_labelsGet all labels in a repository
zenhub_get_user_organizationsGet all ZenHub organizations accessible to the current user
zenhub_get_user_workspacesGet all workspaces accessible to the current user
zenhub_get_viewerGet current authenticated user's ZenHub and GitHub profile information
zenhub_get_workspace_issuesGet all issues in a workspace (paginated)
zenhub_get_workspace_labelsGet all ZenHub labels in a workspace
zenhub_get_workspace_overviewGet workspace overview including basic metadata, pipelines with issue counts, repositories with issue counts, default repository and its issue types, epic summaries, and workspace users
zenhub_get_workspace_pipelinesGet all pipelines in a workspace
zenhub_get_workspace_repositoriesGet all repositories for a workspace
zenhub_get_workspace_sprintsGet all sprints in a workspace
zenhub_get_workspace_usersGet all users in a workspace who can be assigned to issues
zenhub_move_issueMove issues to a position in a pipeline
zenhub_query_potentially_dangerousFALLBACK: 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.
zenhub_remove_assignees_from_issuesRemove assignees from multiple issues
zenhub_remove_labels_from_issuesRemove labels from multiple issues
zenhub_reopen_issuesReopen one or more closed issues
zenhub_search_issuesSearch and filter issues within a specific pipeline by title, labels, or assignees
zenhub_search_issues_in_repositorySearch 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.
zenhub_set_estimateSet an estimate for an issue
zenhub_set_multiple_estimatesSet estimates on multiple issues
zenhub_update_epicUpdate an epic
zenhub_update_epic_datesUpdate epic's start and end dates
zenhub_update_issueUpdate an existing issue
zenhub_update_milestoneUpdate a milestone
zenhub_update_sprintUpdate an existing sprint
BEFORE YOU INSTALL
51 tools when we connected.
CONTEXT COST
Rated by the size of the 51 tool definitions that ride along on every turn, not by how many there are
INSTALLATION
npx zenhub-mcp-server{
"mcpServers": {
"zenhub": {
"command": "npx",
"args": [
"zenhub-mcp-server"
],
"env": {
"ZENHUB_API_KEY": "<YOUR_ZENHUB_API_KEY>",
"GITHUB_PAT": "github_pat_"
}
}
}
}<YOUR_ZENHUB_API_KEY> is your ZenHub API key (from https://app.zenhub.com/settings/tokens). github_pat_ is only how a GitHub token starts; GITHUB_PAT is a full GitHub personal access token (from https://github.com/settings/tokens, e.g. with repo scope). Creating an issue or an epic fails with an error when GITHUB_PAT is not set.
Clone and build the server
This block runs dist/index.js from your own clone, which exists only after the build.
git clone https://github.com/derekbar90/zenhub-mcp.git
cd zenhub-mcp
npm install
npm run buildIn Cursor, go to Settings > MCP Servers and add:
<YOUR_PATH_TO_ZENHUB_MCP> is the folder you cloned. zh_ and github_pat_ are only the start of each value: paste your full ZenHub API key (from https://app.zenhub.com/settings/tokens) and a full GitHub personal access token (from https://github.com/settings/tokens, e.g. with repo scope). Creating an issue or an epic fails with an error when GITHUB_PAT is not set.
{
"mcpServers": {
"zenhub": {
"command": "node",
"args": [
"<YOUR_PATH_TO_ZENHUB_MCP>/dist/index.js"
],
"env": {
"ZENHUB_API_KEY": "zh_",
"GITHUB_PAT": "github_pat_"
}
}
}
}