@typeship-ax/cli 0.6.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 (69) hide show
  1. package/LICENSE +9 -0
  2. package/README.md +40 -0
  3. package/api.json +5163 -0
  4. package/api.md +512 -0
  5. package/dist/cli-agent.d.ts +204 -0
  6. package/dist/cli-agent.d.ts.map +1 -0
  7. package/dist/cli-agent.js +525 -0
  8. package/dist/cli.d.ts +3 -0
  9. package/dist/cli.d.ts.map +1 -0
  10. package/dist/cli.js +2811 -0
  11. package/dist/core/http.d.ts +303 -0
  12. package/dist/core/http.d.ts.map +1 -0
  13. package/dist/core/http.js +770 -0
  14. package/dist/core/pagination.d.ts +51 -0
  15. package/dist/core/pagination.d.ts.map +1 -0
  16. package/dist/core/pagination.js +154 -0
  17. package/dist/dates.d.ts +33 -0
  18. package/dist/dates.d.ts.map +1 -0
  19. package/dist/dates.js +136 -0
  20. package/dist/errors.d.ts +81 -0
  21. package/dist/errors.d.ts.map +1 -0
  22. package/dist/errors.js +103 -0
  23. package/dist/index.d.ts +92 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +86 -0
  26. package/dist/ops.d.ts +115 -0
  27. package/dist/ops.d.ts.map +1 -0
  28. package/dist/ops.js +79 -0
  29. package/dist/resources/account.d.ts +18 -0
  30. package/dist/resources/account.d.ts.map +1 -0
  31. package/dist/resources/account.js +26 -0
  32. package/dist/resources/api-keys.d.ts +37 -0
  33. package/dist/resources/api-keys.d.ts.map +1 -0
  34. package/dist/resources/api-keys.js +67 -0
  35. package/dist/resources/generate.d.ts +25 -0
  36. package/dist/resources/generate.d.ts.map +1 -0
  37. package/dist/resources/generate.js +41 -0
  38. package/dist/resources/generations.d.ts +31 -0
  39. package/dist/resources/generations.d.ts.map +1 -0
  40. package/dist/resources/generations.js +56 -0
  41. package/dist/resources/projects.d.ts +110 -0
  42. package/dist/resources/projects.d.ts.map +1 -0
  43. package/dist/resources/projects.js +220 -0
  44. package/dist/resources/spec-revisions.d.ts +47 -0
  45. package/dist/resources/spec-revisions.d.ts.map +1 -0
  46. package/dist/resources/spec-revisions.js +90 -0
  47. package/dist/schemas.d.ts +6 -0
  48. package/dist/schemas.d.ts.map +1 -0
  49. package/dist/schemas.js +88 -0
  50. package/dist/types.d.ts +759 -0
  51. package/dist/types.d.ts.map +1 -0
  52. package/dist/types.js +37 -0
  53. package/package.json +43 -0
  54. package/src/cli-agent.ts +685 -0
  55. package/src/cli.ts +2695 -0
  56. package/src/core/http.ts +1008 -0
  57. package/src/core/pagination.ts +195 -0
  58. package/src/dates.ts +126 -0
  59. package/src/errors.ts +117 -0
  60. package/src/index.ts +153 -0
  61. package/src/ops.ts +174 -0
  62. package/src/resources/account.ts +43 -0
  63. package/src/resources/api-keys.ts +105 -0
  64. package/src/resources/generate.ts +69 -0
  65. package/src/resources/generations.ts +100 -0
  66. package/src/resources/projects.ts +391 -0
  67. package/src/resources/spec-revisions.ts +150 -0
  68. package/src/schemas.ts +90 -0
  69. package/src/types.ts +825 -0
package/src/ops.ts ADDED
@@ -0,0 +1,174 @@
1
+ // typeship — operation manifest for the CLI and MCP server.
2
+ // Generated by typeship — https://typeship.dev — do not edit by hand.
3
+
4
+ export interface ParamSpec {
5
+ /** wire name (JSON key, query name, or path placeholder) */
6
+ name: string;
7
+ /** CLI flag, without the leading dashes */
8
+ flag: string;
9
+ /** property name the SDK params object uses */
10
+ ts: string;
11
+ kind: "path" | "query" | "header" | "body";
12
+ /** "file": a binary multipart field; the CLI takes a path and uploads it.
13
+ * "array"/"object": the schema says so (a lone scalar flag value becomes a
14
+ * one-item array; an object must be JSON). "json": a union or untyped
15
+ * value — JSON if it parses, else the raw text. */
16
+ type: "string" | "number" | "boolean" | "array" | "object" | "json" | "file";
17
+ required: boolean;
18
+ enum?: string[];
19
+ /** Element type of an "array" param: what each repeated/comma value coerces to. */
20
+ items?: { type: "string" | "number" | "boolean" | "object" | "json"; enum?: string[] };
21
+ /** A date-shaped string: the CLI and MCP server resolve relative forms (-P7D, today). */
22
+ format?: "date" | "date-time";
23
+ description?: string;
24
+ /** Settable once on the client (globals option); optional per call. */
25
+ global?: boolean;
26
+ }
27
+
28
+ export interface OpSpec {
29
+ resource: string;
30
+ method: string;
31
+ command: [string, string];
32
+ /** Full kebab method name, still routable, when command[1] was shortened. */
33
+ commandAlias?: string;
34
+ tool: string;
35
+ httpMethod: string;
36
+ path: string;
37
+ summary?: string;
38
+ /** Full operation description, for the docs command (help stays terse). */
39
+ description?: string;
40
+ /** What agents see in tools/list: summary, the description's first
41
+ * sentence, method + path. Computed once so package and hosted agree. */
42
+ toolDescription: string;
43
+ paginated: boolean;
44
+ hasBody: boolean;
45
+ bodyStyle: "none" | "fields" | "data";
46
+ /** wire encoding of the body, for generic executors */
47
+ bodyKind: "json" | "form" | "multipart" | "binary" | "text" | null;
48
+ /** Success body is a text/event-stream: the CLI streams events as NDJSON;
49
+ * not an MCP tool. */
50
+ sse: boolean;
51
+ hasParams: boolean;
52
+ /** GraphQL ops whose field returns an object accept a selection-set
53
+ * override (a leaf-returning field has nothing to select). */
54
+ select: boolean;
55
+ /** present for GraphQL ops: enough to build the request document */
56
+ graphql?: { field: string; kind: "query" | "mutation"; docPrefix: string; defaultSelection: string };
57
+ /** Retried by default (idempotent verb), like the SDK method. */
58
+ idempotent: boolean;
59
+ /** Header the SDK fills with one UUID per call (Idempotency-Key). */
60
+ idempotencyHeader?: string;
61
+ /** Operation-level retry policy (x-typeship-retries). */
62
+ retry?: { maxRetries?: number; statuses?: number[]; initialDelayMs?: number; maxDelayMs?: number; retryNonIdempotent?: boolean };
63
+ /** Page-walking config for generic executors, same shape as the SDK's PageConfig. */
64
+ pagination?: {
65
+ style: "cursor" | "cursorFromLastId" | "page" | "offset";
66
+ itemsField: string;
67
+ cursorParam?: string;
68
+ nextCursorField?: string;
69
+ hasMoreField?: string;
70
+ idField?: string;
71
+ pageParam?: string;
72
+ offsetParam?: string;
73
+ limitParam?: string;
74
+ };
75
+ /** The spec's security requirement: "required" fails fast without a
76
+ * credential; "none" works anonymously; "optional" is either. */
77
+ auth: "required" | "optional" | "none";
78
+ /** Whether calling this operation only reads, writes, or destroys state. */
79
+ safety: "read" | "write" | "destructive";
80
+ params: ParamSpec[];
81
+ inputSchema: Record<string, unknown>;
82
+ /** Deterministic arguments derived from inputSchema for runnable examples. */
83
+ exampleArguments: Record<string, unknown>;
84
+ /** What the tool returns (JSON Schema 2020-12), when the spec documents
85
+ * a success body; paginated tools describe { items, hasMore, nextPage }. */
86
+ outputSchema?: Record<string, unknown>;
87
+ }
88
+
89
+ export const OPS: OpSpec[] = [
90
+ {"resource":"generate","method":"run","command":["generate","run"],"tool":"generate_run","httpMethod":"POST","path":"/generate","summary":"Generate a package from a spec","description":"Stateless generation: nothing is stored. Returns the full generated\npackage as files. Works without an API key: anonymous calls generate\nthe first 25 operations, rate limited per IP address, and the\nresponse's `limits` object says what was held back and where to lift\nit; anonymous calls from a spec URL also carry `claim.url`, a link\nthat turns the run into a project once a person signs in. With a key, the free plan generates the first 25 operations and\npaid plans generate the whole spec. A present but invalid key is a\n401, not a downgrade to anonymous.","toolDescription":"Generate a package from a spec. Stateless generation: nothing is stored. POST /generate Credential optional.","paginated":false,"hasBody":true,"bodyStyle":"fields","bodyKind":"json","sse":false,"hasParams":false,"select":false,"idempotent":false,"auth":"optional","safety":"write","params":[{"name":"spec","ts":"spec","kind":"body","type":"json","required":true,"description":"The specification for stateless generation, provided as exactly one URL or inline document.","flag":"spec"},{"name":"outputs","ts":"outputs","kind":"body","type":"array","required":true,"items":{"type":"string","enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"]},"description":"The one output package to generate. Linked projects can select any combination of outputs and keep each package current.","flag":"outputs"},{"name":"package_name","ts":"package_name","kind":"body","type":"string","required":false,"description":"Registry name for the selected delivery package: an npm package, Python distribution, or Go module path. Defaults to a name derived from the API title.","flag":"package-name"},{"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) and how the generated tooling behaves (cli, mcp, package, docs_url). Plain configuration. typeship never requires vendor extensions inside the spec itself. The same shape is accepted on a project and on POST /generate.","flag":"config"}],"inputSchema":{"type":"object","properties":{"spec":{"description":"The specification for stateless generation, provided as exactly one URL or inline document.","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 stateless 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"}]},"outputs":{"description":"The one output package to generate. Linked projects can select any combination of outputs and keep each package current.","minItems":1,"maxItems":1,"uniqueItems":true,"items":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output. CLI and MCP include the private TypeScript request runtime they need; that dependency is not a selected or billable TypeScript SDK.","type":"string"},"type":"array"},"package_name":{"description":"Registry name for the selected delivery package: an npm package, Python distribution, or Go module path. Defaults to a name derived from the API title.","type":"string"},"config":{"description":"Everything typeship needs beyond the spec, in one object: generation customization (globals, retries, pagination) and how the generated tooling behaves (cli, mcp, package, docs_url). Plain configuration. typeship never requires vendor extensions inside the spec itself. The same shape is accepted on a project and on POST /generate.","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","cursorFromLastId","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 (\"Braintree\" gives braintree and BraintreeClient). 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"},"cli":{"description":"How the generated CLI behaves. Part of Config.","properties":{"whoami_operation":{"description":"resource.method of a zero-argument GET that the generated CLI's whoami command calls. Overrides auto-detection; a value that matches nothing is reported as a generation warning.","type":["string","null"]},"oauth_client_id":{"description":"OAuth client id baked into the generated CLI for device-flow login. Without it, login prompts for a pasted credential.","type":["string","null"]},"oauth_scopes":{"description":"Scopes requested during device-flow login. Include offline_access if the authorization server gates refresh tokens behind it.","maxItems":20,"items":{"type":"string"},"type":"array"},"oauth_audience":{"description":"Audience sent with the device-authorization request, for authorization servers that require one to issue API-valid access tokens.","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"},"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"]},"auth_url":{"description":"Base URL of the browser-approval endpoint pair used by CLI login. The CLI keeps the verifier and receives the credential directly; no key is pasted through a conversation.","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 the generated MCP server and the hosted endpoint behave. Part of Config.","properties":{"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"}},"additionalProperties":false,"type":"object"},"package":{"description":"Published-package metadata the API spec does not own. Repository is derived from each destination; release versions belong to packages.","properties":{"version":{"description":"Lockstep version fallback. Prefer packages.<output>.version so every SDK, CLI, and MCP package can advance independently.","deprecated":true,"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"]},"bin_name":{"description":"CLI executable name when it differs from the npm package name.","type":["string","null"]},"go_package_name":{"description":"Go identifier when the destination repository name is unsuitable.","type":["string","null"]},"mcp_name":{"description":"Official MCP registry name written into package.json.","type":["string","null"]}},"additionalProperties":false,"type":"object"},"docs_url":{"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"]}},"additionalProperties":false,"type":"object"}},"required":["spec","outputs"]},"exampleArguments":{"spec":{"url":"https://example.com"},"outputs":["typescript-sdk"]},"outputSchema":{"properties":{"files":{"items":{"properties":{"path":{"description":"Repo-relative path inside the generated package.","type":"string"},"content":{"type":"string"}},"type":"object"},"type":"array"},"warnings":{"items":{"type":"string"},"type":"array"},"meta":{"properties":{"title":{"type":"string"},"version":{"type":"string"},"spec_format":{"enum":["openapi","graphql"],"type":"string"},"oas_version":{"description":"Detected spec version, \"2.0\", \"3.0\", or \"3.1\".","type":"string"},"converted":{"description":"True when the input was Swagger 2.0 and was converted.","type":"boolean"},"package_name":{"type":"string"},"client_name":{"type":"string"},"outputs":{"description":"Customer-selected outputs present in this delivery package.","uniqueItems":true,"items":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output. CLI and MCP include the private TypeScript request runtime they need; that dependency is not a selected or billable TypeScript SDK.","type":"string"},"type":"array"},"resource_count":{"type":"integer"},"operation_count":{"type":"integer"},"schema_count":{"type":"integer"},"paginated_operation_count":{"type":"integer"},"omitted_operation_count":{"description":"Operations beyond the plan's endpoint allowance, not generated.","type":"integer"},"pr_url":{"description":"Pull request opened by this regeneration, when one was.","type":["string","null"]},"pr_number":{"type":["integer","null"]},"pr_status":{"enum":["opened","no_changes","blocked"],"description":"Whether a destination pull request opened, was unnecessary because the generated tree already matched, or could not be opened.","type":"string"},"pr_error":{"description":"Why the configured destination pull request was not opened. Generation itself still succeeded; fix this action and regenerate.","type":"string"},"changelog":{"description":"Markdown changelog entry for this regeneration, from the API surface diff. Absent on a first generation or when nothing changed.","type":"string"},"breaking_count":{"description":"Breaking changes in the diff; removed methods and fields, changed types, inputs that became required.","type":"integer"},"baseline":{"enum":["destination","last-generation","none"],"description":"What the diff was measured against; \"destination\" means the .typeship/surface.json merged in the destination repository.","type":"string"},"package_compatibility":{"enum":["success","failure"],"description":"The package compatibility verdict on the regeneration pull request; failure means breaking changes without a major version bump.","type":"string"},"package_compatibility_note":{"description":"The verdict in one line, as the commit status describes it.","type":"string"},"previous_version":{"description":"The package version the destination had before this regeneration.","type":"string"},"file_count":{"type":"integer"},"total_lines":{"type":"integer"}},"type":"object"},"limits":{"description":"Present when the generation was capped: by the free plan, or because the call was anonymous. Absent on uncapped generations.","properties":{"max_operations":{"description":"How many operations this generation was allowed to include.","type":"integer"},"omitted_operations":{"description":"How many operations in the spec were left out.","type":"integer"},"reason":{"enum":["anonymous","free_plan"],"type":"string"},"signup_url":{"description":"Anonymous calls only. Where to create an account.","type":"string"},"upgrade_url":{"description":"Where the cap is lifted.","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, outputs, 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"}]}},"type":"object"}},
91
+ {"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","safety":"read","params":[{"name":"limit","ts":"limit","kind":"query","type":"number","required":false,"description":"Maximum number of resources to return. Default: 20.","flag":"limit"},{"name":"cursor","ts":"cursor","kind":"query","type":"string","required":false,"description":"Opaque cursor from the preceding page's next_cursor.","flag":"cursor"}],"inputSchema":{"type":"object","properties":{"limit":{"default":20,"minimum":1,"maximum":100,"type":"integer","description":"Maximum number of resources to return. Default: 20."},"cursor":{"type":"string","description":"Opaque cursor from the preceding page's next_cursor."}}},"exampleArguments":{},"outputSchema":{"type":"object","properties":{"items":{"type":"array","items":{"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"},"source":{"description":"The single source of truth for where a project's specification lives.","anyOf":[{"properties":{"kind":{"const":"url","type":"string"},"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"},{"properties":{"kind":{"const":"github","type":"string"},"repository":{"description":"GitHub repository in owner/name form.","examples":["acme/payments-api"],"maxLength":202,"pattern":"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$","type":"string"},"path":{"description":"Repository-relative path to the specification.","minLength":1,"maxLength":4096,"pattern":"^(?!/)(?!.*\\.\\.).+$","type":"string"}},"type":"object"}]},"packages":{"description":"Complete package configuration.","properties":{"typescript-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"python-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"go-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"cli":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"mcp":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"}},"type":"object"},"auto_regen":{"description":"Regenerate when the spec changes: on every push to the default branch for a repository source, ever…","type":"boolean"},"spec_patches":{"items":{"description":"A fix applied to the 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"},"config":{"anyOf":[{"description":"Everything typeship needs beyond the spec, in one object: generation customization (globals, retrie…","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"},"graphql":{"description":"What a GraphQL schema cannot say about itself.","type":"object"},"cli":{"description":"How the generated CLI behaves.","type":"object"},"mcp":{"description":"How the generated MCP server and the hosted endpoint behave.","type":"object"},"package":{"description":"Published-package metadata the API spec does not own.","type":"object"},"docs_url":{"description":"The API's documentation site.","type":["string","null"]}},"type":"object"},{"type":"null"}]},"mcp_enabled":{"description":"Whether the hosted MCP endpoint is on.","type":"boolean"},"mcp_url":{"description":"Path of the hosted MCP endpoint while it is on; read-only.","type":["string","null"]},"relay_enabled":{"description":"Whether the webhook relay is on, letting the generated CLI's webhooks listen command mint relay ses…","type":"boolean"},"outputs":{"description":"First-class generated outputs.","minItems":1,"uniqueItems":true,"items":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output.","type":"string"},"type":"array"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","description":"When the project configuration last changed.","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}}}},
92
+ {"resource":"projects","method":"create","command":["projects","create"],"tool":"projects_create","httpMethod":"POST","path":"/projects","summary":"Create a project","description":"Stores a URL- or GitHub-sourced project. Free includes one stored project, every selected output, and the first 25 operations, while keeping manual and automatic regeneration, history, destination pull requests, and preview checks. Stateless POST /generate does not consume this slot. Pro adds projects and the whole spec.","toolDescription":"Create a project. Stores a URL- or GitHub-sourced project. POST /projects","paginated":false,"hasBody":true,"bodyStyle":"fields","bodyKind":"json","sse":false,"hasParams":true,"select":false,"idempotent":false,"idempotencyHeader":"Idempotency-Key","auth":"required","safety":"write","params":[{"name":"name","ts":"name","kind":"body","type":"string","required":true,"flag":"name"},{"name":"source","ts":"source","kind":"body","type":"json","required":true,"flag":"source"},{"name":"outputs","ts":"outputs","kind":"body","type":"array","required":true,"items":{"type":"string","enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"]},"description":"First-class outputs Typeship will keep current for this project.","flag":"outputs"},{"name":"packages","ts":"packages","kind":"body","type":"object","required":false,"description":"Independent delivery packages keyed by output. Every selected output owns its registry identity, version, destination pull request, and release lifecycle. Selected outputs must resolve to distinct repository-and-directory trees; the TypeScript SDK, CLI, and MCP packages must also have distinct npm names.","flag":"packages"},{"name":"auto_regen","ts":"auto_regen","kind":"body","type":"boolean","required":false,"description":"Whether Typeship should regenerate automatically when the source changes. Default: false.","flag":"auto-regen"},{"name":"spec_patches","ts":"spec_patches","kind":"body","type":"array","required":false,"items":{"type":"object"},"description":"Initial patches. Omit or pass an empty array for none.","flag":"spec-patches"},{"name":"mcp_enabled","ts":"mcp_enabled","kind":"body","type":"boolean","required":false,"description":"Serve this project as a hosted MCP endpoint. Requires the MCP output and Enterprise. Default: false.","flag":"mcp-enabled"},{"name":"relay_enabled","ts":"relay_enabled","kind":"body","type":"boolean","required":false,"description":"Enable webhook relay sessions. Requires the CLI output and Pro. Default: false.","flag":"relay-enabled"},{"name":"config","ts":"config","kind":"body","type":"json","required":false,"flag":"config"},{"name":"Idempotency-Key","ts":"idempotencyKey","kind":"header","type":"string","required":false,"description":"Uniquely identifies this creation attempt. Retrying the same request with the same key returns the original response instead of creating another project. Reusing a key with different parameters returns 409.","flag":"idempotency-key"}],"inputSchema":{"type":"object","properties":{"Idempotency-Key":{"minLength":1,"maxLength":255,"pattern":"^[!-~]+$","type":"string","description":"Uniquely identifies this creation attempt. Retrying the same request with the same key returns the original response instead of creating another project. Reusing a key with different parameters returns 409."},"name":{"minLength":1,"maxLength":80,"type":"string"},"source":{"anyOf":[{"properties":{"kind":{"const":"url","type":"string"},"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":[{"additionalProperties":{"maxLength":4096,"type":"string"},"type":"object"},{"type":"null"}]}},"required":["kind","url"],"additionalProperties":false,"type":"object"},{"properties":{"kind":{"const":"github","type":"string"},"repository":{"description":"GitHub repository in owner/name form.","examples":["acme/payments-api"],"maxLength":202,"pattern":"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$","type":"string"},"path":{"description":"Repository-relative path to the specification.","minLength":1,"maxLength":4096,"pattern":"^(?!/)(?!.*\\.\\.).+$","type":"string"}},"required":["kind","repository","path"],"additionalProperties":false,"type":"object"}]},"outputs":{"description":"First-class outputs Typeship will keep current for this project.","minItems":1,"uniqueItems":true,"items":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output. CLI and MCP include the private TypeScript request runtime they need; that dependency is not a selected or billable TypeScript SDK.","type":"string"},"type":"array"},"packages":{"description":"Independent delivery packages keyed by output. Every selected output owns its registry identity, version, destination pull request, and release lifecycle. Selected outputs must resolve to distinct repository-and-directory trees; the TypeScript SDK, CLI, and MCP packages must also have distinct npm names.","properties":{"typescript-sdk":{"description":"Registry identity and reviewed pull-request destination for one delivery package.","properties":{"name":{"description":"npm package name, Python distribution name, or Go module path. Null derives a name from the API title.","type":["string","null"]},"version":{"description":"Release version for this output package. Null falls back to the legacy config.package.version, then the specification version.","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","type":["string","null"]},"destination":{"anyOf":[{"description":"Where regeneration pull requests land.","properties":{"repo":{"description":"Defaults to the source repository when the source is a repo.","type":["string","null"]},"directory":{"description":"Directory the generated package is written to.","type":["string","null"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"additionalProperties":false,"type":"object"},"python-sdk":{"description":"Registry identity and reviewed pull-request destination for one delivery package.","properties":{"name":{"description":"npm package name, Python distribution name, or Go module path. Null derives a name from the API title.","type":["string","null"]},"version":{"description":"Release version for this output package. Null falls back to the legacy config.package.version, then the specification version.","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","type":["string","null"]},"destination":{"anyOf":[{"description":"Where regeneration pull requests land.","properties":{"repo":{"description":"Defaults to the source repository when the source is a repo.","type":["string","null"]},"directory":{"description":"Directory the generated package is written to.","type":["string","null"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"additionalProperties":false,"type":"object"},"go-sdk":{"description":"Registry identity and reviewed pull-request destination for one delivery package.","properties":{"name":{"description":"npm package name, Python distribution name, or Go module path. Null derives a name from the API title.","type":["string","null"]},"version":{"description":"Release version for this output package. Null falls back to the legacy config.package.version, then the specification version.","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","type":["string","null"]},"destination":{"anyOf":[{"description":"Where regeneration pull requests land.","properties":{"repo":{"description":"Defaults to the source repository when the source is a repo.","type":["string","null"]},"directory":{"description":"Directory the generated package is written to.","type":["string","null"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"additionalProperties":false,"type":"object"},"cli":{"description":"Registry identity and reviewed pull-request destination for one delivery package.","properties":{"name":{"description":"npm package name, Python distribution name, or Go module path. Null derives a name from the API title.","type":["string","null"]},"version":{"description":"Release version for this output package. Null falls back to the legacy config.package.version, then the specification version.","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","type":["string","null"]},"destination":{"anyOf":[{"description":"Where regeneration pull requests land.","properties":{"repo":{"description":"Defaults to the source repository when the source is a repo.","type":["string","null"]},"directory":{"description":"Directory the generated package is written to.","type":["string","null"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"additionalProperties":false,"type":"object"},"mcp":{"description":"Registry identity and reviewed pull-request destination for one delivery package.","properties":{"name":{"description":"npm package name, Python distribution name, or Go module path. Null derives a name from the API title.","type":["string","null"]},"version":{"description":"Release version for this output package. Null falls back to the legacy config.package.version, then the specification version.","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","type":["string","null"]},"destination":{"anyOf":[{"description":"Where regeneration pull requests land.","properties":{"repo":{"description":"Defaults to the source repository when the source is a repo.","type":["string","null"]},"directory":{"description":"Directory the generated package is written to.","type":["string","null"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"additionalProperties":false,"type":"object"}},"additionalProperties":false,"type":"object"},"auto_regen":{"description":"Whether Typeship should regenerate automatically when the source changes. Default: false.","default":false,"type":"boolean"},"spec_patches":{"description":"Initial patches. Omit or pass an empty array for none.","maxItems":50,"items":{"description":"A fix applied to the spec before generation. Targets 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"},"mcp_enabled":{"description":"Serve this project as a hosted MCP endpoint. Requires the MCP output and Enterprise. Default: false.","default":false,"type":"boolean"},"relay_enabled":{"description":"Enable webhook relay sessions. Requires the CLI output and Pro. Default: false.","default":false,"type":"boolean"},"config":{"anyOf":[{"description":"Everything typeship needs beyond the spec, in one object: generation customization (globals, retries, pagination) and how the generated tooling behaves (cli, mcp, package, docs_url). Plain configuration. typeship never requires vendor extensions inside the spec itself. The same shape is accepted on a project and on POST /generate.","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"},"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":{"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 (\"Braintree\" gives braintree and BraintreeClient). 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"},"cli":{"description":"How the generated CLI behaves. Part of Config.","properties":{"whoami_operation":{"description":"resource.method of a zero-argument GET that the generated CLI's whoami command calls. Overrides auto-detection; a value that matches nothing is reported as a generation warning.","type":["string","null"]},"oauth_client_id":{"description":"OAuth client id baked into the generated CLI for device-flow login. Without it, login prompts for a pasted credential.","type":["string","null"]},"oauth_scopes":{"description":"Scopes requested during device-flow login. Include offline_access if the authorization server gates refresh tokens behind it.","maxItems":20,"items":{"type":"string"},"type":"array"},"oauth_audience":{"description":"Audience sent with the device-authorization request, for authorization servers that require one to issue API-valid access tokens.","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"},"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"]},"auth_url":{"description":"Base URL of the browser-approval endpoint pair used by CLI login. The CLI keeps the verifier and receives the credential directly; no key is pasted through a conversation.","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 the generated MCP server and the hosted endpoint behave. Part of Config.","properties":{"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"}},"additionalProperties":false,"type":"object"},"package":{"description":"Published-package metadata the API spec does not own. Repository is derived from each destination; release versions belong to packages.","properties":{"version":{"description":"Lockstep version fallback. Prefer packages.<output>.version so every SDK, CLI, and MCP package can advance independently.","deprecated":true,"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"]},"bin_name":{"description":"CLI executable name when it differs from the npm package name.","type":["string","null"]},"go_package_name":{"description":"Go identifier when the destination repository name is unsuitable.","type":["string","null"]},"mcp_name":{"description":"Official MCP registry name written into package.json.","type":["string","null"]}},"additionalProperties":false,"type":"object"},"docs_url":{"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"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"required":["name","source","outputs"]},"exampleArguments":{"name":"example","source":{"kind":"url","url":"https://example.com"},"outputs":["typescript-sdk"]},"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"},"source":{"description":"The single source of truth for where a project's specification lives.","anyOf":[{"properties":{"kind":{"const":"url","type":"string"},"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"},{"properties":{"kind":{"const":"github","type":"string"},"repository":{"description":"GitHub repository in owner/name form.","examples":["acme/payments-api"],"maxLength":202,"pattern":"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$","type":"string"},"path":{"description":"Repository-relative path to the specification.","minLength":1,"maxLength":4096,"pattern":"^(?!/)(?!.*\\.\\.).+$","type":"string"}},"type":"object"}]},"packages":{"description":"Complete package configuration.","properties":{"typescript-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"python-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"go-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"cli":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"mcp":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"}},"type":"object"},"auto_regen":{"description":"Regenerate when the spec changes: on every push to the default branch for a repository source, ever…","type":"boolean"},"spec_patches":{"items":{"description":"A fix applied to the 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"},"config":{"anyOf":[{"description":"Everything typeship needs beyond the spec, in one object: generation customization (globals, retrie…","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"},"graphql":{"description":"What a GraphQL schema cannot say about itself.","type":"object"},"cli":{"description":"How the generated CLI behaves.","type":"object"},"mcp":{"description":"How the generated MCP server and the hosted endpoint behave.","type":"object"},"package":{"description":"Published-package metadata the API spec does not own.","type":"object"},"docs_url":{"description":"The API's documentation site.","type":["string","null"]}},"type":"object"},{"type":"null"}]},"mcp_enabled":{"description":"Whether the hosted MCP endpoint is on.","type":"boolean"},"mcp_url":{"description":"Path of the hosted MCP endpoint while it is on; read-only.","type":["string","null"]},"relay_enabled":{"description":"Whether the webhook relay is on, letting the generated CLI's webhooks listen command mint relay ses…","type":"boolean"},"outputs":{"description":"First-class generated outputs.","minItems":1,"uniqueItems":true,"items":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output.","type":"string"},"type":"array"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","description":"When the project configuration last changed.","type":"string"}},"type":"object"}},
93
+ {"resource":"projects","method":"retrieve","command":["projects","retrieve"],"tool":"projects_retrieve","httpMethod":"GET","path":"/projects/{project_id}","summary":"Retrieve a project","toolDescription":"Retrieve a project. GET /projects/{project_id}","paginated":false,"hasBody":false,"bodyStyle":"none","bodyKind":null,"sse":false,"hasParams":false,"select":false,"idempotent":true,"auth":"required","safety":"read","params":[{"name":"project_id","ts":"projectId","kind":"path","type":"string","required":true,"description":"IDs come from projects_list.","flag":"project-id"}],"inputSchema":{"type":"object","properties":{"project_id":{"description":"Unique identifier for a project. IDs come from projects_list.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","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"},"source":{"description":"The single source of truth for where a project's specification lives.","anyOf":[{"properties":{"kind":{"const":"url","type":"string"},"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"},{"properties":{"kind":{"const":"github","type":"string"},"repository":{"description":"GitHub repository in owner/name form.","examples":["acme/payments-api"],"maxLength":202,"pattern":"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$","type":"string"},"path":{"description":"Repository-relative path to the specification.","minLength":1,"maxLength":4096,"pattern":"^(?!/)(?!.*\\.\\.).+$","type":"string"}},"type":"object"}]},"packages":{"description":"Complete package configuration.","properties":{"typescript-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"python-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"go-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"cli":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"mcp":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"}},"type":"object"},"auto_regen":{"description":"Regenerate when the spec changes: on every push to the default branch for a repository source, ever…","type":"boolean"},"spec_patches":{"items":{"description":"A fix applied to the 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"},"config":{"anyOf":[{"description":"Everything typeship needs beyond the spec, in one object: generation customization (globals, retrie…","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"},"graphql":{"description":"What a GraphQL schema cannot say about itself.","type":"object"},"cli":{"description":"How the generated CLI behaves.","type":"object"},"mcp":{"description":"How the generated MCP server and the hosted endpoint behave.","type":"object"},"package":{"description":"Published-package metadata the API spec does not own.","type":"object"},"docs_url":{"description":"The API's documentation site.","type":["string","null"]}},"type":"object"},{"type":"null"}]},"mcp_enabled":{"description":"Whether the hosted MCP endpoint is on.","type":"boolean"},"mcp_url":{"description":"Path of the hosted MCP endpoint while it is on; read-only.","type":["string","null"]},"relay_enabled":{"description":"Whether the webhook relay is on, letting the generated CLI's webhooks listen command mint relay ses…","type":"boolean"},"outputs":{"description":"First-class generated outputs.","minItems":1,"uniqueItems":true,"items":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output.","type":"string"},"type":"array"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","description":"When the project configuration last changed.","type":"string"}},"type":"object"}},
94
+ {"resource":"projects","method":"delete","command":["projects","delete"],"tool":"projects_delete","httpMethod":"DELETE","path":"/projects/{project_id}","summary":"Delete a project","toolDescription":"Delete a project. DELETE /projects/{project_id}","paginated":false,"hasBody":false,"bodyStyle":"none","bodyKind":null,"sse":false,"hasParams":false,"select":false,"idempotent":true,"auth":"required","safety":"destructive","params":[{"name":"project_id","ts":"projectId","kind":"path","type":"string","required":true,"description":"IDs come from projects_list.","flag":"project-id"}],"inputSchema":{"type":"object","properties":{"project_id":{"description":"Unique identifier for a project. IDs come from projects_list.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","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"},"deleted":{"const":true,"type":"boolean"}},"type":"object"}},
95
+ {"resource":"projects","method":"update","command":["projects","update"],"tool":"projects_update","httpMethod":"PATCH","path":"/projects/{project_id}","summary":"Update a project","toolDescription":"Update a project. PATCH /projects/{project_id}","paginated":false,"hasBody":true,"bodyStyle":"fields","bodyKind":"json","sse":false,"hasParams":false,"select":false,"idempotent":false,"auth":"required","safety":"write","params":[{"name":"project_id","ts":"projectId","kind":"path","type":"string","required":true,"description":"IDs come from projects_list.","flag":"project-id"},{"name":"name","ts":"name","kind":"body","type":"string","required":false,"flag":"name"},{"name":"source","ts":"source","kind":"body","type":"json","required":false,"flag":"source"},{"name":"outputs","ts":"outputs","kind":"body","type":"array","required":false,"items":{"type":"string","enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"]},"description":"Replaces the selected outputs; delivered files are not deleted.","flag":"outputs"},{"name":"packages","ts":"packages","kind":"body","type":"object","required":false,"description":"Independent delivery packages keyed by output. Every selected output owns its registry identity, version, destination pull request, and release lifecycle. Selected outputs must resolve to distinct repository-and-directory trees; the TypeScript SDK, CLI, and MCP packages must also have distinct npm names.","flag":"packages"},{"name":"auto_regen","ts":"auto_regen","kind":"body","type":"boolean","required":false,"flag":"auto-regen"},{"name":"spec_patches","ts":"spec_patches","kind":"body","type":"array","required":false,"items":{"type":"object"},"description":"Replaces the full patch list. Pass an empty array to clear it.","flag":"spec-patches"},{"name":"mcp_enabled","ts":"mcp_enabled","kind":"body","type":"boolean","required":false,"description":"Serve this project as a hosted MCP endpoint. Requires the MCP output and Enterprise.","flag":"mcp-enabled"},{"name":"relay_enabled","ts":"relay_enabled","kind":"body","type":"boolean","required":false,"description":"Enable webhook relay sessions. Requires the CLI output and Pro.","flag":"relay-enabled"},{"name":"config","ts":"config","kind":"body","type":"json","required":false,"description":"Replaces the entire configuration; pass null to clear it.","flag":"config"}],"inputSchema":{"type":"object","properties":{"project_id":{"description":"Unique identifier for a project. IDs come from projects_list.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","type":"string"},"name":{"minLength":1,"maxLength":80,"type":"string"},"source":{"anyOf":[{"properties":{"kind":{"const":"url","type":"string"},"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":[{"additionalProperties":{"maxLength":4096,"type":"string"},"type":"object"},{"type":"null"}]}},"required":["kind","url"],"additionalProperties":false,"type":"object"},{"properties":{"kind":{"const":"github","type":"string"},"repository":{"description":"GitHub repository in owner/name form.","examples":["acme/payments-api"],"maxLength":202,"pattern":"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$","type":"string"},"path":{"description":"Repository-relative path to the specification.","minLength":1,"maxLength":4096,"pattern":"^(?!/)(?!.*\\.\\.).+$","type":"string"}},"required":["kind","repository","path"],"additionalProperties":false,"type":"object"}]},"outputs":{"description":"Replaces the selected outputs; delivered files are not deleted.","minItems":1,"uniqueItems":true,"items":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output. CLI and MCP include the private TypeScript request runtime they need; that dependency is not a selected or billable TypeScript SDK.","type":"string"},"type":"array"},"packages":{"description":"Independent delivery packages keyed by output. Every selected output owns its registry identity, version, destination pull request, and release lifecycle. Selected outputs must resolve to distinct repository-and-directory trees; the TypeScript SDK, CLI, and MCP packages must also have distinct npm names.","properties":{"typescript-sdk":{"description":"Registry identity and reviewed pull-request destination for one delivery package.","properties":{"name":{"description":"npm package name, Python distribution name, or Go module path. Null derives a name from the API title.","type":["string","null"]},"version":{"description":"Release version for this output package. Null falls back to the legacy config.package.version, then the specification version.","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","type":["string","null"]},"destination":{"anyOf":[{"description":"Where regeneration pull requests land.","properties":{"repo":{"description":"Defaults to the source repository when the source is a repo.","type":["string","null"]},"directory":{"description":"Directory the generated package is written to.","type":["string","null"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"additionalProperties":false,"type":"object"},"python-sdk":{"description":"Registry identity and reviewed pull-request destination for one delivery package.","properties":{"name":{"description":"npm package name, Python distribution name, or Go module path. Null derives a name from the API title.","type":["string","null"]},"version":{"description":"Release version for this output package. Null falls back to the legacy config.package.version, then the specification version.","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","type":["string","null"]},"destination":{"anyOf":[{"description":"Where regeneration pull requests land.","properties":{"repo":{"description":"Defaults to the source repository when the source is a repo.","type":["string","null"]},"directory":{"description":"Directory the generated package is written to.","type":["string","null"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"additionalProperties":false,"type":"object"},"go-sdk":{"description":"Registry identity and reviewed pull-request destination for one delivery package.","properties":{"name":{"description":"npm package name, Python distribution name, or Go module path. Null derives a name from the API title.","type":["string","null"]},"version":{"description":"Release version for this output package. Null falls back to the legacy config.package.version, then the specification version.","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","type":["string","null"]},"destination":{"anyOf":[{"description":"Where regeneration pull requests land.","properties":{"repo":{"description":"Defaults to the source repository when the source is a repo.","type":["string","null"]},"directory":{"description":"Directory the generated package is written to.","type":["string","null"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"additionalProperties":false,"type":"object"},"cli":{"description":"Registry identity and reviewed pull-request destination for one delivery package.","properties":{"name":{"description":"npm package name, Python distribution name, or Go module path. Null derives a name from the API title.","type":["string","null"]},"version":{"description":"Release version for this output package. Null falls back to the legacy config.package.version, then the specification version.","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","type":["string","null"]},"destination":{"anyOf":[{"description":"Where regeneration pull requests land.","properties":{"repo":{"description":"Defaults to the source repository when the source is a repo.","type":["string","null"]},"directory":{"description":"Directory the generated package is written to.","type":["string","null"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"additionalProperties":false,"type":"object"},"mcp":{"description":"Registry identity and reviewed pull-request destination for one delivery package.","properties":{"name":{"description":"npm package name, Python distribution name, or Go module path. Null derives a name from the API title.","type":["string","null"]},"version":{"description":"Release version for this output package. Null falls back to the legacy config.package.version, then the specification version.","pattern":"^[0-9]+\\.[0-9]+\\.[0-9]+(?:-[0-9A-Za-z.-]+)?(?:\\+[0-9A-Za-z.-]+)?$","type":["string","null"]},"destination":{"anyOf":[{"description":"Where regeneration pull requests land.","properties":{"repo":{"description":"Defaults to the source repository when the source is a repo.","type":["string","null"]},"directory":{"description":"Directory the generated package is written to.","type":["string","null"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"additionalProperties":false,"type":"object"}},"additionalProperties":false,"type":"object"},"auto_regen":{"type":"boolean"},"spec_patches":{"description":"Replaces the full patch list. Pass an empty array to clear it.","maxItems":50,"items":{"description":"A fix applied to the spec before generation. Targets 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"},"mcp_enabled":{"description":"Serve this project as a hosted MCP endpoint. Requires the MCP output and Enterprise.","type":"boolean"},"relay_enabled":{"description":"Enable webhook relay sessions. Requires the CLI output and Pro.","type":"boolean"},"config":{"description":"Replaces the entire configuration; pass null to clear it.","anyOf":[{"description":"Everything typeship needs beyond the spec, in one object: generation customization (globals, retries, pagination) and how the generated tooling behaves (cli, mcp, package, docs_url). Plain configuration. typeship never requires vendor extensions inside the spec itself. The same shape is accepted on a project and on POST /generate.","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"},"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":{"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 (\"Braintree\" gives braintree and BraintreeClient). 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"},"cli":{"description":"How the generated CLI behaves. Part of Config.","properties":{"whoami_operation":{"description":"resource.method of a zero-argument GET that the generated CLI's whoami command calls. Overrides auto-detection; a value that matches nothing is reported as a generation warning.","type":["string","null"]},"oauth_client_id":{"description":"OAuth client id baked into the generated CLI for device-flow login. Without it, login prompts for a pasted credential.","type":["string","null"]},"oauth_scopes":{"description":"Scopes requested during device-flow login. Include offline_access if the authorization server gates refresh tokens behind it.","maxItems":20,"items":{"type":"string"},"type":"array"},"oauth_audience":{"description":"Audience sent with the device-authorization request, for authorization servers that require one to issue API-valid access tokens.","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"},"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"]},"auth_url":{"description":"Base URL of the browser-approval endpoint pair used by CLI login. The CLI keeps the verifier and receives the credential directly; no key is pasted through a conversation.","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 the generated MCP server and the hosted endpoint behave. Part of Config.","properties":{"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"}},"additionalProperties":false,"type":"object"},"package":{"description":"Published-package metadata the API spec does not own. Repository is derived from each destination; release versions belong to packages.","properties":{"version":{"description":"Lockstep version fallback. Prefer packages.<output>.version so every SDK, CLI, and MCP package can advance independently.","deprecated":true,"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"]},"bin_name":{"description":"CLI executable name when it differs from the npm package name.","type":["string","null"]},"go_package_name":{"description":"Go identifier when the destination repository name is unsuitable.","type":["string","null"]},"mcp_name":{"description":"Official MCP registry name written into package.json.","type":["string","null"]}},"additionalProperties":false,"type":"object"},"docs_url":{"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"]}},"additionalProperties":false,"type":"object"},{"type":"null"}]}},"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"},"source":{"description":"The single source of truth for where a project's specification lives.","anyOf":[{"properties":{"kind":{"const":"url","type":"string"},"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"},{"properties":{"kind":{"const":"github","type":"string"},"repository":{"description":"GitHub repository in owner/name form.","examples":["acme/payments-api"],"maxLength":202,"pattern":"^[A-Za-z0-9_.-]+/[A-Za-z0-9_.-]+$","type":"string"},"path":{"description":"Repository-relative path to the specification.","minLength":1,"maxLength":4096,"pattern":"^(?!/)(?!.*\\.\\.).+$","type":"string"}},"type":"object"}]},"packages":{"description":"Complete package configuration.","properties":{"typescript-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"python-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"go-sdk":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"cli":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"},"mcp":{"properties":{"name":{"type":["string","null"]},"version":{"type":["string","null"]},"destination":{"anyOf":[{"type":"object"},{"type":"null"}]}},"type":"object"}},"type":"object"},"auto_regen":{"description":"Regenerate when the spec changes: on every push to the default branch for a repository source, ever…","type":"boolean"},"spec_patches":{"items":{"description":"A fix applied to the 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"},"config":{"anyOf":[{"description":"Everything typeship needs beyond the spec, in one object: generation customization (globals, retrie…","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"},"graphql":{"description":"What a GraphQL schema cannot say about itself.","type":"object"},"cli":{"description":"How the generated CLI behaves.","type":"object"},"mcp":{"description":"How the generated MCP server and the hosted endpoint behave.","type":"object"},"package":{"description":"Published-package metadata the API spec does not own.","type":"object"},"docs_url":{"description":"The API's documentation site.","type":["string","null"]}},"type":"object"},{"type":"null"}]},"mcp_enabled":{"description":"Whether the hosted MCP endpoint is on.","type":"boolean"},"mcp_url":{"description":"Path of the hosted MCP endpoint while it is on; read-only.","type":["string","null"]},"relay_enabled":{"description":"Whether the webhook relay is on, letting the generated CLI's webhooks listen command mint relay ses…","type":"boolean"},"outputs":{"description":"First-class generated outputs.","minItems":1,"uniqueItems":true,"items":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output.","type":"string"},"type":"array"},"created_at":{"format":"date-time","type":"string"},"updated_at":{"format":"date-time","description":"When the project configuration last changed.","type":"string"}},"type":"object"}},
96
+ {"resource":"projects","method":"retrieveGithubHealth","command":["projects","retrieve-github-health"],"tool":"projects_retrieve_github_health","httpMethod":"GET","path":"/projects/{project_id}/github","summary":"Diagnose a project's GitHub integration","description":"Returns machine-actionable source and destination access, spec readability, optional label setup, required status names, and the latest durable webhook delivery. The console renders this same result.","toolDescription":"Diagnose a project's GitHub integration. Returns machine-actionable source and destination access, spec readability, optional label setup, required status names, and the latest durable webhook delivery. GET /projects/{project_id}/github","paginated":false,"hasBody":false,"bodyStyle":"none","bodyKind":null,"sse":false,"hasParams":false,"select":false,"idempotent":true,"auth":"required","safety":"read","params":[{"name":"project_id","ts":"projectId","kind":"path","type":"string","required":true,"description":"IDs come from projects_list.","flag":"project-id"}],"inputSchema":{"type":"object","properties":{"project_id":{"description":"Unique identifier for a project. IDs come from projects_list.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","type":"string"}},"required":["project_id"]},"exampleArguments":{"project_id":"prj_4f8k2m7x9q1v6b3n"},"outputSchema":{"properties":{"object":{"const":"github_integration_health","type":"string"},"project_id":{"description":"Unique identifier for a project.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","type":"string"},"status":{"enum":["ready","action_required"],"type":"string"},"repositories":{"items":{"properties":{"repository":{"type":"string"},"roles":{"uniqueItems":true,"items":{"enum":["source","destination"],"type":"string"},"type":"array"},"status":{"enum":["ready","action_required"],"type":"string"},"default_branch":{"type":"string"},"can_read":{"type":"boolean"},"can_write":{"type":"boolean"},"breaking_label":{"type":["boolean","null"]},"spec":{"enum":["readable","missing"],"type":"string"},"issues":{"items":{"type":"object"},"type":"array"}},"type":"object"},"type":"array"},"required_statuses":{"properties":{"source":{"items":{"type":"string"},"type":"array"},"destination":{"items":{"type":"string"},"type":"array"}},"type":"object"},"last_delivery":{"anyOf":[{"properties":{"id":{"type":"string"},"event":{"type":"string"},"status":{"enum":["queued","processing","succeeded","failed","superseded"],"type":"string"},"error":{"type":["string","null"]},"created_at":{"format":"date-time","type":"string"}},"type":"object"},{"type":"null"}]}},"type":"object"}},
97
+ {"resource":"projects","method":"listGenerations","command":["projects","list-generations"],"tool":"projects_list_generations","httpMethod":"GET","path":"/projects/{project_id}/generations","summary":"List a project's generations","toolDescription":"List a project's generations. GET /projects/{project_id}/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","safety":"read","params":[{"name":"project_id","ts":"projectId","kind":"path","type":"string","required":true,"description":"IDs come from projects_list.","flag":"project-id"},{"name":"limit","ts":"limit","kind":"query","type":"number","required":false,"description":"Maximum number of resources to return. Default: 20.","flag":"limit"},{"name":"cursor","ts":"cursor","kind":"query","type":"string","required":false,"description":"Opaque cursor from the preceding page's next_cursor.","flag":"cursor"},{"name":"output","ts":"output","kind":"query","type":"string","required":false,"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"Only generations for this output.","flag":"output"}],"inputSchema":{"type":"object","properties":{"project_id":{"description":"Unique identifier for a project. IDs come from projects_list.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","type":"string"},"limit":{"default":20,"minimum":1,"maximum":100,"type":"integer","description":"Maximum number of resources to return. Default: 20."},"cursor":{"type":"string","description":"Opaque cursor from the preceding page's next_cursor."},"output":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output. CLI and MCP include the private TypeScript request runtime they need; that dependency is not a selected or billable TypeScript SDK.","type":"string"}},"required":["project_id"]},"exampleArguments":{"project_id":"prj_4f8k2m7x9q1v6b3n"},"outputSchema":{"type":"object","properties":{"items":{"type":"array","items":{"examples":[{"id":"gen_7h2p5d9c3m8w1k6q","object":"generation","project_id":"prj_4f8k2m7x9q1v6b3n","status":"succeeded","trigger":"manual","output":"typescript-sdk","meta":{"title":"Acme Payments API","version":"1.0.0","oas_version":"3.1","package_name":"@acme/payments","client_name":"AcmeClient","outputs":["typescript-sdk"]},"warnings":[],"error":null,"created_at":"2026-01-01T00:00:00Z"}],"properties":{"id":{"description":"Unique identifier for a generation.","examples":["gen_7h2p5d9c3m8w1k6q"],"pattern":"^gen_[a-z0-9]{16}$","type":"string"},"object":{"const":"generation","type":"string"},"files_omitted":{"description":"Present and true when the generated output was too large to inline; files_index lists paths, fetched one at a time via GET /generations/{generation_id}/file.","type":"boolean"},"files_index":{"items":{"properties":{"path":{"type":"string"},"bytes":{"type":"integer"}},"type":"object"},"type":"array"},"project_id":{"description":"Unique identifier for a project.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","type":"string"},"status":{"enum":["succeeded","failed"],"type":"string"},"trigger":{"enum":["manual","webhook","poll","preview"],"type":"string"},"output":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output. CLI and MCP include the private TypeScript request runtime they need; that dependency is not a selected or billable TypeScript SDK.","type":"string"},"meta":{"description":"Null only for a failed or legacy generation that produced no metadata.","anyOf":[{"properties":{"title":{"type":"string"},"version":{"type":"string"},"spec_format":{"enum":["openapi","graphql"],"type":"string"},"oas_version":{"description":"Detected spec version, \"2.0\", \"3.0\", or \"3.1\".","type":"string"},"converted":{"description":"True when the input was Swagger 2.0 and was converted.","type":"boolean"},"package_name":{"type":"string"},"client_name":{"type":"string"},"outputs":{"description":"Customer-selected outputs present in this delivery package.","uniqueItems":true,"type":"array"},"resource_count":{"type":"integer"},"operation_count":{"type":"integer"},"schema_count":{"type":"integer"},"paginated_operation_count":{"type":"integer"},"omitted_operation_count":{"description":"Operations beyond the plan's endpoint allowance, not generated.","type":"integer"},"pr_url":{"description":"Pull request opened by this regeneration, when one was.","type":["string","null"]},"pr_number":{"type":["integer","null"]},"pr_status":{"enum":["opened","no_changes","blocked"],"description":"Whether a destination pull request opened, was unnecessary because the generated tree already matched, or could not be opened.","type":"string"},"pr_error":{"description":"Why the configured destination pull request was not opened. Generation itself still succeeded; fix this action and regenerate.","type":"string"},"changelog":{"description":"Markdown changelog entry for this regeneration, from the API surface diff. Absent on a first generation or when nothing changed.","type":"string"},"breaking_count":{"description":"Breaking changes in the diff; removed methods and fields, changed types, inputs that became required.","type":"integer"},"baseline":{"enum":["destination","last-generation","none"],"description":"What the diff was measured against; \"destination\" means the .typeship/surface.json merged in the destination repository.","type":"string"},"package_compatibility":{"enum":["success","failure"],"description":"The package compatibility verdict on the regeneration pull request; failure means breaking changes without a major version bump.","type":"string"},"package_compatibility_note":{"description":"The verdict in one line, as the commit status describes it.","type":"string"},"previous_version":{"description":"The package version the destination had before this regeneration.","type":"string"},"file_count":{"type":"integer"},"total_lines":{"type":"integer"}},"type":"object"},{"type":"null"}]},"warnings":{"items":{"type":"string"},"type":"array"},"files":{"description":"Present on retrieve and create; omitted in lists.","items":{"properties":{"path":{"description":"Repo-relative path inside the generated package.","type":"string"},"content":{"type":"string"}},"type":"object"},"type":"array"},"error":{"type":["string","null"]},"created_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}}}},
98
+ {"resource":"projects","method":"generate","command":["projects","generate"],"tool":"projects_generate","httpMethod":"POST","path":"/projects/{project_id}/generations","summary":"Generate outputs and open pull requests","description":"Resolves the project's URL or repository source, generates every\nconfigured delivery package, stores each result in the project's history,\nand attempts to open a pull request in every configured destination.\nWhen the complete generated tree already matches a destination, no\ncommit, branch, or pull request is created and that generation reports\n`pr_status: no_changes`. This is the same pipeline automatic\nregeneration runs after a source change.","toolDescription":"Generate outputs and open pull requests. Resolves the project's URL or repository source, generates every configured delivery package, stores each result in the project's history, and attempts to open a pull request in every configured destination. POST /projects/{project_id}/generations","paginated":false,"hasBody":false,"bodyStyle":"none","bodyKind":null,"sse":false,"hasParams":false,"select":false,"idempotent":false,"auth":"required","safety":"write","params":[{"name":"project_id","ts":"projectId","kind":"path","type":"string","required":true,"description":"IDs come from projects_list.","flag":"project-id"}],"inputSchema":{"type":"object","properties":{"project_id":{"description":"Unique identifier for a project. IDs come from projects_list.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","type":"string"}},"required":["project_id"]},"exampleArguments":{"project_id":"prj_4f8k2m7x9q1v6b3n"},"outputSchema":{"properties":{"data":{"items":{"anyOf":[{"examples":[{"id":"gen_7h2p5d9c3m8w1k6q","object":"generation","project_id":"prj_4f8k2m7x9q1v6b3n","status":"succeeded","trigger":"manual","output":"typescript-sdk","meta":{"title":"Acme Payments API","version":"1.0.0","oas_version":"3.1","package_name":"@acme/payments","client_name":"AcmeClient","outputs":["typescript-sdk"]},"warnings":[],"error":null,"created_at":"2026-01-01T00:00:00Z"}],"properties":{"id":{"description":"Unique identifier for a generation.","examples":["gen_7h2p5d9c3m8w1k6q"],"pattern":"^gen_[a-z0-9]{16}$","type":"string"},"object":{"const":"generation","type":"string"},"files_omitted":{"description":"Present and true when the generated output was too large to inline; files_index lists paths, fetched one at a time via GET /generations/{generation_id}/file.","type":"boolean"},"files_index":{"type":"array"},"project_id":{"description":"Unique identifier for a project.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","type":"string"},"status":{"enum":["succeeded","failed"],"type":"string"},"trigger":{"enum":["manual","webhook","poll","preview"],"type":"string"},"output":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output. CLI and MCP include the private TypeScript request runtime they need; that dependency is not a selected or billable TypeScript SDK.","type":"string"},"meta":{"description":"Null only for a failed or legacy generation that produced no metadata.","anyOf":[{"type":"object"},{"type":"null"}]},"warnings":{"type":"array"},"files":{"description":"Present on retrieve and create; omitted in lists.","type":"array"},"error":{"type":["string","null"]},"created_at":{"format":"date-time","type":"string"}},"type":"object"},{"description":"A selected output that did not generate in a multi-output run.","properties":{"output":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output. CLI and MCP include the private TypeScript request runtime they need; that dependency is not a selected or billable TypeScript SDK.","type":"string"},"status":{"const":"failed","type":"string"},"error":{"type":"string"}},"type":"object"}]},"type":"array"}},"type":"object"}},
99
+ {"resource":"generations","method":"retrieve","command":["generations","retrieve"],"tool":"generations_retrieve","httpMethod":"GET","path":"/generations/{generation_id}","summary":"Retrieve a generation","description":"Includes the generated files when the generation succeeded.","toolDescription":"Retrieve a generation. Includes the generated files when the generation succeeded. GET /generations/{generation_id}","paginated":false,"hasBody":false,"bodyStyle":"none","bodyKind":null,"sse":false,"hasParams":false,"select":false,"idempotent":true,"auth":"required","safety":"read","params":[{"name":"generation_id","ts":"generationId","kind":"path","type":"string","required":true,"flag":"generation-id"}],"inputSchema":{"type":"object","properties":{"generation_id":{"description":"Unique identifier for a generation.","examples":["gen_7h2p5d9c3m8w1k6q"],"pattern":"^gen_[a-z0-9]{16}$","type":"string"}},"required":["generation_id"]},"exampleArguments":{"generation_id":"gen_7h2p5d9c3m8w1k6q"},"outputSchema":{"examples":[{"id":"gen_7h2p5d9c3m8w1k6q","object":"generation","project_id":"prj_4f8k2m7x9q1v6b3n","status":"succeeded","trigger":"manual","output":"typescript-sdk","meta":{"title":"Acme Payments API","version":"1.0.0","oas_version":"3.1","package_name":"@acme/payments","client_name":"AcmeClient","outputs":["typescript-sdk"]},"warnings":[],"error":null,"created_at":"2026-01-01T00:00:00Z"}],"properties":{"id":{"description":"Unique identifier for a generation.","examples":["gen_7h2p5d9c3m8w1k6q"],"pattern":"^gen_[a-z0-9]{16}$","type":"string"},"object":{"const":"generation","type":"string"},"files_omitted":{"description":"Present and true when the generated output was too large to inline; files_index lists paths, fetched one at a time via GET /generations/{generation_id}/file.","type":"boolean"},"files_index":{"items":{"properties":{"path":{"type":"string"},"bytes":{"type":"integer"}},"type":"object"},"type":"array"},"project_id":{"description":"Unique identifier for a project.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","type":"string"},"status":{"enum":["succeeded","failed"],"type":"string"},"trigger":{"enum":["manual","webhook","poll","preview"],"type":"string"},"output":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output. CLI and MCP include the private TypeScript request runtime they need; that dependency is not a selected or billable TypeScript SDK.","type":"string"},"meta":{"description":"Null only for a failed or legacy generation that produced no metadata.","anyOf":[{"properties":{"title":{"type":"string"},"version":{"type":"string"},"spec_format":{"enum":["openapi","graphql"],"type":"string"},"oas_version":{"description":"Detected spec version, \"2.0\", \"3.0\", or \"3.1\".","type":"string"},"converted":{"description":"True when the input was Swagger 2.0 and was converted.","type":"boolean"},"package_name":{"type":"string"},"client_name":{"type":"string"},"outputs":{"description":"Customer-selected outputs present in this delivery package.","uniqueItems":true,"items":{"enum":["typescript-sdk","python-sdk","go-sdk","cli","mcp"],"description":"One customer-selected output. CLI and MCP include the private TypeScript request runtime they need; that dependency is not a selected or billable TypeScript SDK.","type":"string"},"type":"array"},"resource_count":{"type":"integer"},"operation_count":{"type":"integer"},"schema_count":{"type":"integer"},"paginated_operation_count":{"type":"integer"},"omitted_operation_count":{"description":"Operations beyond the plan's endpoint allowance, not generated.","type":"integer"},"pr_url":{"description":"Pull request opened by this regeneration, when one was.","type":["string","null"]},"pr_number":{"type":["integer","null"]},"pr_status":{"enum":["opened","no_changes","blocked"],"description":"Whether a destination pull request opened, was unnecessary because the generated tree already matched, or could not be opened.","type":"string"},"pr_error":{"description":"Why the configured destination pull request was not opened. Generation itself still succeeded; fix this action and regenerate.","type":"string"},"changelog":{"description":"Markdown changelog entry for this regeneration, from the API surface diff. Absent on a first generation or when nothing changed.","type":"string"},"breaking_count":{"description":"Breaking changes in the diff; removed methods and fields, changed types, inputs that became required.","type":"integer"},"baseline":{"enum":["destination","last-generation","none"],"description":"What the diff was measured against; \"destination\" means the .typeship/surface.json merged in the destination repository.","type":"string"},"package_compatibility":{"enum":["success","failure"],"description":"The package compatibility verdict on the regeneration pull request; failure means breaking changes without a major version bump.","type":"string"},"package_compatibility_note":{"description":"The verdict in one line, as the commit status describes it.","type":"string"},"previous_version":{"description":"The package version the destination had before this regeneration.","type":"string"},"file_count":{"type":"integer"},"total_lines":{"type":"integer"}},"type":"object"},{"type":"null"}]},"warnings":{"items":{"type":"string"},"type":"array"},"files":{"description":"Present on retrieve and create; omitted in lists.","items":{"properties":{"path":{"description":"Repo-relative path inside the generated package.","type":"string"},"content":{"type":"string"}},"type":"object"},"type":"array"},"error":{"type":["string","null"]},"created_at":{"format":"date-time","type":"string"}},"type":"object"}},
100
+ {"resource":"generations","method":"retrieveFile","command":["generations","retrieve-file"],"tool":"generations_retrieve_file","httpMethod":"GET","path":"/generations/{generation_id}/file","summary":"Fetch one file from a generation","description":"Raw file content, for generations whose output was too large to inline (files_omitted true). The generation's files_index lists valid paths.","toolDescription":"Fetch one file from a generation. Raw file content, for generations whose output was too large to inline (files_omitted true). GET /generations/{generation_id}/file","paginated":false,"hasBody":false,"bodyStyle":"none","bodyKind":null,"sse":false,"hasParams":true,"select":false,"idempotent":true,"auth":"required","safety":"read","params":[{"name":"generation_id","ts":"generationId","kind":"path","type":"string","required":true,"flag":"generation-id"},{"name":"path","ts":"path","kind":"query","type":"string","required":true,"description":"Repo-relative path inside the generated package.","flag":"path"}],"inputSchema":{"type":"object","properties":{"generation_id":{"description":"Unique identifier for a generation.","examples":["gen_7h2p5d9c3m8w1k6q"],"pattern":"^gen_[a-z0-9]{16}$","type":"string"},"path":{"type":"string","description":"Repo-relative path inside the generated package."}},"required":["generation_id","path"]},"exampleArguments":{"generation_id":"gen_7h2p5d9c3m8w1k6q","path":"openapi.yaml"}},
101
+ {"resource":"specRevisions","method":"list","command":["spec-revisions","list"],"tool":"spec_revisions_list","httpMethod":"GET","path":"/projects/{project_id}/spec_revisions","summary":"List specification revisions","description":"Immutable snapshots of the exact source text this project consumed, newest first. Raw content is available from each revision's content endpoint and is never embedded in a list response.","toolDescription":"List specification revisions. Immutable snapshots of the exact source text this project consumed, newest first. GET /projects/{project_id}/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","safety":"read","params":[{"name":"project_id","ts":"projectId","kind":"path","type":"string","required":true,"description":"IDs come from projects_list.","flag":"project-id"},{"name":"limit","ts":"limit","kind":"query","type":"number","required":false,"description":"Maximum number of resources to return. Default: 20.","flag":"limit"},{"name":"cursor","ts":"cursor","kind":"query","type":"string","required":false,"description":"Opaque cursor from the preceding page's next_cursor.","flag":"cursor"}],"inputSchema":{"type":"object","properties":{"project_id":{"description":"Unique identifier for a project. IDs come from projects_list.","examples":["prj_4f8k2m7x9q1v6b3n"],"pattern":"^prj_[a-z0-9]{16}$","type":"string"},"limit":{"default":20,"minimum":1,"maximum":100,"type":"integer","description":"Maximum number of resources to return. Default: 20."},"cursor":{"type":"string","description":"Opaque cursor from the preceding page's next_cursor."}},"required":["project_id"]},"exampleArguments":{"project_id":"prj_4f8k2m7x9q1v6b3n"},"outputSchema":{"type":"object","properties":{"items":{"type":"array","items":{"properties":{"id":{"description":"Unique identifier for an immutable specification revision.","examples":["spec_6m1q8v4k2p9d7h3c"],"pattern":"^spec_[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"},"sha256":{"description":"SHA-256 digest of the exact raw specification text.","examples":["9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"],"pattern":"^[a-f0-9]{64}$","type":"string"},"size_bytes":{"description":"Size of the raw specification text in bytes.","minimum":0,"type":"integer"},"source":{"description":"Origin recorded when this immutable revision was created.","anyOf":[{"anyOf":[{"type":"object"},{"type":"object"}]},{"type":"null"}]},"created_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}}}},
102
+ {"resource":"specRevisions","method":"retrieve","command":["spec-revisions","retrieve"],"tool":"spec_revisions_retrieve","httpMethod":"GET","path":"/spec_revisions/{spec_revision_id}","summary":"Retrieve a specification revision","description":"Metadata for one immutable source snapshot. Fetch raw source text from the content endpoint so metadata responses stay small and predictable.","toolDescription":"Retrieve a specification revision. Metadata for one immutable source snapshot. GET /spec_revisions/{spec_revision_id}","paginated":false,"hasBody":false,"bodyStyle":"none","bodyKind":null,"sse":false,"hasParams":false,"select":false,"idempotent":true,"auth":"required","safety":"read","params":[{"name":"spec_revision_id","ts":"specRevisionId","kind":"path","type":"string","required":true,"description":"IDs come from spec_revisions_list.","flag":"spec-revision-id"}],"inputSchema":{"type":"object","properties":{"spec_revision_id":{"description":"Unique identifier for an immutable specification revision. IDs come from spec_revisions_list.","examples":["spec_6m1q8v4k2p9d7h3c"],"pattern":"^spec_[a-z0-9]{16}$","type":"string"}},"required":["spec_revision_id"]},"exampleArguments":{"spec_revision_id":"spec_6m1q8v4k2p9d7h3c"},"outputSchema":{"properties":{"id":{"description":"Unique identifier for an immutable specification revision.","examples":["spec_6m1q8v4k2p9d7h3c"],"pattern":"^spec_[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"},"sha256":{"description":"SHA-256 digest of the exact raw specification text.","examples":["9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08"],"pattern":"^[a-f0-9]{64}$","type":"string"},"size_bytes":{"description":"Size of the raw specification text in bytes.","minimum":0,"type":"integer"},"source":{"description":"Origin recorded when this immutable revision was created.","anyOf":[{"anyOf":[{"properties":{"kind":{"const":"url","type":"string"},"url":{"format":"uri","type":"string"}},"type":"object"},{"properties":{"kind":{"const":"github","type":"string"},"repository":{"description":"GitHub repository in owner/name form.","type":"string"},"path":{"description":"Repository-relative specification path.","type":"string"},"ref":{"description":"Git ref resolved for this revision, when recorded.","type":["string","null"]},"commit_sha":{"description":"Exact Git commit consumed, when recorded.","type":["string","null"]}},"type":"object"}]},{"type":"null"}]},"created_at":{"format":"date-time","type":"string"}},"type":"object"}},
103
+ {"resource":"specRevisions","method":"retrieveContent","command":["spec-revisions","retrieve-content"],"tool":"spec_revisions_retrieve_content","httpMethod":"GET","path":"/spec_revisions/{spec_revision_id}/content","summary":"Retrieve a specification revision's raw text","description":"Returns the exact source text identified by the revision's SHA-256 digest, suitable for saving or piping directly into a diff.","toolDescription":"Retrieve a specification revision's raw text. Returns the exact source text identified by the revision's SHA-256 digest, suitable for saving or piping directly into a diff. GET /spec_revisions/{spec_revision_id}/content","paginated":false,"hasBody":false,"bodyStyle":"none","bodyKind":null,"sse":false,"hasParams":false,"select":false,"idempotent":true,"auth":"required","safety":"read","params":[{"name":"spec_revision_id","ts":"specRevisionId","kind":"path","type":"string","required":true,"description":"IDs come from spec_revisions_list.","flag":"spec-revision-id"}],"inputSchema":{"type":"object","properties":{"spec_revision_id":{"description":"Unique identifier for an immutable specification revision. IDs come from spec_revisions_list.","examples":["spec_6m1q8v4k2p9d7h3c"],"pattern":"^spec_[a-z0-9]{16}$","type":"string"}},"required":["spec_revision_id"]},"exampleArguments":{"spec_revision_id":"spec_6m1q8v4k2p9d7h3c"}},
104
+ {"resource":"account","method":"retrieve","command":["account","retrieve"],"tool":"account_retrieve","httpMethod":"GET","path":"/me","summary":"The account behind the presented credentials","description":"Returns the account that owns the presented API key. This is also the\nidentity endpoint the generated typeship CLI's `whoami` calls.","toolDescription":"The account behind the presented credentials. Returns the account that owns the presented API key. GET /me","paginated":false,"hasBody":false,"bodyStyle":"none","bodyKind":null,"sse":false,"hasParams":false,"select":false,"idempotent":true,"auth":"required","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":{"examples":["org_2x7k9m4q"],"pattern":"^org_[A-Za-z0-9]+$","type":"string"},"object":{"const":"account","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"}},"type":"object"}},
105
+ {"resource":"apiKeys","method":"list","command":["api-keys","list"],"tool":"api_keys_list","httpMethod":"GET","path":"/api_keys","summary":"List API keys","description":"Keys are never returned in full — only their identity and last four. Creation stays in the console deliberately: a leaked key that can mint more keys is a leaked account.","toolDescription":"List API keys. Keys are never returned in full — only their identity and last four. 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","safety":"read","params":[{"name":"limit","ts":"limit","kind":"query","type":"number","required":false,"description":"Maximum number of resources to return. Default: 20.","flag":"limit"},{"name":"cursor","ts":"cursor","kind":"query","type":"string","required":false,"description":"Opaque cursor from the preceding page's next_cursor.","flag":"cursor"}],"inputSchema":{"type":"object","properties":{"limit":{"default":20,"minimum":1,"maximum":100,"type":"integer","description":"Maximum number of resources to return. Default: 20."},"cursor":{"type":"string","description":"Opaque cursor from the preceding page's next_cursor."}}},"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"}},"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}}}},
106
+ {"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":"Idempotent: revoking an already-revoked key returns the same body, so a rotation script that re-runs does not have to special-case having already succeeded.","toolDescription":"Revoke an API key. Idempotent: revoking an already-revoked key returns the same body, so a rotation script that re-runs does not have to special-case having already succeeded. DELETE /api_keys/{api_key_id}","paginated":false,"hasBody":false,"bodyStyle":"none","bodyKind":null,"sse":false,"hasParams":false,"select":false,"idempotent":true,"auth":"required","safety":"destructive","params":[{"name":"api_key_id","ts":"apiKeyId","kind":"path","type":"string","required":true,"description":"IDs come from api_keys_list.","flag":"api-key-id"}],"inputSchema":{"type":"object","properties":{"api_key_id":{"description":"Identifier returned by the API key list. IDs come from api_keys_list.","type":"string"}},"required":["api_key_id"]},"exampleArguments":{"api_key_id":"api_key_123"},"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"}},"type":"object"}},
107
+ ];
108
+
109
+ /** Parameters settable once on the client (globals option): CLI/MCP fill
110
+ * them from flags or environment; the SDK falls back per request. */
111
+ export const GLOBALS: { name: string; option: string; flag: string; envSuffix: string }[] = [
112
+
113
+ ];
114
+
115
+ export function findOp(resource: string, method: string): OpSpec | undefined {
116
+ return OPS.find((op) => op.command[0] === resource && (op.command[1] === method || op.commandAlias === method));
117
+ }
118
+
119
+ export function missingRequired(op: OpSpec, values: Record<string, unknown>): string[] {
120
+ return op.params
121
+ .filter((p) => p.required && values[p.name] === undefined)
122
+ .map((p) => p.name);
123
+ }
124
+
125
+ /**
126
+ * Assemble the SDK method's positional arguments from a flat map of values
127
+ * keyed by wire name (plus an optional raw body for bodyStyle "data" or a
128
+ * --data base object).
129
+ */
130
+ export function buildArgs(
131
+ op: OpSpec,
132
+ values: Record<string, unknown>,
133
+ dataBody?: unknown,
134
+ select?: string,
135
+ ): unknown[] {
136
+ const args: unknown[] = [];
137
+ for (const p of op.params) {
138
+ if (p.kind === "path") args.push(String(values[p.name] ?? ""));
139
+ }
140
+ if (op.hasBody) {
141
+ if (op.bodyStyle === "fields") {
142
+ const body: Record<string, unknown> = {};
143
+ let used = false;
144
+ if (dataBody !== undefined && dataBody !== null && typeof dataBody === "object") {
145
+ Object.assign(body, dataBody as Record<string, unknown>);
146
+ used = true;
147
+ }
148
+ for (const p of op.params) {
149
+ if (p.kind === "body" && values[p.name] !== undefined) {
150
+ body[p.name] = values[p.name];
151
+ used = true;
152
+ }
153
+ }
154
+ args.push(used ? body : undefined);
155
+ } else {
156
+ args.push(dataBody !== undefined ? dataBody : values.body);
157
+ }
158
+ }
159
+ if (op.select) {
160
+ args.push(select);
161
+ }
162
+ if (op.hasParams) {
163
+ const params: Record<string, unknown> = {};
164
+ let used = false;
165
+ for (const p of op.params) {
166
+ if ((p.kind === "query" || p.kind === "header") && values[p.name] !== undefined) {
167
+ params[p.ts] = values[p.name];
168
+ used = true;
169
+ }
170
+ }
171
+ args.push(used ? params : undefined);
172
+ }
173
+ return args;
174
+ }
@@ -0,0 +1,43 @@
1
+ // typeship — account resource.
2
+ // Generated by typeship — https://typeship.dev — do not edit by hand.
3
+
4
+ import { HttpCore, type ApiResult, type RequestOptions } from "../core/http.js";
5
+ import {
6
+ TransportError,
7
+ UnexpectedApiError,
8
+ ValidationError,
9
+ ForbiddenError,
10
+ RateLimitedError,
11
+ UnauthorizedError,
12
+ } from "../errors.js";
13
+ import type { Account } from "../types.js";
14
+
15
+ export class AccountResource {
16
+ constructor(private readonly _core: HttpCore) {}
17
+ /**
18
+ * The account behind the presented credentials
19
+ *
20
+ * Returns the account that owns the presented API key. This is also the
21
+ * identity endpoint the generated typeship CLI's `whoami` calls.
22
+ * `GET /me`
23
+ */
24
+ async retrieve(options?: RequestOptions): Promise<ApiResult<Account, AccountRetrieveError>> {
25
+ return this._core.request<Account, AccountRetrieveError>({
26
+ method: "GET",
27
+ path: "/me",
28
+ errors: { "401": UnauthorizedError, "403": ForbiddenError, "429": RateLimitedError },
29
+ idempotent: true,
30
+ schemaKey: "account.retrieve",
31
+ options,
32
+ });
33
+ }
34
+ }
35
+
36
+ /** Every error `retrieve` can produce, as a discriminated union. */
37
+ export type AccountRetrieveError =
38
+ | UnauthorizedError
39
+ | ForbiddenError
40
+ | RateLimitedError
41
+ | UnexpectedApiError
42
+ | TransportError
43
+ | ValidationError;