linear · git:20260728.e04a3ae · 2026-07-28 · sha256 a4510c2fea06b385

linear git:20260728.e04a3aeA

Immutable. This exact content is served forever at /api/v1/blob/a4510c2fea06b385.

---
name: linear
description: Use when the user wants to connect to Linear, search or read Linear issues / projects / cycles, create or update issues, or set up Linear auth. The connector — not the triage workflow.
---

# Linear

Connector for Linear via its official remote MCP server. The agent sees the tool
surface once it loads — this skill covers auth, scope, the filter model, and the
idioms. Security triage methodology — dedup, severity, SLA, owner inference — is
deliberately out of scope; pair this with whichever triage capability your
workflow uses.

## Auth

Native HTTP MCP with spec-compliant OAuth (RFC 8414 + 9728 + DCR + PKCE S256); the
runtime drives the flow — no `mcp-remote` bridge.

### A. Interactive OAuth (default; individual users)

On first connect, `linear` shows in the Services screen as `needs authentication`.
Click **Authenticate** → browser → approve; tokens persist to
`~/.dreadnode/mcp-auth.json` (mode 0600, keyed by server URL) and refresh silently.
To switch workspaces or after revoking access, Services → `linear` →
**Re-authenticate** (clears just this server's tokens). For SSH/headless, set
`DREADNODE_HEADLESS=1`; the auth URL is logged — complete it on a machine with a
browser and forward the callback port it prints (`ssh -R <port>:localhost:<port>`).

### B. API key (service / agent accounts)

For unattended use, **just set one secret** — no manifest edit. The server entry
carries an optional `Authorization` header bound to `LINEAR_API_KEY`: set it and the
static token wins, leave it unset and OAuth (A) stays default.

1. Linear → **Settings → Account → Security & Access** → generate a key. Per-key
   permissions (Read / Write / Admin) and team scoping are supported — pick **Read**
   + one team for enforced, least-privilege read-only.
2. Add `LINEAR_API_KEY` in the **secrets screen** (`/secrets` or `F7`) or web app,
   reload, confirm with `dn secret list`. Don't paste keys into chat.

> **Agent identity.** When the consumer is an agent / service, prefer an OAuth app
> install with `actor=app` over a personal key — actions attribute to the app, not
> the installing user, and it doesn't burn a billable seat.
> <https://linear.app/developers/oauth-actor-authorization>.

Scope is enforced by the **key or OAuth grant** — the tool surface is identical
either way, so a write-scoped key can mutate. Want read-only? Issue a read-only key.

## Filters & idioms

No JQL-style string — structured search with `team`, `state`, `assignee`, `project`,
`priority`, `labels`, plus a free-text `query`. Compose by argument, not a query
string. Reference: <https://linear.app/developers/graphql#filtering>.

- `ABC-123` (team prefix + number) is the canonical identifier — prefer it over
  free-text when the user has it. Internal numeric IDs are a different thing and
  rarely what the user means.
- `query` is broad — narrow with `team` / `state` / `project` rather than stuffing
  keywords in.
- Use the team's **actual** workflow state names (list them with the team-info tool);
  don't guess. Same for labels / projects before creating.
- Cycles are time-boxed — "the current cycle" shifts between calls.