MCP 서버

ship.page

page.ship/ship-page
클라우드 및 인프라 개발자 도구 공개 · 연결 가능 MCP 2026-07-28

이 MCP로 할 수 있는 일

Deploys single-page or multi-file static websites to live URLs and manages hosted site drops.

append_files
Append files to an existing drop
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', 'required': ['slug', 'files'], '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', 'required': ['encoding', 'content'], 'properties': {'content': {'type': 'string'}, 'encoding': {'type': 'string', 'const': 'base64'}}}, {'type': 'object', 'required': ['content'], 'properties': {'content': {'type': 'string'}}}]}}}}
출력 스키마
{'type': 'object', 'required': ['slug', 'url', 'files', 'total_files', 'expires_at'], 'properties': {'url': {'type': 'string'}, 'plan': {'type': 'string'}, 'slug': {'type': 'string'}, 'files': {'type': 'array', 'items': {'type': 'string'}, 'description': 'Paths added by this call'}, 'expires_at': {'type': ['string', 'null'], 'description': 'ISO timestamp, or null when the drop never expires'}, 'total_files': {'type': 'integer', 'description': 'Total files on the drop after the append'}}}
claim_drop
Claim an anonymous drop
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', 'required': ['slug', 'claim_token'], '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.'}}}
출력 스키마
{'type': 'object', 'required': ['slug', 'claimed', 'url'], 'properties': {'url': {'type': 'string'}, '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"}}}
delete_drop
Delete a drop
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', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'The drop slug (the subdomain part of its ${domain} URL).'}}}
출력 스키마
{'type': 'object', 'required': ['deleted'], 'properties': {'deleted': {'type': 'string', 'description': 'Slug of the deleted drop'}}}
deploy_files
Deploy a multi-file site
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', 'required': ['files'], 'properties': {'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.'}, 'agent': {'type': 'string', 'maxLength': 64, 'description': "Name of the AI agent or app publishing this drop, e.g. 'chatgpt', 'claude', 'cursor'. AI agents: always set this."}, '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).'}, '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', 'required': ['encoding', 'content'], 'properties': {'content': {'type': 'string'}, 'encoding': {'type': 'string', 'const': 'base64'}}}, {'type': 'object', 'required': ['content'], 'properties': {'content': {'type': 'string'}}}]}}, 'password': {'type': 'string', 'maxLength': 128, 'minLength': 8, '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.'}}}
출력 스키마
{'type': 'object', 'required': ['slug', 'url', 'files', 'plan', 'expires_at', 'password_protected'], 'properties': {'url': {'type': 'string'}, 'name': {'type': 'string'}, 'plan': {'type': 'string'}, 'slug': {'type': 'string', 'description': 'Drop slug; the site is live at https://<slug>.ship.place/'}, 'files': {'type': 'array', 'items': {'type': 'string'}}, 'replaced': {'type': 'boolean', 'description': 'Present with named deploys; true when an existing drop was replaced'}, 'expires_at': {'type': ['string', 'null'], 'description': 'ISO timestamp, or null when the drop never expires'}, '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.'}, 'password_protected': {'type': 'boolean'}}}
deploy_html
Deploy a single HTML page
Deploy 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.
파괴적 작업 외부 접근 가능
입력 스키마
{'type': 'object', 'required': ['html'], 'properties': {'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.'}, 'html': {'type': 'string', 'description': 'The full HTML document to publish.'}, '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.'}, 'agent': {'type': 'string', 'maxLength': 64, 'description': "Name of the AI agent or app publishing this drop, e.g. 'chatgpt', 'claude', 'cursor'. AI agents: always set this."}, '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', 'maxLength': 128, 'minLength': 8, '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.'}}}
출력 스키마
{'type': 'object', 'required': ['slug', 'url', 'files', 'plan', 'expires_at', 'password_protected'], 'properties': {'url': {'type': 'string'}, 'name': {'type': 'string'}, 'plan': {'type': 'string'}, 'slug': {'type': 'string', 'description': 'Drop slug; the site is live at https://<slug>.ship.place/'}, 'files': {'type': 'array', 'items': {'type': 'string'}}, 'replaced': {'type': 'boolean', 'description': 'Present with named deploys; true when an existing drop was replaced'}, 'expires_at': {'type': ['string', 'null'], 'description': 'ISO timestamp, or null when the drop never expires'}, '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.'}, 'password_protected': {'type': 'boolean'}}}
get_account
Get account info
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', 'required': ['accountId', 'plan', 'activeSubscription'], 'properties': {'plan': {'type': 'string', 'description': 'free | pro | team'}, 'cancelAt': {'type': ['string', 'null']}, 'accountId': {'type': 'string'}, 'portalAvailable': {'type': 'boolean'}, 'currentPeriodEnd': {'type': ['string', 'null']}, 'activeSubscription': {'type': 'boolean'}}}
get_limits
Get plan 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', 'required': ['plans'], 'properties': {'plans': {'type': 'object', 'description': 'Plan matrix: anonymous, pro, team'}, 'account': {'type': 'object', 'required': ['accountId', 'plan', 'activeSubscription'], 'properties': {'plan': {'type': 'string', 'description': 'free | pro | team'}, 'cancelAt': {'type': ['string', 'null']}, 'accountId': {'type': 'string'}, 'portalAvailable': {'type': 'boolean'}, 'currentPeriodEnd': {'type': ['string', 'null']}, 'activeSubscription': {'type': 'boolean'}}, 'description': 'Present when an sp_ API key was supplied'}}}
list_drops
List your drops
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', 'required': ['total', 'drops'], 'properties': {'drops': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'url', 'password_protected'], 'properties': {'url': {'type': 'string'}, 'name': {'type': ['string', 'null']}, 'slug': {'type': 'string'}, 'created_at': {'type': 'string'}, 'expires_at': {'type': ['string', 'null']}, 'file_count': {'type': 'integer'}, 'updated_at': {'type': 'string'}, 'redeploy_count': {'type': 'integer'}, 'password_protected': {'type': 'boolean'}}}}, 'total': {'type': 'integer'}}}
remove_drop_password
Remove a drop password
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', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'The drop slug (the subdomain part of its URL).'}}}
출력 스키마
{'type': 'object', 'required': ['slug', 'password_protected'], 'properties': {'slug': {'type': 'string'}, 'password_protected': {'type': 'boolean'}}}
restore_drop
Restore an expired drop
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', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'The drop slug (the subdomain part of its ${domain} URL).'}}}
출력 스키마
{'type': 'object', 'required': ['slug', 'restored', 'expires_at', 'url'], 'properties': {'url': {'type': 'string'}, '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'}}}
set_drop_password
Set a drop 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', 'required': ['slug', 'password'], 'properties': {'slug': {'type': 'string', 'description': 'The drop slug (the subdomain part of its URL).'}, 'password': {'type': 'string', 'maxLength': 128, 'minLength': 8, '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.'}}}
출력 스키마
{'type': 'object', 'required': ['slug', 'password_protected'], 'properties': {'slug': {'type': 'string'}, 'password_protected': {'type': 'boolean'}}}
변경됨
deploy_files
2026년 10월 1일 2:51 AM
변경됨
deploy_html
2026년 10월 1일 2:51 AM
변경됨
deploy_files
2026년 9월 29일 2:59 AM
변경됨
deploy_html
2026년 9월 29일 2:59 AM
변경됨
deploy_files
2026년 9월 19일 2:48 AM
변경됨
deploy_html
2026년 9월 19일 2:48 AM
추가됨
get_account
2026년 9월 17일 12:54 PM
추가됨
get_limits
2026년 9월 17일 12:54 PM
추가됨
remove_drop_password
2026년 9월 17일 12:54 PM
추가됨
set_drop_password
2026년 9월 17일 12:54 PM
추가됨
delete_drop
2026년 9월 17일 12:54 PM
추가됨
restore_drop
2026년 9월 17일 12:54 PM
추가됨
claim_drop
2026년 9월 17일 12:54 PM
추가됨
list_drops
2026년 9월 17일 12:54 PM
추가됨
append_files
2026년 9월 17일 12:54 PM
추가됨
deploy_files
2026년 9월 17일 12:54 PM
추가됨
deploy_html
2026년 9월 17일 12:54 PM