{"openapi":"3.1.0","info":{"title":"Linear (BYOK) API","version":"0.1.0","description":"Linear (BYOK) lets an AI assistant read your own Linear data through the Linear API with a key you supply (personal API key). Read-only: 12 tools (get_viewer, list_teams, list_issues, list_my_issues, search_issues, get_issue, list_issue_comments, get_team_issues, list_projects, list_cycles, list_users, list_labels). The BYOK key travels with each request, is used for that one call only and is...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-linear.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-linear/docs"},"termsOfService":"https://connectorbay.com/byok-linear/terms"},"servers":[{"url":"https://byok-linear.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-linear/docs"},"security":[{"upstreamKey":[]}],"components":{"securitySchemes":{"bearer":{"type":"http","scheme":"bearer","description":"Optional. A Pro API key raises rate limits; no credentials are required."},"upstreamKey":{"type":"apiKey","in":"header","name":"X-Upstream-Key","description":"Your own key for the service this connector wraps (bring your own key). Used for that one call only; never stored, logged or cached."}},"schemas":{"Error":{"type":"object","properties":{"ok":{"const":false},"error":{"type":"object"}}}}},"paths":{"/v1/tools/get_viewer":{"post":{"operationId":"get_viewer","summary":"Show the Linear user the API key belongs to and their workspace: name, email, admin flag and workspace name. Use for \"Wh","description":"Show the Linear user the API key belongs to and their workspace: name, email, admin flag and workspace name. Use for \"Which Linear account and workspace is my API key connected to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_viewerArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_teams":{"post":{"operationId":"list_teams","summary":"List the teams in the Linear workspace with key, name, description, issue count and cycles setting. Team IDs are needed ","description":"List the teams in the Linear workspace with key, name, description, issue count and cycles setting. Team IDs are needed by get_team_issues. Use for \"What teams does my Linear workspace have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor copied from pageInfo.endCursor of the previous answer to get the next page; leave empty for the first page.","title":"After"},"order_by":{"anyOf":[{"enum":["updatedAt","createdAt"],"type":"string"},{"type":"null"}],"default":"updatedAt","description":"Order: updatedAt (most recently changed first) or createdAt (newest first).","title":"Order By"}},"title":"list_teamsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_issues":{"post":{"operationId":"list_issues","summary":"List issues across the Linear workspace with identifier, title, state, priority, assignee, team, project and labels. One","description":"List issues across the Linear workspace with identifier, title, state, priority, assignee, team, project and labels. One page per call; use after for more. Use for \"What are the most recently updated issues in Linear\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor copied from pageInfo.endCursor of the previous answer to get the next page; leave empty for the first page.","title":"After"},"order_by":{"anyOf":[{"enum":["updatedAt","createdAt"],"type":"string"},{"type":"null"}],"default":"updatedAt","description":"Order: updatedAt (most recently changed first) or createdAt (newest first).","title":"Order By"}},"title":"list_issuesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_my_issues":{"post":{"operationId":"list_my_issues","summary":"List the issues assigned to the person who owns the API key, with state, priority, team, project and labels. One page pe","description":"List the issues assigned to the person who owns the API key, with state, priority, team, project and labels. One page per call. Use for \"What Linear issues are assigned to me\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor copied from pageInfo.endCursor of the previous answer to get the next page; leave empty for the first page.","title":"After"},"order_by":{"anyOf":[{"enum":["updatedAt","createdAt"],"type":"string"},{"type":"null"}],"default":"updatedAt","description":"Order: updatedAt (most recently changed first) or createdAt (newest first).","title":"Order By"}},"title":"list_my_issuesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/search_issues":{"post":{"operationId":"search_issues","summary":"Search Linear issues by text with full-text search (titles and descriptions), best match first. Limited by Linear to 30 ","description":"Search Linear issues by text with full-text search (titles and descriptions), best match first. Limited by Linear to 30 searches per minute. Use for \"Find Linear issues about login timeouts\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"term":{"description":"Text to search for, for example 'login timeout'.","maxLength":200,"title":"Term","type":"string"},"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor copied from pageInfo.endCursor of the previous answer to get the next page; leave empty for the first page.","title":"After"}},"required":["term"],"title":"search_issuesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_issue":{"post":{"operationId":"get_issue","summary":"Get one Linear issue in full: description, state, priority, estimate, assignee, creator, team, project, cycle, parent an","description":"Get one Linear issue in full: description, state, priority, estimate, assignee, creator, team, project, cycle, parent and labels. Use for \"Show Linear issue with ID 8e3a7d5c-0000-4000-8000-000000000001\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"ID of the issue (a UUID, as returned by the list and search tools).","maxLength":100,"title":"Id","type":"string"}},"required":["id"],"title":"get_issueArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_issue_comments":{"post":{"operationId":"list_issue_comments","summary":"List the comments on one Linear issue with author, text and times, oldest first by default. One page per call. Use for \"","description":"List the comments on one Linear issue with author, text and times, oldest first by default. One page per call. Use for \"What comments are on Linear issue 8e3a7d5c-0000-4000-8000-000000000001\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"id":{"description":"ID of the issue (a UUID, as returned by the list and search tools).","maxLength":100,"title":"Id","type":"string"},"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor copied from pageInfo.endCursor of the previous answer to get the next page; leave empty for the first page.","title":"After"}},"required":["id"],"title":"list_issue_commentsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/get_team_issues":{"post":{"operationId":"get_team_issues","summary":"List the issues of one Linear team, newest change first by default, with state, priority, assignee, project and labels. ","description":"List the issues of one Linear team, newest change first by default, with state, priority, assignee, project and labels. One page per call. Use for \"What issues does my Linear engineering team have\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"team_id":{"description":"ID of the team (a UUID, from list_teams).","maxLength":100,"title":"Team Id","type":"string"},"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor copied from pageInfo.endCursor of the previous answer to get the next page; leave empty for the first page.","title":"After"},"order_by":{"anyOf":[{"enum":["updatedAt","createdAt"],"type":"string"},{"type":"null"}],"default":"updatedAt","description":"Order: updatedAt (most recently changed first) or createdAt (newest first).","title":"Order By"}},"required":["team_id"],"title":"get_team_issuesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_projects":{"post":{"operationId":"list_projects","summary":"List Linear projects with status, progress, priority, lead, start and target dates. One page per call. Use for \"What pro","description":"List Linear projects with status, progress, priority, lead, start and target dates. One page per call. Use for \"What projects are active in Linear and how far along are they\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor copied from pageInfo.endCursor of the previous answer to get the next page; leave empty for the first page.","title":"After"},"order_by":{"anyOf":[{"enum":["updatedAt","createdAt"],"type":"string"},{"type":"null"}],"default":"updatedAt","description":"Order: updatedAt (most recently changed first) or createdAt (newest first).","title":"Order By"}},"title":"list_projectsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_cycles":{"post":{"operationId":"list_cycles","summary":"List Linear cycles (sprints) with number, dates, progress, active flag and team. One page per call. Use for \"Which Linea","description":"List Linear cycles (sprints) with number, dates, progress, active flag and team. One page per call. Use for \"Which Linear cycles are running and how far along are they\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor copied from pageInfo.endCursor of the previous answer to get the next page; leave empty for the first page.","title":"After"},"order_by":{"anyOf":[{"enum":["updatedAt","createdAt"],"type":"string"},{"type":"null"}],"default":"updatedAt","description":"Order: updatedAt (most recently changed first) or createdAt (newest first).","title":"Order By"}},"title":"list_cyclesArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_users":{"post":{"operationId":"list_users","summary":"List the people in the Linear workspace with name, email, active, admin and guest flags. One page per call. Use for \"Who","description":"List the people in the Linear workspace with name, email, active, admin and guest flags. One page per call. Use for \"Who is in my Linear workspace\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor copied from pageInfo.endCursor of the previous answer to get the next page; leave empty for the first page.","title":"After"},"order_by":{"anyOf":[{"enum":["updatedAt","createdAt"],"type":"string"},{"type":"null"}],"default":"updatedAt","description":"Order: updatedAt (most recently changed first) or createdAt (newest first).","title":"Order By"}},"title":"list_usersArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}},"/v1/tools/list_labels":{"post":{"operationId":"list_labels","summary":"List Linear issue labels with color, description and team (empty team means workspace-wide). One page per call. Use for ","description":"List Linear issue labels with color, description and team (empty team means workspace-wide). One page per call. Use for \"What issue labels exist in Linear\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"first":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"How many results to return (1 to 100).","title":"First"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Cursor copied from pageInfo.endCursor of the previous answer to get the next page; leave empty for the first page.","title":"After"},"order_by":{"anyOf":[{"enum":["updatedAt","createdAt"],"type":"string"},{"type":"null"}],"default":"updatedAt","description":"Order: updatedAt (most recently changed first) or createdAt (newest first).","title":"Order By"}},"title":"list_labelsArguments","type":"object"}}}},"responses":{"200":{"description":"Tool result. `ok: true` on success; `ok: false` with a structured `error` (provider_unavailable, upstream_error, bad_input) when the tool could not answer.","content":{"application/json":{"schema":{"type":"object","additionalProperties":true}}}},"422":{"description":"Arguments failed validation","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}},"429":{"description":"Rate limit exceeded (see Retry-After)","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Error"}}}}},"x-read-only":true}}}}