Server providing Argo CD integration for MCP clients.
Shiply is installed from its publisher's own source and answers where it runs, so this marketplace is not in the path of a single call. There is no address here to send one to, and a panel that pretended otherwise would be showing you an answer we made up. Install it and call it from your own client — the Installation tab has the entry for each one.
What it does
Publish any app in one call: SQL database, functions, email, and a custom domain. Flat price.
Quickstart
# 1 — add it to Claude Code
claude mcp add --scope user --transport http shiply-mcp https://shiply.now/mcp
# 2 — ask your agent for something these tools do
# publish_site, site_status, verify_site and 111 more
Shiply costs nothing on mcprush: there is no plan to choose here, no cap to set and nothing mcprush can bill you for.
Collected from a public index. Nobody has claimed this account, so nothing here was written by its author — claim it if it is yours.
Where are you running it?
Every route below installs the same thing and ends at the same approval screen. Nothing here runs on your machine and nothing runs on ours: this server answers at its publisher’s own address, and what you install is the connection straight to it.
This is a public server: it answers at its publisher’s own address and this marketplace is not in the path. Claude Code registers it in one command; --scope user makes it available in every project. The transport below is http, as the publisher's own manifest declares it.
claude mcp add --scope user --transport http shiply-mcp https://shiply.now/mcpReconnect, or start a new session, and the tools appear in the model’s tool list.
One config entry pointing straight at the publisher’s own address — this marketplace is not in the path, and nothing from this listing executes on your machine.
114 tools, with what each one reads, writes and reaches shown before you agree — the same list on every route above. Read the tool surface.
Tool surface
What the model actually sees. Descriptions are diffed on every release — see version history.
Publish files to the web → live URL at <slug>.shiply.now. UPDATING: never create a new site for changes — re-call with claimToken (anonymous sites) or slug (sites you own with a Bearer key) and the SAME URL gets the new version. Unchanged files are hash-skipped server-side, so re-publishing (including retrying a failed publish) is cheap — always update the same site rather than creating a new one.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| files | array | yes | site files; index.html required for a homepage |
| spaMode | boolean | no | serve index.html for unknown paths (client-side routing) |
| claimToken | string | no | UPDATE an existing anonymous site (from the original publish result) |
| slug | string | no | UPDATE an existing site you own (requires Bearer key) |
| title | string | no | display title for the site |
| agentName | string | no | label shown during the automatic account re-auth flow |
| client | object | no | optional: file this under a client (the publish/site is grouped in their customer view) |
Check any shiply slug or custom hostname: TLS certificate (issuer, days left) + HTTPS probe. ready=true means live.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| target | string | yes | slug (my-site) or hostname (www.example.com) |
Edge-check a shiply slug or custom hostname and return a structured readiness report: status (LIVE/PENDING), SSL details (valid, issuer, daysLeft), HTTP probe, and a presigned thumbnail URL when available. Use this after publishing to confirm the site is reachable.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| target | string | yes | slug (my-site) or hostname (www.example.com) |
List the sites owned by this API key. Optional clientId filters to one client.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| clientId | string | no | only sites filed under this client |
Site settings + version history for one of my sites.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug, e.g. my-site |
PERMANENTLY delete a site and all stored files. Irreversible — confirm with the user first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug to delete |
Re-point a site to any finalized version (rollback or roll-forward). Get version ids from get_site. Serving updates immediately.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug to re-point |
| versionId | string | yes | finalized version id from get_site |
List a site's finalized deploys newest-first (id, createdAt, isLive, fileCount, bytes), capped at 20. Pair with rollback_site: pick a version id from here and re-point the site to it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug to list deploys for |
Download the current files of a site you own (or created via a platform connection) so you can edit and republish to the same slug with publish_site. Static sites return editable source; framework/SSR sites return the built bundle (.shiply/bundle/*), not original source.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug to pull files for |
Give ONE site a vanity URL: rename it to <handle>.shiply.now (3-30 chars, a-z 0-9 -). The old address 301-redirects for 30 days. (For a portfolio page listing all your sites, use set_profile instead — that lives at shiply.now/@<handle>.)
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | current site slug |
| handle | string | yes | new vanity handle, 3-30 chars a-z 0-9 - |
Server-side copy of an owned site under a new slug — instantly live. Copies files + title; does NOT copy access settings, domains, or data. Great for iterating on variants.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug to copy |
| title | string | no | display title for the new copy (defaults to source title) |
Copy the EXACT live bytes of one owned site (srcSlug — your preview) into another owned site (destSlug — your production site / custom domain), no rebuild. Dest keeps its slug, domains, and access settings; only the served bytes change.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| srcSlug | string | yes | — |
| destSlug | string | yes | — |
Path-mounting: serve an owned target site at a path on an owned host site (host/docs -> target). location is a path like "docs", or "__root__" for the host root. Both sites must be owned by you. Pass remove=true to unmount.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| hostSlug | string | yes | slug of the owned host site |
| location | string | yes | path to mount at, e.g. "docs", or "__root__" for the host root |
| targetSlug | string | no | slug of the owned site to serve there (required unless remove=true) |
| remove | boolean | no | unmount instead of mounting |
Protect an owned site (paid plans). mode 'public' (anyone), 'password' (supply password), or 'restricted' (supply allowedEmails and/or allowedDomains — only those can request a login code). Changing any setting signs out existing visitors.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | owned site slug to protect |
| mode | string | yes | public = anyone; password = supply password; restricted = supply allowedEmails/allowedDomains |
| password | string | no | required when mode='password' |
| allowedEmails | array | no | allowlisted emails when mode='restricted' |
| allowedDomains | array | no | allowlisted email domains when mode='restricted' |
Read an owned site's current access policy (mode: public/password/restricted, allowedEmails, allowedDomains, hasPassword). Read-only counterpart to set_site_access — check before changing it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | owned site slug |
Return a JSON bundle of the user's profile, sites, Site Data, drives, and metadata (secrets excluded). Data portability.
No parameter schema on file.
Who am I? Returns the signed-in account: email, @handle, plan + limits, counts of sites/domains/drives, and connected DNS providers. Call this first to orient before managing sites or domains.
No parameter schema on file.
Get the signed-in account's plan, capabilities, and upgrade URL. Call this FIRST when figuring out what features you have access to — it tells you exactly what's available and what's blocked. The upgrade_url is human-clickable; show it in chat when a feature requires a higher plan. Returns plan id + name + subscription status, hard limits (sites, databases, custom domains, drives), and a capabilit
No parameter schema on file.
List the user's private cloud Drives (id, name). Optional clientId filters to one client.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| clientId | string | no | only drives filed under this client |
Create a private cloud Drive (plan-limited). Pass client to file it under a client.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | display name for the new drive |
| client | object | no | optional: file this under a client (the publish/site is grouped in their customer view) |
List files in a Drive (driveId = drv_…, or "default"). Optional prefix filter.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| driveId | string | yes | drive id (drv_…) or "default" |
| prefix | string | no | only list files under this path prefix |
Write a file into a Drive (driveId = drv_… or "default"). content is utf8 or base64. Use for agent memory, notes, context, assets.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| driveId | string | yes | drive id (drv_…) or "default" |
| path | string | yes | destination path inside the drive, e.g. notes/context.md |
| content | string | yes | file contents (utf8 text, or base64 when encoding=base64) |
| encoding | string | no | default utf8; base64 for binary |
Delete a file from a Drive.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| driveId | string | yes | drive id (drv_…) or "default" |
| path | string | yes | path of the file to delete |
Snapshot a Drive (or a prefix of it) into a new live site at <slug>.shiply.now. Files copied server-side.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| driveId | string | yes | drive id (drv_…) or "default" |
| title | string | no | display title for the new site |
| prefix | string | no | only snapshot files under this path prefix |
Create or update the user's public PORTFOLIO page at shiply.now/@<handle> (handle 3-30 chars a-z0-9-) — a landing page listing the user's sites. This is NOT a site's address: to give one site a vanity URL like <handle>.shiply.now, use set_handle instead. enable shows the profile; autoAdd auto-lists new sites. Use after publishing to give the user a shareable portfolio.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| handle | string | no | public portfolio handle, 3-30 chars a-z 0-9 -; portfolio lives at shiply.now/@<handle> (a page listing your sites — not a site URL; for a site vanity URL use set_handle) |
| enable | boolean | no | show (true) or hide (false) the public profile |
| autoAdd | boolean | no | auto-list newly published sites on the profile |
Toggle whether an owned, public site appears in the public shiply Explore gallery (https://shiply.now/explore). Only public-access sites are eligible.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | owned, public site slug |
| show | boolean | yes | true to feature on Explore, false to remove |
Upsert a key/value in the user's encrypted variable store (UPPER_SNAKE name, ≤8 KiB value). Use for API keys the user's sites/agents need, e.g. SUPABASE_URL. NOTE: saving alone does NOT expose it to any site Worker's env — attach it to a specific site with attach_variable (takes effect on that site's next function deploy).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | variable name, UPPER_SNAKE_CASE, e.g. SUPABASE_URL |
| value | string | yes | value to store (encrypted, ≤8 KiB) |
List the encrypted variables. Values are masked unless reveal=true.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| reveal | boolean | no | return plaintext values instead of masked |
Remove one variable by name.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | variable name to delete |
Expose one saved variable to ONE owned site's Worker env (plain_text binding). Opt-in per site — unattached variables are never injected, because the Worker runs the site's own code. Takes effect on the site's next function deploy.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | owned site slug |
| name | string | yes | variable name to attach, e.g. SUPABASE_URL |
Stop exposing a variable to a site's Worker env. Takes effect on the site's next function deploy.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | owned site slug |
| name | string | yes | variable name to detach |
Names of the variables attached to an owned site's Worker env (values never shown here).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | owned site slug |
List the SQL databases (D1 or Neon Postgres) on my account, including which owned site (if any) each is attached to. Call this BEFORE db_query/db_schema-style work to discover a databaseId — those live on a per-database MCP server reached via GET /api/v1/databases/{id} (see llms.txt), which this id feeds.
No parameter schema on file.
Provision a SQL database — D1 (default, free) or Neon Postgres (--postgres, developer plan). Optionally attach it to an owned site's Worker env in the same call (siteSlug); otherwise attach it later with attach_database.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| name | string | yes | database name, a-z 0-9 -, 2-63 chars |
| provider | string | no | defaults to d1 |
| siteSlug | string | no | owned site slug to attach immediately |
| binding | string | no | Worker binding name, UPPER_SNAKE (defaults to a name derived from name) |
PERMANENTLY delete a database and all its data. Irreversible — confirm with the user first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | database id (from list_databases) |
Bind an existing database to one owned site's Worker env (the binding name chosen at create_database time). Takes effect on the site's next function/publish deploy.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | database id (from list_databases) |
| siteSlug | string | yes | owned site slug |
List collections declared in an owned site's .shiply/data.json with current record counts. Empty list means the site has no manifest yet — scaffold one with shiply data init.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | owned site slug |
Page records from an owned site's collection, newest-first. limit ≤ 200 (default 50). cursor from a previous response's nextCursor.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | owned site slug |
| collection | string | yes | collection name from data_list_collections |
| limit | integer | no | max records to return, ≤200 (default 50) |
| cursor | string | no | nextCursor from a previous response's page |
Insert one record into a collection. Goes through the same public visitor endpoint a browser would use — manifest access.insert decides whether it is allowed. Use to seed waitlist data, test forms end-to-end, etc.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | owned site slug |
| collection | string | yes | collection name to insert into |
| record | object | yes | the record fields to insert as key/value pairs |
Return up to limit records (default 1000, max 5000) from a collection — for snapshotting into agent context. For larger sets use the CLI: shiply data export <slug> <collection>.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | owned site slug |
| collection | string | yes | collection name to export |
| limit | integer | no | max records to return (default 1000, max 5000) |
Serve a site on a domain the user owns. Returns the CNAME to add (hostname → cname.shiply.now); the certificate issues automatically once DNS resolves. Poll with check_domain.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| hostname | string | yes | full hostname to serve, e.g. www.example.com |
| slug | string | yes | owned site slug to serve there |
Register a registrable domain (e.g. example.com) the user owns and detect its DNS provider. Returns the provider and whether one-click connect is available. Then attach sites with add_subdomain.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | registrable domain you own, e.g. example.com |
Serve an owned site at <subdomain>.<domain> (use subdomain "@" or "" for the apex — apex needs a provider with CNAME flattening/ALIAS, e.g. Cloudflare). Auto-registers the parent domain. Returns the CNAME record to add (host -> cname.shiply.now); the certificate issues automatically once DNS resolves. Poll with check_domain.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | registrable parent domain, e.g. example.com |
| subdomain | string | yes | subdomain label, or "@"/"" for the apex |
| slug | string | yes | owned site slug to serve there |
Mark a hostname as the primary (canonical) URL for its site. Sibling hostnames (apex + www both pointed at the same site) start 301-redirecting to it, preserving path + query. The host-side fix for the duplicate-content SEO problem. The first subdomain you add for a site is primary by default; call this only when you need to switch.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | registered custom domain, e.g. example.com |
| hostname | string | yes | full hostname to make primary, e.g. www.example.com |
List registered custom domains grouped with their subdomains, each subdomain's site and status, and the detected provider.
No parameter schema on file.
Start one-click DNS connect for a registered custom domain. For Cloudflare-hosted domains this returns an authorize URL — SHOW THE USER the url as a clickable link; after they authorize, records are written automatically. For other providers, add the records manually.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | registered custom domain to connect, e.g. example.com |
For a connected custom domain, (re)write the CNAME records for all its subdomains automatically and report what changed. For unconnected domains, returns the records to add manually.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | registered custom domain to sync, e.g. example.com |
Check whether a custom domain's subdomains are live: re-polls Cloudflare cert status + probes DNS/TLS/HTTPS on each subdomain. Poll this after connect_provider / add_subdomain to confirm the domain is serving. Returns per-subdomain status + tls + http + ready.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | registered custom domain to check, e.g. example.com |
Remove a registered custom domain and all its subdomains; they stop serving immediately.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | registered custom domain to remove, e.g. example.com |
List connected custom domains with status.
No parameter schema on file.
Refresh certificate status + live TLS/HTTPS probe for a connected domain (by id from list_domains).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | connected domain id from list_domains |
Remove a connected domain (by id). It stops serving immediately.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | connected domain id from list_domains |
Daily page views per site for the last 30 days.
No parameter schema on file.
Provision a demand test in one call: deploys a landing page with a native email-capture form and creates a confirmed-subscriber segment. Returns testId + live siteUrl. Share the siteUrl to collect signups; each signup gets a double-opt-in confirmation. Read progress with get_test_status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| idea | string | yes | the product/idea name |
| headline | string | yes | landing-page headline |
| sub | string | no | subheadline / supporting line |
| cta | string | no | call-to-action button label |
| price | string | no | price to display, e.g. "$29/mo" |
List your demand tests with signups + confirmed counts.
No parameter schema on file.
ONE consolidated object: page funnel (views, signups, confirmed, conversion) ⊕ email events (delivered/opened/clicked/bounced) ⊕ a computed verdict. The single place to check progress — never query email separately.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| testId | string | yes | demand test id from create_test / list_tests |
Send a campaign to this test's confirmed (double-opt-in) subscribers — the "we're live" email. An unsubscribe link is added automatically. Fails if there are no confirmed subscribers yet.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| testId | string | yes | demand test id whose confirmed subscribers to email |
| subject | string | yes | email subject line |
| html | string | yes | email HTML body (unsubscribe link added automatically) |
| text | string | no | plain-text fallback body |
Re-send the double-opt-in confirmation to a signup that has not confirmed yet.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| testId | string | yes | demand test id the signup belongs to |
| string | yes | the unconfirmed signup email to re-send to |
Confirm a pairing code shown in the user's browser at https://shiply.now/claim/<slug>?pair=1. Use ONLY in the agent session that originally published the site — it reads the claimToken from .shiply.json in the current working directory and proves to Shiply that this agent session is authorised to claim the site. After verification the user is auto-redirected to /welcome and the site binds to their
| Parameter | Type | Required | Notes |
|---|---|---|---|
| code | string | yes | the SHIPLY-XXXXXXXX code in the user's browser |
List the user's email inbox threads (outbound demand-test sends + inbound replies / unsubscribes / complaints / bounces). Filter by tag.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| filter | string | no | default all |
| limit | integer | no | max threads to return, ≤200 |
| offset | integer | no | number of threads to skip (pagination) |
Return the thread metadata + all messages in chronological order. Use list_inbox first to get a threadId.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| threadId | string | yes | thread id from list_inbox |
One-paragraph summary of the thread, oriented to the most actionable signal (interest, complaint, question, unsubscribe).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| threadId | string | yes | thread id from list_inbox |
Send an email reply on an existing thread. Goes FROM the original recipient address (the <slug>@shiply.now alias the sender used) and TO the original sender. Threaded via RFC 5322 In-Reply-To so Gmail/Outlook group it with the original. Subject defaults to 'Re: <original>' when omitted. Cap at 20,000 chars. Use after read_thread to make sure you're replying to the right conversation.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| threadId | string | yes | thread id from list_inbox to reply on |
| body | string | yes | reply body, ≤20,000 chars |
| subject | string | no | subject; defaults to 'Re: <original>' |
Zero the unread counter for a thread. Useful after the agent has read but not acted. read_thread already calls this implicitly; use this explicitly when you want to clear unread without re-fetching the thread body.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| threadId | string | yes | thread id from list_inbox to mark read |
Soft-archive the thread (sets archivedAt). Hidden from the default inbox view; surface again with list_inbox filter=archived. Reverse with unarchive_thread.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| threadId | string | yes | thread id from list_inbox to archive |
Restore an archived thread (clears archivedAt). It reappears in the default inbox list. Pair with list_inbox filter=archived to find archived threadIds first.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| threadId | string | yes | archived thread id to restore |
Forward a message from a thread (default: the most recent message) to a NEW recipient with an optional intro note. Body is composed as note + standard '---------- Forwarded message ----------' quote of the original. Goes from the thread's existing shiply alias so replies still route through the inbox. Subject defaults to 'Fwd: <original>'.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| threadId | string | yes | thread id from list_inbox to forward from |
| to | string | yes | new recipient email address |
| messageId | string | no | specific message to forward (default: most recent) |
| subject | string | no | subject; defaults to 'Fwd: <original>' |
| note | string | no | intro note prepended above the forwarded quote |
Return every active demand test's reply / inbound address (<slug>@<sitesDomain>). Use this when you need to TELL someone where to email — e.g. drafting a reply or sharing a test's contact address. Mail sent to these aliases lands in /dashboard/inbox tied to the test.
No parameter schema on file.
Shortcut for list_inbox with filter=unsubscribes — shows every thread tagged as an opt-out request.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | max threads to return, ≤200 |
Return the user's suppression list — addresses (and full domains) that shiply skips when sending. Bounces, complaints, manual user adds, and AI-detected unsubscribes all land here.
No parameter schema on file.
Add an address (or whole domain) to the user's suppression list. Future confirmations and broadcasts will skip it across every test. Use kind='email' for a single address, kind='domain' for everyone @example.com.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| kind | string | yes | 'email' for one address, 'domain' for everyone @example.com |
| value | string | yes | e.g. 'spammy@example.com' or 'competitor.com' |
| notes | string | no | optional reason / note for the suppression |
Delete one suppression by id. Use list_suppressions first to find the id.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| suppressionId | string | yes | suppression id from list_suppressions |
Return threads tagged as complaints (spam reports) OR bounces (recipient rejected). Read these before any further sending.
No parameter schema on file.
List the dev's customer-intake projects (newest first). Optional filters: status (draft|intake_open|brief_ready|brief_failed|archived), q (case-insensitive match on label or customer email), limit (default 100). Use to triage what's in flight before opening a specific project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| status | string | no | filter by project status |
| q | string | no | case-insensitive match on label or customer email |
| clientId | string | no | only projects filed under this client |
| limit | integer | no | max projects to return (default 100) |
Spin up a new customer-intake project on the dev's account. Returns the project row plus intakeUrl — the public link the customer fills out (10-step wizard). If customerEmail is provided, shiply also emails them the intake invite. Use originatedFromSiteId to link a project to an existing site (e.g. 'redesign this site').
| Parameter | Type | Required | Notes |
|---|---|---|---|
| label | string | yes | project name shown in the dev dashboard |
| customerName | string | no | the customer's name |
| customerEmail | string | no | customer email; if set, shiply emails them the intake invite |
| originatedFromSiteId | string | no | link this project to an existing site (e.g. a redesign) |
Read one of the dev's projects by id — includes label, status, customer details, intake responses, AI brief, drive folder. Use before update_brief / regenerate_brief.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | project id |
Overwrite the project's working brief (jsonb). Hard-capped at 500 KB. Use to revise the AI-generated brief by hand; the original AI output is preserved separately in briefAiOriginal so you can always compare. Does not change status.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | project id |
| brief | object | yes | the full replacement brief object (jsonb, ≤500 KB) |
Re-run the MiniMax/Anthropic brief generator from the project's current intake_responses and persist the result. Flips status to brief_ready on success or brief_failed on error. Use after the customer edits answers post-submit, or when the first AI attempt failed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | project id to re-run the brief for |
Move a project to status='archived'. Hidden from the default dashboard list. Optional reason is shown on the project page. Restore later with restore_project.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | project id to archive |
| reason | string | no | optional reason shown on the project page |
Move an archived project back to status='draft' so it reappears in the active list. Idempotent on non-archived projects? No — server rejects the transition unless the project is currently archived.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | archived project id to restore |
Return the customer-uploaded files for one project (path, size, contentType, createdAt). Empty when no drive folder exists yet (no uploads). Use to inspect what intake assets the customer attached.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | project id whose uploaded files to list |
Re-fire the 'your developer sent you a project intake' email to the project's customer. Throws invalid_request if the project has no customerEmail (the dev needs to set one via the dashboard first — customer email isn't agent-patchable). Use when the customer says they didn't receive the link.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | project id to re-send the intake invite for |
Return every marketplace listing the seller owns (any status: draft, live, paused, sold). Includes site slug and current price. Use to see what's for sale across the account.
No parameter schema on file.
Publish (or upsert) a marketplace listing for an owned site. Requires Stripe Connect set up (status='ready' — see get_connect_status). priceCents = whole-dollar between 100 and 999900. termsMode='standard' uses shiply's template; 'custom' requires termsCustom ≥50 chars. jurisdiction is required (e.g. 'California, USA').
| Parameter | Type | Required | Notes |
|---|---|---|---|
| siteSlug | string | yes | slug of the owned site to list |
| priceCents | integer | yes | whole-dollar price in cents, 100–999900 |
| pitch | string | no | short sales pitch, ≤280 chars |
| termsMode | string | yes | 'standard' uses shiply's template; 'custom' requires termsCustom |
| termsCustom | string | no | custom terms text, ≥50 chars, required when termsMode='custom' |
| jurisdiction | string | yes | governing jurisdiction, e.g. 'California, USA' |
| status | string | no | publish state (default draft) |
Patch a listing by siteSlug — change price, pitch, terms, jurisdiction, or status (draft|live|paused). Sold listings cannot be edited. Status transitions enforced server-side. Use to pause sales or drop the price.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| siteSlug | string | yes | slug of the listed site to patch |
| priceCents | integer | no | new whole-dollar price in cents, 100–999900 |
| pitch | no | new sales pitch (null to clear) | |
| termsMode | string | no | 'standard' template or 'custom' terms |
| termsCustom | no | new custom terms text (null to clear) | |
| jurisdiction | string | no | governing jurisdiction, e.g. 'California, USA' |
| status | string | no | new listing status |
Take a listing off the public marketplace by moving it to status='draft'. Marketplace v1 keeps the row so analytics + future re-listing work — there's no hard delete. Sold listings can't be modified. Use to stop accepting offers without losing pricing history.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| siteSlug | string | yes | slug of the listed site to unpublish |
Return every marketplace order for sites the user sold (incl. pending, paid, refunded, failed, disputed). Most recent first. Use to surface revenue + which orders are still inside the 30-day refund window (refundExpiresAt > now).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | max orders to return (default 100, max 500) |
Return every marketplace order the user PURCHASED. Most recent first. Shows the acquired site, paid amount, and whether the order is still inside the 30-day refund window. Use to recap what the user owns by purchase.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| limit | integer | no | max orders to return (default 100, max 500) |
Issue a full refund on a paid order the user sold. Must be inside the 30-day refund window (server enforces). Triggers a Stripe refund; the webhook flips the order to 'refunded' and reverts site ownership to the seller. Idempotent on already-refunded orders.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| orderId | string | yes | id of the paid order to refund (from list_my_sales) |
| reason | string | no | optional refund reason |
Return the seller's Stripe Connect state: not_started | in_progress | pending_verification | ready | disabled. When status != 'ready' the user can't list sites. Includes a one-shot onboardingUrl (if not_started or in_progress) and dashboardUrl (if ready). Refreshes from Stripe on every call.
No parameter schema on file.
Return every BYO sending domain the user has added (id, domain, fromAddress, status: pending|verified|failed, DNS records). Use to inspect verification state or find the id of a domain to verify/remove.
No parameter schema on file.
Register a domain the user owns for outbound demand-test sends. Returns DNS records (SPF, DKIM, MX) to add at the DNS provider. After DNS propagates, call verify_sending_domain. Cannot be a shiply.now subdomain.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| domain | string | yes | e.g. mail.yourbrand.com |
Trigger Resend to re-check the domain's DNS records, persist the new status. Call after adding the DNS records returned by add_sending_domain. Status flips to 'verified' once SPF + DKIM + MX all check out.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | sending domain id from list_sending_domains |
Delete a BYO sending domain. Any demand tests bound to it fall back to the managed shiply sender. Also GCs the underlying Resend domain. Irreversible — re-adding requires re-verifying DNS.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| id | string | yes | sending domain id from list_sending_domains |
Draft a contract from a brief_ready project. Auto-fills 8 fields from the AI brief, Stripe Connect default currency, and dev profile. Returns the contract row with status='draft' so the dev can review fields before sending. After this, edit fields via PATCH /api/v1/contracts/{id} (no MCP edit tool yet), then call contract_send to fire it.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| projectId | string | yes | Project to draft a contract for |
Send a draft contract to the customer. Validates all 8 fields are non-empty, computes content_hash, flips project to contract_sent, fires the customer email. Same handler works for amendment drafts — sending an amendment does not move project state.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| contractId | string | yes | draft contract id to send (from contract_draft) |
Create an amendment to a SIGNED parent contract. Scope delta required; fee delta and target date optional. Returns the draft amendment for editing before send — call contract_send with the returned amendment id to fire it. Cannot amend an amendment (amend the parent instead).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| parentContractId | string | yes | id of the SIGNED parent contract to amend |
| scopeDelta | string | yes | What's changing — visible to customer. |
| feeDeltaCents | integer | no | Optional fee adjustment in cents. Can be negative for descope. |
| targetCompletionDate | string | no | Optional ISO date (YYYY-MM-DD) for revised completion. |
Get the signed contract PDF as a base64-encoded download. PDF includes the contract, signature certificate, and any signed amendments. Returns { filename, contentType, base64 }. Errors with conflict:contract_not_signed if the parent contract has not been signed yet.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| contractId | string | yes | signed contract id (parent or amendment) to render as PDF |
Read the current state of a contract: status, sent_at, viewed_at, signed_at, signer info, content_hash, plus any amendments. Use this to check whether a customer has signed yet. Returns { contract, amendments } — the contract row matches GET /api/v1/contracts/{id}.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| contractId | string | yes | contract id to read state for |
Deploy a Worker function to a site. The function runs on every request to <slug>.shiply.now and can receive webhooks, run on cron triggers, and access bindings (D1, secrets, env vars). Requires Developer plan. Use when the user wants webhook receivers, cron jobs, or a backend for their site.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug to deploy the function to |
| source | string | yes | the Worker source code |
| lang | string | no | source language (default js) |
| crons | array | no | cron triggers to register, ≤20 |
Return the deployed function source + metadata for a site, or null if no function deployed.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug whose function to fetch |
Remove the deployed Worker function from a site (and all its routes, secrets, and cron triggers). Site falls back to static-only serving. Irreversible.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug whose function to remove |
Set a CF Worker secret on a site's deployed function. Value is encrypted-at-rest and accessible as env.<NAME> inside the worker. Use for Stripe keys, Resend API keys, etc.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug whose function gets the secret |
| name | string | yes | secret name, UPPER_SNAKE_CASE; available as env.<NAME> |
| value | string | yes | secret value (encrypted at rest), ≤8 KiB |
List secret names (values not returned) for a site's deployed function.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug whose secret names to list |
Remove a secret from a site's deployed function. The binding disappears on next request.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug whose function holds the secret |
| name | string | yes | secret name to remove |
List cron triggers for a site's deployed function. Each cron is (path, schedule, lastRunAt).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug whose cron triggers to list |
Set or update a cron trigger on a site's deployed function. Schedule is crontab syntax (UTC). Path is the URL the cron handler should fire on (for the worker's scheduled() handler context).
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug whose function gets the cron |
| path | string | yes | URL path the cron handler fires on |
| schedule | string | yes | crontab schedule in UTC, e.g. "0 * * * *" |
Remove a cron trigger from a site's deployed function.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug whose cron to remove |
| path | string | yes | URL path of the cron to remove |
Read recent runtime logs for a site's per-site Worker (console output, request summaries, exceptions) from Cloudflare Workers Observability — 7-day retention, newest first. Use this to debug a deployed function: each event has timestamp, level, message, outcome, statusCode, requestId, and CPU/wall time. Also returns a CF dashboard deep-link.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug whose function logs to read |
| limit | integer | no | max events to return (default 50) |
| since | integer | no | look back this many minutes (default 60, max 10080 = 7 days) |
Send an email from <slug>.shiply.now's managed sender. The site can send transactional/notification email — no SMTP setup. Rate-limited and spam-checked; replies route back to the site inbox.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug to send from (<slug>.shiply.now sender) |
| to | string | yes | recipient email address |
| subject | string | yes | email subject line |
| html | string | yes | email HTML body |
| text | string | no | plain-text fallback body |
Read the email threads (received, sent, web captures) for the agent's sites. Optionally scoped to one site by slug.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | no | limit to one site by slug; omit for all sites |
Turn a Site Data collection into a mailbox: double opt-in, owner notifications, sending domain, branding. Call once per (site, collection) to configure how captured leads are handled.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug the collection belongs to |
| collection | string | yes | Site Data collection to turn into a mailbox |
| doubleOptIn | boolean | no | require email confirmation before a contact is active |
| notifyOwner | boolean | no | email the owner on each new capture |
| notifyTo | string | no | address to send owner notifications to |
| sendingDomainId | string | no | BYO sending domain id to send from |
| branding | object | no | branding applied to mailbox emails |
List captured contacts for a (site, collection) mailbox, optionally filtered by status (signed_up/confirmed/unsubscribed). Returns email, status, confirmedAt, createdAt, and captured fields.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug the mailbox belongs to |
| collection | string | yes | mailbox collection name |
| status | string | no | filter contacts by status |
Send a one-shot broadcast to the confirmed (double-opt-in) subscribers of a (site, collection) mailbox. Spam-checked; unsubscribe footer auto-added. Fails if no confirmed subscribers exist yet.
| Parameter | Type | Required | Notes |
|---|---|---|---|
| slug | string | yes | site slug the mailbox belongs to |
| collection | string | yes | mailbox collection whose confirmed audience to email |
| subject | string | yes | email subject line |
| html | string | yes | email HTML body (unsubscribe footer added automatically) |
| text | string | no | plain-text fallback body |
- Every tool — any call limit is its publisher’s, not ours
- No card, and mcprush charges nothing for it
- Runs at its publisher’s own address — this marketplace is not in the path
- Nothing to cap, because mcprush bills nothing
What counts against your monthly calls
| Tool | Unit | Calls used | Out of the allowance |
|---|
Nothing here is billable: mcprush charges nothing to install Shiply or to call it, at any volume.
Two independent axes, because powerful and malicious are different questions. The grade is threat only. The capability level is blast radius, and it is never a penalty on the grade — it is priced as one subtract-only term in the score, where you can see it.
This listing is an address its publisher runs, and you connect to it directly — this marketplace is not in the path. The scanner reads packages and public source, and an address is neither. So there is no grade — not a withheld one, an unmeasured one.
Release history
This is an address its publisher runs: which release it serves is theirs to choose, so there is nothing here to pin. The history below is for reading; the current release on file is 1.1.0.
No release note was published with this version.
One review per account, from a signed-in account that does not publish this listing. Nothing else is asked — you can say what you think before you install it. Publishers can reply once per review, and a review can be edited or deleted by whoever wrote it.
Any signed-in account that does not publish Shiply can review it, once — before installing it or after. A review from an account that has installed it is marked as one.
Nobody has reviewed this listing. The rating on the card is the mean of the reviews written here and nothing else, so there is no rating until somebody writes the first — which takes a signed-in account that does not publish it, and nothing else.