{"openapi":"3.1.0","info":{"title":"Qlty (BYOK) API","version":"0.1.0","description":"Qlty (BYOK) lets an AI assistant read your own Qlty data through the Qlty API with a key you supply (Qlty API token). Read-only: 12 tools (get_current_user, list_workspaces, get_workspace, list_projects, get_project, list_issues, list_builds, get_build, get_project_metrics, get_project_metric_series, list_components, get_rate_limit). The BYOK key travels with each request, is used for that one...\n\nEvery operation is read-only or compute-only. The same tools are available over MCP (streamable HTTP) at https://byok-qlty.connectorbay.com/mcp.","contact":{"name":"Unify Dynamics LLC","email":"agent@connectorbay.com","url":"https://connectorbay.com/byok-qlty/docs"},"termsOfService":"https://connectorbay.com/byok-qlty/terms"},"servers":[{"url":"https://byok-qlty.connectorbay.com"}],"externalDocs":{"url":"https://connectorbay.com/byok-qlty/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_current_user":{"post":{"operationId":"get_current_user","summary":"Show the Qlty user the token belongs to: login, name, email, profile link and creation date. Use for \"Which Qlty account","description":"Show the Qlty user the token belongs to: login, name, email, profile link and creation date. Use for \"Which Qlty account is my token connected to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_current_userArguments","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_workspaces":{"post":{"operationId":"list_workspaces","summary":"List the Qlty workspaces the token can access, with their key and provider link. Use for \"Which Qlty workspaces do I hav","description":"List the Qlty workspaces the token can access, with their key and provider link. Use for \"Which Qlty workspaces do I have access to\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 100; the default is 20).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many items to skip before the first returned one (default 0).","title":"Offset"}},"title":"list_workspacesArguments","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_workspace":{"post":{"operationId":"get_workspace","summary":"Get one Qlty workspace by key or ID. Use for \"When was the acme Qlty workspace created\".","description":"Get one Qlty workspace by key or ID. Use for \"When was the acme Qlty workspace created\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"key_or_id":{"description":"Workspace key or ID, for example 'acme'.","maxLength":100,"title":"Key Or Id","type":"string"}},"required":["key_or_id"],"title":"get_workspaceArguments","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 the Qlty projects (analyzed repositories) of a GitHub owner or workspace, optionally only those assigned to one app","description":"List the Qlty projects (analyzed repositories) of a GitHub owner or workspace, optionally only those assigned to one application. Use for \"Which repositories does acme-corp analyze with Qlty\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"owner":{"description":"Repository owner login (user or organization) of the GitHub repository, or the Qlty workspace ID, for example 'acme-corp'.","maxLength":100,"title":"Owner","type":"string"},"application_id":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only projects assigned to this application ID.","title":"Application Id"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 100; the default is 20).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many items to skip before the first returned one (default 0).","title":"Offset"}},"required":["owner"],"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/get_project":{"post":{"operationId":"get_project","summary":"Get one Qlty project by repository name or project ID: workspace, provider link and the application it belongs to. Use f","description":"Get one Qlty project by repository name or project ID: workspace, provider link and the application it belongs to. Use for \"What is the Qlty project ID of the my-repo repository\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"owner":{"description":"Repository owner login (user or organization) of the GitHub repository, or the Qlty workspace ID, for example 'acme-corp'.","maxLength":100,"title":"Owner","type":"string"},"project":{"description":"Repository name or Qlty project ID, for example 'my-repo'.","maxLength":100,"title":"Project","type":"string"}},"required":["owner","project"],"title":"get_projectArguments","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 code quality issues Qlty found in a project, filtered by category, level, status or tool, with rule, message, file ","description":"List code quality issues Qlty found in a project, filtered by category, level, status or tool, with rule, message, file location and documentation link. Use for \"What open high-level security issues does my-repo have in Qlty\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"owner":{"description":"Repository owner login (user or organization) of the GitHub repository, or the Qlty workspace ID, for example 'acme-corp'.","maxLength":100,"title":"Owner","type":"string"},"project":{"description":"Repository name or Qlty project ID, for example 'my-repo'.","maxLength":100,"title":"Project","type":"string"},"category":{"anyOf":[{"enum":["bug","vulnerability","structure","duplication","security_hotspot","performance","documentation","type_check","style","anti_pattern","accessibility","dead_code","lint","secret","dependency_alert"],"type":"string"},{"type":"null"}],"default":null,"description":"Issue category.","title":"Category"},"level":{"anyOf":[{"enum":["high","medium","low","note","fmt"],"type":"string"},{"type":"null"}],"default":null,"description":"Issue level.","title":"Level"},"status":{"anyOf":[{"enum":["open","ignored"],"type":"string"},{"type":"null"}],"default":null,"description":"Issue status; open when omitted.","title":"Status"},"tool":{"anyOf":[{"maxLength":100,"type":"string"},{"type":"null"}],"default":null,"description":"Only issues reported by this tool, for example 'eslint'.","title":"Tool"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 100; the default is 20).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many items to skip before the first returned one (default 0).","title":"Offset"}},"required":["owner","project"],"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_builds":{"post":{"operationId":"list_builds","summary":"List a project's Qlty builds, newest first, with type, status, branch, commit and queue time. Use for \"Did the latest Ql","description":"List a project's Qlty builds, newest first, with type, status, branch, commit and queue time. Use for \"Did the latest Qlty analysis of my-repo succeed\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"owner":{"description":"Repository owner login (user or organization) of the GitHub repository, or the Qlty workspace ID, for example 'acme-corp'.","maxLength":100,"title":"Owner","type":"string"},"project":{"description":"Repository name or Qlty project ID, for example 'my-repo'.","maxLength":100,"title":"Project","type":"string"},"status":{"anyOf":[{"enum":["submitted","starting","running","succeeded","failed","skipped","rejected"],"type":"string"},{"type":"null"}],"default":null,"description":"Only builds with this status.","title":"Status"},"limit":{"anyOf":[{"maximum":100,"minimum":1,"type":"integer"},{"type":"null"}],"default":20,"description":"How many items to return (1 to 100; the default is 20).","title":"Limit"},"offset":{"anyOf":[{"maximum":100000,"minimum":0,"type":"integer"},{"type":"null"}],"default":0,"description":"How many items to skip before the first returned one (default 0).","title":"Offset"}},"required":["owner","project"],"title":"list_buildsArguments","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_build":{"post":{"operationId":"get_build","summary":"Get one Qlty build by ID with status, conclusion, branch, commit, pull request number, queue and execution seconds. Use ","description":"Get one Qlty build by ID with status, conclusion, branch, commit, pull request number, queue and execution seconds. Use for \"Why did Qlty build 550e8400-e29b-41d4-a716-446655440000 fail\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"owner":{"description":"Repository owner login (user or organization) of the GitHub repository, or the Qlty workspace ID, for example 'acme-corp'.","maxLength":100,"title":"Owner","type":"string"},"project":{"description":"Repository name or Qlty project ID, for example 'my-repo'.","maxLength":100,"title":"Project","type":"string"},"build_id":{"description":"Build ID (UUID).","maxLength":64,"title":"Build Id","type":"string"}},"required":["owner","project","build_id"],"title":"get_buildArguments","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_project_metrics":{"post":{"operationId":"get_project_metrics","summary":"Get the latest value of every Qlty metric of a project on its default branch: maintainability, reliability, security, si","description":"Get the latest value of every Qlty metric of a project on its default branch: maintainability, reliability, security, size and coverage. Use for \"What are the current maintainability and coverage metrics for my-repo\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"owner":{"description":"Repository owner login (user or organization) of the GitHub repository, or the Qlty workspace ID, for example 'acme-corp'.","maxLength":100,"title":"Owner","type":"string"},"project":{"description":"Repository name or Qlty project ID, for example 'my-repo'.","maxLength":100,"title":"Project","type":"string"}},"required":["owner","project"],"title":"get_project_metricsArguments","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_project_metric_series":{"post":{"operationId":"get_project_metric_series","summary":"Get the history of Qlty metrics for a project as a time series bucketed by day, week or month (default window: six month","description":"Get the history of Qlty metrics for a project as a time series bucketed by day, week or month (default window: six months). Use for \"How has the test coverage of my-repo changed over the last three months\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"owner":{"description":"Repository owner login (user or organization) of the GitHub repository, or the Qlty workspace ID, for example 'acme-corp'.","maxLength":100,"title":"Owner","type":"string"},"project":{"description":"Repository name or Qlty project ID, for example 'my-repo'.","maxLength":100,"title":"Project","type":"string"},"window_from":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Window start as an RFC 3339 date or date-time, for example 2026-01-01; defaults to six months before the end.","title":"Window From"},"window_to":{"anyOf":[{"maxLength":40,"type":"string"},{"type":"null"}],"default":null,"description":"Window end as an RFC 3339 date or date-time; defaults to now.","title":"Window To"},"interval":{"anyOf":[{"enum":["day","week","month"],"type":"string"},{"type":"null"}],"default":"week","description":"Bucket size.","title":"Interval"},"metric":{"anyOf":[{"enum":["CMPLX","DUP","MNT","SEC","SIZE","ISS","SECI","TDR","FILES","LOC","COV","LCOV"],"type":"string"},{"type":"null"}],"default":null,"description":"Only this metric key.","title":"Metric"},"category":{"anyOf":[{"enum":["maintainability","reliability","security","size","coverage","quality"],"type":"string"},{"type":"null"}],"default":null,"description":"Only metrics of this category.","title":"Category"}},"required":["owner","project"],"title":"get_project_metric_seriesArguments","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_components":{"post":{"operationId":"list_components","summary":"List the components (named groups of files) defined in a project, with path globs and file counts. Use for \"Which compon","description":"List the components (named groups of files) defined in a project, with path globs and file counts. Use for \"Which components does my-repo define in Qlty\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{"owner":{"description":"Repository owner login (user or organization) of the GitHub repository, or the Qlty workspace ID, for example 'acme-corp'.","maxLength":100,"title":"Owner","type":"string"},"project":{"description":"Repository name or Qlty project ID, for example 'my-repo'.","maxLength":100,"title":"Project","type":"string"}},"required":["owner","project"],"title":"list_componentsArguments","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_rate_limit":{"post":{"operationId":"get_rate_limit","summary":"Show the token's current Qlty API rate limit: limit, used, remaining and reset time. Does not use up any of the limit. U","description":"Show the token's current Qlty API rate limit: limit, used, remaining and reset time. Does not use up any of the limit. Use for \"How much of my Qlty API rate limit is left\".","tags":["tools"],"requestBody":{"required":true,"content":{"application/json":{"schema":{"properties":{},"title":"get_rate_limitArguments","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}}}}