linear-mcp-lean
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| PORT | No | The port on which the MCP server listens. | 8080 |
| LINEAR_API_KEY | Yes | A Linear Personal API key used to authenticate outbound requests to Linear's GraphQL API. | |
| MCP_BEARER_TOKEN | Yes | The bearer token used by MCP clients to authenticate requests to this server. |
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
} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| get_issueA | Retrieve a Linear issue by ID. Default → a minimal flattened field set; full:true → a documented richer superset (assignee, lifecycle timestamps, state type, parent, estimate, dueDate). |
| list_issuesA | List issues as a {issues, hasNextPage, cursor} envelope. Lean rows by default (identifier, title, state, statusType, priority, createdAt, blockedBy, labels, project{id}, projectMilestone{id}, gitBranchName); full:true adds description, url, assignee, milestone name, updatedAt per row. |
| list_projectsA | List projects as lean rows (id, name, status{name,type}) by default; full:true adds description, dates, lead, labels, initiatives. Optional state (lifecycle string), label (project label name), and team filters; includeCompleted:false excludes completed/canceled projects server-side. |
| get_projectA | Get one project. Default → id, name, description, labels[name]; full:true adds status{name,type}, dates, lead, initiatives. |
| list_milestonesA | List a project's milestones (id, name). |
| get_milestoneB | Get one project milestone (id, name, description). |
| list_commentsA | List an issue's comments (id, body, authorName, createdAt). |
| save_issueA | Create (no |
| save_commentA | Add a comment to an issue. Returns only {id, url}. |
| save_projectA | Create (no |
| save_milestoneA | Create (no |
| get_teamA | Get one team by id, key, or name → {id, name, key}. |
| list_teamsA | List teams → [{id, name, key}]. |
| get_userA | Get one user by id, "me", or name → {id, name, displayName, email, active}. |
| list_usersA | List users → [{id, name, displayName, email, active}]. |
| get_attachmentA | Get one attachment → {id, title, subtitle, url, sourceType}. |
| create_attachmentB | Link an external URL to an issue as an attachment → {id, title, url}. |
| create_attachment_from_uploadA | Finalize an upload: link an already-uploaded assetUrl to an issue → {id, title, url}. Call after prepare_attachment_upload + the client-side byte PUT. |
| prepare_attachment_uploadA | Get a presigned direct-upload URL (fileUpload) → {assetUrl, uploadUrl, headers, issue}. PUT raw bytes to uploadUrl with headers verbatim (client-side), then call create_attachment_from_upload. |
| get_documentA | Get one document → {id, title, content, slugId, updatedAt, project{id}}. |
| list_documentsA | List documents as lean rows → [{id, title, slugId, updatedAt}] (no content). |
| save_documentA | Create (no |
| list_issue_labelsA | List issue labels → [{id, name, color, isGroup}]. Optional |
| list_project_labelsA | List project labels → [{id, name, color, isGroup}]. Optional |
| create_issue_labelA | Create an issue label → {id, name, color}. |
| list_issue_statusesA | List workflow states → [{id, name, type, color}]. Optional |
| get_issue_statusA | Get one workflow state → {id, name, type, color}. |
| list_cyclesA | List cycles → [{id, number, name, startsAt, endsAt}]. Optional |
| get_status_updatesB | Get one status update by |
| save_status_updateA | Create (no |
| search_documentationB | Search Linear's help-center documentation. Proxied to the hosted Linear MCP (no public GraphQL backing). |
| extract_imagesA | Extract and fetch images from markdown content. Proxied to the hosted Linear MCP (content helper, no GraphQL backing). |
| get_diffA | Exact lookup for a Linear diff (review URL, PR URL/ID, slug, or full identifier). Proxied to the hosted Linear MCP (no public GraphQL backing). |
| get_diff_threadsC | Exact lookup for diff review threads. Proxied to the hosted Linear MCP (no public GraphQL backing). |
| list_diffsB | List Linear diff pull requests. Proxied to the hosted Linear MCP (no public GraphQL backing). |
| linear_graphqlA | Run an arbitrary GraphQL query or mutation against Linear's API (https://api.linear.app/graphql) and return the raw result. For the rare need neither the lean default nor full:true covers. Example: linear_graphql({query: "query($id:String!){ issue(id:$id){ identifier subscribers{ nodes{ name } } } }", variables: {id: "ENG-123"}}). Bearer-gated like every tool; errors surface, never swallowed. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 36 tools
Each tool targets a distinct operation on a specific entity (issue, project, document, etc.). Even similar pairs like create_attachment vs create_attachment_from_upload are clearly differentiated by their parameters and process. The raw GraphQL tool is explicitly a fallback, avoiding ambiguity.
Tool names consistently follow a verb_noun pattern (e.g., create_issue_label, list_issues, save_issue). The only deviation is linear_graphql, but that is a special-purpose tool, and the pattern holds for all others. Naming is predictable and uniform.
With 36 tools, the server is comprehensive but slightly heavy. It covers many Linear entities, but the count is above the typical well-scoped range (3–15). Some tools like extract_images and search_documentation are auxiliary, and the diff-related tools add redundancy. Still, the count is reasonable given the domain's complexity.
The tool surface lacks delete operations for issues, projects, documents, attachments, comments, milestones, and labels. There are no update operations for labels or comments (save_comment only creates, not updates). These gaps force agents to rely on the raw graphql tool for basic lifecycle management, which is a significant shortcoming.