io.b3os/linear 1.0.0 · issue-tracking, project-management · MIT

Track work in Linear with your own API key: search and list issues, read an issue with its comments, create issues, move them between workflow states, assign them, comment, and list teams, workflow states and projects. Uses Linear's GraphQL API. A personal API key (Settings, Security & access) or an OAuth access token for your own Linear app works.

Every call's result carries upstream_status and timing: validate_ms, inject_ms, render_ms, upstream_ms, map_ms and total_ms. upstream is the service's time; the others are B3OS's own (call actions). The snippets below show no timing values, because a fixture records none.

Connection

api_key, type api_key: Linear API key.

A personal API key, sent as the Authorization header as is. An OAuth access token from your own Linear app works too when you store it with the Bearer prefix.

How to get one: linear.app.

The credential is sent only to api.linear.app.

Store the credential once as a vault connection for this pack and key, then name its id in a call's connections. Leave the key out and B3OS uses the project's newest connection for the pack and key without a subject (connections).

Hosts it reaches: api.linear.app.

Actions

ActionEffectMCP toolTitle
get-viewerreadlinear__get-viewerGet current user
list-teamsreadlinear__list-teamsList teams
list-workflow-statesreadlinear__list-workflow-statesList workflow states
search-issuesreadlinear__search-issuesSearch issues
list-issuesreadlinear__list-issuesList team issues
get-issuereadlinear__get-issueGet issue
create-issuewritelinear__create-issueCreate issue
move-issuewritelinear__move-issueMove issue to a state
assign-issuewritelinear__assign-issueAssign issue
add-commentwritelinear__add-commentComment on issue
list-projectsreadlinear__list-projectsList projects

get-viewer

Get current user. Who the API key belongs to: user id, name, email and organization (name and URL key). A cheap way to check a connection.

Ref io.b3os/linear/get-viewer@1.0.0 · effect read · connection api_key · MCP tool linear__get-viewer

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/get-viewer@1", "input": {}, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: Get current user (documented response shape, example values). From the bundle's fixtures/get-viewer.json, not a live call.

json
{ "id": "8f3a9b2e-1c4d-4e5f-9a6b-7c8d9e0f1a2b", "name": "Mona Example", "email": "mona@acme.example", "organization": "Acme", "organization_url_key": "acme"}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response

list-teams

List teams. Teams in the workspace with id, key (the issue prefix) and name. create-issue needs a team id.

Ref io.b3os/linear/list-teams@1.0.0 · effect read · connection api_key · MCP tool linear__list-teams

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/list-teams@1", "input": {}, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: List teams (documented response shape, example values). From the bundle's fixtures/list-teams.json, not a live call.

json
{ "teams": [ { "id": "4e1d2c3b-5a6f-4b7c-8d9e-0f1a2b3c4d5e", "key": "ENG", "name": "Engineering" }, { "id": "9a8b7c6d-5e4f-4a3b-2c1d-0e9f8a7b6c5d", "key": "DES", "name": "Design" } ]}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response

list-workflow-states

List workflow states. A team's workflow states (Todo, In Progress, Done, ...) with id, name and type. move-issue needs a state id.

Ref io.b3os/linear/list-workflow-states@1.0.0 · effect read · connection api_key · MCP tool linear__list-workflow-states

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/list-workflow-states@1", "input": {"team": "ENG"}, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: List workflow states (documented response shape, example values). From the bundle's fixtures/list-workflow-states.json, not a live call.

json
{ "states": [ { "id": "a1b2c3d4-e5f6-4a7b-8c9d-0e1f2a3b4c5d", "name": "Todo", "type": "unstarted", "position": 0 }, { "id": "b2c3d4e5-f6a7-4b8c-9d0e-1f2a3b4c5d6e", "name": "In Progress", "type": "started", "position": 1 }, { "id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f", "name": "Done", "type": "completed", "position": 2 } ]}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response

search-issues

Search issues. Full-text search over issue titles, descriptions and identifiers in the workspace, best match first: identifier, title, state, priority, assignee, team, labels and URL. Use list-issues to filter one team by state instead.

Ref io.b3os/linear/search-issues@1.0.0 · effect read · connection api_key · MCP tool linear__search-issues

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/search-issues@1", "input": {"query": "checkout overflow", "first": 1}, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: Search issues (documented response shape, example values). From the bundle's fixtures/search-issues.json, not a live call.

json
{ "issues": [ { "id": "5f6e7d8c-9b0a-4c1d-8e2f-3a4b5c6d7e8f", "identifier": "ENG-123", "title": "Cart overflows on narrow screens", "url": "https://linear.app/acme/issue/eng-123", "priority": 2, "priority_label": "High", "estimate": 3, "due_date": null, "state": "In Progress", "state_type": "started", "assignee": "Mona Example", "assignee_email": "mona@acme.example", "team": "ENG", "labels": ["Bug"], "created_at": "2026-10-24T17:11:20.000Z", "updated_at": "2026-10-25T09:02:41.000Z", "completed_at": null } ]}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response

list-issues

List team issues. A team's issues, most recently updated first, limited to workflow state types you choose (default: everything not completed or canceled). Page with after = the previous end_cursor while has_next_page is true.

Ref io.b3os/linear/list-issues@1.0.0 · effect read · connection api_key · MCP tool linear__list-issues

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/list-issues@1", "input": {"team": "ENG", "first": 1}, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: List team issues (documented response shape, example values). From the bundle's fixtures/list-issues.json, not a live call.

json
{ "issues": [ { "id": "5f6e7d8c-9b0a-4c1d-8e2f-3a4b5c6d7e8f", "identifier": "ENG-123", "title": "Cart overflows on narrow screens", "url": "https://linear.app/acme/issue/eng-123", "priority": 2, "priority_label": "High", "estimate": 3, "due_date": null, "state": "In Progress", "state_type": "started", "assignee": "Mona Example", "assignee_email": "mona@acme.example", "team": "ENG", "labels": ["Bug"], "created_at": "2026-10-24T17:11:20.000Z", "updated_at": "2026-10-25T09:02:41.000Z", "completed_at": null } ], "has_next_page": true, "end_cursor": "5f6e7d8c-9b0a-4c1d-8e2f-3a4b5c6d7e8f"}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response

get-issue

Get issue. One issue by identifier (ENG-123) or id, with its Markdown description, state, assignee, labels, project, parent and the latest 20 comments.

Ref io.b3os/linear/get-issue@1.0.0 · effect read · connection api_key · MCP tool linear__get-issue

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/get-issue@1", "input": {"id": "ENG-123"}, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: Get issue (documented response shape, example values). From the bundle's fixtures/get-issue.json, not a live call.

json
{ "id": "5f6e7d8c-9b0a-4c1d-8e2f-3a4b5c6d7e8f", "identifier": "ENG-123", "title": "Cart overflows on narrow screens", "url": "https://linear.app/acme/issue/eng-123", "priority": 2, "priority_label": "High", "estimate": 3, "due_date": null, "state": "In Progress", "state_type": "started", "assignee": "Mona Example", "assignee_email": "mona@acme.example", "team": "ENG", "labels": ["Bug"], "created_at": "2026-10-24T17:11:20.000Z", "updated_at": "2026-10-25T09:02:41.000Z", "completed_at": null, "description": "Steps:\n\n1. Open the cart\n2. Resize to 375px", "project": "Checkout v2", "parent": null, "comments": [ { "author": "Hubot Example", "body": "Reproduced on Safari 18.", "created_at": "2026-10-25T10:00:00.000Z" } ]}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response

create-issue

Create issue. Create an issue in a team (team_id from list-teams) with a title and optional Markdown description, priority (0 none to 4 low), assignee, labels and initial state. Returns its identifier and URL. Not idempotent.

Ref io.b3os/linear/create-issue@1.0.0 · effect write · connection api_key · MCP tool linear__create-issue

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Idempotency-Key: 7c1e2f6a-1d43-4a8e-b2a5-3f0c9d5e8b11" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/create-issue@1", "input": { "team_id": "4e1d2c3b-5a6f-4b7c-8d9e-0f1a2b3c4d5e", "title": "Flaky checkout test", "description": "Seen three times this week.", "priority": 2 }, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: Create issue (documented response shape, example values). From the bundle's fixtures/create-issue.json, not a live call.

json
{ "id": "7a6b5c4d-3e2f-4a1b-9c8d-7e6f5a4b3c2d", "identifier": "ENG-124", "title": "Flaky checkout test", "url": "https://linear.app/acme/issue/eng-124"}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response

move-issue

Move issue to a state. Change an issue's workflow state, for example to In Progress or Done (state ids from list-workflow-states). Returns the issue's new state.

Ref io.b3os/linear/move-issue@1.0.0 · effect write · connection api_key · MCP tool linear__move-issue

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Idempotency-Key: 7c1e2f6a-1d43-4a8e-b2a5-3f0c9d5e8b11" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/move-issue@1", "input": { "id": "ENG-123", "state_id": "c3d4e5f6-a7b8-4c9d-0e1f-2a3b4c5d6e7f" }, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: Move issue to a state (documented response shape, example values). From the bundle's fixtures/move-issue.json, not a live call.

json
{"identifier": "ENG-123", "state": "Done", "state_type": "completed"}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response

assign-issue

Assign issue. Assign an issue to a user (user id, from get-issue or the Linear app), or unassign it when assignee_id is omitted.

Ref io.b3os/linear/assign-issue@1.0.0 · effect write · connection api_key · MCP tool linear__assign-issue

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Idempotency-Key: 7c1e2f6a-1d43-4a8e-b2a5-3f0c9d5e8b11" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/assign-issue@1", "input": { "id": "ENG-123", "assignee_id": "8f3a9b2e-1c4d-4e5f-9a6b-7c8d9e0f1a2b" }, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: Assign issue (documented response shape, example values). From the bundle's fixtures/assign-issue.json, not a live call.

json
{"identifier": "ENG-123", "assignee": "Mona Example"}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response

add-comment

Comment on issue. Add a Markdown comment to an issue. Returns the comment id and URL. Not idempotent.

Ref io.b3os/linear/add-comment@1.0.0 · effect write · connection api_key · MCP tool linear__add-comment

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Idempotency-Key: 7c1e2f6a-1d43-4a8e-b2a5-3f0c9d5e8b11" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/add-comment@1", "input": {"id": "ENG-123", "body": "Fixed in #43."}, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: Comment on issue (documented response shape, example values). From the bundle's fixtures/add-comment.json, not a live call.

json
{ "id": "1b2c3d4e-5f6a-4b7c-8d9e-0f1a2b3c4d5e", "url": "https://linear.app/acme/issue/eng-123#comment-1b2c3d4e", "created_at": "2026-10-26T08:00:00.000Z"}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response

list-projects

List projects. Projects in the workspace, most recently updated first: name, state (planned, started, completed, ...), progress from 0 to 1, lead, start and target dates, and URL.

Ref io.b3os/linear/list-projects@1.0.0 · effect read · connection api_key · MCP tool linear__list-projects

bash
curl -s https://beta-api.b3os.org/v1/actions/call \ -H "Authorization: Bearer $B3OS_API_KEY" \ -H "Content-Type: application/json" \ -d '{ "ref": "io.b3os/linear/list-projects@1", "input": {"first": 1}, "connections": {"api_key": "conn_01m5t6cbgdjs1ketgcqwa2sne8"} }'

Output, labeled fixture: List projects (documented response shape, example values). From the bundle's fixtures/list-projects.json, not a live call.

json
{ "projects": [ { "id": "2c3d4e5f-6a7b-4c8d-9e0f-1a2b3c4d5e6f", "name": "Checkout v2", "state": "started", "progress": 0.42, "lead": "Mona Example", "start_date": "2026-09-01", "target_date": "2026-11-15", "url": "https://linear.app/acme/project/checkout-v2-2c3d4e5f" } ]}

When the service answers with an error, the call fails with upstream_error and pack_error.code is one of:

pack_error.codeService statusRetryableMessage
connection_unauthorized401noLinear rejected the API key or token.
forbiddenmatched on the response bodynobuilt from the service's response
rate_limited429yesLinear rate limit reached; retry shortly.
not_foundmatched on the response bodynobuilt from the service's response
invalid_requestmatched on the response bodynobuilt from the service's response
Ask a question... ⌘I