{"name":"upload.tf","description":"Publishes a static website from files you send it, and manages the sites it has already published for you. Send a message whose parts carry the files and it returns a live URL. It understands a short, documented set of instructions (see each skill's examples) and accepts a structured `data` part naming the operation directly; it does not use a language model to interpret free-form requests, and asks for clarification rather than guessing. Every publish is subject to the same plan limits, link expiry, content screening and rate limits as an upload made through the website.","supportedInterfaces":[{"url":"https://uploadthefile.com/api/a2a","protocolBinding":"JSONRPC","protocolVersion":"1.0"}],"provider":{"organization":"upload.tf","url":"https://uploadthefile.com"},"iconUrl":"https://uploadthefile.com/logo.png","version":"0.1.0","documentationUrl":"https://uploadthefile.com/docs","capabilities":{"streaming":false,"pushNotifications":false,"extendedAgentCard":false},"securitySchemes":{"uploadTfOAuth":{"oauth2SecurityScheme":{"description":"The same OAuth 2.1 authorization-code + PKCE flow this service uses for its MCP connector. Request the token with `resource` set to this interface's URL (RFC 8707) — a token minted for a different resource will not be accepted here.","flows":{"authorizationCode":{"authorizationUrl":"https://uploadthefile.com/oauth/authorize","tokenUrl":"https://uploadthefile.com/api/oauth/token","scopes":{"sites:read":"List and describe the websites you have published.","sites:write":"Publish new websites, republish existing ones, and delete them."},"pkceRequired":true}},"oauth2MetadataUrl":"https://uploadthefile.com/.well-known/oauth-authorization-server"}},"uploadTfApiKey":{"apiKeySecurityScheme":{"description":"An account API key, sent in the `x-api-key` header (or as a bearer token). Available on plans that include API access, and the only credential here that a caller can hold without a browser consent step — see the agent-identity note in the A2A binding docs. An API key is not scoped: it satisfies every operation this agent exposes, bounded by the account plan rather than by a grant.","location":"header","name":"x-api-key"}}},"securityRequirements":[{"schemes":{"uploadTfOAuth":{"list":["sites:read"]}}},{"schemes":{"uploadTfApiKey":{"list":[]}}}],"defaultInputModes":["text/plain","application/json","application/octet-stream"],"defaultOutputModes":["text/plain","application/json"],"skills":[{"id":"publish-static-site","name":"Publish a static website","description":"Takes the files of a static website (HTML, CSS, JavaScript, images, fonts) and publishes them to a public URL. Send each file as a message part with a `filename` and either its bytes in `raw` (base64) or its text in `text`; add a `data` part with a `name` to choose the address. Publishing over a site you already have does not overwrite it immediately: the task moves to TASK_STATE_INPUT_REQUIRED with a preview link, and the live site changes only when you reply on the same task to confirm. File size, file count, total storage and how long the link lives are all set by the account plan, and a request that exceeds them fails with the reason rather than being quietly trimmed.","tags":["publishing","static-site","web-hosting","html","deployment","file-upload"],"examples":["Publish these files.","Publish this as \"my-portfolio\".","{\"operation\":\"publish\",\"name\":\"my-portfolio\"}","Confirm.","Cancel — do not publish that."],"securityRequirements":[{"schemes":{"uploadTfOAuth":{"list":["sites:write"]}}},{"schemes":{"uploadTfApiKey":{"list":[]}}}]},{"id":"manage-published-sites","name":"Inspect published websites","description":"Lists the websites published under this account and reports one site's current state — its public URL, file count, size, when the link expires, and whether it is live or is being withheld. A site that is not yours is reported exactly as a site that does not exist, so this cannot be used to discover whether a name is taken by someone else.","tags":["site-management","listing","status","inventory","web-hosting"],"examples":["List my websites.","What is the status of \"my-portfolio\"?","{\"operation\":\"get\",\"name\":\"my-portfolio\"}"],"securityRequirements":[{"schemes":{"uploadTfOAuth":{"list":["sites:read"]}}},{"schemes":{"uploadTfApiKey":{"list":[]}}}]},{"id":"remove-published-site","name":"Remove a published website","description":"Takes a website you published offline and deletes its files. Irreversible, so it never proceeds on a guess: the site must be named unambiguously (in quotes, or in a `data` part) or the task asks which one you meant instead of choosing. A site held for legal reasons cannot be deleted and says so.","tags":["site-management","deletion","unpublish","web-hosting"],"examples":["Delete \"my-portfolio\".","{\"operation\":\"delete\",\"name\":\"my-portfolio\"}"],"securityRequirements":[{"schemes":{"uploadTfOAuth":{"list":["sites:write"]}}},{"schemes":{"uploadTfApiKey":{"list":[]}}}]}]}