ship.page
Measured conclusion: Deep-tested. L2 outcome: tools_ok.
Deploy HTML from any agent: POST markup, get a live URL. Static hosting API with MCP tools.
| Author | page.ship |
|---|---|
| Access | remote |
| Publisher key required | No |
| Measured state | Deep-tested |
| L1 liveness | alive |
| L1 latency | 2693 ms |
| Last measured | 2026-10-24 |
Add to your agent
Copy this into your MCP client config:
{
"mcpServers": {
"ship.page": {
"url": "https://ship.page/mcp",
"transport": "streamable-http"
}
}
}
Measured tools (11)
deploy_htmldestructiveDeploy one HTML document and get back a live, unguessable https://<slug>.ship.place/ URL. Anonymous: 10 deploys/min per IP, 10MB body cap, 30-day expiry. Pro ($4/mo): custom or no TTL, named drops.
Parameters:
html(required) — string — The full HTML document to publish.ttl— integer — Lifetime in seconds (min 60). Anonymous: max 2592000 (30 days), default 30 days. Signed-in free: max 7776000 (90 days), default 90 days. Paid: any value, omit for no expiry.name— string — Stable name for a redeployable drop (1-41 chars of [a-z0-9-]). Requires an active subscription; Team accounts serve it on their vanity subdomain.agent— string — Name of the AI agent or app publishing this drop, e.g. 'chatgpt', 'claude', 'cursor'. AI agents: always set this.email— string — Contact email for an anonymous deploy: the one-time claim link is mailed to it, so the drop stays recoverable even if the claim_token from the response is lost. Pass it whenever the deploy is for a human. Ignored for authenticated deploys (those are owned already).password— string — Shared password: 8-128 Unicode characters, at most 512 UTF-8 bytes. Requires active paid Pro/Team. Sent privately, never in the URL or response. Omit on a live named redeploy to preserve protection. Recreating an expired or purged name is a new drop: send the password again.
Hints: read-only no · destructive yes · idempotent no · open-world yes
deploy_filesdestructiveDeploy a map of path -> content as a multi-file site (must include index.html to serve at the root). Anonymous: up to 100 files per request, 30-day expiry (90 days once signed in). Pro ($4/mo): up to 10,000 files, custom or no TTL, named drops.
Parameters:
files(required) — object — Map of relative paths (e.g. 'index.html', 'css/app.css') to either a string, or { encoding: 'base64', content } for binary files.ttl— integer — Lifetime in seconds (min 60). Anonymous: max 2592000 (30 days), default 30 days. Signed-in free: max 7776000 (90 days), default 90 days. Paid: any value, omit for no expiry.name— string — Stable name for a redeployable drop (1-41 chars of [a-z0-9-]). Requires an active subscription; Team accounts serve it on their vanity subdomain.agent— string — Name of the AI agent or app publishing this drop, e.g. 'chatgpt', 'claude', 'cursor'. AI agents: always set this.email— string — Contact email for an anonymous deploy: the one-time claim link is mailed to it, so the drop stays recoverable even if the claim_token from the response is lost. Pass it whenever the deploy is for a human. Ignored for authenticated deploys (those are owned already).password— string — Shared password: 8-128 Unicode characters, at most 512 UTF-8 bytes. Requires active paid Pro/Team. Sent privately, never in the URL or response. Omit on a live named redeploy to preserve protection. Recreating an expired or purged name is a new drop: send the password again.
Hints: read-only no · destructive yes · idempotent no · open-world yes
append_filesdestructiveAdd files to a drop owned by the authenticated account (requires an sp_ API key and an active subscription): up to 10,000 files per drop in total, and existing paths are overwritten. The drop keeps its current expiry and password protection.
Parameters:
slug(required) — string — The drop slug (the subdomain part of its ${domain} URL).files(required) — object — Map of relative paths (e.g. 'index.html', 'css/app.css') to either a string, or { encoding: 'base64', content } for binary files.
Hints: read-only no · destructive yes · idempotent no · open-world yes
list_dropsList drops owned by the authenticated account (requires an sp_ API key; anonymous drops are not listable). Returns slug, url, name, file counts, expiry and password_protected, newest first.
Parameters:
limit— integer — Max drops to return (1-500, default 100).offset— integer — Number of drops to skip (default 0).
Hints: read-only no · destructive no · idempotent no · open-world no
claim_dropdestructiveAttach an anonymously deployed drop to the authenticated account using its one-time claim token (spc_..., returned once by deploy_html/deploy_files). Claiming extends the drop to the free-account lifetime (90 days) and can revive an offline drop during its 30-day private recovery window. Claimed drops become listable, deletable, and — on paid plans — redeployable via named drops. Requires an sp_ API key.
Parameters:
slug(required) — string — The drop slug (the subdomain part of its ${domain} URL).claim_token(required) — string — The one-time spc_... token returned at deploy time.
Hints: read-only no · destructive yes · idempotent no · open-world yes
restore_dropBring back an expired drop owned by the authenticated account while its files are still retained (requires an sp_ API key), up to 90 days past expiry. Free accounts get the drop back at the 90-day lifetime; on a paid plan the restored drop never expires again.
Parameters:
slug(required) — string — The drop slug (the subdomain part of its ${domain} URL).
Hints: read-only no · destructive no · idempotent no · open-world yes
delete_dropdestructivePermanently delete a drop owned by the authenticated account (requires an sp_ API key). The URL stops serving immediately and cannot be recovered.
Parameters:
slug(required) — string — The drop slug (the subdomain part of its ${domain} URL).
Hints: read-only no · destructive yes · idempotent no · open-world yes
set_drop_passworddestructiveSet or rotate the shared password on a drop you own. Requires an sp_ API key and active paid Pro/Team; unavailable billing returns an error, not a public drop. Visitors unlock in their browser. Never put the password in a URL.
Parameters:
slug(required) — string — The drop slug (the subdomain part of its URL).password(required) — string — Shared password: 8-128 Unicode characters, at most 512 UTF-8 bytes. Requires active paid Pro/Team. Sent privately, never in the URL or response. Omit on a live named redeploy to preserve protection. Recreating an expired or purged name is a new drop: send the password again.
Hints: read-only no · destructive yes · idempotent no · open-world yes
remove_drop_passworddestructiveRemove password protection from a drop you own, making it readable by anyone with its URL. Requires an sp_ API key; works even after your paid subscription lapses.
Parameters:
slug(required) — string — The drop slug (the subdomain part of its URL).
Hints: read-only no · destructive yes · idempotent no · open-world yes
get_limitsShow the ship.page plan matrix (anonymous free tier vs Pro $4/mo vs Team $19/mo) and, when an sp_ API key is present, the caller's current account/plan status.
Hints: read-only no · destructive no · idempotent no · open-world no
get_accountShow the authenticated account's plan, subscription status and usage (requires an sp_ API key). Anonymous callers should use get_limits for the static free-tier limits.
Hints: read-only no · destructive no · idempotent no · open-world no
Measured by MCPYP probing. Untested fields are omitted, never estimated. Listing is always free; MCPYP never proxies calls or stores user tokens.