dsh-linear-mcp
This MCP server lets an agent read and write Linear work items over stdio, authenticated with a personal API key.
Identify the key's owner (
linear_get_viewer) and list issues assigned to meResolve UUIDs: teams, users (by name/email), projects, cycles, labels, workflow states
Search issues by free text or exact identifier (e.g.
ENG-4651), or list with filters for team, project, cycle, assignee ("me"supported), exact state name, state type, label and archivedFetch full issue detail: state, assignee, creator/reporter, parent, children, labels and relations
Create issues (including sub-issues via
parentId), update any mutable field, reparent, archive or deleteManage issue relations (
blocks,duplicate,related,similar): create, list, deleteManage comments: add (with threaded replies), list, update, delete
Provides tools for interacting with Linear's API, enabling AI agents to manage issues, sub-issues, relations, comments, projects, cycles, teams, users, labels, and workflow states in a Linear instance.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@dsh-linear-mcp List my open issues"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
dsh-linear-mcp
A stdio Model Context Protocol server for Linear, built for DeepSeek Harness (dsh), Codex, Claude and any other MCP client.
It authenticates with a Linear personal API key (lin_api_…) instead of OAuth, so it starts instantly and never needs a browser round-trip. That makes it a good fit for headless / ACP / Paseo-style agents where an OAuth-discovery bridge would race the session's tool snapshot.
22 tools: issues, sub-issues, relations, comments, projects, cycles, teams, users, labels, workflow states
Plain JSON output, per-request timeout, no write tools without a key
Zero runtime services: one Node process, stdio only
Tools
Tool | Purpose |
| The Linear user that owns the API key |
| Resolve team and user UUIDs (users support a name/email query) |
| Resolve project, cycle, label and state UUIDs |
| Free-text search; an exact identifier like |
| Filter by team, project, cycle, assignee ( |
| Issues assigned to the API key's own user |
| Full detail: state, assignee, creator / reporter, parent, children, labels, relations |
| Create, including |
| Update any mutable field, including |
| Archive (reversible) / delete |
|
|
| Read and write comments (threaded replies supported) |
| Edit / delete comments |
Issue results include creatorId and creator: { id, name, displayName, email }.
The creator is the original issue reporter, independently of its current assignee.
These fields are included in issue detail, lists, searches and issue mutation responses;
both are null when Linear has no creator. A creator lookup error is reported as an error,
so callers must not infer the reporter from an assignee or comment author.
Related MCP server: Linear MCP Server
Auth
Create a key in Linear → Settings → Account → Security & Access → Personal API keys, then export it:
export LINEAR_API_KEY="lin_api_xxxxxxxx"The server sends the key as Authorization: <key> (personal API keys; OAuth tokens starting with anything else are sent as Bearer). It never logs the key.
Install
# from this repo (no npm publish required)
npm install --global github:arucil/dsh-linear-mcp
# or run without installing
npx --yes github:arucil/dsh-linear-mcp --helpUse with DeepSeek Harness (dsh)
Install the server into the profile you use (
web,acpfor Paseo,headless):dsh plugin --profile acp add github:arucil/dsh-linear-mcpThis links
dsh-linear-mcpinto~/.dsh/profiles/acp/node_modules/.bin/.Mount it through the first-party MCP bridge by adding this to
~/.dsh/profiles/acp/cordis.patch.yml(seeexamples/dsh-cordis.patch.yml):- insert: - id: mcp-linear name: '@deepseek-ai/dsh-mcp-client' config: serverName: linear transport: stdio command: /home/USER/.dsh/profiles/acp/node_modules/.bin/dsh-linear-mcp env: LINEAR_API_KEY: !!js process.env.LINEAR_API_KEY toolCallTimeoutMs: 60000Start a new session (bundle patches apply at startup). The model sees the tools as
mcp__linear__<tool>.
Put
LINEAR_API_KEYin the environment of the process that startsdsh(your shell, or the Paseo daemon). Do not commit it to the profile.
Use with Codex
[mcp_servers.linear-local]
command = "dsh-linear-mcp"
args = []
env = { LINEAR_API_KEY = "lin_api_xxxxxxxx" }Use with Claude Code
claude mcp add linear -- dsh-linear-mcp
# then export LINEAR_API_KEY, or pass env in the client configCLI
dsh-linear-mcp [--api-key <lin_api_...>] [--endpoint <url>] [--timeout-ms <n>]
LINEAR_API_KEY required unless --api-key is passed
LINEAR_API_URL optional GraphQL endpoint override
LINEAR_MCP_TIMEOUT_MS optional per-request timeout (default 20000)Development
npm install
npm run build # tsc -> dist/
npm test # builds, then runs the in-memory MCP smoke tests
npm run typecheckThe smoke tests drive the server over an in-memory MCP transport with a fake LinearService, so they need no network or API key.
Security
Read/write over your own Linear permissions. Delete tools are marked destructive for clients that honor annotations.
The API key stays in the process environment; the server never writes it to disk or logs it.
Only
https://api.linear.app/graphqlis contacted unless you overrideLINEAR_API_URL.
License
MIT
Available Tools
22 toolslinear_add_commentAdd a Linear commentC
Add a comment to an issue, optionally as a threaded reply.
Inputs: body (required), issueId (required), parentId.
linear_archive_issueArchive a Linear issueADestructiveIdempotent
Archive an issue (reversible in Linear).
Inputs: id (required).
linear_create_issueCreate a Linear issueB
Create an issue. Supports parentId to create a sub-issue, plus assignee, state, project, cycle, labels, priority, due date and estimate.
Inputs: title (required), teamId (required), cycleId, dueDate, +8 more.
linear_create_issue_relationCreate a Linear issue relationC
Create a relation such as blocks, related, duplicate or subtask between two issues.
Inputs: type (required), issueId (required), relatedIssueId (required).
linear_delete_commentDelete a Linear commentADestructive
Delete a comment by its UUID.
Inputs: id (required).
linear_delete_issueDelete a Linear issueBDestructive
Permanently delete an issue.
Inputs: id (required).
linear_delete_issue_relationDelete a Linear issue relationADestructive
Delete a relation by its relation UUID.
Inputs: id (required).
linear_get_issueGet a Linear issueARead-only
Return one issue by UUID or identifier (e.g. ENG-4651), including state, assignee, parent, children, labels and relations.
Inputs: id (required).
linear_get_viewerGet current Linear userARead-only
Return the Linear user that owns the configured API key.
Inputs: no named parameters.
linear_list_commentsList Linear commentsCRead-only
List comments on an issue.
Inputs: issueId (required), limit.
linear_list_cyclesList Linear cyclesARead-only
List cycles, optionally scoped to one team.
Inputs: limit, teamId.
linear_list_issue_relationsList Linear issue relationsCRead-only
List relations for one issue.
Inputs: issueId (required), limit.
linear_list_issuesList Linear issuesARead-only
List issues with optional team / project / cycle / assignee / state / label filters. Pass assigneeId='me' for the current user; pass state for an exact state name such as 'In Review', or stateType for backlog|unstarted|started|completed|canceled.
Inputs: limit, state, teamId, cycleId, +6 more.
linear_list_labelsList Linear issue labelsBRead-only
List issue labels, optionally scoped to one team.
Inputs: limit, teamId.
linear_list_my_issuesList my Linear issuesBRead-only
List issues assigned to the API key's own Linear user.
Inputs: limit, teamId, includeArchived.
linear_list_projectsList Linear projectsARead-only
List projects, optionally scoped to one team.
Inputs: limit, teamId.
linear_list_teamsList Linear teamsARead-only
List teams visible to the API key.
Inputs: limit.
linear_list_usersList Linear usersARead-only
List users, optionally filtered by name, display name or email.
Inputs: limit, query.
linear_list_workflow_statesList Linear workflow statesBRead-only
List workflow states (backlog, unstarted, started, completed, canceled) for a team.
Inputs: limit, teamId.
linear_search_issuesSearch Linear issuesARead-only
Search issues by title, description or identifier (e.g. ENG-4651). Supports optional team, assignee, state, project and label filters.
Inputs: query (required), limit, teamId, labelId, +4 more.
linear_update_commentUpdate a Linear commentC
Update a comment body by its UUID.
Inputs: id (required), body (required).
linear_update_issueUpdate a Linear issueB
Update any mutable issue field, including parentId (move/reparent), state, assignee, labels, priority, project, cycle, due date and estimate.
Inputs: id (required), title, cycleId, dueDate, +8 more.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 22 tools
Each tool targets a distinct resource and action. The three issue listing tools (search, list, list_my) have clear differences: full-text search, filterable list, and self-assigned list. All other tools (comments, relations, entities) are mutually exclusive.
All tools follow the uniform pattern 'linear_<verb>_<noun>' with snake_case. Verbs are consistent (get, list, create, update, delete, add, search, archive) and nouns are clear. No mixed conventions or vague verbs.
At 22 tools, the count is slightly above the typical 3-15 range but not excessive. The size is justified by the breadth of Linear entities (issues, comments, relations, teams, users, projects, cycles, labels, workflow states) and the comprehensive issue lifecycle coverage. It feels a bit heavy but each tool serves a distinct purpose.
Issue management is fully covered with create, read (get/list/search), update, archive, and delete. Comments and relations have complete CRUD-like coverage. However, non-issue entities (teams, users, projects, cycles, labels, workflow states) only have list operations, lacking get/create/update/delete. This is a minor gap given the server's apparent issue-centric focus.
Maintenance
Related MCP Connectors
Issues, projects, cycles, and roadmaps via the official Linear hosted MCP server.
Linear MCP — wraps the Linear GraphQL API (OAuth)
Search, read and create Linear issues, projects, teams and cycles.
A managed runtime for custom API integrations. Manage lines, endpoints, keys, logs and DLQ via MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables interaction with Linear resources through an MCP interface, offering functionality for issue management and resource retrieval with rate limiting and error handling support.646 npm1MIT
- AlicenseBqualityDmaintenanceEnables interaction with Linear's API to manage issues, projects, and teams. Supports creating, updating, searching, and deleting issues, along with project management and team operations through API key authentication.13672 npmMIT
- AlicenseAqualityDmaintenanceA read-only MCP server for Linear that enables listing teams, cycles, and issues, and searching issues via the Linear API.5672 npmMIT
- AlicenseBqualityCmaintenanceMulti-workspace Linear MCP server using Personal API Keys instead of OAuth. Provides tools for managing issues, projects, teams, and more across multiple workspaces.5767 PyPI2MIT