{"openapi":"3.1.0","info":{"title":"LinearB (BYOK) API","version":"0.1.0","description":"LinearB (BYOK) lets an AI assistant read your own LinearB data through the LinearB API with a key you supply (LinearB API token). Read-only: 11 tools (check_health, list_teams, list_services, get_service, list_deployments, search_incidents, get_incident, list_pm_integrations, get_team_pm_scope, get_cycle_time_report, get_pull_request_report). The BYOK key travels with each request, is used for...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-linearb.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-linearb/docs"},"termsOfService":"https://connectorbay.com/byok-linearb/terms"},"servers":[{"url":"https://byok-linearb.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-linearb/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/check_health":{"post":{"operationId":"check_health","summary":"Check that the LinearB API answers and the token is accepted; returns the message OK. Use for \"Is the LinearB API reacha","description":"Check that the LinearB API answers and the token is accepted; returns the message OK. Use for \"Is the LinearB API reachable with my token\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"check_healthArguments","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 LinearB teams with id, name, parent team and contributors. Up to 50 per page; page with offset. Use for \"Which team","description":"List LinearB teams with id, name, parent team and contributors. Up to 50 per page; page with offset. Use for \"Which teams exist in LinearB\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"search_term":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only teams whose name contains this text (1 to 100 characters).","title":"Search Term"},"page_size":{"anyOf":[{"maximum":50,"minimum":1,"type":"integer"},{"type":"null"}],"default":50,"description":"Teams per page (1 to 50).","title":"Page Size"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of teams to skip.","title":"Offset"}},"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_services":{"post":{"operationId":"list_services","summary":"List the services configured in LinearB with the repository paths that belong to each, optionally filtered by repository","description":"List the services configured in LinearB with the repository paths that belong to each, optionally filtered by repository id. Use for \"Which services are configured in LinearB\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"repository_id":{"anyOf":[{"maximum":99999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only services that include this repository id.","title":"Repository Id"}},"title":"list_servicesArguments","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_service":{"post":{"operationId":"get_service","summary":"Get one LinearB service by id with its repository paths. Use for \"Show LinearB service 7\".","description":"Get one LinearB service by id with its repository paths. Use for \"Show LinearB service 7\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"service_id":{"description":"Numeric service id (from list_services).","title":"Service Id","type":"integer"}},"required":["service_id"],"title":"get_serviceArguments","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_deployments":{"post":{"operationId":"list_deployments","summary":"List deployments LinearB has recorded, newest first by default, filterable by repository, time window, stage or commit. ","description":"List deployments LinearB has recorded, newest first by default, filterable by repository, time window, stage or commit. Use for \"What deployments did LinearB record recently\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"repository_id":{"anyOf":[{"maximum":99999999999,"minimum":1,"type":"integer"},{"type":"null"}],"default":null,"description":"Only this git repository id.","title":"Repository Id"},"after":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only deployments after this ISO 8601 time.","title":"After"},"before":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only deployments before this ISO 8601 time.","title":"Before"},"stage":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only this custom pre-deployment stage key (lowercase).","title":"Stage"},"commit_sha":{"anyOf":[{"maxLength":200,"type":"string"},{"type":"null"}],"default":null,"description":"Only this commit SHA (short or long).","title":"Commit Sha"},"sort_dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":"desc","description":"Sort direction.","title":"Sort Dir"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":10,"description":"Maximum deployments (1 to 100).","title":"Limit"}},"title":"list_deploymentsArguments","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_incidents":{"post":{"operationId":"search_incidents","summary":"Search incidents LinearB tracks for DORA metrics: those opened within a date window, newest first. Use for \"Which incide","description":"Search incidents LinearB tracks for DORA metrics: those opened within a date window, newest first. Use for \"Which incidents were opened in LinearB since 1 January 2026\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"issued_after":{"description":"Only incidents opened after this date (YYYY-MM-DD).","maxLength":10,"title":"Issued After","type":"string"},"sort_dir":{"anyOf":[{"enum":["asc","desc"],"type":"string"},{"type":"null"}],"default":"desc","description":"Sort direction by opened time.","title":"Sort Dir"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":25,"description":"Maximum incidents (1 to 100).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"Number of incidents to skip.","title":"Offset"}},"required":["issued_after"],"title":"search_incidentsArguments","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_incident":{"post":{"operationId":"get_incident","summary":"Get one tracked incident by its provider id: title, status, times and related release. Use for \"Show LinearB incident IN","description":"Get one tracked incident by its provider id: title, status, times and related release. Use for \"Show LinearB incident INC-1\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"provider_id":{"description":"Incident id in your incident or PM tool (up to 255 characters).","maxLength":200,"title":"Provider Id","type":"string"}},"required":["provider_id"],"title":"get_incidentArguments","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_pm_integrations":{"post":{"operationId":"list_pm_integrations","summary":"List project-management and git integrations (Jira, Azure Boards and others) with their state. Use for \"Which integratio","description":"List project-management and git integrations (Jira, Azure Boards and others) with their state. Use for \"Which integrations does my LinearB organization have and are they healthy\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"type":{"anyOf":[{"enum":["pm","git"],"type":"string"},{"type":"null"}],"default":null,"description":"pm for project-management integrations only, git for git only (omit for both).","title":"Type"},"provider":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only these providers, comma-separated, for example 'jira,azure_boards'.","title":"Provider"}},"title":"list_pm_integrationsArguments","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_pm_scope":{"post":{"operationId":"get_team_pm_scope","summary":"Show which project-management boards, epics, labels and fields a team is scoped to, per integration. Use for \"What Jira ","description":"Show which project-management boards, epics, labels and fields a team is scoped to, per integration. Use for \"What Jira boards is LinearB team 4412 scoped to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"team_id":{"description":"Numeric LinearB team id (from list_teams).","title":"Team Id","type":"integer"}},"required":["team_id"],"title":"get_team_pm_scopeArguments","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_cycle_time_report":{"post":{"operationId":"get_cycle_time_report","summary":"Run a read-only report of cycle time (p50 and average, in minutes) and release count over a date window, grouped by orga","description":"Run a read-only report of cycle time (p50 and average, in minutes) and release count over a date window, grouped by organization, team or repository. Needs the Business or Enterprise plan. Use for \"What was our weekly cycle time in LinearB in January 2026\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"group_by":{"description":"How to group the figures: organization, team or repository.","enum":["organization","team","repository"],"title":"Group By","type":"string"},"roll_up":{"description":"Time interval buckets, for example 1d, 1w or 1mo (use 1w for weekly).","maxLength":10,"title":"Roll Up","type":"string"},"after":{"description":"Start date YYYY-MM-DD of the reporting window.","maxLength":10,"title":"After","type":"string"},"before":{"description":"End date YYYY-MM-DD of the window; must be later than 'after'.","maxLength":10,"title":"Before","type":"string"}},"required":["group_by","roll_up","after","before"],"title":"get_cycle_time_reportArguments","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_pull_request_report":{"post":{"operationId":"get_pull_request_report","summary":"Run a read-only report of merged and opened pull requests, reviews and commit counts over a date window, grouped by orga","description":"Run a read-only report of merged and opened pull requests, reviews and commit counts over a date window, grouped by organization, team or repository. Needs the Business or Enterprise plan. Use for \"How many pull requests did we merge each week in LinearB in January 2026\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"group_by":{"description":"How to group the figures: organization, team or repository.","enum":["organization","team","repository"],"title":"Group By","type":"string"},"roll_up":{"description":"Time interval buckets, for example 1d, 1w or 1mo (use 1w for weekly).","maxLength":10,"title":"Roll Up","type":"string"},"after":{"description":"Start date YYYY-MM-DD of the reporting window.","maxLength":10,"title":"After","type":"string"},"before":{"description":"End date YYYY-MM-DD of the window; must be later than 'after'.","maxLength":10,"title":"Before","type":"string"}},"required":["group_by","roll_up","after","before"],"title":"get_pull_request_reportArguments","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}}}}