mcp-linear
Enables reading and managing Linear issues by human-readable ID, with tools for searching, creating, updating, commenting, and resolving teams, states, labels, and assignees by name.
README
mcp-linear
MCP server exposing Linear issue operations. Standalone — no dependency on the built-in Claude Linear MCP.
Issues are addressed by their human identifier (GOV-123). States, teams,
labels, and assignees are given by name; the server resolves them to Linear
UUIDs and returns an error listing valid options when a name does not match.
Tools
| Tool | Description |
|---|---|
get_issue |
Fetch an issue by identifier |
list_my_issues |
Issues assigned to the API key's owner |
search_issues |
Full-text search with team/state/assignee filters |
create_issue |
Create an issue on a team |
update_issue |
Update fields on an existing issue |
get_comments |
Comments on an issue |
add_comment |
Post a comment |
list_teams |
Team keys and names |
list_states |
Workflow states for a team |
list_labels |
Labels on a team plus workspace labels (team optional) |
list_users |
Active users |
Setup
python3 -m venv .venv
.venv/bin/pip install -e ".[dev]"
cp .env.example .env
# Edit .env — set LINEAR_API_KEY
Get an API key: Linear → Settings → Security & access → Personal API keys. Write operations need a key with write access.
Add to Claude Code
{
"mcpServers": {
"linear": {
"command": "/Users/piuschungath/Workspace/mcp-linear/.venv/bin/mcp-linear",
"env": { "LINEAR_API_KEY": "lin_api_..." }
}
}
}
Tests
.venv/bin/pytest
All HTTP is mocked with respx. No API key and no network access are needed.
With mcp-pr-assistant
The two servers compose without importing each other: fetch a ticket with
get_issue, pass its fields to create_pr_from_ticket, then post the PR URL
back with add_comment.
Schema verification
The GraphQL field names in src/mcp_linear/queries.py were verified against
the live Linear API on 2026-08-21, by running the tools' actual query strings
(not copies of them) against a real workspace.
Verified correct:
- the
Float!issue-number comparator - team-scoped labels via
team { labels } - the root
issueLabelsconnection viewer.assignedIssues(orderBy: updatedAt)- every field the three mutations send —
IssueCreateInput,IssueUpdateInputandCommentCreateInputall acceptteamId,title,description,stateId,assigneeId,priority,labelIds,issueIdandbodyas used
One divergence was found and fixed:
- Full-text search.
issueSearchrejects itsqueryargument as deprecated. Search now usessearchIssues(term: ...), which returnsIssueSearchPayloadwhose nodes areIssueSearchResult, notIssue— so it cannot spread theIssueFieldsfragment.queries.pydeclares a second fragment,SearchFields, with the identical selection on that type. Introspection confirmedIssueSearchResultcarries every fieldIssueFieldsselects. If you change one fragment, change the other.
One thing remains unconfirmed:
- Workspace labels. The root
issueLabelsconnection resolves, but whether it returns workspace-wide labels only — or also team-scoped labels belonging to other teams — was not established. Label resolution consults a team's own labels first, so a team label always wins over a same-named workspace one.
To re-verify after a Linear schema change:
LINEAR_API_KEY=lin_api_... .venv/bin/python scripts/probe_schema.py <team-key> <issue-number> <issue-uuid>
It takes a team key, an existing issue number on that team, and that issue's UUID (and prompts once, interactively, for a team UUID printed by its first probe). The probe is read-only: the mutations are checked by introspecting their input types, never by writing to your tracker.
Notes
- Linear personal API keys are sent as
Authorization: <key>with noBearerprefix. - Linear reports most failures as HTTP 200 with a top-level
errorsarray, so the client checks the response body rather than the status code. - Team, state, label, and user metadata is cached for the lifetime of the server process. Restart the server after changing a team's workflow states or labels.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.