{"openapi":"3.1.0","info":{"title":"Crate.tools catalog API","version":"1.0.0","summary":"Read-only discovery for Crate's browser-local tools.","description":"Crate is a set of file and text tools that run entirely in the visitor's browser. There is no upload endpoint, no account, and no server-side processing.\n\nThis API exists so an agent can discover what Crate can do without executing JavaScript: list the tools, read one tool's input schema, and get the canonical URL of the page that performs the task. Running a task requires opening that page in a browser, where the tool registers `run_tool` and `get_tool_state` through the experimental WebMCP `document.modelContext` interface.\n\nEvery operation is a static file served by a CDN. That means GET only, no authentication, no rate limit, and no request body. A path that does not exist returns the site's HTML 404 page rather than a JSON error object, because static hosting has no handler to build one.","contact":{"name":"Crate.tools","email":"hello@crate.tools","url":"https://crate.tools/contact/"},"license":{"name":"Free to use","url":"https://crate.tools/about/"},"termsOfService":"https://crate.tools/privacy/"},"servers":[{"url":"https://crate.tools","description":"Production"}],"tags":[{"name":"tools","description":"The tool catalog."},{"name":"categories","description":"Groupings of tools."}],"externalDocs":{"description":"Developer documentation","url":"https://crate.tools/developers/"},"paths":{"/api/v1/tools.json":{"get":{"operationId":"listTools","tags":["tools"],"summary":"List every Crate tool","description":"Returns all published tools with their category, keywords, canonical page URL, and known limits. Use this to decide which tool fits a task before opening its page.","responses":{"200":{"description":"The full tool catalog.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ToolList"}}}}}}},"/api/v1/tools/{slug}.json":{"get":{"operationId":"getTool","tags":["tools"],"summary":"Get one tool","description":"Returns a single tool with its steps, when-to-use guidance, FAQ, related tools, and the WebMCP input schema accepted by `run_tool` on the tool's page.","parameters":[{"name":"slug","in":"path","required":true,"description":"The tool's stable identifier.","schema":{"type":"string","enum":["pdf-page-size","video-to-gif","images-to-gif","gif-to-frames","markdown-to-html","strip-html-tags","text-extract-emails","lorem-ipsum","text-line-ending-converter","whitespace-visualizer","smart-quotes-converter","text-remove-accents","text-character-frequency","text-reading-time","longest-line","text-frequency","text-column-extractor","text-prefix-suffix","reverse-text","shuffle-lines","compare-lists","list-to-csv","text-to-list","text-to-slug","find-replace-text","remove-line-numbers","add-line-numbers","remove-line-breaks","remove-empty-lines","trim-whitespace","sort-lines","jpg-to-png","png-to-jpg","webp-to-png","image-resizer","image-compressor","extract-first-pdf-page","extract-last-pdf-page","merge-pdf","rotate-pdf","word-counter","word-diff","case-converter","remove-duplicate-lines","json-formatter","base64-encode-decode","url-encode-decode","sha256-hash","video-first-frame","video-trim"]},"example":"pdf-page-size"}],"responses":{"200":{"description":"The requested tool.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/Tool"}}}},"404":{"description":"No tool with that slug. The static host answers with the site's HTML 404 page, not JSON.","content":{"text/html":{"schema":{"type":"string"}}}}}}},"/api/v1/categories.json":{"get":{"operationId":"listCategories","tags":["categories"],"summary":"List tool categories","description":"Returns each category with its description, page URL, tool count, and the API URL of every tool inside it.","responses":{"200":{"description":"Every category.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/CategoryList"}}}}}}},"/tools.json":{"get":{"operationId":"listToolsLegacy","tags":["tools"],"deprecated":true,"summary":"List every tool (unversioned alias)","description":"The original discovery catalog, kept working for clients that already fetch it. New integrations should use listTools.","responses":{"200":{"description":"The full tool catalog.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/LegacyToolList"}}}}}}},"/openapi.json":{"get":{"operationId":"getOpenApiDocument","summary":"Get this OpenAPI description","description":"Returns the OpenAPI 3.1 document describing this API.","responses":{"200":{"description":"The OpenAPI document.","content":{"application/json":{"schema":{"$ref":"#/components/schemas/OpenApiDocument"}}}}}}}},"components":{"schemas":{"ToolSummary":{"type":"object","required":["slug","name","description","category","url"],"properties":{"slug":{"type":"string","description":"Stable identifier used in URLs."},"name":{"type":"string","description":"Human-readable tool name."},"description":{"type":"string","description":"What the tool does."},"category":{"type":"string","enum":["images","pdf","text","developer","video"],"description":"Category this tool belongs to."},"keywords":{"type":"array","items":{"type":"string"},"description":"Search terms people use for this task."},"url":{"type":"string","format":"uri","description":"Canonical page that runs the tool in a browser."},"self":{"type":"string","format":"uri","description":"This tool's own JSON resource."},"processing":{"type":"string","enum":["client-only"],"description":"Where the work happens. Always in the visitor's browser."},"limits":{"type":"string","description":"Known limitations, in plain language."}}},"Tool":{"allOf":[{"$ref":"#/components/schemas/ToolSummary"},{"type":"object","properties":{"intro":{"type":"string","description":"One-paragraph explanation of the task."},"steps":{"type":"array","items":{"type":"string"},"description":"The steps a person follows in the UI."},"whenToUse":{"type":"array","items":{"type":"string"},"description":"Situations this tool is the right answer to."},"faq":{"type":"array","description":"Questions and answers published on the tool page.","items":{"type":"object","required":["q","a"],"properties":{"q":{"type":"string"},"a":{"type":"string"}}}},"related":{"type":"array","description":"Tools that pair with this one.","items":{"type":"object","properties":{"slug":{"type":"string"},"url":{"type":"string","format":"uri"},"self":{"type":"string","format":"uri"}}}},"webmcp":{"type":"object","description":"How to drive the tool once its page is open in a WebMCP-capable browser.","properties":{"transport":{"type":"string"},"run":{"type":"string","description":"Tool name that performs the task."},"read":{"type":"string","description":"Tool name that reads the visible result."},"inputSchema":{"type":"object","description":"JSON Schema for the run_tool input."}}}}}]},"ToolList":{"type":"object","required":["apiVersion","count","tools"],"properties":{"apiVersion":{"type":"string","enum":["v1"]},"name":{"type":"string"},"description":{"type":"string"},"documentation":{"type":"string","format":"uri"},"openapi":{"type":"string","format":"uri"},"count":{"type":"integer","description":"Number of tools returned."},"tools":{"type":"array","items":{"$ref":"#/components/schemas/ToolSummary"}}}},"LegacyToolList":{"type":"object","description":"The unversioned catalog shape.","properties":{"name":{"type":"string"},"version":{"type":"integer"},"transport":{"type":"string"},"tools":{"type":"array","items":{"type":"object"}}}},"OpenApiDocument":{"type":"object","description":"An OpenAPI 3.1 description document.","required":["openapi","info","paths"],"properties":{"openapi":{"type":"string","description":"OpenAPI specification version."},"info":{"type":"object","description":"Title, version, and contact details for this API.","properties":{"title":{"type":"string"},"version":{"type":"string"},"description":{"type":"string"}}},"servers":{"type":"array","items":{"type":"object","properties":{"url":{"type":"string","format":"uri"},"description":{"type":"string"}}}},"paths":{"type":"object","description":"Operations, keyed by path."},"components":{"type":"object","description":"Reusable schemas."}}},"CategoryList":{"type":"object","required":["apiVersion","count","categories"],"properties":{"apiVersion":{"type":"string","enum":["v1"]},"name":{"type":"string"},"documentation":{"type":"string","format":"uri"},"count":{"type":"integer"},"categories":{"type":"array","items":{"type":"object","required":["slug","name","url"],"properties":{"slug":{"type":"string","enum":["images","pdf","text","developer","video"]},"name":{"type":"string"},"description":{"type":"string"},"url":{"type":"string","format":"uri"},"toolCount":{"type":"integer"},"tools":{"type":"array","items":{"type":"string","format":"uri"}}}}}}}}}}