← All integrations

Linear

Let an agent keep the issue tracker moving without a key in its prompt. It searches and reads issues, creates and updates them, assigns, moves, labels and comments through named operations, and archiving an issue can wait for a person.

Linearsecret · LINEAR
host
api.linear.app
connect
Sign in, per user
  • Create issue

    linear-create-issue

  • Update issue

    linear-update-issue

  • Assign issue

    linear-assign-issue

  • Move issue

    linear-move-issue

writes are off until switched on

Reads and writes in Linear. Writes are off until you switch them on.

Each one is a named operation from the pack. Reads change nothing.

Writes

  • Create issue

    read back

    linear-create-issue

    Create one issue in a team, with a title and optionally a markdown description, priority, assignee, state, labels and due date. Returns its id, identifier and url.

  • Update issue

    read back

    linear-update-issue

    Update one issue's title, description, priority or due date. Give at least one; the fields you leave out do not change.

  • Assign issue

    read back

    linear-assign-issue

    Assign one issue to a user.

  • Move issue

    read back

    linear-move-issue

    Move one issue to another workflow state of its team, such as In Progress or Done.

  • Add issue label

    read back

    linear-add-issue-label

    Add one label to an issue, keeping its other labels.

  • Remove issue label

    read back

    linear-remove-issue-label

    Remove one label from an issue, keeping its other labels.

  • Add comment

    read back

    linear-add-comment

    Add one comment, in markdown, to an issue. Linear notifies the issue's subscribers and anyone mentioned. Returns the comment's id and url.

  • Archive issue

    read back

    linear-archive-issue

    Archive one issue. It leaves the team's views and lists, and can be restored in Linear.

Reads

  • List teams

    linear-list-teams

    List the teams whose issues the connected user can see. Returns 50 a page, each with id, key (the prefix of issue identifiers, such as ENG) and name. When pageInfo.hasNextPage is true, pass pageInfo.endCursor as after. A GraphQL query that changes nothing.

  • List workflow states

    linear-list-workflow-states

    List one team's workflow states (its issue statuses), 50 a page. Each has id, name, type (triage, backlog, unstarted, started, completed, canceled or duplicate) and position. Use a state's id with move-issue or in a list-issues filter. A GraphQL query that changes nothing.

  • List labels

    linear-list-labels

    List the issue labels the connected user can see, of the workspace and of every team, 50 a page. Each has id, name, whether it is a group, and its team (null for a workspace label). A team label can be added to issues of that team. A GraphQL query that changes nothing.

  • List issues

    linear-list-issues

    List issues, 25 a page, ordered by creation time, or by last update when order_by is updatedAt. Filter by team, state (by id or type), assignee (by id, the connected user, or unassigned), label, priority, title text and last update. Each issue has id, identifier, title, priority, url, due date, state, team, assignee and up to 10 labels; descriptions are left out, use get-issue. Archived issues are left out. When pageInfo.hasNextPage is true, pass pageInfo.endCursor as after. A GraphQL query that changes nothing.

  • Search issues

    linear-search-issues

    Search issues by text in their title and description, and in their comments when include_comments is true. Returns 25 a page, ranked by relevance, with the same fields as list-issues and the same filter. team_id ranks one team's issues higher; it does not filter (use filter.team for that). Linear rate-limits this search more tightly than other queries (30 a minute by its schema). When pageInfo.hasNextPage is true, pass pageInfo.endCursor as after. A GraphQL query that changes nothing.

  • Get issue

    linear-get-issue

    Get one issue by id or identifier (ENG-123): title, description (markdown), priority, url, due date, estimate, state, team, assignee, creator, project, parent, labels (up to 50) and when it was created, updated, completed or archived. A GraphQL query that changes nothing.

  • List issue comments

    linear-list-issue-comments

    List the comments on one issue, 20 a page, in the order they were made. Each has id, body (markdown), author, when it was created and edited, and the comment it replies to. When pageInfo.hasNextPage is true, pass pageInfo.endCursor as after. A GraphQL query that changes nothing.

How do users connect? Each one brings their own Linear.

  1. 1.Call for the userYour server invokes the action for the signed-in user. Without a Linear connection, the SDK throws EndUserNotConnectedError with a connect link.
  2. 2.The user pastes a keyThe link opens a form that shows where in Linear's settings to create the key. The link lasts 10 minutes and works once.
  3. 3.Anlyon checks itThe key is checked with Linear before it is kept, and bound to api.linear.app. It is never shown back.
  4. 4.Your server confirmsYour server confirms the connection for the user who is signed in, and the call goes through.

Guardrails. Suggested limits and approvals, for you to review.

Suggested limits

  • 50 issues created a day
  • 200 issues updated a day
  • 100 issues assigned a day
  • 200 issues moved a day
  • 200 labels added a day
  • 100 labels removed a day
  • 200 comments a day
  • 20 issues archived a day

Suggested approvals

  • A person approves archiving an issue

What the key must allow

  • Read your Linear workspace
  • Create and change issues and comments

Good to know

  • Linear answers most errors with a success status, so the read-back is what tells a change from a refusal.
  • Linear accepts two issues with the same title. Anlyon sends a create once and never repeats it.

For your own account

  1. 1.Open Actions, then Integrations, and choose Linear.
  2. 2.Press Connect. Linear's consent page opens and shows what Anlyon asks for.
  3. 3.Pick the Linear workspace and approve. The window closes on its own.
  4. 4.The workspace is now a secret named LINEAR, bound to api.linear.app.

Linear in your code. For one of your users, or for your own account.

Act for one of your users from your server, or connect your company's own Linear with the CLI.

linear.ts
import { Client, EndUserNotConnectedError } from "@anlyonhq/sdk";const anlyon = new Client({ apiKey: process.env.ANLYON_API_KEY! });try {  const { data } = await anlyon    .forUser(session.userId)    .actions.invoke("linear-create-issue", {      team_id: "9cfb482a-81e3-4154-b5b9-2c805e70a02d",      title: "Checkout fails for saved cards"    });  return { status: "done", grade: data.grade };} catch (error) {  if (error instanceof EndUserNotConnectedError) {    // The user connects their own Linear, then you call again.    return { status: "connect_required", url: error.connectUrl };  }  throw error;}

Let your agent act for your users, safely.

A few lines of server code, then send a user a connect link. Nothing to host.

$ claude mcp add --transport http anlyon https://api.anlyon.com/mcp