
List comments from Linear, optionally scoped to one issue via issueid (accepts a UUID or an identifier like 'ENG-142'; use getissues to find issues). Filter server-side by bodycontains (substring) or createdafter. Supports cursor pagination.
Get a single Linear comment by id. Use get_comments to find comment ids on an issue.
Add a comment to a Linear issue. issueid accepts a UUID or an identifier like 'ENG-142'; use getissues to find issues. Body is Markdown.
Edit the body of an existing Linear comment. Use get_comments to find comment ids.
Resolve a Linear comment thread by comment id. Use get_comments to find comment ids.
Reopen a resolved Linear comment thread by comment id. Use get_comments to find ids.
List cycles (sprints) from Linear, filterable by teamid (use getteams) and isactive. Cycles belong to one team. Use this to discover cycle ids for createissue/update_issue.
List issue labels from Linear, with server-side name (substring) and teamid filters plus cursor pagination. Use this to discover valid label ids before setting labelids on createissue/updateissue; only non-group (leaf) labels can be applied to issues.
Create a Linear issue label. Requires a name; teamid (use getteams) scopes it to one team, omit for a workspace-level label. Optional hex color and description.
List workflow states (issue statuses) from Linear, filterable by teamid (use getteams) and state category. State ids are team-specific — use this to discover valid stateid values before setting them on createissue/update_issue.
List issues from Linear with server-side filters (team, assignee, project, project milestone, state, priority, title text, label, updated-after date) and cursor pagination. Use getteams/getusers/getprojects/listprojectmilestones/listissuestatuses to find filter ids. For one known issue use getissue instead. Text search covers TITLES ONLY — descriptions and comments are not searched.
Get a single Linear issue by id (UUID) or identifier like 'ENG-142'. Use get_issues to search when the id is unknown.
Create a Linear issue. Requires teamid (use getteams). Optional: description, priority 0-4, assigneeid (getusers), stateid (listissuestatuses), labelids (getissuelabels, leaf labels only), projectid (getprojects), cycleid (listcycles), parentid, duedate, subscriber_ids.
Update a Linear issue by id or identifier like 'ENG-142': title, description, priority 0-4, estimate, assigneeid (getusers), stateid (listissuestatuses), labels (getissuelabels), project/cycle/parent, duedate, team transfer. To CLEAR a field use its unset_* flag, not null.
Archive a Linear issue by id or identifier like 'ENG-142'. Archiving is Linear's delete; the issue disappears from default views but can be restored in the app.
List Linear project milestones (dated checkpoints inside a project) with cursor pagination. Filters server-side by projectid (use getprojects), name substring, target-date range, and updatedafter. Linear has no server-side status filter — read each milestone's status field instead. For a milestone's issues call getissues with projectmilestoneid.
Get one Linear project milestone by id (UUID): name, description, target date, status, and progress. Use listprojectmilestones to find milestone ids. For the issues in the milestone call getissues with projectmilestone_id.
List projects from Linear. Filter server-side by name (substring, case-insensitive), state, health, or lead; supports cursor pagination and include_archived. Use this to discover project ids for other tools. Prefer the default limit (50) with pagination — large limits can exceed Linear's query-complexity cap and fail.
List the workspace-defined project statuses (e.g. Backlog, Planned, In Progress). Use this to find status ids for createproject/updateproject's statusid; each status also shows its fixed type, which is what getprojects' state filter matches.
Get a single Linear project by id. Use get_projects to search by name when the id is unknown.
Create a Linear project. Requires name and teamids (use getteams to find team ids). Optional: description, leadid/memberids (getusers), startdate, target_date (YYYY-MM-DD).
Update a Linear project by id: name, description, lead, status, priority, teams, or dates. Use get_projects to find project ids.
Archive a Linear project by id. Archiving hides the project from default views; it can be restored in the app. Use get_projects to find project ids.
List project status updates from Linear, optionally scoped to one project via projectid (use getprojects to find project ids). Supports cursor pagination and include_archived.
Get a single Linear project update by id. Use getprojectupdates to find update ids.
Post a status update on a Linear project. Requires projectid (use getprojects) and a Markdown body; optional health: onTrack, atRisk, or offTrack.
Edit an existing Linear project update's body or health by id. Use getprojectupdates to find update ids.
Archive a Linear project update by id. Use getprojectupdates to find update ids.
Restore an archived Linear project update by id. Use getprojectupdates with include_archived=true to find archived update ids.
Link two Linear issues, e.g. mark one as blocking another or as a duplicate. Both ids accept a UUID or an identifier like 'ENG-142'; use getissues to find issues. Linear adds the inverse edge automatically, so create the relation once, in one direction only. Use getissue_relations to see existing links first.
List the relations on a Linear issue in BOTH directions: what it blocks, what blocks it, duplicates and related links. Each result carries a direction field, so type='blocks' with direction='incoming' means the issue you asked about is blocked by the other one. issueid accepts a UUID or an identifier like 'ENG-142'. Returns relation ids for deleteissue_relation.
Remove a link between two Linear issues. Takes the relation's own id, not an issue id; use getissuerelations to find it. Removing a relation also removes the inverse edge Linear created with it.
Attach a link to a Linear issue, e.g. a PR, doc or dashboard. issueid accepts a UUID or an identifier like 'ENG-142'. The url is the attachment's identity: reusing a url already on the issue updates that attachment rather than adding a second one. Use getattachments to see what is already attached.
List the links attached to a Linear issue, such as PRs, docs and dashboards. issue_id accepts a UUID or an identifier like 'ENG-142'.
List teams from Linear. Filter server-side by name (substring, case-insensitive) or key (the exact short code like 'ENG' that prefixes issue identifiers — never pass search text as key). Supports cursor pagination. Use this to discover team ids for other tools.
Get a single Linear team by id, including its members. Use get_teams to find team ids (or to search by name/key).
Create a Linear team. Requires a name; the short key (max 7 chars, e.g. 'ENG') is auto-generated when omitted.
Update a Linear team's name, key, or description by team id. Use get_teams to find team ids.
List users in the Linear workspace. Filter server-side by name (substring), email (exact), active status, or is_me=true for the authenticated user. Supports cursor pagination. Use this to discover user ids for assignee/lead/member fields. Linear has no user create/update API.
Get a single Linear user by id. Use getusers to find user ids (or filter isme=true for the authenticated user).
Validate Linear credentials by fetching the authenticated user. Verifies credentials during setup.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}Merge automates the full authentication lifecycle. This includes:
For Linear specifically, users authenticate through Merge’s Link flow, and Merge manages OAuth tokens before executing any MCP tool calls.
Yes. Merge’s Security Gateway supports both default and fully custom DLP rules. You can configure rules to:
These rules apply to both tool inputs and outputs.
Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now