linear
linear.
A Linear issue — list/filter, full-text search, fetch one,
setup & usage
create a personal API key in Linear (Settings → Security & access → Personal API keys — see the developer docs), then paste it into oto.
linear manages the team's ticket/project tracking, in 8 tools:
linear_issue(op="list", team_id="...", state_id="...")linear_issue(op="search", query="billing")linear_issue(op="create", title="...", team_id="...", description="...")linear_issue(op="update", issue_id="...", assignee_id="...", state_id="...")linear_team(op="states", team_id="...") (do this before an update that changes the status — you need the state_id)linear_comment(op="create", issue_id="...", body="...")linear_project(op="list", team_id="...")linear_project(op="create", name="...", team_ids=["..."]) then op="update", status_id="..." (status_id — not a free-text status, read it from an existing project via op="get"|"list")linear_project(op="delete", project_id="...") / linear_label(op="delete", label_id="...")linear_cycle(op="list", team_id="...")linear_label(op="list", team_id="...")linear_user(op="viewer")linear_webhook(op="create", url="...", team_id="...", resource_types=["Issue"]) (resource_types is required by Linear, not just url)Built from the Linear developer documentation (GraphQL, no OpenAPI spec — Linear exposes a GraphQL schema, not a REST contract), then tested live on 2026-08-21 against a real workspace (GraphQL introspection + full create/get/update/delete/archive cycle on issues, comments, projects, labels, webhooks, all cleaned up afterwards). 6 real bugs found and fixed, none detectable through introspection alone:
Project has no state field for reading (it is status, an object) nor for writing (ProjectCreateInput/ProjectUpdateInput only have statusId) — hence status_id rather than a free-text status on linear_project.list_issues/list_projects/list_cycles/list_labels/search fail as soon as ONE filter among several was absent.Query.webhooks accepts no filter/teamId argument — filtering by team goes through team(id:){webhooks{...}}.issueSearch exists in the schema but is dead in practice ("This endpoint deprecated.") — linear_issue(op="search") now goes through issues(filter:{searchableContent:{contains:...}}).linear_project(op="list") needs the some: wrapper (accessibleTeams is a collection, not a simple filter) — confirmed against a real project."ENG-123") works, confirmed live — identical to the UUID.Unlike most key-based APIs of this connector (Fireflies, Grain, Granola…), Linear expects the raw key in the Authorization header, without a Bearer prefix — a specificity documented by Linear itself, not an empirical discovery.
this connector accepts multiple comptes: each stored credential becomes a named account (one name per compte), at your level, your team's or your org's.
_account="<name>" on the tool; list them: oto_identity(op='list', connector='linear') (scope='org' or scope='group' for the org's or team's)oto_identity(op='set', connector='linear', identity_id='<name>'); rename: op='rename' with new_name_account) and adding upoutils
utilisation
claude plugin marketplace add otomata-tech/oto-plugin — mcp + skill configurés.pipx install oto-cli puis oto linear …