{"server":"now.shiply/shiply","count":100,"tools":[{"name":"add_custom_domain","title":"Register a custom domain","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["domain"],"properties":{"domain":{"type":"string","description":"registrable domain you own, e.g. example.com"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"add_domain","title":"Connect a custom domain","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["hostname","slug"],"properties":{"slug":{"type":"string","description":"owned site slug to serve there"},"hostname":{"type":"string","description":"full hostname to serve, e.g. www.example.com"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"add_sending_domain","title":"Add a sending domain","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["domain"],"properties":{"domain":{"type":"string","description":"e.g. mail.yourbrand.com"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"add_subdomain","title":"Point a subdomain at a site","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["domain","subdomain","slug"],"properties":{"slug":{"type":"string","description":"owned site slug to serve there"},"domain":{"type":"string","description":"registrable parent domain, e.g. example.com"},"subdomain":{"type":"string","description":"subdomain label, or \"@\"/\"\" for the apex"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"add_suppression","title":"Suppress an email or domain","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["kind","value"],"properties":{"kind":{"enum":["email","domain"],"type":"string","description":"'email' for one address, 'domain' for everyone @example.com"},"notes":{"type":"string","description":"optional reason / note for the suppression"},"value":{"type":"string","description":"e.g. 'spammy@example.com' or 'competitor.com'"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"archive_project","title":"Archive a project","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"project id to archive"},"reason":{"type":"string","maxLength":500,"description":"optional reason shown on the project page"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"archive_thread","title":"Archive a thread","description":"Soft-archive the thread (sets archivedAt). Hidden from the default inbox view; surface again with list_inbox filter=archived. Reverse with unarchive_thread.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["threadId"],"properties":{"threadId":{"type":"string","description":"thread id from list_inbox to archive"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"attach_database","title":"Attach a database to a site","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id","siteSlug"],"properties":{"id":{"type":"string","description":"database id (from list_databases)"},"siteSlug":{"type":"string","description":"owned site slug"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"attach_variable","title":"Attach a variable to a site","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","name"],"properties":{"name":{"type":"string","description":"variable name to attach, e.g. SUPABASE_URL"},"slug":{"type":"string","description":"owned site slug"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"check_custom_domain","title":"Check a custom domain","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["domain"],"properties":{"domain":{"type":"string","description":"registered custom domain to check, e.g. example.com"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"openWorldHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"check_domain","title":"Check a custom domain","description":"Refresh certificate status + live TLS/HTTPS probe for a connected domain (by id from list_domains).","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","description":"connected domain id from list_domains"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true,"openWorldHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"connect_provider","title":"Connect the domain's DNS provider","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["domain"],"properties":{"domain":{"type":"string","description":"registered custom domain to connect, e.g. example.com"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"contract_amend","title":"Create an amendment to a signed contract","description":"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).","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["parentContractId","scopeDelta"],"properties":{"scopeDelta":{"type":"string","maxLength":20000,"minLength":1,"description":"What's changing — visible to customer."},"feeDeltaCents":{"type":"integer","maximum":1000000000,"minimum":-1000000000,"description":"Optional fee adjustment in cents. Can be negative for descope."},"parentContractId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"id of the SIGNED parent contract to amend"},"targetCompletionDate":{"type":"string","description":"Optional ISO date (YYYY-MM-DD) for revised completion."}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"contract_draft","title":"Draft a contract from a brief_ready project","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["projectId"],"properties":{"projectId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"Project to draft a contract for"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"contract_pdf","title":"Get the signed contract PDF (base64)","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["contractId"],"properties":{"contractId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"signed contract id (parent or amendment) to render as PDF"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"contract_send","title":"Send a draft contract to the customer","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["contractId"],"properties":{"contractId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"draft contract id to send (from contract_draft)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"contract_status","title":"Read contract state + amendments","description":"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}.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["contractId"],"properties":{"contractId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"contract id to read state for"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"create_database","title":"Create a database","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["name"],"properties":{"name":{"type":"string","description":"database name, a-z 0-9 -, 2-63 chars"},"binding":{"type":"string","description":"Worker binding name, UPPER_SNAKE (defaults to a name derived from `name`)"},"provider":{"enum":["d1","neon"],"type":"string","description":"defaults to d1"},"siteSlug":{"type":"string","description":"owned site slug to attach immediately"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"create_drive","title":"Create a drive","description":"Create a private cloud Drive (plan-limited). Pass client to file it under a client.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["name"],"properties":{"name":{"type":"string","description":"display name for the new drive"},"client":{"type":"object","properties":{"clientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"an existing client id (skips lookup)"},"clientName":{"type":"string","description":"client's name (used when creating)"},"clientEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"client email — create-or-find by this"},"clientCompany":{"type":"string","description":"client's company (used when creating)"}},"description":"optional: file this under a client (the publish/site is grouped in their customer view)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"create_listing","title":"List one of my sites for sale","description":"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').","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["siteSlug","priceCents","termsMode","jurisdiction"],"properties":{"pitch":{"type":"string","maxLength":280,"description":"short sales pitch, ≤280 chars"},"status":{"enum":["draft","live"],"type":"string","description":"publish state (default draft)"},"siteSlug":{"type":"string","description":"slug of the owned site to list"},"termsMode":{"enum":["standard","custom"],"type":"string","description":"'standard' uses shiply's template; 'custom' requires termsCustom"},"priceCents":{"type":"integer","maximum":999900,"minimum":100,"description":"whole-dollar price in cents, 100–999900"},"termsCustom":{"type":"string","maxLength":20000,"description":"custom terms text, ≥50 chars, required when termsMode='custom'"},"jurisdiction":{"type":"string","maxLength":80,"minLength":2,"description":"governing jurisdiction, e.g. 'California, USA'"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"create_project","title":"Create a client-intake project","description":"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').","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["label"],"properties":{"label":{"type":"string","maxLength":200,"minLength":1,"description":"project name shown in the dev dashboard"},"customerName":{"type":"string","maxLength":200,"description":"the customer's name"},"customerEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","maxLength":320,"description":"customer email; if set, shiply emails them the intake invite"},"originatedFromSiteId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"link this project to an existing site (e.g. a redesign)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"create_test","title":"Create an email demand test","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["idea","headline"],"properties":{"cta":{"type":"string","description":"call-to-action button label"},"sub":{"type":"string","description":"subheadline / supporting line"},"idea":{"type":"string","description":"the product/idea name"},"price":{"type":"string","description":"price to display, e.g. \"$29/mo\""},"headline":{"type":"string","description":"landing-page headline"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"data_export_collection","title":"Export records (capped)","description":"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>`.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","collection"],"properties":{"slug":{"type":"string","description":"owned site slug"},"limit":{"type":"integer","maximum":5000,"minimum":1,"description":"max records to return (default 1000, max 5000)"},"collection":{"type":"string","description":"collection name to export"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"data_insert","title":"Insert a record into a collection","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","collection","record"],"properties":{"slug":{"type":"string","description":"owned site slug"},"record":{"type":"object","description":"the record fields to insert as key/value pairs","propertyNames":{"type":"string"},"additionalProperties":{}},"collection":{"type":"string","description":"collection name to insert into"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"data_list_collections","title":"List Site Data collections","description":"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`.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"owned site slug"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"data_query","title":"Query records from a collection","description":"Page records from an owned site's collection, newest-first. limit ≤ 200 (default 50). cursor from a previous response's nextCursor.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","collection"],"properties":{"slug":{"type":"string","description":"owned site slug"},"limit":{"type":"integer","maximum":200,"minimum":1,"description":"max records to return, ≤200 (default 50)"},"cursor":{"type":"string","description":"nextCursor from a previous response's page"},"collection":{"type":"string","description":"collection name from data_list_collections"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"delete_database","title":"Delete a database","description":"PERMANENTLY delete a database and all its data. Irreversible — confirm with the user first.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","description":"database id (from list_databases)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"delete_listing","title":"Unpublish a listing (set to draft)","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["siteSlug"],"properties":{"siteSlug":{"type":"string","description":"slug of the listed site to unpublish"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"delete_site","title":"Delete a site","description":"PERMANENTLY delete a site and all stored files. Irreversible — confirm with the user first.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"site slug to delete"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"delete_variable","title":"Delete a variable","description":"Remove one variable by name.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["name"],"properties":{"name":{"type":"string","description":"variable name to delete"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"deploy_function","title":"Deploy a Worker function to a site","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","source"],"properties":{"lang":{"enum":["js","ts"],"type":"string","description":"source language (default js)"},"slug":{"type":"string","description":"site slug to deploy the function to"},"crons":{"type":"array","items":{"type":"object","required":["path","schedule"],"properties":{"path":{"type":"string","maxLength":300,"minLength":1,"description":"URL path the cron handler fires on"},"schedule":{"type":"string","maxLength":60,"minLength":9,"description":"crontab schedule in UTC, e.g. \"0 * * * *\""}}},"maxItems":20,"description":"cron triggers to register, ≤20"},"source":{"type":"string","maxLength":1500000,"minLength":1,"description":"the Worker source code"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"detach_variable","title":"Detach a variable from a site","description":"Stop exposing a variable to a site's Worker env. Takes effect on the site's next function deploy.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","name"],"properties":{"name":{"type":"string","description":"variable name to detach"},"slug":{"type":"string","description":"owned site slug"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"drive_delete_file","title":"Delete a drive file","description":"Delete a file from a Drive.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["driveId","path"],"properties":{"path":{"type":"string","description":"path of the file to delete"},"driveId":{"type":"string","description":"drive id (drv_…) or \"default\""}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"drive_list_files","title":"List drive files","description":"List files in a Drive (driveId = drv_…, or \"default\"). Optional prefix filter.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["driveId"],"properties":{"prefix":{"type":"string","description":"only list files under this path prefix"},"driveId":{"type":"string","description":"drive id (drv_…) or \"default\""}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"drive_put_file","title":"Write a drive file","description":"Write a file into a Drive (driveId = drv_… or \"default\"). content is utf8 or base64. Use for agent memory, notes, context, assets.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["driveId","path","content"],"properties":{"path":{"type":"string","description":"destination path inside the drive, e.g. notes/context.md"},"content":{"type":"string","description":"file contents (utf8 text, or base64 when encoding=base64)"},"driveId":{"type":"string","description":"drive id (drv_…) or \"default\""},"encoding":{"enum":["utf8","base64"],"type":"string","description":"default utf8; base64 for binary"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"duplicate_site","title":"Duplicate a site","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"site slug to copy"},"title":{"type":"string","description":"display title for the new copy (defaults to source title)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"export_account","title":"Export account data","description":"Return a JSON bundle of the user's profile, sites, Site Data, drives, and metadata (secrets excluded). Data portability.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"feature_site","title":"Feature a site on Explore","description":"Toggle whether an owned, public site appears in the public shiply Explore gallery (https://shiply.now/explore). Only public-access sites are eligible.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","show"],"properties":{"show":{"type":"boolean","description":"true to feature on Explore, false to remove"},"slug":{"type":"string","description":"owned, public site slug"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"forward_thread","title":"Forward an inbox message to a new recipient","description":"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>'.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["threadId","to"],"properties":{"to":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"new recipient email address"},"note":{"type":"string","maxLength":5000,"description":"intro note prepended above the forwarded quote"},"subject":{"type":"string","maxLength":200,"description":"subject; defaults to 'Fwd: <original>'"},"threadId":{"type":"string","description":"thread id from list_inbox to forward from"},"messageId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"specific message to forward (default: most recent)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"get_account_status","title":"Account plan + capability matrix","description":"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 capability matrix listing every gated feature (workers_lite, databases_neon_postgres, custom_domains, etc.) with whether you have access and the minimum plan needed.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"get_analytics","title":"Site analytics","description":"Daily page views per site for the last 30 days.","input_schema":{"type":"object","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"get_connect_status","title":"Stripe Connect onboarding status","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"get_function","title":"Get the deployed function for a site","description":"Return the deployed function source + metadata for a site, or null if no function deployed.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"site slug whose function to fetch"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"get_function_logs","title":"Read recent function logs","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"site slug whose function logs to read"},"limit":{"type":"integer","maximum":1000,"minimum":1,"description":"max events to return (default 50)"},"since":{"type":"integer","maximum":10080,"minimum":1,"description":"look back this many minutes (default 60, max 10080 = 7 days)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"get_project","title":"Get one project (full row)","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"project id"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"get_site","title":"Site detail","description":"Site settings + version history for one of my sites.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"site slug, e.g. my-site"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"get_site_access","title":"Read site access control","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"owned site slug"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"get_test_status","title":"Demand test status (the verdict)","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["testId"],"properties":{"testId":{"type":"string","description":"demand test id from create_test / list_tests"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_complaints","title":"List complaints + bounces","description":"Return threads tagged as complaints (spam reports) OR bounces (recipient rejected). Read these before any further sending.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_crons","title":"List cron triggers for a site","description":"List cron triggers for a site's deployed function. Each cron is (path, schedule, lastRunAt).","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"site slug whose cron triggers to list"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_custom_domains","title":"List custom domains","description":"List registered custom domains grouped with their subdomains, each subdomain's site and status, and the detected provider.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_databases","title":"List my databases","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_domains","title":"List custom domains","description":"List connected custom domains with status.","input_schema":{"type":"object","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_drives","title":"List drives","description":"List the user's private cloud Drives (id, name). Optional clientId filters to one client.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"clientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"only drives filed under this client"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_inbox","title":"List inbox threads","description":"List the user's email inbox threads (outbound demand-test sends + inbound replies / unsubscribes / complaints / bounces). Filter by tag.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"limit":{"type":"integer","maximum":200,"minimum":1,"description":"max threads to return, ≤200"},"filter":{"enum":["all","unread","replies","unsubscribes","complaints","bounces"],"type":"string","description":"default all"},"offset":{"type":"integer","maximum":9007199254740991,"minimum":0,"description":"number of threads to skip (pagination)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_listings","title":"List my marketplace listings","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_mailbox_contacts","title":"List a mailbox's contacts","description":"List captured contacts for a (site, collection) mailbox, optionally filtered by status (signed_up/confirmed/unsubscribed). Returns email, status, confirmedAt, createdAt, and captured fields.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","collection"],"properties":{"slug":{"type":"string","description":"site slug the mailbox belongs to"},"status":{"enum":["signed_up","confirmed","unsubscribed"],"type":"string","description":"filter contacts by status"},"collection":{"type":"string","description":"mailbox collection name"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_my_orders","title":"List orders where I am the buyer","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"limit":{"type":"integer","maximum":500,"minimum":1,"description":"max orders to return (default 100, max 500)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_my_sales","title":"List orders where I am the seller","description":"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).","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"limit":{"type":"integer","maximum":500,"minimum":1,"description":"max orders to return (default 100, max 500)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_project_files","title":"List files uploaded to a project","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"project id whose uploaded files to list"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_projects","title":"List my client-intake projects","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"q":{"type":"string","description":"case-insensitive match on label or customer email"},"limit":{"type":"integer","maximum":200,"minimum":1,"description":"max projects to return (default 100)"},"status":{"enum":["draft","intake_open","brief_ready","brief_failed","archived"],"type":"string","description":"filter by project status"},"clientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"only projects filed under this client"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_secrets","title":"List secret names for a site","description":"List secret names (values not returned) for a site's deployed function.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"site slug whose secret names to list"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_sending_domains","title":"List my sending domains","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_site_inbox","title":"List a site's email inbox threads","description":"Read the email threads (received, sent, web captures) for the agent's sites. Optionally scoped to one site by slug.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"slug":{"type":"string","description":"limit to one site by slug; omit for all sites"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_sites","title":"List my sites","description":"List the sites owned by this API key. Optional clientId filters to one client.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"clientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"only sites filed under this client"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_site_variables","title":"List variables attached to a site","description":"Names of the variables attached to an owned site's Worker env (values never shown here).","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"owned site slug"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_suppressions","title":"List suppressed emails / domains","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_test_inbox_addresses","title":"List per-test inbox addresses","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_tests","title":"List demand tests","description":"List your demand tests with signups + confirmed counts.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_unsubscribes","title":"List unsubscribes","description":"Shortcut for list_inbox with filter=unsubscribes — shows every thread tagged as an opt-out request.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"limit":{"type":"integer","maximum":200,"minimum":1,"description":"max threads to return, ≤200"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_variables","title":"List variables","description":"List the encrypted variables. Values are masked unless reveal=true.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","properties":{"reveal":{"type":"boolean","description":"return plaintext values instead of masked"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"list_versions","title":"List a site's deploys","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"site slug to list deploys for"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"mark_thread_read","title":"Mark a thread read","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["threadId"],"properties":{"threadId":{"type":"string","description":"thread id from list_inbox to mark read"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"promote_site","title":"Promote a preview to a production site","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["srcSlug","destSlug"],"properties":{"srcSlug":{"type":"string"},"destSlug":{"type":"string"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"publish_from_drive","title":"Publish a drive as a site","description":"Snapshot a Drive (or a prefix of it) into a new live site at <slug>.shiply.now. Files copied server-side.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["driveId"],"properties":{"title":{"type":"string","description":"display title for the new site"},"prefix":{"type":"string","description":"only snapshot files under this path prefix"},"driveId":{"type":"string","description":"drive id (drv_…) or \"default\""}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"publish_site","title":"Publish a site","description":"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. Works WITHOUT auth (anonymous: 24h lifetime, returns claimToken/claimUrl — SAVE THEM). With a Bearer shp_ key sites are permanent. ≤50 files / 2 MB inline; bigger: REST flow per https://shiply.now/llms.txt. index.html serves at /. spaMode for client-side routing.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["files"],"properties":{"slug":{"type":"string","description":"UPDATE an existing site you own (requires Bearer key)"},"files":{"type":"array","items":{"type":"object","required":["path","content"],"properties":{"path":{"type":"string","description":"relative path, e.g. index.html"},"content":{"type":"string","description":"file contents (utf8 text, or base64 when encoding=base64)"},"encoding":{"enum":["utf8","base64"],"type":"string","description":"default utf8; base64 for binary"}}},"description":"site files; index.html required for a homepage"},"title":{"type":"string","description":"display title for the site"},"client":{"type":"object","properties":{"clientId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"an existing client id (skips lookup)"},"clientName":{"type":"string","description":"client's name (used when creating)"},"clientEmail":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"client email — create-or-find by this"},"clientCompany":{"type":"string","description":"client's company (used when creating)"}},"description":"optional: file this under a client (the publish/site is grouped in their customer view)"},"spaMode":{"type":"boolean","description":"serve index.html for unknown paths (client-side routing)"},"agentName":{"type":"string","description":"label shown during the automatic account re-auth flow"},"claimToken":{"type":"string","description":"UPDATE an existing anonymous site (from the original publish result)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"pull_site","title":"Pull a site's current files","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"site slug to pull files for"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"read_thread","title":"Read an inbox thread","description":"Return the thread metadata + all messages in chronological order. Use list_inbox first to get a threadId.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["threadId"],"properties":{"threadId":{"type":"string","description":"thread id from list_inbox"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"readOnlyHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"refund_order","title":"Refund one of my sales","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["orderId"],"properties":{"reason":{"type":"string","maxLength":500,"description":"optional refund reason"},"orderId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"id of the paid order to refund (from list_my_sales)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"regenerate_brief","title":"Re-run AI brief generation","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"project id to re-run the brief for"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"remove_cron","title":"Remove a cron trigger","description":"Remove a cron trigger from a site's deployed function.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","path"],"properties":{"path":{"type":"string","maxLength":300,"minLength":1,"description":"URL path of the cron to remove"},"slug":{"type":"string","description":"site slug whose cron to remove"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"remove_custom_domain","title":"Remove a custom domain","description":"Remove a registered custom domain and all its subdomains; they stop serving immediately.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["domain"],"properties":{"domain":{"type":"string","description":"registered custom domain to remove, e.g. example.com"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"remove_domain","title":"Disconnect a custom domain","description":"Remove a connected domain (by id). It stops serving immediately.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","description":"connected domain id from list_domains"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"remove_function","title":"Remove the deployed function from a site","description":"Remove the deployed Worker function from a site (and all its routes, secrets, and cron triggers). Site falls back to static-only serving. Irreversible.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug"],"properties":{"slug":{"type":"string","description":"site slug whose function to remove"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"remove_secret","title":"Remove a secret from a site","description":"Remove a secret from a site's deployed function. The binding disappears on next request.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","name"],"properties":{"name":{"type":"string","maxLength":80,"description":"secret name to remove"},"slug":{"type":"string","description":"site slug whose function holds the secret"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"remove_sending_domain","title":"Remove a sending domain","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"sending domain id from list_sending_domains"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"remove_suppression","title":"Remove from suppression list","description":"Delete one suppression by id. Use list_suppressions first to find the id.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["suppressionId"],"properties":{"suppressionId":{"type":"string","description":"suppression id from list_suppressions"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"destructiveHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"reply_to_thread","title":"Reply to an inbox thread","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["threadId","body"],"properties":{"body":{"type":"string","maxLength":20000,"minLength":1,"description":"reply body, ≤20,000 chars"},"subject":{"type":"string","maxLength":200,"description":"subject; defaults to 'Re: <original>'"},"threadId":{"type":"string","description":"thread id from list_inbox to reply on"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"resend_confirmation","title":"Resend a confirmation email","description":"Re-send the double-opt-in confirmation to a signup that has not confirmed yet.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["testId","email"],"properties":{"email":{"type":"string","description":"the unconfirmed signup email to re-send to"},"testId":{"type":"string","description":"demand test id the signup belongs to"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"resend_intake_invite","title":"Re-send the customer intake invite email","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"project id to re-send the intake invite for"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"restore_project","title":"Restore an archived project","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["id"],"properties":{"id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"archived project id to restore"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"rollback_site","title":"Roll back a site","description":"Re-point a site to any finalized version (rollback or roll-forward). Get version ids from get_site. Serving updates immediately.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","versionId"],"properties":{"slug":{"type":"string","description":"site slug to re-point"},"versionId":{"type":"string","description":"finalized version id from get_site"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"send_broadcast","title":"Broadcast to confirmed subscribers","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["testId","subject","html"],"properties":{"html":{"type":"string","description":"email HTML body (unsubscribe link added automatically)"},"text":{"type":"string","description":"plain-text fallback body"},"testId":{"type":"string","description":"demand test id whose confirmed subscribers to email"},"subject":{"type":"string","description":"email subject line"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"send_email","title":"Send an email from a site","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","to","subject","html"],"properties":{"to":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"recipient email address"},"html":{"type":"string","description":"email HTML body"},"slug":{"type":"string","description":"site slug to send from (<slug>.shiply.now sender)"},"text":{"type":"string","description":"plain-text fallback body"},"subject":{"type":"string","description":"email subject line"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"send_mailbox_broadcast","title":"Broadcast to a mailbox's confirmed audience","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","collection","subject","html"],"properties":{"html":{"type":"string","description":"email HTML body (unsubscribe footer added automatically)"},"slug":{"type":"string","description":"site slug the mailbox belongs to"},"text":{"type":"string","description":"plain-text fallback body"},"subject":{"type":"string","description":"email subject line"},"collection":{"type":"string","description":"mailbox collection whose confirmed audience to email"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"openWorldHint":true,"idempotentHint":false},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"set_cron","title":"Set or update a cron trigger","description":"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).","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","path","schedule"],"properties":{"path":{"type":"string","maxLength":300,"minLength":1,"description":"URL path the cron handler fires on"},"slug":{"type":"string","description":"site slug whose function gets the cron"},"schedule":{"type":"string","maxLength":60,"minLength":9,"description":"crontab schedule in UTC, e.g. \"0 * * * *\""}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"set_handle","title":"Set a vanity handle","description":"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>.)","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","handle"],"properties":{"slug":{"type":"string","description":"current site slug"},"handle":{"type":"string","description":"new vanity handle, 3-30 chars a-z 0-9 -"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"set_link","title":"Mount a site at a path","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["hostSlug","location"],"properties":{"remove":{"type":"boolean","description":"unmount instead of mounting"},"hostSlug":{"type":"string","description":"slug of the owned host site"},"location":{"type":"string","description":"path to mount at, e.g. \"docs\", or \"__root__\" for the host root"},"targetSlug":{"type":"string","description":"slug of the owned site to serve there (required unless remove=true)"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"set_mailbox","title":"Configure a site collection's email behavior","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["slug","collection"],"properties":{"slug":{"type":"string","description":"site slug the collection belongs to"},"branding":{"type":"object","properties":{"logoUrl":{"type":"string","description":"logo image URL shown in emails"},"brandName":{"type":"string","description":"brand name shown in emails"},"brandColor":{"type":"string","description":"accent color hex, e.g. #2563eb"}},"description":"branding applied to mailbox emails"},"notifyTo":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"address to send owner notifications to"},"collection":{"type":"string","description":"Site Data collection to turn into a mailbox"},"doubleOptIn":{"type":"boolean","description":"require email confirmation before a contact is active"},"notifyOwner":{"type":"boolean","description":"email the owner on each new capture"},"sendingDomainId":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$","description":"BYO sending domain id to send from"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"},{"name":"set_primary_subdomain","title":"Pick the canonical URL for a custom domain","description":"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.","input_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["domain","hostname"],"properties":{"domain":{"type":"string","description":"registered custom domain, e.g. example.com"},"hostname":{"type":"string","description":"full hostname to make primary, e.g. www.example.com"}}},"output_schema":{"type":"object","$schema":"http://json-schema.org/draft-07/schema#","required":["result"],"properties":{"result":{}},"additionalProperties":false},"annotations":{"idempotentHint":true},"source":"probe","observed_at":"2026-10-09T23:24:01.689Z"}],"next_cursor":"set_primary_subdomain","next_actions":[{"action":"list_tools","description":"Next page","href":"/v1/servers/now.shiply%2Fshiply/tools?cursor=set_primary_subdomain&limit=100","arguments":{"name":"now.shiply/shiply","cursor":"set_primary_subdomain","limit":100}},{"action":"get_connection","description":"Connection block to call these tools","href":"/v1/servers/now.shiply%2Fshiply/connection?target=mcpServers","arguments":{"name":"now.shiply/shiply","target":"mcpServers"}},{"action":"get_server","description":"Full descriptor with trust and connectability","href":"/v1/servers/now.shiply%2Fshiply","arguments":{"name":"now.shiply/shiply"}}]}