Skip to main content
Glama

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
LINEAR_PAT_WORKNoPersonal API key for the 'work' workspace
LINEAR_LABEL_WORKNoLabel for the 'work' workspace (optional)
LINEAR_WORKSPACESYesComma-separated list of workspace aliases (e.g., personal,work)
LINEAR_PAT_PERSONALNoPersonal API key for the 'personal' workspace. Additional PAT variables required for each workspace alias (e.g., LINEAR_PAT_<ALIAS>)
LINEAR_MCP_AUDIT_LOGNoSet to 'false' to disable audit logging
LINEAR_LABEL_PERSONALNoLabel for the 'personal' workspace (optional)
LINEAR_PRIMARY_WORKSPACEYesThe default workspace alias
LINEAR_MCP_AUDIT_LOG_PATHNoPath to audit log file (default: ~/.claude/linear-mcp/audit.log)
LINEAR_MCP_SKIP_IDEMPOTENCYNoSet to '1' to skip idempotency check
LINEAR_MCP_DRAFT_TTL_SECONDSNoDraft expiry time in seconds (default: 3600)
LINEAR_MCP_SKIP_SOURCE_CHECKNoSet to '1' to skip source first-line check

Capabilities

Features and capabilities supported by this server

CapabilityDetails
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

NameDescription
list_workspacesA

List configured Linear workspaces with PAT prefix + primary status.

Returns a dict with workspaces (list of redacted profiles), primary (alias of the default workspace), and errors (config errors found at load time). Tokens never appear in the response.

healthcheckA

Verify PAT validity for each workspace + report draft store + audit log path.

For each workspace, calls the viewer query. Returns user info + the organization the PAT is scoped to. A failure means the PAT has been revoked or rotated and needs re-generation at linear.app/settings/account/security.

list_teamsA

List teams in a Linear workspace.

workspace selects which configured PAT to use (defaults to primary). first is the page size (max 250); after is the cursor from a previous response's pageInfo.endCursor.

get_teamB

Get a Linear team by its UUID. Includes workflow states inline.

list_usersC

List users in a Linear workspace.

include_disabled flips the Linear includeDisabled filter so you can see members who have been removed from the org.

get_userA

Get a Linear user by ID. Pass me to look up the PAT owner.

For me, the server resolves it via the viewer query and substitutes the resolved id.

list_projectsB

List projects.

team_id scopes to projects involving one team. state filters by project state (one of: backlog, planned, started, paused, completed, canceled). Omit for all.

get_projectB

Get a Linear project by UUID.

save_projectA

Create or update a Linear project.

Pass id to update an existing project; omit id (and pass team_ids) to create a new one. Linear requires at least one team when creating.

Dates are ISO-8601 strings (YYYY-MM-DD). priority is 0-4 (0=none, 1=urgent, 2=high, 3=medium, 4=low).

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 id to update; omit to create. Status is one of Planned, Active, Completed (string, not enum) per Linear's API.

list_issuesC

List issues with common filters.

assignee_id accepts a user UUID or the literal me. state_type accepts one of: backlog, unstarted, started, completed, canceled, triage. query does a full-text search across title + description. filter lets you pass a raw Linear IssueFilter for cases the convenience args don't cover.

order_by is updatedAt (default) or createdAt.

get_issueA

Get a single issue.

id accepts either the UUID or the human identifier (e.g. ONDE-123). When given an identifier, the tool resolves it through a one-shot search.

save_issueA

Create or update an issue.

Pass id to update. Creating requires title and team_id. assignee_id accepts a UUID or me. priority is 0-4 (0=none, 1=urgent, 2=high, 3=medium, 4=low).

bulk_save_issuesA

Apply the same update to multiple issues in one round-trip.

ids is a list of issue UUIDs. Every other arg is an optional field to set on all of them (skip args you don't want to change). Linear's issueBatchUpdate mutation does the work server-side — way faster than N separate save_issue calls for bulk ops like "mark these 50 as Done" or "reassign these to me."

auth_phrase (REQUIRED, v0.3) must be one of: "go", "yes do it", "confirmed", "execute", "go cancel", "go update". Without this explicit confirmation a single hallucinated arg could mass-modify pre-existing shared workspace data — surface the requirement to the operator and capture their explicit phrase before calling this tool.

list_cyclesC

List cycles, optionally scoped to one team.

team_id is the team UUID. Omit to list cycles across every team.

list_milestonesB

List project milestones. project_id scopes to one project.

get_milestoneC

Get a project milestone by UUID.

save_milestoneA

Create or update a project milestone.

Pass id to update. Creating requires name and project_id.

list_issue_statusesA

List workflow states (issue statuses) per team.

team_id scopes results to one team. Omit to list every workflow state across the workspace.

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. team_id scopes to one team; omit for org-wide.

create_issue_labelA

Create a new issue label.

team_id makes a team-scoped label. Omit for workspace-scoped. color is a 7-char hex (#RRGGBB). parent_id nests this label under another (Linear supports two-level label hierarchies).

list_commentsB

List comments. Scope by issue_id or project_id.

save_commentA

Create or update a comment.

Pass id to edit an existing comment (only body is updateable). Creating requires body and either issue_id or project_id. parent_id threads the comment as a reply.

list_documentsC

List documents in the workspace.

get_documentB

Get a document by UUID.

save_documentA

Create or update a document.

Pass id to update. Creating requires title and one of project_id or initiative_id (documents attach to a project or initiative in Linear's model).

save_status_updateB

Post a status update against a project.

health is one of onTrack, atRisk, offTrack (Linear enums). body is markdown.

search_issuesA

Full-text search across issues in the workspace.

Backed by Linear's searchIssues GraphQL field (verified via introspection). Returns nodes with the standard issue shape plus a totalCount so the agent knows how many more hits exist beyond the current page.

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 __typename so the agent can branch on entity kind.

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.

url is your HTTPS receiver. resource_types defaults to ["Issue", "Comment", "IssueLabel"] if omitted — adjust as needed (full list at linear.app/developers/webhooks). team_id scopes to one team; all_public_teams=True subscribes to every public team in the org. secret is your HMAC signing secret — Linear adds it to the Linear-Signature header on every event.

update_webhookC

Update an existing webhook by UUID.

delete_webhookA

Delete a webhook. Destructive — uses draft+confirm.

Two-call flow:

  1. delete_webhook(id=...) returns a draft_id plus a preview of which webhook is about to go away.

  2. delete_webhook(id=..., confirm_draft_id=<draft_id>) actually issues webhookDelete against Linear.

Drafts expire after 1 hour (override with LINEAR_MCP_DRAFT_TTL_SECONDS).

list_notificationsA

List notifications in the viewer's inbox.

unread_only=True restricts to notifications with no readAt. Nodes carry __typename (IssueNotification, ProjectNotification, etc.) so an agent can branch on category.

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 read=False).

mark_all_notifications_readB

Mark every notification in the inbox as read.

category optionally scopes to one notification category (e.g. triageResponsibility, assigned).

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 title and icon_url to customize the display; otherwise Linear fetches OpenGraph metadata from the URL.

delete_attachmentA

Delete an attachment. Destructive — uses draft+confirm.

Two-call flow identical to delete_webhook. The first call returns a draft_id + preview of the attachment that will be removed; the second call (with confirm_draft_id) commits.

list_issue_relationsC

List issue relations. issue_id filters to relations involving one issue.

create_issue_relationA

Create a relation between two issues.

type must be one of: blocks (issue blocks related_issue), duplicate (issue duplicates related_issue), or related (no directionality). Linear automatically creates the inverse relation visible on the other issue.

delete_issue_relationA

Delete an issue relation by ID. Non-destructive (no cascade).

list_agent_sessionsB

List agent sessions. issue_id scopes to one issue.

get_agent_sessionC

Get an agent session by UUID.

create_agent_session_on_issueA

Open an agent session attached to an issue.

session_type is one of comment (the agent posts a comment as its output) or commentThread (the agent threads under existing comments). external_url lets the agent surface a link back to its own dashboard / run log.

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

NameDescription
triage-issueTriage 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-statusDraft a weekly project status update from current Linear state.
inbox-sweepTriage today's notification inbox — categorize, propose actions.

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/adelaidasofia/linear-mcp'

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