@typeship-ax/mcp 0.21.0 → 0.22.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (129) hide show
  1. package/AGENTS.md +15 -11
  2. package/README.md +22 -53
  3. package/api.json +9998 -10118
  4. package/api.md +8983 -9120
  5. package/dist/arguments.d.ts +47 -0
  6. package/dist/arguments.d.ts.map +1 -0
  7. package/dist/arguments.js +254 -0
  8. package/dist/core/http.d.ts +162 -19
  9. package/dist/core/http.d.ts.map +1 -1
  10. package/dist/core/http.js +381 -48
  11. package/dist/core/pagination.d.ts +42 -6
  12. package/dist/core/pagination.d.ts.map +1 -1
  13. package/dist/core/pagination.js +111 -17
  14. package/dist/credential-storage.d.ts +10 -3
  15. package/dist/credential-storage.d.ts.map +1 -1
  16. package/dist/credential-storage.js +15 -6
  17. package/dist/dates.d.ts +1 -1
  18. package/dist/dates.js +1 -1
  19. package/dist/errors.d.ts +20 -84
  20. package/dist/errors.d.ts.map +1 -1
  21. package/dist/errors.js +20 -108
  22. package/dist/fields.d.ts +29 -0
  23. package/dist/fields.d.ts.map +1 -0
  24. package/dist/fields.js +101 -0
  25. package/dist/index.d.ts +28 -18
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +35 -25
  28. package/dist/mcp-authorization.d.ts.map +1 -1
  29. package/dist/mcp-authorization.js +34 -10
  30. package/dist/mcp-protocol.d.ts +87 -44
  31. package/dist/mcp-protocol.d.ts.map +1 -1
  32. package/dist/mcp-protocol.js +552 -478
  33. package/dist/mcp.d.ts.map +1 -1
  34. package/dist/mcp.js +127 -28
  35. package/dist/named-credentials.d.ts +19 -0
  36. package/dist/named-credentials.d.ts.map +1 -1
  37. package/dist/named-credentials.js +81 -1
  38. package/dist/oauth-request.d.ts +7 -1
  39. package/dist/oauth-request.d.ts.map +1 -1
  40. package/dist/oauth-request.js +26 -4
  41. package/dist/oauth-session.d.ts +13 -1
  42. package/dist/oauth-session.d.ts.map +1 -1
  43. package/dist/oauth-session.js +34 -18
  44. package/dist/ops.d.ts +53 -5
  45. package/dist/ops.d.ts.map +1 -1
  46. package/dist/ops.js +49 -40
  47. package/dist/resources/api-keys.d.ts +10 -7
  48. package/dist/resources/api-keys.d.ts.map +1 -1
  49. package/dist/resources/api-keys.js +10 -31
  50. package/dist/resources/deliveries.d.ts +88 -4
  51. package/dist/resources/deliveries.d.ts.map +1 -1
  52. package/dist/resources/deliveries.js +95 -18
  53. package/dist/resources/drafts.d.ts +15 -15
  54. package/dist/resources/drafts.d.ts.map +1 -1
  55. package/dist/resources/drafts.js +11 -64
  56. package/dist/resources/files.d.ts +4 -4
  57. package/dist/resources/files.d.ts.map +1 -1
  58. package/dist/resources/files.js +3 -12
  59. package/dist/resources/generations.d.ts +14 -14
  60. package/dist/resources/generations.d.ts.map +1 -1
  61. package/dist/resources/generations.js +21 -45
  62. package/dist/resources/organization.d.ts +4 -4
  63. package/dist/resources/organization.d.ts.map +1 -1
  64. package/dist/resources/organization.js +3 -10
  65. package/dist/resources/{generate.d.ts → packages.d.ts} +16 -16
  66. package/dist/resources/packages.d.ts.map +1 -0
  67. package/dist/resources/{generate.js → packages.js} +13 -29
  68. package/dist/resources/projects.d.ts +50 -50
  69. package/dist/resources/projects.d.ts.map +1 -1
  70. package/dist/resources/projects.js +60 -116
  71. package/dist/resources/releases.d.ts +21 -16
  72. package/dist/resources/releases.d.ts.map +1 -1
  73. package/dist/resources/releases.js +18 -39
  74. package/dist/resources/spec-revisions.d.ts +15 -6
  75. package/dist/resources/spec-revisions.d.ts.map +1 -1
  76. package/dist/resources/spec-revisions.js +6 -28
  77. package/dist/resources/specs.d.ts +7 -7
  78. package/dist/resources/specs.d.ts.map +1 -1
  79. package/dist/resources/specs.js +6 -34
  80. package/dist/resources/targets.d.ts +48 -48
  81. package/dist/resources/targets.d.ts.map +1 -1
  82. package/dist/resources/targets.js +58 -114
  83. package/dist/schemas.d.ts.map +1 -1
  84. package/dist/schemas.js +78 -76
  85. package/dist/search.d.ts +54 -0
  86. package/dist/search.d.ts.map +1 -0
  87. package/dist/search.js +421 -0
  88. package/dist/types.d.ts +499 -339
  89. package/dist/types.d.ts.map +1 -1
  90. package/dist/types.js +18 -18
  91. package/dist/worker.js +2 -2
  92. package/package.json +5 -2
  93. package/server.json +5 -5
  94. package/src/arguments.ts +242 -0
  95. package/src/core/http.ts +457 -58
  96. package/src/core/pagination.ts +129 -18
  97. package/src/credential-storage.ts +16 -6
  98. package/src/dates.ts +1 -1
  99. package/src/errors.ts +46 -115
  100. package/src/fields.ts +91 -0
  101. package/src/index.ts +45 -28
  102. package/src/mcp-authorization.ts +29 -9
  103. package/src/mcp-protocol.ts +580 -428
  104. package/src/mcp.ts +113 -26
  105. package/src/named-credentials.ts +66 -1
  106. package/src/oauth-request.ts +32 -6
  107. package/src/oauth-session.ts +37 -19
  108. package/src/ops.ts +82 -44
  109. package/src/resources/api-keys.ts +34 -48
  110. package/src/resources/deliveries.ts +211 -30
  111. package/src/resources/drafts.ts +60 -107
  112. package/src/resources/files.ts +19 -20
  113. package/src/resources/generations.ts +57 -75
  114. package/src/resources/organization.ts +11 -16
  115. package/src/resources/{generate.ts → packages.ts} +43 -51
  116. package/src/resources/projects.ts +145 -200
  117. package/src/resources/releases.ts +48 -65
  118. package/src/resources/spec-revisions.ts +38 -47
  119. package/src/resources/specs.ts +39 -59
  120. package/src/resources/targets.ts +143 -193
  121. package/src/schemas.ts +78 -76
  122. package/src/search.ts +434 -0
  123. package/src/types.ts +538 -357
  124. package/src/worker.ts +2 -2
  125. package/dist/resources/generate.d.ts.map +0 -1
  126. package/dist/resources/publications.d.ts +0 -47
  127. package/dist/resources/publications.d.ts.map +0 -1
  128. package/dist/resources/publications.js +0 -70
  129. package/src/resources/publications.ts +0 -140
package/dist/ops.js CHANGED
@@ -1,47 +1,48 @@
1
- // typeship — operation manifest for the CLI and MCP server.
2
- // Generated by typeship — https://typeship.dev
1
+ // Typeship — operation manifest for the CLI and MCP server.
2
+ // Generated by Typeship — https://typeship.dev
3
3
  export const OPS = [
4
- { "resource": "generate", "method": "run", "command": ["generate", "run"], "tool": "generate_run", "httpMethod": "POST", "path": "/generate", "summary": "Generate one package from a Spec", "description": "Returns one generated package without creating a Project.\n\nSupports [idempotent retries](https://typeship.dev/docs/typeship-api/idempotency); keyed responses include generated files in the replay cache.\n\nUse `download.url` to save the complete ZIP, verify `download.sha256`, and extract it into an empty directory. The link expires at `download.expires_at` and grants access to anyone who has it. CLI, MCP, and SDK calls supply an idempotency key automatically. Agents should request `fields=[\"download\",\"coverage\",\"warnings\",\"claim\"]` to keep the MCP result compact; files can exceed the response limit. Download the ZIP instead of repeating generation to retrieve omitted files.\n\nAnonymous and Free requests include the first 25 operations. Paid plans include all operations. Anonymous requests are rate limited by IP address. Check `coverage` for omitted operations; an invalid API key returns `401`.\n\nAn anonymous URL request without source headers may return `claim.url`. Sign in through that link within seven days to save the recipe as a Project.", "toolDescription": "Generate one package from a Spec. Returns one generated package without creating a Project. POST /generate Credential optional.", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "optional", "security": [{}, { "apiKey": [] }], "safety": "write", "params": [{ "name": "spec", "ts": "spec", "kind": "body", "type": "json", "required": true, "description": "A Spec for one-shot generation, provided as exactly one URL or inline entrypoint.", "flag": "spec" }, { "name": "target", "ts": "target", "kind": "body", "type": "object", "required": true, "description": "One-shot generator descriptor; no persisted Target is created.", "flag": "target" }, { "name": "package_name", "ts": "package_name", "kind": "body", "type": "string", "required": false, "description": "npm package or Python distribution override. Valid only for the TypeScript and Python SDK targets.", "flag": "package-name" }, { "name": "module_path", "ts": "module_path", "kind": "body", "type": "string", "required": false, "description": "Go module path override for the generated artifact's own module. Valid only for the Go SDK and Go CLI Targets. Projects derive this from the Go destination repository by default.", "flag": "module-path" }, { "name": "go_sdk", "ts": "go_sdk", "kind": "body", "type": "object", "required": false, "description": "The exact paired Go SDK a go_cli generation is built on. Required when target.type is go_cli and rejected otherwise. The descriptor is closed and immutable, because a CLI that pins a range or a branch pins nothing.", "flag": "go-sdk" }, { "name": "config", "ts": "config", "kind": "body", "type": "object", "required": false, "description": "Everything Typeship needs beyond the Spec, in one object: generation customization (globals, retries, pagination, readme) and how the generated tooling behaves (cli, mcp, package, docs_url). Plain configuration. Typeship never requires vendor extensions inside the Spec itself. One-shot generation also accepts GraphQL settings here; stored projects keep those settings on their Spec.", "flag": "config" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "spec": { "description": "A Spec for one-shot generation, provided as exactly one URL or inline entrypoint.", "anyOf": [{ "properties": { "url": { "format": "uri", "description": "URL of an OpenAPI document, a GraphQL SDL file, or a GraphQL\nendpoint (introspected automatically). Fetched server-side.", "pattern": "^https?://", "type": "string" }, "headers": { "description": "Request headers for a protected URL. Sent on the document GET and GraphQL introspection POST, never returned or retained by one-shot generation.", "additionalProperties": { "maxLength": 4096, "type": "string" }, "type": "object" } }, "required": ["url"], "additionalProperties": false, "type": "object" }, { "properties": { "inline": { "description": "Raw Spec text (OpenAPI JSON/YAML or GraphQL SDL). Up to 10MB.", "type": "string" } }, "required": ["inline"], "additionalProperties": false, "type": "object" }], "example": { "url": "https://typeship.dev/examples/petstore/openapi.yaml" } }, "target": { "description": "One-shot generator descriptor; no persisted Target is created.", "properties": { "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target. This is configuration, not identity; several Targets may use the same generator. cli is the TypeScript CLI; go_cli is the native Go CLI, a distinct product that imports one exact paired Go SDK module rather than a client of its own.", "type": "string" } }, "required": ["type"], "additionalProperties": false, "type": "object", "example": { "type": "cli" } }, "package_name": { "description": "npm package or Python distribution override. Valid only for the TypeScript and Python SDK targets.", "type": "string" }, "module_path": { "description": "Go module path override for the generated artifact's own module. Valid only for the Go SDK and Go CLI Targets. Projects derive this from the Go destination repository by default.", "type": "string" }, "go_sdk": { "description": "The exact paired Go SDK a go_cli generation is built on. Required when target.type is go_cli and rejected otherwise. The descriptor is closed and immutable, because a CLI that pins a range or a branch pins nothing.", "properties": { "module_path": { "description": "Go module path of the SDK the CLI imports, for example github.com/acme/payments-go. Must be a valid Go module path.", "type": "string" }, "version": { "description": "Exact SDK module version the CLI requires: v-prefixed SemVer such as v1.2.3, or an immutable Go pseudo-version naming a commit such as v0.0.0-20240824120000-abcdef123456. Ranges, branches, and \"latest\" are rejected.", "type": "string" }, "spec_digest": { "description": "SHA-256 hex digest of the Spec the SDK was generated from. Must match the resolved Spec, or the request fails with spec_invalid.", "pattern": "^[a-f0-9]{64}$", "type": "string" }, "package_name": { "description": "Go package identifier of the SDK, when the module path's last element does not imply it. Optional.", "type": "string" } }, "required": ["module_path", "version", "spec_digest"], "additionalProperties": false, "type": "object" }, "config": { "description": "Everything Typeship needs beyond the Spec, in one object: generation customization (globals, retries, pagination, readme) and how the generated tooling behaves (cli, mcp, package, docs_url). Plain configuration. Typeship never requires vendor extensions inside the Spec itself. One-shot generation also accepts GraphQL settings here; stored projects keep those settings on their Spec.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "items": { "type": "string" }, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "properties": { "max_retries": { "minimum": 0, "maximum": 10, "type": "integer" }, "statuses": { "description": "Replaces the default retryable set (408, 429, 500, 502, 503, 504).", "maxItems": 20, "items": { "type": "integer" }, "type": "array" }, "initial_delay_ms": { "minimum": 1, "type": "integer" }, "max_delay_ms": { "minimum": 1, "type": "integer" }, "retry_non_idempotent": { "description": "Also retry non-idempotent methods (POST/PATCH).", "type": "boolean" }, "disabled": { "description": "Shorthand for max_retries 0.", "type": "boolean" }, "operations": { "additionalProperties": { "description": "RetryTuning (recursive)" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "additionalProperties": { "anyOf": [{ "properties": { "style": { "enum": ["cursor", "cursor_from_last_id", "page", "offset"], "default": "cursor", "type": "string" }, "items_field": { "description": "Response field holding the item array.", "type": "string" }, "cursor_param": { "type": "string" }, "next_cursor_field": { "type": "string" }, "has_more_field": { "type": "string" }, "id_field": { "type": "string" }, "page_param": { "type": "string" }, "offset_param": { "type": "string" }, "limit_param": { "type": "string" } }, "required": ["items_field"], "additionalProperties": false, "type": "object" }, { "description": "false disables pagination detection for the operation.", "type": "boolean" }] }, "type": "object" }, "graphql": { "description": "What a GraphQL schema cannot say about itself. Ignored for OpenAPI specs.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl. Defaults to the URL the schema was fetched from. Without either, baseUrl is a required client option.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production). Each becomes a client environment; the first is the default unless endpoint is set.", "maxItems": 10, "items": { "properties": { "name": { "type": "string" }, "url": { "format": "uri", "type": "string" } }, "required": ["name", "url"], "additionalProperties": false, "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "api_key", "none"], "description": "How requests authenticate. bearer sends Authorization: Bearer; basic is for key-pair APIs (public key as username, private key as password); api_key sends a header named by api_key_header; none generates no auth option.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key. Required for that mode; Typeship does not invent a vendor-specific header name.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient). Defaults to a name derived from the endpoint's host.", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name. Unmapped scalars generate as the language's untyped JSON value and produce a warning. Unmatched keys warn.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools. Stored Projects own the OAuth server, application catalog, and identity policy; one-shot generation accepts the same shape for one run. Runtime credentials and client secrets are never accepted.", "properties": { "oauth_server": { "anyOf": [{ "description": "Authorization-server metadata used by generated OAuth flows. Secrets and runtime credentials are never accepted here.", "properties": { "issuer": { "format": "uri", "description": "Exact authorization-server issuer, including any tenant path.", "type": ["string", "null"] }, "discovery_url": { "format": "uri", "description": "Exact metadata URL when it cannot be derived from the issuer.", "type": ["string", "null"] }, "authorization_url": { "format": "uri", "description": "Authorization endpoint override.", "type": ["string", "null"] }, "token_url": { "format": "uri", "description": "Token endpoint override.", "type": ["string", "null"] }, "device_authorization_url": { "format": "uri", "description": "Device-authorization endpoint override.", "type": ["string", "null"] }, "scopes": { "description": "Default scopes requested during login.", "maxItems": 20, "type": ["array", "null"] }, "audience": { "description": "Default audience included in authorization and token requests.", "type": ["string", "null"] }, "resource": { "format": "uri", "description": "Protected API resource included in authorization and token requests.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "oauth_applications": { "description": "OAuth applications keyed by a stable name.", "additionalProperties": { "description": "OAuth application available to generated products. Public clients support interactive login; confidential clients support runtime-supplied machine credentials. Client secrets are never stored.", "properties": { "client_id": { "description": "OAuth client identifier.", "minLength": 1, "maxLength": 200, "type": "string" }, "login_method": { "enum": ["browser", "device", null], "description": "Interactive login method. Browser login uses Authorization Code with PKCE.", "type": ["string", "null"] }, "client_auth_method": { "enum": ["post", "basic", null], "description": "How a runtime-supplied client secret is sent for machine grants.", "type": ["string", "null"] }, "redirect_uri": { "format": "uri", "description": "Loopback callback URL for browser login.", "type": ["string", "null"] }, "organization_parameter": { "enum": ["organization", "organization_id", null], "description": "Provider parameter used to request an organization during browser login.", "type": ["string", "null"] } }, "required": ["client_id"], "additionalProperties": false, "type": "object" }, "type": ["object", "null"] }, "oauth_application": { "description": "Default OAuth application used by generated products.", "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "identity_verification": { "anyOf": [{ "description": "Authenticated identity read used to verify a login before it is saved. Operation is auto-detected when omitted or null. At least one of subject_field, account_field, or organization_field must be a non-null JSON Pointer. Null clears an individual mapping while another remains. Set identity_verification itself to null to remove the whole policy.", "example": { "subject_field": "/id", "account_field": "/account_id", "organization_field": "/organization_id" }, "properties": { "operation": { "description": "resource.method of a safe identity read with no required arguments.", "maxLength": 2000, "pattern": "^[\\w$]+\\.[\\w$]+$", "type": ["string", "null"] }, "subject_field": { "description": "JSON Pointer to the stable caller ID in the identity response.", "example": "/id", "maxLength": 512, "pattern": "^/(?:[^~\\x00-\\x1f\\x7f]|~[01])*$", "type": ["string", "null"] }, "account_field": { "description": "JSON Pointer to the customer account ID.", "example": "/account_id", "maxLength": 512, "pattern": "^/(?:[^~\\x00-\\x1f\\x7f]|~[01])*$", "type": ["string", "null"] }, "organization_field": { "description": "JSON Pointer to the customer organization ID.", "example": "/organization_id", "maxLength": 512, "pattern": "^/(?:[^~\\x00-\\x1f\\x7f]|~[01])*$", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "approval_url": { "format": "uri", "description": "Base URL of a custom browser-approval backend implementing the start, status, and revoke contract. Used only when OAuth is not configured.", "type": ["string", "null"] }, "environments": { "description": "Authentication selections keyed by generated API environment name.", "additionalProperties": { "description": "OAuth application and request-value overrides for one named API environment.", "properties": { "oauth_application": { "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "scopes": { "maxItems": 20, "type": ["array", "null"] }, "audience": { "type": ["string", "null"] }, "resource": { "format": "uri", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "type": ["object", "null"] } }, "additionalProperties": false, "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "properties": { "command_name": { "description": "Command users run, independent of how the CLI is distributed.", "type": ["string", "null"] }, "update_notice": { "description": "Opt in to a once-a-day registry check that prints an upgrade hint. Off by default; generated code phones nobody unless this is enabled.", "type": "boolean" }, "changelog_url": { "description": "Public HTTP(S) URL read by the optional changelog command in generated CLIs. Supports UTF-8 Markdown, plain text, and static HTML; embedded credentials are not allowed. Omit or clear to disable, then regenerate.", "type": ["string", "null"] }, "support_url": { "description": "Where the generated CLI's feedback command sends users. GitHub issues/new URLs get a prefilled title and environment details.", "type": ["string", "null"] }, "mcp_url": { "description": "Hosted MCP endpoint installed by the generated CLI instead of launching the package's local stdio server.", "type": ["string", "null"] }, "skills_repo": { "description": "GitHub owner/name of the skills package the generated CLI offers to install during init.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "properties": { "registry_name": { "description": "Stable official MCP registry name, independent of the server runtime.", "type": ["string", "null"] }, "access": { "description": "Authorization for callers connecting to a generated MCP server deployed over HTTP. The hosting application resolves upstream API credentials separately at runtime. This setting does not apply to the Typeship-hosted endpoint.", "properties": { "issuer": { "format": "uri", "description": "Exact issuer allowed to sign MCP connection tokens.", "type": "string" }, "resource": { "format": "uri", "description": "Canonical public URL of the self-hosted MCP endpoint that connection tokens must target.", "type": "string" }, "jwks_url": { "format": "uri", "description": "Public signing-key endpoint. Omit to discover it from the issuer.", "type": "string" }, "scopes": { "description": "Minimum scopes required to connect to the self-hosted MCP server.", "maxItems": 20, "items": { "type": "string" }, "type": "array" } }, "required": ["issuer", "resource"], "additionalProperties": false, "type": "object" }, "tool_mode": { "enum": ["auto", "operations", "meta"], "description": "MCP tool shape. meta collapses per-operation tools into search_docs, read_docs, and execute so large APIs don't flood an agent's context window. Auto considers the serialized tool schemas, switching near 10k tokens or above 100 operations.", "type": "string" }, "instructions": { "description": "Guidance appended to the MCP server's instructions, which agents read once when they connect (server/discover): what to call first, conventions the spec does not state, what not to do. Carried by the package's server and the hosted endpoint alike.", "maxLength": 2000, "type": ["string", "null"] }, "tool_descriptions": { "description": "Hand-written MCP tool descriptions keyed by operationId or \"METHOD /path\". Each replaces the text typeship derives for that operation (summary, first sentence, method and path, deprecation and auth notes). For flows the spec cannot describe, such as a multi-step upload. Keys that match no operation are reported as generation warnings.", "additionalProperties": { "maxLength": 600, "type": "string" }, "type": "object" }, "reference_resolvers": { "description": "Exact name-or-ID resolver overrides keyed first by the target operationId or \"METHOD /path\", then by its wire argument name. A resolver names one read collection operation plus 1-4 item fields to match case-insensitively; false opts that argument out of strict inference.", "additionalProperties": { "additionalProperties": { "anyOf": [{ "enum": [false], "type": "boolean" }, { "type": "object" }] }, "type": "object" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "properties": { "quickstart_operation": { "description": "operationId or \"METHOD /path\" to feature as the README's first API call. It must be present in the generated package and callable with no required input beyond path placeholders. Missing or unsuitable choices produce a warning and use the automatic example.", "maxLength": 500, "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "properties": { "homepage": { "description": "Homepage written into registry metadata.", "type": ["string", "null"] }, "license": { "description": "SPDX identifier written into registry metadata. Defaults to info.license.", "maxLength": 200, "type": ["string", "null"] }, "license_text": { "description": "Exact LICENSE file contents. Supply this for licences the engine does not build in; MIT is built in when copyright is also set.", "maxLength": 100000, "type": ["string", "null"] }, "copyright": { "description": "Copyright line used in generated license files.", "maxLength": 200, "type": ["string", "null"] }, "go_package_name": { "description": "Go identifier when the destination repository name is unsuitable.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" } }, "required": ["spec", "target"] }, "exampleArguments": { "spec": { "url": "https://typeship.dev/examples/petstore/openapi.yaml" }, "target": { "type": "cli" } }, "fileBundleProperty": "files", "outputSchema": { "properties": { "files": { "items": { "properties": { "path": { "description": "Repo-relative path inside the generated package.", "type": "string" }, "content": { "type": "string" }, "mode": { "enum": ["100644", "100755"], "description": "Exact Git file mode. Omitted one-shot outputs are regular files.", "default": "100644", "type": "string" } }, "type": "object" }, "type": "array" }, "download": { "description": "Complete package ZIP from this exact result. Present on requests with Idempotency-Key, including automatic CLI, MCP, and SDK keys. Download before expires_at, verify sha256, and extract into an empty directory. Anyone with this URL can download the package; keep it private. Reading does not generate again or extend the 24-hour replay window.", "properties": { "url": { "format": "uri", "type": "string" }, "expires_at": { "format": "date-time", "type": "string" }, "sha256": { "description": "SHA-256 of the downloaded ZIP bytes.", "pattern": "^[a-f0-9]{64}$", "type": "string" }, "size_bytes": { "minimum": 0, "type": "integer" }, "file_count": { "minimum": 0, "type": "integer" } }, "type": "object" }, "warnings": { "items": { "properties": { "code": { "description": "Stable machine-readable warning code.", "type": "string" }, "message": { "description": "Human-readable explanation.", "type": "string" }, "operation": { "description": "METHOD/path of the affected operation, when applicable.", "type": "string" } }, "type": "object" }, "type": "array" }, "coverage": { "properties": { "generated": { "minimum": 0, "type": "integer" }, "omitted": { "minimum": 0, "type": "integer" }, "total": { "minimum": 0, "type": "integer" }, "omitted_operations": { "description": "METHOD/path identities of operations omitted from the package.", "items": { "type": "string" }, "type": "array" }, "reason": { "enum": ["anonymous", "free_plan"], "description": "Present when a plan or anonymous limit omitted operations.", "type": "string" }, "signup_url": { "format": "uri", "description": "Sign-up link for anonymous capped runs.", "type": "string" }, "upgrade_url": { "format": "uri", "description": "Upgrade link for capped signed-in runs.", "type": "string" } }, "type": "object" }, "claim": { "description": "Anonymous, URL-sourced generations only. A link a signed-in person can open to turn this run into a project in their organization (same Spec, Target, and config). Lasts seven days. Null for inline Specs; absent on keyed calls.", "anyOf": [{ "type": "null" }, { "properties": { "url": { "type": "string" }, "expires_at": { "format": "date-time", "type": "string" } }, "type": "object" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
5
- { "resource": "generate", "method": "downloadPackage", "command": ["generate", "download-package"], "tool": "generate_download_package", "httpMethod": "GET", "path": "/generate/download", "summary": "Download a generated package", "description": "Download the complete ZIP referenced by `generate_run`'s `download.url`. Pass the token from that URL. No API key is needed; the token grants access only to that exact package until its replay window expires. Keep the token private.\n\nThe local MCP server saves this binary response to disk. On a hosted MCP connection, download the original URL directly to your workspace. Verify the ZIP against `download.sha256` before extracting it into an empty directory. Expired or invalid tokens return `404`; a new generation creates a new download.", "toolDescription": "Download a generated package. Download the complete ZIP referenced by `generate_run`'s `download.url`. GET /generate/download No credential needed.", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "none", "security": [{}], "safety": "read", "params": [{ "name": "token", "ts": "token", "kind": "query", "type": "string", "required": true, "description": "Private download token from download.url in the generation result.", "flag": "query-token" }], "inputSchema": { "type": "object", "properties": { "token": { "minLength": 43, "maxLength": 43, "pattern": "^[A-Za-z0-9_-]{43}$", "type": "string", "example": "parcel_download_example_token_1234567890123", "description": "Private download token from download.url in the generation result." } }, "required": ["token"] }, "exampleArguments": { "token": "parcel_download_example_token_1234567890123" }, "credentialOptions": [] },
6
- { "resource": "projects", "method": "list", "command": ["projects", "list"], "tool": "projects_list", "httpMethod": "GET", "path": "/projects", "summary": "List projects", "toolDescription": "List projects. GET /projects (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "description": "Lean Project identity returned by collection endpoints. Retrieve the Project for shared configuration and list its Targets for the complete canonical child collection.", "properties": { "id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "project", "type": "string" }, "name": { "maxLength": 80, "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "auto_generate": { "type": "boolean" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
7
- { "resource": "projects", "method": "create", "command": ["projects", "create"], "tool": "projects_create", "httpMethod": "POST", "path": "/projects", "summary": "Create a project", "description": "Creates a Project from a URL or GitHub Spec.\nAutomatic generation is enabled by default for a saved Project.\n\nFree includes one saved Project, all selected Targets, and the first 25 operations per Target, with regeneration, history, delivery pull requests, and previews. Pro supports additional Projects and all operations. One-shot generation does not use a Project slot.", "toolDescription": "Create a project. Creates a Project from a URL or GitHub Spec. POST /projects", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "name", "ts": "name", "kind": "body", "type": "string", "required": true, "flag": "name" }, { "name": "spec", "ts": "spec", "kind": "body", "type": "object", "required": true, "flag": "spec" }, { "name": "targets", "ts": "targets", "kind": "body", "type": "array", "required": true, "items": { "type": "object" }, "description": "Initial first-class Targets. More than one may use the same generator with different identities or Deliveries.", "flag": "targets" }, { "name": "auto_generate", "ts": "auto_generate", "kind": "body", "type": "boolean", "required": false, "description": "Whether Typeship should regenerate automatically when the source or saved configuration changes. Default: true.", "flag": "auto-generate" }, { "name": "config", "ts": "config", "kind": "body", "type": "json", "required": false, "nullable": true, "description": "Shared defaults inherited by every Target. GraphQL settings belong in spec.graphql.", "flag": "config" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "name": { "minLength": 1, "maxLength": 80, "type": "string", "example": "Parcel API" }, "spec": { "properties": { "source": { "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "properties": { "url": { "format": "uri", "description": "URL of an OpenAPI document, GraphQL SDL file, or GraphQL endpoint.", "maxLength": 2048, "pattern": "^https?://", "type": "string" }, "headers": { "description": "Request headers for a protected URL. Values are never returned or recorded in revision history. When updating the same URL, omit headers to preserve the stored values or pass null to remove them. Changing the URL without headers clears the old values so a credential is never forwarded to a different source.", "anyOf": [{ "type": "object" }, { "type": "null" }] } }, "required": ["url"], "additionalProperties": false, "type": "object" } }, "required": ["type", "url"], "additionalProperties": false, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "path": { "description": "Repository-relative Spec entrypoint.", "minLength": 1, "maxLength": 4096, "pattern": "^(?!/)(?!.*\\.\\.).+$", "type": "string" } }, "required": ["provider", "identifier", "path"], "additionalProperties": false, "type": "object" } }, "required": ["type", "repository"], "additionalProperties": false, "type": "object" }] }, "patches": { "default": [], "maxItems": 50, "items": { "description": "A fix applied to the resolved Spec before generation. Paths are JSON\nPointers into the document. A patch whose target no longer exists is\nskipped and reported as a warning on the generation, never silently.", "examples": [{ "op": "remove", "path": "/components/schemas/Legacy" }], "properties": { "op": { "enum": ["set", "append", "remove", "rename"], "type": "string" }, "path": { "description": "JSON-Pointer-style path. Pattern segments enable bulk fixes:\n* (any child), ** (any depth), [key=value] (filter), e.g.\n/paths/**/parameters/[name=account_id]/schema/type. Renaming a\nschema under /components/schemas also rewrites its $refs.", "type": "string" }, "value": { "description": "set only; the replacement value." }, "to": { "description": "rename only; the new key name.", "type": ["string", "null"] }, "reason": { "type": ["string", "null"] } }, "required": ["op", "path"], "additionalProperties": false, "type": "object" }, "type": "array" }, "graphql": { "description": "GraphQL-only endpoint, auth, environment, title, and scalar settings.", "anyOf": [{ "description": "What a GraphQL schema cannot say about itself. Ignored for OpenAPI specs.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl. Defaults to the URL the schema was fetched from. Without either, baseUrl is a required client option.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production). Each becomes a client environment; the first is the default unless endpoint is set.", "maxItems": 10, "items": { "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "api_key", "none"], "description": "How requests authenticate. bearer sends Authorization: Bearer; basic is for key-pair APIs (public key as username, private key as password); api_key sends a header named by api_key_header; none generates no auth option.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key. Required for that mode; Typeship does not invent a vendor-specific header name.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient). Defaults to a name derived from the endpoint's host.", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name. Unmapped scalars generate as the language's untyped JSON value and produce a warning. Unmatched keys warn.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "diagnostic_policy": { "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed rule or location exceptions.", "properties": { "fail_on": { "enum": ["never", "error", "warning"], "description": "Severity threshold that fails the API change review check.", "default": "error", "type": "string" }, "only_new": { "description": "Enforce only occurrences introduced by the proposed source change.", "default": true, "type": "boolean" }, "suppressions": { "default": [], "maxItems": 100, "items": { "properties": { "rule_id": { "maxLength": 160, "type": "string" }, "path": { "description": "Exact schema coordinate. Omit only to suppress every occurrence of the rule.", "maxLength": 4096, "type": "string" }, "reason": { "description": "The reviewed product decision behind this exception.", "minLength": 1, "maxLength": 500, "type": "string" } }, "required": ["rule_id", "reason"], "additionalProperties": false, "type": "object" }, "type": "array" } }, "required": ["fail_on", "only_new", "suppressions"], "additionalProperties": false, "type": "object" } }, "required": ["source"], "additionalProperties": false, "type": "object", "example": { "source": { "type": "url", "url": { "url": "https://api.parcel.example/openapi.json" } } } }, "targets": { "description": "Initial first-class Targets. More than one may use the same generator with different identities or Deliveries.", "minItems": 1, "items": { "properties": { "name": { "minLength": 1, "maxLength": 80, "type": "string" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target. This is configuration, not identity; several Targets may use the same generator. cli is the TypeScript CLI; go_cli is the native Go CLI, a distinct product that imports one exact paired Go SDK module rather than a client of its own.", "type": "string" }, "status": { "enum": ["active", "disabled"], "default": "active", "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "default": "stable", "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft. Generated checks and customer commands share one reproducible workflow; repository_required names existing repository checks. Supplying checks replaces all settings. Omitted generated restores build, package, and public_entrypoint; omitted repository_required and customer restore empty lists. An empty object restores these defaults. An empty array clears the corresponding list.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "type": "object" }, "type": "array" } }, "additionalProperties": false, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config. GraphQL settings are rejected here and belong to the Spec.", "anyOf": [{ "description": "Target-specific generation and delivery overrides. Authentication may only select a Project-owned OAuth application. OAuth server metadata, applications, and identity policy remain Project-owned. Self-hosted MCP access may be overridden for a Target-specific deployment.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target. OAuth server metadata, applications, and identity policy remain Project-owned.", "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "deliveries": { "maxItems": 2, "items": { "anyOf": [{ "type": "object" }, { "type": "object" }] }, "type": "array" } }, "required": ["name", "type"], "additionalProperties": false, "type": "object" }, "type": "array", "example": [{ "name": "Parcel CLI", "type": "cli", "deliveries": [{ "type": "repository", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": false } }] }] }, "auto_generate": { "description": "Whether Typeship should regenerate automatically when the source or saved configuration changes. Default: true.", "default": true, "type": "boolean" }, "config": { "description": "Shared defaults inherited by every Target. GraphQL settings belong in spec.graphql.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project. Every Target inherits these defaults. Target.config is merged over them for one Target; top-level values replace defaults while cli, mcp, auth, readme, and package merge by field. GraphQL-only source settings live on the Project's Spec and are rejected in both stored config scopes.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "items": { "type": "string" }, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "properties": { "max_retries": { "minimum": 0, "maximum": 10, "type": "integer" }, "statuses": { "description": "Replaces the default retryable set (408, 429, 500, 502, 503, 504).", "maxItems": 20, "items": { "type": "integer" }, "type": "array" }, "initial_delay_ms": { "minimum": 1, "type": "integer" }, "max_delay_ms": { "minimum": 1, "type": "integer" }, "retry_non_idempotent": { "description": "Also retry non-idempotent methods (POST/PATCH).", "type": "boolean" }, "disabled": { "description": "Shorthand for max_retries 0.", "type": "boolean" }, "operations": { "additionalProperties": { "description": "RetryTuning (recursive)" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "additionalProperties": { "anyOf": [{ "type": "object" }, { "description": "false disables pagination detection for the operation.", "type": "boolean" }] }, "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools. Stored Projects own the OAuth server, application catalog, and identity policy; one-shot generation accepts the same shape for one run. Runtime credentials and client secrets are never accepted.", "properties": { "oauth_server": { "anyOf": [{ "description": "Authorization-server metadata used by generated OAuth flows. Secrets and runtime credentials are never accepted here.", "type": "object" }, { "type": "null" }] }, "oauth_applications": { "description": "OAuth applications keyed by a stable name.", "additionalProperties": { "description": "OAuth application available to generated products. Public clients support interactive login; confidential clients support runtime-supplied machine credentials. Client secrets are never stored.", "type": "object" }, "type": ["object", "null"] }, "oauth_application": { "description": "Default OAuth application used by generated products.", "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "identity_verification": { "anyOf": [{ "description": "Authenticated identity read used to verify a login before it is saved. Operation is auto-detected when omitted or null. At least one of subject_field, account_field, or organization_field must be a non-null JSON Pointer. Null clears an individual mapping while another remains. Set identity_verification itself to null to remove the whole policy.", "example": { "subject_field": "/id", "account_field": "/account_id", "organization_field": "/organization_id" }, "type": "object" }, { "type": "null" }] }, "approval_url": { "format": "uri", "description": "Base URL of a custom browser-approval backend implementing the start, status, and revoke contract. Used only when OAuth is not configured.", "type": ["string", "null"] }, "environments": { "description": "Authentication selections keyed by generated API environment name.", "additionalProperties": { "description": "OAuth application and request-value overrides for one named API environment.", "type": "object" }, "type": ["object", "null"] } }, "additionalProperties": false, "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "properties": { "command_name": { "description": "Command users run, independent of how the CLI is distributed.", "type": ["string", "null"] }, "update_notice": { "description": "Opt in to a once-a-day registry check that prints an upgrade hint. Off by default; generated code phones nobody unless this is enabled.", "type": "boolean" }, "changelog_url": { "description": "Public HTTP(S) URL read by the optional changelog command in generated CLIs. Supports UTF-8 Markdown, plain text, and static HTML; embedded credentials are not allowed. Omit or clear to disable, then regenerate.", "type": ["string", "null"] }, "support_url": { "description": "Where the generated CLI's feedback command sends users. GitHub issues/new URLs get a prefilled title and environment details.", "type": ["string", "null"] }, "mcp_url": { "description": "Hosted MCP endpoint installed by the generated CLI instead of launching the package's local stdio server.", "type": ["string", "null"] }, "skills_repo": { "description": "GitHub owner/name of the skills package the generated CLI offers to install during init.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "properties": { "registry_name": { "description": "Stable official MCP registry name, independent of the server runtime.", "type": ["string", "null"] }, "access": { "description": "Authorization for callers connecting to a generated MCP server deployed over HTTP. The hosting application resolves upstream API credentials separately at runtime. This setting does not apply to the Typeship-hosted endpoint.", "properties": { "issuer": { "format": "uri", "description": "Exact issuer allowed to sign MCP connection tokens.", "type": "string" }, "resource": { "format": "uri", "description": "Canonical public URL of the self-hosted MCP endpoint that connection tokens must target.", "type": "string" }, "jwks_url": { "format": "uri", "description": "Public signing-key endpoint. Omit to discover it from the issuer.", "type": "string" }, "scopes": { "description": "Minimum scopes required to connect to the self-hosted MCP server.", "maxItems": 20, "type": "array" } }, "required": ["issuer", "resource"], "additionalProperties": false, "type": "object" }, "tool_mode": { "enum": ["auto", "operations", "meta"], "description": "MCP tool shape. meta collapses per-operation tools into search_docs, read_docs, and execute so large APIs don't flood an agent's context window. Auto considers the serialized tool schemas, switching near 10k tokens or above 100 operations.", "type": "string" }, "instructions": { "description": "Guidance appended to the MCP server's instructions, which agents read once when they connect (server/discover): what to call first, conventions the spec does not state, what not to do. Carried by the package's server and the hosted endpoint alike.", "maxLength": 2000, "type": ["string", "null"] }, "tool_descriptions": { "description": "Hand-written MCP tool descriptions keyed by operationId or \"METHOD /path\". Each replaces the text typeship derives for that operation (summary, first sentence, method and path, deprecation and auth notes). For flows the spec cannot describe, such as a multi-step upload. Keys that match no operation are reported as generation warnings.", "additionalProperties": { "maxLength": 600, "type": "string" }, "type": "object" }, "reference_resolvers": { "description": "Exact name-or-ID resolver overrides keyed first by the target operationId or \"METHOD /path\", then by its wire argument name. A resolver names one read collection operation plus 1-4 item fields to match case-insensitively; false opts that argument out of strict inference.", "additionalProperties": { "type": "object" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "properties": { "quickstart_operation": { "description": "operationId or \"METHOD /path\" to feature as the README's first API call. It must be present in the generated package and callable with no required input beyond path placeholders. Missing or unsuitable choices produce a warning and use the automatic example.", "maxLength": 500, "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "properties": { "homepage": { "description": "Homepage written into registry metadata.", "type": ["string", "null"] }, "license": { "description": "SPDX identifier written into registry metadata. Defaults to info.license.", "maxLength": 200, "type": ["string", "null"] }, "license_text": { "description": "Exact LICENSE file contents. Supply this for licences the engine does not build in; MIT is built in when copyright is also set.", "maxLength": 100000, "type": ["string", "null"] }, "copyright": { "description": "Copyright line used in generated license files.", "maxLength": 200, "type": ["string", "null"] }, "go_package_name": { "description": "Go identifier when the destination repository name is unsuitable.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] } }, "required": ["name", "spec", "targets"] }, "exampleArguments": { "name": "Parcel API", "spec": { "source": { "type": "url", "url": { "url": "https://api.parcel.example/openapi.json" } } }, "targets": [{ "name": "Parcel CLI", "type": "cli", "deliveries": [{ "type": "repository", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": false } }] }] }, "outputSchema": { "description": "Project-owned identity, Spec reference, generation controls, and shared configuration.", "properties": { "id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "project", "type": "string" }, "name": { "maxLength": 80, "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "auto_generate": { "description": "Regenerate when the Spec or saved configuration changes.", "type": "boolean" }, "config": { "description": "Shared defaults inherited by every Target.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the project configuration last changed.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
8
- { "resource": "projects", "method": "get", "command": ["projects", "get"], "tool": "projects_get", "httpMethod": "GET", "path": "/projects/{project_id}", "summary": "Get a project", "description": "Returns the Project's settings and Spec ID. List its Targets separately to retrieve Target configuration and Deliveries.", "toolDescription": "Get a project. Returns the Project's settings and Spec ID. GET /projects/{project_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "project_id", "ts": "projectId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" } }, "required": ["project_id"] }, "exampleArguments": { "project_id": "prj_4f8k2m7x9q1v6b3n" }, "outputSchema": { "description": "Project-owned identity, Spec reference, generation controls, and shared configuration.", "properties": { "id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "project", "type": "string" }, "name": { "maxLength": 80, "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "auto_generate": { "description": "Regenerate when the Spec or saved configuration changes.", "type": "boolean" }, "config": { "description": "Shared defaults inherited by every Target.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the project configuration last changed.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
9
- { "resource": "projects", "method": "delete", "command": ["projects", "delete"], "tool": "projects_delete", "httpMethod": "DELETE", "path": "/projects/{project_id}", "summary": "Delete a project", "description": "A `502 repository_unavailable` means the Project was not deleted because its release pull requests could not be retired. Retry deletion to finish retiring the remaining reviews. Repeating a completed deletion returns `404`.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Delete a project. A `502 repository_unavailable` means the Project was not deleted because its release pull requests could not be retired. DELETE /projects/{project_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "destructive", "params": [{ "name": "project_id", "ts": "projectId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." } }, "required": ["project_id"] }, "exampleArguments": { "project_id": "prj_4f8k2m7x9q1v6b3n" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "project", "type": "string" }, "deleted": { "const": true, "type": "boolean" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
10
- { "resource": "projects", "method": "update", "command": ["projects", "update"], "tool": "projects_update", "httpMethod": "PATCH", "path": "/projects/{project_id}", "summary": "Update a project", "description": "Omitted fields keep their current values. A supplied config replaces the entire stored object; null or an empty object clears it.\nWith auto_generate enabled, changing shared config queues a Generation for each Target whose effective config changes. A queued or running Target reuses that Generation.\nOmitting If-Match applies the update to the current resource; with If-Match, a stale ETag returns 412 precondition_failed without saving.\n\nA `409 target_busy` means a Target is publishing. Retrieve the Project, wait for publishing to finish, reconcile your update, and retry.\nA `502 follow_up_failed` means the Project was saved, but an obsolete release pull request could not be retired. Retrieve the Project and retry the same update to finish retiring reviews if that update is still desired.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Update a project. Omitted fields keep their current values. PATCH /projects/{project_id}", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "project_id", "ts": "projectId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }, { "name": "name", "ts": "name", "kind": "body", "type": "string", "required": false, "flag": "name" }, { "name": "auto_generate", "ts": "auto_generate", "kind": "body", "type": "boolean", "required": false, "flag": "auto-generate" }, { "name": "config", "ts": "config", "kind": "body", "type": "json", "required": false, "nullable": true, "description": "Replaces the Project's shared Target defaults. Send null to clear them.", "flag": "config" }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." }, "name": { "minLength": 1, "maxLength": 80, "type": "string" }, "auto_generate": { "type": "boolean", "example": false }, "config": { "description": "Replaces the Project's shared Target defaults. Send null to clear them.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project. Every Target inherits these defaults. Target.config is merged over them for one Target; top-level values replace defaults while cli, mcp, auth, readme, and package merge by field. GraphQL-only source settings live on the Project's Spec and are rejected in both stored config scopes.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "items": { "type": "string" }, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "properties": { "max_retries": { "minimum": 0, "maximum": 10, "type": "integer" }, "statuses": { "description": "Replaces the default retryable set (408, 429, 500, 502, 503, 504).", "maxItems": 20, "items": { "type": "integer" }, "type": "array" }, "initial_delay_ms": { "minimum": 1, "type": "integer" }, "max_delay_ms": { "minimum": 1, "type": "integer" }, "retry_non_idempotent": { "description": "Also retry non-idempotent methods (POST/PATCH).", "type": "boolean" }, "disabled": { "description": "Shorthand for max_retries 0.", "type": "boolean" }, "operations": { "additionalProperties": { "description": "RetryTuning (recursive)" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "additionalProperties": { "anyOf": [{ "type": "object" }, { "description": "false disables pagination detection for the operation.", "type": "boolean" }] }, "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools. Stored Projects own the OAuth server, application catalog, and identity policy; one-shot generation accepts the same shape for one run. Runtime credentials and client secrets are never accepted.", "properties": { "oauth_server": { "anyOf": [{ "description": "Authorization-server metadata used by generated OAuth flows. Secrets and runtime credentials are never accepted here.", "type": "object" }, { "type": "null" }] }, "oauth_applications": { "description": "OAuth applications keyed by a stable name.", "additionalProperties": { "description": "OAuth application available to generated products. Public clients support interactive login; confidential clients support runtime-supplied machine credentials. Client secrets are never stored.", "type": "object" }, "type": ["object", "null"] }, "oauth_application": { "description": "Default OAuth application used by generated products.", "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "identity_verification": { "anyOf": [{ "description": "Authenticated identity read used to verify a login before it is saved. Operation is auto-detected when omitted or null. At least one of subject_field, account_field, or organization_field must be a non-null JSON Pointer. Null clears an individual mapping while another remains. Set identity_verification itself to null to remove the whole policy.", "example": { "subject_field": "/id", "account_field": "/account_id", "organization_field": "/organization_id" }, "type": "object" }, { "type": "null" }] }, "approval_url": { "format": "uri", "description": "Base URL of a custom browser-approval backend implementing the start, status, and revoke contract. Used only when OAuth is not configured.", "type": ["string", "null"] }, "environments": { "description": "Authentication selections keyed by generated API environment name.", "additionalProperties": { "description": "OAuth application and request-value overrides for one named API environment.", "type": "object" }, "type": ["object", "null"] } }, "additionalProperties": false, "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "properties": { "command_name": { "description": "Command users run, independent of how the CLI is distributed.", "type": ["string", "null"] }, "update_notice": { "description": "Opt in to a once-a-day registry check that prints an upgrade hint. Off by default; generated code phones nobody unless this is enabled.", "type": "boolean" }, "changelog_url": { "description": "Public HTTP(S) URL read by the optional changelog command in generated CLIs. Supports UTF-8 Markdown, plain text, and static HTML; embedded credentials are not allowed. Omit or clear to disable, then regenerate.", "type": ["string", "null"] }, "support_url": { "description": "Where the generated CLI's feedback command sends users. GitHub issues/new URLs get a prefilled title and environment details.", "type": ["string", "null"] }, "mcp_url": { "description": "Hosted MCP endpoint installed by the generated CLI instead of launching the package's local stdio server.", "type": ["string", "null"] }, "skills_repo": { "description": "GitHub owner/name of the skills package the generated CLI offers to install during init.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "properties": { "registry_name": { "description": "Stable official MCP registry name, independent of the server runtime.", "type": ["string", "null"] }, "access": { "description": "Authorization for callers connecting to a generated MCP server deployed over HTTP. The hosting application resolves upstream API credentials separately at runtime. This setting does not apply to the Typeship-hosted endpoint.", "properties": { "issuer": { "format": "uri", "description": "Exact issuer allowed to sign MCP connection tokens.", "type": "string" }, "resource": { "format": "uri", "description": "Canonical public URL of the self-hosted MCP endpoint that connection tokens must target.", "type": "string" }, "jwks_url": { "format": "uri", "description": "Public signing-key endpoint. Omit to discover it from the issuer.", "type": "string" }, "scopes": { "description": "Minimum scopes required to connect to the self-hosted MCP server.", "maxItems": 20, "type": "array" } }, "required": ["issuer", "resource"], "additionalProperties": false, "type": "object" }, "tool_mode": { "enum": ["auto", "operations", "meta"], "description": "MCP tool shape. meta collapses per-operation tools into search_docs, read_docs, and execute so large APIs don't flood an agent's context window. Auto considers the serialized tool schemas, switching near 10k tokens or above 100 operations.", "type": "string" }, "instructions": { "description": "Guidance appended to the MCP server's instructions, which agents read once when they connect (server/discover): what to call first, conventions the spec does not state, what not to do. Carried by the package's server and the hosted endpoint alike.", "maxLength": 2000, "type": ["string", "null"] }, "tool_descriptions": { "description": "Hand-written MCP tool descriptions keyed by operationId or \"METHOD /path\". Each replaces the text typeship derives for that operation (summary, first sentence, method and path, deprecation and auth notes). For flows the spec cannot describe, such as a multi-step upload. Keys that match no operation are reported as generation warnings.", "additionalProperties": { "maxLength": 600, "type": "string" }, "type": "object" }, "reference_resolvers": { "description": "Exact name-or-ID resolver overrides keyed first by the target operationId or \"METHOD /path\", then by its wire argument name. A resolver names one read collection operation plus 1-4 item fields to match case-insensitively; false opts that argument out of strict inference.", "additionalProperties": { "type": "object" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "properties": { "quickstart_operation": { "description": "operationId or \"METHOD /path\" to feature as the README's first API call. It must be present in the generated package and callable with no required input beyond path placeholders. Missing or unsuitable choices produce a warning and use the automatic example.", "maxLength": 500, "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "properties": { "homepage": { "description": "Homepage written into registry metadata.", "type": ["string", "null"] }, "license": { "description": "SPDX identifier written into registry metadata. Defaults to info.license.", "maxLength": 200, "type": ["string", "null"] }, "license_text": { "description": "Exact LICENSE file contents. Supply this for licences the engine does not build in; MIT is built in when copyright is also set.", "maxLength": 100000, "type": ["string", "null"] }, "copyright": { "description": "Copyright line used in generated license files.", "maxLength": 200, "type": ["string", "null"] }, "go_package_name": { "description": "Go identifier when the destination repository name is unsuitable.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] } }, "required": ["project_id"] }, "exampleArguments": { "project_id": "prj_4f8k2m7x9q1v6b3n", "auto_generate": false }, "outputSchema": { "description": "Project-owned identity, Spec reference, generation controls, and shared configuration.", "properties": { "id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "project", "type": "string" }, "name": { "maxLength": 80, "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "auto_generate": { "description": "Regenerate when the Spec or saved configuration changes.", "type": "boolean" }, "config": { "description": "Shared defaults inherited by every Target.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the project configuration last changed.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
11
- { "resource": "projects", "method": "generate", "command": ["projects", "generate"], "tool": "projects_generate", "httpMethod": "POST", "path": "/projects/{project_id}/generate", "summary": "Start generation for active Targets", "description": "Queues one Generation per active Target and returns their IDs. Retrieve each Generation until its status moves from `queued` to `running` and then `completed` or `failed`. `completed` means generated files are saved; check Delivery and Draft status separately for repository delivery and pull requests. A Target already queued or running is returned without starting another Generation. A `409 targets_inactive` means the Project has no active Target to generate. A matching Idempotency-Key replay returns the same Generations with their current statuses.\n\nIf the package already matches a destination and no Draft is open, delivery creates no commit, branch, or pull request. An existing Draft stays open. Automatic generation uses the same workflow.", "toolDescription": "Start generation for active Targets. Queues one Generation per active Target and returns their IDs. POST /projects/{project_id}/generate", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "project_id", "ts": "projectId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }, { "name": "target_id", "ts": "target_id", "kind": "body", "type": "string", "required": false, "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" }, "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" } }, "required": ["project_id"] }, "exampleArguments": { "project_id": "prj_4f8k2m7x9q1v6b3n", "target_id": "tgt_5m8q2v7k1p9d4h6c" }, "outputSchema": { "description": "One Generation per selected Target. Retrieve each Generation for current status and generated files.", "properties": { "data": { "items": { "description": "Generation metadata returned by collection endpoints.", "properties": { "id": { "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "generation", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "A Generation moves from queued to running, then completes when its files are saved or fails. Delivery and Draft status are separate.", "type": "string" }, "trigger": { "enum": ["manual", "spec_changed", "config_changed", "preview"], "type": "string" }, "target_id": { "anyOf": [{ "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target. This is configuration, not identity; several Targets may use the same generator. cli is the TypeScript CLI; go_cli is the native Go CLI, a distinct product that imports one exact paired Go SDK module rather than a client of its own.", "type": "string" }, "name": { "description": "Package name; null until known.", "type": ["string", "null"] }, "version": { "description": "Package version; null until known.", "type": ["string", "null"] }, "warnings": { "items": { "type": "object" }, "type": "array" }, "coverage": { "description": "Operation coverage; null until generation has finished.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "file_count": { "description": "Generated package files. List them with listGenerationFiles.", "minimum": 0, "type": "integer" }, "errors": { "items": { "type": "object" }, "type": "array" }, "runtime_ms": { "description": "Milliseconds from the start of the run until it completed or failed; null while queued or running.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
12
- { "resource": "specs", "method": "get", "command": ["specs", "get"], "tool": "specs_get", "httpMethod": "GET", "path": "/specs/{spec_id}", "summary": "Get a Spec", "toolDescription": "Get a Spec. GET /specs/{spec_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "spec_id", "ts": "specId", "kind": "path", "type": "string", "required": true, "flag": "spec-id" }], "inputSchema": { "type": "object", "properties": { "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" } }, "required": ["spec_id"] }, "exampleArguments": { "spec_id": "spec_2p8m4q7k1v9d6h3c" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "spec", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "source": { "description": "The single source of truth for where a Project's Spec lives.", "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "properties": { "url": { "format": "uri", "description": "URL fetched for every generation.", "maxLength": 2048, "pattern": "^https?://", "type": "string" }, "headers_configured": { "description": "Whether Typeship has stored write-only request headers for this URL.", "type": "boolean" } }, "type": "object" } }, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "path": { "description": "Repository-relative Spec entrypoint.", "minLength": 1, "maxLength": 4096, "pattern": "^(?!/)(?!.*\\.\\.).+$", "type": "string" } }, "type": "object" } }, "type": "object" }] }, "format": { "enum": ["openapi", "graphql", null], "type": ["string", "null"] }, "patches": { "items": { "description": "A fix applied to the resolved Spec before generation. Paths are JSON\nPointers into the document. A patch whose target no longer exists is\nskipped and reported as a warning on the generation, never silently.", "examples": [{ "op": "remove", "path": "/components/schemas/Legacy" }], "properties": { "op": { "enum": ["set", "append", "remove", "rename"], "type": "string" }, "path": { "description": "JSON-Pointer-style path. Pattern segments enable bulk fixes:\n* (any child), ** (any depth), [key=value] (filter), e.g.\n/paths/**/parameters/[name=account_id]/schema/type. Renaming a\nschema under /components/schemas also rewrites its $refs.", "type": "string" }, "value": { "description": "set only; the replacement value." }, "to": { "description": "rename only; the new key name.", "type": ["string", "null"] }, "reason": { "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "graphql": { "anyOf": [{ "description": "What a GraphQL schema cannot say about itself. Ignored for OpenAPI specs.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl. Defaults to the URL the schema was fetched from. Without either, baseUrl is a required client option.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production). Each becomes a client environment; the first is the default unless endpoint is set.", "maxItems": 10, "items": { "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "api_key", "none"], "description": "How requests authenticate. bearer sends Authorization: Bearer; basic is for key-pair APIs (public key as username, private key as password); api_key sends a header named by api_key_header; none generates no auth option.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key. Required for that mode; Typeship does not invent a vendor-specific header name.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient). Defaults to a name derived from the endpoint's host.", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name. Unmapped scalars generate as the language's untyped JSON value and produce a warning. Unmatched keys warn.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" } }, "type": "object" }, { "type": "null" }] }, "diagnostic_policy": { "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed rule or location exceptions.", "properties": { "fail_on": { "enum": ["never", "error", "warning"], "description": "Severity threshold that fails the API change review check.", "default": "error", "type": "string" }, "only_new": { "description": "Enforce only occurrences introduced by the proposed source change.", "default": true, "type": "boolean" }, "suppressions": { "default": [], "maxItems": 100, "items": { "properties": { "rule_id": { "maxLength": 160, "type": "string" }, "path": { "description": "Exact schema coordinate. Omit only to suppress every occurrence of the rule.", "maxLength": 4096, "type": "string" }, "reason": { "description": "The reviewed product decision behind this exception.", "minLength": 1, "maxLength": 500, "type": "string" } }, "type": "object" }, "type": "array" } }, "type": "object" }, "revision_latest_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
13
- { "resource": "specs", "method": "update", "command": ["specs", "update"], "tool": "specs_update", "httpMethod": "PATCH", "path": "/specs/{spec_id}", "summary": "Update and resolve a Spec", "description": "Resolves the source files before saving the update and records a new Spec Revision when the source changes.\nOmitted fields remain unchanged; supplied objects and arrays replace the whole field.\nIf the Spec or its Project configuration changes during validation, returns 409 resource_changed without saving the rejected update. Retrieve the current Spec and Project, reconcile your changes,\nand submit a new request with a new Idempotency-Key if using one.\n\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Update and resolve a Spec. Resolves the source files before saving the update and records a new Spec Revision when the source changes. PATCH /specs/{spec_id}", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "spec_id", "ts": "specId", "kind": "path", "type": "string", "required": true, "flag": "spec-id" }, { "name": "source", "ts": "source", "kind": "body", "type": "json", "required": false, "flag": "source" }, { "name": "patches", "ts": "patches", "kind": "body", "type": "array", "required": false, "items": { "type": "object" }, "description": "Replace all patches in order. An empty array removes every patch; null is invalid.", "flag": "patches" }, { "name": "graphql", "ts": "graphql", "kind": "body", "type": "json", "required": false, "nullable": true, "description": "Replace all GraphQL settings. Null or an empty object clears them.", "flag": "graphql" }, { "name": "diagnostic_policy", "ts": "diagnostic_policy", "kind": "body", "type": "object", "required": false, "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed rule or location exceptions.", "flag": "diagnostic-policy" }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." }, "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "source": { "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "properties": { "url": { "format": "uri", "description": "URL of an OpenAPI document, GraphQL SDL file, or GraphQL endpoint.", "maxLength": 2048, "pattern": "^https?://", "type": "string" }, "headers": { "description": "Request headers for a protected URL. Values are never returned or recorded in revision history. When updating the same URL, omit headers to preserve the stored values or pass null to remove them. Changing the URL without headers clears the old values so a credential is never forwarded to a different source.", "anyOf": [{ "type": "object" }, { "type": "null" }] } }, "required": ["url"], "additionalProperties": false, "type": "object" } }, "required": ["type", "url"], "additionalProperties": false, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "path": { "description": "Repository-relative Spec entrypoint.", "minLength": 1, "maxLength": 4096, "pattern": "^(?!/)(?!.*\\.\\.).+$", "type": "string" } }, "required": ["provider", "identifier", "path"], "additionalProperties": false, "type": "object" } }, "required": ["type", "repository"], "additionalProperties": false, "type": "object" }], "example": { "type": "url", "url": { "url": "https://api.parcel.example/openapi.json" } } }, "patches": { "description": "Replace all patches in order. An empty array removes every patch; null is invalid.", "maxItems": 50, "items": { "description": "A fix applied to the resolved Spec before generation. Paths are JSON\nPointers into the document. A patch whose target no longer exists is\nskipped and reported as a warning on the generation, never silently.", "examples": [{ "op": "remove", "path": "/components/schemas/Legacy" }], "properties": { "op": { "enum": ["set", "append", "remove", "rename"], "type": "string" }, "path": { "description": "JSON-Pointer-style path. Pattern segments enable bulk fixes:\n* (any child), ** (any depth), [key=value] (filter), e.g.\n/paths/**/parameters/[name=account_id]/schema/type. Renaming a\nschema under /components/schemas also rewrites its $refs.", "type": "string" }, "value": { "description": "set only; the replacement value." }, "to": { "description": "rename only; the new key name.", "type": ["string", "null"] }, "reason": { "type": ["string", "null"] } }, "required": ["op", "path"], "additionalProperties": false, "type": "object" }, "type": "array" }, "graphql": { "description": "Replace all GraphQL settings. Null or an empty object clears them.", "anyOf": [{ "description": "What a GraphQL schema cannot say about itself. Ignored for OpenAPI specs.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl. Defaults to the URL the schema was fetched from. Without either, baseUrl is a required client option.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production). Each becomes a client environment; the first is the default unless endpoint is set.", "maxItems": 10, "items": { "properties": { "name": { "type": "string" }, "url": { "format": "uri", "type": "string" } }, "required": ["name", "url"], "additionalProperties": false, "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "api_key", "none"], "description": "How requests authenticate. bearer sends Authorization: Bearer; basic is for key-pair APIs (public key as username, private key as password); api_key sends a header named by api_key_header; none generates no auth option.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key. Required for that mode; Typeship does not invent a vendor-specific header name.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient). Defaults to a name derived from the endpoint's host.", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name. Unmapped scalars generate as the language's untyped JSON value and produce a warning. Unmatched keys warn.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "diagnostic_policy": { "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed rule or location exceptions.", "properties": { "fail_on": { "enum": ["never", "error", "warning"], "description": "Severity threshold that fails the API change review check.", "default": "error", "type": "string" }, "only_new": { "description": "Enforce only occurrences introduced by the proposed source change.", "default": true, "type": "boolean" }, "suppressions": { "default": [], "maxItems": 100, "items": { "properties": { "rule_id": { "maxLength": 160, "type": "string" }, "path": { "description": "Exact schema coordinate. Omit only to suppress every occurrence of the rule.", "maxLength": 4096, "type": "string" }, "reason": { "description": "The reviewed product decision behind this exception.", "minLength": 1, "maxLength": 500, "type": "string" } }, "required": ["rule_id", "reason"], "additionalProperties": false, "type": "object" }, "type": "array" } }, "required": ["fail_on", "only_new", "suppressions"], "additionalProperties": false, "type": "object" } }, "required": ["spec_id"] }, "exampleArguments": { "spec_id": "spec_2p8m4q7k1v9d6h3c", "source": { "type": "url", "url": { "url": "https://api.parcel.example/openapi.json" } } }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "spec", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "source": { "description": "The single source of truth for where a Project's Spec lives.", "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "properties": { "url": { "format": "uri", "description": "URL fetched for every generation.", "maxLength": 2048, "pattern": "^https?://", "type": "string" }, "headers_configured": { "description": "Whether Typeship has stored write-only request headers for this URL.", "type": "boolean" } }, "type": "object" } }, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "path": { "description": "Repository-relative Spec entrypoint.", "minLength": 1, "maxLength": 4096, "pattern": "^(?!/)(?!.*\\.\\.).+$", "type": "string" } }, "type": "object" } }, "type": "object" }] }, "format": { "enum": ["openapi", "graphql", null], "type": ["string", "null"] }, "patches": { "items": { "description": "A fix applied to the resolved Spec before generation. Paths are JSON\nPointers into the document. A patch whose target no longer exists is\nskipped and reported as a warning on the generation, never silently.", "examples": [{ "op": "remove", "path": "/components/schemas/Legacy" }], "properties": { "op": { "enum": ["set", "append", "remove", "rename"], "type": "string" }, "path": { "description": "JSON-Pointer-style path. Pattern segments enable bulk fixes:\n* (any child), ** (any depth), [key=value] (filter), e.g.\n/paths/**/parameters/[name=account_id]/schema/type. Renaming a\nschema under /components/schemas also rewrites its $refs.", "type": "string" }, "value": { "description": "set only; the replacement value." }, "to": { "description": "rename only; the new key name.", "type": ["string", "null"] }, "reason": { "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "graphql": { "anyOf": [{ "description": "What a GraphQL schema cannot say about itself. Ignored for OpenAPI specs.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl. Defaults to the URL the schema was fetched from. Without either, baseUrl is a required client option.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production). Each becomes a client environment; the first is the default unless endpoint is set.", "maxItems": 10, "items": { "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "api_key", "none"], "description": "How requests authenticate. bearer sends Authorization: Bearer; basic is for key-pair APIs (public key as username, private key as password); api_key sends a header named by api_key_header; none generates no auth option.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key. Required for that mode; Typeship does not invent a vendor-specific header name.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient). Defaults to a name derived from the endpoint's host.", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name. Unmapped scalars generate as the language's untyped JSON value and produce a warning. Unmatched keys warn.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" } }, "type": "object" }, { "type": "null" }] }, "diagnostic_policy": { "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed rule or location exceptions.", "properties": { "fail_on": { "enum": ["never", "error", "warning"], "description": "Severity threshold that fails the API change review check.", "default": "error", "type": "string" }, "only_new": { "description": "Enforce only occurrences introduced by the proposed source change.", "default": true, "type": "boolean" }, "suppressions": { "default": [], "maxItems": 100, "items": { "properties": { "rule_id": { "maxLength": 160, "type": "string" }, "path": { "description": "Exact schema coordinate. Omit only to suppress every occurrence of the rule.", "maxLength": 4096, "type": "string" }, "reason": { "description": "The reviewed product decision behind this exception.", "minLength": 1, "maxLength": 500, "type": "string" } }, "type": "object" }, "type": "array" } }, "type": "object" }, "revision_latest_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
14
- { "resource": "specs", "method": "refresh", "command": ["specs", "refresh"], "tool": "specs_refresh", "httpMethod": "POST", "path": "/specs/{spec_id}/refresh", "summary": "Refresh a Spec from its configured source", "description": "Fetches the configured source now and creates a new Spec Revision only when its content changes. Diagnostics then reads that revision. If automatic generation is enabled, refresh queues generation for active Targets even when the source is unchanged. A `502 follow_up_failed` means the new Spec Revision was recorded but generation could not be queued.", "toolDescription": "Refresh a Spec from its configured source. Fetches the configured source now and creates a new Spec Revision only when its content changes. POST /specs/{spec_id}/refresh", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "spec_id", "ts": "specId", "kind": "path", "type": "string", "required": true, "flag": "spec-id" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." } }, "required": ["spec_id"] }, "exampleArguments": { "spec_id": "spec_2p8m4q7k1v9d6h3c" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "spec", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "source": { "description": "The single source of truth for where a Project's Spec lives.", "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "properties": { "url": { "format": "uri", "description": "URL fetched for every generation.", "maxLength": 2048, "pattern": "^https?://", "type": "string" }, "headers_configured": { "description": "Whether Typeship has stored write-only request headers for this URL.", "type": "boolean" } }, "type": "object" } }, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "path": { "description": "Repository-relative Spec entrypoint.", "minLength": 1, "maxLength": 4096, "pattern": "^(?!/)(?!.*\\.\\.).+$", "type": "string" } }, "type": "object" } }, "type": "object" }] }, "format": { "enum": ["openapi", "graphql", null], "type": ["string", "null"] }, "patches": { "items": { "description": "A fix applied to the resolved Spec before generation. Paths are JSON\nPointers into the document. A patch whose target no longer exists is\nskipped and reported as a warning on the generation, never silently.", "examples": [{ "op": "remove", "path": "/components/schemas/Legacy" }], "properties": { "op": { "enum": ["set", "append", "remove", "rename"], "type": "string" }, "path": { "description": "JSON-Pointer-style path. Pattern segments enable bulk fixes:\n* (any child), ** (any depth), [key=value] (filter), e.g.\n/paths/**/parameters/[name=account_id]/schema/type. Renaming a\nschema under /components/schemas also rewrites its $refs.", "type": "string" }, "value": { "description": "set only; the replacement value." }, "to": { "description": "rename only; the new key name.", "type": ["string", "null"] }, "reason": { "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "graphql": { "anyOf": [{ "description": "What a GraphQL schema cannot say about itself. Ignored for OpenAPI specs.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl. Defaults to the URL the schema was fetched from. Without either, baseUrl is a required client option.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production). Each becomes a client environment; the first is the default unless endpoint is set.", "maxItems": 10, "items": { "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "api_key", "none"], "description": "How requests authenticate. bearer sends Authorization: Bearer; basic is for key-pair APIs (public key as username, private key as password); api_key sends a header named by api_key_header; none generates no auth option.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key. Required for that mode; Typeship does not invent a vendor-specific header name.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient). Defaults to a name derived from the endpoint's host.", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name. Unmapped scalars generate as the language's untyped JSON value and produce a warning. Unmatched keys warn.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" } }, "type": "object" }, { "type": "null" }] }, "diagnostic_policy": { "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed rule or location exceptions.", "properties": { "fail_on": { "enum": ["never", "error", "warning"], "description": "Severity threshold that fails the API change review check.", "default": "error", "type": "string" }, "only_new": { "description": "Enforce only occurrences introduced by the proposed source change.", "default": true, "type": "boolean" }, "suppressions": { "default": [], "maxItems": 100, "items": { "properties": { "rule_id": { "maxLength": 160, "type": "string" }, "path": { "description": "Exact schema coordinate. Omit only to suppress every occurrence of the rule.", "maxLength": 4096, "type": "string" }, "reason": { "description": "The reviewed product decision behind this exception.", "minLength": 1, "maxLength": 500, "type": "string" } }, "type": "object" }, "type": "array" } }, "type": "object" }, "revision_latest_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
15
- { "resource": "specRevisions", "method": "list", "command": ["spec-revisions", "list"], "tool": "spec_revisions_list", "httpMethod": "GET", "path": "/spec-revisions", "summary": "List Spec Revisions", "description": "Lists Spec Revisions, newest first. Source content is not included; list a revision's files with listSpecRevisionFiles.", "toolDescription": "List Spec Revisions. Lists Spec Revisions, newest first. GET /spec-revisions (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "spec_id", "ts": "specId", "kind": "query", "type": "string", "required": false, "description": "Only revisions of this Spec.", "flag": "spec-id" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "id": { "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "spec_revision", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "format": { "enum": ["openapi", "graphql"], "type": "string" }, "file_count": { "minimum": 1, "type": "integer" }, "sha256": { "description": "SHA-256 digest of every source file path, digest, and size in the resolved graph.", "examples": ["9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"], "pattern": "^[a-f0-9]{64}$", "type": "string" }, "size_bytes": { "description": "Total bytes across all source files.", "minimum": 0, "type": "integer" }, "source": { "description": "Origin recorded when this immutable revision was created.", "anyOf": [{ "anyOf": [{ "type": "object" }, { "type": "object" }] }, { "type": "null" }] }, "diagnostic_summary": { "description": "Counts of grouped Diagnostics, one per rule. Retrieve the revision with include=diagnostics for each Diagnostic.", "properties": { "status": { "enum": ["passed", "blocked"], "description": "passed: no Diagnostic fails the Spec's Diagnostic policy. blocked: at least one does; retrieve with include=diagnostics and fix those marked blocking.", "type": "string" }, "error_count": { "description": "Diagnostics reporting invalid behavior.", "minimum": 0, "type": "integer" }, "warning_count": { "description": "Diagnostics reporting material risk.", "minimum": 0, "type": "integer" }, "suggestion_count": { "description": "Diagnostics suggesting an improvement.", "minimum": 0, "type": "integer" }, "blocking_count": { "description": "Diagnostics that fail the Spec's Diagnostic policy.", "minimum": 0, "type": "integer" }, "baseline_spec_revision_id": { "description": "The previous revision of this Spec that introduced Diagnostics are compared with, or null for the first revision.", "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] } }, "type": "object" }, "diagnostics": { "description": "Present only with include=diagnostics. Ordered by severity, then rule identifier.", "items": { "description": "Every occurrence of one Diagnostic rule in a Spec Revision, grouped into one decision. Diagnostics are evaluated when read, using the Spec's current patches and Diagnostic policy.", "properties": { "id": { "description": "Stable rule identifier, unique within a Spec Revision. Suppressions name it as rule_id.", "type": "string" }, "object": { "const": "diagnostic", "type": "string" }, "blocking": { "description": "Whether this Diagnostic fails the Spec's Diagnostic policy. Suppressed occurrences and, when only_new is set, occurrences present in the baseline never block.", "type": "boolean" }, "introduced": { "description": "Whether any occurrence is new since baseline_spec_revision_id in the Diagnostic summary. Always true when there is no baseline.", "type": "boolean" }, "severity": { "enum": ["error", "warning", "suggestion"], "description": "Whether the rule reports invalid behavior, material risk, or an improvement.", "type": "string" }, "category": { "enum": ["correctness", "sdk_ergonomics", "agent_usability", "safety"], "description": "Product dimension affected by the diagnostic.", "type": "string" }, "title": { "description": "Concise statement of the root cause.", "type": "string" }, "message": { "description": "One explanation of the finding and why it matters.", "type": "string" }, "surfaces": { "description": "Public surfaces affected by the root cause.", "uniqueItems": true, "type": "array" }, "owner_decision_required": { "description": "Whether remediation requires intent that the Spec cannot prove.", "type": "boolean" }, "locations": { "description": "All affected coordinates, kept under one grouped diagnostic.", "minItems": 1, "type": "array" }, "fix": { "description": "A reviewable remediation that does not invent API behavior.", "type": "object" }, "authoring_brief": { "description": "Grounded instructions an agent can use to edit the source. The brief preserves existing behavior and requires owner input when the contract cannot prove the missing product decision.", "type": "string" } }, "type": "object" }, "type": "array" }, "patch_diagnostics": { "description": "Present only with include=diagnostics. Coded misses or conflicts from applying the Spec's patches to this revision.", "items": { "properties": { "code": { "enum": ["unsupported_format", "invalid_document", "invalid_patch", "no_match", "append_target_type", "rename_target_type", "rename_conflict"], "type": "string" }, "message": { "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
16
- { "resource": "specRevisions", "method": "get", "command": ["spec-revisions", "get"], "tool": "spec_revisions_get", "httpMethod": "GET", "path": "/spec-revisions/{spec_revision_id}", "summary": "Get a Spec Revision", "description": "Returns metadata for a saved Spec Revision with a Diagnostics summary. Pass `include=diagnostics` to add every Diagnostic, evaluated with the Spec's current patches and Diagnostic policy. List its source files and resolved document with listSpecRevisionFiles.", "toolDescription": "Get a Spec Revision. Returns metadata for a saved Spec Revision with a Diagnostics summary. GET /spec-revisions/{spec_revision_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "spec_revision_id", "ts": "specRevisionId", "kind": "path", "type": "string", "required": true, "flag": "spec-revision-id" }, { "name": "include", "ts": "include", "kind": "query", "type": "string", "required": false, "enum": ["diagnostics"], "description": "Add related data to the response. `diagnostics` adds the `diagnostics` and `patch_diagnostics` arrays.", "flag": "include" }], "inputSchema": { "type": "object", "properties": { "spec_revision_id": { "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, "include": { "enum": ["diagnostics"], "type": "string", "description": "Add related data to the response. `diagnostics` adds the `diagnostics` and `patch_diagnostics` arrays." } }, "required": ["spec_revision_id"] }, "exampleArguments": { "spec_revision_id": "srev_6m1q8v4k2p9d7h3c" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "spec_revision", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "format": { "enum": ["openapi", "graphql"], "type": "string" }, "file_count": { "minimum": 1, "type": "integer" }, "sha256": { "description": "SHA-256 digest of every source file path, digest, and size in the resolved graph.", "examples": ["9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"], "pattern": "^[a-f0-9]{64}$", "type": "string" }, "size_bytes": { "description": "Total bytes across all source files.", "minimum": 0, "type": "integer" }, "source": { "description": "Origin recorded when this immutable revision was created.", "anyOf": [{ "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "type": "object" } }, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "type": "object" } }, "type": "object" }] }, { "type": "null" }] }, "diagnostic_summary": { "description": "Counts of grouped Diagnostics, one per rule. Retrieve the revision with include=diagnostics for each Diagnostic.", "properties": { "status": { "enum": ["passed", "blocked"], "description": "passed: no Diagnostic fails the Spec's Diagnostic policy. blocked: at least one does; retrieve with include=diagnostics and fix those marked blocking.", "type": "string" }, "error_count": { "description": "Diagnostics reporting invalid behavior.", "minimum": 0, "type": "integer" }, "warning_count": { "description": "Diagnostics reporting material risk.", "minimum": 0, "type": "integer" }, "suggestion_count": { "description": "Diagnostics suggesting an improvement.", "minimum": 0, "type": "integer" }, "blocking_count": { "description": "Diagnostics that fail the Spec's Diagnostic policy.", "minimum": 0, "type": "integer" }, "baseline_spec_revision_id": { "description": "The previous revision of this Spec that introduced Diagnostics are compared with, or null for the first revision.", "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] } }, "type": "object" }, "diagnostics": { "description": "Present only with include=diagnostics. Ordered by severity, then rule identifier.", "items": { "description": "Every occurrence of one Diagnostic rule in a Spec Revision, grouped into one decision. Diagnostics are evaluated when read, using the Spec's current patches and Diagnostic policy.", "properties": { "id": { "description": "Stable rule identifier, unique within a Spec Revision. Suppressions name it as rule_id.", "type": "string" }, "object": { "const": "diagnostic", "type": "string" }, "blocking": { "description": "Whether this Diagnostic fails the Spec's Diagnostic policy. Suppressed occurrences and, when only_new is set, occurrences present in the baseline never block.", "type": "boolean" }, "introduced": { "description": "Whether any occurrence is new since baseline_spec_revision_id in the Diagnostic summary. Always true when there is no baseline.", "type": "boolean" }, "severity": { "enum": ["error", "warning", "suggestion"], "description": "Whether the rule reports invalid behavior, material risk, or an improvement.", "type": "string" }, "category": { "enum": ["correctness", "sdk_ergonomics", "agent_usability", "safety"], "description": "Product dimension affected by the diagnostic.", "type": "string" }, "title": { "description": "Concise statement of the root cause.", "type": "string" }, "message": { "description": "One explanation of the finding and why it matters.", "type": "string" }, "surfaces": { "description": "Public surfaces affected by the root cause.", "uniqueItems": true, "items": { "enum": ["api", "sdk", "cli", "mcp"], "type": "string" }, "type": "array" }, "owner_decision_required": { "description": "Whether remediation requires intent that the Spec cannot prove.", "type": "boolean" }, "locations": { "description": "All affected coordinates, kept under one grouped diagnostic.", "minItems": 1, "items": { "description": "One exact place where a Diagnostic rule found evidence.", "type": "object" }, "type": "array" }, "fix": { "description": "A reviewable remediation that does not invent API behavior.", "properties": { "title": { "description": "Concise action for the API author.", "type": "string" }, "type": { "enum": ["spec_patch", "source_edit"], "description": "spec_patch is an exact OpenAPI edit Typeship can derive; source_edit requires author intent or a lossless GraphQL source edit.", "type": "string" }, "patches": { "description": "Exact patches when type is spec_patch.", "type": "array" }, "instructions": { "description": "Source-level guidance when an exact patch would invent intent.", "type": "string" } }, "type": "object" }, "authoring_brief": { "description": "Grounded instructions an agent can use to edit the source. The brief preserves existing behavior and requires owner input when the contract cannot prove the missing product decision.", "type": "string" } }, "type": "object" }, "type": "array" }, "patch_diagnostics": { "description": "Present only with include=diagnostics. Coded misses or conflicts from applying the Spec's patches to this revision.", "items": { "properties": { "code": { "enum": ["unsupported_format", "invalid_document", "invalid_patch", "no_match", "append_target_type", "rename_target_type", "rename_conflict"], "type": "string" }, "message": { "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
4
+ { "resource": "projects", "method": "create", "command": ["projects", "create"], "tool": "projects_create", "httpMethod": "POST", "path": "/projects", "summary": "Create a Project", "description": "Creates a Project from a URL or GitHub Spec.\nAutomatic generation is enabled by default for a saved Project.\n\nFree includes one saved Project, all selected Targets, and the first 25 operations per Target, with regeneration, history, delivery pull requests, and previews. Pro supports additional Projects and all operations. One-shot generation does not use a Project slot.", "toolDescription": "Create a Project. Creates a Project from a URL or GitHub Spec. POST /projects", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "name", "ts": "name", "kind": "body", "type": "string", "required": true, "flag": "name" }, { "name": "spec", "ts": "spec", "kind": "body", "type": "object", "required": true, "flag": "spec" }, { "name": "targets", "ts": "targets", "kind": "body", "type": "array", "required": true, "items": { "type": "object" }, "description": "Initial first-class Targets. More than one may use the same generator with different identities or Deliveries.", "flag": "targets" }, { "name": "auto_generate", "ts": "auto_generate", "kind": "body", "type": "boolean", "required": false, "description": "Whether Typeship should regenerate automatically when the source or saved configuration changes. Default: true.", "flag": "auto-generate" }, { "name": "config", "ts": "config", "kind": "body", "type": "json", "required": false, "nullable": true, "description": "Shared defaults inherited by every Target. GraphQL settings belong in spec.graphql.", "flag": "config" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "name": { "minLength": 1, "maxLength": 80, "type": "string", "example": "Parcel API" }, "spec": { "properties": { "source": { "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "properties": { "url": { "format": "uri", "description": "URL of an OpenAPI document, GraphQL SDL file, or GraphQL endpoint.", "maxLength": 2048, "pattern": "^https?://", "type": "string" }, "headers": { "description": "Request headers for a protected URL. Values are never returned or recorded in revision history. When updating the same URL, omit headers to preserve the stored values or pass null to remove them. Changing the URL without headers clears the old values so a credential is never forwarded to a different source.", "anyOf": [{ "type": "object" }, { "type": "null" }] } }, "required": ["url"], "additionalProperties": false, "type": "object" } }, "required": ["type", "url"], "additionalProperties": false, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "path": { "description": "Repository-relative Spec entrypoint.", "minLength": 1, "maxLength": 4096, "pattern": "^(?!/)(?!.*\\.\\.).+$", "type": "string" } }, "required": ["provider", "identifier", "path"], "additionalProperties": false, "type": "object" } }, "required": ["type", "repository"], "additionalProperties": false, "type": "object" }] }, "patches": { "default": [], "maxItems": 50, "items": { "description": "A fix applied to the resolved Spec before generation. Paths are JSON\nPointers into the document. A patch whose target no longer exists is\nskipped and reported as a warning on the generation, never silently.", "examples": [{ "op": "remove", "path": "/components/schemas/Legacy" }], "properties": { "op": { "enum": ["set", "append", "remove", "rename"], "type": "string" }, "path": { "description": "JSON-Pointer-style path. Pattern segments enable bulk fixes:\n* (any child), ** (any depth), [key=value] (filter), e.g.\n/paths/**/parameters/[name=account_id]/schema/type. Renaming a\nschema under /components/schemas also rewrites its $refs.", "type": "string" }, "value": { "description": "set only; the replacement value." }, "to": { "description": "rename only; the new key name.", "type": ["string", "null"] }, "reason": { "type": ["string", "null"] } }, "required": ["op", "path"], "additionalProperties": false, "type": "object" }, "type": "array" }, "graphql": { "description": "GraphQL-only endpoint, auth, environment, title, and scalar settings.", "anyOf": [{ "description": "What a GraphQL schema cannot say about itself. Ignored for OpenAPI specs.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl. Defaults to the URL the schema was fetched from. Without either, baseUrl is a required client option.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production). Each becomes a client environment; the first is the default unless endpoint is set.", "maxItems": 10, "items": { "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "basic_api_key", "api_key", "api_key_or_bearer", "none"], "description": "How requests authenticate. bearer sends Authorization: Bearer; basic is for key-pair APIs (public key as username, private key as password); basic_api_key sends one API key as the Basic-auth username with an empty password; api_key sends a header named by api_key_header; api_key_or_bearer sends a key in api_key_header (Authorization for a raw key) and also accepts an OAuth access token as Authorization: Bearer; none generates no auth option.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key or api_key_or_bearer. Required for those modes; Typeship does not invent a vendor-specific header name.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient). Defaults to a name derived from the endpoint's host.", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name. Unmapped scalars generate as the language's untyped JSON value and produce a warning. Unmatched keys warn.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" }, "error_types": { "description": "Object types that report a failure when an operation's union or interface result resolves to them (errors returned as data). Replaces the default, which is every member whose name ends in Error when the result can also be something else. An empty array treats no result as a failure. Names that are not object types in the schema produce a generation warning.", "maxItems": 100, "uniqueItems": true, "items": { "pattern": "^[_A-Za-z][_0-9A-Za-z]*$", "type": "string" }, "type": "array" }, "page_size": { "description": "Page size a paginated connection call sends as first when the caller passes neither first nor last. Relay servers such as GitHub reject a connection query without one. Ignored for a connection whose first argument has a schema default.", "default": 100, "minimum": 1, "maximum": 1000, "type": "integer" } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "diagnostic_policy": { "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed rule or location exceptions.", "properties": { "fail_on": { "enum": ["never", "error", "warning"], "description": "Severity threshold that fails the API change review check.", "default": "error", "type": "string" }, "only_new": { "description": "Enforce only occurrences introduced by the proposed source change.", "default": true, "type": "boolean" }, "suppressions": { "default": [], "maxItems": 100, "items": { "properties": { "rule_id": { "maxLength": 160, "type": "string" }, "path": { "description": "Exact schema coordinate. Omit only to suppress every occurrence of the rule.", "maxLength": 4096, "type": "string" }, "reason": { "description": "The reviewed product decision behind this exception.", "minLength": 1, "maxLength": 500, "type": "string" } }, "required": ["rule_id", "reason"], "additionalProperties": false, "type": "object" }, "type": "array" } }, "required": ["fail_on", "only_new", "suppressions"], "additionalProperties": false, "type": "object" } }, "required": ["source"], "additionalProperties": false, "type": "object", "example": { "source": { "type": "url", "url": { "url": "https://api.parcel.example/openapi.json" } } } }, "targets": { "description": "Initial first-class Targets. More than one may use the same generator with different identities or Deliveries.", "minItems": 1, "items": { "properties": { "name": { "minLength": 1, "maxLength": 80, "type": "string" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target. This is configuration, not identity; several Targets may use the same generator. cli is the TypeScript CLI; go_cli is the native Go CLI, a distinct product that imports one exact paired Go SDK module rather than a client of its own.", "type": "string" }, "status": { "enum": ["active", "disabled"], "default": "active", "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "default": "stable", "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft. Generated checks and customer commands share one reproducible workflow; repository_required names existing repository checks. Supplying checks replaces all settings. Omitted generated restores build, package, and public_entrypoint; omitted repository_required and customer restore empty lists. An empty object restores these defaults. An empty array clears the corresponding list.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "type": "object" }, "type": "array" } }, "additionalProperties": false, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config. GraphQL settings are rejected here and belong to the Spec.", "anyOf": [{ "description": "Target-specific generation and delivery overrides. Authentication may only select a Project-owned OAuth application. OAuth server metadata, applications, and identity policy remain Project-owned. Self-hosted MCP access may be overridden for a Target-specific deployment.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path segment, `**` any number), optionally after an HTTP method (`DELETE /zones/*`). Applied before the Spec size limit, with components nothing references any more removed, so a one-shot run can generate part of a Spec up to 64 MB. Selectors that match nothing are reported as generation warnings.", "maxItems": 100, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`). Wins over `include`.", "maxItems": 100, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target. OAuth server metadata, applications, and identity policy remain Project-owned.", "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "deliveries": { "maxItems": 2, "items": { "anyOf": [{ "type": "object" }, { "type": "object" }] }, "type": "array" } }, "required": ["name", "type"], "additionalProperties": false, "type": "object" }, "type": "array", "example": [{ "name": "Parcel CLI", "type": "cli", "deliveries": [{ "type": "repository", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": false } }] }] }, "auto_generate": { "description": "Whether Typeship should regenerate automatically when the source or saved configuration changes. Default: true.", "default": true, "type": "boolean" }, "config": { "description": "Shared defaults inherited by every Target. GraphQL settings belong in spec.graphql.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project. Every Target inherits these defaults. Target.config is merged over them for one Target; top-level values replace defaults while cli, mcp, auth, readme, and package merge by field. GraphQL-only source settings live on the Project's Spec and are rejected in both stored config scopes.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "items": { "type": "string" }, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path segment, `**` any number), optionally after an HTTP method (`DELETE /zones/*`). Applied before the Spec size limit, with components nothing references any more removed, so a one-shot run can generate part of a Spec up to 64 MB. Selectors that match nothing are reported as generation warnings.", "maxItems": 100, "items": { "minLength": 1, "maxLength": 500, "type": "string" }, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`). Wins over `include`.", "maxItems": 100, "items": { "minLength": 1, "maxLength": 500, "type": "string" }, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "properties": { "max_retries": { "minimum": 0, "maximum": 10, "type": "integer" }, "statuses": { "description": "Replaces the default retryable set (408, 429, 500, 502, 503, 504).", "maxItems": 20, "items": { "type": "integer" }, "type": "array" }, "initial_delay_ms": { "minimum": 1, "type": "integer" }, "max_delay_ms": { "minimum": 1, "type": "integer" }, "retry_non_idempotent": { "description": "Also retry non-idempotent methods (POST/PATCH).", "type": "boolean" }, "disabled": { "description": "Shorthand for max_retries 0.", "type": "boolean" }, "operations": { "additionalProperties": { "description": "RetryTuning (recursive)" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "additionalProperties": { "anyOf": [{ "type": "object" }, { "description": "false disables pagination detection for the operation.", "type": "boolean" }] }, "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools. Stored Projects own the OAuth server, application catalog, and identity policy; one-shot generation accepts the same shape for one run. Runtime credentials and client secrets are never accepted.", "properties": { "oauth_server": { "anyOf": [{ "description": "Authorization-server metadata used by generated OAuth flows. Secrets and runtime credentials are never accepted here.", "type": "object" }, { "type": "null" }] }, "oauth_applications": { "description": "OAuth applications keyed by a stable name.", "additionalProperties": { "description": "OAuth application available to generated products. Public clients support interactive login; confidential clients support runtime-supplied machine credentials. Client secrets are never stored.", "type": "object" }, "type": ["object", "null"] }, "oauth_application": { "description": "Default OAuth application used by generated products.", "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "identity_verification": { "anyOf": [{ "description": "Authenticated identity read used to verify a login before it is saved. Operation is auto-detected when omitted or null. At least one of subject_field, account_field, or organization_field must be a non-null JSON Pointer. Null clears an individual mapping while another remains. Set identity_verification itself to null to remove the whole policy.", "example": { "subject_field": "/id", "account_field": "/account_id", "organization_field": "/organization_id" }, "type": "object" }, { "type": "null" }] }, "approval_url": { "format": "uri", "description": "Base URL of a custom browser-approval backend implementing the start, status, and revoke contract. Used only when OAuth is not configured.", "type": ["string", "null"] }, "environments": { "description": "Authentication selections keyed by generated API environment name.", "additionalProperties": { "description": "OAuth application and request-value overrides for one named API environment.", "type": "object" }, "type": ["object", "null"] }, "credential_variables": { "description": "Environment variables the generated CLI, MCP server, and SDK environment fallbacks read, keyed by security scheme name. A string names the token or key variable; a Basic scheme takes { username, password }. Wins over the scheme's x-typeship-env extension. Without either, names derive from the package and scheme.", "additionalProperties": { "anyOf": [{ "pattern": "^[A-Z_][A-Z0-9_]{0,127}$", "type": "string" }, { "type": "object" }] }, "type": ["object", "null"] }, "credential_parameters": { "description": "Whether a parameter carries the operation's credential, keyed by operationId, \"METHOD /path\", or \"*\" for every operation, then by the parameter's wire name. true leaves the parameter out of generated signatures, CLI flags, and MCP tool input, because the configured credential already reaches the API; false keeps it. Wins over the parameter's x-typeship-credential extension and the generator's inference.", "additionalProperties": { "type": "object" }, "type": ["object", "null"] } }, "additionalProperties": false, "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "properties": { "command_name": { "description": "Command users run, independent of how the CLI is distributed.", "type": ["string", "null"] }, "update_notice": { "description": "Opt in to a once-a-day registry check that prints an upgrade hint. Off by default; generated code phones nobody unless this is enabled.", "type": "boolean" }, "changelog_url": { "description": "Public HTTP(S) URL read by the optional changelog command in generated CLIs. Supports UTF-8 Markdown, plain text, and static HTML; embedded credentials are not allowed. Omit or clear to disable, then regenerate.", "type": ["string", "null"] }, "support_url": { "description": "Where the generated CLI's feedback command sends users. GitHub issues/new URLs get a prefilled title and environment details.", "type": ["string", "null"] }, "mcp_url": { "description": "Hosted MCP endpoint installed by the generated CLI instead of launching the package's local stdio server.", "type": ["string", "null"] }, "skills_repo": { "description": "GitHub owner/name of the skills package the generated CLI offers to install during init.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "properties": { "registry_name": { "description": "Stable official MCP registry name, independent of the server runtime.", "type": ["string", "null"] }, "access": { "description": "Authorization for callers connecting to a generated MCP server deployed over HTTP. The hosting application resolves upstream API credentials separately at runtime. This setting does not apply to the Typeship-hosted endpoint.", "properties": { "issuer": { "format": "uri", "description": "Exact issuer allowed to sign MCP connection tokens.", "type": "string" }, "resource": { "format": "uri", "description": "Canonical public URL of the self-hosted MCP endpoint that connection tokens must target.", "type": "string" }, "jwks_url": { "format": "uri", "description": "Public signing-key endpoint. Omit to discover it from the issuer.", "type": "string" }, "scopes": { "description": "Minimum scopes required to connect to the self-hosted MCP server.", "maxItems": 20, "type": "array" } }, "required": ["issuer", "resource"], "additionalProperties": false, "type": "object" }, "tool_mode": { "enum": ["auto", "operations", "meta"], "description": "MCP tool shape. meta collapses per-operation tools into search_docs, read_docs, and execute so large APIs don't flood an agent's context window. Auto considers the serialized tool schemas, switching near 10k tokens or above 100 operations.", "type": "string" }, "instructions": { "description": "Guidance appended to the MCP server's instructions, which agents read once when they connect (server/discover): what to call first, conventions the spec does not state, what not to do. Carried by the package's server and the hosted endpoint alike.", "maxLength": 2000, "type": ["string", "null"] }, "tool_descriptions": { "description": "Hand-written MCP tool descriptions keyed by operationId or \"METHOD /path\". Each replaces the text typeship derives for that operation (summary, first sentence, method and path, deprecation and auth notes). For flows the spec cannot describe, such as a multi-step upload. Keys that match no operation are reported as generation warnings.", "additionalProperties": { "maxLength": 600, "type": "string" }, "type": "object" }, "reference_resolvers": { "description": "Exact name-or-ID resolver overrides keyed first by the target operationId or \"METHOD /path\", then by its wire argument name. A resolver names one read collection operation plus 1-4 item fields to match case-insensitively; false opts that argument out of strict inference.", "additionalProperties": { "type": "object" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "properties": { "quickstart_operation": { "description": "operationId or \"METHOD /path\" to feature as the README's first API call. It must be present in the generated package and callable with no required input beyond path placeholders. Missing or unsuitable choices produce a warning and use the automatic example.", "maxLength": 500, "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "properties": { "title": { "description": "The API's name as generated READMEs, AGENTS.md, package descriptions, and help text show it, such as \"Parcel\" for a Spec titled \"Parcel - Public API\". Display only: package, client, and command names still come from the Spec. Defaults to the Spec title with common noise removed (\"Parcel - API\" shows as Parcel).", "maxLength": 100, "type": ["string", "null"] }, "homepage": { "description": "Homepage written into registry metadata.", "type": ["string", "null"] }, "license": { "description": "SPDX identifier written into registry metadata. Defaults to info.license.", "maxLength": 200, "type": ["string", "null"] }, "license_text": { "description": "Exact LICENSE file contents. Supply this for licences the engine does not build in; MIT is built in when copyright is also set.", "maxLength": 100000, "type": ["string", "null"] }, "copyright": { "description": "Copyright line used in generated license files.", "maxLength": 200, "type": ["string", "null"] }, "go_package_name": { "description": "Go identifier when the destination repository name is unsuitable.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] } }, "required": ["name", "spec", "targets"] }, "exampleArguments": { "name": "Parcel API", "spec": { "source": { "type": "url", "url": { "url": "https://api.parcel.example/openapi.json" } } }, "targets": [{ "name": "Parcel CLI", "type": "cli", "deliveries": [{ "type": "repository", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": false } }] }] }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "project", "type": "string" }, "name": { "maxLength": 80, "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "auto_generate": { "description": "Regenerate when the Spec or saved configuration changes.", "type": "boolean" }, "config": { "description": "Shared defaults inherited by every Target.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path se…", "maxItems": 100, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`).", "maxItems": 100, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the project configuration last changed.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
5
+ { "resource": "projects", "method": "list", "command": ["projects", "list"], "tool": "projects_list", "httpMethod": "GET", "path": "/projects", "summary": "List Projects", "toolDescription": "List Projects. GET /projects (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "description": "Project-owned identity, Spec reference, generation controls, and shared configuration. Targets and Deliveries are available only through their canonical Target endpoints.", "properties": { "id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "project", "type": "string" }, "name": { "maxLength": 80, "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "auto_generate": { "description": "Regenerate when the Spec or saved configuration changes. Enabled by default for new Projects. Set false to generate only when requested.", "type": "boolean" }, "config": { "description": "Shared defaults inherited by every Target. A Target's config overrides these defaults; GraphQL settings remain Spec-owned.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project. Every Target inherits these defaults. Target.config is merged over them for one Target; top-level values replace defaults while cli, mcp, auth, readme, and package merge by field. GraphQL-only source settings live on the Project's Spec and are rejected in both stored config scopes.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path segment, `**` any number), optionally after an HTTP method (`DELETE /zones/*`). Applied before the Spec size limit, with components nothing references any more removed, so a one-shot run can generate part of a Spec up to 64 MB. Selectors that match nothing are reported as generation warnings.", "maxItems": 100, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`). Wins over `include`.", "maxItems": 100, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools. Stored Projects own the OAuth server, application catalog, and identity policy; one-shot generation accepts the same shape for one run. Runtime credentials and client secrets are never accepted.", "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the project configuration last changed.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
6
+ { "resource": "projects", "method": "get", "command": ["projects", "get"], "tool": "projects_get", "httpMethod": "GET", "path": "/projects/{project_id}", "summary": "Get a Project", "description": "Returns the Project's settings and Spec ID. List its Targets separately to retrieve Target configuration and Deliveries.", "toolDescription": "Get a Project. Returns the Project's settings and Spec ID. GET /projects/{project_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "project_id", "ts": "projectId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" } }, "required": ["project_id"] }, "exampleArguments": { "project_id": "prj_4f8k2m7x9q1v6b3n" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "project", "type": "string" }, "name": { "maxLength": 80, "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "auto_generate": { "description": "Regenerate when the Spec or saved configuration changes.", "type": "boolean" }, "config": { "description": "Shared defaults inherited by every Target.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path se…", "maxItems": 100, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`).", "maxItems": 100, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the project configuration last changed.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
7
+ { "resource": "projects", "method": "update", "command": ["projects", "update"], "tool": "projects_update", "httpMethod": "PATCH", "path": "/projects/{project_id}", "summary": "Update a Project", "description": "Omitted fields keep their current values. A supplied config replaces the entire stored object; null or an empty object clears it.\nWith auto_generate enabled, changing shared config queues a Generation for each Target whose effective config changes. A queued or running Target reuses that Generation.\nOmitting If-Match applies the update to the current resource; with If-Match, a stale ETag returns 412 precondition_failed without saving.\n\nA `409 target_busy` means a Target is publishing. Retrieve the Project, wait for publishing to finish, reconcile your update, and retry.\nA `502 follow_up_failed` means the Project was saved, but an obsolete Draft pull request could not be retired. Retrieve the Project and retry the same update to finish retiring reviews if that update is still desired.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Update a Project. Omitted fields keep their current values. PATCH /projects/{project_id}", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "project_id", "ts": "projectId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }, { "name": "name", "ts": "name", "kind": "body", "type": "string", "required": false, "flag": "name" }, { "name": "auto_generate", "ts": "auto_generate", "kind": "body", "type": "boolean", "required": false, "flag": "auto-generate" }, { "name": "config", "ts": "config", "kind": "body", "type": "json", "required": false, "nullable": true, "description": "Replaces the Project's shared Target defaults. Send null to clear them.", "flag": "config" }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." }, "name": { "minLength": 1, "maxLength": 80, "type": "string" }, "auto_generate": { "type": "boolean", "example": false }, "config": { "description": "Replaces the Project's shared Target defaults. Send null to clear them.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project. Every Target inherits these defaults. Target.config is merged over them for one Target; top-level values replace defaults while cli, mcp, auth, readme, and package merge by field. GraphQL-only source settings live on the Project's Spec and are rejected in both stored config scopes.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "items": { "type": "string" }, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path segment, `**` any number), optionally after an HTTP method (`DELETE /zones/*`). Applied before the Spec size limit, with components nothing references any more removed, so a one-shot run can generate part of a Spec up to 64 MB. Selectors that match nothing are reported as generation warnings.", "maxItems": 100, "items": { "minLength": 1, "maxLength": 500, "type": "string" }, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`). Wins over `include`.", "maxItems": 100, "items": { "minLength": 1, "maxLength": 500, "type": "string" }, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "properties": { "max_retries": { "minimum": 0, "maximum": 10, "type": "integer" }, "statuses": { "description": "Replaces the default retryable set (408, 429, 500, 502, 503, 504).", "maxItems": 20, "items": { "type": "integer" }, "type": "array" }, "initial_delay_ms": { "minimum": 1, "type": "integer" }, "max_delay_ms": { "minimum": 1, "type": "integer" }, "retry_non_idempotent": { "description": "Also retry non-idempotent methods (POST/PATCH).", "type": "boolean" }, "disabled": { "description": "Shorthand for max_retries 0.", "type": "boolean" }, "operations": { "additionalProperties": { "description": "RetryTuning (recursive)" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "additionalProperties": { "anyOf": [{ "type": "object" }, { "description": "false disables pagination detection for the operation.", "type": "boolean" }] }, "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools. Stored Projects own the OAuth server, application catalog, and identity policy; one-shot generation accepts the same shape for one run. Runtime credentials and client secrets are never accepted.", "properties": { "oauth_server": { "anyOf": [{ "description": "Authorization-server metadata used by generated OAuth flows. Secrets and runtime credentials are never accepted here.", "type": "object" }, { "type": "null" }] }, "oauth_applications": { "description": "OAuth applications keyed by a stable name.", "additionalProperties": { "description": "OAuth application available to generated products. Public clients support interactive login; confidential clients support runtime-supplied machine credentials. Client secrets are never stored.", "type": "object" }, "type": ["object", "null"] }, "oauth_application": { "description": "Default OAuth application used by generated products.", "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "identity_verification": { "anyOf": [{ "description": "Authenticated identity read used to verify a login before it is saved. Operation is auto-detected when omitted or null. At least one of subject_field, account_field, or organization_field must be a non-null JSON Pointer. Null clears an individual mapping while another remains. Set identity_verification itself to null to remove the whole policy.", "example": { "subject_field": "/id", "account_field": "/account_id", "organization_field": "/organization_id" }, "type": "object" }, { "type": "null" }] }, "approval_url": { "format": "uri", "description": "Base URL of a custom browser-approval backend implementing the start, status, and revoke contract. Used only when OAuth is not configured.", "type": ["string", "null"] }, "environments": { "description": "Authentication selections keyed by generated API environment name.", "additionalProperties": { "description": "OAuth application and request-value overrides for one named API environment.", "type": "object" }, "type": ["object", "null"] }, "credential_variables": { "description": "Environment variables the generated CLI, MCP server, and SDK environment fallbacks read, keyed by security scheme name. A string names the token or key variable; a Basic scheme takes { username, password }. Wins over the scheme's x-typeship-env extension. Without either, names derive from the package and scheme.", "additionalProperties": { "anyOf": [{ "pattern": "^[A-Z_][A-Z0-9_]{0,127}$", "type": "string" }, { "type": "object" }] }, "type": ["object", "null"] }, "credential_parameters": { "description": "Whether a parameter carries the operation's credential, keyed by operationId, \"METHOD /path\", or \"*\" for every operation, then by the parameter's wire name. true leaves the parameter out of generated signatures, CLI flags, and MCP tool input, because the configured credential already reaches the API; false keeps it. Wins over the parameter's x-typeship-credential extension and the generator's inference.", "additionalProperties": { "type": "object" }, "type": ["object", "null"] } }, "additionalProperties": false, "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "properties": { "command_name": { "description": "Command users run, independent of how the CLI is distributed.", "type": ["string", "null"] }, "update_notice": { "description": "Opt in to a once-a-day registry check that prints an upgrade hint. Off by default; generated code phones nobody unless this is enabled.", "type": "boolean" }, "changelog_url": { "description": "Public HTTP(S) URL read by the optional changelog command in generated CLIs. Supports UTF-8 Markdown, plain text, and static HTML; embedded credentials are not allowed. Omit or clear to disable, then regenerate.", "type": ["string", "null"] }, "support_url": { "description": "Where the generated CLI's feedback command sends users. GitHub issues/new URLs get a prefilled title and environment details.", "type": ["string", "null"] }, "mcp_url": { "description": "Hosted MCP endpoint installed by the generated CLI instead of launching the package's local stdio server.", "type": ["string", "null"] }, "skills_repo": { "description": "GitHub owner/name of the skills package the generated CLI offers to install during init.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "properties": { "registry_name": { "description": "Stable official MCP registry name, independent of the server runtime.", "type": ["string", "null"] }, "access": { "description": "Authorization for callers connecting to a generated MCP server deployed over HTTP. The hosting application resolves upstream API credentials separately at runtime. This setting does not apply to the Typeship-hosted endpoint.", "properties": { "issuer": { "format": "uri", "description": "Exact issuer allowed to sign MCP connection tokens.", "type": "string" }, "resource": { "format": "uri", "description": "Canonical public URL of the self-hosted MCP endpoint that connection tokens must target.", "type": "string" }, "jwks_url": { "format": "uri", "description": "Public signing-key endpoint. Omit to discover it from the issuer.", "type": "string" }, "scopes": { "description": "Minimum scopes required to connect to the self-hosted MCP server.", "maxItems": 20, "type": "array" } }, "required": ["issuer", "resource"], "additionalProperties": false, "type": "object" }, "tool_mode": { "enum": ["auto", "operations", "meta"], "description": "MCP tool shape. meta collapses per-operation tools into search_docs, read_docs, and execute so large APIs don't flood an agent's context window. Auto considers the serialized tool schemas, switching near 10k tokens or above 100 operations.", "type": "string" }, "instructions": { "description": "Guidance appended to the MCP server's instructions, which agents read once when they connect (server/discover): what to call first, conventions the spec does not state, what not to do. Carried by the package's server and the hosted endpoint alike.", "maxLength": 2000, "type": ["string", "null"] }, "tool_descriptions": { "description": "Hand-written MCP tool descriptions keyed by operationId or \"METHOD /path\". Each replaces the text typeship derives for that operation (summary, first sentence, method and path, deprecation and auth notes). For flows the spec cannot describe, such as a multi-step upload. Keys that match no operation are reported as generation warnings.", "additionalProperties": { "maxLength": 600, "type": "string" }, "type": "object" }, "reference_resolvers": { "description": "Exact name-or-ID resolver overrides keyed first by the target operationId or \"METHOD /path\", then by its wire argument name. A resolver names one read collection operation plus 1-4 item fields to match case-insensitively; false opts that argument out of strict inference.", "additionalProperties": { "type": "object" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "properties": { "quickstart_operation": { "description": "operationId or \"METHOD /path\" to feature as the README's first API call. It must be present in the generated package and callable with no required input beyond path placeholders. Missing or unsuitable choices produce a warning and use the automatic example.", "maxLength": 500, "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "properties": { "title": { "description": "The API's name as generated READMEs, AGENTS.md, package descriptions, and help text show it, such as \"Parcel\" for a Spec titled \"Parcel - Public API\". Display only: package, client, and command names still come from the Spec. Defaults to the Spec title with common noise removed (\"Parcel - API\" shows as Parcel).", "maxLength": 100, "type": ["string", "null"] }, "homepage": { "description": "Homepage written into registry metadata.", "type": ["string", "null"] }, "license": { "description": "SPDX identifier written into registry metadata. Defaults to info.license.", "maxLength": 200, "type": ["string", "null"] }, "license_text": { "description": "Exact LICENSE file contents. Supply this for licences the engine does not build in; MIT is built in when copyright is also set.", "maxLength": 100000, "type": ["string", "null"] }, "copyright": { "description": "Copyright line used in generated license files.", "maxLength": 200, "type": ["string", "null"] }, "go_package_name": { "description": "Go identifier when the destination repository name is unsuitable.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] } }, "required": ["project_id"] }, "exampleArguments": { "project_id": "prj_4f8k2m7x9q1v6b3n", "auto_generate": false }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "project", "type": "string" }, "name": { "maxLength": 80, "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "auto_generate": { "description": "Regenerate when the Spec or saved configuration changes.", "type": "boolean" }, "config": { "description": "Shared defaults inherited by every Target.", "anyOf": [{ "description": "Shared generated-client and tooling behavior for a stored Project.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path se…", "maxItems": 100, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`).", "maxItems": 100, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the project configuration last changed.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
8
+ { "resource": "projects", "method": "delete", "command": ["projects", "delete"], "tool": "projects_delete", "httpMethod": "DELETE", "path": "/projects/{project_id}", "summary": "Delete a Project", "description": "A `502 repository_unavailable` means the Project was not deleted because its Draft pull requests could not be retired. Retry deletion to finish retiring the remaining reviews. Repeating a completed deletion returns `404`.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Delete a Project. A `502 repository_unavailable` means the Project was not deleted because its Draft pull requests could not be retired. DELETE /projects/{project_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "destructive", "params": [{ "name": "project_id", "ts": "projectId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." } }, "required": ["project_id"] }, "exampleArguments": { "project_id": "prj_4f8k2m7x9q1v6b3n" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "project", "type": "string" }, "deleted": { "const": true, "type": "boolean" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
9
+ { "resource": "projects", "method": "generate", "command": ["projects", "generate"], "tool": "projects_generate", "httpMethod": "POST", "path": "/projects/{project_id}/generate", "summary": "Generate a Project's Targets", "description": "Queues one Generation per active Target and returns their IDs. Retrieve each Generation until its status moves from `queued` to `running` and then `completed` or `failed`. `completed` means generated files are saved; check Delivery and Draft status separately for repository delivery and pull requests. A Target already queued or running is returned without starting another Generation. A `409 targets_inactive` means the Project has no active Target to generate. A matching Idempotency-Key replay returns the same Generations with their current statuses.\n\nIf the package already matches a destination and no Draft is open, delivery creates no commit, branch, or pull request. An existing Draft stays open. Automatic generation uses the same workflow.", "toolDescription": "Generate a Project's Targets. Queues one Generation per active Target and returns their IDs. POST /projects/{project_id}/generate", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "project_id", "ts": "projectId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }, { "name": "target_id", "ts": "target_id", "kind": "body", "type": "string", "required": false, "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" }, "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" } }, "required": ["project_id"] }, "exampleArguments": { "project_id": "prj_4f8k2m7x9q1v6b3n", "target_id": "tgt_5m8q2v7k1p9d4h6c" }, "outputSchema": { "description": "One Generation per selected Target. Retrieve each Generation for current status and generated files.", "properties": { "data": { "items": { "properties": { "id": { "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "generation", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "A Generation moves from queued to running, then completes when its files are saved or fails. Delivery and Draft status are separate.", "type": "string" }, "trigger": { "enum": ["manual", "spec_changed", "config_changed", "preview"], "type": "string" }, "target_id": { "anyOf": [{ "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target. This is configuration, not identity; several Targets may use the same generator. cli is the TypeScript CLI; go_cli is the native Go CLI, a distinct product that imports one exact paired Go SDK module rather than a client of its own.", "type": "string" }, "name": { "description": "Package name; null until known.", "type": ["string", "null"] }, "version": { "description": "Package version; null until known.", "type": ["string", "null"] }, "warnings": { "items": { "type": "object" }, "type": "array" }, "coverage": { "description": "Operation coverage; null until generation has finished.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "file_count": { "description": "Generated package files. List them with listGenerationFiles.", "minimum": 0, "type": "integer" }, "errors": { "items": { "type": "object" }, "type": "array" }, "runtime_ms": { "description": "Milliseconds from the start of the run until it completed or failed; null while queued or running.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
10
+ { "resource": "specs", "method": "get", "command": ["specs", "get"], "tool": "specs_get", "httpMethod": "GET", "path": "/specs/{spec_id}", "summary": "Get a Spec", "toolDescription": "Get a Spec. GET /specs/{spec_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "spec_id", "ts": "specId", "kind": "path", "type": "string", "required": true, "flag": "spec-id" }], "inputSchema": { "type": "object", "properties": { "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" } }, "required": ["spec_id"] }, "exampleArguments": { "spec_id": "spec_2p8m4q7k1v9d6h3c" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "spec", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "source": { "description": "The single source of truth for where a Project's Spec lives.", "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "properties": { "url": { "format": "uri", "description": "URL fetched for every generation.", "maxLength": 2048, "pattern": "^https?://", "type": "string" }, "headers_configured": { "description": "Whether Typeship has stored write-only request headers for this URL.", "type": "boolean" } }, "type": "object" } }, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "path": { "description": "Repository-relative Spec entrypoint.", "minLength": 1, "maxLength": 4096, "pattern": "^(?!/)(?!.*\\.\\.).+$", "type": "string" } }, "type": "object" } }, "type": "object" }] }, "format": { "enum": ["openapi", "graphql", null], "type": ["string", "null"] }, "patches": { "items": { "description": "A fix applied to the resolved Spec before generation.", "examples": [{ "op": "remove", "path": "/components/schemas/Legacy" }], "properties": { "op": { "enum": ["set", "append", "remove", "rename"], "type": "string" }, "path": { "description": "JSON-Pointer-style path.", "type": "string" }, "value": { "description": "set only; the replacement value." }, "to": { "description": "rename only; the new key name.", "type": ["string", "null"] }, "reason": { "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "graphql": { "anyOf": [{ "description": "What a GraphQL schema cannot say about itself.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production).", "maxItems": 10, "items": { "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "basic_api_key", "api_key", "api_key_or_bearer", "none"], "description": "How requests authenticate.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key or api_key_or_bearer.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient).", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" }, "error_types": { "description": "Object types that report a failure when an operation's union or interface result resolves to them (…", "maxItems": 100, "uniqueItems": true, "items": { "pattern": "^[_A-Za-z][_0-9A-Za-z]*$", "type": "string" }, "type": "array" }, "page_size": { "description": "Page size a paginated connection call sends as first when the caller passes neither first nor last.", "default": 100, "minimum": 1, "maximum": 1000, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "diagnostic_policy": { "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed ru…", "properties": { "fail_on": { "enum": ["never", "error", "warning"], "description": "Severity threshold that fails the API change review check.", "default": "error", "type": "string" }, "only_new": { "description": "Enforce only occurrences introduced by the proposed source change.", "default": true, "type": "boolean" }, "suppressions": { "default": [], "maxItems": 100, "items": { "properties": { "rule_id": { "maxLength": 160, "type": "string" }, "path": { "description": "Exact schema coordinate.", "maxLength": 4096, "type": "string" }, "reason": { "description": "The reviewed product decision behind this exception.", "minLength": 1, "maxLength": 500, "type": "string" } }, "type": "object" }, "type": "array" } }, "type": "object" }, "revision_latest_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
11
+ { "resource": "specs", "method": "update", "command": ["specs", "update"], "tool": "specs_update", "httpMethod": "PATCH", "path": "/specs/{spec_id}", "summary": "Update a Spec", "description": "Resolves the source files before saving the update and records a new Spec Revision when the source changes.\nOmitted fields remain unchanged; supplied objects and arrays replace the whole field.\nIf the Spec or its Project configuration changes during validation, returns 409 resource_changed without saving the rejected update. Retrieve the current Spec and Project, reconcile your changes,\nand submit a new request with a new Idempotency-Key if using one.\n\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Update a Spec. Resolves the source files before saving the update and records a new Spec Revision when the source changes. PATCH /specs/{spec_id}", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "spec_id", "ts": "specId", "kind": "path", "type": "string", "required": true, "flag": "spec-id" }, { "name": "source", "ts": "source", "kind": "body", "type": "json", "required": false, "flag": "source" }, { "name": "patches", "ts": "patches", "kind": "body", "type": "array", "required": false, "items": { "type": "object" }, "description": "Replace all patches in order. An empty array removes every patch; null is invalid.", "flag": "patches" }, { "name": "graphql", "ts": "graphql", "kind": "body", "type": "json", "required": false, "nullable": true, "description": "Replace all GraphQL settings. Null or an empty object clears them.", "flag": "graphql" }, { "name": "diagnostic_policy", "ts": "diagnostic_policy", "kind": "body", "type": "object", "required": false, "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed rule or location exceptions.", "flag": "diagnostic-policy" }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." }, "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "source": { "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "properties": { "url": { "format": "uri", "description": "URL of an OpenAPI document, GraphQL SDL file, or GraphQL endpoint.", "maxLength": 2048, "pattern": "^https?://", "type": "string" }, "headers": { "description": "Request headers for a protected URL. Values are never returned or recorded in revision history. When updating the same URL, omit headers to preserve the stored values or pass null to remove them. Changing the URL without headers clears the old values so a credential is never forwarded to a different source.", "anyOf": [{ "type": "object" }, { "type": "null" }] } }, "required": ["url"], "additionalProperties": false, "type": "object" } }, "required": ["type", "url"], "additionalProperties": false, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "path": { "description": "Repository-relative Spec entrypoint.", "minLength": 1, "maxLength": 4096, "pattern": "^(?!/)(?!.*\\.\\.).+$", "type": "string" } }, "required": ["provider", "identifier", "path"], "additionalProperties": false, "type": "object" } }, "required": ["type", "repository"], "additionalProperties": false, "type": "object" }], "example": { "type": "url", "url": { "url": "https://api.parcel.example/openapi.json" } } }, "patches": { "description": "Replace all patches in order. An empty array removes every patch; null is invalid.", "maxItems": 50, "items": { "description": "A fix applied to the resolved Spec before generation. Paths are JSON\nPointers into the document. A patch whose target no longer exists is\nskipped and reported as a warning on the generation, never silently.", "examples": [{ "op": "remove", "path": "/components/schemas/Legacy" }], "properties": { "op": { "enum": ["set", "append", "remove", "rename"], "type": "string" }, "path": { "description": "JSON-Pointer-style path. Pattern segments enable bulk fixes:\n* (any child), ** (any depth), [key=value] (filter), e.g.\n/paths/**/parameters/[name=account_id]/schema/type. Renaming a\nschema under /components/schemas also rewrites its $refs.", "type": "string" }, "value": { "description": "set only; the replacement value." }, "to": { "description": "rename only; the new key name.", "type": ["string", "null"] }, "reason": { "type": ["string", "null"] } }, "required": ["op", "path"], "additionalProperties": false, "type": "object" }, "type": "array" }, "graphql": { "description": "Replace all GraphQL settings. Null or an empty object clears them.", "anyOf": [{ "description": "What a GraphQL schema cannot say about itself. Ignored for OpenAPI specs.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl. Defaults to the URL the schema was fetched from. Without either, baseUrl is a required client option.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production). Each becomes a client environment; the first is the default unless endpoint is set.", "maxItems": 10, "items": { "properties": { "name": { "type": "string" }, "url": { "format": "uri", "type": "string" } }, "required": ["name", "url"], "additionalProperties": false, "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "basic_api_key", "api_key", "api_key_or_bearer", "none"], "description": "How requests authenticate. bearer sends Authorization: Bearer; basic is for key-pair APIs (public key as username, private key as password); basic_api_key sends one API key as the Basic-auth username with an empty password; api_key sends a header named by api_key_header; api_key_or_bearer sends a key in api_key_header (Authorization for a raw key) and also accepts an OAuth access token as Authorization: Bearer; none generates no auth option.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key or api_key_or_bearer. Required for those modes; Typeship does not invent a vendor-specific header name.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient). Defaults to a name derived from the endpoint's host.", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name. Unmapped scalars generate as the language's untyped JSON value and produce a warning. Unmatched keys warn.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" }, "error_types": { "description": "Object types that report a failure when an operation's union or interface result resolves to them (errors returned as data). Replaces the default, which is every member whose name ends in Error when the result can also be something else. An empty array treats no result as a failure. Names that are not object types in the schema produce a generation warning.", "maxItems": 100, "uniqueItems": true, "items": { "pattern": "^[_A-Za-z][_0-9A-Za-z]*$", "type": "string" }, "type": "array" }, "page_size": { "description": "Page size a paginated connection call sends as first when the caller passes neither first nor last. Relay servers such as GitHub reject a connection query without one. Ignored for a connection whose first argument has a schema default.", "default": 100, "minimum": 1, "maximum": 1000, "type": "integer" } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "diagnostic_policy": { "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed rule or location exceptions.", "properties": { "fail_on": { "enum": ["never", "error", "warning"], "description": "Severity threshold that fails the API change review check.", "default": "error", "type": "string" }, "only_new": { "description": "Enforce only occurrences introduced by the proposed source change.", "default": true, "type": "boolean" }, "suppressions": { "default": [], "maxItems": 100, "items": { "properties": { "rule_id": { "maxLength": 160, "type": "string" }, "path": { "description": "Exact schema coordinate. Omit only to suppress every occurrence of the rule.", "maxLength": 4096, "type": "string" }, "reason": { "description": "The reviewed product decision behind this exception.", "minLength": 1, "maxLength": 500, "type": "string" } }, "required": ["rule_id", "reason"], "additionalProperties": false, "type": "object" }, "type": "array" } }, "required": ["fail_on", "only_new", "suppressions"], "additionalProperties": false, "type": "object" } }, "required": ["spec_id"] }, "exampleArguments": { "spec_id": "spec_2p8m4q7k1v9d6h3c", "source": { "type": "url", "url": { "url": "https://api.parcel.example/openapi.json" } } }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "spec", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "source": { "description": "The single source of truth for where a Project's Spec lives.", "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "properties": { "url": { "format": "uri", "description": "URL fetched for every generation.", "maxLength": 2048, "pattern": "^https?://", "type": "string" }, "headers_configured": { "description": "Whether Typeship has stored write-only request headers for this URL.", "type": "boolean" } }, "type": "object" } }, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "path": { "description": "Repository-relative Spec entrypoint.", "minLength": 1, "maxLength": 4096, "pattern": "^(?!/)(?!.*\\.\\.).+$", "type": "string" } }, "type": "object" } }, "type": "object" }] }, "format": { "enum": ["openapi", "graphql", null], "type": ["string", "null"] }, "patches": { "items": { "description": "A fix applied to the resolved Spec before generation.", "examples": [{ "op": "remove", "path": "/components/schemas/Legacy" }], "properties": { "op": { "enum": ["set", "append", "remove", "rename"], "type": "string" }, "path": { "description": "JSON-Pointer-style path.", "type": "string" }, "value": { "description": "set only; the replacement value." }, "to": { "description": "rename only; the new key name.", "type": ["string", "null"] }, "reason": { "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "graphql": { "anyOf": [{ "description": "What a GraphQL schema cannot say about itself.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production).", "maxItems": 10, "items": { "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "basic_api_key", "api_key", "api_key_or_bearer", "none"], "description": "How requests authenticate.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key or api_key_or_bearer.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient).", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" }, "error_types": { "description": "Object types that report a failure when an operation's union or interface result resolves to them (…", "maxItems": 100, "uniqueItems": true, "items": { "pattern": "^[_A-Za-z][_0-9A-Za-z]*$", "type": "string" }, "type": "array" }, "page_size": { "description": "Page size a paginated connection call sends as first when the caller passes neither first nor last.", "default": 100, "minimum": 1, "maximum": 1000, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "diagnostic_policy": { "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed ru…", "properties": { "fail_on": { "enum": ["never", "error", "warning"], "description": "Severity threshold that fails the API change review check.", "default": "error", "type": "string" }, "only_new": { "description": "Enforce only occurrences introduced by the proposed source change.", "default": true, "type": "boolean" }, "suppressions": { "default": [], "maxItems": 100, "items": { "properties": { "rule_id": { "maxLength": 160, "type": "string" }, "path": { "description": "Exact schema coordinate.", "maxLength": 4096, "type": "string" }, "reason": { "description": "The reviewed product decision behind this exception.", "minLength": 1, "maxLength": 500, "type": "string" } }, "type": "object" }, "type": "array" } }, "type": "object" }, "revision_latest_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
12
+ { "resource": "specs", "method": "refresh", "command": ["specs", "refresh"], "tool": "specs_refresh", "httpMethod": "POST", "path": "/specs/{spec_id}/refresh", "summary": "Refresh a Spec", "description": "Fetches the configured source now and creates a new Spec Revision only when its content changes. Diagnostics then reads that revision. If automatic generation is enabled, refresh queues generation for active Targets even when the source is unchanged. A `502 follow_up_failed` means the new Spec Revision was recorded but generation could not be queued.", "toolDescription": "Refresh a Spec. Fetches the configured source now and creates a new Spec Revision only when its content changes. POST /specs/{spec_id}/refresh", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "spec_id", "ts": "specId", "kind": "path", "type": "string", "required": true, "flag": "spec-id" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." } }, "required": ["spec_id"] }, "exampleArguments": { "spec_id": "spec_2p8m4q7k1v9d6h3c" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "spec", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "source": { "description": "The single source of truth for where a Project's Spec lives.", "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "properties": { "url": { "format": "uri", "description": "URL fetched for every generation.", "maxLength": 2048, "pattern": "^https?://", "type": "string" }, "headers_configured": { "description": "Whether Typeship has stored write-only request headers for this URL.", "type": "boolean" } }, "type": "object" } }, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "path": { "description": "Repository-relative Spec entrypoint.", "minLength": 1, "maxLength": 4096, "pattern": "^(?!/)(?!.*\\.\\.).+$", "type": "string" } }, "type": "object" } }, "type": "object" }] }, "format": { "enum": ["openapi", "graphql", null], "type": ["string", "null"] }, "patches": { "items": { "description": "A fix applied to the resolved Spec before generation.", "examples": [{ "op": "remove", "path": "/components/schemas/Legacy" }], "properties": { "op": { "enum": ["set", "append", "remove", "rename"], "type": "string" }, "path": { "description": "JSON-Pointer-style path.", "type": "string" }, "value": { "description": "set only; the replacement value." }, "to": { "description": "rename only; the new key name.", "type": ["string", "null"] }, "reason": { "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "graphql": { "anyOf": [{ "description": "What a GraphQL schema cannot say about itself.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production).", "maxItems": 10, "items": { "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "basic_api_key", "api_key", "api_key_or_bearer", "none"], "description": "How requests authenticate.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key or api_key_or_bearer.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient).", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" }, "error_types": { "description": "Object types that report a failure when an operation's union or interface result resolves to them (…", "maxItems": 100, "uniqueItems": true, "items": { "pattern": "^[_A-Za-z][_0-9A-Za-z]*$", "type": "string" }, "type": "array" }, "page_size": { "description": "Page size a paginated connection call sends as first when the caller passes neither first nor last.", "default": 100, "minimum": 1, "maximum": 1000, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "diagnostic_policy": { "description": "Source pull-request enforcement threshold, new-versus-complete baseline, and explicitly reviewed ru…", "properties": { "fail_on": { "enum": ["never", "error", "warning"], "description": "Severity threshold that fails the API change review check.", "default": "error", "type": "string" }, "only_new": { "description": "Enforce only occurrences introduced by the proposed source change.", "default": true, "type": "boolean" }, "suppressions": { "default": [], "maxItems": 100, "items": { "properties": { "rule_id": { "maxLength": 160, "type": "string" }, "path": { "description": "Exact schema coordinate.", "maxLength": 4096, "type": "string" }, "reason": { "description": "The reviewed product decision behind this exception.", "minLength": 1, "maxLength": 500, "type": "string" } }, "type": "object" }, "type": "array" } }, "type": "object" }, "revision_latest_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
13
+ { "resource": "specRevisions", "method": "list", "command": ["spec-revisions", "list"], "tool": "spec_revisions_list", "httpMethod": "GET", "path": "/spec-revisions", "summary": "List Spec Revisions", "description": "Lists Spec Revisions, newest first. Source content is not included; list a revision's files with listSpecRevisionFiles.", "toolDescription": "List Spec Revisions. Lists Spec Revisions, newest first. GET /spec-revisions (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "spec_id", "ts": "specId", "kind": "query", "type": "string", "required": false, "description": "Only revisions of this Spec.", "flag": "spec-id" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "id": { "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "spec_revision", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "format": { "enum": ["openapi", "graphql"], "type": "string" }, "file_count": { "minimum": 1, "type": "integer" }, "sha256": { "description": "SHA-256 digest of every source file path, digest, and size in the resolved graph.", "examples": ["9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"], "pattern": "^[a-f0-9]{64}$", "type": "string" }, "size_bytes": { "description": "Total bytes across all source files.", "minimum": 0, "type": "integer" }, "source": { "description": "Origin recorded when this immutable revision was created.", "anyOf": [{ "anyOf": [{ "type": "object" }, { "type": "object" }] }, { "type": "null" }] }, "diagnostic_summary": { "description": "Counts of grouped Diagnostics, one per rule. Retrieve the revision with include=diagnostics for each Diagnostic.", "properties": { "status": { "enum": ["passed", "blocked"], "description": "passed: no Diagnostic fails the Spec's Diagnostic policy. blocked: at least one does; retrieve with include=diagnostics and fix those marked blocking.", "type": "string" }, "error_count": { "description": "Diagnostics reporting invalid behavior.", "minimum": 0, "type": "integer" }, "warning_count": { "description": "Diagnostics reporting material risk.", "minimum": 0, "type": "integer" }, "suggestion_count": { "description": "Diagnostics suggesting an improvement.", "minimum": 0, "type": "integer" }, "blocking_count": { "description": "Diagnostics that fail the Spec's Diagnostic policy.", "minimum": 0, "type": "integer" }, "baseline_spec_revision_id": { "description": "The previous revision of this Spec that introduced Diagnostics are compared with, or null for the first revision.", "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] } }, "type": "object" }, "diagnostics": { "description": "Present only with include=diagnostics. Ordered by severity, then rule identifier.", "items": { "description": "Every occurrence of one Diagnostic rule in a Spec Revision, grouped into one decision. Diagnostics are evaluated when read, using the Spec's current patches and Diagnostic policy.", "properties": { "id": { "description": "Stable rule identifier, unique within a Spec Revision. Suppressions name it as rule_id.", "type": "string" }, "object": { "const": "diagnostic", "type": "string" }, "blocking": { "description": "Whether any location fails the Spec's Diagnostic policy. Each location's blocking field names which ones. Suppressed locations and, when only_new is set, locations present in the baseline never block.", "type": "boolean" }, "introduced": { "description": "Whether any location is new since baseline_spec_revision_id in the Diagnostic summary. Each location's introduced field names which ones. Always true when there is no baseline.", "type": "boolean" }, "severity": { "enum": ["error", "warning", "suggestion"], "description": "Whether the rule reports invalid behavior, material risk, or an improvement.", "type": "string" }, "category": { "enum": ["correctness", "sdk_ergonomics", "agent_usability", "safety"], "description": "Product dimension affected by the diagnostic.", "type": "string" }, "title": { "description": "Concise statement of the root cause.", "type": "string" }, "message": { "description": "One explanation of the finding and why it matters.", "type": "string" }, "surfaces": { "description": "Public surfaces affected by the root cause.", "uniqueItems": true, "type": "array" }, "owner_decision_required": { "description": "Whether remediation requires intent that the Spec cannot prove.", "type": "boolean" }, "locations": { "description": "The affected coordinates, kept under one grouped Diagnostic. With a filter, only the matching locations.", "minItems": 1, "type": "array" }, "fix": { "description": "A reviewable remediation that does not invent API behavior.", "type": "object" }, "authoring_brief": { "description": "Grounded instructions an agent can use to edit the source. The brief preserves existing behavior and requires owner input when the contract cannot prove the missing product decision.", "type": "string" } }, "type": "object" }, "type": "array" }, "patch_diagnostics": { "description": "Present only with include=diagnostics. Coded misses or conflicts from applying the Spec's patches to this revision.", "items": { "properties": { "code": { "enum": ["unsupported_format", "invalid_document", "invalid_patch", "no_match", "append_target_type", "rename_target_type", "rename_conflict"], "type": "string" }, "message": { "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
14
+ { "resource": "specRevisions", "method": "get", "command": ["spec-revisions", "get"], "tool": "spec_revisions_get", "httpMethod": "GET", "path": "/spec-revisions/{spec_revision_id}", "summary": "Get a Spec Revision", "description": "Returns metadata for a saved Spec Revision with a Diagnostics summary. Pass `include=diagnostics` to add every Diagnostic, evaluated with the Spec's current patches and Diagnostic policy. Add `filter=blocking` to receive only the locations that fail the policy, which is what to fix when `diagnostic_summary.status` is blocked. List its source files and resolved document with listSpecRevisionFiles.", "toolDescription": "Get a Spec Revision. Returns metadata for a saved Spec Revision with a Diagnostics summary. GET /spec-revisions/{spec_revision_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "spec_revision_id", "ts": "specRevisionId", "kind": "path", "type": "string", "required": true, "flag": "spec-revision-id" }, { "name": "include", "ts": "include", "kind": "query", "type": "string", "required": false, "enum": ["diagnostics"], "description": "Add related data to the response. `diagnostics` adds the `diagnostics` and `patch_diagnostics` arrays.", "flag": "include" }, { "name": "filter", "ts": "filter", "kind": "query", "type": "string", "required": false, "enum": ["blocking", "introduced"], "description": "Narrow the included Diagnostics to matching locations. Requires include=diagnostics. blocking: locations that fail the Diagnostic policy. introduced: locations new since the baseline. A Diagnostic with no matching location is omitted. diagnostic_summary always describes the complete revision.", "flag": "filter" }], "inputSchema": { "type": "object", "properties": { "spec_revision_id": { "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, "include": { "enum": ["diagnostics"], "type": "string", "description": "Add related data to the response. `diagnostics` adds the `diagnostics` and `patch_diagnostics` arrays." }, "filter": { "enum": ["blocking", "introduced"], "type": "string", "description": "Narrow the included Diagnostics to matching locations. Requires include=diagnostics. blocking: locations that fail the Diagnostic policy. introduced: locations new since the baseline. A Diagnostic with no matching location is omitted. diagnostic_summary always describes the complete revision." } }, "required": ["spec_revision_id"] }, "exampleArguments": { "spec_revision_id": "srev_6m1q8v4k2p9d7h3c" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "spec_revision", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "format": { "enum": ["openapi", "graphql"], "type": "string" }, "file_count": { "minimum": 1, "type": "integer" }, "sha256": { "description": "SHA-256 digest of every source file path, digest, and size in the resolved graph.", "examples": ["9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"], "pattern": "^[a-f0-9]{64}$", "type": "string" }, "size_bytes": { "description": "Total bytes across all source files.", "minimum": 0, "type": "integer" }, "source": { "description": "Origin recorded when this immutable revision was created.", "anyOf": [{ "anyOf": [{ "properties": { "type": { "const": "url", "type": "string" }, "url": { "type": "object" } }, "type": "object" }, { "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "type": "object" } }, "type": "object" }] }, { "type": "null" }] }, "diagnostic_summary": { "description": "Counts of grouped Diagnostics, one per rule.", "properties": { "status": { "enum": ["passed", "blocked"], "description": "passed: no Diagnostic fails the Spec's Diagnostic policy.", "type": "string" }, "error_count": { "description": "Diagnostics reporting invalid behavior.", "minimum": 0, "type": "integer" }, "warning_count": { "description": "Diagnostics reporting material risk.", "minimum": 0, "type": "integer" }, "suggestion_count": { "description": "Diagnostics suggesting an improvement.", "minimum": 0, "type": "integer" }, "blocking_count": { "description": "Diagnostics that fail the Spec's Diagnostic policy.", "minimum": 0, "type": "integer" }, "baseline_spec_revision_id": { "description": "The previous revision of this Spec that introduced Diagnostics are compared with, or null for the f…", "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] } }, "type": "object" }, "diagnostics": { "description": "Present only with include=diagnostics.", "items": { "description": "Every occurrence of one Diagnostic rule in a Spec Revision, grouped into one decision.", "properties": { "id": { "description": "Stable rule identifier, unique within a Spec Revision.", "type": "string" }, "object": { "const": "diagnostic", "type": "string" }, "blocking": { "description": "Whether any location fails the Spec's Diagnostic policy.", "type": "boolean" }, "introduced": { "description": "Whether any location is new since baseline_spec_revision_id in the Diagnostic summary.", "type": "boolean" }, "severity": { "enum": ["error", "warning", "suggestion"], "description": "Whether the rule reports invalid behavior, material risk, or an improvement.", "type": "string" }, "category": { "enum": ["correctness", "sdk_ergonomics", "agent_usability", "safety"], "description": "Product dimension affected by the diagnostic.", "type": "string" }, "title": { "description": "Concise statement of the root cause.", "type": "string" }, "message": { "description": "One explanation of the finding and why it matters.", "type": "string" }, "surfaces": { "description": "Public surfaces affected by the root cause.", "uniqueItems": true, "items": { "enum": ["api", "sdk", "cli", "mcp"], "type": "string" }, "type": "array" }, "owner_decision_required": { "description": "Whether remediation requires intent that the Spec cannot prove.", "type": "boolean" }, "locations": { "description": "The affected coordinates, kept under one grouped Diagnostic.", "minItems": 1, "items": { "description": "One exact place where a Diagnostic rule found evidence, with its own state under the Spec's Diagnos…", "type": "object" }, "type": "array" }, "fix": { "description": "A reviewable remediation that does not invent API behavior.", "properties": { "title": { "description": "Concise action for the API author.", "type": "string" }, "type": { "enum": ["spec_patch", "source_edit"], "description": "spec_patch is an exact OpenAPI edit Typeship can derive; source_edit requires author intent or a lo…", "type": "string" }, "patches": { "description": "Exact patches when type is spec_patch.", "type": "array" }, "instructions": { "description": "Source-level guidance when an exact patch would invent intent.", "type": "string" } }, "type": "object" }, "authoring_brief": { "description": "Grounded instructions an agent can use to edit the source.", "type": "string" } }, "type": "object" }, "type": "array" }, "patch_diagnostics": { "description": "Present only with include=diagnostics.", "items": { "properties": { "code": { "enum": ["unsupported_format", "invalid_document", "invalid_patch", "no_match", "append_target_type", "rename_target_type", "rename_conflict"], "type": "string" }, "message": { "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
17
15
  { "resource": "specRevisions", "method": "listFiles", "command": ["spec-revisions", "list-files"], "tool": "spec_revisions_list_files", "httpMethod": "GET", "path": "/spec-revisions/{spec_revision_id}/files", "summary": "List a Spec Revision's files", "description": "Lists the captured source files and the resolved document Typeship generated from, ordered by path. Read content with getFile.", "toolDescription": "List a Spec Revision's files. Lists the captured source files and the resolved document Typeship generated from, ordered by path. GET /spec-revisions/{spec_revision_id}/files (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "spec_revision_id", "ts": "specRevisionId", "kind": "path", "type": "string", "required": true, "flag": "spec-revision-id" }, { "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }], "inputSchema": { "type": "object", "properties": { "spec_revision_id": { "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." } }, "required": ["spec_revision_id"] }, "exampleArguments": { "spec_revision_id": "srev_6m1q8v4k2p9d7h3c" }, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "id": { "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "file", "type": "string" }, "path": { "description": "Path within the Spec Revision, Generation package, or Target package.", "type": "string" }, "size_bytes": { "minimum": 0, "type": "integer" }, "sha256": { "description": "Digest of the complete file.", "pattern": "^[a-f0-9]{64}$", "type": "string" }, "encoding": { "enum": ["utf8", "base64"], "description": "utf8: content is text. base64: content is base64-encoded binary bytes.", "type": "string" }, "mode": { "description": "Git file mode for package files; null for Spec source files.", "anyOf": [{ "enum": ["100644", "100755", "120000"], "description": "Git file mode. 100755 is executable; 120000 is a symbolic link whose content is its target.", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When Typeship first issued this file ID.", "type": "string" }, "role": { "enum": ["entrypoint", "reference", "resolved"], "description": "entrypoint and reference: captured source files. resolved: the single normalized document Typeship generated from.", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
18
- { "resource": "targets", "method": "list", "command": ["targets", "list"], "tool": "targets_list", "httpMethod": "GET", "path": "/targets", "summary": "List Targets", "toolDescription": "List Targets. GET /targets (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "project_id", "ts": "projectId", "kind": "query", "type": "string", "required": false, "description": "Only Targets in this Project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "description": "All Targets follow reviewed SemVer.", "properties": { "id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "target", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "name": { "type": "string" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "dependency": { "description": "Present only on a go_cli Target, naming the sibling Go SDK Target the CLI is generated against.", "anyOf": [{ "description": "One Target generated from a sibling Target.", "properties": { "type": { "const": "go_sdk_module", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "status": { "enum": ["active", "disabled"], "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "type": "string" }, "version_current": { "description": "Read-only version of the Target's latest release, or null before its first release.", "type": ["string", "null"] }, "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config.", "anyOf": [{ "description": "Target-specific generation and delivery overrides.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "deliveries": { "description": "At most one repository and one hosted MCP Delivery.", "maxItems": 2, "items": { "anyOf": [{ "type": "object" }, { "type": "object" }] }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to ge…", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
19
- { "resource": "targets", "method": "create", "command": ["targets", "create"], "tool": "targets_create", "httpMethod": "POST", "path": "/targets", "summary": "Create an independently configured Target", "description": "Creates a Target with its own configuration, Deliveries, and release history. Multiple Targets can use the same generator.", "toolDescription": "Create an independently configured Target. Creates a Target with its own configuration, Deliveries, and release history. POST /targets", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "project_id", "ts": "project_id", "kind": "body", "type": "string", "required": true, "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }, { "name": "name", "ts": "name", "kind": "body", "type": "string", "required": true, "flag": "name" }, { "name": "spec_id", "ts": "spec_id", "kind": "body", "type": "string", "required": true, "description": "Unique identifier for a project's logical API Spec.", "flag": "spec-id" }, { "name": "type", "ts": "type", "kind": "body", "type": "string", "required": true, "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target. This is configuration, not identity; several Targets may use the same generator. cli is the TypeScript CLI; go_cli is the native Go CLI, a distinct product that imports one exact paired Go SDK module rather than a client of its own.", "flag": "type" }, { "name": "status", "ts": "status", "kind": "body", "type": "string", "required": false, "enum": ["active", "disabled"], "description": "Default: \"active\".", "flag": "status" }, { "name": "release_channel", "ts": "release_channel", "kind": "body", "type": "string", "required": false, "enum": ["stable", "prerelease"], "description": "Default: \"stable\".", "flag": "release-channel" }, { "name": "checks", "ts": "checks", "kind": "body", "type": "object", "required": false, "description": "Required checks run against the code in the Draft. Generated checks and customer commands share one reproducible workflow; repository_required names existing repository checks. Supplying checks replaces all settings. Omitted generated restores build, package, and public_entrypoint; omitted repository_required and customer restore empty lists. An empty object restores these defaults. An empty array clears the corresponding list.", "flag": "checks" }, { "name": "config", "ts": "config", "kind": "body", "type": "json", "required": false, "nullable": true, "description": "Target-specific overrides merged over Project.config. GraphQL settings are rejected here and belong to the Spec.", "flag": "config" }, { "name": "deliveries", "ts": "deliveries", "kind": "body", "type": "array", "required": false, "items": { "type": "json" }, "flag": "deliveries" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" }, "name": { "minLength": 1, "maxLength": 80, "type": "string", "example": "Parcel CLI" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string", "example": "spec_2p8m4q7k1v9d6h3c" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target. This is configuration, not identity; several Targets may use the same generator. cli is the TypeScript CLI; go_cli is the native Go CLI, a distinct product that imports one exact paired Go SDK module rather than a client of its own.", "type": "string", "example": "cli" }, "status": { "enum": ["active", "disabled"], "default": "active", "type": "string", "description": "Default: \"active\"." }, "release_channel": { "enum": ["stable", "prerelease"], "default": "stable", "type": "string", "description": "Default: \"stable\"." }, "checks": { "description": "Required checks run against the code in the Draft. Generated checks and customer commands share one reproducible workflow; repository_required names existing repository checks. Supplying checks replaces all settings. Omitted generated restores build, package, and public_entrypoint; omitted repository_required and customer restore empty lists. An empty object restores these defaults. An empty array clears the corresponding list.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "properties": { "name": { "minLength": 1, "maxLength": 120, "type": "string" }, "command": { "minLength": 1, "maxLength": 2000, "type": "string" } }, "required": ["name", "command"], "additionalProperties": false, "type": "object" }, "type": "array" } }, "additionalProperties": false, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config. GraphQL settings are rejected here and belong to the Spec.", "anyOf": [{ "description": "Target-specific generation and delivery overrides. Authentication may only select a Project-owned OAuth application. OAuth server metadata, applications, and identity policy remain Project-owned. Self-hosted MCP access may be overridden for a Target-specific deployment.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "items": { "type": "string" }, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "properties": { "max_retries": { "minimum": 0, "maximum": 10, "type": "integer" }, "statuses": { "description": "Replaces the default retryable set (408, 429, 500, 502, 503, 504).", "maxItems": 20, "items": { "type": "integer" }, "type": "array" }, "initial_delay_ms": { "minimum": 1, "type": "integer" }, "max_delay_ms": { "minimum": 1, "type": "integer" }, "retry_non_idempotent": { "description": "Also retry non-idempotent methods (POST/PATCH).", "type": "boolean" }, "disabled": { "description": "Shorthand for max_retries 0.", "type": "boolean" }, "operations": { "additionalProperties": { "description": "RetryTuning (recursive)" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "additionalProperties": { "anyOf": [{ "type": "object" }, { "description": "false disables pagination detection for the operation.", "type": "boolean" }] }, "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target. OAuth server metadata, applications, and identity policy remain Project-owned.", "properties": { "oauth_application": { "description": "Project OAuth application to use. Omit to inherit the Project default.", "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "environments": { "description": "Project OAuth application selections keyed by API environment.", "additionalProperties": { "type": "object" }, "type": ["object", "null"] } }, "additionalProperties": false, "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "properties": { "command_name": { "description": "Command users run, independent of how the CLI is distributed.", "type": ["string", "null"] }, "update_notice": { "description": "Opt in to a once-a-day registry check that prints an upgrade hint. Off by default; generated code phones nobody unless this is enabled.", "type": "boolean" }, "changelog_url": { "description": "Public HTTP(S) URL read by the optional changelog command in generated CLIs. Supports UTF-8 Markdown, plain text, and static HTML; embedded credentials are not allowed. Omit or clear to disable, then regenerate.", "type": ["string", "null"] }, "support_url": { "description": "Where the generated CLI's feedback command sends users. GitHub issues/new URLs get a prefilled title and environment details.", "type": ["string", "null"] }, "mcp_url": { "description": "Hosted MCP endpoint installed by the generated CLI instead of launching the package's local stdio server.", "type": ["string", "null"] }, "skills_repo": { "description": "GitHub owner/name of the skills package the generated CLI offers to install during init.", "type": ["string", "null"] }, "relay": { "description": "Enable webhook relay sessions for this CLI Target. Requires Pro. Turning it off prevents new sessions.", "type": "boolean" } }, "additionalProperties": false, "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "properties": { "registry_name": { "description": "Stable official MCP registry name, independent of the server runtime.", "type": ["string", "null"] }, "access": { "description": "Authorization for callers connecting to a generated MCP server deployed over HTTP. The hosting application resolves upstream API credentials separately at runtime. This setting does not apply to the Typeship-hosted endpoint.", "properties": { "issuer": { "format": "uri", "description": "Exact issuer allowed to sign MCP connection tokens.", "type": "string" }, "resource": { "format": "uri", "description": "Canonical public URL of the self-hosted MCP endpoint that connection tokens must target.", "type": "string" }, "jwks_url": { "format": "uri", "description": "Public signing-key endpoint. Omit to discover it from the issuer.", "type": "string" }, "scopes": { "description": "Minimum scopes required to connect to the self-hosted MCP server.", "maxItems": 20, "type": "array" } }, "required": ["issuer", "resource"], "additionalProperties": false, "type": "object" }, "tool_mode": { "enum": ["auto", "operations", "meta"], "description": "MCP tool shape. meta collapses per-operation tools into search_docs, read_docs, and execute so large APIs don't flood an agent's context window. Auto considers the serialized tool schemas, switching near 10k tokens or above 100 operations.", "type": "string" }, "instructions": { "description": "Guidance appended to the MCP server's instructions, which agents read once when they connect (server/discover): what to call first, conventions the spec does not state, what not to do. Carried by the package's server and the hosted endpoint alike.", "maxLength": 2000, "type": ["string", "null"] }, "tool_descriptions": { "description": "Hand-written MCP tool descriptions keyed by operationId or \"METHOD /path\". Each replaces the text typeship derives for that operation (summary, first sentence, method and path, deprecation and auth notes). For flows the spec cannot describe, such as a multi-step upload. Keys that match no operation are reported as generation warnings.", "additionalProperties": { "maxLength": 600, "type": "string" }, "type": "object" }, "reference_resolvers": { "description": "Exact name-or-ID resolver overrides keyed first by the target operationId or \"METHOD /path\", then by its wire argument name. A resolver names one read collection operation plus 1-4 item fields to match case-insensitively; false opts that argument out of strict inference.", "additionalProperties": { "type": "object" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "properties": { "quickstart_operation": { "description": "operationId or \"METHOD /path\" to feature as the README's first API call. It must be present in the generated package and callable with no required input beyond path placeholders. Missing or unsuitable choices produce a warning and use the automatic example.", "maxLength": 500, "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "properties": { "homepage": { "description": "Homepage written into registry metadata.", "type": ["string", "null"] }, "license": { "description": "SPDX identifier written into registry metadata. Defaults to info.license.", "maxLength": 200, "type": ["string", "null"] }, "license_text": { "description": "Exact LICENSE file contents. Supply this for licences the engine does not build in; MIT is built in when copyright is also set.", "maxLength": 100000, "type": ["string", "null"] }, "copyright": { "description": "Copyright line used in generated license files.", "maxLength": 200, "type": ["string", "null"] }, "go_package_name": { "description": "Go identifier when the destination repository name is unsuitable.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }], "example": { "cli": { "command_name": "parcel" } } }, "deliveries": { "maxItems": 2, "items": { "anyOf": [{ "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "directory": { "type": ["string", "null"] }, "package_name": { "description": "npm or Python registry identity where applicable.", "type": ["string", "null"] }, "module_path": { "description": "Go module identity for the Go SDK or Go CLI Target where applicable.", "type": ["string", "null"] }, "publish_on_merge": { "description": "Commit repository-owned registry automation and report publication after the Draft merges.", "default": false, "type": "boolean" } }, "required": ["provider", "identifier"], "additionalProperties": false, "type": "object" } }, "required": ["type", "repository"], "additionalProperties": false, "type": "object" }, { "properties": { "type": { "const": "hosted_mcp", "type": "string" } }, "required": ["type"], "additionalProperties": false, "type": "object" }] }, "type": "array", "example": [{ "type": "repository", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": false } }] } }, "required": ["project_id", "name", "spec_id", "type"] }, "exampleArguments": { "project_id": "prj_4f8k2m7x9q1v6b3n", "name": "Parcel CLI", "spec_id": "spec_2p8m4q7k1v9d6h3c", "type": "cli", "config": { "cli": { "command_name": "parcel" } }, "deliveries": [{ "type": "repository", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": false } }] }, "outputSchema": { "properties": { "id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "target", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "name": { "type": "string" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "dependency": { "description": "Present only on a go_cli Target, naming the sibling Go SDK Target the CLI is generated against.", "anyOf": [{ "description": "One Target generated from a sibling Target.", "properties": { "type": { "const": "go_sdk_module", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "status": { "enum": ["active", "disabled"], "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "type": "string" }, "version_current": { "description": "Read-only version of the Target's latest release, or null before its first release.", "type": ["string", "null"] }, "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config.", "anyOf": [{ "description": "Target-specific generation and delivery overrides.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "deliveries": { "description": "At most one repository and one hosted MCP Delivery.", "maxItems": 2, "items": { "anyOf": [{ "type": "object" }, { "type": "object" }] }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
20
- { "resource": "targets", "method": "get", "command": ["targets", "get"], "tool": "targets_get", "httpMethod": "GET", "path": "/targets/{target_id}", "summary": "Get a Target", "toolDescription": "Get a Target. GET /targets/{target_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "target_id", "ts": "targetId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" } }, "required": ["target_id"] }, "exampleArguments": { "target_id": "tgt_5m8q2v7k1p9d4h6c" }, "outputSchema": { "properties": { "id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "target", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "name": { "type": "string" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "dependency": { "description": "Present only on a go_cli Target, naming the sibling Go SDK Target the CLI is generated against.", "anyOf": [{ "description": "One Target generated from a sibling Target.", "properties": { "type": { "const": "go_sdk_module", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "status": { "enum": ["active", "disabled"], "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "type": "string" }, "version_current": { "description": "Read-only version of the Target's latest release, or null before its first release.", "type": ["string", "null"] }, "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config.", "anyOf": [{ "description": "Target-specific generation and delivery overrides.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "deliveries": { "description": "At most one repository and one hosted MCP Delivery.", "maxItems": 2, "items": { "anyOf": [{ "type": "object" }, { "type": "object" }] }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
21
- { "resource": "targets", "method": "delete", "command": ["targets", "delete"], "tool": "targets_delete", "httpMethod": "DELETE", "path": "/targets/{target_id}", "summary": "Delete an unused Target", "description": "Deletes a Target with no Generation history, release history, or active Draft. A `409 resource_has_dependencies` means one of those resources still depends on it. Retrieve the Target, disable it instead, or resolve the dependency before retrying.\n\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Delete an unused Target. Deletes a Target with no Generation history, release history, or active Draft. DELETE /targets/{target_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "destructive", "params": [{ "name": "target_id", "ts": "targetId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." } }, "required": ["target_id"] }, "exampleArguments": { "target_id": "tgt_5m8q2v7k1p9d4h6c" }, "outputSchema": { "properties": { "id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "target", "type": "string" }, "deleted": { "const": true, "type": "boolean" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
22
- { "resource": "targets", "method": "update", "command": ["targets", "update"], "tool": "targets_update", "httpMethod": "PATCH", "path": "/targets/{target_id}", "summary": "Update a Target or its Deliveries", "description": "Omitted fields keep their current values. Supplied config, checks, and deliveries replace their complete stored values.\nWith Project auto_generate enabled, changing Target config, checks, or Deliveries queues that Target's Generation. A queued or running Target reuses that Generation.\nOmitting If-Match applies the update to the current resource; with If-Match, a stale ETag returns 412 precondition_failed without saving.\nSelect the next version through PATCH /drafts/{draft_id} on the Target's draft_id.\n\nA `409 target_busy` means the Target is publishing; wait for it to finish. A `409 delivery_conflict` means another Target owns the requested repository tree; retrieve both Targets, choose a free destination, and retry.\nA `502 follow_up_failed` means the update was saved, but retiring an obsolete review or regenerating the Target failed. Retrieve the Target and follow the error's retryable and suggested_action fields.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Update a Target or its Deliveries. Omitted fields keep their current values. PATCH /targets/{target_id}", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "target_id", "ts": "targetId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "name", "ts": "name", "kind": "body", "type": "string", "required": false, "flag": "name" }, { "name": "status", "ts": "status", "kind": "body", "type": "string", "required": false, "enum": ["active", "disabled"], "flag": "status" }, { "name": "release_channel", "ts": "release_channel", "kind": "body", "type": "string", "required": false, "enum": ["stable", "prerelease"], "flag": "release-channel" }, { "name": "checks", "ts": "checks", "kind": "body", "type": "object", "required": false, "description": "Required checks run against the code in the Draft. Generated checks and customer commands share one reproducible workflow; repository_required names existing repository checks. Supplying checks replaces all settings. Omitted generated restores build, package, and public_entrypoint; omitted repository_required and customer restore empty lists. An empty object restores these defaults. An empty array clears the corresponding list.", "flag": "checks" }, { "name": "config", "ts": "config", "kind": "body", "type": "json", "required": false, "nullable": true, "description": "Replaces the complete stored override object. Send null or an empty object to resume Project inheritance. Effective values merge over Project.config; GraphQL settings belong to the Spec.", "flag": "config" }, { "name": "deliveries", "ts": "deliveries", "kind": "body", "type": "array", "required": false, "items": { "type": "json" }, "description": "Replaces the Delivery set; include each kind you want to keep. Retained kinds preserve their ID, creation time, and hosted URL. Each supplied Delivery replaces its configuration, so omitted optional settings reset to their defaults. Omit deliveries to keep the existing set, or send [] to remove all Deliveries. Removing and later recreating a kind allocates a new ID and, for hosted_mcp, a new URL.", "flag": "deliveries" }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." }, "name": { "minLength": 1, "maxLength": 80, "type": "string" }, "status": { "enum": ["active", "disabled"], "type": "string", "example": "disabled" }, "release_channel": { "enum": ["stable", "prerelease"], "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft. Generated checks and customer commands share one reproducible workflow; repository_required names existing repository checks. Supplying checks replaces all settings. Omitted generated restores build, package, and public_entrypoint; omitted repository_required and customer restore empty lists. An empty object restores these defaults. An empty array clears the corresponding list.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "properties": { "name": { "minLength": 1, "maxLength": 120, "type": "string" }, "command": { "minLength": 1, "maxLength": 2000, "type": "string" } }, "required": ["name", "command"], "additionalProperties": false, "type": "object" }, "type": "array" } }, "additionalProperties": false, "type": "object" }, "config": { "description": "Replaces the complete stored override object. Send null or an empty object to resume Project inheritance. Effective values merge over Project.config; GraphQL settings belong to the Spec.", "anyOf": [{ "description": "Target-specific generation and delivery overrides. Authentication may only select a Project-owned OAuth application. OAuth server metadata, applications, and identity policy remain Project-owned. Self-hosted MCP access may be overridden for a Target-specific deployment.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "items": { "type": "string" }, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "properties": { "max_retries": { "minimum": 0, "maximum": 10, "type": "integer" }, "statuses": { "description": "Replaces the default retryable set (408, 429, 500, 502, 503, 504).", "maxItems": 20, "items": { "type": "integer" }, "type": "array" }, "initial_delay_ms": { "minimum": 1, "type": "integer" }, "max_delay_ms": { "minimum": 1, "type": "integer" }, "retry_non_idempotent": { "description": "Also retry non-idempotent methods (POST/PATCH).", "type": "boolean" }, "disabled": { "description": "Shorthand for max_retries 0.", "type": "boolean" }, "operations": { "additionalProperties": { "description": "RetryTuning (recursive)" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "additionalProperties": { "anyOf": [{ "type": "object" }, { "description": "false disables pagination detection for the operation.", "type": "boolean" }] }, "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target. OAuth server metadata, applications, and identity policy remain Project-owned.", "properties": { "oauth_application": { "description": "Project OAuth application to use. Omit to inherit the Project default.", "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "environments": { "description": "Project OAuth application selections keyed by API environment.", "additionalProperties": { "type": "object" }, "type": ["object", "null"] } }, "additionalProperties": false, "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "properties": { "command_name": { "description": "Command users run, independent of how the CLI is distributed.", "type": ["string", "null"] }, "update_notice": { "description": "Opt in to a once-a-day registry check that prints an upgrade hint. Off by default; generated code phones nobody unless this is enabled.", "type": "boolean" }, "changelog_url": { "description": "Public HTTP(S) URL read by the optional changelog command in generated CLIs. Supports UTF-8 Markdown, plain text, and static HTML; embedded credentials are not allowed. Omit or clear to disable, then regenerate.", "type": ["string", "null"] }, "support_url": { "description": "Where the generated CLI's feedback command sends users. GitHub issues/new URLs get a prefilled title and environment details.", "type": ["string", "null"] }, "mcp_url": { "description": "Hosted MCP endpoint installed by the generated CLI instead of launching the package's local stdio server.", "type": ["string", "null"] }, "skills_repo": { "description": "GitHub owner/name of the skills package the generated CLI offers to install during init.", "type": ["string", "null"] }, "relay": { "description": "Enable webhook relay sessions for this CLI Target. Requires Pro. Turning it off prevents new sessions.", "type": "boolean" } }, "additionalProperties": false, "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "properties": { "registry_name": { "description": "Stable official MCP registry name, independent of the server runtime.", "type": ["string", "null"] }, "access": { "description": "Authorization for callers connecting to a generated MCP server deployed over HTTP. The hosting application resolves upstream API credentials separately at runtime. This setting does not apply to the Typeship-hosted endpoint.", "properties": { "issuer": { "format": "uri", "description": "Exact issuer allowed to sign MCP connection tokens.", "type": "string" }, "resource": { "format": "uri", "description": "Canonical public URL of the self-hosted MCP endpoint that connection tokens must target.", "type": "string" }, "jwks_url": { "format": "uri", "description": "Public signing-key endpoint. Omit to discover it from the issuer.", "type": "string" }, "scopes": { "description": "Minimum scopes required to connect to the self-hosted MCP server.", "maxItems": 20, "type": "array" } }, "required": ["issuer", "resource"], "additionalProperties": false, "type": "object" }, "tool_mode": { "enum": ["auto", "operations", "meta"], "description": "MCP tool shape. meta collapses per-operation tools into search_docs, read_docs, and execute so large APIs don't flood an agent's context window. Auto considers the serialized tool schemas, switching near 10k tokens or above 100 operations.", "type": "string" }, "instructions": { "description": "Guidance appended to the MCP server's instructions, which agents read once when they connect (server/discover): what to call first, conventions the spec does not state, what not to do. Carried by the package's server and the hosted endpoint alike.", "maxLength": 2000, "type": ["string", "null"] }, "tool_descriptions": { "description": "Hand-written MCP tool descriptions keyed by operationId or \"METHOD /path\". Each replaces the text typeship derives for that operation (summary, first sentence, method and path, deprecation and auth notes). For flows the spec cannot describe, such as a multi-step upload. Keys that match no operation are reported as generation warnings.", "additionalProperties": { "maxLength": 600, "type": "string" }, "type": "object" }, "reference_resolvers": { "description": "Exact name-or-ID resolver overrides keyed first by the target operationId or \"METHOD /path\", then by its wire argument name. A resolver names one read collection operation plus 1-4 item fields to match case-insensitively; false opts that argument out of strict inference.", "additionalProperties": { "type": "object" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "properties": { "quickstart_operation": { "description": "operationId or \"METHOD /path\" to feature as the README's first API call. It must be present in the generated package and callable with no required input beyond path placeholders. Missing or unsuitable choices produce a warning and use the automatic example.", "maxLength": 500, "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "properties": { "homepage": { "description": "Homepage written into registry metadata.", "type": ["string", "null"] }, "license": { "description": "SPDX identifier written into registry metadata. Defaults to info.license.", "maxLength": 200, "type": ["string", "null"] }, "license_text": { "description": "Exact LICENSE file contents. Supply this for licences the engine does not build in; MIT is built in when copyright is also set.", "maxLength": 100000, "type": ["string", "null"] }, "copyright": { "description": "Copyright line used in generated license files.", "maxLength": 200, "type": ["string", "null"] }, "go_package_name": { "description": "Go identifier when the destination repository name is unsuitable.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "deliveries": { "description": "Replaces the Delivery set; include each kind you want to keep. Retained kinds preserve their ID, creation time, and hosted URL. Each supplied Delivery replaces its configuration, so omitted optional settings reset to their defaults. Omit deliveries to keep the existing set, or send [] to remove all Deliveries. Removing and later recreating a kind allocates a new ID and, for hosted_mcp, a new URL.", "maxItems": 2, "items": { "anyOf": [{ "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "directory": { "type": ["string", "null"] }, "package_name": { "description": "npm or Python registry identity where applicable.", "type": ["string", "null"] }, "module_path": { "description": "Go module identity for the Go SDK or Go CLI Target where applicable.", "type": ["string", "null"] }, "publish_on_merge": { "description": "Commit repository-owned registry automation and report publication after the Draft merges.", "default": false, "type": "boolean" } }, "required": ["provider", "identifier"], "additionalProperties": false, "type": "object" } }, "required": ["type", "repository"], "additionalProperties": false, "type": "object" }, { "properties": { "type": { "const": "hosted_mcp", "type": "string" } }, "required": ["type"], "additionalProperties": false, "type": "object" }] }, "type": "array" } }, "required": ["target_id"] }, "exampleArguments": { "target_id": "tgt_5m8q2v7k1p9d4h6c", "status": "disabled" }, "outputSchema": { "properties": { "id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "target", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "name": { "type": "string" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "dependency": { "description": "Present only on a go_cli Target, naming the sibling Go SDK Target the CLI is generated against.", "anyOf": [{ "description": "One Target generated from a sibling Target.", "properties": { "type": { "const": "go_sdk_module", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "status": { "enum": ["active", "disabled"], "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "type": "string" }, "version_current": { "description": "Read-only version of the Target's latest release, or null before its first release.", "type": ["string", "null"] }, "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config.", "anyOf": [{ "description": "Target-specific generation and delivery overrides.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "deliveries": { "description": "At most one repository and one hosted MCP Delivery.", "maxItems": 2, "items": { "anyOf": [{ "type": "object" }, { "type": "object" }] }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
23
- { "resource": "targets", "method": "adopt", "command": ["targets", "adopt"], "tool": "targets_adopt", "httpMethod": "POST", "path": "/targets/{target_id}/adopt", "summary": "Adopt a verified existing package as the latest release", "description": "Checks the repository tag, package metadata, and registry artifact, then records the package as an Imported latest release. Opens the first Typeship Draft at the next major version; review it to establish the baseline for preserving existing code.", "toolDescription": "Adopt a verified existing package as the latest release. Checks the repository tag, package metadata, and registry artifact, then records the package as an Imported latest release. POST /targets/{target_id}/adopt", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "target_id", "ts": "targetId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "version", "ts": "version", "kind": "body", "type": "string", "required": true, "description": "Exact already-published package version to make the latest release.", "flag": "body-version" }, { "name": "tag", "ts": "tag", "kind": "body", "type": "string", "required": true, "description": "Immutable repository tag containing the matching package source.", "flag": "tag" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" }, "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "version": { "description": "Exact already-published package version to make the latest release.", "type": "string", "example": "1.0.0" }, "tag": { "description": "Immutable repository tag containing the matching package source.", "minLength": 1, "maxLength": 255, "type": "string", "example": "v1.0.0" } }, "required": ["target_id", "version", "tag"] }, "exampleArguments": { "target_id": "tgt_5m8q2v7k1p9d4h6c", "version": "1.0.0", "tag": "v1.0.0" }, "outputSchema": { "properties": { "id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "release", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "generation_id": { "description": "Null only for a verified release imported during package adoption.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "origin": { "enum": ["typeship", "imported"], "type": "string" }, "version": { "description": "Immutable package version released from this Target.", "type": "string" }, "channel": { "enum": ["stable", "prerelease"], "type": "string" }, "repository": { "anyOf": [{ "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" } }, "type": "object" }, { "type": "null" }] }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "commit_sha": { "description": "Git commit containing the accepted package. Compare it with the Delivery repository history or checked-out commit.", "pattern": "^[0-9a-fA-F]{40}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "approvals": { "items": { "properties": { "source": { "enum": ["source_pr", "draft_pr"], "type": "string" }, "reason": { "type": "string" }, "approved_by": { "type": "string" }, "approved_sha": { "type": "string" }, "approved_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "import_provenance": { "description": "For an adopted Release, compare the tag and registry URL with the published package and its artifact digest. Null for a Release created by Typeship.", "properties": { "tag": { "description": "Git tag to compare with the repository release, if available.", "type": ["string", "null"] }, "registry_url": { "format": "uri", "description": "Published package page to inspect, if available.", "type": ["string", "null"] }, "artifact_digest": { "description": "Published artifact digest to compare with registry metadata, if available.", "type": ["string", "null"] }, "imported_at": { "format": "date-time", "description": "When Typeship recorded the adopted package.", "type": ["string", "null"] } }, "type": ["object", "null"] }, "publications": { "items": { "properties": { "id": { "examples": ["pub_2m8q4v7k1p9d5h6c"], "pattern": "^pub_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "publication", "type": "string" }, "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "destination": { "enum": ["github", "npm", "pypi", "go", "mcp"], "type": "string" }, "status": { "enum": ["pending", "publishing", "published", "failed", "disabled"], "type": "string" }, "attempt": { "minimum": 0, "type": "integer" }, "run_url": { "format": "uri", "type": ["string", "null"] }, "registry_url": { "format": "uri", "type": ["string", "null"] }, "artifact_digest": { "type": ["string", "null"] }, "errors": { "description": "Recorded failures. Empty when this resource has no recorded failure.", "items": { "type": "object" }, "type": "array" }, "started_at": { "format": "date-time", "type": ["string", "null"] }, "finished_at": { "format": "date-time", "type": ["string", "null"] }, "runtime_ms": { "description": "Milliseconds from started_at to finished_at; null until the attempt finishes.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
24
- { "resource": "drafts", "method": "list", "command": ["drafts", "list"], "tool": "drafts_list", "httpMethod": "GET", "path": "/drafts", "summary": "List Drafts", "description": "Lists open and merged Drafts, newest first. Each Target has one open Draft; each merge adds a merged Draft.", "toolDescription": "List Drafts. Lists open and merged Drafts, newest first. GET /drafts (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "target_id", "ts": "targetId", "kind": "query", "type": "string", "required": false, "description": "Only Drafts of this Target. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "status", "ts": "status", "kind": "query", "type": "string", "required": false, "enum": ["none", "working", "action_required", "ready", "merged"], "description": "Only Drafts with this status.", "flag": "status" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" }, "status": { "enum": ["none", "working", "action_required", "ready", "merged"], "description": "none: the open Draft has no pending change; generate the Target to start one. working: Typeship is generating, carrying repository edits forward, applying decisions, or checking the Draft; retrieve it again. action_required: use the typed reason to find the customer's next action. ready: required checks passed on head_sha; merge the pull request. merged: the pull request merged and the Draft is final; retrieve the Target for the draft_id of its next Draft.", "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "description": "One reviewed package change for a Target.", "properties": { "id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "draft", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "status": { "enum": ["none", "working", "action_required", "ready", "merged"], "description": "none: the open Draft has no pending change; generate the Target to start one.", "type": "string" }, "reason": { "enum": ["conflict", "checks_failed", "review_failed", "checks_unavailable", "history_rewritten"], "description": "conflict: resolve the listed files.", "type": "string" }, "version_next": { "description": "Next version for this Draft, or null before a version is selected.", "type": ["string", "null"] }, "version_source": { "enum": ["automatic", "console", "api", "github", null], "description": "Where version_next was selected; null once the Draft merged.", "type": ["string", "null"] }, "readiness": { "anyOf": [{ "description": "Readiness decision for the Draft's head_sha.", "properties": { "status": { "enum": ["success", "failure", "error", "pending"], "description": "success means required checks passed; failure means the Draft needs correction or review; error mea…", "type": "string" }, "description": { "description": "Human-readable explanation of the current decision.", "type": "string" }, "compatibility_api": { "enum": ["compatible", "breaking", "unknown"], "description": "API surface comparison against the latest release.", "type": "string" }, "compatibility_package": { "enum": ["compatible", "breaking", "unknown"], "description": "Package and supported SDK source comparison against the latest release.", "type": "string" }, "version_correct": { "description": "Whether the version satisfies the assessed change.", "type": ["boolean", "null"] }, "bump_required": { "enum": ["major", "minor", "patch", null], "description": "Minimum assessed version bump.", "type": ["string", "null"] }, "version_previous": { "description": "Latest release version used for the comparison.", "type": ["string", "null"] }, "title_error": { "description": "Draft title error that must be corrected before release.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "changes": { "properties": { "changelog": { "description": "Cumulative changelog against the latest release.", "type": ["string", "null"] }, "breaking_count": { "minimum": 0, "type": ["integer", "null"] }, "version_previous": { "type": ["string", "null"] } }, "type": ["object", "null"] }, "head_sha": { "description": "Draft commit that readiness, checks, and conflicts describe.", "type": ["string", "null"] }, "pull_request": { "description": "The Draft pull request in the destination repository, or null before one is opened.", "anyOf": [{ "properties": { "url": { "format": "uri", "type": "string" }, "number": { "minimum": 1, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "generation_id": { "description": "Generation whose package this Draft contains.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "release_id": { "description": "Release this Draft created when it merged; null while open, or when a merge changed only tests or c…", "anyOf": [{ "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When the Draft opened.", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "conflicts": { "description": "Conflict counts for the current merge stage; null when the Draft has no conflicts.", "anyOf": [{ "properties": { "total": { "description": "Conflicts in the current merge stage.", "minimum": 1, "type": "integer" }, "decided": { "description": "Conflicts with a saved decision for head_sha.", "minimum": 0, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "customized_files": { "description": "Files where the Draft differs from the last accepted package; null until the Draft is integrated.", "minimum": 0, "type": ["integer", "null"] }, "history_recovery": { "description": "Present only while status is action_required and reason is history_rewritten.", "anyOf": [{ "description": "The approval inputs for a default-branch history rewrite.", "properties": { "default_sha": { "description": "Rewritten default-branch commit.", "type": "string" }, "head_sha": { "description": "Draft commit Typeship last observed.", "type": ["string", "null"] }, "preserved_branch": { "description": "Existing Draft branch that stays available after recovery opens a new Draft.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to ge…", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
25
- { "resource": "drafts", "method": "get", "command": ["drafts", "get"], "tool": "drafts_get", "httpMethod": "GET", "path": "/drafts/{draft_id}", "summary": "Get a Draft", "description": "Returns the Draft's status. An open Draft also reports its typed reason when action is required, next version and its source, readiness, checks, and conflict counts. The response carries an `ETag`; send it in `If-Match` when updating the Draft to avoid changing a newer version selection.", "toolDescription": "Get a Draft. Returns the Draft's status. GET /drafts/{draft_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "draft_id", "ts": "draftId", "kind": "path", "type": "string", "required": true, "flag": "draft-id" }], "inputSchema": { "type": "object", "properties": { "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" } }, "required": ["draft_id"] }, "exampleArguments": { "draft_id": "drf_3q7m1v8k2p5d9h4c" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "draft", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "status": { "enum": ["none", "working", "action_required", "ready", "merged"], "description": "none: the open Draft has no pending change; generate the Target to start one.", "type": "string" }, "reason": { "enum": ["conflict", "checks_failed", "review_failed", "checks_unavailable", "history_rewritten"], "description": "conflict: resolve the listed files.", "type": "string" }, "version_next": { "description": "Next version for this Draft, or null before a version is selected.", "type": ["string", "null"] }, "version_source": { "enum": ["automatic", "console", "api", "github", null], "description": "Where version_next was selected; null once the Draft merged.", "type": ["string", "null"] }, "readiness": { "anyOf": [{ "description": "Readiness decision for the Draft's head_sha.", "properties": { "status": { "enum": ["success", "failure", "error", "pending"], "description": "success means required checks passed; failure means the Draft needs correction or review; error mea…", "type": "string" }, "description": { "description": "Human-readable explanation of the current decision.", "type": "string" }, "compatibility_api": { "enum": ["compatible", "breaking", "unknown"], "description": "API surface comparison against the latest release.", "type": "string" }, "compatibility_package": { "enum": ["compatible", "breaking", "unknown"], "description": "Package and supported SDK source comparison against the latest release.", "type": "string" }, "version_correct": { "description": "Whether the version satisfies the assessed change.", "type": ["boolean", "null"] }, "bump_required": { "enum": ["major", "minor", "patch", null], "description": "Minimum assessed version bump.", "type": ["string", "null"] }, "version_previous": { "description": "Latest release version used for the comparison.", "type": ["string", "null"] }, "title_error": { "description": "Draft title error that must be corrected before release.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "changes": { "properties": { "changelog": { "description": "Cumulative changelog against the latest release.", "type": ["string", "null"] }, "breaking_count": { "minimum": 0, "type": ["integer", "null"] }, "version_previous": { "type": ["string", "null"] } }, "type": ["object", "null"] }, "head_sha": { "description": "Draft commit that readiness, checks, and conflicts describe.", "type": ["string", "null"] }, "pull_request": { "description": "The Draft pull request in the destination repository, or null before one is opened.", "anyOf": [{ "properties": { "url": { "format": "uri", "type": "string" }, "number": { "minimum": 1, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "generation_id": { "description": "Generation whose package this Draft contains.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "release_id": { "description": "Release this Draft created when it merged; null while open, or when a merge changed only tests or c…", "anyOf": [{ "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When the Draft opened.", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "conflicts": { "description": "Conflict counts for the current merge stage; null when the Draft has no conflicts.", "anyOf": [{ "properties": { "total": { "description": "Conflicts in the current merge stage.", "minimum": 1, "type": "integer" }, "decided": { "description": "Conflicts with a saved decision for head_sha.", "minimum": 0, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "customized_files": { "description": "Files where the Draft differs from the last accepted package; null until the Draft is integrated.", "minimum": 0, "type": ["integer", "null"] }, "history_recovery": { "description": "Present only while status is action_required and reason is history_rewritten.", "anyOf": [{ "description": "The approval inputs for a default-branch history rewrite.", "properties": { "default_sha": { "description": "Rewritten default-branch commit.", "type": "string" }, "head_sha": { "description": "Draft commit Typeship last observed.", "type": ["string", "null"] }, "preserved_branch": { "description": "Existing Draft branch that stays available after recovery opens a new Draft.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
26
- { "resource": "drafts", "method": "update", "command": ["drafts", "update"], "tool": "drafts_update", "httpMethod": "PATCH", "path": "/drafts/{draft_id}", "summary": "Select an exact Draft version or return to automatic versioning", "description": "Checks your version choice against the required version bump, then regenerates the existing Draft pull request.\n\nSend the Draft's `ETag` in `If-Match` to reject an intervening change with 412 precondition_failed before saving or regenerating. Omitting `If-Match` applies the selection to the current Draft. version_next is required; null restores automatic selection.\n\nA `502` response means the selected version was saved, but regeneration failed. Follow the error's retryable and suggested_action fields. Repeating an unfinished selection resumes generation; repeating a completed selection starts no new work. If using If-Match, retrieve the Draft and confirm the saved selection before retrying with its current ETag.\nA `409 draft_merged` means the Draft merged; retrieve the Target and select a version on its `draft_id`. A `409 target_busy` means the Target is publishing; wait and retry. A `409 version_occupied` means the version is already released; retrieve the Draft and releases, choose a new version, and retry.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Select an exact Draft version or return to automatic versioning. Checks your version choice against the required version bump, then regenerates the existing Draft pull request. PATCH /drafts/{draft_id}", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "draft_id", "ts": "draftId", "kind": "path", "type": "string", "required": true, "flag": "draft-id" }, { "name": "version_next", "ts": "version_next", "kind": "body", "type": "string", "required": true, "nullable": true, "description": "Exact SemVer, or null to return to automatic selection.", "flag": "version-next" }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." }, "version_next": { "description": "Exact SemVer, or null to return to automatic selection.", "type": ["string", "null"], "example": "1.1.0" } }, "required": ["draft_id", "version_next"] }, "exampleArguments": { "draft_id": "drf_3q7m1v8k2p5d9h4c", "version_next": "1.1.0" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "draft", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "status": { "enum": ["none", "working", "action_required", "ready", "merged"], "description": "none: the open Draft has no pending change; generate the Target to start one.", "type": "string" }, "reason": { "enum": ["conflict", "checks_failed", "review_failed", "checks_unavailable", "history_rewritten"], "description": "conflict: resolve the listed files.", "type": "string" }, "version_next": { "description": "Next version for this Draft, or null before a version is selected.", "type": ["string", "null"] }, "version_source": { "enum": ["automatic", "console", "api", "github", null], "description": "Where version_next was selected; null once the Draft merged.", "type": ["string", "null"] }, "readiness": { "anyOf": [{ "description": "Readiness decision for the Draft's head_sha.", "properties": { "status": { "enum": ["success", "failure", "error", "pending"], "description": "success means required checks passed; failure means the Draft needs correction or review; error mea…", "type": "string" }, "description": { "description": "Human-readable explanation of the current decision.", "type": "string" }, "compatibility_api": { "enum": ["compatible", "breaking", "unknown"], "description": "API surface comparison against the latest release.", "type": "string" }, "compatibility_package": { "enum": ["compatible", "breaking", "unknown"], "description": "Package and supported SDK source comparison against the latest release.", "type": "string" }, "version_correct": { "description": "Whether the version satisfies the assessed change.", "type": ["boolean", "null"] }, "bump_required": { "enum": ["major", "minor", "patch", null], "description": "Minimum assessed version bump.", "type": ["string", "null"] }, "version_previous": { "description": "Latest release version used for the comparison.", "type": ["string", "null"] }, "title_error": { "description": "Draft title error that must be corrected before release.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "changes": { "properties": { "changelog": { "description": "Cumulative changelog against the latest release.", "type": ["string", "null"] }, "breaking_count": { "minimum": 0, "type": ["integer", "null"] }, "version_previous": { "type": ["string", "null"] } }, "type": ["object", "null"] }, "head_sha": { "description": "Draft commit that readiness, checks, and conflicts describe.", "type": ["string", "null"] }, "pull_request": { "description": "The Draft pull request in the destination repository, or null before one is opened.", "anyOf": [{ "properties": { "url": { "format": "uri", "type": "string" }, "number": { "minimum": 1, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "generation_id": { "description": "Generation whose package this Draft contains.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "release_id": { "description": "Release this Draft created when it merged; null while open, or when a merge changed only tests or c…", "anyOf": [{ "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When the Draft opened.", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "conflicts": { "description": "Conflict counts for the current merge stage; null when the Draft has no conflicts.", "anyOf": [{ "properties": { "total": { "description": "Conflicts in the current merge stage.", "minimum": 1, "type": "integer" }, "decided": { "description": "Conflicts with a saved decision for head_sha.", "minimum": 0, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "customized_files": { "description": "Files where the Draft differs from the last accepted package; null until the Draft is integrated.", "minimum": 0, "type": ["integer", "null"] }, "history_recovery": { "description": "Present only while status is action_required and reason is history_rewritten.", "anyOf": [{ "description": "The approval inputs for a default-branch history rewrite.", "properties": { "default_sha": { "description": "Rewritten default-branch commit.", "type": "string" }, "head_sha": { "description": "Draft commit Typeship last observed.", "type": ["string", "null"] }, "preserved_branch": { "description": "Existing Draft branch that stays available after recovery opens a new Draft.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
27
- { "resource": "drafts", "method": "listFiles", "command": ["drafts", "list-files"], "tool": "drafts_list_files", "httpMethod": "GET", "path": "/drafts/{draft_id}/files", "summary": "List customized and conflicted files on a Draft", "description": "Lists the Draft's files that differ from the last merged package or need a conflict decision, ordered by path, without file content. Each conflict names its kind, the saved decision, and the sides you can read with getFile. With `filter=history`, lists files affected by a default-branch history rewrite; the list is empty when none is pending.\n\nReturns `409 resource_changed` while Typeship is carrying the Draft's latest commit forward (status working), or when the Draft changes between pages.", "toolDescription": "List customized and conflicted files on a Draft. Lists the Draft's files that differ from the last merged package or need a conflict decision, ordered by path, without file content. GET /drafts/{draft_id}/files (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "draft_id", "ts": "draftId", "kind": "path", "type": "string", "required": true, "flag": "draft-id" }, { "name": "filter", "ts": "filter", "kind": "query", "type": "string", "required": false, "enum": ["conflicted", "customized", "history"], "description": "conflicted: conflicts only. customized: files that differ from the last merged package. history: files affected by a default-branch history rewrite. Omit for conflicted and customized files.", "flag": "filter" }, { "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }], "inputSchema": { "type": "object", "properties": { "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "filter": { "enum": ["conflicted", "customized", "history"], "type": "string", "description": "conflicted: conflicts only. customized: files that differ from the last merged package. history: files affected by a default-branch history rewrite. Omit for conflicted and customized files." }, "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." } }, "required": ["draft_id"] }, "exampleArguments": { "draft_id": "drf_3q7m1v8k2p5d9h4c" }, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "object": { "const": "draft_file", "type": "string" }, "path": { "description": "Path relative to the Target's package directory.", "type": "string" }, "customization": { "enum": ["added", "edited", "deleted", "mode_changed", null], "description": "How the Draft differs from the last merged package at this path; null when it does not.", "type": ["string", "null"] }, "conflict": { "anyOf": [{ "properties": { "type": { "enum": ["no_common_version", "file_ownership", "yours_deleted_generated_changed", "generated_deleted_yours_changed", "overlapping_text", "too_large_to_merge", "binary_changed", "file_mode_changed"], "description": "Why the Draft needs a decision. no_common_version: there is no last merged version to compare, such as the first Draft of an adopted package. file_ownership: generated output collides with a file you added. yours_deleted_generated_changed and generated_deleted_yours_changed: one side deleted a file the other changed. overlapping_text: both sides edited the same lines. too_large_to_merge: the file has too many changed lines to merge line by line. binary_changed and file_mode_changed: both sides changed binary content or the file mode.", "type": "string" }, "source": { "enum": ["generation", "default_branch", "previous_draft"], "description": "Where the code in this Draft comes from: newly generated files, commits on the default branch, or edits from a Draft whose branch was rebased, reset, or deleted. Typeship may find another conflict after these decisions are applied.", "type": "string" }, "decision": { "enum": ["yours", "generated", "content", null], "description": "Decision saved for this conflict on head_sha; null when none. Typeship continues when every conflict has a decision.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "history": { "anyOf": [{ "properties": { "change": { "enum": ["added", "edited", "deleted", "mode_changed", null], "description": "How the rewritten default branch differs from the last merged package; null when only the Draft differs.", "type": ["string", "null"] }, "draft_differs": { "description": "The Draft branch has a different version than the rewritten default branch. Recovery carries the Draft version forward.", "type": "boolean" } }, "type": "object" }, { "type": "null" }] }, "sides": { "description": "File IDs to read with getFile for a conflict or history file; null for other customized files.", "anyOf": [{ "description": "File IDs for each side of a conflict or history comparison. null means the file is absent on that side.", "properties": { "base": { "anyOf": [{ "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "yours": { "anyOf": [{ "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "generated": { "anyOf": [{ "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] } }, "type": "object" }, { "type": "null" }] } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
28
- { "resource": "drafts", "method": "resolve", "command": ["drafts", "resolve"], "tool": "drafts_resolve", "httpMethod": "POST", "path": "/drafts/{draft_id}/resolve", "summary": "Resolve selected Draft files", "description": "Resolves conflicts on the Draft's head_sha: keep yours or generated, or supply final content as text or, for binary files, base64. Choosing generated for a customized path replaces it with the generated file, or deletes a Draft-only file.\n\nConflict decisions are saved together and can be replaced until applied. Choosing generated for customized paths commits those changes together on the Draft branch. Returns the Draft. When every conflict has a decision, `conflicts.decided` equals `conflicts.total` and Typeship continues the Draft and runs checks. Paths that already match the Draft change nothing.", "toolDescription": "Resolve selected Draft files. Resolves conflicts on the Draft's head_sha: keep yours or generated, or supply final content as text or, for binary files, base64. POST /drafts/{draft_id}/resolve", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": false, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "draft_id", "ts": "draftId", "kind": "path", "type": "string", "required": true, "flag": "draft-id" }, { "name": "expected_head_sha", "ts": "expected_head_sha", "kind": "body", "type": "string", "required": true, "description": "The Draft's head_sha. A newer Draft commit returns 409 resource_changed without saving.", "flag": "expected-head-sha" }, { "name": "resolutions", "ts": "resolutions", "kind": "body", "type": "array", "required": true, "items": { "type": "json" }, "description": "Unique current conflict or customized paths. Choose generated to discard a customization, including a Draft-only file. Final file content must total at most 2 MiB. Decisions apply together or not at all.", "flag": "resolutions" }], "inputSchema": { "type": "object", "properties": { "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "expected_head_sha": { "description": "The Draft's head_sha. A newer Draft commit returns 409 resource_changed without saving.", "examples": ["0123456789abcdef0123456789abcdef01234567"], "pattern": "^[0-9a-fA-F]{40}$", "type": "string", "example": "0123456789abcdef0123456789abcdef01234567" }, "resolutions": { "description": "Unique current conflict or customized paths. Choose generated to discard a customization, including a Draft-only file. Final file content must total at most 2 MiB. Decisions apply together or not at all.", "minItems": 1, "maxItems": 1000, "items": { "anyOf": [{ "properties": { "path": { "minLength": 1, "type": "string" }, "keep": { "enum": ["yours", "generated"], "description": "Keep that version of the file exactly. Keeping an absent version deletes the path.", "type": "string" } }, "required": ["path", "keep"], "additionalProperties": false, "type": "object" }, { "properties": { "path": { "minLength": 1, "type": "string" }, "keep": { "const": "content", "type": "string" }, "content": { "description": "Final file text, stored as UTF-8. An empty string creates an empty file.", "type": "string" }, "mode": { "enum": ["100644", "100755", "120000"], "description": "Git file mode. 100755 is executable; 120000 is a symbolic link whose content is its target.", "type": "string" } }, "required": ["path", "keep", "content", "mode"], "additionalProperties": false, "type": "object" }, { "properties": { "path": { "minLength": 1, "type": "string" }, "keep": { "const": "content", "type": "string" }, "content_base64": { "description": "Final file bytes as canonical base64, for binary files.", "type": "string" }, "mode": { "enum": ["100644", "100755", "120000"], "description": "Git file mode. 100755 is executable; 120000 is a symbolic link whose content is its target.", "type": "string" } }, "required": ["path", "keep", "content_base64", "mode"], "additionalProperties": false, "type": "object" }, { "properties": { "path": { "minLength": 1, "type": "string" }, "keep": { "const": "content", "type": "string" }, "content": { "description": "Delete this file.", "type": "null" } }, "required": ["path", "keep", "content"], "additionalProperties": false, "type": "object" }] }, "type": "array", "example": [{ "path": "src/index.ts", "keep": "content", "mode": "100644", "content": "export { ParcelClient } from \"./client.js\";\nexport type { Shipment, Label } from \"./types.js\";\nexport { createParcelClient } from \"./helper.js\";\n" }] } }, "required": ["draft_id", "expected_head_sha", "resolutions"] }, "exampleArguments": { "draft_id": "drf_3q7m1v8k2p5d9h4c", "expected_head_sha": "0123456789abcdef0123456789abcdef01234567", "resolutions": [{ "path": "src/index.ts", "keep": "content", "mode": "100644", "content": "export { ParcelClient } from \"./client.js\";\nexport type { Shipment, Label } from \"./types.js\";\nexport { createParcelClient } from \"./helper.js\";\n" }] }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "draft", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "status": { "enum": ["none", "working", "action_required", "ready", "merged"], "description": "none: the open Draft has no pending change; generate the Target to start one.", "type": "string" }, "reason": { "enum": ["conflict", "checks_failed", "review_failed", "checks_unavailable", "history_rewritten"], "description": "conflict: resolve the listed files.", "type": "string" }, "version_next": { "description": "Next version for this Draft, or null before a version is selected.", "type": ["string", "null"] }, "version_source": { "enum": ["automatic", "console", "api", "github", null], "description": "Where version_next was selected; null once the Draft merged.", "type": ["string", "null"] }, "readiness": { "anyOf": [{ "description": "Readiness decision for the Draft's head_sha.", "properties": { "status": { "enum": ["success", "failure", "error", "pending"], "description": "success means required checks passed; failure means the Draft needs correction or review; error mea…", "type": "string" }, "description": { "description": "Human-readable explanation of the current decision.", "type": "string" }, "compatibility_api": { "enum": ["compatible", "breaking", "unknown"], "description": "API surface comparison against the latest release.", "type": "string" }, "compatibility_package": { "enum": ["compatible", "breaking", "unknown"], "description": "Package and supported SDK source comparison against the latest release.", "type": "string" }, "version_correct": { "description": "Whether the version satisfies the assessed change.", "type": ["boolean", "null"] }, "bump_required": { "enum": ["major", "minor", "patch", null], "description": "Minimum assessed version bump.", "type": ["string", "null"] }, "version_previous": { "description": "Latest release version used for the comparison.", "type": ["string", "null"] }, "title_error": { "description": "Draft title error that must be corrected before release.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "changes": { "properties": { "changelog": { "description": "Cumulative changelog against the latest release.", "type": ["string", "null"] }, "breaking_count": { "minimum": 0, "type": ["integer", "null"] }, "version_previous": { "type": ["string", "null"] } }, "type": ["object", "null"] }, "head_sha": { "description": "Draft commit that readiness, checks, and conflicts describe.", "type": ["string", "null"] }, "pull_request": { "description": "The Draft pull request in the destination repository, or null before one is opened.", "anyOf": [{ "properties": { "url": { "format": "uri", "type": "string" }, "number": { "minimum": 1, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "generation_id": { "description": "Generation whose package this Draft contains.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "release_id": { "description": "Release this Draft created when it merged; null while open, or when a merge changed only tests or c…", "anyOf": [{ "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When the Draft opened.", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "conflicts": { "description": "Conflict counts for the current merge stage; null when the Draft has no conflicts.", "anyOf": [{ "properties": { "total": { "description": "Conflicts in the current merge stage.", "minimum": 1, "type": "integer" }, "decided": { "description": "Conflicts with a saved decision for head_sha.", "minimum": 0, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "customized_files": { "description": "Files where the Draft differs from the last accepted package; null until the Draft is integrated.", "minimum": 0, "type": ["integer", "null"] }, "history_recovery": { "description": "Present only while status is action_required and reason is history_rewritten.", "anyOf": [{ "description": "The approval inputs for a default-branch history rewrite.", "properties": { "default_sha": { "description": "Rewritten default-branch commit.", "type": "string" }, "head_sha": { "description": "Draft commit Typeship last observed.", "type": ["string", "null"] }, "preserved_branch": { "description": "Existing Draft branch that stays available after recovery opens a new Draft.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
29
- { "resource": "drafts", "method": "recover", "command": ["drafts", "recover"], "tool": "drafts_recover", "httpMethod": "POST", "path": "/drafts/{draft_id}/recover", "summary": "Approve recovery from rewritten default-branch history", "description": "When the Draft has status `action_required` and reason `history_rewritten`, review affected files with `listDraftFiles` and `filter=history`, then approve with the Draft's `history_recovery` revisions. Approval saves the recovery without changing Git and returns the Draft; the next generation rebuilds it from the rewritten default branch. The previous Draft branch stays available, and overlapping code comes back as conflicts to resolve. A rewritten Draft branch alone needs no approval.", "toolDescription": "Approve recovery from rewritten default-branch history. When the Draft has status `action_required` and reason `history_rewritten`, review affected files with `listDraftFiles` and `filter=history`, then approve with the Draft's `history_recovery` revisions. POST /drafts/{draft_id}/recover", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": false, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "draft_id", "ts": "draftId", "kind": "path", "type": "string", "required": true, "flag": "draft-id" }, { "name": "expected_default_sha", "ts": "expected_default_sha", "kind": "body", "type": "string", "required": true, "description": "The Draft's history_recovery.default_sha.", "flag": "expected-default-sha" }, { "name": "expected_head_sha", "ts": "expected_head_sha", "kind": "body", "type": "string", "required": true, "nullable": true, "description": "The Draft's history_recovery.head_sha; null when the Draft branch is absent.", "flag": "expected-head-sha" }], "inputSchema": { "type": "object", "properties": { "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "expected_default_sha": { "description": "The Draft's history_recovery.default_sha.", "pattern": "^[a-fA-F0-9]{40}$", "type": "string", "example": "89abcdef0123456789abcdef0123456789abcdef" }, "expected_head_sha": { "description": "The Draft's history_recovery.head_sha; null when the Draft branch is absent.", "pattern": "^[a-fA-F0-9]{40}$", "type": ["string", "null"], "example": "0123456789abcdef0123456789abcdef01234567" } }, "required": ["draft_id", "expected_default_sha", "expected_head_sha"] }, "exampleArguments": { "draft_id": "drf_3q7m1v8k2p5d9h4c", "expected_default_sha": "89abcdef0123456789abcdef0123456789abcdef", "expected_head_sha": "0123456789abcdef0123456789abcdef01234567" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "draft", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "status": { "enum": ["none", "working", "action_required", "ready", "merged"], "description": "none: the open Draft has no pending change; generate the Target to start one.", "type": "string" }, "reason": { "enum": ["conflict", "checks_failed", "review_failed", "checks_unavailable", "history_rewritten"], "description": "conflict: resolve the listed files.", "type": "string" }, "version_next": { "description": "Next version for this Draft, or null before a version is selected.", "type": ["string", "null"] }, "version_source": { "enum": ["automatic", "console", "api", "github", null], "description": "Where version_next was selected; null once the Draft merged.", "type": ["string", "null"] }, "readiness": { "anyOf": [{ "description": "Readiness decision for the Draft's head_sha.", "properties": { "status": { "enum": ["success", "failure", "error", "pending"], "description": "success means required checks passed; failure means the Draft needs correction or review; error mea…", "type": "string" }, "description": { "description": "Human-readable explanation of the current decision.", "type": "string" }, "compatibility_api": { "enum": ["compatible", "breaking", "unknown"], "description": "API surface comparison against the latest release.", "type": "string" }, "compatibility_package": { "enum": ["compatible", "breaking", "unknown"], "description": "Package and supported SDK source comparison against the latest release.", "type": "string" }, "version_correct": { "description": "Whether the version satisfies the assessed change.", "type": ["boolean", "null"] }, "bump_required": { "enum": ["major", "minor", "patch", null], "description": "Minimum assessed version bump.", "type": ["string", "null"] }, "version_previous": { "description": "Latest release version used for the comparison.", "type": ["string", "null"] }, "title_error": { "description": "Draft title error that must be corrected before release.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "changes": { "properties": { "changelog": { "description": "Cumulative changelog against the latest release.", "type": ["string", "null"] }, "breaking_count": { "minimum": 0, "type": ["integer", "null"] }, "version_previous": { "type": ["string", "null"] } }, "type": ["object", "null"] }, "head_sha": { "description": "Draft commit that readiness, checks, and conflicts describe.", "type": ["string", "null"] }, "pull_request": { "description": "The Draft pull request in the destination repository, or null before one is opened.", "anyOf": [{ "properties": { "url": { "format": "uri", "type": "string" }, "number": { "minimum": 1, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "generation_id": { "description": "Generation whose package this Draft contains.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "release_id": { "description": "Release this Draft created when it merged; null while open, or when a merge changed only tests or c…", "anyOf": [{ "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When the Draft opened.", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "conflicts": { "description": "Conflict counts for the current merge stage; null when the Draft has no conflicts.", "anyOf": [{ "properties": { "total": { "description": "Conflicts in the current merge stage.", "minimum": 1, "type": "integer" }, "decided": { "description": "Conflicts with a saved decision for head_sha.", "minimum": 0, "type": "integer" } }, "type": "object" }, { "type": "null" }] }, "customized_files": { "description": "Files where the Draft differs from the last accepted package; null until the Draft is integrated.", "minimum": 0, "type": ["integer", "null"] }, "history_recovery": { "description": "Present only while status is action_required and reason is history_rewritten.", "anyOf": [{ "description": "The approval inputs for a default-branch history rewrite.", "properties": { "default_sha": { "description": "Rewritten default-branch commit.", "type": "string" }, "head_sha": { "description": "Draft commit Typeship last observed.", "type": ["string", "null"] }, "preserved_branch": { "description": "Existing Draft branch that stays available after recovery opens a new Draft.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
30
- { "resource": "releases", "method": "list", "command": ["releases", "list"], "tool": "releases_list", "httpMethod": "GET", "path": "/releases", "summary": "List releases", "toolDescription": "List releases. GET /releases (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "target_id", "ts": "targetId", "kind": "query", "type": "string", "required": false, "description": "Only releases of this Target. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "release", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "generation_id": { "description": "Null only for a verified release imported during package adoption.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "origin": { "enum": ["typeship", "imported"], "type": "string" }, "version": { "description": "Immutable package version released from this Target.", "type": "string" }, "channel": { "enum": ["stable", "prerelease"], "type": "string" }, "repository": { "anyOf": [{ "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" } }, "type": "object" }, { "type": "null" }] }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "commit_sha": { "description": "Git commit containing the accepted package. Compare it with the Delivery repository history or checked-out commit.", "pattern": "^[0-9a-fA-F]{40}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "approvals": { "items": { "properties": { "source": { "enum": ["source_pr", "draft_pr"], "type": "string" }, "reason": { "type": "string" }, "approved_by": { "type": "string" }, "approved_sha": { "type": "string" }, "approved_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "import_provenance": { "description": "For an adopted Release, compare the tag and registry URL with the published package and its artifact digest. Null for a Release created by Typeship.", "properties": { "tag": { "description": "Git tag to compare with the repository release, if available.", "type": ["string", "null"] }, "registry_url": { "format": "uri", "description": "Published package page to inspect, if available.", "type": ["string", "null"] }, "artifact_digest": { "description": "Published artifact digest to compare with registry metadata, if available.", "type": ["string", "null"] }, "imported_at": { "format": "date-time", "description": "When Typeship recorded the adopted package.", "type": ["string", "null"] } }, "type": ["object", "null"] }, "publications": { "items": { "properties": { "id": { "examples": ["pub_2m8q4v7k1p9d5h6c"], "pattern": "^pub_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "publication", "type": "string" }, "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "destination": { "enum": ["github", "npm", "pypi", "go", "mcp"], "type": "string" }, "status": { "enum": ["pending", "publishing", "published", "failed", "disabled"], "type": "string" }, "attempt": { "minimum": 0, "type": "integer" }, "run_url": { "format": "uri", "type": ["string", "null"] }, "registry_url": { "format": "uri", "type": ["string", "null"] }, "artifact_digest": { "type": ["string", "null"] }, "errors": { "description": "Recorded failures. Empty when this resource has no recorded failure.", "type": "array" }, "started_at": { "format": "date-time", "type": ["string", "null"] }, "finished_at": { "format": "date-time", "type": ["string", "null"] }, "runtime_ms": { "description": "Milliseconds from started_at to finished_at; null until the attempt finishes.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
31
- { "resource": "releases", "method": "get", "command": ["releases", "get"], "tool": "releases_get", "httpMethod": "GET", "path": "/releases/{release_id}", "summary": "Get an immutable release", "toolDescription": "Get an immutable release. GET /releases/{release_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "release_id", "ts": "releaseId", "kind": "path", "type": "string", "required": true, "flag": "release-id" }], "inputSchema": { "type": "object", "properties": { "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" } }, "required": ["release_id"] }, "exampleArguments": { "release_id": "rel_7m2q8v4k1p9d5h6c" }, "outputSchema": { "properties": { "id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "release", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "generation_id": { "description": "Null only for a verified release imported during package adoption.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "origin": { "enum": ["typeship", "imported"], "type": "string" }, "version": { "description": "Immutable package version released from this Target.", "type": "string" }, "channel": { "enum": ["stable", "prerelease"], "type": "string" }, "repository": { "anyOf": [{ "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" } }, "type": "object" }, { "type": "null" }] }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "commit_sha": { "description": "Git commit containing the accepted package. Compare it with the Delivery repository history or checked-out commit.", "pattern": "^[0-9a-fA-F]{40}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "approvals": { "items": { "properties": { "source": { "enum": ["source_pr", "draft_pr"], "type": "string" }, "reason": { "type": "string" }, "approved_by": { "type": "string" }, "approved_sha": { "type": "string" }, "approved_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "import_provenance": { "description": "For an adopted Release, compare the tag and registry URL with the published package and its artifact digest. Null for a Release created by Typeship.", "properties": { "tag": { "description": "Git tag to compare with the repository release, if available.", "type": ["string", "null"] }, "registry_url": { "format": "uri", "description": "Published package page to inspect, if available.", "type": ["string", "null"] }, "artifact_digest": { "description": "Published artifact digest to compare with registry metadata, if available.", "type": ["string", "null"] }, "imported_at": { "format": "date-time", "description": "When Typeship recorded the adopted package.", "type": ["string", "null"] } }, "type": ["object", "null"] }, "publications": { "items": { "properties": { "id": { "examples": ["pub_2m8q4v7k1p9d5h6c"], "pattern": "^pub_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "publication", "type": "string" }, "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "destination": { "enum": ["github", "npm", "pypi", "go", "mcp"], "type": "string" }, "status": { "enum": ["pending", "publishing", "published", "failed", "disabled"], "type": "string" }, "attempt": { "minimum": 0, "type": "integer" }, "run_url": { "format": "uri", "type": ["string", "null"] }, "registry_url": { "format": "uri", "type": ["string", "null"] }, "artifact_digest": { "type": ["string", "null"] }, "errors": { "description": "Recorded failures. Empty when this resource has no recorded failure.", "items": { "type": "object" }, "type": "array" }, "started_at": { "format": "date-time", "type": ["string", "null"] }, "finished_at": { "format": "date-time", "type": ["string", "null"] }, "runtime_ms": { "description": "Milliseconds from started_at to finished_at; null until the attempt finishes.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
32
- { "resource": "releases", "method": "republish", "command": ["releases", "republish"], "tool": "releases_republish", "httpMethod": "POST", "path": "/releases/{release_id}/republish", "summary": "Retry publishing an exact release", "description": "Retries publishing the specified release through its repository workflow. Uses that release's version and accepted commit, even if a newer Draft or release exists.\n\nA `502 repository_unavailable` means the repository publishing workflow could not be dispatched, and nothing was changed.", "toolDescription": "Retry publishing an exact release. Retries publishing the specified release through its repository workflow. POST /releases/{release_id}/republish", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "release_id", "ts": "releaseId", "kind": "path", "type": "string", "required": true, "flag": "release-id" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." } }, "required": ["release_id"] }, "exampleArguments": { "release_id": "rel_7m2q8v4k1p9d5h6c" }, "outputSchema": { "properties": { "id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "release", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "generation_id": { "description": "Null only for a verified release imported during package adoption.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "origin": { "enum": ["typeship", "imported"], "type": "string" }, "version": { "description": "Immutable package version released from this Target.", "type": "string" }, "channel": { "enum": ["stable", "prerelease"], "type": "string" }, "repository": { "anyOf": [{ "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" } }, "type": "object" }, { "type": "null" }] }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "commit_sha": { "description": "Git commit containing the accepted package. Compare it with the Delivery repository history or checked-out commit.", "pattern": "^[0-9a-fA-F]{40}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "approvals": { "items": { "properties": { "source": { "enum": ["source_pr", "draft_pr"], "type": "string" }, "reason": { "type": "string" }, "approved_by": { "type": "string" }, "approved_sha": { "type": "string" }, "approved_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "import_provenance": { "description": "For an adopted Release, compare the tag and registry URL with the published package and its artifact digest. Null for a Release created by Typeship.", "properties": { "tag": { "description": "Git tag to compare with the repository release, if available.", "type": ["string", "null"] }, "registry_url": { "format": "uri", "description": "Published package page to inspect, if available.", "type": ["string", "null"] }, "artifact_digest": { "description": "Published artifact digest to compare with registry metadata, if available.", "type": ["string", "null"] }, "imported_at": { "format": "date-time", "description": "When Typeship recorded the adopted package.", "type": ["string", "null"] } }, "type": ["object", "null"] }, "publications": { "items": { "properties": { "id": { "examples": ["pub_2m8q4v7k1p9d5h6c"], "pattern": "^pub_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "publication", "type": "string" }, "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "destination": { "enum": ["github", "npm", "pypi", "go", "mcp"], "type": "string" }, "status": { "enum": ["pending", "publishing", "published", "failed", "disabled"], "type": "string" }, "attempt": { "minimum": 0, "type": "integer" }, "run_url": { "format": "uri", "type": ["string", "null"] }, "registry_url": { "format": "uri", "type": ["string", "null"] }, "artifact_digest": { "type": ["string", "null"] }, "errors": { "description": "Recorded failures. Empty when this resource has no recorded failure.", "items": { "type": "object" }, "type": "array" }, "started_at": { "format": "date-time", "type": ["string", "null"] }, "finished_at": { "format": "date-time", "type": ["string", "null"] }, "runtime_ms": { "description": "Milliseconds from started_at to finished_at; null until the attempt finishes.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
16
+ { "resource": "targets", "method": "create", "command": ["targets", "create"], "tool": "targets_create", "httpMethod": "POST", "path": "/targets", "summary": "Create a Target", "description": "Creates a Target with its own configuration, Deliveries, and release history. Multiple Targets can use the same generator.", "toolDescription": "Create a Target. Creates a Target with its own configuration, Deliveries, and release history. POST /targets", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "project_id", "ts": "project_id", "kind": "body", "type": "string", "required": true, "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }, { "name": "name", "ts": "name", "kind": "body", "type": "string", "required": true, "flag": "name" }, { "name": "type", "ts": "type", "kind": "body", "type": "string", "required": true, "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target. This is configuration, not identity; several Targets may use the same generator. cli is the TypeScript CLI; go_cli is the native Go CLI, a distinct product that imports one exact paired Go SDK module rather than a client of its own.", "flag": "type" }, { "name": "status", "ts": "status", "kind": "body", "type": "string", "required": false, "enum": ["active", "disabled"], "description": "Default: \"active\".", "flag": "status" }, { "name": "release_channel", "ts": "release_channel", "kind": "body", "type": "string", "required": false, "enum": ["stable", "prerelease"], "description": "Default: \"stable\".", "flag": "release-channel" }, { "name": "checks", "ts": "checks", "kind": "body", "type": "object", "required": false, "description": "Required checks run against the code in the Draft. Generated checks and customer commands share one reproducible workflow; repository_required names existing repository checks. Supplying checks replaces all settings. Omitted generated restores build, package, and public_entrypoint; omitted repository_required and customer restore empty lists. An empty object restores these defaults. An empty array clears the corresponding list.", "flag": "checks" }, { "name": "config", "ts": "config", "kind": "body", "type": "json", "required": false, "nullable": true, "description": "Target-specific overrides merged over Project.config. GraphQL settings are rejected here and belong to the Spec.", "flag": "config" }, { "name": "deliveries", "ts": "deliveries", "kind": "body", "type": "array", "required": false, "items": { "type": "json" }, "flag": "deliveries" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" }, "name": { "minLength": 1, "maxLength": 80, "type": "string", "example": "Parcel CLI" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target. This is configuration, not identity; several Targets may use the same generator. cli is the TypeScript CLI; go_cli is the native Go CLI, a distinct product that imports one exact paired Go SDK module rather than a client of its own.", "type": "string", "example": "cli" }, "status": { "enum": ["active", "disabled"], "default": "active", "type": "string", "description": "Default: \"active\"." }, "release_channel": { "enum": ["stable", "prerelease"], "default": "stable", "type": "string", "description": "Default: \"stable\"." }, "checks": { "description": "Required checks run against the code in the Draft. Generated checks and customer commands share one reproducible workflow; repository_required names existing repository checks. Supplying checks replaces all settings. Omitted generated restores build, package, and public_entrypoint; omitted repository_required and customer restore empty lists. An empty object restores these defaults. An empty array clears the corresponding list.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "properties": { "name": { "minLength": 1, "maxLength": 120, "type": "string" }, "command": { "minLength": 1, "maxLength": 2000, "type": "string" } }, "required": ["name", "command"], "additionalProperties": false, "type": "object" }, "type": "array" } }, "additionalProperties": false, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config. GraphQL settings are rejected here and belong to the Spec.", "anyOf": [{ "description": "Target-specific generation and delivery overrides. Authentication may only select a Project-owned OAuth application. OAuth server metadata, applications, and identity policy remain Project-owned. Self-hosted MCP access may be overridden for a Target-specific deployment.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "items": { "type": "string" }, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path segment, `**` any number), optionally after an HTTP method (`DELETE /zones/*`). Applied before the Spec size limit, with components nothing references any more removed, so a one-shot run can generate part of a Spec up to 64 MB. Selectors that match nothing are reported as generation warnings.", "maxItems": 100, "items": { "minLength": 1, "maxLength": 500, "type": "string" }, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`). Wins over `include`.", "maxItems": 100, "items": { "minLength": 1, "maxLength": 500, "type": "string" }, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "properties": { "max_retries": { "minimum": 0, "maximum": 10, "type": "integer" }, "statuses": { "description": "Replaces the default retryable set (408, 429, 500, 502, 503, 504).", "maxItems": 20, "items": { "type": "integer" }, "type": "array" }, "initial_delay_ms": { "minimum": 1, "type": "integer" }, "max_delay_ms": { "minimum": 1, "type": "integer" }, "retry_non_idempotent": { "description": "Also retry non-idempotent methods (POST/PATCH).", "type": "boolean" }, "disabled": { "description": "Shorthand for max_retries 0.", "type": "boolean" }, "operations": { "additionalProperties": { "description": "RetryTuning (recursive)" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "additionalProperties": { "anyOf": [{ "type": "object" }, { "description": "false disables pagination detection for the operation.", "type": "boolean" }] }, "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target. OAuth server metadata, applications, and identity policy remain Project-owned.", "properties": { "oauth_application": { "description": "Project OAuth application to use. Omit to inherit the Project default.", "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "environments": { "description": "Project OAuth application selections keyed by API environment.", "additionalProperties": { "type": "object" }, "type": ["object", "null"] } }, "additionalProperties": false, "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "properties": { "command_name": { "description": "Command users run, independent of how the CLI is distributed.", "type": ["string", "null"] }, "update_notice": { "description": "Opt in to a once-a-day registry check that prints an upgrade hint. Off by default; generated code phones nobody unless this is enabled.", "type": "boolean" }, "changelog_url": { "description": "Public HTTP(S) URL read by the optional changelog command in generated CLIs. Supports UTF-8 Markdown, plain text, and static HTML; embedded credentials are not allowed. Omit or clear to disable, then regenerate.", "type": ["string", "null"] }, "support_url": { "description": "Where the generated CLI's feedback command sends users. GitHub issues/new URLs get a prefilled title and environment details.", "type": ["string", "null"] }, "mcp_url": { "description": "Hosted MCP endpoint installed by the generated CLI instead of launching the package's local stdio server.", "type": ["string", "null"] }, "skills_repo": { "description": "GitHub owner/name of the skills package the generated CLI offers to install during init.", "type": ["string", "null"] }, "relay": { "description": "Enable webhook relay sessions for this CLI Target. Requires Pro. Turning it off prevents new sessions.", "type": "boolean" } }, "additionalProperties": false, "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "properties": { "registry_name": { "description": "Stable official MCP registry name, independent of the server runtime.", "type": ["string", "null"] }, "access": { "description": "Authorization for callers connecting to a generated MCP server deployed over HTTP. The hosting application resolves upstream API credentials separately at runtime. This setting does not apply to the Typeship-hosted endpoint.", "properties": { "issuer": { "format": "uri", "description": "Exact issuer allowed to sign MCP connection tokens.", "type": "string" }, "resource": { "format": "uri", "description": "Canonical public URL of the self-hosted MCP endpoint that connection tokens must target.", "type": "string" }, "jwks_url": { "format": "uri", "description": "Public signing-key endpoint. Omit to discover it from the issuer.", "type": "string" }, "scopes": { "description": "Minimum scopes required to connect to the self-hosted MCP server.", "maxItems": 20, "type": "array" } }, "required": ["issuer", "resource"], "additionalProperties": false, "type": "object" }, "tool_mode": { "enum": ["auto", "operations", "meta"], "description": "MCP tool shape. meta collapses per-operation tools into search_docs, read_docs, and execute so large APIs don't flood an agent's context window. Auto considers the serialized tool schemas, switching near 10k tokens or above 100 operations.", "type": "string" }, "instructions": { "description": "Guidance appended to the MCP server's instructions, which agents read once when they connect (server/discover): what to call first, conventions the spec does not state, what not to do. Carried by the package's server and the hosted endpoint alike.", "maxLength": 2000, "type": ["string", "null"] }, "tool_descriptions": { "description": "Hand-written MCP tool descriptions keyed by operationId or \"METHOD /path\". Each replaces the text typeship derives for that operation (summary, first sentence, method and path, deprecation and auth notes). For flows the spec cannot describe, such as a multi-step upload. Keys that match no operation are reported as generation warnings.", "additionalProperties": { "maxLength": 600, "type": "string" }, "type": "object" }, "reference_resolvers": { "description": "Exact name-or-ID resolver overrides keyed first by the target operationId or \"METHOD /path\", then by its wire argument name. A resolver names one read collection operation plus 1-4 item fields to match case-insensitively; false opts that argument out of strict inference.", "additionalProperties": { "type": "object" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "properties": { "quickstart_operation": { "description": "operationId or \"METHOD /path\" to feature as the README's first API call. It must be present in the generated package and callable with no required input beyond path placeholders. Missing or unsuitable choices produce a warning and use the automatic example.", "maxLength": 500, "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "properties": { "title": { "description": "The API's name as generated READMEs, AGENTS.md, package descriptions, and help text show it, such as \"Parcel\" for a Spec titled \"Parcel - Public API\". Display only: package, client, and command names still come from the Spec. Defaults to the Spec title with common noise removed (\"Parcel - API\" shows as Parcel).", "maxLength": 100, "type": ["string", "null"] }, "homepage": { "description": "Homepage written into registry metadata.", "type": ["string", "null"] }, "license": { "description": "SPDX identifier written into registry metadata. Defaults to info.license.", "maxLength": 200, "type": ["string", "null"] }, "license_text": { "description": "Exact LICENSE file contents. Supply this for licences the engine does not build in; MIT is built in when copyright is also set.", "maxLength": 100000, "type": ["string", "null"] }, "copyright": { "description": "Copyright line used in generated license files.", "maxLength": 200, "type": ["string", "null"] }, "go_package_name": { "description": "Go identifier when the destination repository name is unsuitable.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }], "example": { "cli": { "command_name": "parcel" } } }, "deliveries": { "maxItems": 2, "items": { "anyOf": [{ "properties": { "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "directory": { "type": ["string", "null"] }, "package_name": { "description": "npm or Python registry identity where applicable.", "type": ["string", "null"] }, "module_path": { "description": "Go module identity for the Go SDK or Go CLI Target where applicable.", "type": ["string", "null"] }, "publish_on_merge": { "description": "Commit repository-owned registry automation and report publication after the Draft merges.", "default": false, "type": "boolean" } }, "required": ["provider", "identifier"], "additionalProperties": false, "type": "object" } }, "required": ["type", "repository"], "additionalProperties": false, "type": "object" }, { "properties": { "type": { "const": "hosted_mcp", "type": "string" } }, "required": ["type"], "additionalProperties": false, "type": "object" }] }, "type": "array", "example": [{ "type": "repository", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": false } }] } }, "required": ["project_id", "name", "type"] }, "exampleArguments": { "project_id": "prj_4f8k2m7x9q1v6b3n", "name": "Parcel CLI", "type": "cli", "config": { "cli": { "command_name": "parcel" } }, "deliveries": [{ "type": "repository", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": false } }] }, "outputSchema": { "properties": { "id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "target", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "name": { "type": "string" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "dependency": { "description": "Present only on a go_cli Target, naming the sibling Go SDK Target the CLI is generated against.", "anyOf": [{ "description": "One Target generated from a sibling Target.", "properties": { "type": { "const": "go_sdk_module", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "status": { "enum": ["active", "disabled"], "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "type": "string" }, "version_current": { "description": "Read-only version of the Target's latest release, or null before its first release.", "type": ["string", "null"] }, "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config.", "anyOf": [{ "description": "Target-specific generation and delivery overrides.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path se…", "maxItems": 100, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`).", "maxItems": 100, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "deliveries": { "description": "At most one repository and one hosted MCP Delivery.", "maxItems": 2, "items": { "anyOf": [{ "type": "object" }, { "type": "object" }] }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
17
+ { "resource": "targets", "method": "list", "command": ["targets", "list"], "tool": "targets_list", "httpMethod": "GET", "path": "/targets", "summary": "List Targets", "toolDescription": "List Targets. GET /targets (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "project_id", "ts": "projectId", "kind": "query", "type": "string", "required": false, "description": "Only Targets in this Project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "description": "All Targets follow reviewed SemVer.", "properties": { "id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "target", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "name": { "type": "string" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "dependency": { "description": "Present only on a go_cli Target, naming the sibling Go SDK Target the CLI is generated against.", "anyOf": [{ "description": "One Target generated from a sibling Target.", "properties": { "type": { "const": "go_sdk_module", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "status": { "enum": ["active", "disabled"], "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "type": "string" }, "version_current": { "description": "Read-only version of the Target's latest release, or null before its first release.", "type": ["string", "null"] }, "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config.", "anyOf": [{ "description": "Target-specific generation and delivery overrides.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path se…", "maxItems": 100, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`).", "maxItems": 100, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "deliveries": { "description": "At most one repository and one hosted MCP Delivery.", "maxItems": 2, "items": { "anyOf": [{ "type": "object" }, { "type": "object" }] }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to ge…", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
18
+ { "resource": "targets", "method": "get", "command": ["targets", "get"], "tool": "targets_get", "httpMethod": "GET", "path": "/targets/{target_id}", "summary": "Get a Target", "toolDescription": "Get a Target. GET /targets/{target_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "target_id", "ts": "targetId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" } }, "required": ["target_id"] }, "exampleArguments": { "target_id": "tgt_5m8q2v7k1p9d4h6c" }, "outputSchema": { "properties": { "id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "target", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "name": { "type": "string" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "dependency": { "description": "Present only on a go_cli Target, naming the sibling Go SDK Target the CLI is generated against.", "anyOf": [{ "description": "One Target generated from a sibling Target.", "properties": { "type": { "const": "go_sdk_module", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "status": { "enum": ["active", "disabled"], "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "type": "string" }, "version_current": { "description": "Read-only version of the Target's latest release, or null before its first release.", "type": ["string", "null"] }, "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config.", "anyOf": [{ "description": "Target-specific generation and delivery overrides.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path se…", "maxItems": 100, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`).", "maxItems": 100, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "deliveries": { "description": "At most one repository and one hosted MCP Delivery.", "maxItems": 2, "items": { "anyOf": [{ "type": "object" }, { "type": "object" }] }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
19
+ { "resource": "targets", "method": "update", "command": ["targets", "update"], "tool": "targets_update", "httpMethod": "PATCH", "path": "/targets/{target_id}", "summary": "Update a Target", "description": "Omitted fields keep their current values. Supplied config and checks replace their complete stored values. Change Deliveries with createDelivery, updateDelivery, and deleteDelivery.\nWith Project auto_generate enabled, changing Target config or checks queues that Target's Generation. A queued or running Target reuses that Generation.\nOmitting If-Match applies the update to the current resource; with If-Match, a stale ETag returns 412 precondition_failed without saving.\nSelect the next version through PATCH /drafts/{draft_id} on the Target's draft_id.\n\nA `409 target_busy` means the Target is publishing; wait for it to finish. A `409 delivery_conflict` means another Target owns the requested repository tree; retrieve both Targets, choose a free destination, and retry.\nA `502 follow_up_failed` means the update was saved, but retiring an obsolete review or regenerating the Target failed. Retrieve the Target and follow the error's retryable and suggested_action fields.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Update a Target. Omitted fields keep their current values. PATCH /targets/{target_id}", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "target_id", "ts": "targetId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "name", "ts": "name", "kind": "body", "type": "string", "required": false, "flag": "name" }, { "name": "status", "ts": "status", "kind": "body", "type": "string", "required": false, "enum": ["active", "disabled"], "flag": "status" }, { "name": "release_channel", "ts": "release_channel", "kind": "body", "type": "string", "required": false, "enum": ["stable", "prerelease"], "flag": "release-channel" }, { "name": "checks", "ts": "checks", "kind": "body", "type": "object", "required": false, "description": "Required checks run against the code in the Draft. Generated checks and customer commands share one reproducible workflow; repository_required names existing repository checks. Supplying checks replaces all settings. Omitted generated restores build, package, and public_entrypoint; omitted repository_required and customer restore empty lists. An empty object restores these defaults. An empty array clears the corresponding list.", "flag": "checks" }, { "name": "config", "ts": "config", "kind": "body", "type": "json", "required": false, "nullable": true, "description": "Replaces the complete stored override object. Send null or an empty object to resume Project inheritance. Effective values merge over Project.config; GraphQL settings belong to the Spec.", "flag": "config" }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." }, "name": { "minLength": 1, "maxLength": 80, "type": "string" }, "status": { "enum": ["active", "disabled"], "type": "string", "example": "disabled" }, "release_channel": { "enum": ["stable", "prerelease"], "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft. Generated checks and customer commands share one reproducible workflow; repository_required names existing repository checks. Supplying checks replaces all settings. Omitted generated restores build, package, and public_entrypoint; omitted repository_required and customer restore empty lists. An empty object restores these defaults. An empty array clears the corresponding list.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "properties": { "name": { "minLength": 1, "maxLength": 120, "type": "string" }, "command": { "minLength": 1, "maxLength": 2000, "type": "string" } }, "required": ["name", "command"], "additionalProperties": false, "type": "object" }, "type": "array" } }, "additionalProperties": false, "type": "object" }, "config": { "description": "Replaces the complete stored override object. Send null or an empty object to resume Project inheritance. Effective values merge over Project.config; GraphQL settings belong to the Spec.", "anyOf": [{ "description": "Target-specific generation and delivery overrides. Authentication may only select a Project-owned OAuth application. OAuth server metadata, applications, and identity policy remain Project-owned. Self-hosted MCP access may be overridden for a Target-specific deployment.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "items": { "type": "string" }, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path segment, `**` any number), optionally after an HTTP method (`DELETE /zones/*`). Applied before the Spec size limit, with components nothing references any more removed, so a one-shot run can generate part of a Spec up to 64 MB. Selectors that match nothing are reported as generation warnings.", "maxItems": 100, "items": { "minLength": 1, "maxLength": 500, "type": "string" }, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`). Wins over `include`.", "maxItems": 100, "items": { "minLength": 1, "maxLength": 500, "type": "string" }, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "properties": { "max_retries": { "minimum": 0, "maximum": 10, "type": "integer" }, "statuses": { "description": "Replaces the default retryable set (408, 429, 500, 502, 503, 504).", "maxItems": 20, "items": { "type": "integer" }, "type": "array" }, "initial_delay_ms": { "minimum": 1, "type": "integer" }, "max_delay_ms": { "minimum": 1, "type": "integer" }, "retry_non_idempotent": { "description": "Also retry non-idempotent methods (POST/PATCH).", "type": "boolean" }, "disabled": { "description": "Shorthand for max_retries 0.", "type": "boolean" }, "operations": { "additionalProperties": { "description": "RetryTuning (recursive)" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "additionalProperties": { "anyOf": [{ "type": "object" }, { "description": "false disables pagination detection for the operation.", "type": "boolean" }] }, "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target. OAuth server metadata, applications, and identity policy remain Project-owned.", "properties": { "oauth_application": { "description": "Project OAuth application to use. Omit to inherit the Project default.", "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "environments": { "description": "Project OAuth application selections keyed by API environment.", "additionalProperties": { "type": "object" }, "type": ["object", "null"] } }, "additionalProperties": false, "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "properties": { "command_name": { "description": "Command users run, independent of how the CLI is distributed.", "type": ["string", "null"] }, "update_notice": { "description": "Opt in to a once-a-day registry check that prints an upgrade hint. Off by default; generated code phones nobody unless this is enabled.", "type": "boolean" }, "changelog_url": { "description": "Public HTTP(S) URL read by the optional changelog command in generated CLIs. Supports UTF-8 Markdown, plain text, and static HTML; embedded credentials are not allowed. Omit or clear to disable, then regenerate.", "type": ["string", "null"] }, "support_url": { "description": "Where the generated CLI's feedback command sends users. GitHub issues/new URLs get a prefilled title and environment details.", "type": ["string", "null"] }, "mcp_url": { "description": "Hosted MCP endpoint installed by the generated CLI instead of launching the package's local stdio server.", "type": ["string", "null"] }, "skills_repo": { "description": "GitHub owner/name of the skills package the generated CLI offers to install during init.", "type": ["string", "null"] }, "relay": { "description": "Enable webhook relay sessions for this CLI Target. Requires Pro. Turning it off prevents new sessions.", "type": "boolean" } }, "additionalProperties": false, "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "properties": { "registry_name": { "description": "Stable official MCP registry name, independent of the server runtime.", "type": ["string", "null"] }, "access": { "description": "Authorization for callers connecting to a generated MCP server deployed over HTTP. The hosting application resolves upstream API credentials separately at runtime. This setting does not apply to the Typeship-hosted endpoint.", "properties": { "issuer": { "format": "uri", "description": "Exact issuer allowed to sign MCP connection tokens.", "type": "string" }, "resource": { "format": "uri", "description": "Canonical public URL of the self-hosted MCP endpoint that connection tokens must target.", "type": "string" }, "jwks_url": { "format": "uri", "description": "Public signing-key endpoint. Omit to discover it from the issuer.", "type": "string" }, "scopes": { "description": "Minimum scopes required to connect to the self-hosted MCP server.", "maxItems": 20, "type": "array" } }, "required": ["issuer", "resource"], "additionalProperties": false, "type": "object" }, "tool_mode": { "enum": ["auto", "operations", "meta"], "description": "MCP tool shape. meta collapses per-operation tools into search_docs, read_docs, and execute so large APIs don't flood an agent's context window. Auto considers the serialized tool schemas, switching near 10k tokens or above 100 operations.", "type": "string" }, "instructions": { "description": "Guidance appended to the MCP server's instructions, which agents read once when they connect (server/discover): what to call first, conventions the spec does not state, what not to do. Carried by the package's server and the hosted endpoint alike.", "maxLength": 2000, "type": ["string", "null"] }, "tool_descriptions": { "description": "Hand-written MCP tool descriptions keyed by operationId or \"METHOD /path\". Each replaces the text typeship derives for that operation (summary, first sentence, method and path, deprecation and auth notes). For flows the spec cannot describe, such as a multi-step upload. Keys that match no operation are reported as generation warnings.", "additionalProperties": { "maxLength": 600, "type": "string" }, "type": "object" }, "reference_resolvers": { "description": "Exact name-or-ID resolver overrides keyed first by the target operationId or \"METHOD /path\", then by its wire argument name. A resolver names one read collection operation plus 1-4 item fields to match case-insensitively; false opts that argument out of strict inference.", "additionalProperties": { "type": "object" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "properties": { "quickstart_operation": { "description": "operationId or \"METHOD /path\" to feature as the README's first API call. It must be present in the generated package and callable with no required input beyond path placeholders. Missing or unsuitable choices produce a warning and use the automatic example.", "maxLength": 500, "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "properties": { "title": { "description": "The API's name as generated READMEs, AGENTS.md, package descriptions, and help text show it, such as \"Parcel\" for a Spec titled \"Parcel - Public API\". Display only: package, client, and command names still come from the Spec. Defaults to the Spec title with common noise removed (\"Parcel - API\" shows as Parcel).", "maxLength": 100, "type": ["string", "null"] }, "homepage": { "description": "Homepage written into registry metadata.", "type": ["string", "null"] }, "license": { "description": "SPDX identifier written into registry metadata. Defaults to info.license.", "maxLength": 200, "type": ["string", "null"] }, "license_text": { "description": "Exact LICENSE file contents. Supply this for licences the engine does not build in; MIT is built in when copyright is also set.", "maxLength": 100000, "type": ["string", "null"] }, "copyright": { "description": "Copyright line used in generated license files.", "maxLength": 200, "type": ["string", "null"] }, "go_package_name": { "description": "Go identifier when the destination repository name is unsuitable.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] } }, "required": ["target_id"] }, "exampleArguments": { "target_id": "tgt_5m8q2v7k1p9d4h6c", "status": "disabled" }, "outputSchema": { "properties": { "id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "target", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_id": { "description": "Unique identifier for a project's logical API Spec.", "examples": ["spec_2p8m4q7k1v9d6h3c"], "pattern": "^spec_[a-z0-9]{16}$", "type": "string" }, "name": { "type": "string" }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "dependency": { "description": "Present only on a go_cli Target, naming the sibling Go SDK Target the CLI is generated against.", "anyOf": [{ "description": "One Target generated from a sibling Target.", "properties": { "type": { "const": "go_sdk_module", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "status": { "enum": ["active", "disabled"], "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "type": "string" }, "version_current": { "description": "Read-only version of the Target's latest release, or null before its first release.", "type": ["string", "null"] }, "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "checks": { "description": "Required checks run against the code in the Draft.", "properties": { "generated": { "default": ["build", "package", "public_entrypoint"], "uniqueItems": true, "items": { "enum": ["build", "package", "public_entrypoint"], "type": "string" }, "type": "array" }, "repository_required": { "maxItems": 50, "uniqueItems": true, "items": { "minLength": 1, "maxLength": 120, "type": "string" }, "type": "array" }, "customer": { "maxItems": 20, "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "config": { "description": "Target-specific overrides merged over Project.config.", "anyOf": [{ "description": "Target-specific generation and delivery overrides.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-ap…", "maxItems": 20, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path se…", "maxItems": 100, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`).", "maxItems": 100, "type": "array" }, "retries": { "description": "Retry behavior.", "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\".", "type": "object" }, "auth": { "description": "Selects a Project OAuth application for one Target.", "type": "object" }, "cli": { "description": "How the generated CLI behaves.", "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave.", "type": "object" }, "readme": { "description": "Generated README behavior.", "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own.", "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "deliveries": { "description": "At most one repository and one hosted MCP Delivery.", "maxItems": 2, "items": { "anyOf": [{ "type": "object" }, { "type": "object" }] }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
20
+ { "resource": "targets", "method": "delete", "command": ["targets", "delete"], "tool": "targets_delete", "httpMethod": "DELETE", "path": "/targets/{target_id}", "summary": "Delete a Target", "description": "Deletes a Target with no Generation history, release history, or active Draft. A `409 resource_has_dependencies` means one of those resources still depends on it. Retrieve the Target, disable it instead, or resolve the dependency before retrying.\n\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Delete a Target. Deletes a Target with no Generation history, release history, or active Draft. DELETE /targets/{target_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "destructive", "params": [{ "name": "target_id", "ts": "targetId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." } }, "required": ["target_id"] }, "exampleArguments": { "target_id": "tgt_5m8q2v7k1p9d4h6c" }, "outputSchema": { "properties": { "id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "target", "type": "string" }, "deleted": { "const": true, "type": "boolean" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
21
+ { "resource": "targets", "method": "adopt", "command": ["targets", "adopt"], "tool": "targets_adopt", "httpMethod": "POST", "path": "/targets/{target_id}/adopt", "summary": "Adopt a package release", "description": "Checks the repository tag, package metadata, and registry artifact, then records the package as an Imported latest release. Opens the first Typeship Draft at the next major version; review it to establish the baseline for preserving existing code.", "toolDescription": "Adopt a package release. Checks the repository tag, package metadata, and registry artifact, then records the package as an Imported latest release. POST /targets/{target_id}/adopt", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "target_id", "ts": "targetId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "version", "ts": "version", "kind": "body", "type": "string", "required": true, "description": "Exact already-published package version to make the latest release.", "flag": "body-version" }, { "name": "tag", "ts": "tag", "kind": "body", "type": "string", "required": true, "description": "Immutable repository tag containing the matching package source.", "flag": "tag" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" }, "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "version": { "description": "Exact already-published package version to make the latest release.", "type": "string", "example": "1.0.0" }, "tag": { "description": "Immutable repository tag containing the matching package source.", "minLength": 1, "maxLength": 255, "type": "string", "example": "v1.0.0" } }, "required": ["target_id", "version", "tag"] }, "exampleArguments": { "target_id": "tgt_5m8q2v7k1p9d4h6c", "version": "1.0.0", "tag": "v1.0.0" }, "outputSchema": { "properties": { "id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "release", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "generation_id": { "description": "Null only for a verified release imported during package adoption.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "origin": { "enum": ["typeship", "imported"], "type": "string" }, "version": { "description": "Immutable package version released from this Target.", "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "description": "The Target's release_channel when this version was released.", "type": "string" }, "repository": { "anyOf": [{ "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" } }, "type": "object" }, { "type": "null" }] }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "commit_sha": { "description": "Git commit containing the accepted package. Compare it with the Delivery repository history or checked-out commit.", "pattern": "^[0-9a-fA-F]{40}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "approvals": { "items": { "properties": { "source": { "enum": ["source_pr", "draft_pr"], "type": "string" }, "reason": { "type": "string" }, "approved_by": { "type": "string" }, "approved_sha": { "type": "string" }, "approved_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "import_provenance": { "description": "For an adopted Release, compare the tag and registry URL with the published package and its artifact digest. Null for a Release created by Typeship.", "properties": { "tag": { "description": "Git tag to compare with the repository release, if available.", "type": ["string", "null"] }, "registry_url": { "format": "uri", "description": "Published package page to inspect, if available.", "type": ["string", "null"] }, "artifact_digest": { "description": "Published artifact digest to compare with registry metadata, if available.", "type": ["string", "null"] }, "imported_at": { "format": "date-time", "description": "When Typeship recorded the adopted package.", "type": ["string", "null"] } }, "type": ["object", "null"] }, "publications": { "description": "One entry per destination Typeship has attempted to publish. Empty when publishing is off for the Target's repository Delivery.", "items": { "description": "One destination's publishing progress for its Release. It has no ID; read it on the Release.", "properties": { "type": { "enum": ["github", "npm", "pypi", "go", "mcp"], "description": "Where the release is published. github is the repository's GitHub Release; the others are package registries.", "type": "string" }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "queued: the repository workflow has not started this destination; get the Publication or its Release again. running: the workflow is publishing; get it again. completed: the package is published at registry_url. failed: read errors, correct the cause, then retry the Release. Lifecycle events are publication.running, publication.completed, and publication.failed.", "type": "string" }, "attempt": { "minimum": 0, "type": "integer" }, "run_url": { "format": "uri", "type": ["string", "null"] }, "registry_url": { "format": "uri", "type": ["string", "null"] }, "artifact_digest": { "type": ["string", "null"] }, "errors": { "description": "Recorded failures. Empty when this resource has no recorded failure.", "items": { "type": "object" }, "type": "array" }, "started_at": { "format": "date-time", "type": ["string", "null"] }, "finished_at": { "format": "date-time", "type": ["string", "null"] }, "runtime_ms": { "description": "Milliseconds from started_at to finished_at; null until the attempt finishes.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When a Publication of this release last changed. The version, commit, and checks never change after the release is created.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
22
+ { "resource": "deliveries", "method": "create", "command": ["deliveries", "create"], "tool": "deliveries_create", "httpMethod": "POST", "path": "/deliveries", "summary": "Create a Delivery", "description": "Adds a repository or hosted MCP Delivery to a Target. A Target has at most one Delivery of each type; a `409 delivery_exists` means it already has one, so update that Delivery instead.\nWith Project auto_generate enabled, adding a Delivery queues the Target's Generation. A queued or running Target reuses that Generation.\n\nA `409 delivery_conflict` means another Target owns the requested repository directory. A `409 target_busy` means the Target is publishing; wait for it to finish.\nA `502 follow_up_failed` means the Delivery was saved, but retiring an obsolete review or regenerating the Target failed. Get the Delivery and follow the error's retryable and suggested_action fields.", "toolDescription": "Create a Delivery. Adds a repository or hosted MCP Delivery to a Target. POST /deliveries", "paginated": false, "hasBody": true, "bodyStyle": "data", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "body": { "anyOf": [{ "properties": { "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "type": { "const": "repository", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "directory": { "type": ["string", "null"] }, "package_name": { "description": "npm or Python registry identity where applicable.", "type": ["string", "null"] }, "module_path": { "description": "Go module identity for the Go SDK or Go CLI Target where applicable.", "type": ["string", "null"] }, "publish_on_merge": { "description": "Commit repository-owned registry automation and report publication after the Draft merges.", "default": false, "type": "boolean" } }, "required": ["provider", "identifier"], "additionalProperties": false, "type": "object" } }, "required": ["target_id", "type", "repository"], "additionalProperties": false, "type": "object" }, { "properties": { "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "type": { "const": "hosted_mcp", "type": "string" } }, "required": ["target_id", "type"], "additionalProperties": false, "type": "object" }], "example": { "target_id": "tgt_5m8q2v7k1p9d4h6c", "type": "repository", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": false } } } }, "required": ["body"] }, "exampleArguments": { "body": { "target_id": "tgt_5m8q2v7k1p9d4h6c", "type": "repository", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": false } } }, "outputSchema": { "description": "repository is present for a repository Delivery, with issues, required_checks, and last_event; hosted_mcp is present for a hosted_mcp Delivery.", "properties": { "id": { "examples": ["dlv_4q8m2v7k1p9d5h6c"], "pattern": "^dlv_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "delivery", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "type": { "enum": ["repository", "hosted_mcp"], "type": "string" }, "status": { "enum": ["active", "action_required", "disabled"], "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "directory": { "type": ["string", "null"] }, "package_name": { "type": ["string", "null"] }, "module_path": { "type": ["string", "null"] }, "publish_on_merge": { "type": "boolean" } }, "type": "object" }, "issues": { "items": { "properties": { "code": { "enum": ["app_not_installed", "repository_unreachable", "contents_write_missing", "pull_request_missing", "approval_label_missing", "check_missing", "event_failed"], "type": "string" }, "message": { "description": "Specific customer action or repository setting to inspect.", "type": "string" } }, "type": "object" }, "type": "array" }, "required_checks": { "items": { "type": "string" }, "type": "array" }, "last_event": { "anyOf": [{ "properties": { "event": { "description": "Repository event type.", "type": "string" }, "status": { "enum": ["queued", "running", "completed", "failed", "superseded"], "description": "superseded: a newer event for the same repository replaced this one before it finished.", "type": "string" }, "created_at": { "format": "date-time", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "hosted_mcp": { "properties": { "url": { "format": "uri", "description": "Hosted MCP endpoint for this Target, or null while it is being provisioned.", "type": ["string", "null"] } }, "type": "object" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
33
23
  { "resource": "deliveries", "method": "list", "command": ["deliveries", "list"], "tool": "deliveries_list", "httpMethod": "GET", "path": "/deliveries", "summary": "List Deliveries", "toolDescription": "List Deliveries. GET /deliveries (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "target_id", "ts": "targetId", "kind": "query", "type": "string", "required": false, "description": "Only Deliveries of this Target. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "anyOf": [{ "properties": { "id": { "examples": ["dlv_4q8m2v7k1p9d5h6c"], "pattern": "^dlv_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "delivery", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "type": { "const": "repository", "type": "string" }, "status": { "enum": ["active", "action_required", "disabled"], "description": "active: the repository accepts generated changes. action_required: inspect issues for the correction. disabled: the Target is disabled and receives no changes.", "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "directory": { "type": ["string", "null"] }, "package_name": { "type": ["string", "null"] }, "module_path": { "type": ["string", "null"] }, "publish_on_merge": { "type": "boolean" } }, "type": "object" }, "issues": { "items": { "type": "object" }, "type": "array" }, "required_checks": { "description": "Repository check names Typeship expects before accepting a Draft.", "items": { "type": "string" }, "type": "array" }, "last_event": { "description": "Last observed repository event relevant to this Delivery, if available. A failed event adds an actionable issue.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, { "properties": { "id": { "examples": ["dlv_4q8m2v7k1p9d5h6c"], "pattern": "^dlv_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "delivery", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "type": { "const": "hosted_mcp", "type": "string" }, "status": { "enum": ["active", "disabled"], "description": "active: the endpoint serves the Target's latest accepted package. disabled: the Target is disabled and the endpoint is paused.", "type": "string" }, "hosted_mcp": { "properties": { "url": { "format": "uri", "description": "Hosted MCP endpoint for this Target, or null while it is being provisioned.", "type": ["string", "null"] } }, "type": "object" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }] } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
34
24
  { "resource": "deliveries", "method": "get", "command": ["deliveries", "get"], "tool": "deliveries_get", "httpMethod": "GET", "path": "/deliveries/{delivery_id}", "summary": "Get a Delivery", "description": "Returns the configured repository or hosted MCP Delivery for a Target. A Delivery in another organization returns 404 resource_not_found.", "toolDescription": "Get a Delivery. Returns the configured repository or hosted MCP Delivery for a Target. GET /deliveries/{delivery_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "delivery_id", "ts": "deliveryId", "kind": "path", "type": "string", "required": true, "flag": "delivery-id" }], "inputSchema": { "type": "object", "properties": { "delivery_id": { "examples": ["dlv_4q8m2v7k1p9d5h6c"], "pattern": "^dlv_[a-z0-9]{16}$", "type": "string" } }, "required": ["delivery_id"] }, "exampleArguments": { "delivery_id": "dlv_4q8m2v7k1p9d5h6c" }, "outputSchema": { "description": "repository is present for a repository Delivery, with issues, required_checks, and last_event; hosted_mcp is present for a hosted_mcp Delivery.", "properties": { "id": { "examples": ["dlv_4q8m2v7k1p9d5h6c"], "pattern": "^dlv_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "delivery", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "type": { "enum": ["repository", "hosted_mcp"], "type": "string" }, "status": { "enum": ["active", "action_required", "disabled"], "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "directory": { "type": ["string", "null"] }, "package_name": { "type": ["string", "null"] }, "module_path": { "type": ["string", "null"] }, "publish_on_merge": { "type": "boolean" } }, "type": "object" }, "issues": { "items": { "properties": { "code": { "enum": ["app_not_installed", "repository_unreachable", "contents_write_missing", "pull_request_missing", "approval_label_missing", "check_missing", "event_failed"], "type": "string" }, "message": { "description": "Specific customer action or repository setting to inspect.", "type": "string" } }, "type": "object" }, "type": "array" }, "required_checks": { "items": { "type": "string" }, "type": "array" }, "last_event": { "anyOf": [{ "properties": { "event": { "description": "Repository event type.", "type": "string" }, "status": { "enum": ["queued", "running", "completed", "failed", "superseded"], "description": "superseded: a newer event for the same repository replaced this one before it finished.", "type": "string" }, "created_at": { "format": "date-time", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "hosted_mcp": { "properties": { "url": { "format": "uri", "description": "Hosted MCP endpoint for this Target, or null while it is being provisioned.", "type": ["string", "null"] } }, "type": "object" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
35
- { "resource": "publications", "method": "list", "command": ["publications", "list"], "tool": "publications_list", "httpMethod": "GET", "path": "/publications", "summary": "List publications", "toolDescription": "List publications. GET /publications (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "release_id", "ts": "releaseId", "kind": "query", "type": "string", "required": false, "description": "Only publications of this release.", "flag": "release-id" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string", "description": "Only publications of this release." } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "id": { "examples": ["pub_2m8q4v7k1p9d5h6c"], "pattern": "^pub_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "publication", "type": "string" }, "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "destination": { "enum": ["github", "npm", "pypi", "go", "mcp"], "type": "string" }, "status": { "enum": ["pending", "publishing", "published", "failed", "disabled"], "type": "string" }, "attempt": { "minimum": 0, "type": "integer" }, "run_url": { "format": "uri", "type": ["string", "null"] }, "registry_url": { "format": "uri", "type": ["string", "null"] }, "artifact_digest": { "type": ["string", "null"] }, "errors": { "description": "Recorded failures. Empty when this resource has no recorded failure.", "items": { "properties": { "type": { "enum": ["request", "auth", "idempotency", "rate_limit", "organization", "source", "api"], "description": "Who can resolve the error. request: change the request. auth: fix the credential or its grant. idempotency: change or wait on the Idempotency-Key. rate_limit: wait before retrying. organization: the organization's plan must change. source: a system you own failed, such as the Spec URL, repository, or package registry. api: Typeship failed.", "type": "string" }, "code": { "enum": ["input_invalid", "query_param_invalid", "cursor_invalid", "method_not_allowed", "resource_not_found", "idempotency_key_invalid", "idempotency_key_reused", "idempotency_key_in_use", "auth_required", "api_key_invalid", "token_invalid", "organization_required", "insufficient_scope", "role_insufficient", "rate_limit_exceeded", "plan_limit_reached", "spec_invalid", "spec_too_large", "spec_unreachable", "repository_provider_unsupported", "repository_disconnected", "repository_unavailable", "target_busy", "targets_inactive", "no_draft", "draft_merged", "resource_changed", "precondition_failed", "version_invalid", "version_occupied", "version_too_low", "target_already_released", "adoption_unverified", "publication_disabled", "publication_not_retryable", "publication_recovery_unavailable", "publication_failed", "delivery_conflict", "resource_has_dependencies", "customization_conflict", "history_recovery_required", "checks_unavailable", "dependency_missing", "dependency_not_found", "dependency_self", "dependency_cycle", "dependency_cross_project", "dependency_cross_lineage", "dependency_wrong_generator", "dependency_disabled", "dependency_module_path_missing", "dependency_unreleased", "dependency_revision_mismatch", "regeneration_failed", "follow_up_failed", "api_error"], "description": "Stable programmatic identifier. Do not branch on message.", "type": "string" }, "phase": { "enum": ["spec", "generation", "delivery", "publication"], "description": "The stage that failed. A delivery failure does not change a completed Generation's status.", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "field": { "description": "JSON Pointer to the invalid field within the request part named by in. When in is omitted, the pointer refers to the request body. Header pointers use lowercase header names, such as /idempotency-key.", "type": "string" }, "in": { "enum": ["body", "query", "header"], "description": "Request part containing field. Query-parameter errors use query; header errors use header. Body errors use body or omit in.", "type": "string" }, "message": { "description": "Human-readable explanation. Its wording may change.", "type": "string" }, "retryable": { "description": "Whether another attempt can succeed without correcting the inputs. For a recorded failure, start generation or publishing again; retrieving the resource or replaying an idempotency key does not start another attempt.", "type": "boolean" }, "suggested_action": { "description": "Stable, concise recovery instruction suitable for a person or agent.", "type": "string" }, "docs_url": { "format": "uri", "description": "Documentation for this class of error.", "type": "string" } }, "type": "object" }, "type": "array" }, "started_at": { "format": "date-time", "type": ["string", "null"] }, "finished_at": { "format": "date-time", "type": ["string", "null"] }, "runtime_ms": { "description": "Milliseconds from started_at to finished_at; null until the attempt finishes.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
36
- { "resource": "publications", "method": "get", "command": ["publications", "get"], "tool": "publications_get", "httpMethod": "GET", "path": "/publications/{publication_id}", "summary": "Get publishing status", "description": "Returns the registry publishing status for a release. A status in another organization returns 404 resource_not_found.", "toolDescription": "Get publishing status. Returns the registry publishing status for a release. GET /publications/{publication_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "publication_id", "ts": "publicationId", "kind": "path", "type": "string", "required": true, "flag": "publication-id" }], "inputSchema": { "type": "object", "properties": { "publication_id": { "examples": ["pub_2m8q4v7k1p9d5h6c"], "pattern": "^pub_[a-z0-9]{16}$", "type": "string" } }, "required": ["publication_id"] }, "exampleArguments": { "publication_id": "pub_2m8q4v7k1p9d5h6c" }, "outputSchema": { "properties": { "id": { "examples": ["pub_2m8q4v7k1p9d5h6c"], "pattern": "^pub_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "publication", "type": "string" }, "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "destination": { "enum": ["github", "npm", "pypi", "go", "mcp"], "type": "string" }, "status": { "enum": ["pending", "publishing", "published", "failed", "disabled"], "type": "string" }, "attempt": { "minimum": 0, "type": "integer" }, "run_url": { "format": "uri", "type": ["string", "null"] }, "registry_url": { "format": "uri", "type": ["string", "null"] }, "artifact_digest": { "type": ["string", "null"] }, "errors": { "description": "Recorded failures. Empty when this resource has no recorded failure.", "items": { "properties": { "type": { "enum": ["request", "auth", "idempotency", "rate_limit", "organization", "source", "api"], "description": "Who can resolve the error. request: change the request. auth: fix the credential or its grant. idempotency: change or wait on the Idempotency-Key. rate_limit: wait before retrying. organization: the organization's plan must change. source: a system you own failed, such as the Spec URL, repository, or package registry. api: Typeship failed.", "type": "string" }, "code": { "enum": ["input_invalid", "query_param_invalid", "cursor_invalid", "method_not_allowed", "resource_not_found", "idempotency_key_invalid", "idempotency_key_reused", "idempotency_key_in_use", "auth_required", "api_key_invalid", "token_invalid", "organization_required", "insufficient_scope", "role_insufficient", "rate_limit_exceeded", "plan_limit_reached", "spec_invalid", "spec_too_large", "spec_unreachable", "repository_provider_unsupported", "repository_disconnected", "repository_unavailable", "target_busy", "targets_inactive", "no_draft", "draft_merged", "resource_changed", "precondition_failed", "version_invalid", "version_occupied", "version_too_low", "target_already_released", "adoption_unverified", "publication_disabled", "publication_not_retryable", "publication_recovery_unavailable", "publication_failed", "delivery_conflict", "resource_has_dependencies", "customization_conflict", "history_recovery_required", "checks_unavailable", "dependency_missing", "dependency_not_found", "dependency_self", "dependency_cycle", "dependency_cross_project", "dependency_cross_lineage", "dependency_wrong_generator", "dependency_disabled", "dependency_module_path_missing", "dependency_unreleased", "dependency_revision_mismatch", "regeneration_failed", "follow_up_failed", "api_error"], "description": "Stable programmatic identifier. Do not branch on message.", "type": "string" }, "phase": { "enum": ["spec", "generation", "delivery", "publication"], "description": "The stage that failed. A delivery failure does not change a completed Generation's status.", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "field": { "description": "JSON Pointer to the invalid field within the request part named by in. When in is omitted, the pointer refers to the request body. Header pointers use lowercase header names, such as /idempotency-key.", "type": "string" }, "in": { "enum": ["body", "query", "header"], "description": "Request part containing field. Query-parameter errors use query; header errors use header. Body errors use body or omit in.", "type": "string" }, "message": { "description": "Human-readable explanation. Its wording may change.", "type": "string" }, "retryable": { "description": "Whether another attempt can succeed without correcting the inputs. For a recorded failure, start generation or publishing again; retrieving the resource or replaying an idempotency key does not start another attempt.", "type": "boolean" }, "suggested_action": { "description": "Stable, concise recovery instruction suitable for a person or agent.", "type": "string" }, "docs_url": { "format": "uri", "description": "Documentation for this class of error.", "type": "string" } }, "type": "object" }, "type": "array" }, "started_at": { "format": "date-time", "type": ["string", "null"] }, "finished_at": { "format": "date-time", "type": ["string", "null"] }, "runtime_ms": { "description": "Milliseconds from started_at to finished_at; null until the attempt finishes.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
37
- { "resource": "generations", "method": "list", "command": ["generations", "list"], "tool": "generations_list", "httpMethod": "GET", "path": "/generations", "summary": "List generations", "toolDescription": "List generations. GET /generations (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "project_id", "ts": "projectId", "kind": "query", "type": "string", "required": false, "description": "Only Generations in this Project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }, { "name": "target_id", "ts": "targetId", "kind": "query", "type": "string", "required": false, "description": "Only Generations of this Target. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "status", "ts": "status", "kind": "query", "type": "string", "required": false, "enum": ["queued", "running", "completed", "failed"], "description": "Only Generations with this status.", "flag": "status" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "A Generation moves from queued to running, then completes when its files are saved or fails. Delivery and Draft status are separate.", "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "description": "Generation metadata returned by collection endpoints.", "properties": { "id": { "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "generation", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "A Generation moves from queued to running, then completes when its files are saved or fails.", "type": "string" }, "trigger": { "enum": ["manual", "spec_changed", "config_changed", "preview"], "type": "string" }, "target_id": { "anyOf": [{ "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "name": { "description": "Package name; null until known.", "type": ["string", "null"] }, "version": { "description": "Package version; null until known.", "type": ["string", "null"] }, "warnings": { "items": { "properties": { "code": { "description": "Stable machine-readable warning code.", "type": "string" }, "message": { "description": "Human-readable explanation.", "type": "string" }, "operation": { "description": "METHOD/path of the affected operation, when applicable.", "type": "string" } }, "type": "object" }, "type": "array" }, "coverage": { "description": "Operation coverage; null until generation has finished.", "anyOf": [{ "properties": { "generated": { "minimum": 0, "type": "integer" }, "omitted": { "minimum": 0, "type": "integer" }, "total": { "minimum": 0, "type": "integer" }, "omitted_operations": { "description": "METHOD/path identities of operations omitted from the package.", "type": "array" }, "reason": { "enum": ["anonymous", "free_plan"], "description": "Present when a plan or anonymous limit omitted operations.", "type": "string" }, "signup_url": { "format": "uri", "description": "Sign-up link for anonymous capped runs.", "type": "string" }, "upgrade_url": { "format": "uri", "description": "Upgrade link for capped signed-in runs.", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "file_count": { "description": "Generated package files.", "minimum": 0, "type": "integer" }, "errors": { "items": { "properties": { "type": { "enum": ["request", "auth", "idempotency", "rate_limit", "organization", "source", "api"], "description": "Who can resolve the error.", "type": "string" }, "code": { "enum": ["input_invalid", "query_param_invalid", "cursor_invalid", "method_not_allowed", "resource_not_found", "idempotency_key_invalid", "idempotency_key_reused", "idempotency_key_in_use", "auth_required", "api_key_invalid", "token_invalid", "organization_required", "insufficient_scope", "role_insufficient", "rate_limit_exceeded", "plan_limit_reached", "spec_invalid", "spec_too_large", "spec_unreachable", "repository_provider_unsupported", "repository_disconnected", "repository_unavailable", "target_busy", "targets_inactive", "no_draft", "draft_merged", "resource_changed", "precondition_failed", "version_invalid", "version_occupied", "version_too_low", "target_already_released", "adoption_unverified", "publication_disabled", "publication_not_retryable", "publication_recovery_unavailable", "publication_failed", "delivery_conflict", "resource_has_dependencies", "customization_conflict", "history_recovery_required", "checks_unavailable", "dependency_missing", "dependency_not_found", "dependency_self", "dependency_cycle", "dependency_cross_project", "dependency_cross_lineage", "dependency_wrong_generator", "dependency_disabled", "dependency_module_path_missing", "dependency_unreleased", "dependency_revision_mismatch", "regeneration_failed", "follow_up_failed", "api_error"], "description": "Stable programmatic identifier.", "type": "string" }, "phase": { "enum": ["spec", "generation", "delivery", "publication"], "description": "The stage that failed.", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "field": { "description": "JSON Pointer to the invalid field within the request part named by in.", "type": "string" }, "in": { "enum": ["body", "query", "header"], "description": "Request part containing field.", "type": "string" }, "message": { "description": "Human-readable explanation.", "type": "string" }, "retryable": { "description": "Whether another attempt can succeed without correcting the inputs.", "type": "boolean" }, "suggested_action": { "description": "Stable, concise recovery instruction suitable for a person or agent.", "type": "string" }, "docs_url": { "format": "uri", "description": "Documentation for this class of error.", "type": "string" } }, "type": "object" }, "type": "array" }, "runtime_ms": { "description": "Milliseconds from the start of the run until it completed or failed; null while queued or running.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to ge…", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
38
- { "resource": "generations", "method": "get", "command": ["generations", "get"], "tool": "generations_get", "httpMethod": "GET", "path": "/generations/{generation_id}", "summary": "Get a generation", "description": "Returns the status of that Generation. `queued` and `running` mean generation is still in progress. `completed` means generated files are saved, not that repository delivery or a Draft is complete. List its files with listGenerationFiles and read each with getFile.", "toolDescription": "Get a generation. Returns the status of that Generation. GET /generations/{generation_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "generation_id", "ts": "generationId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via generations_list). IDs come from generations_list.", "flag": "generation-id", "resolve": { "via": "generations_list", "match": ["name"], "id": "id", "idPattern": "^gen_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "generation_id": { "description": "Unique identifier for a generation. Accepts an ID or an exact name (resolved via generations_list). IDs come from generations_list.", "examples": ["example-name", "gen_7h2p5d9c3m8w1k6q"], "type": "string" } }, "required": ["generation_id"] }, "exampleArguments": { "generation_id": "gen_7h2p5d9c3m8w1k6q" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "generation", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "A Generation moves from queued to running, then completes when its files are saved or fails.", "type": "string" }, "trigger": { "enum": ["manual", "spec_changed", "config_changed", "preview"], "type": "string" }, "target_id": { "anyOf": [{ "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "name": { "description": "Package name; null until known.", "type": ["string", "null"] }, "version": { "description": "Package version; null until known.", "type": ["string", "null"] }, "warnings": { "items": { "properties": { "code": { "description": "Stable machine-readable warning code.", "type": "string" }, "message": { "description": "Human-readable explanation.", "type": "string" }, "operation": { "description": "METHOD/path of the affected operation, when applicable.", "type": "string" } }, "type": "object" }, "type": "array" }, "coverage": { "description": "Operation coverage; null until generation has finished.", "anyOf": [{ "properties": { "generated": { "minimum": 0, "type": "integer" }, "omitted": { "minimum": 0, "type": "integer" }, "total": { "minimum": 0, "type": "integer" }, "omitted_operations": { "description": "METHOD/path identities of operations omitted from the package.", "items": { "type": "string" }, "type": "array" }, "reason": { "enum": ["anonymous", "free_plan"], "description": "Present when a plan or anonymous limit omitted operations.", "type": "string" }, "signup_url": { "format": "uri", "description": "Sign-up link for anonymous capped runs.", "type": "string" }, "upgrade_url": { "format": "uri", "description": "Upgrade link for capped signed-in runs.", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "file_count": { "description": "Generated package files.", "minimum": 0, "type": "integer" }, "errors": { "items": { "properties": { "type": { "enum": ["request", "auth", "idempotency", "rate_limit", "organization", "source", "api"], "description": "Who can resolve the error.", "type": "string" }, "code": { "enum": ["input_invalid", "query_param_invalid", "cursor_invalid", "method_not_allowed", "resource_not_found", "idempotency_key_invalid", "idempotency_key_reused", "idempotency_key_in_use", "auth_required", "api_key_invalid", "token_invalid", "organization_required", "insufficient_scope", "role_insufficient", "rate_limit_exceeded", "plan_limit_reached", "spec_invalid", "spec_too_large", "spec_unreachable", "repository_provider_unsupported", "repository_disconnected", "repository_unavailable", "target_busy", "targets_inactive", "no_draft", "draft_merged", "resource_changed", "precondition_failed", "version_invalid", "version_occupied", "version_too_low", "target_already_released", "adoption_unverified", "publication_disabled", "publication_not_retryable", "publication_recovery_unavailable", "publication_failed", "delivery_conflict", "resource_has_dependencies", "customization_conflict", "history_recovery_required", "checks_unavailable", "dependency_missing", "dependency_not_found", "dependency_self", "dependency_cycle", "dependency_cross_project", "dependency_cross_lineage", "dependency_wrong_generator", "dependency_disabled", "dependency_module_path_missing", "dependency_unreleased", "dependency_revision_mismatch", "regeneration_failed", "follow_up_failed", "api_error"], "description": "Stable programmatic identifier.", "type": "string" }, "phase": { "enum": ["spec", "generation", "delivery", "publication"], "description": "The stage that failed.", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "field": { "description": "JSON Pointer to the invalid field within the request part named by in.", "type": "string" }, "in": { "enum": ["body", "query", "header"], "description": "Request part containing field.", "type": "string" }, "message": { "description": "Human-readable explanation.", "type": "string" }, "retryable": { "description": "Whether another attempt can succeed without correcting the inputs.", "type": "boolean" }, "suggested_action": { "description": "Stable, concise recovery instruction suitable for a person or agent.", "type": "string" }, "docs_url": { "format": "uri", "description": "Documentation for this class of error.", "type": "string" } }, "type": "object" }, "type": "array" }, "runtime_ms": { "description": "Milliseconds from the start of the run until it completed or failed; null while queued or running.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
25
+ { "resource": "deliveries", "method": "update", "command": ["deliveries", "update"], "tool": "deliveries_update", "httpMethod": "PATCH", "path": "/deliveries/{delivery_id}", "summary": "Update a Delivery", "description": "Replaces a repository Delivery's settings. Omitted optional settings reset to their defaults. Hosted MCP Deliveries have no settings to update.\nWith Project auto_generate enabled, changing a Delivery queues the Target's Generation. A queued or running Target reuses that Generation.\nOmitting If-Match applies the update to the current Delivery; with If-Match, a stale ETag returns 412 precondition_failed without saving.\n\nA `409 delivery_conflict` means another Target owns the requested repository directory. A `409 target_busy` means the Target is publishing; wait for it to finish.\nA `502 follow_up_failed` means the Delivery was saved, but retiring an obsolete review or regenerating the Target failed. Get the Delivery and follow the error's retryable and suggested_action fields.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Update a Delivery. Replaces a repository Delivery's settings. PATCH /deliveries/{delivery_id}", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "delivery_id", "ts": "deliveryId", "kind": "path", "type": "string", "required": true, "flag": "delivery-id" }, { "name": "repository", "ts": "repository", "kind": "body", "type": "object", "required": true, "flag": "repository" }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "delivery_id": { "examples": ["dlv_4q8m2v7k1p9d5h6c"], "pattern": "^dlv_[a-z0-9]{16}$", "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "directory": { "type": ["string", "null"] }, "package_name": { "description": "npm or Python registry identity where applicable.", "type": ["string", "null"] }, "module_path": { "description": "Go module identity for the Go SDK or Go CLI Target where applicable.", "type": ["string", "null"] }, "publish_on_merge": { "description": "Commit repository-owned registry automation and report publication after the Draft merges.", "default": false, "type": "boolean" } }, "required": ["provider", "identifier"], "additionalProperties": false, "type": "object", "example": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": true } } }, "required": ["delivery_id", "repository"] }, "exampleArguments": { "delivery_id": "dlv_4q8m2v7k1p9d5h6c", "repository": { "provider": "github", "identifier": "parcel-example/parcel-client", "package_name": "parcel-client", "publish_on_merge": true } }, "outputSchema": { "description": "repository is present for a repository Delivery, with issues, required_checks, and last_event; hosted_mcp is present for a hosted_mcp Delivery.", "properties": { "id": { "examples": ["dlv_4q8m2v7k1p9d5h6c"], "pattern": "^dlv_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "delivery", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "type": { "enum": ["repository", "hosted_mcp"], "type": "string" }, "status": { "enum": ["active", "action_required", "disabled"], "type": "string" }, "repository": { "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" }, "directory": { "type": ["string", "null"] }, "package_name": { "type": ["string", "null"] }, "module_path": { "type": ["string", "null"] }, "publish_on_merge": { "type": "boolean" } }, "type": "object" }, "issues": { "items": { "properties": { "code": { "enum": ["app_not_installed", "repository_unreachable", "contents_write_missing", "pull_request_missing", "approval_label_missing", "check_missing", "event_failed"], "type": "string" }, "message": { "description": "Specific customer action or repository setting to inspect.", "type": "string" } }, "type": "object" }, "type": "array" }, "required_checks": { "items": { "type": "string" }, "type": "array" }, "last_event": { "anyOf": [{ "properties": { "event": { "description": "Repository event type.", "type": "string" }, "status": { "enum": ["queued", "running", "completed", "failed", "superseded"], "description": "superseded: a newer event for the same repository replaced this one before it finished.", "type": "string" }, "created_at": { "format": "date-time", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "hosted_mcp": { "properties": { "url": { "format": "uri", "description": "Hosted MCP endpoint for this Target, or null while it is being provisioned.", "type": ["string", "null"] } }, "type": "object" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
26
+ { "resource": "deliveries", "method": "delete", "command": ["deliveries", "delete"], "tool": "deliveries_delete", "httpMethod": "DELETE", "path": "/deliveries/{delivery_id}", "summary": "Delete a Delivery", "description": "Removes a Delivery from its Target. Removing a repository Delivery retires the Target's open Draft pull request; removing a hosted MCP Delivery stops serving its URL. Recreating the type later allocates a new ID and, for hosted MCP, a new URL.\n\nA `409 target_busy` means the Target is publishing; wait for it to finish. A `502 follow_up_failed` means the Delivery was removed, but retiring an obsolete review or regenerating the Target failed.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Delete a Delivery. Removes a Delivery from its Target. DELETE /deliveries/{delivery_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "destructive", "params": [{ "name": "delivery_id", "ts": "deliveryId", "kind": "path", "type": "string", "required": true, "flag": "delivery-id" }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "delivery_id": { "examples": ["dlv_4q8m2v7k1p9d5h6c"], "pattern": "^dlv_[a-z0-9]{16}$", "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." } }, "required": ["delivery_id"] }, "exampleArguments": { "delivery_id": "dlv_4q8m2v7k1p9d5h6c" }, "outputSchema": { "properties": { "id": { "examples": ["dlv_4q8m2v7k1p9d5h6c"], "pattern": "^dlv_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "delivery", "type": "string" }, "deleted": { "const": true, "type": "boolean" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
27
+ { "resource": "generations", "method": "get", "command": ["generations", "get"], "tool": "generations_get", "httpMethod": "GET", "path": "/generations/{generation_id}", "summary": "Get a Generation", "description": "Returns the status of that Generation. `queued` and `running` mean generation is still in progress. `completed` means generated files are saved, not that repository delivery or a Draft is complete. List its files with listGenerationFiles and read each with getFile.", "toolDescription": "Get a Generation. Returns the status of that Generation. GET /generations/{generation_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "generation_id", "ts": "generationId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via generations_list). IDs come from generations_list.", "flag": "generation-id", "resolve": { "via": "generations_list", "match": ["name"], "id": "id", "idPattern": "^gen_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "generation_id": { "description": "Unique identifier for a generation. Accepts an ID or an exact name (resolved via generations_list). IDs come from generations_list.", "examples": ["example-name", "gen_7h2p5d9c3m8w1k6q"], "type": "string" } }, "required": ["generation_id"] }, "exampleArguments": { "generation_id": "gen_7h2p5d9c3m8w1k6q" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "generation", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "A Generation moves from queued to running, then completes when its files are saved or fails.", "type": "string" }, "trigger": { "enum": ["manual", "spec_changed", "config_changed", "preview"], "type": "string" }, "target_id": { "anyOf": [{ "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "name": { "description": "Package name; null until known.", "type": ["string", "null"] }, "version": { "description": "Package version; null until known.", "type": ["string", "null"] }, "warnings": { "items": { "properties": { "code": { "description": "Stable machine-readable warning code.", "type": "string" }, "message": { "description": "Human-readable explanation.", "type": "string" }, "operation": { "description": "METHOD/path of the affected operation, when applicable.", "type": "string" } }, "type": "object" }, "type": "array" }, "coverage": { "description": "Operation coverage; null until generation has finished.", "anyOf": [{ "properties": { "generated": { "minimum": 0, "type": "integer" }, "omitted": { "minimum": 0, "type": "integer" }, "total": { "minimum": 0, "type": "integer" }, "omitted_operations": { "description": "METHOD/path identities of operations omitted from the package.", "items": { "type": "string" }, "type": "array" }, "reason": { "enum": ["anonymous", "free_plan"], "description": "Present when a plan or anonymous limit omitted operations.", "type": "string" }, "signup_url": { "format": "uri", "description": "Sign-up link for anonymous capped runs.", "type": "string" }, "upgrade_url": { "format": "uri", "description": "Upgrade link for capped signed-in runs.", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "file_count": { "description": "Generated package files.", "minimum": 0, "type": "integer" }, "errors": { "items": { "properties": { "type": { "enum": ["request", "auth", "idempotency", "rate_limit", "organization", "source", "api"], "description": "Who can resolve the error.", "type": "string" }, "code": { "enum": ["input_invalid", "input_missing", "input_type_invalid", "input_format_invalid", "input_too_long", "input_too_short", "input_duplicate", "input_unknown", "query_param_invalid", "cursor_invalid", "method_not_allowed", "resource_not_found", "idempotency_key_invalid", "idempotency_key_reused", "idempotency_key_in_use", "auth_required", "api_key_invalid", "token_invalid", "organization_required", "insufficient_scope", "role_insufficient", "rate_limit_exceeded", "feature_not_available", "quota_exceeded", "spec_invalid", "spec_too_large", "spec_unreachable", "repository_provider_unsupported", "repository_disconnected", "repository_unavailable", "target_busy", "targets_inactive", "no_draft", "draft_merged", "resource_changed", "precondition_failed", "version_invalid", "version_occupied", "version_too_low", "target_already_released", "adoption_unverified", "publication_disabled", "publication_not_retryable", "publication_recovery_unavailable", "publication_failed", "delivery_conflict", "delivery_exists", "resource_has_dependencies", "customization_conflict", "checks_failed", "draft_title_invalid", "history_recovery_required", "checks_unavailable", "dependency_missing", "dependency_not_found", "dependency_self", "dependency_cycle", "dependency_cross_project", "dependency_cross_lineage", "dependency_wrong_generator", "dependency_disabled", "dependency_module_path_missing", "dependency_unreleased", "dependency_revision_mismatch", "regeneration_failed", "follow_up_failed", "api_error"], "description": "Stable programmatic identifier.", "type": "string" }, "phase": { "enum": ["spec", "generation", "delivery", "publication"], "description": "The stage that failed.", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "field": { "description": "JSON Pointer to the invalid field within the request part named by in.", "type": "string" }, "in": { "enum": ["body", "query", "header"], "description": "Request part containing field.", "type": "string" }, "message": { "description": "Human-readable explanation.", "type": "string" }, "retryable": { "description": "Whether another attempt can succeed without correcting the inputs.", "type": "boolean" }, "suggested_action": { "description": "Stable, concise recovery instruction suitable for a person or agent.", "type": "string" }, "docs_url": { "format": "uri", "description": "Documentation for this class of error.", "type": "string" } }, "type": "object" }, "type": "array" }, "runtime_ms": { "description": "Milliseconds from the start of the run until it completed or failed; null while queued or running.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
28
+ { "resource": "generations", "method": "list", "command": ["generations", "list"], "tool": "generations_list", "httpMethod": "GET", "path": "/generations", "summary": "List Generations", "toolDescription": "List Generations. GET /generations (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "project_id", "ts": "projectId", "kind": "query", "type": "string", "required": false, "description": "Only Generations in this Project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "flag": "project-id", "resolve": { "via": "projects_list", "match": ["name"], "id": "id", "idPattern": "^prj_[a-z0-9]{16}$", "inferred": true } }, { "name": "target_id", "ts": "targetId", "kind": "query", "type": "string", "required": false, "description": "Only Generations of this Target. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "status", "ts": "status", "kind": "query", "type": "string", "required": false, "enum": ["queued", "running", "completed", "failed"], "description": "Only Generations with this status.", "flag": "status" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "project_id": { "description": "Unique identifier for a project. Accepts an ID or an exact name (resolved via projects_list). IDs come from projects_list.", "examples": ["example-name", "prj_4f8k2m7x9q1v6b3n"], "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "A Generation moves from queued to running, then completes when its files are saved or fails. Delivery and Draft status are separate.", "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "id": { "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "generation", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "A Generation moves from queued to running, then completes when its files are saved or fails.", "type": "string" }, "trigger": { "enum": ["manual", "spec_changed", "config_changed", "preview"], "type": "string" }, "target_id": { "anyOf": [{ "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target.", "type": "string" }, "name": { "description": "Package name; null until known.", "type": ["string", "null"] }, "version": { "description": "Package version; null until known.", "type": ["string", "null"] }, "warnings": { "items": { "properties": { "code": { "description": "Stable machine-readable warning code.", "type": "string" }, "message": { "description": "Human-readable explanation.", "type": "string" }, "operation": { "description": "METHOD/path of the affected operation, when applicable.", "type": "string" } }, "type": "object" }, "type": "array" }, "coverage": { "description": "Operation coverage; null until generation has finished.", "anyOf": [{ "properties": { "generated": { "minimum": 0, "type": "integer" }, "omitted": { "minimum": 0, "type": "integer" }, "total": { "minimum": 0, "type": "integer" }, "omitted_operations": { "description": "METHOD/path identities of operations omitted from the package.", "type": "array" }, "reason": { "enum": ["anonymous", "free_plan"], "description": "Present when a plan or anonymous limit omitted operations.", "type": "string" }, "signup_url": { "format": "uri", "description": "Sign-up link for anonymous capped runs.", "type": "string" }, "upgrade_url": { "format": "uri", "description": "Upgrade link for capped signed-in runs.", "type": "string" } }, "type": "object" }, { "type": "null" }] }, "file_count": { "description": "Generated package files.", "minimum": 0, "type": "integer" }, "errors": { "items": { "properties": { "type": { "enum": ["request", "auth", "idempotency", "rate_limit", "organization", "source", "api"], "description": "Who can resolve the error.", "type": "string" }, "code": { "enum": ["input_invalid", "input_missing", "input_type_invalid", "input_format_invalid", "input_too_long", "input_too_short", "input_duplicate", "input_unknown", "query_param_invalid", "cursor_invalid", "method_not_allowed", "resource_not_found", "idempotency_key_invalid", "idempotency_key_reused", "idempotency_key_in_use", "auth_required", "api_key_invalid", "token_invalid", "organization_required", "insufficient_scope", "role_insufficient", "rate_limit_exceeded", "feature_not_available", "quota_exceeded", "spec_invalid", "spec_too_large", "spec_unreachable", "repository_provider_unsupported", "repository_disconnected", "repository_unavailable", "target_busy", "targets_inactive", "no_draft", "draft_merged", "resource_changed", "precondition_failed", "version_invalid", "version_occupied", "version_too_low", "target_already_released", "adoption_unverified", "publication_disabled", "publication_not_retryable", "publication_recovery_unavailable", "publication_failed", "delivery_conflict", "delivery_exists", "resource_has_dependencies", "customization_conflict", "checks_failed", "draft_title_invalid", "history_recovery_required", "checks_unavailable", "dependency_missing", "dependency_not_found", "dependency_self", "dependency_cycle", "dependency_cross_project", "dependency_cross_lineage", "dependency_wrong_generator", "dependency_disabled", "dependency_module_path_missing", "dependency_unreleased", "dependency_revision_mismatch", "regeneration_failed", "follow_up_failed", "api_error"], "description": "Stable programmatic identifier.", "type": "string" }, "phase": { "enum": ["spec", "generation", "delivery", "publication"], "description": "The stage that failed.", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "field": { "description": "JSON Pointer to the invalid field within the request part named by in.", "type": "string" }, "in": { "enum": ["body", "query", "header"], "description": "Request part containing field.", "type": "string" }, "message": { "description": "Human-readable explanation.", "type": "string" }, "retryable": { "description": "Whether another attempt can succeed without correcting the inputs.", "type": "boolean" }, "suggested_action": { "description": "Stable, concise recovery instruction suitable for a person or agent.", "type": "string" }, "docs_url": { "format": "uri", "description": "Documentation for this class of error.", "type": "string" } }, "type": "object" }, "type": "array" }, "runtime_ms": { "description": "Milliseconds from the start of the run until it completed or failed; null while queued or running.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to ge…", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
39
29
  { "resource": "generations", "method": "listFiles", "command": ["generations", "list-files"], "tool": "generations_list_files", "httpMethod": "GET", "path": "/generations/{generation_id}/files", "summary": "List a Generation's files", "description": "Lists the generated package's files, ordered by path. Read content with getFile.", "toolDescription": "List a Generation's files. Lists the generated package's files, ordered by path. GET /generations/{generation_id}/files (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "generation_id", "ts": "generationId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via generations_list). IDs come from generations_list.", "flag": "generation-id", "resolve": { "via": "generations_list", "match": ["name"], "id": "id", "idPattern": "^gen_[a-z0-9]{16}$", "inferred": true } }, { "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }], "inputSchema": { "type": "object", "properties": { "generation_id": { "description": "Unique identifier for a generation. Accepts an ID or an exact name (resolved via generations_list). IDs come from generations_list.", "examples": ["example-name", "gen_7h2p5d9c3m8w1k6q"], "type": "string" }, "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." } }, "required": ["generation_id"] }, "exampleArguments": { "generation_id": "gen_7h2p5d9c3m8w1k6q" }, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "id": { "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "file", "type": "string" }, "path": { "description": "Path within the Spec Revision, Generation package, or Target package.", "type": "string" }, "size_bytes": { "minimum": 0, "type": "integer" }, "sha256": { "description": "Digest of the complete file.", "pattern": "^[a-f0-9]{64}$", "type": "string" }, "encoding": { "enum": ["utf8", "base64"], "description": "utf8: content is text. base64: content is base64-encoded binary bytes.", "type": "string" }, "mode": { "description": "Git file mode for package files; null for Spec source files.", "anyOf": [{ "enum": ["100644", "100755", "120000"], "description": "Git file mode. 100755 is executable; 120000 is a symbolic link whose content is its target.", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When Typeship first issued this file ID.", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
40
- { "resource": "files", "method": "get", "command": ["files", "get"], "tool": "files_get", "httpMethod": "GET", "path": "/files/{file_id}", "summary": "Get a file", "description": "Returns one bounded chunk of an immutable file: at most 24 KiB, as UTF-8 text or, for binary bytes, base64. When next_cursor is not null, repeat the request with cursor and concatenate the chunks in order. A file ID always returns the same bytes.", "toolDescription": "Get a file. Returns one bounded chunk of an immutable file: at most 24 KiB, as UTF-8 text or, for binary bytes, base64. GET /files/{file_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "file_id", "ts": "fileId", "kind": "path", "type": "string", "required": true, "flag": "file-id" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "next_cursor from the preceding chunk of this file.", "flag": "cursor" }], "inputSchema": { "type": "object", "properties": { "file_id": { "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "next_cursor from the preceding chunk of this file." } }, "required": ["file_id"] }, "exampleArguments": { "file_id": "file_4k8m2v7q1p9d5h6c" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "file", "type": "string" }, "path": { "description": "Path within the Spec Revision, Generation package, or Target package.", "type": "string" }, "size_bytes": { "minimum": 0, "type": "integer" }, "sha256": { "description": "Digest of the complete file.", "pattern": "^[a-f0-9]{64}$", "type": "string" }, "encoding": { "enum": ["utf8", "base64"], "description": "utf8: content is text. base64: content is base64-encoded binary bytes.", "type": "string" }, "mode": { "description": "Git file mode for package files; null for Spec source files.", "anyOf": [{ "enum": ["100644", "100755", "120000"], "description": "Git file mode. 100755 is executable; 120000 is a symbolic link whose content is its target.", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When Typeship first issued this file ID.", "type": "string" }, "content": { "description": "At most 24 KiB of the file starting at offset, encoded as encoding says. Text chunks never split a character; concatenate chunks in order.", "type": "string" }, "offset": { "description": "Byte offset of this chunk in the file.", "minimum": 0, "type": "integer" }, "next_cursor": { "description": "Pass as cursor to read the next chunk; null at the end of the file.", "type": ["string", "null"] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
41
- { "resource": "organization", "method": "get", "command": ["organization", "get"], "tool": "organization_get", "httpMethod": "GET", "path": "/organization", "summary": "The organization behind the presented credentials", "description": "Returns the organization associated with your credential. The Typeship CLI uses this endpoint for `whoami`.", "toolDescription": "The organization behind the presented credentials. Returns the organization associated with your credential. GET /organization", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [], "inputSchema": { "type": "object", "properties": {} }, "exampleArguments": {}, "outputSchema": { "description": "The organization an API key belongs to. Members share its projects, keys, and plan; sign-in identity is not part of the API.", "properties": { "id": { "description": "Opaque, output-only organization identifier. Copy it unchanged; its format is not a contract.", "type": "string" }, "object": { "const": "organization", "type": "string" }, "name": { "description": "The organization's display name.", "type": "string" }, "plan": { "enum": ["free", "pro", "enterprise"], "type": "string" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
42
- { "resource": "apiKeys", "method": "list", "command": ["api-keys", "list"], "tool": "api_keys_list", "httpMethod": "GET", "path": "/api-keys", "summary": "List API keys", "description": "Lists key metadata and the last four characters of each key. Full keys are not returned. Create keys in the Console.", "toolDescription": "List API keys. Lists key metadata and the last four characters of each key. GET /api-keys (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "id": { "type": "string" }, "object": { "const": "api_key", "type": "string" }, "name": { "type": "string" }, "last4": { "description": "Last four characters of the secret; the secret itself is never stored.", "type": "string" }, "revoked": { "type": "boolean" }, "last_used_at": { "format": "date-time", "type": ["string", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the key last changed, such as its revocation.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
43
- { "resource": "apiKeys", "method": "get", "command": ["api-keys", "get"], "tool": "api_keys_get", "httpMethod": "GET", "path": "/api-keys/{api_key_id}", "summary": "Get an API key", "description": "Returns the key summary and its ETag for conditional revocation.", "toolDescription": "Get an API key. Returns the key summary and its ETag for conditional revocation. GET /api-keys/{api_key_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "api_key_id", "ts": "apiKeyId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via api_keys_list). IDs come from api_keys_list.", "flag": "api-key-id", "resolve": { "via": "api_keys_list", "match": ["name"], "id": "id", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "api_key_id": { "description": "Identifier returned by the API key list. Accepts an ID or an exact name (resolved via api_keys_list). IDs come from api_keys_list.", "type": "string", "examples": ["example-name", "apikey_2nY8mR6pQ4vK9cH3"] } }, "required": ["api_key_id"] }, "exampleArguments": { "api_key_id": "apikey_2nY8mR6pQ4vK9cH3" }, "outputSchema": { "properties": { "id": { "type": "string" }, "object": { "const": "api_key", "type": "string" }, "name": { "type": "string" }, "last4": { "description": "Last four characters of the secret; the secret itself is never stored.", "type": "string" }, "revoked": { "type": "boolean" }, "last_used_at": { "format": "date-time", "type": ["string", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the key last changed, such as its revocation.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
44
- { "resource": "apiKeys", "method": "revoke", "command": ["api-keys", "revoke"], "tool": "api_keys_revoke", "httpMethod": "DELETE", "path": "/api-keys/{api_key_id}", "summary": "Revoke an API key", "description": "Revokes a key. Repeating the request returns the same result.\n\nWith OAuth, members can revoke their own keys; organization admins can revoke any key. Organization API keys can revoke any key in their organization.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Revoke an API key. Revokes a key. DELETE /api-keys/{api_key_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "destructive", "params": [{ "name": "api_key_id", "ts": "apiKeyId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via api_keys_list). IDs come from api_keys_list.", "flag": "api-key-id", "resolve": { "via": "api_keys_list", "match": ["name"], "id": "id", "inferred": true } }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "api_key_id": { "description": "Identifier returned by the API key list. Accepts an ID or an exact name (resolved via api_keys_list). IDs come from api_keys_list.", "type": "string", "examples": ["example-name", "apikey_2nY8mR6pQ4vK9cH3"] }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." } }, "required": ["api_key_id"] }, "exampleArguments": { "api_key_id": "apikey_2nY8mR6pQ4vK9cH3" }, "outputSchema": { "properties": { "id": { "type": "string" }, "object": { "const": "api_key", "type": "string" }, "name": { "type": "string" }, "last4": { "description": "Last four characters of the secret; the secret itself is never stored.", "type": "string" }, "revoked": { "type": "boolean" }, "last_used_at": { "format": "date-time", "type": ["string", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the key last changed, such as its revocation.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
30
+ { "resource": "drafts", "method": "list", "command": ["drafts", "list"], "tool": "drafts_list", "httpMethod": "GET", "path": "/drafts", "summary": "List Drafts", "description": "Lists open and merged Drafts, newest first. Each Target has one open Draft; each merge adds a merged Draft.", "toolDescription": "List Drafts. Lists open and merged Drafts, newest first. GET /drafts (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "target_id", "ts": "targetId", "kind": "query", "type": "string", "required": false, "description": "Only Drafts of this Target. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }, { "name": "status", "ts": "status", "kind": "query", "type": "string", "required": false, "enum": ["idle", "working", "action_required", "ready", "merged"], "description": "Only Drafts with this status.", "flag": "status" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" }, "status": { "enum": ["idle", "working", "action_required", "ready", "merged"], "description": "idle: the open Draft has no pending change; generate the Target to start one. working: Typeship is generating, carrying repository edits forward, applying decisions, or checking the Draft; retrieve it again. action_required: use the typed reason to find the customer's next action. ready: required checks passed on head_sha; merge the pull request. merged: the pull request merged and the Draft is final; retrieve the Target for the draft_id of its next Draft.", "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "description": "One reviewed package change for a Target.", "properties": { "id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "draft", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "status": { "enum": ["idle", "working", "action_required", "ready", "merged"], "description": "idle: the open Draft has no pending change; generate the Target to start one.", "type": "string" }, "reason": { "enum": ["conflict", "checks_failed", "review_failed", "checks_unavailable", "history_rewritten"], "description": "conflict: resolve the listed files.", "type": "string" }, "version_next": { "description": "Next version for this Draft, or null before a version is selected.", "type": ["string", "null"] }, "version_source": { "enum": ["automatic", "console", "api", "github", null], "description": "Where version_next was selected; null once the Draft merged.", "type": ["string", "null"] }, "compatibility": { "description": "Null until the Draft has a generated change, and on a merged Draft.", "anyOf": [{ "description": "Comparison of the Draft's head_sha with the latest release.", "type": "object" }, { "type": "null" }] }, "version": { "description": "Null until the Draft has a generated change, and on a merged Draft.", "anyOf": [{ "description": "How version_next relates to the assessed change.", "type": "object" }, { "type": "null" }] }, "errors": { "description": "What blocks the Draft, one entry per finding, each with a code and suggested_action.", "items": { "type": "object" }, "type": "array" }, "changes": { "properties": { "changelog": { "description": "Cumulative changelog against the latest release.", "type": ["string", "null"] }, "breaking_count": { "minimum": 0, "type": ["integer", "null"] } }, "type": ["object", "null"] }, "head_sha": { "description": "Draft commit that compatibility, version, checks, and conflicts describe.", "type": ["string", "null"] }, "pull_request": { "description": "The Draft pull request in the destination repository, or null before one is opened.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "generation_id": { "description": "Generation whose package this Draft contains.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "release_id": { "description": "Release this Draft created when it merged; null while open, or when a merge changed only tests or c…", "anyOf": [{ "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When the Draft opened.", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "conflicts": { "description": "Conflict counts for the current merge stage; null when the Draft has no conflicts.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "customized_files": { "description": "Files where the Draft differs from the last accepted package; null until the Draft is integrated.", "minimum": 0, "type": ["integer", "null"] }, "history_recovery": { "description": "Present only while status is action_required and reason is history_rewritten.", "anyOf": [{ "description": "The approval inputs for a default-branch history rewrite.", "type": "object" }, { "type": "null" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" }, "checks": { "items": { "type": "object" }, "type": "array" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to ge…", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
31
+ { "resource": "drafts", "method": "get", "command": ["drafts", "get"], "tool": "drafts_get", "httpMethod": "GET", "path": "/drafts/{draft_id}", "summary": "Get a Draft", "description": "Returns the Draft's status. An open Draft also reports its typed reason when action is required, next version and its source, compatibility and version assessment, blocking errors, checks, and conflict counts. The response carries an `ETag`; send it in `If-Match` when updating the Draft to avoid changing a newer version selection.", "toolDescription": "Get a Draft. Returns the Draft's status. GET /drafts/{draft_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "draft_id", "ts": "draftId", "kind": "path", "type": "string", "required": true, "flag": "draft-id" }], "inputSchema": { "type": "object", "properties": { "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" } }, "required": ["draft_id"] }, "exampleArguments": { "draft_id": "drf_3q7m1v8k2p5d9h4c" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "draft", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "status": { "enum": ["idle", "working", "action_required", "ready", "merged"], "description": "idle: the open Draft has no pending change; generate the Target to start one.", "type": "string" }, "reason": { "enum": ["conflict", "checks_failed", "review_failed", "checks_unavailable", "history_rewritten"], "description": "conflict: resolve the listed files.", "type": "string" }, "version_next": { "description": "Next version for this Draft, or null before a version is selected.", "type": ["string", "null"] }, "version_source": { "enum": ["automatic", "console", "api", "github", null], "description": "Where version_next was selected; null once the Draft merged.", "type": ["string", "null"] }, "compatibility": { "description": "Null until the Draft has a generated change, and on a merged Draft.", "anyOf": [{ "description": "Comparison of the Draft's head_sha with the latest release.", "type": "object" }, { "type": "null" }] }, "version": { "description": "Null until the Draft has a generated change, and on a merged Draft.", "anyOf": [{ "description": "How version_next relates to the assessed change.", "type": "object" }, { "type": "null" }] }, "errors": { "description": "What blocks the Draft, one entry per finding, each with a code and suggested_action.", "items": { "type": "object" }, "type": "array" }, "changes": { "properties": { "changelog": { "description": "Cumulative changelog against the latest release.", "type": ["string", "null"] }, "breaking_count": { "minimum": 0, "type": ["integer", "null"] } }, "type": ["object", "null"] }, "head_sha": { "description": "Draft commit that compatibility, version, checks, and conflicts describe.", "type": ["string", "null"] }, "pull_request": { "description": "The Draft pull request in the destination repository, or null before one is opened.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "generation_id": { "description": "Generation whose package this Draft contains.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "release_id": { "description": "Release this Draft created when it merged; null while open, or when a merge changed only tests or c…", "anyOf": [{ "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When the Draft opened.", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "conflicts": { "description": "Conflict counts for the current merge stage; null when the Draft has no conflicts.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "customized_files": { "description": "Files where the Draft differs from the last accepted package; null until the Draft is integrated.", "minimum": 0, "type": ["integer", "null"] }, "history_recovery": { "description": "Present only while status is action_required and reason is history_rewritten.", "anyOf": [{ "description": "The approval inputs for a default-branch history rewrite.", "type": "object" }, { "type": "null" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" }, "checks": { "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
32
+ { "resource": "drafts", "method": "update", "command": ["drafts", "update"], "tool": "drafts_update", "httpMethod": "PATCH", "path": "/drafts/{draft_id}", "summary": "Update a Draft", "description": "Checks your version choice against the required version bump, then regenerates the existing Draft pull request.\n\nSend the Draft's `ETag` in `If-Match` to reject an intervening change with 412 precondition_failed before saving or regenerating. Omitting `If-Match` applies the selection to the current Draft. version_next is required; null restores automatic selection.\n\nA `502` response means the selected version was saved, but regeneration failed. Follow the error's retryable and suggested_action fields. Repeating an unfinished selection resumes generation; repeating a completed selection starts no new work. If using If-Match, retrieve the Draft and confirm the saved selection before retrying with its current ETag.\nA `409 draft_merged` means the Draft merged; retrieve the Target and select a version on its `draft_id`. A `409 target_busy` means the Target is publishing; wait and retry. A `409 version_occupied` means the version is already released; retrieve the Draft and releases, choose a new version, and retry.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Update a Draft. Checks your version choice against the required version bump, then regenerates the existing Draft pull request. PATCH /drafts/{draft_id}", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "draft_id", "ts": "draftId", "kind": "path", "type": "string", "required": true, "flag": "draft-id" }, { "name": "version_next", "ts": "version_next", "kind": "body", "type": "string", "required": true, "nullable": true, "description": "Exact SemVer, or null to return to automatic selection.", "flag": "version-next" }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." }, "version_next": { "description": "Exact SemVer, or null to return to automatic selection.", "type": ["string", "null"], "example": "1.1.0" } }, "required": ["draft_id", "version_next"] }, "exampleArguments": { "draft_id": "drf_3q7m1v8k2p5d9h4c", "version_next": "1.1.0" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "draft", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "status": { "enum": ["idle", "working", "action_required", "ready", "merged"], "description": "idle: the open Draft has no pending change; generate the Target to start one.", "type": "string" }, "reason": { "enum": ["conflict", "checks_failed", "review_failed", "checks_unavailable", "history_rewritten"], "description": "conflict: resolve the listed files.", "type": "string" }, "version_next": { "description": "Next version for this Draft, or null before a version is selected.", "type": ["string", "null"] }, "version_source": { "enum": ["automatic", "console", "api", "github", null], "description": "Where version_next was selected; null once the Draft merged.", "type": ["string", "null"] }, "compatibility": { "description": "Null until the Draft has a generated change, and on a merged Draft.", "anyOf": [{ "description": "Comparison of the Draft's head_sha with the latest release.", "type": "object" }, { "type": "null" }] }, "version": { "description": "Null until the Draft has a generated change, and on a merged Draft.", "anyOf": [{ "description": "How version_next relates to the assessed change.", "type": "object" }, { "type": "null" }] }, "errors": { "description": "What blocks the Draft, one entry per finding, each with a code and suggested_action.", "items": { "type": "object" }, "type": "array" }, "changes": { "properties": { "changelog": { "description": "Cumulative changelog against the latest release.", "type": ["string", "null"] }, "breaking_count": { "minimum": 0, "type": ["integer", "null"] } }, "type": ["object", "null"] }, "head_sha": { "description": "Draft commit that compatibility, version, checks, and conflicts describe.", "type": ["string", "null"] }, "pull_request": { "description": "The Draft pull request in the destination repository, or null before one is opened.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "generation_id": { "description": "Generation whose package this Draft contains.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "release_id": { "description": "Release this Draft created when it merged; null while open, or when a merge changed only tests or c…", "anyOf": [{ "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When the Draft opened.", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "conflicts": { "description": "Conflict counts for the current merge stage; null when the Draft has no conflicts.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "customized_files": { "description": "Files where the Draft differs from the last accepted package; null until the Draft is integrated.", "minimum": 0, "type": ["integer", "null"] }, "history_recovery": { "description": "Present only while status is action_required and reason is history_rewritten.", "anyOf": [{ "description": "The approval inputs for a default-branch history rewrite.", "type": "object" }, { "type": "null" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" }, "checks": { "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
33
+ { "resource": "drafts", "method": "listFiles", "command": ["drafts", "list-files"], "tool": "drafts_list_files", "httpMethod": "GET", "path": "/drafts/{draft_id}/files", "summary": "List a Draft's files", "description": "Lists the Draft's files that differ from the last merged package or need a conflict decision, ordered by path, without file content. Each conflict names its kind, the saved decision, and the sides you can read with getFile. With `filter=history`, lists files affected by a default-branch history rewrite; the list is empty when none is pending.\n\nReturns `409 resource_changed` while Typeship is carrying the Draft's latest commit forward (status working), or when the Draft changes between pages.", "toolDescription": "List a Draft's files. Lists the Draft's files that differ from the last merged package or need a conflict decision, ordered by path, without file content. GET /drafts/{draft_id}/files (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "draft_id", "ts": "draftId", "kind": "path", "type": "string", "required": true, "flag": "draft-id" }, { "name": "filter", "ts": "filter", "kind": "query", "type": "string", "required": false, "enum": ["conflicted", "customized", "history"], "description": "conflicted: conflicts only. customized: files that differ from the last merged package. history: files affected by a default-branch history rewrite. Omit for conflicted and customized files.", "flag": "filter" }, { "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }], "inputSchema": { "type": "object", "properties": { "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "filter": { "enum": ["conflicted", "customized", "history"], "type": "string", "description": "conflicted: conflicts only. customized: files that differ from the last merged package. history: files affected by a default-branch history rewrite. Omit for conflicted and customized files." }, "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." } }, "required": ["draft_id"] }, "exampleArguments": { "draft_id": "drf_3q7m1v8k2p5d9h4c" }, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "object": { "const": "draft_file", "type": "string" }, "path": { "description": "Path relative to the Target's package directory.", "type": "string" }, "customization": { "enum": ["added", "edited", "deleted", "mode_changed", null], "description": "How the Draft differs from the last merged package at this path; null when it does not.", "type": ["string", "null"] }, "conflict": { "anyOf": [{ "properties": { "type": { "enum": ["no_common_version", "file_ownership", "yours_deleted_generated_changed", "generated_deleted_yours_changed", "overlapping_text", "too_large_to_merge", "binary_changed", "file_mode_changed"], "description": "Why the Draft needs a decision. no_common_version: there is no last merged version to compare, such as the first Draft of an adopted package. file_ownership: generated output collides with a file you added. yours_deleted_generated_changed and generated_deleted_yours_changed: one side deleted a file the other changed. overlapping_text: both sides edited the same lines. too_large_to_merge: the file has too many changed lines to merge line by line. binary_changed and file_mode_changed: both sides changed binary content or the file mode.", "type": "string" }, "source": { "enum": ["generation", "default_branch", "previous_draft"], "description": "Where the code in this Draft comes from: newly generated files, commits on the default branch, or edits from a Draft whose branch was rebased, reset, or deleted. Typeship may find another conflict after these decisions are applied.", "type": "string" }, "decision": { "enum": ["yours", "generated", "content", null], "description": "Decision saved for this conflict on head_sha; null when none. Typeship continues when every conflict has a decision.", "type": ["string", "null"] } }, "type": "object" }, { "type": "null" }] }, "history": { "anyOf": [{ "properties": { "change": { "enum": ["added", "edited", "deleted", "mode_changed", null], "description": "How the rewritten default branch differs from the last merged package; null when only the Draft differs.", "type": ["string", "null"] }, "draft_differs": { "description": "The Draft branch has a different version than the rewritten default branch. Recovery carries the Draft version forward.", "type": "boolean" } }, "type": "object" }, { "type": "null" }] }, "sides": { "description": "File IDs to read with getFile for a conflict or history file; null for other customized files.", "anyOf": [{ "description": "File IDs for each side of a conflict or history comparison. null means the file is absent on that side.", "properties": { "base": { "anyOf": [{ "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "yours": { "anyOf": [{ "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "generated": { "anyOf": [{ "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] } }, "type": "object" }, { "type": "null" }] } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
34
+ { "resource": "drafts", "method": "resolve", "command": ["drafts", "resolve"], "tool": "drafts_resolve", "httpMethod": "POST", "path": "/drafts/{draft_id}/resolve", "summary": "Resolve Draft conflicts", "description": "Resolves conflicts on the Draft's head_sha: keep yours or generated, or supply final content as text or, for binary files, base64. Choosing generated for a customized path replaces it with the generated file, or deletes a Draft-only file.\n\nConflict decisions are saved together and can be replaced until applied. Choosing generated for customized paths commits those changes together on the Draft branch. Returns the Draft. When every conflict has a decision, `conflicts.decided` equals `conflicts.total` and Typeship continues the Draft and runs checks. Paths that already match the Draft change nothing.", "toolDescription": "Resolve Draft conflicts. Resolves conflicts on the Draft's head_sha: keep yours or generated, or supply final content as text or, for binary files, base64. POST /drafts/{draft_id}/resolve", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": false, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "draft_id", "ts": "draftId", "kind": "path", "type": "string", "required": true, "flag": "draft-id" }, { "name": "expected_head_sha", "ts": "expected_head_sha", "kind": "body", "type": "string", "required": true, "description": "The Draft's head_sha. A newer Draft commit returns 409 resource_changed without saving.", "flag": "expected-head-sha" }, { "name": "resolutions", "ts": "resolutions", "kind": "body", "type": "array", "required": true, "items": { "type": "json" }, "description": "Unique current conflict or customized paths. Choose generated to discard a customization, including a Draft-only file. Final file content must total at most 2 MiB. Decisions apply together or not at all.", "flag": "resolutions" }], "inputSchema": { "type": "object", "properties": { "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "expected_head_sha": { "description": "The Draft's head_sha. A newer Draft commit returns 409 resource_changed without saving.", "examples": ["0123456789abcdef0123456789abcdef01234567"], "pattern": "^[0-9a-fA-F]{40}$", "type": "string", "example": "0123456789abcdef0123456789abcdef01234567" }, "resolutions": { "description": "Unique current conflict or customized paths. Choose generated to discard a customization, including a Draft-only file. Final file content must total at most 2 MiB. Decisions apply together or not at all.", "minItems": 1, "maxItems": 1000, "items": { "anyOf": [{ "properties": { "path": { "minLength": 1, "type": "string" }, "keep": { "enum": ["yours", "generated"], "description": "Keep that version of the file exactly. Keeping an absent version deletes the path.", "type": "string" } }, "required": ["path", "keep"], "additionalProperties": false, "type": "object" }, { "properties": { "path": { "minLength": 1, "type": "string" }, "keep": { "const": "content", "type": "string" }, "content": { "description": "Final file text, stored as UTF-8. An empty string creates an empty file.", "type": "string" }, "mode": { "enum": ["100644", "100755", "120000"], "description": "Git file mode. 100755 is executable; 120000 is a symbolic link whose content is its target.", "type": "string" } }, "required": ["path", "keep", "content", "mode"], "additionalProperties": false, "type": "object" }, { "properties": { "path": { "minLength": 1, "type": "string" }, "keep": { "const": "content", "type": "string" }, "content_base64": { "description": "Final file bytes as canonical base64, for binary files.", "type": "string" }, "mode": { "enum": ["100644", "100755", "120000"], "description": "Git file mode. 100755 is executable; 120000 is a symbolic link whose content is its target.", "type": "string" } }, "required": ["path", "keep", "content_base64", "mode"], "additionalProperties": false, "type": "object" }, { "properties": { "path": { "minLength": 1, "type": "string" }, "keep": { "const": "content", "type": "string" }, "content": { "description": "Delete this file.", "type": "null" } }, "required": ["path", "keep", "content"], "additionalProperties": false, "type": "object" }] }, "type": "array", "example": [{ "path": "src/index.ts", "keep": "content", "mode": "100644", "content": "export { ParcelClient } from \"./client.js\";\nexport type { Shipment, Label } from \"./types.js\";\nexport { createParcelClient } from \"./helper.js\";\n" }] } }, "required": ["draft_id", "expected_head_sha", "resolutions"] }, "exampleArguments": { "draft_id": "drf_3q7m1v8k2p5d9h4c", "expected_head_sha": "0123456789abcdef0123456789abcdef01234567", "resolutions": [{ "path": "src/index.ts", "keep": "content", "mode": "100644", "content": "export { ParcelClient } from \"./client.js\";\nexport type { Shipment, Label } from \"./types.js\";\nexport { createParcelClient } from \"./helper.js\";\n" }] }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "draft", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "status": { "enum": ["idle", "working", "action_required", "ready", "merged"], "description": "idle: the open Draft has no pending change; generate the Target to start one.", "type": "string" }, "reason": { "enum": ["conflict", "checks_failed", "review_failed", "checks_unavailable", "history_rewritten"], "description": "conflict: resolve the listed files.", "type": "string" }, "version_next": { "description": "Next version for this Draft, or null before a version is selected.", "type": ["string", "null"] }, "version_source": { "enum": ["automatic", "console", "api", "github", null], "description": "Where version_next was selected; null once the Draft merged.", "type": ["string", "null"] }, "compatibility": { "description": "Null until the Draft has a generated change, and on a merged Draft.", "anyOf": [{ "description": "Comparison of the Draft's head_sha with the latest release.", "type": "object" }, { "type": "null" }] }, "version": { "description": "Null until the Draft has a generated change, and on a merged Draft.", "anyOf": [{ "description": "How version_next relates to the assessed change.", "type": "object" }, { "type": "null" }] }, "errors": { "description": "What blocks the Draft, one entry per finding, each with a code and suggested_action.", "items": { "type": "object" }, "type": "array" }, "changes": { "properties": { "changelog": { "description": "Cumulative changelog against the latest release.", "type": ["string", "null"] }, "breaking_count": { "minimum": 0, "type": ["integer", "null"] } }, "type": ["object", "null"] }, "head_sha": { "description": "Draft commit that compatibility, version, checks, and conflicts describe.", "type": ["string", "null"] }, "pull_request": { "description": "The Draft pull request in the destination repository, or null before one is opened.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "generation_id": { "description": "Generation whose package this Draft contains.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "release_id": { "description": "Release this Draft created when it merged; null while open, or when a merge changed only tests or c…", "anyOf": [{ "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When the Draft opened.", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "conflicts": { "description": "Conflict counts for the current merge stage; null when the Draft has no conflicts.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "customized_files": { "description": "Files where the Draft differs from the last accepted package; null until the Draft is integrated.", "minimum": 0, "type": ["integer", "null"] }, "history_recovery": { "description": "Present only while status is action_required and reason is history_rewritten.", "anyOf": [{ "description": "The approval inputs for a default-branch history rewrite.", "type": "object" }, { "type": "null" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" }, "checks": { "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
35
+ { "resource": "drafts", "method": "recover", "command": ["drafts", "recover"], "tool": "drafts_recover", "httpMethod": "POST", "path": "/drafts/{draft_id}/recover", "summary": "Recover a Draft's history", "description": "When the Draft has status `action_required` and reason `history_rewritten`, review affected files with `listDraftFiles` and `filter=history`, then approve with the Draft's `history_recovery` revisions. Approval saves the recovery without changing Git and returns the Draft; the next generation rebuilds it from the rewritten default branch. The previous Draft branch stays available, and overlapping code comes back as conflicts to resolve. A rewritten Draft branch alone needs no approval.", "toolDescription": "Recover a Draft's history. When the Draft has status `action_required` and reason `history_rewritten`, review affected files with `listDraftFiles` and `filter=history`, then approve with the Draft's `history_recovery` revisions. POST /drafts/{draft_id}/recover", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": false, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "draft_id", "ts": "draftId", "kind": "path", "type": "string", "required": true, "flag": "draft-id" }, { "name": "expected_default_sha", "ts": "expected_default_sha", "kind": "body", "type": "string", "required": true, "description": "The Draft's history_recovery.default_sha.", "flag": "expected-default-sha" }, { "name": "expected_head_sha", "ts": "expected_head_sha", "kind": "body", "type": "string", "required": true, "nullable": true, "description": "The Draft's history_recovery.head_sha; null when the Draft branch is absent.", "flag": "expected-head-sha" }], "inputSchema": { "type": "object", "properties": { "draft_id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "expected_default_sha": { "description": "The Draft's history_recovery.default_sha.", "pattern": "^[a-fA-F0-9]{40}$", "type": "string", "example": "89abcdef0123456789abcdef0123456789abcdef" }, "expected_head_sha": { "description": "The Draft's history_recovery.head_sha; null when the Draft branch is absent.", "pattern": "^[a-fA-F0-9]{40}$", "type": ["string", "null"], "example": "0123456789abcdef0123456789abcdef01234567" } }, "required": ["draft_id", "expected_default_sha", "expected_head_sha"] }, "exampleArguments": { "draft_id": "drf_3q7m1v8k2p5d9h4c", "expected_default_sha": "89abcdef0123456789abcdef0123456789abcdef", "expected_head_sha": "0123456789abcdef0123456789abcdef01234567" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for a Draft.", "examples": ["drf_3q7m1v8k2p5d9h4c"], "pattern": "^drf_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "draft", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "project_id": { "description": "Unique identifier for a project.", "examples": ["prj_4f8k2m7x9q1v6b3n"], "pattern": "^prj_[a-z0-9]{16}$", "type": "string" }, "status": { "enum": ["idle", "working", "action_required", "ready", "merged"], "description": "idle: the open Draft has no pending change; generate the Target to start one.", "type": "string" }, "reason": { "enum": ["conflict", "checks_failed", "review_failed", "checks_unavailable", "history_rewritten"], "description": "conflict: resolve the listed files.", "type": "string" }, "version_next": { "description": "Next version for this Draft, or null before a version is selected.", "type": ["string", "null"] }, "version_source": { "enum": ["automatic", "console", "api", "github", null], "description": "Where version_next was selected; null once the Draft merged.", "type": ["string", "null"] }, "compatibility": { "description": "Null until the Draft has a generated change, and on a merged Draft.", "anyOf": [{ "description": "Comparison of the Draft's head_sha with the latest release.", "type": "object" }, { "type": "null" }] }, "version": { "description": "Null until the Draft has a generated change, and on a merged Draft.", "anyOf": [{ "description": "How version_next relates to the assessed change.", "type": "object" }, { "type": "null" }] }, "errors": { "description": "What blocks the Draft, one entry per finding, each with a code and suggested_action.", "items": { "type": "object" }, "type": "array" }, "changes": { "properties": { "changelog": { "description": "Cumulative changelog against the latest release.", "type": ["string", "null"] }, "breaking_count": { "minimum": 0, "type": ["integer", "null"] } }, "type": ["object", "null"] }, "head_sha": { "description": "Draft commit that compatibility, version, checks, and conflicts describe.", "type": ["string", "null"] }, "pull_request": { "description": "The Draft pull request in the destination repository, or null before one is opened.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "generation_id": { "description": "Generation whose package this Draft contains.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "release_id": { "description": "Release this Draft created when it merged; null while open, or when a merge changed only tests or c…", "anyOf": [{ "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When the Draft opened.", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "conflicts": { "description": "Conflict counts for the current merge stage; null when the Draft has no conflicts.", "anyOf": [{ "type": "object" }, { "type": "null" }] }, "customized_files": { "description": "Files where the Draft differs from the last accepted package; null until the Draft is integrated.", "minimum": 0, "type": ["integer", "null"] }, "history_recovery": { "description": "Present only while status is action_required and reason is history_rewritten.", "anyOf": [{ "description": "The approval inputs for a default-branch history rewrite.", "type": "object" }, { "type": "null" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" }, "checks": { "items": { "type": "object" }, "type": "array" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
36
+ { "resource": "releases", "method": "list", "command": ["releases", "list"], "tool": "releases_list", "httpMethod": "GET", "path": "/releases", "summary": "List Releases", "toolDescription": "List Releases. GET /releases (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "target_id", "ts": "targetId", "kind": "query", "type": "string", "required": false, "description": "Only releases of this Target. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "flag": "target-id", "resolve": { "via": "targets_list", "match": ["name"], "id": "id", "idPattern": "^tgt_[a-z0-9]{16}$", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "target_id": { "description": "Stable identifier for one configured generated product. Accepts an ID or an exact name (resolved via targets_list). IDs come from targets_list.", "examples": ["example-name", "tgt_5m8q2v7k1p9d4h6c"], "type": "string" } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "release", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "generation_id": { "description": "Null only for a verified release imported during package adoption.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "origin": { "enum": ["typeship", "imported"], "type": "string" }, "version": { "description": "Immutable package version released from this Target.", "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "description": "The Target's release_channel when this version was released.", "type": "string" }, "repository": { "anyOf": [{ "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" } }, "type": "object" }, { "type": "null" }] }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "commit_sha": { "description": "Git commit containing the accepted package. Compare it with the Delivery repository history or checked-out commit.", "pattern": "^[0-9a-fA-F]{40}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "approvals": { "items": { "properties": { "source": { "enum": ["source_pr", "draft_pr"], "type": "string" }, "reason": { "type": "string" }, "approved_by": { "type": "string" }, "approved_sha": { "type": "string" }, "approved_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "import_provenance": { "description": "For an adopted Release, compare the tag and registry URL with the published package and its artifact digest. Null for a Release created by Typeship.", "properties": { "tag": { "description": "Git tag to compare with the repository release, if available.", "type": ["string", "null"] }, "registry_url": { "format": "uri", "description": "Published package page to inspect, if available.", "type": ["string", "null"] }, "artifact_digest": { "description": "Published artifact digest to compare with registry metadata, if available.", "type": ["string", "null"] }, "imported_at": { "format": "date-time", "description": "When Typeship recorded the adopted package.", "type": ["string", "null"] } }, "type": ["object", "null"] }, "publications": { "description": "One entry per destination Typeship has attempted to publish. Empty when publishing is off for the Target's repository Delivery.", "items": { "description": "One destination's publishing progress for its Release. It has no ID; read it on the Release.", "properties": { "type": { "enum": ["github", "npm", "pypi", "go", "mcp"], "description": "Where the release is published. github is the repository's GitHub Release; the others are package registries.", "type": "string" }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "queued: the repository workflow has not started this destination; get the Publication or its Release again. running: the workflow is publishing; get it again. completed: the package is published at registry_url. failed: read errors, correct the cause, then retry the Release. Lifecycle events are publication.running, publication.completed, and publication.failed.", "type": "string" }, "attempt": { "minimum": 0, "type": "integer" }, "run_url": { "format": "uri", "type": ["string", "null"] }, "registry_url": { "format": "uri", "type": ["string", "null"] }, "artifact_digest": { "type": ["string", "null"] }, "errors": { "description": "Recorded failures. Empty when this resource has no recorded failure.", "type": "array" }, "started_at": { "format": "date-time", "type": ["string", "null"] }, "finished_at": { "format": "date-time", "type": ["string", "null"] }, "runtime_ms": { "description": "Milliseconds from started_at to finished_at; null until the attempt finishes.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When a Publication of this release last changed. The version, commit, and checks never change after the release is created.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
37
+ { "resource": "releases", "method": "get", "command": ["releases", "get"], "tool": "releases_get", "httpMethod": "GET", "path": "/releases/{release_id}", "summary": "Get a Release", "toolDescription": "Get a Release. GET /releases/{release_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "release_id", "ts": "releaseId", "kind": "path", "type": "string", "required": true, "flag": "release-id" }], "inputSchema": { "type": "object", "properties": { "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" } }, "required": ["release_id"] }, "exampleArguments": { "release_id": "rel_7m2q8v4k1p9d5h6c" }, "outputSchema": { "properties": { "id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "release", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "generation_id": { "description": "Null only for a verified release imported during package adoption.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "origin": { "enum": ["typeship", "imported"], "type": "string" }, "version": { "description": "Immutable package version released from this Target.", "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "description": "The Target's release_channel when this version was released.", "type": "string" }, "repository": { "anyOf": [{ "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" } }, "type": "object" }, { "type": "null" }] }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "commit_sha": { "description": "Git commit containing the accepted package. Compare it with the Delivery repository history or checked-out commit.", "pattern": "^[0-9a-fA-F]{40}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "approvals": { "items": { "properties": { "source": { "enum": ["source_pr", "draft_pr"], "type": "string" }, "reason": { "type": "string" }, "approved_by": { "type": "string" }, "approved_sha": { "type": "string" }, "approved_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "import_provenance": { "description": "For an adopted Release, compare the tag and registry URL with the published package and its artifact digest. Null for a Release created by Typeship.", "properties": { "tag": { "description": "Git tag to compare with the repository release, if available.", "type": ["string", "null"] }, "registry_url": { "format": "uri", "description": "Published package page to inspect, if available.", "type": ["string", "null"] }, "artifact_digest": { "description": "Published artifact digest to compare with registry metadata, if available.", "type": ["string", "null"] }, "imported_at": { "format": "date-time", "description": "When Typeship recorded the adopted package.", "type": ["string", "null"] } }, "type": ["object", "null"] }, "publications": { "description": "One entry per destination Typeship has attempted to publish. Empty when publishing is off for the Target's repository Delivery.", "items": { "description": "One destination's publishing progress for its Release. It has no ID; read it on the Release.", "properties": { "type": { "enum": ["github", "npm", "pypi", "go", "mcp"], "description": "Where the release is published. github is the repository's GitHub Release; the others are package registries.", "type": "string" }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "queued: the repository workflow has not started this destination; get the Publication or its Release again. running: the workflow is publishing; get it again. completed: the package is published at registry_url. failed: read errors, correct the cause, then retry the Release. Lifecycle events are publication.running, publication.completed, and publication.failed.", "type": "string" }, "attempt": { "minimum": 0, "type": "integer" }, "run_url": { "format": "uri", "type": ["string", "null"] }, "registry_url": { "format": "uri", "type": ["string", "null"] }, "artifact_digest": { "type": ["string", "null"] }, "errors": { "description": "Recorded failures. Empty when this resource has no recorded failure.", "items": { "type": "object" }, "type": "array" }, "started_at": { "format": "date-time", "type": ["string", "null"] }, "finished_at": { "format": "date-time", "type": ["string", "null"] }, "runtime_ms": { "description": "Milliseconds from started_at to finished_at; null until the attempt finishes.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When a Publication of this release last changed. The version, commit, and checks never change after the release is created.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
38
+ { "resource": "releases", "method": "retry", "command": ["releases", "retry"], "tool": "releases_retry", "httpMethod": "POST", "path": "/releases/{release_id}/retry", "summary": "Retry publishing a Release", "description": "Queues every failed or queued Publication of the release and starts its repository publishing workflow again. Publishing uses that release's version and accepted commit, even if a newer Draft or release exists. Completed Publications are not repeated.\n\nReturns `202` with the Release. Get the Release until each Publication reaches `completed` or `failed`.\n\nA `409 publication_not_retryable` means no Publication is queued or failed. A `502 repository_unavailable` means the repository publishing workflow could not be dispatched, and nothing was changed.", "toolDescription": "Retry publishing a Release. Queues every failed or queued Publication of the release and starts its repository publishing workflow again. POST /releases/{release_id}/retry", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "release_id", "ts": "releaseId", "kind": "path", "type": "string", "required": true, "flag": "release-id" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "release_id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." } }, "required": ["release_id"] }, "exampleArguments": { "release_id": "rel_7m2q8v4k1p9d5h6c" }, "outputSchema": { "properties": { "id": { "examples": ["rel_7m2q8v4k1p9d5h6c"], "pattern": "^rel_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "release", "type": "string" }, "target_id": { "description": "Stable identifier for one configured generated product.", "examples": ["tgt_5m8q2v7k1p9d4h6c"], "pattern": "^tgt_[a-z0-9]{16}$", "type": "string" }, "generation_id": { "description": "Null only for a verified release imported during package adoption.", "anyOf": [{ "description": "Unique identifier for a generation.", "examples": ["gen_7h2p5d9c3m8w1k6q"], "pattern": "^gen_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "origin": { "enum": ["typeship", "imported"], "type": "string" }, "version": { "description": "Immutable package version released from this Target.", "type": "string" }, "release_channel": { "enum": ["stable", "prerelease"], "description": "The Target's release_channel when this version was released.", "type": "string" }, "repository": { "anyOf": [{ "properties": { "provider": { "enum": ["github"], "description": "GitHub is the only launch provider; the field is stable for future adapters.", "type": "string" }, "identifier": { "description": "Provider-native repository identity, opaque outside its adapter.", "examples": ["parcel-example/api"], "maxLength": 512, "type": "string" } }, "type": "object" }, { "type": "null" }] }, "spec_revision_id": { "anyOf": [{ "description": "Unique identifier for an immutable resolved Spec Revision.", "examples": ["srev_6m1q8v4k2p9d7h3c"], "pattern": "^srev_[a-z0-9]{16}$", "type": "string" }, { "type": "null" }] }, "commit_sha": { "description": "Git commit containing the accepted package. Compare it with the Delivery repository history or checked-out commit.", "pattern": "^[0-9a-fA-F]{40}$", "type": "string" }, "checks": { "items": { "properties": { "name": { "type": "string" }, "source": { "enum": ["typeship", "customer", "repository", "compatibility"], "type": "string" }, "status": { "enum": ["pending", "passed", "failed", "not_assessed"], "type": "string" }, "reason": { "type": "string" }, "commit_sha": { "type": "string" }, "url": { "format": "uri", "type": ["string", "null"] }, "observed_at": { "format": "date-time", "type": ["string", "null"] } }, "type": "object" }, "type": "array" }, "approvals": { "items": { "properties": { "source": { "enum": ["source_pr", "draft_pr"], "type": "string" }, "reason": { "type": "string" }, "approved_by": { "type": "string" }, "approved_sha": { "type": "string" }, "approved_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "import_provenance": { "description": "For an adopted Release, compare the tag and registry URL with the published package and its artifact digest. Null for a Release created by Typeship.", "properties": { "tag": { "description": "Git tag to compare with the repository release, if available.", "type": ["string", "null"] }, "registry_url": { "format": "uri", "description": "Published package page to inspect, if available.", "type": ["string", "null"] }, "artifact_digest": { "description": "Published artifact digest to compare with registry metadata, if available.", "type": ["string", "null"] }, "imported_at": { "format": "date-time", "description": "When Typeship recorded the adopted package.", "type": ["string", "null"] } }, "type": ["object", "null"] }, "publications": { "description": "One entry per destination Typeship has attempted to publish. Empty when publishing is off for the Target's repository Delivery.", "items": { "description": "One destination's publishing progress for its Release. It has no ID; read it on the Release.", "properties": { "type": { "enum": ["github", "npm", "pypi", "go", "mcp"], "description": "Where the release is published. github is the repository's GitHub Release; the others are package registries.", "type": "string" }, "status": { "enum": ["queued", "running", "completed", "failed"], "description": "queued: the repository workflow has not started this destination; get the Publication or its Release again. running: the workflow is publishing; get it again. completed: the package is published at registry_url. failed: read errors, correct the cause, then retry the Release. Lifecycle events are publication.running, publication.completed, and publication.failed.", "type": "string" }, "attempt": { "minimum": 0, "type": "integer" }, "run_url": { "format": "uri", "type": ["string", "null"] }, "registry_url": { "format": "uri", "type": ["string", "null"] }, "artifact_digest": { "type": ["string", "null"] }, "errors": { "description": "Recorded failures. Empty when this resource has no recorded failure.", "items": { "type": "object" }, "type": "array" }, "started_at": { "format": "date-time", "type": ["string", "null"] }, "finished_at": { "format": "date-time", "type": ["string", "null"] }, "runtime_ms": { "description": "Milliseconds from started_at to finished_at; null until the attempt finishes.", "minimum": 0, "type": ["integer", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" } }, "type": "object" }, "type": "array" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When a Publication of this release last changed. The version, commit, and checks never change after the release is created.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
39
+ { "resource": "files", "method": "get", "command": ["files", "get"], "tool": "files_get", "httpMethod": "GET", "path": "/files/{file_id}", "summary": "Get a File", "description": "Returns one bounded chunk of an immutable file: at most 24 KiB, as UTF-8 text or, for binary bytes, base64. When next_cursor is not null, repeat the request with cursor and concatenate the chunks in order. A file ID always returns the same bytes.", "toolDescription": "Get a File. Returns one bounded chunk of an immutable file: at most 24 KiB, as UTF-8 text or, for binary bytes, base64. GET /files/{file_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "file_id", "ts": "fileId", "kind": "path", "type": "string", "required": true, "flag": "file-id" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "next_cursor from the preceding chunk of this file.", "flag": "cursor" }], "inputSchema": { "type": "object", "properties": { "file_id": { "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "next_cursor from the preceding chunk of this file." } }, "required": ["file_id"] }, "exampleArguments": { "file_id": "file_4k8m2v7q1p9d5h6c" }, "outputSchema": { "properties": { "id": { "description": "Unique identifier for one immutable file snapshot. An ID always returns the same bytes: a Spec Revision, a Generation, and each Draft side name their own file IDs, and a new Draft commit gets new IDs.", "examples": ["file_4k8m2v7q1p9d5h6c"], "pattern": "^file_[a-z0-9]{16}$", "type": "string" }, "object": { "const": "file", "type": "string" }, "path": { "description": "Path within the Spec Revision, Generation package, or Target package.", "type": "string" }, "size_bytes": { "minimum": 0, "type": "integer" }, "sha256": { "description": "Digest of the complete file.", "pattern": "^[a-f0-9]{64}$", "type": "string" }, "encoding": { "enum": ["utf8", "base64"], "description": "utf8: content is text. base64: content is base64-encoded binary bytes.", "type": "string" }, "mode": { "description": "Git file mode for package files; null for Spec source files.", "anyOf": [{ "enum": ["100644", "100755", "120000"], "description": "Git file mode. 100755 is executable; 120000 is a symbolic link whose content is its target.", "type": "string" }, { "type": "null" }] }, "created_at": { "format": "date-time", "description": "When Typeship first issued this file ID.", "type": "string" }, "content": { "description": "At most 24 KiB of the file starting at offset, encoded as encoding says. Text chunks never split a character; concatenate chunks in order.", "type": "string" }, "offset": { "description": "Byte offset of this chunk in the file.", "minimum": 0, "type": "integer" }, "next_cursor": { "description": "Pass as cursor to read the next chunk; null at the end of the file.", "type": ["string", "null"] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
40
+ { "resource": "packages", "method": "generate", "command": ["packages", "generate"], "tool": "packages_generate", "httpMethod": "POST", "path": "/generate", "summary": "Generate a package", "description": "Returns one generated package without creating a Project.\n\nSupports [idempotent retries](https://typeship.dev/docs/typeship-api/idempotency); keyed responses include generated files in the replay cache.\n\nUse `download.url` to save the complete ZIP, verify `download.sha256`, and extract it into an empty directory. The link expires at `download.expires_at` and grants access to anyone who has it. CLI, MCP, and SDK calls supply an idempotency key automatically. Agents should request `fields=[\"download\",\"coverage\",\"warnings\",\"claim\"]` to keep the MCP result compact; files can exceed the response limit. Download the ZIP instead of repeating generation to retrieve omitted files.\n\nAnonymous and Free requests include the first 25 operations. Paid plans include all operations. Anonymous requests are rate limited by IP address. Check `coverage` for omitted operations; an invalid API key returns `401`.\n\nAn anonymous URL request without source headers may return `claim.url`. Sign in through that link within seven days to save the recipe as a Project.", "toolDescription": "Generate a package. Returns one generated package without creating a Project. POST /generate Credential optional.", "paginated": false, "hasBody": true, "bodyStyle": "fields", "bodyKind": "json", "sse": false, "hasParams": true, "select": false, "idempotent": false, "idempotencyHeader": "Idempotency-Key", "auth": "optional", "security": [{}, { "apiKey": [] }], "safety": "write", "params": [{ "name": "spec", "ts": "spec", "kind": "body", "type": "json", "required": true, "description": "A Spec for one-shot generation, provided as exactly one URL or inline entrypoint.", "flag": "spec" }, { "name": "target", "ts": "target", "kind": "body", "type": "object", "required": true, "description": "One-shot generator descriptor; no persisted Target is created.", "flag": "target" }, { "name": "package_name", "ts": "package_name", "kind": "body", "type": "string", "required": false, "description": "npm package or Python distribution override. Valid only for the TypeScript and Python SDK targets.", "flag": "package-name" }, { "name": "module_path", "ts": "module_path", "kind": "body", "type": "string", "required": false, "description": "Go module path override for the generated artifact's own module. Valid only for the Go SDK and Go CLI Targets. Projects derive this from the Go destination repository by default.", "flag": "module-path" }, { "name": "go_sdk", "ts": "go_sdk", "kind": "body", "type": "object", "required": false, "description": "The exact paired Go SDK a go_cli generation is built on. Required when target.type is go_cli and rejected otherwise. The descriptor is closed and immutable, because a CLI that pins a range or a branch pins nothing.", "flag": "go-sdk" }, { "name": "config", "ts": "config", "kind": "body", "type": "object", "required": false, "description": "Everything Typeship needs beyond the Spec, in one object: generation customization (globals, retries, pagination, readme) and how the generated tooling behaves (cli, mcp, package, docs_url). Plain configuration. Typeship never requires vendor extensions inside the Spec itself. One-shot generation also accepts GraphQL settings here; stored projects keep those settings on their Spec.", "flag": "config" }, { "name": "Idempotency-Key", "ts": "idempotencyKey", "kind": "header", "type": "string", "required": false, "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write.", "flag": "idempotency-key" }], "inputSchema": { "type": "object", "properties": { "Idempotency-Key": { "minLength": 1, "maxLength": 255, "pattern": "^[!-~]+$", "type": "string", "description": "Identifies one logical write for 24 hours. The key is scoped to the authenticated organization and operation; generation without an organization uses a hashed network identity. Retrying the same method, path, query, If-Match header, and JSON body replays the original response. Reusing the key with changed intent returns 409. After expiry the key starts a new write." }, "spec": { "description": "A Spec for one-shot generation, provided as exactly one URL or inline entrypoint.", "anyOf": [{ "properties": { "url": { "format": "uri", "description": "URL of an OpenAPI document, a GraphQL SDL file, or a GraphQL\nendpoint (introspected automatically). Fetched server-side.", "pattern": "^https?://", "type": "string" }, "headers": { "description": "Request headers for a protected URL. Sent on the document GET and GraphQL introspection POST, never returned or retained by one-shot generation.", "additionalProperties": { "maxLength": 4096, "type": "string" }, "type": "object" } }, "required": ["url"], "additionalProperties": false, "type": "object" }, { "properties": { "inline": { "description": "Raw Spec text (OpenAPI JSON/YAML or GraphQL SDL). Up to 4 MB, because the request body carries it; send Specs up to 10 MB with `url`.", "type": "string" } }, "required": ["inline"], "additionalProperties": false, "type": "object" }], "example": { "url": "https://typeship.dev/examples/petstore/openapi.yaml" } }, "target": { "description": "One-shot generator descriptor; no persisted Target is created.", "properties": { "type": { "enum": ["cli", "go_cli", "mcp", "typescript_sdk", "python_sdk", "go_sdk"], "description": "Generator implementation selected by a Target. This is configuration, not identity; several Targets may use the same generator. cli is the TypeScript CLI; go_cli is the native Go CLI, a distinct product that imports one exact paired Go SDK module rather than a client of its own.", "type": "string" } }, "required": ["type"], "additionalProperties": false, "type": "object", "example": { "type": "cli" } }, "package_name": { "description": "npm package or Python distribution override. Valid only for the TypeScript and Python SDK targets.", "type": "string" }, "module_path": { "description": "Go module path override for the generated artifact's own module. Valid only for the Go SDK and Go CLI Targets. Projects derive this from the Go destination repository by default.", "type": "string" }, "go_sdk": { "description": "The exact paired Go SDK a go_cli generation is built on. Required when target.type is go_cli and rejected otherwise. The descriptor is closed and immutable, because a CLI that pins a range or a branch pins nothing.", "properties": { "module_path": { "description": "Go module path of the SDK the CLI imports, for example github.com/acme/payments-go. Must be a valid Go module path.", "type": "string" }, "version": { "description": "Exact SDK module version the CLI requires: v-prefixed SemVer such as v1.2.3, or an immutable Go pseudo-version naming a commit such as v0.0.0-20240824120000-abcdef123456. Ranges, branches, and \"latest\" are rejected.", "type": "string" }, "spec_digest": { "description": "SHA-256 hex digest of the Spec the SDK was generated from. Must match the resolved Spec, or the request fails with spec_invalid.", "pattern": "^[a-f0-9]{64}$", "type": "string" }, "package_name": { "description": "Go package identifier of the SDK, when the module path's last element does not imply it. Optional.", "type": "string" } }, "required": ["module_path", "version", "spec_digest"], "additionalProperties": false, "type": "object" }, "config": { "description": "Everything Typeship needs beyond the Spec, in one object: generation customization (globals, retries, pagination, readme) and how the generated tooling behaves (cli, mcp, package, docs_url). Plain configuration. Typeship never requires vendor extensions inside the Spec itself. One-shot generation also accepts GraphQL settings here; stored projects keep those settings on their Spec.", "properties": { "globals": { "description": "Wire names of query/header parameters that become settable once on the generated client and auto-apply to every operation that accepts them; per-call values win. Names that match nothing are reported as generation warnings.", "maxItems": 20, "items": { "type": "string" }, "type": "array" }, "include": { "description": "Generate only matching operations: tag names, or path globs such as `/zones/**` (`*` is one path segment, `**` any number), optionally after an HTTP method (`DELETE /zones/*`). Applied before the Spec size limit, with components nothing references any more removed, so a one-shot run can generate part of a Spec up to 64 MB. Selectors that match nothing are reported as generation warnings.", "maxItems": 100, "items": { "minLength": 1, "maxLength": 500, "type": "string" }, "type": "array" }, "exclude": { "description": "Leave out matching operations (tag names or path globs, as for `include`). Wins over `include`.", "maxItems": 100, "items": { "minLength": 1, "maxLength": 500, "type": "string" }, "type": "array" }, "retries": { "description": "Retry behavior. Top-level fields adjust every operation; operations maps operationId or \"METHOD /path\" keys to per-operation overrides.", "properties": { "max_retries": { "minimum": 0, "maximum": 10, "type": "integer" }, "statuses": { "description": "Replaces the default retryable set (408, 429, 500, 502, 503, 504).", "maxItems": 20, "items": { "type": "integer" }, "type": "array" }, "initial_delay_ms": { "minimum": 1, "type": "integer" }, "max_delay_ms": { "minimum": 1, "type": "integer" }, "retry_non_idempotent": { "description": "Also retry non-idempotent methods (POST/PATCH).", "type": "boolean" }, "disabled": { "description": "Shorthand for max_retries 0.", "type": "boolean" }, "operations": { "additionalProperties": { "description": "RetryTuning (recursive)" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "pagination": { "description": "Per-operation pagination control, keyed by operationId or \"METHOD /path\". Unmatched keys are reported as generation warnings.", "additionalProperties": { "anyOf": [{ "properties": { "style": { "enum": ["cursor", "cursor_from_last_id", "page", "offset"], "default": "cursor", "type": "string" }, "items_field": { "description": "Response field holding the item array.", "type": "string" }, "cursor_param": { "type": "string" }, "next_cursor_field": { "type": "string" }, "has_more_field": { "type": "string" }, "id_field": { "type": "string" }, "page_param": { "type": "string" }, "offset_param": { "type": "string" }, "limit_param": { "type": "string" } }, "required": ["items_field"], "additionalProperties": false, "type": "object" }, { "description": "false disables pagination detection for the operation.", "type": "boolean" }] }, "type": "object" }, "graphql": { "description": "What a GraphQL schema cannot say about itself. Ignored for OpenAPI specs.", "properties": { "endpoint": { "format": "uri", "description": "The URL every request is POSTed to; the generated client's default baseUrl. Defaults to the URL the schema was fetched from. Without either, baseUrl is a required client option.", "type": "string" }, "environments": { "description": "Named endpoints (sandbox, production). Each becomes a client environment; the first is the default unless endpoint is set.", "maxItems": 10, "items": { "properties": { "name": { "type": "string" }, "url": { "format": "uri", "type": "string" } }, "required": ["name", "url"], "additionalProperties": false, "type": "object" }, "type": "array" }, "auth": { "enum": ["bearer", "basic", "basic_api_key", "api_key", "api_key_or_bearer", "none"], "description": "How requests authenticate. bearer sends Authorization: Bearer; basic is for key-pair APIs (public key as username, private key as password); basic_api_key sends one API key as the Basic-auth username with an empty password; api_key sends a header named by api_key_header; api_key_or_bearer sends a key in api_key_header (Authorization for a raw key) and also accepts an OAuth access token as Authorization: Bearer; none generates no auth option.", "default": "bearer", "type": "string" }, "api_key_header": { "description": "Header carrying the key when auth is api_key or api_key_or_bearer. Required for those modes; Typeship does not invent a vendor-specific header name.", "type": "string" }, "title": { "description": "The API's name; drives the package and client names (\"Acme\" gives acme and AcmeClient). Defaults to a name derived from the endpoint's host.", "maxLength": 80, "type": "string" }, "scalars": { "description": "JSON representation of each custom scalar, keyed by GraphQL scalar name. Unmapped scalars generate as the language's untyped JSON value and produce a warning. Unmatched keys warn.", "additionalProperties": { "enum": ["string", "integer", "number", "boolean", "json"], "type": "string" }, "type": "object" }, "error_types": { "description": "Object types that report a failure when an operation's union or interface result resolves to them (errors returned as data). Replaces the default, which is every member whose name ends in Error when the result can also be something else. An empty array treats no result as a failure. Names that are not object types in the schema produce a generation warning.", "maxItems": 100, "uniqueItems": true, "items": { "pattern": "^[_A-Za-z][_0-9A-Za-z]*$", "type": "string" }, "type": "array" }, "page_size": { "description": "Page size a paginated connection call sends as first when the caller passes neither first nor last. Relay servers such as GitHub reject a connection query without one. Ignored for a connection whose first argument has a schema default.", "default": 100, "minimum": 1, "maximum": 1000, "type": "integer" } }, "additionalProperties": false, "type": "object" }, "auth": { "description": "Public authentication defaults for generated clients and tools. Stored Projects own the OAuth server, application catalog, and identity policy; one-shot generation accepts the same shape for one run. Runtime credentials and client secrets are never accepted.", "properties": { "oauth_server": { "anyOf": [{ "description": "Authorization-server metadata used by generated OAuth flows. Secrets and runtime credentials are never accepted here.", "properties": { "issuer": { "format": "uri", "description": "Exact authorization-server issuer, including any tenant path.", "type": ["string", "null"] }, "discovery_url": { "format": "uri", "description": "Exact metadata URL when it cannot be derived from the issuer.", "type": ["string", "null"] }, "authorization_url": { "format": "uri", "description": "Authorization endpoint override.", "type": ["string", "null"] }, "token_url": { "format": "uri", "description": "Token endpoint override.", "type": ["string", "null"] }, "device_authorization_url": { "format": "uri", "description": "Device-authorization endpoint override.", "type": ["string", "null"] }, "scopes": { "description": "Default scopes requested during login.", "maxItems": 20, "type": ["array", "null"] }, "audience": { "description": "Default audience included in authorization and token requests.", "type": ["string", "null"] }, "resource": { "format": "uri", "description": "Protected API resource included in authorization and token requests.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "oauth_applications": { "description": "OAuth applications keyed by a stable name.", "additionalProperties": { "description": "OAuth application available to generated products. Public clients support interactive login; confidential clients support runtime-supplied machine credentials. Client secrets are never stored.", "properties": { "client_id": { "description": "OAuth client identifier.", "minLength": 1, "maxLength": 200, "type": "string" }, "login_method": { "enum": ["browser", "device", null], "description": "Interactive login method. Browser login uses Authorization Code with PKCE.", "type": ["string", "null"] }, "client_auth_method": { "enum": ["post", "basic", null], "description": "How a runtime-supplied client secret is sent for machine grants.", "type": ["string", "null"] }, "redirect_uri": { "format": "uri", "description": "Loopback callback URL for browser login.", "type": ["string", "null"] }, "organization_parameter": { "enum": ["organization", "organization_id", null], "description": "Provider parameter used to request an organization during browser login.", "type": ["string", "null"] } }, "required": ["client_id"], "additionalProperties": false, "type": "object" }, "type": ["object", "null"] }, "oauth_application": { "description": "Default OAuth application used by generated products.", "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "identity_verification": { "anyOf": [{ "description": "Authenticated identity read used to verify a login before it is saved. Operation is auto-detected when omitted or null. At least one of subject_field, account_field, or organization_field must be a non-null JSON Pointer. Null clears an individual mapping while another remains. Set identity_verification itself to null to remove the whole policy.", "example": { "subject_field": "/id", "account_field": "/account_id", "organization_field": "/organization_id" }, "properties": { "operation": { "description": "resource.method of a safe identity read with no required arguments.", "maxLength": 2000, "pattern": "^[\\w$]+\\.[\\w$]+$", "type": ["string", "null"] }, "subject_field": { "description": "JSON Pointer to the stable caller ID in the identity response.", "example": "/id", "maxLength": 512, "pattern": "^/(?:[^~\\x00-\\x1f\\x7f]|~[01])*$", "type": ["string", "null"] }, "account_field": { "description": "JSON Pointer to the customer account ID.", "example": "/account_id", "maxLength": 512, "pattern": "^/(?:[^~\\x00-\\x1f\\x7f]|~[01])*$", "type": ["string", "null"] }, "organization_field": { "description": "JSON Pointer to the customer organization ID.", "example": "/organization_id", "maxLength": 512, "pattern": "^/(?:[^~\\x00-\\x1f\\x7f]|~[01])*$", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, { "type": "null" }] }, "approval_url": { "format": "uri", "description": "Base URL of a custom browser-approval backend implementing the start, status, and revoke contract. Used only when OAuth is not configured.", "type": ["string", "null"] }, "environments": { "description": "Authentication selections keyed by generated API environment name.", "additionalProperties": { "description": "OAuth application and request-value overrides for one named API environment.", "properties": { "oauth_application": { "maxLength": 64, "pattern": "^[a-z][a-z0-9_-]{0,63}$", "type": ["string", "null"] }, "scopes": { "maxItems": 20, "type": ["array", "null"] }, "audience": { "type": ["string", "null"] }, "resource": { "format": "uri", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "type": ["object", "null"] }, "credential_variables": { "description": "Environment variables the generated CLI, MCP server, and SDK environment fallbacks read, keyed by security scheme name. A string names the token or key variable; a Basic scheme takes { username, password }. Wins over the scheme's x-typeship-env extension. Without either, names derive from the package and scheme.", "additionalProperties": { "anyOf": [{ "pattern": "^[A-Z_][A-Z0-9_]{0,127}$", "type": "string" }, { "type": "object" }] }, "type": ["object", "null"] }, "credential_parameters": { "description": "Whether a parameter carries the operation's credential, keyed by operationId, \"METHOD /path\", or \"*\" for every operation, then by the parameter's wire name. true leaves the parameter out of generated signatures, CLI flags, and MCP tool input, because the configured credential already reaches the API; false keeps it. Wins over the parameter's x-typeship-credential extension and the generator's inference.", "additionalProperties": { "additionalProperties": { "type": "boolean" }, "type": "object" }, "type": ["object", "null"] } }, "additionalProperties": false, "type": "object" }, "cli": { "description": "How the generated CLI behaves. Part of Config.", "properties": { "command_name": { "description": "Command users run, independent of how the CLI is distributed.", "type": ["string", "null"] }, "update_notice": { "description": "Opt in to a once-a-day registry check that prints an upgrade hint. Off by default; generated code phones nobody unless this is enabled.", "type": "boolean" }, "changelog_url": { "description": "Public HTTP(S) URL read by the optional changelog command in generated CLIs. Supports UTF-8 Markdown, plain text, and static HTML; embedded credentials are not allowed. Omit or clear to disable, then regenerate.", "type": ["string", "null"] }, "support_url": { "description": "Where the generated CLI's feedback command sends users. GitHub issues/new URLs get a prefilled title and environment details.", "type": ["string", "null"] }, "mcp_url": { "description": "Hosted MCP endpoint installed by the generated CLI instead of launching the package's local stdio server.", "type": ["string", "null"] }, "skills_repo": { "description": "GitHub owner/name of the skills package the generated CLI offers to install during init.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "mcp": { "description": "How generated MCP servers and the Typeship-hosted endpoint behave. Part of Config.", "properties": { "registry_name": { "description": "Stable official MCP registry name, independent of the server runtime.", "type": ["string", "null"] }, "access": { "description": "Authorization for callers connecting to a generated MCP server deployed over HTTP. The hosting application resolves upstream API credentials separately at runtime. This setting does not apply to the Typeship-hosted endpoint.", "properties": { "issuer": { "format": "uri", "description": "Exact issuer allowed to sign MCP connection tokens.", "type": "string" }, "resource": { "format": "uri", "description": "Canonical public URL of the self-hosted MCP endpoint that connection tokens must target.", "type": "string" }, "jwks_url": { "format": "uri", "description": "Public signing-key endpoint. Omit to discover it from the issuer.", "type": "string" }, "scopes": { "description": "Minimum scopes required to connect to the self-hosted MCP server.", "maxItems": 20, "items": { "type": "string" }, "type": "array" } }, "required": ["issuer", "resource"], "additionalProperties": false, "type": "object" }, "tool_mode": { "enum": ["auto", "operations", "meta"], "description": "MCP tool shape. meta collapses per-operation tools into search_docs, read_docs, and execute so large APIs don't flood an agent's context window. Auto considers the serialized tool schemas, switching near 10k tokens or above 100 operations.", "type": "string" }, "instructions": { "description": "Guidance appended to the MCP server's instructions, which agents read once when they connect (server/discover): what to call first, conventions the spec does not state, what not to do. Carried by the package's server and the hosted endpoint alike.", "maxLength": 2000, "type": ["string", "null"] }, "tool_descriptions": { "description": "Hand-written MCP tool descriptions keyed by operationId or \"METHOD /path\". Each replaces the text typeship derives for that operation (summary, first sentence, method and path, deprecation and auth notes). For flows the spec cannot describe, such as a multi-step upload. Keys that match no operation are reported as generation warnings.", "additionalProperties": { "maxLength": 600, "type": "string" }, "type": "object" }, "reference_resolvers": { "description": "Exact name-or-ID resolver overrides keyed first by the target operationId or \"METHOD /path\", then by its wire argument name. A resolver names one read collection operation plus 1-4 item fields to match case-insensitively; false opts that argument out of strict inference.", "additionalProperties": { "additionalProperties": { "anyOf": [{ "enum": [false], "type": "boolean" }, { "type": "object" }] }, "type": "object" }, "type": "object" } }, "additionalProperties": false, "type": "object" }, "readme": { "description": "Generated README behavior. Part of Config.", "properties": { "quickstart_operation": { "description": "operationId or \"METHOD /path\" to feature as the README's first API call. It must be present in the generated package and callable with no required input beyond path placeholders. Missing or unsuitable choices produce a warning and use the automatic example.", "maxLength": 500, "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "package": { "description": "Published-package metadata the API spec does not own. Repository is derived from each destination.", "properties": { "title": { "description": "The API's name as generated READMEs, AGENTS.md, package descriptions, and help text show it, such as \"Parcel\" for a Spec titled \"Parcel - Public API\". Display only: package, client, and command names still come from the Spec. Defaults to the Spec title with common noise removed (\"Parcel - API\" shows as Parcel).", "maxLength": 100, "type": ["string", "null"] }, "homepage": { "description": "Homepage written into registry metadata.", "type": ["string", "null"] }, "license": { "description": "SPDX identifier written into registry metadata. Defaults to info.license.", "maxLength": 200, "type": ["string", "null"] }, "license_text": { "description": "Exact LICENSE file contents. Supply this for licences the engine does not build in; MIT is built in when copyright is also set.", "maxLength": 100000, "type": ["string", "null"] }, "copyright": { "description": "Copyright line used in generated license files.", "maxLength": 200, "type": ["string", "null"] }, "go_package_name": { "description": "Go identifier when the destination repository name is unsuitable.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" }, "docs_url": { "format": "uri", "description": "The API's documentation site. Read through its llms.txt by the generated CLI's docs command, the MCP server's docs tools, and the package's AGENTS.md. Defaults to the Spec's externalDocs URL.", "type": ["string", "null"] }, "docs_index_url": { "format": "uri", "description": "Exact llms.txt URL when the documentation site does not publish it at docs_url + /llms.txt.", "type": ["string", "null"] } }, "additionalProperties": false, "type": "object" } }, "required": ["spec", "target"] }, "exampleArguments": { "spec": { "url": "https://typeship.dev/examples/petstore/openapi.yaml" }, "target": { "type": "cli" } }, "fileBundleProperty": "files", "outputSchema": { "properties": { "object": { "const": "package", "description": "One generated package. It has no ID: download it with download.url before download.expires_at.", "type": "string" }, "files": { "items": { "properties": { "path": { "description": "Repo-relative path inside the generated package.", "type": "string" }, "content": { "type": "string" }, "mode": { "enum": ["100644", "100755"], "description": "Exact Git file mode. Omitted one-shot outputs are regular files.", "default": "100644", "type": "string" } }, "type": "object" }, "type": "array" }, "download": { "description": "Complete package ZIP from this exact result. Present on requests with Idempotency-Key, including automatic CLI, MCP, and SDK keys. Download before expires_at, verify sha256, and extract into an empty directory. Anyone with this URL can download the package; keep it private. Reading does not generate again or extend the 24-hour replay window.", "properties": { "url": { "format": "uri", "type": "string" }, "expires_at": { "format": "date-time", "type": "string" }, "sha256": { "description": "SHA-256 of the downloaded ZIP bytes.", "pattern": "^[a-f0-9]{64}$", "type": "string" }, "size_bytes": { "minimum": 0, "type": "integer" }, "file_count": { "minimum": 0, "type": "integer" } }, "type": "object" }, "warnings": { "items": { "properties": { "code": { "description": "Stable machine-readable warning code.", "type": "string" }, "message": { "description": "Human-readable explanation.", "type": "string" }, "operation": { "description": "METHOD/path of the affected operation, when applicable.", "type": "string" } }, "type": "object" }, "type": "array" }, "coverage": { "properties": { "generated": { "minimum": 0, "type": "integer" }, "omitted": { "minimum": 0, "type": "integer" }, "total": { "minimum": 0, "type": "integer" }, "omitted_operations": { "description": "METHOD/path identities of operations omitted from the package.", "items": { "type": "string" }, "type": "array" }, "reason": { "enum": ["anonymous", "free_plan"], "description": "Present when a plan or anonymous limit omitted operations.", "type": "string" }, "signup_url": { "format": "uri", "description": "Sign-up link for anonymous capped runs.", "type": "string" }, "upgrade_url": { "format": "uri", "description": "Upgrade link for capped signed-in runs.", "type": "string" } }, "type": "object" }, "claim": { "description": "Anonymous, URL-sourced generations only. A link a signed-in person can open to turn this run into a project in their organization (same Spec, Target, and config). Lasts seven days. Null for inline Specs; absent on keyed calls.", "anyOf": [{ "type": "null" }, { "properties": { "url": { "type": "string" }, "expires_at": { "format": "date-time", "type": "string" } }, "type": "object" }] }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
41
+ { "resource": "packages", "method": "download", "command": ["packages", "download"], "tool": "packages_download", "httpMethod": "GET", "path": "/generate/download", "summary": "Download a generated package", "description": "Download the complete ZIP referenced by `packages_generate`'s `download.url`. Pass the token from that URL. No API key is needed; the token grants access only to that exact package until its replay window expires. Keep the token private.\n\nThe local MCP server saves this binary response to disk. On a hosted MCP connection, download the original URL directly to your workspace. Verify the ZIP against `download.sha256` before extracting it into an empty directory. Expired or invalid tokens return `404`; a new generation creates a new download.", "toolDescription": "Download a generated package. Download the complete ZIP referenced by `packages_generate`'s `download.url`. GET /generate/download No credential needed.", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "rawResponse": "binary", "hasParams": true, "select": false, "idempotent": true, "auth": "none", "security": [{}], "safety": "read", "params": [{ "name": "token", "ts": "token", "kind": "query", "type": "string", "required": true, "description": "Private download token from download.url in the generation result.", "flag": "query-token" }], "inputSchema": { "type": "object", "properties": { "token": { "minLength": 43, "maxLength": 43, "pattern": "^[A-Za-z0-9_-]{43}$", "type": "string", "example": "parcel_download_example_token_1234567890123", "description": "Private download token from download.url in the generation result." } }, "required": ["token"] }, "exampleArguments": { "token": "parcel_download_example_token_1234567890123" }, "credentialOptions": [] },
42
+ { "resource": "organization", "method": "get", "command": ["organization", "get"], "tool": "organization_get", "httpMethod": "GET", "path": "/organization", "summary": "Get the Organization", "description": "Returns the organization associated with your credential. The Typeship CLI uses this endpoint for `whoami`.", "toolDescription": "Get the Organization. Returns the organization associated with your credential. GET /organization", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [], "inputSchema": { "type": "object", "properties": {} }, "exampleArguments": {}, "outputSchema": { "description": "The organization an API key belongs to. Members share its projects, keys, and plan; sign-in identity is not part of the API.", "properties": { "id": { "description": "Opaque, output-only organization identifier. Copy it unchanged; its format is not a contract.", "type": "string" }, "object": { "const": "organization", "type": "string" }, "name": { "description": "The organization's display name.", "type": "string" }, "plan": { "enum": ["free", "pro", "enterprise"], "type": "string" }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]], "showcase": true },
43
+ { "resource": "apiKeys", "method": "list", "command": ["api-keys", "list"], "tool": "api_keys_list", "httpMethod": "GET", "path": "/api-keys", "summary": "List API keys", "description": "Lists key metadata and the last four characters of each key. Full keys are not returned. Create keys in the Console.", "toolDescription": "List API keys. Lists key metadata and the last four characters of each key. GET /api-keys (paginated: returns one page plus hasMore and nextPage arguments)", "paginated": true, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": true, "pagination": { "style": "cursor", "itemsField": "data", "cursorParam": "cursor", "nextCursorField": "next_cursor", "hasMoreField": "has_more", "limitParam": "limit" }, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "limit", "ts": "limit", "kind": "query", "type": "number", "required": false, "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20.", "flag": "limit" }, { "name": "cursor", "ts": "cursor", "kind": "query", "type": "string", "required": false, "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests.", "flag": "cursor" }, { "name": "status", "ts": "status", "kind": "query", "type": "string", "required": false, "enum": ["active", "revoked"], "description": "Only keys with this status.", "flag": "status" }], "inputSchema": { "type": "object", "properties": { "limit": { "default": 20, "minimum": 1, "maximum": 100, "type": "integer", "description": "Maximum number of resources to return. Omit for 20; otherwise supply base-10 digits representing an integer from 1 to 100. Empty, malformed, or out-of-range values return 400 input_invalid. List query parameters must appear only once; repeated or unrecognized parameters return 400 query_param_invalid. Default: 20." }, "cursor": { "minLength": 1, "maxLength": 2048, "pattern": "^[A-Za-z0-9_-]+$", "type": "string", "description": "Opaque cursor from the preceding page's next_cursor. Valid only for the same organization, operation, filters, and ordering that issued it. Omit to start at the first page. Empty or malformed cursors, and cursors issued for different filters, return 400 cursor_invalid; start again from the first page. Repeated cursors return 400 query_param_invalid. The page limit may change between requests." }, "status": { "enum": ["active", "revoked"], "type": "string", "description": "Only keys with this status." } } }, "exampleArguments": {}, "outputSchema": { "type": "object", "properties": { "items": { "type": "array", "items": { "properties": { "id": { "type": "string" }, "object": { "const": "api_key", "type": "string" }, "name": { "type": "string" }, "last4": { "description": "Last four characters of the secret; the secret itself is never stored.", "type": "string" }, "status": { "enum": ["active", "revoked"], "description": "active: the key authenticates requests. revoked: it no longer does and cannot be restored; create a new key in the Console or with typeship login.", "type": "string" }, "last_used_at": { "format": "date-time", "type": ["string", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the key last changed, such as its revocation.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" } }, "hasMore": { "type": "boolean", "description": "Whether another page exists" }, "nextPage": { "type": "object", "description": "Arguments that fetch the next page; pass them to this tool", "additionalProperties": true }, "truncated": { "type": "object", "description": "Present when the page was cut to fit the result size cap: how many items were omitted and how to get them", "additionalProperties": true } } }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
44
+ { "resource": "apiKeys", "method": "get", "command": ["api-keys", "get"], "tool": "api_keys_get", "httpMethod": "GET", "path": "/api-keys/{api_key_id}", "summary": "Get an API key", "description": "Returns the key summary and its ETag for conditional revocation.", "toolDescription": "Get an API key. Returns the key summary and its ETag for conditional revocation. GET /api-keys/{api_key_id}", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": false, "select": false, "idempotent": true, "auth": "required", "security": [{ "apiKey": [] }], "safety": "read", "params": [{ "name": "api_key_id", "ts": "apiKeyId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via api_keys_list). IDs come from api_keys_list.", "flag": "api-key-id", "resolve": { "via": "api_keys_list", "match": ["name"], "id": "id", "inferred": true } }], "inputSchema": { "type": "object", "properties": { "api_key_id": { "description": "Identifier returned by the API key list. Accepts an ID or an exact name (resolved via api_keys_list). IDs come from api_keys_list.", "type": "string", "examples": ["example-name", "apikey_2nY8mR6pQ4vK9cH3"] } }, "required": ["api_key_id"] }, "exampleArguments": { "api_key_id": "apikey_2nY8mR6pQ4vK9cH3" }, "outputSchema": { "properties": { "id": { "type": "string" }, "object": { "const": "api_key", "type": "string" }, "name": { "type": "string" }, "last4": { "description": "Last four characters of the secret; the secret itself is never stored.", "type": "string" }, "status": { "enum": ["active", "revoked"], "description": "active: the key authenticates requests. revoked: it no longer does and cannot be restored; create a new key in the Console or with typeship login.", "type": "string" }, "last_used_at": { "format": "date-time", "type": ["string", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the key last changed, such as its revocation.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
45
+ { "resource": "apiKeys", "method": "revoke", "command": ["api-keys", "revoke"], "tool": "api_keys_revoke", "httpMethod": "POST", "path": "/api-keys/{api_key_id}/revoke", "summary": "Revoke an API key", "description": "Revokes a key immediately. The key stays listed with `status: revoked`. Repeating the request returns the same result.\n\nWith OAuth, members can revoke their own keys; organization admins can revoke any key. Organization API keys can revoke any key in their organization.\nSee [conditional writes](https://typeship.dev/docs/typeship-api#conditional-writes) for ETag and If-Match.", "toolDescription": "Revoke an API key. Revokes a key immediately. POST /api-keys/{api_key_id}/revoke", "paginated": false, "hasBody": false, "bodyStyle": "none", "bodyKind": null, "sse": false, "hasParams": true, "select": false, "idempotent": false, "auth": "required", "security": [{ "apiKey": [] }], "safety": "write", "params": [{ "name": "api_key_id", "ts": "apiKeyId", "kind": "path", "type": "string", "required": true, "description": "Accepts an ID or an exact name (resolved via api_keys_list). IDs come from api_keys_list.", "flag": "api-key-id", "resolve": { "via": "api_keys_list", "match": ["name"], "id": "id", "inferred": true } }, { "name": "If-Match", "ts": "ifMatch", "kind": "header", "type": "string", "required": false, "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes.", "flag": "if-match" }], "inputSchema": { "type": "object", "properties": { "api_key_id": { "description": "Identifier returned by the API key list. Accepts an ID or an exact name (resolved via api_keys_list). IDs come from api_keys_list.", "type": "string", "examples": ["example-name", "apikey_2nY8mR6pQ4vK9cH3"] }, "If-Match": { "minLength": 1, "maxLength": 1024, "type": "string", "description": "ETag from a preceding response. The write applies only if the resource still has that version; otherwise it returns 412 precondition_failed without changes. Omit to write the current version. See https://typeship.dev/docs/typeship-api#conditional-writes." } }, "required": ["api_key_id"] }, "exampleArguments": { "api_key_id": "apikey_2nY8mR6pQ4vK9cH3" }, "outputSchema": { "properties": { "id": { "type": "string" }, "object": { "const": "api_key", "type": "string" }, "name": { "type": "string" }, "last4": { "description": "Last four characters of the secret; the secret itself is never stored.", "type": "string" }, "status": { "enum": ["active", "revoked"], "description": "active: the key authenticates requests. revoked: it no longer does and cannot be restored; create a new key in the Console or with typeship login.", "type": "string" }, "last_used_at": { "format": "date-time", "type": ["string", "null"] }, "created_at": { "format": "date-time", "type": "string" }, "updated_at": { "format": "date-time", "description": "When the key last changed, such as its revocation.", "type": "string" }, "request_id": { "description": "Server-generated identifier used to correlate this response with Typeship logs.", "examples": ["req_3k8m1v6q9p2d7h4c"], "pattern": "^req_[a-z0-9]{16}$", "type": "string" } }, "type": "object" }, "credentialOptions": [["bearerToken"], ["credentials.apiKey"]] },
45
46
  ];
46
47
  export const OMITTED_OPS = [];
47
48
  /** Parameters settable once on the client (globals option): CLI/MCP fill
@@ -60,7 +61,7 @@ export function missingRequired(op, values) {
60
61
  * keyed by wire name (plus an optional raw body for bodyStyle "data" or a
61
62
  * --data base object).
62
63
  */
63
- export function buildArgs(op, values, dataBody, select) {
64
+ export function buildArgs(op, values, dataBody, select, options) {
64
65
  const args = [];
65
66
  for (const p of op.params) {
66
67
  if (p.kind === "path")
@@ -93,6 +94,8 @@ export function buildArgs(op, values, dataBody, select) {
93
94
  const params = {};
94
95
  let used = false;
95
96
  for (const p of op.params) {
97
+ if (p.continuation)
98
+ continue;
96
99
  if ((p.kind === "query" || p.kind === "header") && values[p.name] !== undefined) {
97
100
  params[p.ts] = values[p.name];
98
101
  used = true;
@@ -100,5 +103,11 @@ export function buildArgs(op, values, dataBody, select) {
100
103
  }
101
104
  args.push(used ? params : undefined);
102
105
  }
106
+ // Request options (a next-page URL, a response observer) come after
107
+ // every argument.
108
+ const continuation = op.params.find((p) => p.continuation);
109
+ const requestOptions = { ...options, ...(continuation && typeof values[continuation.name] === "string" ? { pageUrl: values[continuation.name] } : {}) };
110
+ if (Object.keys(requestOptions).length > 0)
111
+ args.push(requestOptions);
103
112
  return args;
104
113
  }