Local MCP server for shiply.now — publish a site to a live URL in one call. Wraps the public shiply REST API as MCP tools (no account needed to start).
This server presents 5 well-documented tools with complete input schemas, clear descriptions, and proper error handling. Tool naming follows verb_noun conventions (publish_site, site_status, rollback_site, add_custom_domain, check_custom_domain). All tool descriptions are substantive and action-oriented. Input schemas use Zod with type declarations and parameter descriptions. However, output schemas are not formally documented in the code, responses are stringified JSON without an explicit response structure contract. The tool descriptions emphasize prerequisites and operational guidance (e.g., 'NEVER create a new site to update an existing one'), which is excellent for LLM reasoning. Security is well-handled: API keys are injected via environment variables (SHIPLY_API_KEY) rather than required parameters, following the secret-injection pattern. Error handling provides actionable recovery guidance ('No files to publish', 'Upload failed for X: HTTP 500'). The main gap is the absence of formal output schemas, LLMs cannot verify what fields they'll receive before calling the tools.
Attach a custom domain to a site. Returns the domain record; point the hostname at cname.shiply.now and the certificate auto-issues. Poll readiness with check_custom_domain. Requires an API key.
Check whether a custom domain has finished provisioning (DNS + SSL). Returns ready:true once the site is serving on the domain. Read-only. Requires an API key.
Publish a website to shiply.now and get back a live URL — in one call, no account needed to start. Pass `files` (inline) or a local `dir`. Anonymous sites go live instantly and last 24 hours; the response includes a claimUrl to keep the site forever on a free account. NEVER create a new site to update an existing one — re-publish to the SAME site by passing its `claimToken` (anonymous) or `slug` (owned, requires an API key).
Flip a previously-published version of a site live again, instantly. Every publish is a version; pass the versionId to roll back to. Requires an API key (owned sites only).
Look up a published shiply.now site by slug: whether it is live, anonymous vs owned, when it expires, and its public URL. Read-only.
Output schemas are not formally documented. Code returns JSON via `ok()` helper (stringified), but no type contract (response shape, field names, required vs optional) is declared in tool definitions. LLMs cannot predict what fields they'll receive before calling, forcing runtime discovery or guessing.
add_custom_domain and check_custom_domain form a polling workflow (attach domain, then poll readiness), but neither tool description hints at the other's existence. An LLM may call add_custom_domain and not know to follow up with check_custom_domain, blocking the workflow.
No pagination support declared. publish_site accepts file arrays and directory paths, but scalability limits are not stated. If a directory contains thousands of files, behavior is undefined (does it fail? Cap at N files?). Site listing/history tools are also absent, no way to enumerate or filter prior publishes.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 64 | 2026-07-28+ | v2 |