Skip to content

MCP reference

import { Aside, Tabs, TabItem } from ‘@astrojs/starlight/components’;

~/.claude/mcp_settings.json
{
"mcpServers": {
"vantage": {
"command": "npx",
"args": ["-y", "@vantageconnections/mcp"],
"env": { "VANTAGE_TOKEN": "vc_pat_..." }
}
}
}

In Cursor → Settings → MCP → Add Server:

{
"command": "npx",
"args": ["-y", "@vantageconnections/mcp"],
"env": { "VANTAGE_TOKEN": "vc_pat_..." }
}
// ~/Library/Application Support/Claude/claude_desktop_config.json (Mac)
// %APPDATA%\Claude\claude_desktop_config.json (Windows)
{
"mcpServers": {
"vantage": {
"command": "npx",
"args": ["-y", "@vantageconnections/mcp"],
"env": { "VANTAGE_TOKEN": "vc_pat_..." }
}
}
}

See Set up MCP for the full walkthrough including troubleshooting.

Confirm authentication. Returns the email + role + websiteId scope of the currently active API key. Use this first if there’s any doubt about credentials.

No parameters.

List every website on the platform you have access to. Returns id, name, slug, status, owner, and creation date for each.

No parameters.

Get a single website by id with full record.

ParameterTypeRequiredDescription
websiteIdstringyes

Get the website’s editable GitHub repo — the fork of the Melbora Next.js template that the site deploys from. Call this whenever the user wants to change ANYTHING visual or structural that vantage_content_save can’t reach: colors, fonts, layout, components, page structure, new routes, custom JSX, Tailwind/CSS, images, OG card design, anything in the codebase. Returns the repo full name, https + ssh clone URLs, default branch, the Vercel project URL, and a short workflow note. After cloning + editing + pushing, Vercel auto-redeploys; you can confirm with vantage_websites_deployment.

ParameterTypeRequiredDescription
websiteIdstringyes

Figure out which Melbora website (if any) the agent’s current working directory belongs to. Reads the directory’s git remote (origin) and matches it against every website the active token can see. Returns { matched: true, websiteId, slug, repoFullName, liveUrl, isVantageRepo: true } on a match, or { matched: false, reason, suggestedAction } otherwise. Call this at the start of any session where the user mentions a specific site or seems to expect Claude to already know which site they’re on — saves the agent from having to ask. If you can’t determine the cwd, ask the user to run pwd in the shell and pass its output as dir, OR pass the output of git remote get-url origin as gitRemote.

ParameterTypeRequiredDescription
dirstringnoAbsolute path to the directory to inspect. Defaults to the MCP server’s process.cwd() (typically the directory Claude Code was launched in). Pass explicitly when you know Claude has cd’d elsewhere.
gitRemotestringnoSkip the file read — pass the origin URL directly (e.g. ‘https://github.com/Vantage-Connections-Org/client-us-sweets.git’). Useful when dir isn’t accurate or the agent already has the remote in hand.

Close the loop after vantage_websites_create: given a websiteId (or slug), polls the GitHub provisioning step until the repo is reachable, then returns a ready-to-paste git clone shell command + workflow notes. Use this immediately after creating a new site, OR when the user wants to start coding on an existing site and isn’t in its repo yet. The tool itself doesn’t run shell commands — it gives the agent the exact command + recommended target directory so Claude can invoke Bash and land inside the repo. Default timeout 60s (provisioning is usually <30s); pass timeoutSeconds to extend.

ParameterTypeRequiredDescription
websiteIdstringnoEither websiteId (UUID) or slug. The tool resolves the slug if needed.
slugstringnoAlternative to websiteId — resolve by slug instead.
targetDirstringnoOptional. Local path where the repo should be cloned. Defaults to . (clone into the cwd). Use a path like ./client-foo to clone into a subfolder.
timeoutSecondsnumberno

Provision a new website. Creates a brand-new GitHub repo forked from the Melbora Next.js template, a Vercel project that builds it, a CMS content document, and optional integrations. Returns the new websiteId immediately; the GitHub + Vercel jobs finish in the background (typically <30s). Next step after this returns: call vantage_workspace_init with the returned websiteId to wait for the repo to come online and get a clone command — then Bash-clone into the agent’s current directory so you can immediately start coding. Do NOT try to edit the live site via CMS content alone if the user asked for design/layout changes; the repo is the editable surface. Optional clientId attaches it to a specific client at creation.

ParameterTypeRequiredDescription
namestringyesDisplay name (e.g. ‘Joe’s Plumbing’).
slugstringyesLowercase URL-safe slug (e.g. ‘joes-plumbing’). Becomes the GitHub repo + Vercel project name.
clientIdstringno

Tear down a website: cancel Stripe subscription, delete the GitHub repo + Vercel project, revoke per-site OpenRouter keys, drop all platform rows. Destructive and irreversible — only call after explicit confirmation.

ParameterTypeRequiredDescription
websiteIdstringyes

Read the website’s CMS content document — the JSON that drives the live site’s copy (hero text, service descriptions, FAQ answers, business info). Does NOT include visual design, layout, fonts, colors, or component structure — those live in the website’s GitHub repo (use vantage_websites_repo to get the clone URL).

ParameterTypeRequiredDescription
websiteIdstringyes

Replace the website’s CMS content document (a commit to the site’s GitHub repo). Use this for copy/text changes only — headings, service descriptions, contact info, FAQ entries. For visual changes (colors, fonts, layout, components, new pages) DO NOT use this — call vantage_websites_repo to get the GitHub repo URL and edit the Next.js template directly. Pass the new content object as content; optional sha enables optimistic-concurrency (pass the sha from the most recent get).

ParameterTypeRequiredDescription
websiteIdstringyes
contentobjectyes
shastringno

Return the website’s blueprint graph — the nodes (github/vercel/openrouter/etc.) + edges between them + their canvas positions.

ParameterTypeRequiredDescription
websiteIdstringyes

Turn on Cal.com appointment bookings for a website. Pushes NEXT_PUBLIC_CAL_USERNAME to Vercel and redeploys.

ParameterTypeRequiredDescription
websiteIdstringyes
calUsernamestringyes
brandColorstringnoOptional #RRGGBB.

Turn off Cal.com bookings. Removes env vars, deletes the service row, redeploys.

ParameterTypeRequiredDescription
websiteIdstringyes

Set or change the SEO/GEO automation tier. Pushes NEXT_PUBLIC_SEO_TIER to Vercel and redeploys.

ParameterTypeRequiredDescription
websiteIdstringyes
tieressentials | growth | premium | premium_plusyes

Turn off SEO automation for a website.

ParameterTypeRequiredDescription
websiteIdstringyes

Run an immediate SEO health scan against the live site. Returns score 0-100 + the issue list (missing title, no JSON-LD, etc.).

ParameterTypeRequiredDescription
websiteIdstringyes

Send a prompt to an AI search engine (Perplexity Sonar by default) and report whether the website’s primary domain shows up in the citations.

ParameterTypeRequiredDescription
websiteIdstringyes
promptstringyes
modelstringno

Read everything we know about the website’s SEO state — current tier, capabilities, last scan, GEO probes, citations checklist, competitor URLs, Search Console metrics.

ParameterTypeRequiredDescription
websiteIdstringyes

List domains attached to a website (site + email).

ParameterTypeRequiredDescription
websiteIdstringyes

Attach a new domain to a website. Returns the DNS records the client needs to set at their registrar.

ParameterTypeRequiredDescription
websiteIdstringyes
domainstringyes
kindsite | emailyes

Detach a domain from a website. Removes it from Vercel + Resend as appropriate; the registrar record is the client’s to manage.

ParameterTypeRequiredDescription
websiteIdstringyes
domainstringyes

Get the most recent Vercel deployment for a website: state (READY/ERROR/BUILDING), the commit SHA + message that built it, the inspector URL, and — when state is ERROR — the errorMessage explaining why the build failed. The first thing to check when a site isn’t updating or just stopped working.

ParameterTypeRequiredDescription
websiteIdstringyes

Force a fresh Vercel deploy of the website’s current main branch. Use after fixing a config or env-var issue Vercel doesn’t auto-detect. Returns the new deployment id; poll vantage_websites_deployment to see its status.

ParameterTypeRequiredDescription
websiteIdstringyes

Per-service recent activity for a website. service is one of: github, vercel, openrouter, resend, bookings, seo, cms, stripe, cognito, domain. Useful for diagnosing what a specific integration just did or why it failed.

ParameterTypeRequiredDescription
websiteIdstringyes
servicestringyes

List the integrations actually provisioned for a website (GitHub repo, Vercel project, OpenRouter key, Resend domain, etc.), with their external ids + metadata. Useful to confirm a feature is wired up before debugging it.

ParameterTypeRequiredDescription
websiteIdstringyes

Provisioning job history for a website (newest first). Each entry shows what step the orchestrator ran, completedSteps, and any errors. Use when the initial provision seems stuck or partially failed.

ParameterTypeRequiredDescription
websiteIdstringyes

Toggle individual feature flags on a website (openrouter for the AI assistant, resend for transactional email). Bookings + SEO have their own dedicated tools because they need extra config; this is just the simple booleans.

ParameterTypeRequiredDescription
websiteIdstringyes
openrouterbooleanno
resendbooleanno

Generate alt text for an image given a short description + business context. Quota-gated by tier.

ParameterTypeRequiredDescription
websiteIdstringyes
imageDescriptionstringyesWhat’s actually in the image (e.g. ‘owner standing in front of the storefront’).
contextstringnoBusiness context (e.g. ‘Acme Plumbing in Irvine, CA’). Optional but improves quality.

Generate a 140-160 char meta description for a page given its title + a body excerpt. Quota-gated by tier.

ParameterTypeRequiredDescription
websiteIdstringyes
pagePathstringno
pageTitlestringyes
pageBodyExcerptstringno

Generate a Markdown blog post draft for a topic (~700 words by default, includes an FAQ section). Returns the Markdown ready to paste into the CMS. Quota-gated.

ParameterTypeRequiredDescription
websiteIdstringyes
topicstringyes
audiencestringno
lengthWordsnumberno

Generate a Markdown city-specific landing page. The CMS stores it under localPages so the template renders it at /areas/[slug] with Service+City JSON-LD. Quota-gated; Premium+ tier.

ParameterTypeRequiredDescription
websiteIdstringyes
citystringyes
focusServicestringno
businessSummarystringno

Audit the website’s CMS content document with a fast LLM and return a structured 8-dimension rubric: title, tagline, about, services, faq, business, contact, localPages. Each finding has severity (info/warn/error), score (0-100), one-line summary, and a concrete suggestion. Returns overallScore (weighted average). Content-hashed cache: re-running on unchanged content returns cached:true and does NOT consume a quota slot. Growth+ tier. Pass the full site.json document body as siteContent — typically what vantage_content_get returns under .content.

ParameterTypeRequiredDescription
websiteIdstringyes
siteContentobjectyesThe content document. Pass the parsed JSON object — do not stringify.

Replace the list of competitor URLs the nightly scraper diffs. Pass an array of full https URLs (max 10).

ParameterTypeRequiredDescription
websiteIdstringyes
urlsstring[]yes

Start a Google Search Console OAuth flow for the website. Returns an authUrl the admin sends the client through; after consent Google redirects back to our callback and stores the token. Until the client completes the consent, GSC pulls are skipped.

ParameterTypeRequiredDescription
websiteIdstringyes

Force an immediate Search Console metrics pull (the cron normally does this on cadence). Requires GSC to already be connected.

ParameterTypeRequiredDescription
websiteIdstringyes

Revoke the stored Google Search Console token + clear cached metrics for a website.

ParameterTypeRequiredDescription
websiteIdstringyes

List every client account on the platform. Returns id, name, email, contact phone, GitHub username, Stripe customer id. Admin-only.

No parameters.

Get one client by id.

ParameterTypeRequiredDescription
clientIdstringyes

List every website owned by a given client.

ParameterTypeRequiredDescription
clientIdstringyes

Hand a website over to an existing client. Sets pendingClientId on the website; the client then pays via Stripe Checkout in their portal to finalize. For a brand-new client without a Melbora account yet, use vantage_websites_invite_client instead.

ParameterTypeRequiredDescription
websiteIdstringyes
clientIdstringyes

Revoke a pending transfer before the client pays.

ParameterTypeRequiredDescription
websiteIdstringyes

Re-send the magic-link transfer claim email to the client (when status is pending_acceptance). The original link is valid for 7 days; use this if the client missed the email, it expired, or it got filtered to spam. The previous link still works if not expired — re-sending mints a fresh one.

ParameterTypeRequiredDescription
websiteIdstringyes

Release a website from its current owning client. Cancels the Stripe subscription + clears clientId. Use when a client churns or you want to re-park the site under house ownership. Destructive on the billing side — confirm first.

ParameterTypeRequiredDescription
websiteIdstringyes

Set the monthly subscription price (whole USD). If a Stripe subscription is active, the change applies on the next cycle with proration. If not, just updates the product price for future Checkout sessions.

ParameterTypeRequiredDescription
websiteIdstringyes
monthlyPriceUsdnumberyesWhole USD (e.g. 79).

Invite a brand-new client (no Melbora account yet) to claim a website. Sends a magic-link email. When the recipient signs up + claims the invitation, the platform sets pendingClientId on the website and the Stripe Checkout flow kicks off automatically. Refuses if the email already belongs to an existing client (use vantage_websites_transfer for those).

ParameterTypeRequiredDescription
websiteIdstringyes
emailstringyes

Revoke an open invitation (or an accepted-but-unpaid one) for a website.

ParameterTypeRequiredDescription
websiteIdstringyes

Invitation history for a website, newest first. Includes pending / accepted / revoked / expired entries.

ParameterTypeRequiredDescription
websiteIdstringyes

Invite the website’s owning client as a GitHub repo collaborator (requires client.githubUsername set). Use this when a client asks to edit their site’s code directly — gives them push access to the per-website repo.

ParameterTypeRequiredDescription
websiteIdstringyes

List recent Stripe invoices for a website (up to 50, newest first). Each invoice carries amountDue/amountPaid in minor units (cents), status (paid|open|uncollectible|void|draft), period dates, and a hostedInvoiceUrl that’s a one-click pay page. Returns an empty list for sites without an active subscription. Use when the user asks about billing history, unpaid invoices, or wants the pay link to send a client.

ParameterTypeRequiredDescription
websiteIdstringyes

Admin-only: charge the owning client a one-off amount (custom work, extra setup, etc.) outside the recurring subscription. Stripe auto-charges the card on file; if that fails the invoice stays open and the returned hostedInvoiceUrl is where the client can pay manually. Requires the site to already have an owning client + Stripe customer (i.e. they completed the subscription Checkout). Amount is in whole/decimal USD; description is shown on the invoice.

ParameterTypeRequiredDescription
websiteIdstringyes
amountUsdnumberyesPositive amount in USD, e.g. 250 or 49.99
descriptionstringyesLine-item description shown on the invoice
currencystringnoISO-4217 lowercase, defaults to usd

Mint a Stripe Customer Portal session for this website’s subscription. Returns { url }. Send the URL to the client (or admin) — they land on Stripe’s self-serve page where they can update card on file, view all invoices, download receipts, pause/cancel, etc. Admin or the owning client can call.

ParameterTypeRequiredDescription
websiteIdstringyes

Upload an image to the website’s GitHub repo at public/uploads/{timestamp}-{filename}. Max 8 MB. Returns the public URL the live site serves it at + the in-repo path you can reference from CMS fields (e.g. as a hero image). Pass contentBase64 as the raw base64 string (no data URI prefix).

ParameterTypeRequiredDescription
websiteIdstringyes
filenamestringyes
contentBase64stringyes
contentTypestringnoe.g. image/jpeg, image/png, image/webp

Delete a previously-uploaded image from the website’s repo. path must be under public/uploads/ (the API refuses anything else).

ParameterTypeRequiredDescription
websiteIdstringyes
pathstringyes

Check whether a domain can be registered through Vercel + what it costs. Returns price + period. Does NOT buy — use vantage_domains_buy for that.

ParameterTypeRequiredDescription
domainstringyes

Buy a domain through Vercel and attach it to the website. The call polls until registration is final (30–60s typical) and automatically delegates nameservers to Vercel. The domain must currently be available; expectedPrice must match the price returned by vantage_domains_check_availability.

ParameterTypeRequiredDescription
websiteIdstringyes
domainstringyes
yearsnumberyes
expectedPricenumberyes
autoRenewbooleanno
contactInformationobjectyes

Re-check DNS propagation for a domain. Vercel and Resend verify lazily — call this to nudge them and refresh the stored status + remaining DNS records the client still needs to add.

ParameterTypeRequiredDescription
websiteIdstringyes
domainstringyes

Read the citations checklist — the directory-submission progress (Google Business Profile, Yelp, BBB, industry-specific listings, etc.). Each entry has a directoryId, status (pending|submitted|live|failed), optional listingUrl + note.

ParameterTypeRequiredDescription
websiteIdstringyes

Replace the citations checklist. Pass an array of entries with directoryId + status (+ optional listingUrl, note). Use vantage_seo_citations_get first to read the current state if you want to patch.

ParameterTypeRequiredDescription
websiteIdstringyes
citationsobject[]yes

Trigger the same tier-cadence work the 6-hourly SEO cron does, on demand for a single site. Pass force: true to bypass cadence gating (otherwise essentials = monthly, growth = weekly, premium+ = daily). Use after fixing a content issue and wanting an immediate re-scan.

ParameterTypeRequiredDescription
websiteIdstringyes
forcebooleanno

Read the website’s newsletter status — whether it’s enabled, the audience id, current subscriber + unsubscribed counts, and the default from-address. One provider call when enabled; none when disabled.

ParameterTypeRequiredDescription
websiteIdstringyes

Enable the newsletter feature for a website. Mints a Resend audience, pushes env vars to the per-client Vercel project, redeploys so the template’s subscribe form + unsubscribe page come online. Idempotent — running on an already-enabled site refreshes env + redeploys.

ParameterTypeRequiredDescription
websiteIdstringyes

DESTRUCTIVE — deletes the website’s Resend audience (and every subscriber in it), removes env vars, redeploys to hide the subscribe form. Use only when the operator is sure they’re done with newsletter for this site.

ParameterTypeRequiredDescription
websiteIdstringyes

List subscribers for the website’s audience. Returns the full list in one page today (Resend doesn’t paginate yet). Use vantage_newsletter_remove_subscriber to drop a specific contact by id or email.

ParameterTypeRequiredDescription
websiteIdstringyes

Hard-delete a subscriber from the website’s audience. Use for admin cleanup (e.g. removing a test address). NOT the user-facing unsubscribe flow — that goes through the per-tenant site’s /unsubscribe page.

ParameterTypeRequiredDescription
websiteIdstringyes
contactIdOrEmailstringyes

List all campaigns (drafts + sent) for the website. Per-campaign stats are NOT included — call vantage_newsletter_campaign for one campaign + its latest stats snapshot.

ParameterTypeRequiredDescription
websiteIdstringyes

Create a draft campaign. Subject + Markdown body required; the platform renders Markdown → HTML before handing off to the provider. The from field defaults to the website’s verified Resend domain (newsletter@) when present, else the platform default. Does NOT send — use vantage_newsletter_send_campaign to fire it.

ParameterTypeRequiredDescription
websiteIdstringyes
subjectstringyes
bodystringyesMarkdown body — supports headings, bold/italic, lists, links.
fromstringno

Read one campaign + the provider’s latest stats snapshot (sent/delivered/opened/clicked/bounced/unsubscribed counts). Use after a campaign has been sent to track engagement.

ParameterTypeRequiredDescription
websiteIdstringyes
campaignIdstringyes

Send a previously-drafted campaign. Default fires immediately to every subscribed contact (unsubscribed contacts auto-skipped). Pass scheduledAt (ISO-8601 future timestamp) to defer — the provider queues it and releases at that time. Returns the campaign in its new status (typically queued). Sending is async — call vantage_newsletter_campaign later to see delivery progress.

ParameterTypeRequiredDescription
websiteIdstringyes
campaignIdstringyes
scheduledAtstringnoOptional ISO-8601 future timestamp for scheduled send. Omit for immediate.

Admin helper: mint a signed unsubscribe URL pointing at the per-tenant site’s /unsubscribe page. Useful for QA without sending a real campaign — paste the URL in a browser to test the unsubscribe flow end-to-end.

ParameterTypeRequiredDescription
websiteIdstringyes
emailstringyes

Update a draft campaign. Only works while status === ‘draft’ (Resend rejects updates on sent/queued). Pass only the fields you want to change.

ParameterTypeRequiredDescription
websiteIdstringyes
campaignIdstringyes
subjectstringno
bodystringno
fromstringno
templateIdstringno
templateVarsobjectno

Hard-delete a draft campaign. Resend rejects DELETE on sent/queued — use archive instead for those. Destructive; confirm at the call site.

ParameterTypeRequiredDescription
websiteIdstringyes
campaignIdstringyes

Send the rendered campaign to a single test address (NOT a broadcast — doesn’t touch the audience). Subject is prefixed [TEST]. Useful for preview-in-inbox before the real send.

ParameterTypeRequiredDescription
websiteIdstringyes
campaignIdstringyes
tostringyes

Hide a sent campaign from the default list. Only sent campaigns can be archived; drafts should be deleted instead.

ParameterTypeRequiredDescription
websiteIdstringyes
campaignIdstringyes

Restore a previously-archived sent campaign to the default list.

ParameterTypeRequiredDescription
websiteIdstringyes
campaignIdstringyes

vantage_newsletter_set_subscriber_unsubscribed

Section titled “vantage_newsletter_set_subscriber_unsubscribed”

Operator-initiated flip of a subscriber’s unsubscribed flag. Useful for resubscribe (false) or for marking opted-out (true) when the user opted out by other channels.

ParameterTypeRequiredDescription
websiteIdstringyes
contactIdstringyes
unsubscribedbooleanyes

List available newsletter templates + each one’s field schema. Operator uses these in the composer to pick a pre-styled layout instead of freeform Markdown.

ParameterTypeRequiredDescription
websiteIdstringyes

Composed SEO / GEO performance analytics for a website — health-scan score + issues, GEO citation rate (how often the site shows up in AI-search probes), Google Search Console totals + top queries, citation-checklist progress, competitor diff activity, and AI quota usage. Use this when the user asks ‘how is the site performing?’ or wants a numeric snapshot of search visibility. The response is read-only (no side effects) and composes data already collected by the platform — no separate analytics ingest needed.

ParameterTypeRequiredDescription
websiteIdstringyes
range7d | 30d | 90d | allnoLookback window for GEO probes + competitor diffs. Default 30d.

First-party traffic analytics for a website — pageviews, sessions, average dwell time, bounce rate, daily timeline, top pages, top referrers, country and device breakdown. Powered by the privacy-friendly cookieless tracker installed in the Melbora Next.js template. Returns empty: true when the tracker hasn’t recorded any events yet (e.g. a freshly-provisioned site, or one that hasn’t been redeployed since the tracker was added to the template). Bots are excluded from the human KPIs but visible under the bots sub-object.

ParameterTypeRequiredDescription
websiteIdstringyes
range7d | 30d | 90d | allnoLookback window. Default 30d.

List the caller’s own API keys (the token currently in use is one of them). Returns id, name, prefix, lastUsedAt, revokedAt — never the secret.

No parameters.

Mint a new API key. The full token is in the response and ONLY in the response. Use sparingly (and revoke when no longer needed).

ParameterTypeRequiredDescription
namestringyes

Revoke an API key by keyId. Any session using it will start failing immediately. IMPORTANT: if you revoke the keyId that THIS MCP is currently authenticated with, every subsequent vantage_* call in this session will 401 until the user manually swaps credentials. The server refuses this by default — pass confirm: true only if you genuinely intend to rotate the active token (e.g. after a leak), and warn the user explicitly first.

ParameterTypeRequiredDescription
keyIdstringyes
confirmbooleannoSet to true to bypass the self-revoke safety check. Only needed when revoking the active session’s own token.

Read the website’s project-delivery block: estimatedCompletionAt (the promised ship date), showPreviewUrl gating, optional previewUrlOverride, and the ordered checkpoints array (each with id, label, status pending|in_progress|done, optional completedAt, optional dueAt, order). Also returns the resolved previewUrl (null when the toggle is off or no URL is available). Returns delivery: null when the admin hasn’t set up tracking yet — call vantage_websites_delivery_update with at least estimatedCompletionAt + showPreviewUrl to seed it (omit checkpoints to get the default template).

ParameterTypeRequiredDescription
websiteIdstringyes

Replace the website’s delivery block (admin only). Lower-level escape hatch — use vantage_websites_delivery_set_checkpoint for single-checkpoint tweaks. Pass estimatedCompletionAt (ISO timestamp) and showPreviewUrl (boolean) at minimum; optional previewUrlOverride sets a custom preview URL; optional checkpoints array does a full replace (omit to seed defaults on first call). Each checkpoint needs id, label, status, order; completedAt + dueAt are optional ISO timestamps. This is the only path that can set dueAt (the set_checkpoint helper covers status + dueAt only).

ParameterTypeRequiredDescription
websiteIdstringyes
estimatedCompletionAtstringyesISO timestamp of the promised completion date.
showPreviewUrlbooleanyesWhen true, the client portal surfaces the preview URL on the Status tab. Off by default.
previewUrlOverridestringnoOptional admin-supplied URL to surface instead of the runtime Vercel lookup.
checkpointsobject[]noFull ordered list. Omit on the very first call to seed the default template.

Convenience: patch a single checkpoint’s status and/or dueAt without rebuilding the whole checkpoints array. Pass status (pending|in_progress|done) to flip status, dueAt (ISO timestamp) to set a deadline, or dueAt: null to clear an existing deadline. When only status is provided, dispatches to the dedicated single-checkpoint endpoint; when dueAt is touched, reads the current block, patches the one checkpoint in place, and PUTs the whole thing back. At least one of status/dueAt must be provided.

ParameterTypeRequiredDescription
websiteIdstringyes
checkpointIdstringyes
statuspending | in_progress | doneno
dueAtstringnoISO timestamp to set the checkpoint’s deadline. Pass null (JSON null) to clear an existing deadline; omit the field entirely to leave it untouched.

List admin-uploaded project documents attached to a website (contracts, invoices, assets, etc.). Each entry has documentId, name (display), fileName (original), mimeType, sizeBytes, uploadedAt, uploadedByCognitoSub, category (contract|invoice|asset|other), and finalized flag. Use vantage_websites_documents_download_url to get a short-TTL URL the client can click.

ParameterTypeRequiredDescription
websiteIdstringyes

Mint a short-TTL presigned S3 GET URL for a single document. Returns { url, expiresInSeconds } — pass the URL to the client to download. Default disposition is attachment (forces a save dialog); pass inline for a URL the browser will render in-tab (used by the in-app PDF/image viewer).

ParameterTypeRequiredDescription
websiteIdstringyes
documentIdstringyes
dispositioninline | attachmentnoDefaults to attachment if omitted.

Rename a document (display name only — fileName, S3 key, and on-disk filename are untouched).

ParameterTypeRequiredDescription
websiteIdstringyes
documentIdstringyes
namestringyes

Delete a project document. Removes both the DDB metadata row and the S3 object — irreversible. Confirm with the user before calling.

ParameterTypeRequiredDescription
websiteIdstringyes
documentIdstringyes