Skip to main content
Glama
wiklob

linear-mcp-lean

by wiklob

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
PORTNoThe port on which the MCP server listens.8080
LINEAR_API_KEYYesA Linear Personal API key used to authenticate outbound requests to Linear's GraphQL API.
MCP_BEARER_TOKENYesThe bearer token used by MCP clients to authenticate requests to this server.

Capabilities

Features and capabilities supported by this server

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
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. query is a case-insensitive title/description text search (find an existing ticket without raw graphql). Page forward by passing the returned cursor back. Filter names (state/project/label/assignee/team) resolve server-side; an unresolved name errors loudly. Narrow server-side with team and includeCompleted:false (excludes completed/canceled/duplicate) to cut row count before it reaches you.

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). project accepts a name or id.

get_milestoneB

Get one project milestone (id, name, description).

list_commentsA

List an issue's comments (id, body, authorName, createdAt). issue accepts an identifier (e.g. ENG-123) or id.

save_issueA

Create (no id) or update (id) an issue. Returns only {id, identifier, state, url} — no full-object echo. id-or-name args (state/assignee/project/milestone/labels) resolve server-side; blockedBy takes issue identifiers; create requires title + team.

save_commentA

Add a comment to an issue. Returns only {id, url}. issue accepts an identifier or id.

save_projectA

Create (no id) or update (id) a project. Returns only {id, name, url}. Create requires name + team; addInitiatives (names or ids) are attached after create.

save_milestoneA

Create (no id) or update (id) a project milestone. Returns only {id, name}. Create requires name + project (name or id).

get_teamA

Get one team by id, key, or name → {id, name, key}.

list_teamsA

List teams → [{id, name, key}]. query filters by name/key substring.

get_userA

Get one user by id, "me", or name → {id, name, displayName, email, active}.

list_usersA

List users → [{id, name, displayName, email, active}]. query filters by name/displayName/email substring.

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}. issue accepts an identifier or id.

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}}. id accepts a document id or slug.

list_documentsA

List documents as lean rows → [{id, title, slugId, updatedAt}] (no content).

save_documentA

Create (no id) or update (id) a document → {id, title, slugId}. Create requires title; project (name or id) resolves server-side.

list_issue_labelsA

List issue labels → [{id, name, color, isGroup}]. Optional name filter.

list_project_labelsA

List project labels → [{id, name, color, isGroup}]. Optional name filter.

create_issue_labelA

Create an issue label → {id, name, color}. team (name or id) scopes it to a team; omit for a workspace label.

list_issue_statusesA

List workflow states → [{id, name, type, color}]. Optional team (name or id) scope.

get_issue_statusA

Get one workflow state → {id, name, type, color}.

list_cyclesA

List cycles → [{id, number, name, startsAt, endsAt}]. Optional team (name or id) scope.

get_status_updatesB

Get one status update by id, or list a project's/initiative's updates → [{id, body, health, createdAt, url, authorName}]. type selects project vs initiative.

save_status_updateA

Create (no id) or update (id) a project/initiative status update → {id, url, health}. Create requires the matching parent (project or initiative).

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

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/wiklob/linear-mcp-lean'

If you have feedback or need assistance with the MCP directory API, please join our Discord server