linear-mcp
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| LINEAR_PAT_WORK | No | Personal API key for the 'work' workspace | |
| LINEAR_LABEL_WORK | No | Label for the 'work' workspace (optional) | |
| LINEAR_WORKSPACES | Yes | Comma-separated list of workspace aliases (e.g., personal,work) | |
| LINEAR_PAT_PERSONAL | No | Personal API key for the 'personal' workspace. Additional PAT variables required for each workspace alias (e.g., LINEAR_PAT_<ALIAS>) | |
| LINEAR_MCP_AUDIT_LOG | No | Set to 'false' to disable audit logging | |
| LINEAR_LABEL_PERSONAL | No | Label for the 'personal' workspace (optional) | |
| LINEAR_PRIMARY_WORKSPACE | Yes | The default workspace alias | |
| LINEAR_MCP_AUDIT_LOG_PATH | No | Path to audit log file (default: ~/.claude/linear-mcp/audit.log) | |
| LINEAR_MCP_SKIP_IDEMPOTENCY | No | Set to '1' to skip idempotency check | |
| LINEAR_MCP_DRAFT_TTL_SECONDS | No | Draft expiry time in seconds (default: 3600) | |
| LINEAR_MCP_SKIP_SOURCE_CHECK | No | Set to '1' to skip source first-line check |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_workspacesA | List configured Linear workspaces with PAT prefix + primary status. Returns a dict with |
| healthcheckA | Verify PAT validity for each workspace + report draft store + audit log path. For each workspace, calls the |
| list_teamsA | List teams in a Linear workspace.
|
| get_teamB | Get a Linear team by its UUID. Includes workflow states inline. |
| list_usersC | List users in a Linear workspace.
|
| get_userA | Get a Linear user by ID. Pass For |
| list_projectsB | List projects.
|
| get_projectB | Get a Linear project by UUID. |
| save_projectA | Create or update a Linear project. Pass Dates are ISO-8601 strings ( |
| list_initiativesB | List initiatives in the workspace. Initiatives are Linear's top-level org-wide goals that contain multiple projects. |
| get_initiativeB | Get an initiative by UUID. |
| save_initiativeA | Create or update an initiative. Pass |
| list_issuesC | List issues with common filters.
|
| get_issueA | Get a single issue.
|
| save_issueA | Create or update an issue. Pass |
| bulk_save_issuesA | Apply the same update to multiple issues in one round-trip.
|
| list_cyclesC | List cycles, optionally scoped to one team.
|
| list_milestonesB | List project milestones. |
| get_milestoneC | Get a project milestone by UUID. |
| save_milestoneA | Create or update a project milestone. Pass |
| list_issue_statusesA | List workflow states (issue statuses) per team.
|
| get_issue_statusA | Return the current workflow state for one issue (id or identifier). Convenience tool: the existing get_issue already returns state, but this is the minimal-fields variant for status-driven automations. |
| list_issue_labelsA | List issue labels. |
| create_issue_labelA | Create a new issue label.
|
| list_commentsB | List comments. Scope by |
| save_commentA | Create or update a comment. Pass |
| list_documentsC | List documents in the workspace. |
| get_documentB | Get a document by UUID. |
| save_documentA | Create or update a document. Pass |
| save_status_updateB | Post a status update against a project.
|
| search_issuesA | Full-text search across issues in the workspace. Backed by Linear's |
| search_documentsC | Full-text search across workspace documents (NOT Linear's dev docs). |
| search_projectsC | Full-text search across projects in the workspace. |
| semantic_searchA | Semantic search across the entire workspace. Returns heterogeneous nodes (issues, projects, documents, comments,
initiatives). Each node carries Use this when the search target is conceptual ("payment retry logic") rather than exact-string ("PAY-123"). |
| list_webhooksC | List webhooks configured for the workspace. |
| get_webhookB | Get a webhook by UUID. |
| create_webhookA | Create a webhook subscription.
|
| update_webhookC | Update an existing webhook by UUID. |
| delete_webhookA | Delete a webhook. Destructive — uses draft+confirm. Two-call flow:
Drafts expire after 1 hour (override with
|
| list_notificationsA | List notifications in the viewer's inbox.
|
| get_notificationC | Get one notification by UUID. |
| notifications_unread_countC | Return the count of unread notifications in the inbox. |
| mark_notification_readB | Mark a notification read (or unread by passing |
| mark_all_notifications_readB | Mark every notification in the inbox as read.
|
| archive_notificationA | Archive a notification (removes from inbox; reversible). |
| list_attachmentsC | List attachments on one issue. |
| attachments_for_urlA | Reverse lookup: every attachment record across the workspace pointing at this URL. Useful to find which issue references a given Slack thread / PR / external doc. |
| get_attachmentC | Get one attachment by UUID. |
| link_url_to_issueA | Attach an arbitrary URL to an issue. Linear renders the link in the issue sidebar. Pass |
| delete_attachmentA | Delete an attachment. Destructive — uses draft+confirm. Two-call flow identical to |
| list_issue_relationsC | List issue relations. |
| create_issue_relationA | Create a relation between two issues.
|
| delete_issue_relationA | Delete an issue relation by ID. Non-destructive (no cascade). |
| list_agent_sessionsB | List agent sessions. |
| get_agent_sessionC | Get an agent session by UUID. |
| create_agent_session_on_issueA | Open an agent session attached to an issue.
|
| create_agent_session_on_commentB | Open an agent session attached to a comment (typically a @mention of the agent app user). |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
| triage-issue | Triage a Linear issue: classify, assign, label, prioritize, link. Use this to standardize how an agent processes an incoming issue. The prompt pulls the issue + recent comments + relations so the agent can suggest concrete next moves rather than vague triage advice. |
| project-status | Draft a weekly project status update from current Linear state. |
| inbox-sweep | Triage today's notification inbox — categorize, propose actions. |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 57 tools
Tools like list_issues, search_issues, and semantic_search have overlapping purposes despite different mechanisms. Similarly, get_issue_status duplicates get_issue's state info, and the many save_* tools could confuse agents. Descriptions help but the sheer number causes ambiguity.
Most tools follow a verb_noun pattern (e.g., list_issues, save_issue), with minor deviations like get_issue_status and link_url_to_issue. The use of save_ for create/update is consistent, but some names like list_issue_labels are slightly inconsistent.
57 tools is excessive for a single MCP server, even for a feature-rich platform like Linear. Many tools could be merged or streamlined (e.g., multiple search variants, separate create/update tools), leading to agent decision fatigue.
The tool set covers most Linear concepts: issues, projects, comments, documents, webhooks, notifications, attachments, relations, and agent sessions. Missing CRUD for teams, users, cycles, and workflow states, but these are less critical for typical workflows.