MCP HeartbeatTHE MCP OBSERVATORY
Public workspace

Explore

Evidence for your next connection.

Independent measurements of remote MCP servers. Every observation has a timestamp.

Read-only probes

MCP server · Code & DevOps

Cactal

The website platform for AI agents. One API to build, host, and operate real websites.

Checks passed
12 / 22

2 failed · 8 not measured

Median response
460 ms

Median of successful probes over 7 days

30-day uptime
Not measured

Share of countable probes over 30 days, including daily rollups. Auth challenges are excluded.

Discovered tools
84

Tool definitions returned by this server

Independent monitoring

Health & checks

Status history

Outdated check

Last connection measurement is over 24 hours old. Current availability is unknown.

Last checked
Check summary by test group
Test areaPassedFailedUnmeasured
ConnectionCan a client connect and discover tools?
500
Reliability & speedDoes it respond consistently and quickly?
004
Access & authenticationWhat is required to use this server?
102
Tool qualityAre the tool definitions usable by an agent?
310
Publisher identityCan the publisher be traced to its source?
312

Unmeasured means there is not enough evidence to decide. How these checks work

Inspect individual checks 22 recorded

Core

  • Pass
    Reachable

    Latest probe returned HTTP 200 in 460 ms.

  • Pass
    Valid handshake

    protocolVersion 2025-11-25, serverInfo.name cactal-public-api.

  • Pass
    Lists tools

    tools/list returned 84 tools.

  • Pass
    Current protocol

    Negotiated 2025-11-25. The bar is 2025-06-18 or newer.

  • Pass
    HTTPS

    The endpoint URL is https.

Performance

  • Not measured
    Fast (p50)

    Median latency 460 ms over 1 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.

  • Not measured
    Consistent (p95)

    95th percentile 460 ms over 1 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.

  • Not measured
    Reliable (uptime)

    1 of 1 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.

  • Not measured
    Stable tool list

    Fewer than two successful probes in 30 days, so tool-list stability is not measured.

Access

  • Pass
    Open access

    tools/list succeeded with no credential, and the record declares none.

  • Not measured
    Standard auth

    Auth is not required, so the OAuth metadata check does not apply.

  • Not measured
    Free tier cited

    No publisher quote has been checked.

Tools

  • Pass
    Tools described

    Every tool description is at least 20 characters.

  • Pass
    Valid input schemas

    Every inputSchema is a JSON Schema object.

  • Fail
    Parameters documented

    126 of 350 parameters have a description (36%). The bar is 80%.

  • Pass
    Safety hints

    Every tool sets readOnlyHint or destructiveHint.

Publisher

  • Pass
    Verified namespace

    Listed in the Official MCP Registry.

  • Pass
    Website matches publisher

    The website host matches the reverse-domain namespace.

  • Fail
    Source repo linked

    No repository URL is on file.

  • Not measured
    Repo owner matches

    This namespace is not an io.github login, so the owner comparison does not apply.

  • Pass
    Recently updated

    Updated 2026-08-07T01:55:50.969471Z, within 180 days.

  • Not measured
    Open-source licence

    No GitHub repository to ask about a licence.

Start using Cactal

Connect to this server

Choose your client, copy the configuration, then enable the server in your client’s MCP settings.

Run this command in your terminal, then restart Claude Code.

Claude Code

claude mcp add --transport http cactal https://api.cactal.ai/v1/mcp

Capabilities

Tools 84

cms_collections_create

Creates a collection in the website’s CMS. `slug` uses lowercase letters, digits, and hyphens (max 64 characters, starting with a letter) and must be unique among the website’s active collections; `displayName` is 1–200 characters and `description` up to 2,000. Optionally pass `fields` (up to 100, same shape as the create-field body) to define the schema in the same call. A website can hold at most 100 active collections; the limit is enforced with a conflict error.

Discovered
cms_collections_delete

Soft-deletes the collection, making it and all of its items unreachable through the API; the slug becomes reusable. Refused with a conflict while any reference field in another collection targets this collection — delete those fields first. If the website has a published version, the deletion is validated against the published site’s content queries and rejected when the site still depends on the collection.

Discovered
cms_collections_update

Updates `displayName` (1–200 characters), `description` (up to 2,000 characters; pass `null` to clear), and/or `slug` (a rename). A slug change fails with a conflict when another active collection in the website already uses it, and when the website has a published version the rename is validated against the published site’s content queries and rejected when it would break them.

Discovered
cms_fields_create

Adds a typed field at the end of the collection’s field order. `key` is lowercase snake_case (max 64 characters), must be unique in the collection, and cannot use the reserved metadata names `id`, `slug`, `publishedAt`, `publishAt`, `createdAt`, `updatedAt`, or `position`; `type` is immutable after creation. `reference` and `multi_reference` fields require a `targetCollectionId` in the same website, and `option` fields require `config.choices` (1–1,000 choices). A collection can hold at most 100 fields, and `required: true` is rejected while the collection has active items — add the field as optional, backfill every item, then mark it required.

Discovered
cms_fields_delete

Permanently deletes the field and its stored values: the key is stripped from every item’s `data`, and reference or asset attachments made through the field are removed. This cannot be undone. If the website has a published version, the deletion is validated against the published site’s content queries and rejected when the site still depends on the field.

Discovered
cms_fields_update

Updates `displayName`, `description`, `required`, `isUnique`, `example`, and (for `option` fields only) `config`; `type` and `targetCollectionId` are immutable. Setting `required: true` is rejected until every active item has a valid value for the field. Setting `isUnique: true` enforces uniqueness on all future writes and fails with a conflict when existing values already collide; unique is not supported for `plain_text`, `markdown`, `multi_reference`, `image`, `gallery`, or `file` fields. Pass `key` to rename the field’s key: the key is atomically migrated in every stored item’s `data` in the same transaction (no values are lost), a conflict is returned when the new key is already used in the collection, and when the website has a published version the rename is validated against the published site’s content queries. Pass `position: "first"` or `"last"`, or `"before"` / `"after"` together with `anchorFieldId`, to move the field within the collection’s display order.

Discovered
cms_items_backreferences_list

Lists active items that reference the target item through a `reference` or `multi_reference` field, newest first, with cursor pagination (default 20 per page, maximum 100). Each source item appears once even when multiple fields point to the target. `depth` (0–3, default 0) controls reference hydration in the returned source items.

Discovered
cms_items_create

Creates an item at the end of the collection’s manual order. Scalar values go in `data` keyed by field key and are validated against the field types — unknown keys are rejected, required fields must be present, `plain_text` and `markdown` are capped at 1,048,576 bytes (markdown must not contain raw HTML), `date` values are ISO 8601 with timezone, and `color` values are normalized to hex. Relationship and asset values go in the side maps: `references` (`reference`: an item id; `multi_reference`: an ordered array of up to 1,000 ids), `images` (`image`: an asset id or `{ assetId, altText }`; `gallery`: an ordered array of up to 25 of those), and `files` (`file`: an asset id or `{ assetId }`). `slug` is optional — it is derived from `data.title` or `data.name` when omitted. Set a non-future `publishedAt` to create an already-published item, or a future `publishAt` to schedule it; the two fields are mutually exclusive.

Discovered
cms_items_delete

Soft-deletes the item: it disappears from reads, list results, and backreferences, and fields referencing it read `null` (single reference) or shrink (multi-reference). Its slug becomes reusable, and incoming references are preserved so the item can be restored.

Discovered
cms_items_get

Returns one item, looked up by `itemId` or by the `collectionId` + `slug` pair (provide exactly one of the two). The `data` object is complete and schema-shaped: every currently-defined field is present and missing optional values read as `null`. `depth` (0–3, default 0) embeds referenced items in place of their ids, one level per unit; referenced items that were deleted read as `null` (single reference) or are omitted from arrays (multi-reference). Set `published` to `"true"` or `"false"` to match only a published or only a draft item (a mismatch reads as not found). List items that reference it with `cms.items.backreferences.list`.

Discovered
cms_items_list

Returns the collection’s active items in manual (drag) order by default, 20 per page (max 100); paginate with `cursor` or with 1-based `page` offsets, not both. Filter with `published` (`true` / `false`) and a JSON-encoded `filter` map of `{ fieldKey: { operator: value } }` — operators `eq`, `neq`, `in`, `nin`, `gt`, `gte`, `lt`, `lte`, `contains`, `startsWith`, `endsWith`, and `exists`, plus `slug` equality on reference fields; metadata keys are `id`, `slug`, `publishedAt`, `publishAt`, `createdAt`, and `updatedAt`. Combine clauses with `filterLogic` (`and` by default, or `or`). `search` accepts a query string (1–200 characters) or JSON `{ "query", "fields" }` to restrict which text fields are searched; `sort` accepts JSON `{ "kind": "field" | "meta", "field", "direction": "asc" | "desc" }`, where sortable metadata fields are `id`, `slug`, `publishedAt`, `publishAt`, `createdAt`, `updatedAt`, and `position`. `depth` (0–3, default 0) embeds referenced items in place of their ids, one level per unit.

Discovered
cms_items_restore

Restores a soft-deleted item, making it readable again and re-exposing references to and from it. Returns 404 when the item is not currently deleted.

Discovered
cms_items_setPublished

Use exactly one publication action: `published: true` publishes immediately and sets `publishedAt` to now; a future `publishAt` schedules a draft for automatic publication; `published: false` unpublishes an item or cancels its schedule. A published item must be unpublished before it can be scheduled because CMS items do not have revision snapshots. Published websites read only items with an actual `publishedAt`, so immediate and scheduled promotion become visible without a site republish. Repeating the same action is idempotent.

Discovered
cms_items_update

Patches an item; omitted fields are left untouched. Keys in `data` are merged into the existing values and validated the same way as on create, while each key provided in `references`, `images`, or `files` replaces that field’s value wholesale — pass `null` (or `[]` for multi-valued fields) to clear an optional field. `slug` renames the item’s slug; slug and unique-field collisions fail with a conflict. Pass `position: "first"` or `"last"`, or `"before"` / `"after"` together with `anchorItemId`, to move the item within the collection’s manual order — the default sort for item lists.

Discovered
cms_schema_snapshot

Returns every active collection and field of a website in one call — the full content model. Collections are ordered newest first; fields are grouped by collection in display order. Use this to discover the schema before reading or writing items.

Discovered
docs_read

Read one Cactal documentation page as Markdown. Pass a page path from docs search results, for example "concepts/publishing" or "agents/agent-safe-publishing". Pass "llms.txt" for an index of every page with titles and descriptions.

Discovered
docs_search

Search the Cactal product documentation: concepts, guides, agent workflows, platform limits, and the API reference. Returns matching Markdown excerpts with page paths; read a full page with the docs read operation. Consult the docs before non-trivial or unfamiliar work such as source-code editing, publishing, or CMS schema changes.

Discovered
feedback_submit

Adds user-requested free-form feedback to the Cactal product-feedback inbox. Describe what happened and what would have made the experience better. Agents must set `authorKind` to `agent` even when acting through a user OAuth connection. Never include credentials, secrets, raw sensitive user content, or unnecessary personal or customer data.

Discovered
profile_get

Returns who this credential acts for (a stable `id`, plus `name` and `email` for a person) and the organizations it can work in. An organization lists `websites` only when access is limited to those websites. Use an organization `id` to list or create websites.

Discovered
skills_read

Read the matching Cactal skill before acting: source-editing-workflow before source edits, design-direction for design, copywriting for words. Required skills are included. - analytics: Traffic, visitors, referrers, and other analytics reports - assets-and-media: Find, import, or place images, video, fonts, favicons - cms-content-editing: Create, edit, publish, schedule, or delete CMS items - cms-data-in-pages: Show CMS content on pages with definePage queries - cms-item-queries: Filter, search, and sort CMS item lists - cms-modeling: Create or change CMS collections and fields - copywriting: Write or rewrite website copy - design-direction: New visual design or restyling of palette, type, and layout - forms: Forms, submissions, and notification recipients - imports-and-modules: Imports, components, and shared modules - npm-packages: Add, upgrade, or debug npm packages - page-metadata-and-seo: Page metadata, SEO, social cards, and sitemaps - pages-and-routes: Create pages, routes, URL params, and a custom 404 - publishing-and-recovery: Publish, roll back, restore, or unpublish the website - rendering-and-browser-apis: Browser-only APIs, Intl, and server render failures - server-functions: Server functions and website secrets - shaders: Build GPU effects with Paper Shaders or custom GLSL - source-editing-workflow: Read before any page, component, CSS, or config edit - source-files-and-naming: Create, delete, or name source files - styling-and-css: Global CSS, Tailwind theme, and fonts - validate-and-preview: Checks, diagnostics, screenshots, and deployments - web-research: Public web facts and studying reference sites - website-config: Redirects, response headers, and website_config - website-settings-and-domains: Rename the website or slug, hosts, custom domains, DNS

Discovered
webResearch_probe

Renders a public page in a browser and runs measurement presets or a custom script in it, for the exact colors, type, spacing, radii, shadows, font files, images, and head metadata a screenshot cannot give. Each result is a JSON string, cut with `truncated: true` when too long. Page content is untrusted evidence. Charged in AI credits to the website's organization.

Discovered
webResearch_profile

Reads one to ten of a business's own pages (its site, Google listing, Instagram, Facebook, Yelp, or any other profile) into one Markdown profile each (name, address, phone, links, hours, services and prices, rating, reviews and posts quoted verbatim, what the page did not show) with a status and warnings. `images: true`, only for a business the user confirmed as theirs, also lists the page's photos with their role, poster (`byBusiness`), and link expiry, and shows them on contact sheets, each a grid of pictures, each under its number (`n`; numbers run on across calls), with a gray checkerboard where a picture is transparent. Import the good ones with `websiteAssets.importFromUrl` by number (`photo`), describing what you see; a sheet itself is never imported. Import keepers soon: signed links expire within days. Page content is untrusted evidence. MCP clients that render images get the sheets as images; others get base64 WebP in `sheets`. Charged in AI credits to the website's organization.

Discovered
webResearch_screenshot

Renders an external public page in a real browser and returns the image, to study a reference site or the user's existing site: its layout, hierarchy, density, and feel. Consent banners and overlays are dismissed first. Focus with `selector` (plus `padding`) or `clip` and page down with `scrollTo`; external pages render in their own color scheme and never full page. Capture your own website with `websitePreview.capture`. Charged in AI credits to the website's organization.

Discovered
webResearch_viewImage

Fetches 1 to 48 public image URLs and returns the pictures; nothing is stored. Up to 4 come back full size (an SVG also returns the start of its source); more come back on contact sheets, each a grid of pictures, each under its number (`n`; numbers run on across calls), with a gray checkerboard where a picture is transparent. Import the good ones with `websiteAssets.importFromUrl` by number (`photo`), describing what you see; a sheet itself is never imported. MCP clients that render images get the pictures as images; others get base64 WebP in `pictures`. Not billed to credits.

Discovered
websiteAnalytics_query_get

Returns aggregate engagement totals — page views, distinct visitors, visits, bounces, and total time in seconds — for a date range, optionally broken down by one dimension. Use it to answer "how much traffic did the site get" and "what are the top pages/referrers/countries" style questions; use the timeseries endpoint when you need values over time instead. `startAt` and `endAt` are Unix epoch milliseconds; optional filter parameters (path, referrer, country, event, UTM fields, ...) narrow the data. Without `dimension` the response carries the totals alone. With `dimension` (e.g. `path` for top pages, `referrer` for top referrers, `country` for top countries) the response also carries `rows`: up to `limit` (default 25, max 1000) values of that dimension ranked by page views, each with its own engagement totals. Requires a plan that includes analytics (403 otherwise); all-zero totals until the website is published and has traffic.

Discovered
websiteAnalytics_realtime_get

Returns a compact snapshot of traffic over Umami's trailing 30-minute realtime window: total page views, distinct visitors, tracked custom events, and distinct countries, plus the snapshot timestamp. The visitor total is not directly comparable to the removed `active` endpoint's five-minute count. Use it to see recent activity; use the query endpoint for historical ranges. Requires a plan that includes analytics (403 otherwise); all-zero totals until the website is published and has traffic.

Discovered
websiteAnalytics_timeseries_get

Returns one traffic time series bucketed by `unit` (`year`, `month`, `day`, `hour`, or `minute`). `series` selects which: `pageviews` returns parallel `pageviews` and `sessions` arrays with one point per time bucket (and accepts `compare` — `prev` or `yoy` — to request comparison data for the previous period or year), while `events` returns tracked custom-event counts as one `events` point per event name per time bucket. Only the requested series' fields are present in the response. `startAt` and `endAt` are Unix epoch milliseconds; `timezone` is an IANA name (e.g. `America/New_York`) that controls bucket boundaries; optional filter parameters narrow the data. The series is capped to the most recent `maxPoints` time buckets (default 30, max 500); a `truncated` field reports when the cap was applied. Requires a plan that includes analytics (403 otherwise); empty until the website is published and has traffic.

Discovered
websiteAssets_delete

Archives the asset: it immediately stops appearing in list responses and its id returns 404 from every asset endpoint. Archival cannot be undone through the API; previously issued CDN URLs keep serving the file.

Discovered
websiteAssets_get

Returns the asset with `description`, `category`, and its CDN delivery shape: for transformable images `url` is the optimized 1920px default and `originalUrl` the original bytes; both never expire. MCP clients that render images also receive the image.

Discovered
websiteAssets_importFromUrl

Fetches 1-10 public http(s) URLs server-side, one at a time, and stores each as a ready asset with no upload or finalize step. Media only: images, fonts, PDF, audio, video, dotLottie, and Rive; text, data, documents, and archives are refused. Images, fonts, and PDFs must parse as what they claim, hosts on private addresses are rejected, the upload kind and MIME rules apply, and each download is capped at 30 MiB (larger files must be uploaded directly). Each item may carry a `description` and, for images, a `category`. Name each item by `url`, or by `photo`: the number over a picture on contact sheets `webResearch.profile` or `webResearch.viewImage` showed you, which saves copying its long signed link. `assets` carries successes with CDN URLs and `sourceUrl`; `errors` carries failures typed `invalid_url`, `non_public_address`, `unreachable`, `too_large`, `unsupported_type`, `signature_expired`, or `unknown_photo` (a number you were not shown or that expired; look at the pictures again for current numbers). Import only assets you have the right to use.

Discovered
websiteAssets_list

Returns ready assets newest first as compact rows (`description`, `category`, dimensions, `url`, `srcSet`); fetch one asset for `originalUrl` and `variants`. Filter by `kind`, `category`, `type` (the broad MIME family: image, video, audio, font, or document), or `search`, which prefix-matches each term against the filename, description, and category; every term must match, else any term. Page size defaults to 50 (max 100).

Discovered
websiteAssets_update

Changes `filename`, `description`, or `category`. Pass only the fields to change; `null` clears a field. `category` is images only.

Discovered
websiteDomains_createCustomDomain

Claims `hostname` for this website and registers it with the Cactal edge. Custom domains must first be enabled for the website (`websiteDomains.setEnabled`, owner-only — enabling is the billing moment); the request fails with 403 `custom_domains_disabled` otherwise. Adding or removing domains on an enabled website never changes billing. The domain is created in `pending_dns` status, and the returned `dnsRecords` list exactly what to create at your DNS provider: an ownership TXT record on `_cactal.<hostname>` plus a routing record (a CNAME for subdomains or an A record for apex domains). Hostnames must be lowercase ASCII domains (not IP addresses or Cactal platform hosts), each website can have at most 10 custom domains, and a hostname can be claimed by only one website; claims that never verify expire after 7 days. After creating the records, call the verify endpoint or wait for the automatic re-checks.

Discovered
websiteDomains_list

Returns every domain record attached to the website, oldest first: the automatically allocated platform subdomain plus any custom domains. Platform subdomains are always `active`; custom domains carry their current verification status and the DNS records still expected.

Discovered
websiteDomains_removeCustomDomain

Deregisters the hostname from the Cactal edge and deletes the domain record. If the removed domain was primary, the oldest remaining active custom domain is promoted automatically. If edge deregistration fails, the domain stays in `removing` status and a background sweep retries until it is gone. Platform subdomains cannot be removed.

Discovered
websiteDomains_renamePlatformDomain

Moves the website to `<label>.<platform domain>`, the free address every website is allocated at creation. `label` is just the leading part: 1-40 characters, lowercase letters, digits, and inner hyphens, and it may not be one of the labels Cactal reserves. The change takes effect immediately, on published and draft hosts alike. The previous hostname is released at the same moment, with no redirect and no grace period, so any existing links to it break and another website may claim it. Take care on a published site. Fails with 409 when the label is already taken by another website; renaming to the label the website already has is a no-op. Custom domains are unaffected, and if one of them is primary it stays the canonical address.

Discovered
websiteDomains_setPrimaryDomain

Makes this domain the canonical hostname for the published website: requests reaching the platform subdomain or any other custom domain are permanently redirected (HTTP 308) to it, preserving path and query. Only `active` custom domains can be made primary — the request fails with 409 otherwise. Any previous primary is cleared in the same transaction.

Discovered
websiteDomains_verifyCustomDomain

Re-checks the ownership TXT record, edge readiness, and whether an HTTPS request to the hostname reaches this Cactal domain, then returns the updated status. A customer CDN or reverse proxy in front is supported when it forwards the verification request to Cactal. `failureMessage` distinguishes a missing ownership record, an unreachable hostname, and a hostname served somewhere else. Cactal asks the domain nameservers directly, so new records usually count on the next check, and this endpoint is safe to poll; Cactal also re-checks pending domains automatically (every minute for the first 2 hours, every 5 minutes for the first day, then every 15 minutes). The first custom domain to become active is promoted to primary automatically.

Discovered
websiteFavicons_set

Sets the website’s current favicon to a ready PNG, SVG, or ICO image from the same website asset library. Send `assetId: null` to clear it. The change applies immediately to every site host and is independent of source drafts and publishing. Read the current favicon from the `faviconUrl` field on `GET /websites` and `GET /websites/find`.

Discovered
websiteForms_list

Returns every form with inbox and spam counts, whether the published site still references it, who it notifies, the number of inbox submissions since the caller last opened the Forms tab, and monthly usage against the Free plan limit (`limit` is null on paid plans). Forms come from `<form method="post" action="/_cactal/forms/<name>">` in the website source and appear here as soon as the draft or published build contains them, before any submission.

Discovered
websiteForms_recipients_add

Adds an email address to one form, identified by its name from the action path. New forms notify the organization owners until changed. Organization members and website editors receive submissions immediately; other addresses get a confirmation email (link valid 7 days). `member` and `confirmed` addresses receive email; `pending` addresses must confirm by link; `failing` addresses bounced or complained; `stopped` addresses opted out. Works before the first submission; at most 20 addresses per website.

Discovered
websiteForms_recipients_remove

Stops emailing an address for one form. A form with no recipients emails nobody; its submissions still reach the Forms inbox.

Discovered
websiteForms_recipients_resend

Issues a fresh confirmation link to a pending, failing, or stopped address.

Discovered
websiteForms_submissions_delete

Permanently deletes one submission.

Discovered
websiteForms_submissions_get

Returns one submission with its fields in submitted order.

Discovered
websiteForms_submissions_list

Returns submissions newest first as a cursor-paginated page. Filter by `form` name, `status` (`inbox` by default, or `spam`), and `source` (`published` for real visitors, `draft` for test submissions from the draft preview). Items carry the fields in submitted order, the inferred submitter email and name, page, spam signals, classifier verdict, and notification state. Submission data is personal information: never render it on the public website.

Discovered
websiteForms_submissions_setStatus

Moves a submission between the inbox and the spam folder. Restoring to `inbox` sends the notification email if it was never sent. Spam is deleted automatically after 30 days.

Discovered
websiteFunctions_invoke

Runs one of the draft site's `http` server functions with the website's secrets and returns its result, exactly as page code on the draft would receive it. It makes the function's real outgoing requests. Counts toward the plan's monthly calls.

Discovered
websiteFunctions_runs_get

Returns one run with its input, output, console output and outgoing requests. Secret values, in plain and common encoded forms, are redacted.

Discovered
websiteFunctions_runs_list

Lists a website's server function runs, newest first, for `http` calls and form submissions alike. Secret values are redacted. Runs are kept for 30 days.

Discovered
websiteKnowledge_agentNotes_edit

Applies exact-match text edits to the agent notes, in order; an empty `oldStr` appends. Record only durable facts, decisions, rejected directions, and constraints, one short line each, never progress logs or anything derivable from the website source. A passage that no longer matches fails with `validation` and returns the current notes.

Discovered
websiteKnowledge_create

Keeps pasted or typed text as a context entry the agent searches and reads when relevant, using one of the website’s 25 slots. Cactal titles and describes it. Use this for material the user gives you to keep; your own findings belong in agent notes.

Discovered
websiteKnowledge_list

Lists the website’s private durable context entries: uploaded files and pasted text, each with a `title`, a generated `description`, and an `origin` of `upload` or `text`.

Discovered
websiteKnowledge_project_edit

Applies exact-match text edits to the user’s project knowledge text, in order; an empty `oldStr` appends. Change it only when the user asks; agent-discovered facts belong in agent notes. A passage that no longer matches fails with `validation` and returns the current content.

Discovered
websiteKnowledge_project_get

Returns the website’s durable project knowledge: the text the user maintains as `content`, plus the `agentNotes` Cactal distills from agent conversations. Both are included in every Cactal agent request. Read them before working on a website.

Discovered
websiteKnowledge_read

Read a bounded line range from a project context document. Read short relevant documents directly; search large documents first. Do not reread sufficient search passages.

Discovered
websiteKnowledge_search

Find evidence across selected project context documents. Batch independent queries; use passages directly when sufficient. Results merge overlapping text and include source ranges and zero-based queryIndexes into queries. matched reports a hit; truncated means evidence may be omitted, clipped means partial lines, and unavailableResourceIds were not searched. Resolve missing evidence before concluding a fact is absent.

Discovered
websiteKnowledge_update

Renames a context entry or replaces the text the agent reads. Replacing text does not change the downloadable original; images have no text.

Discovered
websiteKnowledge_view

Returns one private PNG, JPEG, or WebP context resource.

Discovered
websitePreview_capture

Renders one page of the site in a real browser and returns the image, so you can check layout, spacing, and responsive behaviour that source-level checks cannot see. `path` is site-relative and may include a query string, so dynamic routes are captured with real values rather than placeholders. Focus the capture with `selector` (plus optional `padding` for surrounding context) or a `clip` rectangle in CSS pixels from the top-left of the page; the region is scrolled into view and captured within the configured viewport, so it must fit inside it, and these options exclude each other and `fullPage`. Fonts, images, and (for `fullPage`) lazy content are awaited before the capture, and CSS animations are fast-forwarded to their end state by default. Fails with 409 when the draft build is still in progress or has failed; poll `websiteSourceCode.deployment.status` and retry.

Discovered
websites_create

Creates a website in the organization. Provide either a `name` (trimmed, 1–200 characters) or a creation `prompt`; a prompt returns immediately with the temporary name `Untitled site`, which the built-in naming request attempts to replace on its next run together with a matching available slug and platform hostname. The hostname receives a short suffix when the clean hostname is unavailable. An omitted `slug` is allocated from the initial name; an explicit slug must be lowercase, URL-safe, unreserved, and unique among active websites in the organization. The website starts as an unpublished draft at `headVersion` 1. Send an `idempotencyKey` to make retries return the same website. Edit its source through the Source code operations, then publish with `websiteSourceCode.head.publish`.

Discovered
websites_get

Returns a single website by `websiteId`, or by its `organizationSlug` + `websiteSlug` pair when starting from a URL — provide exactly one of the two identifications. The response includes whether the caller can manage the website’s CMS schema and domains. Websites in the trash remain retrievable by id (see `websites.list` with `status=deleted` for their purge timing); slug lookups only resolve active websites, and inaccessible or deleted resources return 404.

Discovered
websites_list

Lists accessible websites. By default returns active websites: use `organizationId` to scope one organization, `scope=shared` without it for direct grants outside your memberships, or `scope=all` with it to combine both; supports `sort` by `createdAt`, `updatedAt`, or `name` and case-insensitive `search`, and each item includes `organizationSlug`, `primaryHostname`, and whether it is `shared`. Pass `status=deleted` with `organizationId` (requires organization-level trash access) to list restorable soft-deleted websites instead, each with its deletion time and purge deadline; deleted rows drop out when their 30-day restore window expires. Both modes use cursor pagination (default 20 per page, maximum 100). Fetch one website with `websites.get`.

Discovered
websites_rename

Updates the website’s display name and, when supplied, its URL slug. The slug must be lowercase, URL-safe, unreserved, and unique among active websites in the organization.

Discovered
websiteSecrets_list

Returns the names of a website's secrets with when each was created and last changed. Values are write-only and never returned. Server functions read secrets from `env` by name.

Discovered
websiteSourceCode_changes_list

Lists added, removed, and modified file identities between two version refs, defaulting from published to head. Results use cursor pagination; pin continuation requests to the resolved version numbers.

Discovered
websiteSourceCode_deployment_ensure

Returns an existing non-failed deployment for the selected version or builds one. Poll status when another request is already building it.

Discovered
websiteSourceCode_deployment_status

Returns the preview revision, available page routes, publish availability, and build state for the selected head or published source version. Fails with 404 when `target=published` is requested for a never-published website.

Discovered
websiteSourceCode_files_delete

Deletes one head file while preserving history. Address named files by `type` and `name`, and singletons by `type`; takes the edit lease when no `leaseToken` is sent.

Discovered
websiteSourceCode_files_diff

Returns a bounded unified diff for one file name between two version refs, defaulting from published to head.

Discovered
websiteSourceCode_files_list

Lists file identities, sizes, and line counts without contents, sorted by type then name with cursor pagination (default 20, maximum 100). Filter by name with `nameGlob`. Defaults to head; pass `target=published` or an explicit `version`, and pin continuation requests to the resolved response version.

Discovered
websiteSourceCode_files_read

Reads up to 50 files by name from head, published, or an explicit version. A single-file read supports line and character ranges; continue truncated reads with `nextStartCharacter` and the resolved `version`.

Discovered
websiteSourceCode_files_search

Finds text across every source file and returns one entry per matching line with its file name, line, and column. Call this first to locate code, then read only the files it names with websiteSourceCode.files.read. `pattern` is literal text unless `isRegex` is set, and matching is line by line, so a pattern cannot span a newline. Narrow with `nameGlob` and `type`, ask for surrounding lines with `contextLines`, or set `filesOnly` for the cheapest orientation. Results are cursor-paginated over matches.

Discovered
websiteSourceCode_files_strReplace

Atomically applies ordered exact-string edits to up to 50 files and 200 edits in total as one head version. Each `oldStr` must match once unless `replaceAll` is true, and any failing edit aborts the whole call. Set `dryRun` to validate and count replacements without committing. Takes the edit lease when no `leaseToken` is sent.

Discovered
websiteSourceCode_files_upsert

Creates or replaces one head file. Pages, components, and modules require `name`; singleton types take only `type`. Takes the edit lease when no `leaseToken` is sent and returns `changed: false` for identical content.

Discovered
websiteSourceCode_head_check

Runs the publish-time framework quality gate without changing source: format, typecheck, lint, build, and a server-render of every page using placeholder content synthesized from the CMS schema. Failures return `ok: false` with diagnostics, and pages that compiled but threw while rendering in `renderFailures`. No lease is required and no CMS content is read, so the outcome depends only on source and schema.

Discovered
websiteSourceCode_head_publish

Validates, builds, and publishes head. Canonical formatting may create a new head first. Pass the `version` the check returned to refuse publishing a draft that changed since. Takes the edit lease when no `leaseToken` is sent.

Discovered
websiteSourceCode_head_restore

Copies an earlier version or `published` into a new head without publishing or rewriting history. Takes the edit lease when no `leaseToken` is sent.

Discovered
websiteSourceCode_lease_acquire

Acquires and replaces the website's single edit lease, taking over from any other editor. Writes that pass the returned principal-bound `leaseToken` keep working until someone else takes the lease; writes without a token take the lease automatically unless another editor is still working: the Cactal agent while it runs, or another caller that wrote in the last 5 minutes.

Discovered
websiteSourceCode_metadata_edit

Replaces a page's complete metadata object when `page` is sent, otherwise the site defaults in `website_config`. Takes the edit lease when no `leaseToken` is sent.

Discovered
websiteSourceCode_pages_editRoute

Rewrites and normalizes a page's `definePage` route literal. Takes the edit lease when no `leaseToken` is sent.

Discovered
websiteSourceCode_published_rollback

Validates and republishes an earlier version as a new head and published version, preserving history. Takes the edit lease when no `leaseToken` is sent.

Discovered
websiteSourceCode_published_unpublish

Takes the website offline without changing its draft source or version history. The unchanged head can be published again later. No edit lease is required.

Discovered
websiteSourceCode_summary_get

Returns `headVersion`, `publishedVersion`, and whether the website has unpublished source changes.

Discovered

Recent measurements

Probe history

View status
Latest stored probes. Raw probe rows are kept for 14 days.
CheckedResultResponseTools
Connected460 ms84