Skip to main content
Glama
README.md
# linear-mcp

A small, read-only [Model Context Protocol](https://modelcontextprotocol.io/)
server for [Linear](https://linear.app/). Bring your own Linear API key.

Written because none of the existing community Linear MCP servers were
maintainers I wanted to trust with a personal API key, and because the surface
I actually needed (list issues in a cycle, get an issue, search) is small
enough to own outright.

## What it exposes

Five read-only tools:

| Tool | Purpose |
|---|---|
| `list_teams` | Enumerate teams in the workspace (key, name, UUID). |
| `list_cycles` | List cycles for a team, filterable by past / current / future. |
| `list_issues_in_cycle` | Issues in a specific cycle. Accepts `cycle_id` or `(team, cycle_number)`. |
| `get_issue` | Full details for one issue, including description, labels, and recent comments. |
| `search_issues` | Text search across the workspace's issues, optionally scoped to a team. |

No mutation tools — this server can't create, edit, or delete anything in
Linear. That's a deliberate choice; adding write tools is a separate PR.

## Install

Requires **Node 20 or later**.

```sh
git clone https://github.com/puneetsharma2791/linear-mcp.git
cd linear-mcp
npm install
npm run build
```

That produces `dist/index.js`, which is the executable the MCP host will run.

## Get a Linear API key

1. Open <https://linear.app/settings/api>.
2. Click **Create key**, name it something like "MCP - laptop".
3. Copy the key — it starts with `lin_api_`. You won't see it again.

The key inherits your Linear permissions, so this server will see whatever
you can see in the Linear app.

## Wire into Claude Code

Edit your MCP client config (for Claude Code, typically
`~/.config/claude/claude_desktop_config.json` or the equivalent per OS; for
Claude Code CLI check `claude --help`):

```json
{
  "mcpServers": {
    "linear": {
      "command": "node",
      "args": ["/absolute/path/to/linear-mcp/dist/index.js"],
      "env": {
        "LINEAR_API_KEY": "lin_api_..."
      }
    }
  }
}
```

Restart the client. Tools will appear as `linear__list_teams`,
`linear__get_issue`, etc.

### Other MCP clients

Any MCP client that speaks stdio works. Point its "server command" at
`node /absolute/path/to/linear-mcp/dist/index.js` and pass `LINEAR_API_KEY`
in the environment.

## Development

```sh
cp .env.example .env      # then paste your API key
npm install
npm run dev               # tsc --watch — rebuilds on edit
```

Smoke-test the built server by piping an MCP handshake in on stdin:

```sh
LINEAR_API_KEY=lin_api_... node dist/index.js < /dev/null &
# The server will exit cleanly on stdin close. To exercise a tool call,
# see the MCP inspector: https://github.com/modelcontextprotocol/inspector
```

## Adding a new tool

Each tool is one file under `src/tools/` with three exports:

- a **schema** (`{name, description, inputSchema}`) — declared to the MCP client
- a **zod parser** — validates arguments at call time
- an **async handler** — runs the query and returns a plain object

Then add one entry each to `ListToolsRequestSchema` and the `dispatch`
switch in `src/index.ts`. That's the whole flow.

## License

MIT. See [LICENSE](./LICENSE).

TDQS

A4.4/5.0

Scored across 5 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: fetching a single issue, listing cycles, listing issues in a cycle, listing teams, and searching issues. No overlap in functionality.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern (get_issue, list_cycles, list_issues_in_cycle, list_teams, search_issues), making it predictable.

Tool Count5/5

5 tools is well-scoped for a Linear workspace, covering the core entities (teams, cycles, issues) without unnecessary tools.

Completeness3/5

The set covers read operations comprehensively but lacks any create/update/delete tools for issues or other entities, which is a notable gap for a project management server.

Maintenance

ActivityInactive
ResponsivenessNo issues