ship.page
Deploy HTML from any agent: POST markup, get a live URL. Static hosting API with MCP tools.
使うべきか
品質と安全性
検出事項(1)
- LOWdeploy_files 内
ツール定義とプロトコルへの準拠に関する自動分析に基づいています。
コンテキストコスト
これは、サーバーのツールがモデルのコンテキストに読み込まれるたびに消費されるおおよそのトークン数です。数が多いほど、ほかのタスクに使える注意が減ります。
インストール
ワンクリックインストール
これを `claude_desktop_config.json` ファイルに追加してください:
{
"mcpServers": {
"ship-page": {
"url": "https://ship.page/mcp"
}
}
}リモートエンドポイント
https://ship.page/mcpstreamable-httpできること
ツール一覧
ツール(11)
🔴deploy_html(html, ttl, name, email, password)
Deploy one HTML document and get back a live, unguessable https://<slug>.shipped.run/ URL. Anonymous: 10 deploys/min per IP, 10MB body cap, 30-day expiry. Pro ($4/mo): custom or no TTL, named drops.
入力スキーマ
{
"type": "object",
"properties": {
"html": {
"type": "string",
"description": "The full HTML document to publish."
},
"ttl": {
"type": "integer",
"description": "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": {
"type": "string",
"description": "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."
},
"email": {
"type": "string",
"description": "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": {
"type": "string",
"minLength": 8,
"maxLength": 128,
"writeOnly": true,
"description": "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."
}
},
"required": [
"html"
]
}出力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Drop slug; the site is live at https://<slug>.shipped.run/"
},
"url": {
"type": "string"
},
"files": {
"type": "array",
"items": {
"type": "string"
}
},
"plan": {
"type": "string"
},
"expires_at": {
"type": [
"string",
"null"
],
"description": "ISO timestamp, or null when the drop never expires"
},
"name": {
"type": "string"
},
"replaced": {
"type": "boolean",
"description": "Present with named deploys; true when an existing drop was replaced"
},
"password_protected": {
"type": "boolean"
},
"claim_token": {
"type": "string",
"description": "One-time claim token (spc_...), present only on anonymous deploys and shown once. Anyone holding it can attach the drop to an account via claim_drop."
}
},
"required": [
"slug",
"url",
"files",
"plan",
"expires_at",
"password_protected"
]
}🔴deploy_files(files, ttl, name, email, password)
Deploy 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 900 files, custom or no TTL, named drops.
入力スキーマ
{
"type": "object",
"properties": {
"files": {
"type": "object",
"description": "Map of relative paths (e.g. 'index.html', 'css/app.css') to either a string, or { encoding: 'base64', content } for binary files.",
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"properties": {
"encoding": {
"type": "string",
"const": "base64"
},
"content": {
"type": "string"
}
},
"required": [
"encoding",
"content"
]
},
{
"type": "object",
"properties": {
"content": {
"type": "string"
}
},
"required": [
"content"
]
}
]
}
},
"ttl": {
"type": "integer",
"description": "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": {
"type": "string",
"description": "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."
},
"email": {
"type": "string",
"description": "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": {
"type": "string",
"minLength": 8,
"maxLength": 128,
"writeOnly": true,
"description": "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."
}
},
"required": [
"files"
]
}出力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Drop slug; the site is live at https://<slug>.shipped.run/"
},
"url": {
"type": "string"
},
"files": {
"type": "array",
"items": {
"type": "string"
}
},
"plan": {
"type": "string"
},
"expires_at": {
"type": [
"string",
"null"
],
"description": "ISO timestamp, or null when the drop never expires"
},
"name": {
"type": "string"
},
"replaced": {
"type": "boolean",
"description": "Present with named deploys; true when an existing drop was replaced"
},
"password_protected": {
"type": "boolean"
},
"claim_token": {
"type": "string",
"description": "One-time claim token (spc_...), present only on anonymous deploys and shown once. Anyone holding it can attach the drop to an account via claim_drop."
}
},
"required": [
"slug",
"url",
"files",
"plan",
"expires_at",
"password_protected"
]
}🔴append_files(slug, files)
Add files to a drop owned by the authenticated account (requires an sp_ API key and an active subscription): up to 900 files per call, 10,000 per drop total, and existing paths are overwritten. The drop keeps its current expiry and password protection.
入力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The drop slug (the subdomain part of its ${domain} URL)."
},
"files": {
"type": "object",
"description": "Map of relative paths (e.g. 'index.html', 'css/app.css') to either a string, or { encoding: 'base64', content } for binary files.",
"additionalProperties": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"properties": {
"encoding": {
"type": "string",
"const": "base64"
},
"content": {
"type": "string"
}
},
"required": [
"encoding",
"content"
]
},
{
"type": "object",
"properties": {
"content": {
"type": "string"
}
},
"required": [
"content"
]
}
]
}
}
},
"required": [
"slug",
"files"
]
}出力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"url": {
"type": "string"
},
"files": {
"type": "array",
"items": {
"type": "string"
},
"description": "Paths added by this call"
},
"total_files": {
"type": "integer",
"description": "Total files on the drop after the append"
},
"plan": {
"type": "string"
},
"expires_at": {
"type": [
"string",
"null"
],
"description": "ISO timestamp, or null when the drop never expires"
}
},
"required": [
"slug",
"url",
"files",
"total_files",
"expires_at"
]
}🟢list_drops(limit, offset)
List 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.
入力スキーマ
{
"type": "object",
"properties": {
"limit": {
"type": "integer",
"description": "Max drops to return (1-500, default 100)."
},
"offset": {
"type": "integer",
"description": "Number of drops to skip (default 0)."
}
}
}出力スキーマ
{
"type": "object",
"properties": {
"total": {
"type": "integer"
},
"drops": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"url": {
"type": "string"
},
"name": {
"type": [
"string",
"null"
]
},
"file_count": {
"type": "integer"
},
"redeploy_count": {
"type": "integer"
},
"password_protected": {
"type": "boolean"
},
"created_at": {
"type": "string"
},
"updated_at": {
"type": "string"
},
"expires_at": {
"type": [
"string",
"null"
]
}
},
"required": [
"slug",
"url",
"password_protected"
]
}
}
},
"required": [
"total",
"drops"
]
}🔴claim_drop(slug, claim_token)
Attach 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.
入力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The drop slug (the subdomain part of its ${domain} URL)."
},
"claim_token": {
"type": "string",
"description": "The one-time spc_... token returned at deploy time."
}
},
"required": [
"slug",
"claim_token"
]
}出力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"claimed": {
"type": "boolean"
},
"restored": {
"type": "boolean",
"description": "True when the drop had already expired and was revived by the claim"
},
"expires_at": {
"type": [
"string",
"null"
],
"description": "ISO timestamp after the claim's lifetime extension, or null"
},
"url": {
"type": "string"
}
},
"required": [
"slug",
"claimed",
"url"
]
}🔴restore_drop(slug)
Bring back an expired drop owned by the authenticated account while its files are still retained (requires an sp_ API key). Free accounts restore up to 30 days past expiry and the drop comes back at the 90-day lifetime; paid plans restore up to 90 days past expiry and the drop never expires again.
入力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The drop slug (the subdomain part of its ${domain} URL)."
}
},
"required": [
"slug"
]
}出力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"restored": {
"type": "boolean",
"description": "False when the drop was not expired and nothing changed"
},
"expires_at": {
"type": [
"string",
"null"
],
"description": "ISO timestamp after the restore, or null when the drop never expires"
},
"url": {
"type": "string"
}
},
"required": [
"slug",
"restored",
"expires_at",
"url"
]
}🔴delete_drop(slug)
Permanently delete a drop owned by the authenticated account (requires an sp_ API key). The URL stops serving immediately and cannot be recovered.
入力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The drop slug (the subdomain part of its ${domain} URL)."
}
},
"required": [
"slug"
]
}出力スキーマ
{
"type": "object",
"properties": {
"deleted": {
"type": "string",
"description": "Slug of the deleted drop"
}
},
"required": [
"deleted"
]
}🔴set_drop_password(slug, password)
Set 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.
入力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The drop slug (the subdomain part of its URL)."
},
"password": {
"type": "string",
"minLength": 8,
"maxLength": 128,
"writeOnly": true,
"description": "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."
}
},
"required": [
"slug",
"password"
]
}出力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"password_protected": {
"type": "boolean"
}
},
"required": [
"slug",
"password_protected"
]
}🔴remove_drop_password(slug)
Remove 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.
入力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "The drop slug (the subdomain part of its URL)."
}
},
"required": [
"slug"
]
}出力スキーマ
{
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"password_protected": {
"type": "boolean"
}
},
"required": [
"slug",
"password_protected"
]
}🟢get_limits
Show 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.
入力スキーマ
{
"type": "object",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"plans": {
"type": "object",
"description": "Plan matrix: anonymous, pro, team"
},
"account": {
"type": "object",
"properties": {
"accountId": {
"type": "string"
},
"plan": {
"type": "string",
"description": "free | pro | team"
},
"activeSubscription": {
"type": "boolean"
},
"currentPeriodEnd": {
"type": [
"string",
"null"
]
},
"cancelAt": {
"type": [
"string",
"null"
]
},
"portalAvailable": {
"type": "boolean"
}
},
"required": [
"accountId",
"plan",
"activeSubscription"
],
"description": "Present when an sp_ API key was supplied"
}
},
"required": [
"plans"
]
}🟢get_account
Show 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.
入力スキーマ
{
"type": "object",
"additionalProperties": false
}出力スキーマ
{
"type": "object",
"properties": {
"accountId": {
"type": "string"
},
"plan": {
"type": "string",
"description": "free | pro | team"
},
"activeSubscription": {
"type": "boolean"
},
"currentPeriodEnd": {
"type": [
"string",
"null"
]
},
"cancelAt": {
"type": [
"string",
"null"
]
},
"portalAvailable": {
"type": "boolean"
}
},
"required": [
"accountId",
"plan",
"activeSubscription"
]
}コミュニティ
エビデンス