Carryo Website Publisher
Server Details
Publish complete HTML as live websites, landing pages, interactive reports, presentations and client proposals. Update pages at the same URL, manage images, save private drafts and review version history. OAuth is required for account actions; tool discovery is public. Setup: https://carryo.io/docs
- Status
- Healthy
- Uptime
- 100.0% over 21 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 13 tools
Most tools have clear resource+action boundaries (publish vs save_draft vs edit vs edit_images are distinguished by outcome and description). However, website.library overlaps with website.list (both about locating a website), and website.edit/edit_images/save_draft/publish all touch HTML content, which could cause occasional misselection without careful reading.
Uniform namespace.action pattern throughout: account.check_publishing, team.list, and website.* tools all follow resource.verb_noun with snake_case consistently (e.g., website.edit_images, website.read_form_responses). No mixing of conventions.
13 tools is well-scoped for a website publishing/editing domain, with each tool covering a distinct lifecycle stage (create, read, edit, list, version history, unpublish). No filler or redundant tools.
Strong coverage of create (publish, save_draft), read (read, list, list_versions, read_version, read_form_responses), update (edit, edit_images), and soft-delete (unpublish). The main gap is a hard delete/remove-website operation and any tool for managing access/passwords or custom URLs, which are deferred to the web app.
Available Tools
13 toolsaccount.check_publishingCheck Publishing AvailabilityARead-onlyInspect
Checks publishing availability, remaining Personal website capacity, reset timing, hosted-image allowances, custom URL endings, branding capabilities, and inactivity policies for the connected Carryo account. Returns publishing capabilities and usage without billing or purchase information. Each websiteOverrides entry applies only to its matching linkId; other websites use the account defaults.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| usage | Yes | Personal link usage needed to answer the current action |
| limits | Yes | Personal default policies; websiteOverrides takes precedence for the named websites |
| capabilities | Yes | Personal default capabilities. Use websiteOverrides for the named websites, not for the whole account |
| websiteOverrides | No | Website-specific exceptions to Personal defaults. Explicit owner-set expiry and unpublishing still apply |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, openWorldHint=false, and destructiveHint=false, establishing that this is a safe read operation. The description adds valuable behavioral context beyond the annotations: the account scope, the explicit exclusion of billing/purchase data, and the nuance that each websiteOverrides entry applies only to its matching linkId.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is composed of three purposeful sentences with no filler. It front-loads the core purpose and then adds scope and response nuance. The first sentence is a somewhat long enumeration of checks, but each listed item meaningfully contributes to specifying what the tool reports.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only capability check with an output schema, the description is complete enough for an agent to invoke it correctly. It states what the tool reports, explicitly excludes billing/purchase information, and clarifies the websiteOverrides behavior. The agent can predict the response semantics without additional assumptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has no parameters, so there is nothing for the description to clarify about inputs. The description appropriately focuses on the meaning of the response instead, explaining what capabilities are included and how websiteOverrides behaves. This fits the baseline for a zero-parameter tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Checks') with a clear resource ('publishing availability for the connected Carryo account') and enumerates the concrete dimensions it covers, such as remaining capacity, reset timing, and allowances. This clearly distinguishes it from the website.* siblings, which operate on individual websites rather than the account level.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when the tool would be relevant—checking account-level publishing capabilities—and notes that it excludes billing or purchase information. However, it does not explicitly state when to prefer this tool over sibling tools like website.publish or website.read, nor does it name alternatives; the usage context must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
team.listFind Carryo TeamsARead-onlyInspect
Lists Carryo teams accessible to the connected account, including team names, workspaceId values, roles, and available actions. Supports finding a team the user has chosen. Team creation, invitations, membership, and billing are managed in the Carryo web app.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| workspaces | Yes | Carryo workspaces the authenticated user can access |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and non-destructive behavior, so the description adds value by noting that only teams accessible to the connected account are returned and that role/action information is included. This gives agents practical expectations about scope without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is short and front-loaded with the core behavior. The second sentence is somewhat redundant with the first, but the third sentence usefully redirects admin operations to the web app without adding significant length.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a parameterless read-only tool with an output schema and safety annotations, the description covers scope, access constraints, and out-of-band operations. Nothing essential is missing for an agent to select and call the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing for the description to clarify beyond the schema. Per baseline for parameterless tools, this is sufficient.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool lists Carryo teams accessible to the connected account and enumerates the fields included (names, workspaceId, roles, actions). This distinguishes it from the website-focused sibling tools by identifying the resource type (teams) and the operation (list).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear context for when the tool is useful: finding a team the user has chosen. It also explicitly excludes team creation, invitations, membership, and billing by redirecting those to the Carryo web app, providing a when-not boundary even though it doesn't name alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.editEdit a Live WebsiteADestructiveInspect
Replaces the complete HTML of an existing Carryo website while preserving its linkId and URL. Suitable for updating, fixing, or republishing a known page. Returns the website link and a Carryo management link. Access and edit limits are checked for the website identified by linkId. expectedVersionNumber detects conflicting edits. Supports adding or replacing hosted images and removing paths through removeAssetPaths. Pass attached images through imageFiles. For one attachment, assets needs only its relative website path; Carryo matches the attachment automatically. For multiple attachments, use fileIndex (0 for the first imageFiles entry). Do not invent file IDs or ask for a public URL when attachment upload is available. Known fileId references and fetchable HTTP(S) sourceUrl imports also work. Carryo imports and hosts its own copy. Base64 image bytes and data URLs are unsupported. Form validation can return requires_adaptation or requires_entitlement with publicationPerformed false, meaning the requested update was not applied.
| Name | Required | Description | Default |
|---|---|---|---|
| forms | No | Optional definitions for JavaScript/React forms using window.CarryoForms.submit(key, values), which resolves on acceptance and rejects on failure. Stable keys and field names identify forms across edits. Static collection forms are inferred from data-carryo-form="key" and named controls without duplicate definitions; placeholder submit handlers can block collection. Local calculator/filter forms use data-carryo-local and do not collect responses. Existing external endpoints retain their destination. Visitor acknowledgement is disabled unless explicitly enabled. | |
| assets | No | Optional image assets to add or replace. Each entry requires a relative website path. With one imageFiles attachment, path alone uses that attachment. Otherwise select exactly one source: fileIndex (zero-based imageFiles position), a known fileId, or a fetchable HTTP(S) sourceUrl. Never guess generated file IDs. Existing images are preserved when omitted; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported. | |
| linkId | Yes | Carryo page link identifier to update | |
| fileName | No | Optional replacement file name | |
| expiresAt | No | Optional ISO-8601 expiration timestamp | |
| imageFiles | No | Optional image attachments supplied through the host's file upload support. The host supplies file_id and download_url. Map each attachment to a website path in assets: with one attachment, path alone is sufficient; with multiple attachments, use fileIndex. The assistant does not need to know generated file IDs or download URLs. Temporary URLs are import sources, not hosted image URLs. Clients without file input support can omit this field. | |
| htmlContent | Yes | Updated complete HTML for the Carryo page while keeping the same URL. | |
| sharingMode | No | Optional replacement publishing mode. Only public live links are supported here. | |
| removeAssetPaths | No | Optional relative asset paths to remove from the page asset bundle. | |
| expectedVersionNumber | No | Expected current website version number for detecting conflicting edits. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | |
| forms | No | |
| linkId | No | Carryo page link identifier |
| status | No | |
| message | No | |
| guidance | No | |
| shareUrl | No | Primary share URL |
| expiresAt | No | Optional ISO-8601 expiration timestamp |
| manageUrl | No | Carryo web-app URL for managing the link URL, password, views, and edit history |
| updatedAt | No | ISO-8601 update timestamp |
| workspaceId | No | Workspace that owns the link; omitted for Personal |
| alternateShareUrls | No | Alternate share URLs, when available |
| currentVersionNumber | No | |
| publicationPerformed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations declare destructiveHint=true, and the description adds substantial operational detail beyond that hint: it replaces full HTML, preserves linkId/URL, checks access and edit limits, uses expectedVersionNumber for conflict detection, and can fail form validation with requires_adaptation or requires_entitlement and publicationPerformed=false, meaning the update was not applied. This gives a clear picture of side effects and failure behavior without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long, but nearly every sentence carries a distinct operational constraint or clarification. The main purpose is front-loaded before parameter-specific caveats, and the density is justified by the tool's complexity. Minor restructuring into bullet-like groupings could improve scannability, but there is little waste.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 10 parameters, complex asset/form behavior, a destructive annotation, and an output schema present, the description covers the needed selection logic, failure modes, return context, and image handling rules. It mentions returned links, validation failure meaning, edit-conflict detection, and how to map attachments, so no critical information appears missing for correct use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although schema coverage is 100%, the description adds high-value parameter guidance: path-only asset mapping for a single imageFiles attachment, fileIndex for multiple attachments, avoiding invented file IDs or public URLs when attachment upload is available, supporting known fileId and sourceUrl imports, and rejecting base64 bytes/data URLs. This goes beyond the schema's per-field descriptions and directly improves invocation correctness.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: it replaces the complete HTML of an existing Carryo website while preserving its linkId and URL. This clearly distinguishes it from sibling tools that read, list, publish, or edit images only, even though those sibling names are not explicitly invoked.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear invocation context: the tool is suitable for updating, fixing, or republishing a known page, and it notes that access and edit limits are checked. It does not explicitly name alternatives such as website.save_draft or website.edit_images or state when not to use this tool, so exclusions remain implicit rather than fully explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.edit_imagesEdit Website ImagesADestructiveInspect
Adds, replaces, or removes hosted images on an existing Carryo website without replacing its HTML. Reusing a path replaces that image without consuming another image slot; new paths are subject to the website image allowance. Returns hosted-image metadata and URLs. New paths appear in the page when referenced by its HTML. Pass attached images through imageFiles. For one attachment, assets needs only its relative website path; Carryo matches the attachment automatically. For multiple attachments, use fileIndex (0 for the first imageFiles entry). Do not invent file IDs or ask for a public URL when attachment upload is available. Known fileId references and fetchable HTTP(S) sourceUrl imports also work. Carryo imports and hosts its own copy. Base64 image bytes and data URLs are unsupported.
| Name | Required | Description | Default |
|---|---|---|---|
| assets | No | Optional image assets to add or replace. Each entry requires a relative website path. With one imageFiles attachment, path alone uses that attachment. Otherwise select exactly one source: fileIndex (zero-based imageFiles position), a known fileId, or a fetchable HTTP(S) sourceUrl. Never guess generated file IDs. Existing images are preserved when omitted; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported. | |
| linkId | Yes | Carryo page link identifier to update | |
| imageFiles | No | Optional image attachments supplied through the host's file upload support. The host supplies file_id and download_url. Map each attachment to a website path in assets: with one attachment, path alone is sufficient; with multiple attachments, use fileIndex. The assistant does not need to know generated file IDs or download URLs. Temporary URLs are import sources, not hosted image URLs. Clients without file input support can omit this field. | |
| removeAssetPaths | No | Optional relative asset paths to remove from the page asset bundle. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | |
| forms | No | |
| linkId | No | Carryo page link identifier |
| status | No | |
| message | No | |
| guidance | No | |
| shareUrl | No | Primary share URL |
| assetUrls | No | URLs for added or replaced assets |
| updatedAt | No | ISO-8601 update timestamp |
| currentVersionNumber | No | |
| publicationPerformed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate destructiveHint=true and readOnlyHint=false, but the description elaborates further: reusing a path does not consume an image slot; new paths are subject to allowance; images are hosted by Carryo (imports); and unsupported formats are disabled. This adds significant behavioral detail beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with the core action and quickly giving the most important constraint (reuse vs. new paths). It then covers attachment handling in a logical order. It's a bit long but every sentence contributes; no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (multiple ways to specify sources, slots, removal, output schema providing return info), the description covers everything an agent needs: how to use attachments, when to use each source type, restrictions, and the fact that it returns metadata. The output schema handles return values, so no missing pieces.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has near-complete descriptions for all parameters, but the description adds crucial operational meaning: how to map attachments to paths, the semantics of fileIndex (0-based), and the interaction between assets and imageFiles. It clarifies that fileId is only for known IDs and not to be guessed.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Adds, replaces, or removes') and resource ('hosted images on an existing Carryo website'), and distinguishes it from website.edit by noting it does not replace the HTML. It also covers key behavior like slot usage and return values.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit when-to-use guidance: for adding/replacing/removing images on a website, with alternatives clearly implied (use website.edit for full HTML editing). It gives detailed instructions on how to handle attachments (single vs multiple, fileId vs fileIndex) and what not to do (don't invent IDs or ask for public URL).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.libraryCarryoCRead-onlyInspect
Open your Carryo website library to select a live website or private draft and edit it with chat.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| workspaceId | No | Optional exact workspaceId of the Carryo team selected by the user. Lists Personal websites when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | Pagination limit used by the response |
| total | Yes | Total page count before pagination |
| offset | Yes | Pagination offset used by the response |
| artifacts | Yes | Carryo pages owned by the authenticated user |
| workspaces | Yes | Carryo workspaces the authenticated user can access |
| workspaceId | No | Workspace whose links were listed; omitted for Personal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, destructiveHint=false, and openWorldHint=false, so the safety profile is covered. The description adds little beyond that, and its 'edit it with chat' wording risks leading an agent to expect mutation from a read-only listing tool; it says nothing about pagination limits or what the library contains.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, which is appropriately sized, but it is under-specified rather than efficiently informative — the front-loaded clause spends its words on a vague 'open your library' framing instead of stating the concrete operation.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, but for a 3-parameter tool with 33% schema coverage and numerous near-duplicate siblings, the definition leaves the agent without routing guidance, parameter meaning, or scope constraints. It is too thin for this tool's ambiguity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 33%: workspaceId is documented in the schema, but 'limit' and 'offset' carry no description anywhere. The description text adds no parameter meaning at all (no mention of paging or workspace scoping), so it fails to compensate for the coverage gap.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
It names a resource ('Carryo website library') and implies a browse/select action, but the phrasing 'open ... to select ... and edit it with chat' describes a UI workflow rather than a clear tool verb, so it is unclear whether this lists, retrieves, or launches an editor. It also never distinguishes itself from the very similar sibling 'website.list' or 'website.list_versions'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to call this versus 'website.list', 'website.read', or 'website.list_versions', and no prerequisites or exclusions are given. The only usage hint is buried in the schema (workspaceId omission lists Personal sites), which the description does not surface.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.listList My WebsitesARead-onlyInspect
Lists the connected account's live Carryo websites and private drafts, with titles, linkIds, live links, status, and effective edit and inactivity policies. Suitable for finding a website by name. Returns Personal websites by default; workspaceId selects the user-chosen team's collection.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | ||
| offset | No | ||
| workspaceId | No | Optional exact workspaceId of the Carryo team selected by the user. Lists Personal websites when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| limit | Yes | Pagination limit used by the response |
| total | Yes | Total page count before pagination |
| offset | Yes | Pagination offset used by the response |
| artifacts | Yes | Carryo pages owned by the authenticated user |
| workspaceId | No | Workspace whose links were listed; omitted for Personal |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds genuinely non-annotated context: that it spans both live sites and private drafts and that it surfaces effective edit and inactivity policies, which helps the agent interpret results.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three tight sentences with the resource and returned fields front-loaded, then scoping, then the workspace default. No filler, though the field enumeration is slightly inventory-like.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return details need not be spelled out, and the description covers scope, defaults, and result breadth. Remaining gaps are pagination behavior for limit/offset and the relationship to the sibling website.library.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 33%: workspaceId is documented in the schema, but limit and offset are not. The description restates the workspaceId default (already in the schema) and adds nothing about pagination semantics, so the low-coverage gap is only partially compensated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Lists the connected account's live Carryo websites and private drafts') and enumerates the returned fields, so the agent knows exactly what it retrieves. It is clear against most siblings, though it never distinguishes itself from website.library, which could plausibly be a competing listing tool.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Suitable for finding a website by name' implies the intended scenario, and the Personal-vs-workspace default gives some operational context. However, there is no when-not guidance and no explicit routing to alternatives such as website.library or website.read, leaving the agent to infer which listing/read tool to pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.list_versionsList Website VersionsARead-onlyInspect
Lists previous versions of a Carryo website, including version details and changes, for reviewing edit history or planning a restoration. Returns version metadata without changing the website.
| Name | Required | Description | Default |
|---|---|---|---|
| linkId | Yes | Carryo page link identifier to inspect |
Output Schema
| Name | Required | Description |
|---|---|---|
| linkId | Yes | Carryo page link identifier |
| versions | Yes | Page version history |
| currentVersionNumber | Yes | Current page version number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description explicitly states 'without changing the website,' reinforcing the readOnlyHint and destructiveHint annotations. It also adds context that the tool 'Returns version metadata,' which clarifies the nature of the operation beyond the annotations alone.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no filler. It front-loads the core action and purpose, then adds a concise behavioral guarantee. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only list operation with one parameter, an output schema, and annotations covering safety, the description is complete. It gives purpose, scope, and non-destructive intent without missing critical information an agent would need.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The only parameter, linkId, is already fully documented in the schema with 'Carryo page link identifier to inspect.' Schema description coverage is 100%, so the description does not need to add parameter meaning. It remains at the baseline because no extra parameter context is provided.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Lists previous versions of a Carryo website') and the resource scope ('previous versions'). It also specifies what is included ('version details and changes') and distinguishes itself from sibling tools like website.list and website.read_version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use this tool: 'for reviewing edit history or planning a restoration.' It does not explicitly name alternatives or exclusion conditions, but the intended use cases are evident, so it earns a 4 rather than a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.publishPublish a Live WebsiteAInspect
Publishes supplied HTML as a new public Carryo website for sharing a presentation, proposal, report, dashboard, invitation, portfolio, or landing page. Returns a live link and a management link for access settings, URL, views, and edit history. New Personal websites consume the account creation allowance. Personal is the default destination; workspaceId selects a user-chosen team. Supports an optional customSlug and hosted images. Pass attached images through imageFiles. For one attachment, assets needs only its relative website path; Carryo matches the attachment automatically. For multiple attachments, use fileIndex (0 for the first imageFiles entry). Do not invent file IDs or ask for a public URL when attachment upload is available. Known fileId references and fetchable HTTP(S) sourceUrl imports also work. Carryo imports and hosts its own copy. Base64 image bytes and data URLs are unsupported. Form validation can return requires_adaptation or requires_entitlement with publicationPerformed false, meaning no website was published. Supports HTML pages and their image assets, without general file storage or backend hosting.
| Name | Required | Description | Default |
|---|---|---|---|
| forms | No | Optional definitions for JavaScript/React forms using window.CarryoForms.submit(key, values), which resolves on acceptance and rejects on failure. Stable keys and field names identify forms across edits. Static collection forms are inferred from data-carryo-form="key" and named controls without duplicate definitions; placeholder submit handlers can block collection. Local calculator/filter forms use data-carryo-local and do not collect responses. Existing external endpoints retain their destination. Visitor acknowledgement is disabled unless explicitly enabled. | |
| assets | No | Optional image assets to add or replace. Each entry requires a relative website path. With one imageFiles attachment, path alone uses that attachment. Otherwise select exactly one source: fileIndex (zero-based imageFiles position), a known fileId, or a fetchable HTTP(S) sourceUrl. Never guess generated file IDs. Existing images are preserved when omitted; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported. | |
| fileName | Yes | Short internal file name, for example client-proposal.html, board-deck.html, report.html, or landing-page.html. | |
| expiresAt | No | Optional ISO-8601 expiration timestamp | |
| customSlug | No | Optional user-chosen URL ending using lowercase letters, numbers, and hyphens. An automatic URL is generated when omitted. | |
| imageFiles | No | Optional image attachments supplied through the host's file upload support. The host supplies file_id and download_url. Map each attachment to a website path in assets: with one attachment, path alone is sufficient; with multiple attachments, use fileIndex. The assistant does not need to know generated file IDs or download URLs. Temporary URLs are import sources, not hosted image URLs. Clients without file input support can omit this field. | |
| htmlContent | Yes | Complete HTML for the page, presentation, slide deck, proposal, report, landing page, dashboard, invitation, portfolio, or one-page website to publish. | |
| sharingMode | Yes | Publishing mode for the Carryo page. Only public live links are supported here. | |
| workspaceId | No | Optional exact workspaceId of the Carryo team explicitly selected by the user. The default destination is Personal when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | |
| forms | No | |
| linkId | No | Carryo page link identifier |
| status | No | |
| message | No | |
| guidance | No | |
| shareUrl | No | Primary share URL |
| expiresAt | No | Optional ISO-8601 expiration timestamp |
| manageUrl | No | Carryo web-app URL for managing the link URL, password, views, and edit history |
| customSlug | No | Optional custom URL ending |
| workspaceId | No | Workspace that owns the link; omitted for Personal |
| alternateShareUrls | No | Alternate share URLs, when available |
| currentVersionNumber | No | |
| publicationPerformed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description reveals important side effects and failure modes: it consumes the account creation allowance, returns a management link for configuration, can fail with requires_adaptation/requires_entitlement and publicationPerformed false, imports and hosts its own copy of images, and explicitly lists unsupported formats. This is far more than the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries necessary information. It front-loads the primary purpose, then methodically addresses allowances, workspace selection, image handling, error cases, and limitations. Given the tool's complexity (9 parameters, multiple edge cases), this density is justified and not redundant.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description covers all critical aspects for a publishing tool: return artifacts (live and management links), side effects (allowance consumption), constraints (image handling, unsupported formats), and error outcomes (validation failures). The presence of an output schema reduces the need to explain return values, and the description sufficiently contextualizes the tool within its siblings.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema description coverage is 100%, so the baseline is 3. The tool description adds value by explaining the relationship between imageFiles and assets (path alone vs. fileIndex), reinforcing the rule to never invent file IDs, and clarifying that sharingMode only supports 'public'. These clarifications go beyond the schema, so a 4 is warranted.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a precise verb and resource: 'Publishes supplied HTML as a new public Carryo website' and enumerates the intended use cases (presentation, proposal, report, etc.). It also distinguishes itself from siblings by noting it creates a new website and returns live and management links, making it unmistakable from edit, unpublish, or save_draft.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives practical guidance: it explains when to attach images via imageFiles vs. assets, warns against inventing file IDs, notes that Personal is the default destination and workspaceId selects a team, and cautions about the account creation allowance. It also flags unsupported inputs (base64, data URLs). While it doesn't explicitly compare to sibling tools like website.save_draft, the context (new publication, no mention of drafts) implies the right usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.readRead the Current WebsiteARead-onlyInspect
Reads the current HTML, version number, hosted-image metadata, image limits, and remaining image slots for an existing Carryo website or private draft. Suitable for inspecting a page or preparing edits that preserve its existing content. Returns image metadata rather than image files. Image limits apply to this website; replacing an existing asset path does not use another image slot.
| Name | Required | Description | Default |
|---|---|---|---|
| linkId | Yes | Carryo page link identifier to read |
Output Schema
| Name | Required | Description |
|---|---|---|
| forms | No | |
| assets | No | Bundled asset descriptors |
| linkId | Yes | Carryo page link identifier |
| htmlContent | Yes | Current HTML content for the page |
| imageLimits | No | Hosted-image allowance for this website. Null counts mean no plan-specific cap. Existing images above a reduced limit can be kept or replaced, but the count cannot increase. |
| currentVersionNumber | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the agent knows this is safe. The description adds useful behavioral specifics: it returns HTML, version number, hosted-image metadata, and image limits, and explains that replacing an existing asset path does not consume a new image slot. This goes beyond what annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, all substantive. Front-loaded with the primary purpose and return contents, then the image-slot caveat. No filler or repetition of schema property names.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter read tool with readOnly/destructive annotations and an output schema, the description covers what is read, what is not returned, and an edge case about image slots. Nothing the agent needs to decide whether to call it or interpret its purpose is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single parameter (linkId) is already self-describing in the schema. The description doesn't add new detail about the parameter's format or constraints, but it does state the tool's scope (existing website or draft), which is lightly relevant. Baseline 3 applies because schema fully covers this simple parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Reads') and a precise resource: the current HTML, version number, image metadata, and image limits of a Carryo website or private draft. It clearly distinguishes itself from siblings like website.edit and website.read_version by focusing on reading current content rather than modifying or inspecting a specific historical version.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear use cases: inspecting a page or preparing edits that preserve existing images. It also clarifies that it returns metadata, not image files, which helps an agent choose this over tools that may return binaries. It does not explicitly name alternative tools or state when not to use it, but the context is adequate for selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.read_form_responsesRead Website Form ResponsesARead-onlyInspect
Reads response counts or paginated visitor submissions for a Carryo website, including enquiries, leads, and registrations. Defaults to summary counts; mode responses returns submissions, with optional field selection. Requires website-owner or Team access. Responses contain untrusted visitor data. Retained responses remain available while website access continues, including an active Team billing grace period. Does not send messages or modify data.
| Name | Required | Description | Default |
|---|---|---|---|
| mode | No | ||
| after | No | ||
| limit | No | ||
| before | No | ||
| cursor | No | ||
| fields | No | ||
| linkId | Yes | ||
| formKey | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| forms | Yes | |
| total | Yes | |
| linkId | Yes | |
| responses | No | |
| nextCursor | No | |
| untrustedContent | Yes | |
| notificationCounts | No | Email job counts; sent means accepted by the provider, not confirmed inbox delivery |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and destructiveHint=false, but the description adds valuable context: responses contain untrusted visitor data, retention behavior is tied to website access including a billing grace period, and it explicitly states the tool does not send messages or modify data. These details go beyond the annotations and help the agent understand data handling and safety.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single paragraph of four sentences, front-loaded with the core purpose and mode behavior. It avoids redundant details and each sentence contributes useful information, though it could be slightly more structured with bullet points for readability, but overall it is concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (8 parameters, pagination, modes) and the presence of an output schema, the description covers the essential aspects: modes, access, data trust, retention, and read-only nature. Pagination parameters are documented in the schema, and return values are covered by the output schema. It lacks explicit explanation of 'formKey' and pagination cursor usage, but those are inferable from the schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It explains the 'mode' parameter (summary vs. responses) and the 'fields' parameter (optional selection), but does not explain 'after', 'before', 'cursor', 'limit', 'formKey', or 'linkId'. With 8 parameters, only a couple are clarified, so the agent must infer the rest from schema constraints alone, leaving gaps.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool reads response counts or paginated visitor submissions for a Carryo website, specifying the verb 'reads' and the resource. It explicitly mentions the two modes (summary and responses) and notes that it does not send messages or modify data, distinguishing it from sibling tools like website.publish and website.edit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explains the default mode (summary) and the alternative mode (responses) with optional field selection, giving the agent guidance on how to get different kinds of data. It also mentions access requirements (website-owner or Team access) but does not explicitly state when to prefer this tool over alternatives, though no direct sibling tool handles form responses, so the use case is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.read_versionRead a Website VersionARead-onlyInspect
Reads the HTML and metadata of a specific previous Carryo website version for viewing, comparison, or restoration planning. Requires linkId and versionNumber. Reading a version does not restore it or change the current website.
| Name | Required | Description | Default |
|---|---|---|---|
| linkId | Yes | Carryo page link identifier to read | |
| versionNumber | Yes | Specific page version number to read |
Output Schema
| Name | Required | Description |
|---|---|---|
| forms | No | Form definitions belonging to this historical version, for comparison or restoration; not its current collection state |
| assets | No | Bundled asset descriptors |
| linkId | Yes | Carryo page link identifier |
| htmlContent | Yes | HTML content for the requested historical version |
| versionNumber | Yes | Page version number |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered. The description adds valuable context beyond annotations: it explicitly states that reading does not restore the version or change the current website, which is a key behavioral trait for an agent to know. It also clarifies the scope (HTML and metadata).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences with zero waste. The core action and resource are front-loaded, the required parameters are stated, and the critical non-destructive behavior is called out. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has an output schema, so return values don't need to be described. The description covers what it reads, the required parameters, and the non-destructive behavior. It could mention that this is for a 'previous' version vs. current, which it does. It doesn't explicitly say when NOT to use it (e.g., for current site use website.read), but the context is sufficient for a read-only tool with full schema coverage.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents both parameters (linkId and versionNumber) with descriptions. The tool description adds the requirement that both are needed ('Requires linkId and versionNumber') and clarifies that versionNumber refers to a 'specific previous' version, but this is marginal value over the schema. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Reads'), a specific resource ('HTML and metadata of a specific previous Carryo website version'), and its purpose ('viewing, comparison, or restoration planning'). It also distinguishes itself from sibling tools like website.read and website.list_versions by focusing on reading a specific previous version rather than the current site or listing versions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description clearly states when to use this tool: when you need to read a specific previous version, and it explicitly notes that reading does not restore or change the current website. It doesn't explicitly name alternatives like website.read or website.list_versions, but the context of 'previous version' vs. current site is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.save_draftSave a Private Website DraftAInspect
Saves supplied HTML as a new private Carryo website draft for review before publication. Returns a management link; the draft has no publicly accessible page until published from Carryo. Passwords and restricted access are configured in the Carryo web app. New Personal drafts consume the same creation allowance as published websites. Personal is the default destination; workspaceId selects a user-chosen team. Pass attached images through imageFiles. For one attachment, assets needs only its relative website path; Carryo matches the attachment automatically. For multiple attachments, use fileIndex (0 for the first imageFiles entry). Do not invent file IDs or ask for a public URL when attachment upload is available. Known fileId references and fetchable HTTP(S) sourceUrl imports also work. Carryo imports and hosts its own copy. Base64 image bytes and data URLs are unsupported. Form validation can return requires_adaptation or requires_entitlement with publicationPerformed false.
| Name | Required | Description | Default |
|---|---|---|---|
| forms | No | Optional definitions for JavaScript/React forms using window.CarryoForms.submit(key, values), which resolves on acceptance and rejects on failure. Stable keys and field names identify forms across edits. Static collection forms are inferred from data-carryo-form="key" and named controls without duplicate definitions; placeholder submit handlers can block collection. Local calculator/filter forms use data-carryo-local and do not collect responses. Existing external endpoints retain their destination. Visitor acknowledgement is disabled unless explicitly enabled. | |
| assets | No | Optional image assets to add or replace. Each entry requires a relative website path. With one imageFiles attachment, path alone uses that attachment. Otherwise select exactly one source: fileIndex (zero-based imageFiles position), a known fileId, or a fetchable HTTP(S) sourceUrl. Never guess generated file IDs. Existing images are preserved when omitted; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported. | |
| fileName | Yes | Short internal file name, for example client-proposal.html, board-deck.html, report.html, or landing-page.html. | |
| expiresAt | No | Optional ISO-8601 expiration timestamp | |
| customSlug | No | Optional user-chosen URL ending using lowercase letters, numbers, and hyphens. An automatic URL is generated when omitted. | |
| imageFiles | No | Optional image attachments supplied through the host's file upload support. The host supplies file_id and download_url. Map each attachment to a website path in assets: with one attachment, path alone is sufficient; with multiple attachments, use fileIndex. The assistant does not need to know generated file IDs or download URLs. Temporary URLs are import sources, not hosted image URLs. Clients without file input support can omit this field. | |
| htmlContent | Yes | Complete HTML for the private Carryo draft page, presentation, slide deck, proposal, report, landing page, dashboard, invitation, portfolio, or one-page website. | |
| workspaceId | No | Optional exact workspaceId of the Carryo team explicitly selected by the user. The default destination is Personal when omitted. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | |
| forms | No | |
| status | No | |
| draftId | No | Carryo private draft identifier |
| message | No | |
| guidance | No | |
| expiresAt | No | Optional ISO-8601 expiration timestamp |
| manageUrl | No | Carryo URL where the user can review access settings and publish the draft |
| workspaceId | No | Workspace that owns the draft; omitted for Personal |
| currentVersionNumber | No | |
| publicationPerformed | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only minimal annotations (readOnlyHint=false, openWorldHint=true, destructiveHint=false), the description carries the burden and delivers: it reveals the return behavior (management link), the visibility lifecycle (no public page until published), quota impact (Personal drafts consume creation allowance), hosting semantics (Carryo imports its own copy), unsupported inputs (base64/data URLs), and error states (requires_adaptation/requires_entitlement with publicationPerformed false). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Roughly 200 words is long, but the tool has 8 parameters with intricate attachment and form semantics, and nearly every sentence carries a distinct fact (allowance, hosting, exclusions, error codes). The core purpose is front-loaded and the parameter guidance flows logically, though a couple of sentences could be merged without losing meaning.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an 8-parameter tool, the description covers the full call surface: primary purpose, return value, visibility behavior, quota, destination selection, image attachment routing options, unsupported formats, and validation error responses. The output schema exists and the description still mentions the management link and publicationPerformed flag, so nothing critical is left to inference.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description goes beyond the schema by explaining the cross-parameter relationship between imageFiles and assets ('with multiple attachments, use fileIndex'), the anti-pattern warning ('Do not invent file IDs or ask for a public URL'), and the default Personal destination for workspaceId. This adds interpretive value beyond the schema's individual parameter notes.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The opening sentence names the exact verb and resource: 'Saves supplied HTML as a new private Carryo website draft for review before publication.' The word 'new' and 'private...before publication' distinguishes it from siblings like website.publish and website.edit, and the title mirrors the purpose without adding noise.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description establishes clear context: this tool is for creating a private draft with no public page until published, and the Personal vs workspaceId destination is explained. It does not explicitly name alternatives such as website.edit for existing drafts or website.publish for going live, so the when-not-to-use guidance is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
website.unpublishUnpublish a WebsiteADestructiveInspect
Unpublishes an existing Carryo website so viewers immediately lose access through its shared link. Recovery availability depends on the website and is shown in Carryo. Unpublishing does not cancel a subscription.
| Name | Required | Description | Default |
|---|---|---|---|
| linkId | Yes | Carryo page link identifier to take offline |
Output Schema
| Name | Required | Description |
|---|---|---|
| linkId | Yes | Carryo page link identifier |
| deleteAt | Yes | ISO-8601 deletion timestamp |
| revokedAt | Yes | ISO-8601 revocation timestamp |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=truecars, and the description adds meaningful specifics: the effect is immediate, access is lost through the shared link, recovery availability is conditional and surfaced in Carryo, and the action does not cancel a subscription. This goes well beyond the structured annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, with the primary effect and scope front-loaded. Every sentence adds useful information: immediate effect, reversibility caveat, and a non-goal. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a single-parameter destructive tool with annotations and an output schema present, the description covers the main action, the immediate consequence, recovery uncertainty, and a common misunderstanding. It does not describe how to obtain linkId, but the schema field description mitigates that gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is already complete (100%): the only parameter, linkId, has a clear description. The tool description adds little new parameter meaning beyond implying the linkId identifies the shared link. Baseline 3 is appropriate because the schema carries the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Unpublishes'), a precise subject ('existing Carryo website'), and a concrete effect ('viewers immediately lose access through its shared link'). This clearly distinguishes it from sibling tools like website.publish, website.edit, or website.read.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides clear context for when to use it: to take a website offline immediately. It also adds an exclusion ('does not cancel a subscription'), which prevents misuse. It does not explicitly name a sibling alternative, but the tool's purpose is distinct enough that no alternative is needed.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Added
website.library - Changed
website.list2 fields changed- added
Input schema / properties / limitAdded value: +{ + "maximum": 100, + "minimum": 1, + "type": "integer" +} - added
Input schema / properties / offsetAdded value: +{ + "minimum": 0, + "type": "integer" +}
4 tool updates
- Changed
website.edit5 fields changed- changed
Input schema / properties / assets / descriptionPrevious value: -"Optional image assets to add or replace. Each entry requires a relative HTML path and exactly one of fileId (matching imageFiles[].file_id) or sourceUrl (a fetchable HTTP(S) image URL). Existing images are preserved when omitted. The hosted-image allowance applies to the final website collection; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported."New value: +"Optional image assets to add or replace. Each entry requires a relative website path. With one imageFiles attachment, path alone uses that attachment. Otherwise select exactly one source: fileIndex (zero-based imageFiles position), a known fileId, or a fetchable HTTP(S) sourceUrl. Never guess generated file IDs. Existing images are preserved when omitted; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported." - changed
Input schema / properties / assets / items / properties / fileId / descriptionPrevious value: -"Attachment file_id matching a host-supplied imageFiles entry. Mutually exclusive with sourceUrl."New value: +"Known attachment file_id matching an imageFiles entry. Prefer fileIndex if the host-generated ID is not visible. Mutually exclusive with fileIndex and sourceUrl." - added
Input schema / properties / assets / items / properties / fileIndexAdded value: +{ + "description": "Zero-based position in imageFiles: 0 selects its first attachment. Use this when the host generates file IDs during upload. May be omitted when imageFiles contains exactly one attachment. Mutually exclusive with fileId and sourceUrl.", + "maximum": 19, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / assets / items / properties / sourceUrl / descriptionPrevious value: -"Fetchable HTTP(S) image URL for Carryo to import and host. Mutually exclusive with fileId. Data URLs and base64 bytes are unsupported."New value: +"Fetchable HTTP(S) image URL for Carryo to import and host. Mutually exclusive with fileId and fileIndex. Data URLs and base64 bytes are unsupported." - changed
Input schema / properties / imageFiles / descriptionPrevious value: -"Optional image attachments supplied by a compatible host, with file_id and download_url. Each attachment is mapped to a relative HTML path by an assets entry with the matching fileId. Temporary download URLs are import sources, not hosted image URLs. Clients without file input support can omit this field."New value: +"Optional image attachments supplied through the host's file upload support. The host supplies file_id and download_url. Map each attachment to a website path in assets: with one attachment, path alone is sufficient; with multiple attachments, use fileIndex. The assistant does not need to know generated file IDs or download URLs. Temporary URLs are import sources, not hosted image URLs. Clients without file input support can omit this field."
- Changed
website.edit_images5 fields changed- changed
Input schema / properties / assets / descriptionPrevious value: -"Optional image assets to add or replace. Each entry requires a relative HTML path and exactly one of fileId (matching imageFiles[].file_id) or sourceUrl (a fetchable HTTP(S) image URL). Existing images are preserved when omitted. The hosted-image allowance applies to the final website collection; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported."New value: +"Optional image assets to add or replace. Each entry requires a relative website path. With one imageFiles attachment, path alone uses that attachment. Otherwise select exactly one source: fileIndex (zero-based imageFiles position), a known fileId, or a fetchable HTTP(S) sourceUrl. Never guess generated file IDs. Existing images are preserved when omitted; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported." - changed
Input schema / properties / assets / items / properties / fileId / descriptionPrevious value: -"Attachment file_id matching a host-supplied imageFiles entry. Mutually exclusive with sourceUrl."New value: +"Known attachment file_id matching an imageFiles entry. Prefer fileIndex if the host-generated ID is not visible. Mutually exclusive with fileIndex and sourceUrl." - added
Input schema / properties / assets / items / properties / fileIndexAdded value: +{ + "description": "Zero-based position in imageFiles: 0 selects its first attachment. Use this when the host generates file IDs during upload. May be omitted when imageFiles contains exactly one attachment. Mutually exclusive with fileId and sourceUrl.", + "maximum": 19, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / assets / items / properties / sourceUrl / descriptionPrevious value: -"Fetchable HTTP(S) image URL for Carryo to import and host. Mutually exclusive with fileId. Data URLs and base64 bytes are unsupported."New value: +"Fetchable HTTP(S) image URL for Carryo to import and host. Mutually exclusive with fileId and fileIndex. Data URLs and base64 bytes are unsupported." - changed
Input schema / properties / imageFiles / descriptionPrevious value: -"Optional image attachments supplied by a compatible host, with file_id and download_url. Each attachment is mapped to a relative HTML path by an assets entry with the matching fileId. Temporary download URLs are import sources, not hosted image URLs. Clients without file input support can omit this field."New value: +"Optional image attachments supplied through the host's file upload support. The host supplies file_id and download_url. Map each attachment to a website path in assets: with one attachment, path alone is sufficient; with multiple attachments, use fileIndex. The assistant does not need to know generated file IDs or download URLs. Temporary URLs are import sources, not hosted image URLs. Clients without file input support can omit this field."
- Changed
website.publish5 fields changed- changed
Input schema / properties / assets / descriptionPrevious value: -"Optional image assets to add or replace. Each entry requires a relative HTML path and exactly one of fileId (matching imageFiles[].file_id) or sourceUrl (a fetchable HTTP(S) image URL). Existing images are preserved when omitted. The hosted-image allowance applies to the final website collection; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported."New value: +"Optional image assets to add or replace. Each entry requires a relative website path. With one imageFiles attachment, path alone uses that attachment. Otherwise select exactly one source: fileIndex (zero-based imageFiles position), a known fileId, or a fetchable HTTP(S) sourceUrl. Never guess generated file IDs. Existing images are preserved when omitted; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported." - changed
Input schema / properties / assets / items / properties / fileId / descriptionPrevious value: -"Attachment file_id matching a host-supplied imageFiles entry. Mutually exclusive with sourceUrl."New value: +"Known attachment file_id matching an imageFiles entry. Prefer fileIndex if the host-generated ID is not visible. Mutually exclusive with fileIndex and sourceUrl." - added
Input schema / properties / assets / items / properties / fileIndexAdded value: +{ + "description": "Zero-based position in imageFiles: 0 selects its first attachment. Use this when the host generates file IDs during upload. May be omitted when imageFiles contains exactly one attachment. Mutually exclusive with fileId and sourceUrl.", + "maximum": 19, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / assets / items / properties / sourceUrl / descriptionPrevious value: -"Fetchable HTTP(S) image URL for Carryo to import and host. Mutually exclusive with fileId. Data URLs and base64 bytes are unsupported."New value: +"Fetchable HTTP(S) image URL for Carryo to import and host. Mutually exclusive with fileId and fileIndex. Data URLs and base64 bytes are unsupported." - changed
Input schema / properties / imageFiles / descriptionPrevious value: -"Optional image attachments supplied by a compatible host, with file_id and download_url. Each attachment is mapped to a relative HTML path by an assets entry with the matching fileId. Temporary download URLs are import sources, not hosted image URLs. Clients without file input support can omit this field."New value: +"Optional image attachments supplied through the host's file upload support. The host supplies file_id and download_url. Map each attachment to a website path in assets: with one attachment, path alone is sufficient; with multiple attachments, use fileIndex. The assistant does not need to know generated file IDs or download URLs. Temporary URLs are import sources, not hosted image URLs. Clients without file input support can omit this field."
- Changed
website.save_draft5 fields changed- changed
Input schema / properties / assets / descriptionPrevious value: -"Optional image assets to add or replace. Each entry requires a relative HTML path and exactly one of fileId (matching imageFiles[].file_id) or sourceUrl (a fetchable HTTP(S) image URL). Existing images are preserved when omitted. The hosted-image allowance applies to the final website collection; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported."New value: +"Optional image assets to add or replace. Each entry requires a relative website path. With one imageFiles attachment, path alone uses that attachment. Otherwise select exactly one source: fileIndex (zero-based imageFiles position), a known fileId, or a fetchable HTTP(S) sourceUrl. Never guess generated file IDs. Existing images are preserved when omitted; replacing an existing path does not use another slot. Base64 bytes and data URLs are unsupported." - changed
Input schema / properties / assets / items / properties / fileId / descriptionPrevious value: -"Attachment file_id matching a host-supplied imageFiles entry. Mutually exclusive with sourceUrl."New value: +"Known attachment file_id matching an imageFiles entry. Prefer fileIndex if the host-generated ID is not visible. Mutually exclusive with fileIndex and sourceUrl." - added
Input schema / properties / assets / items / properties / fileIndexAdded value: +{ + "description": "Zero-based position in imageFiles: 0 selects its first attachment. Use this when the host generates file IDs during upload. May be omitted when imageFiles contains exactly one attachment. Mutually exclusive with fileId and sourceUrl.", + "maximum": 19, + "minimum": 0, + "type": "integer" +} - changed
Input schema / properties / assets / items / properties / sourceUrl / descriptionPrevious value: -"Fetchable HTTP(S) image URL for Carryo to import and host. Mutually exclusive with fileId. Data URLs and base64 bytes are unsupported."New value: +"Fetchable HTTP(S) image URL for Carryo to import and host. Mutually exclusive with fileId and fileIndex. Data URLs and base64 bytes are unsupported." - changed
Input schema / properties / imageFiles / descriptionPrevious value: -"Optional image attachments supplied by a compatible host, with file_id and download_url. Each attachment is mapped to a relative HTML path by an assets entry with the matching fileId. Temporary download URLs are import sources, not hosted image URLs. Clients without file input support can omit this field."New value: +"Optional image attachments supplied through the host's file upload support. The host supplies file_id and download_url. Map each attachment to a website path in assets: with one attachment, path alone is sufficient; with multiple attachments, use fileIndex. The assistant does not need to know generated file IDs or download URLs. Temporary URLs are import sources, not hosted image URLs. Clients without file input support can omit this field."
12 tool updates
- First observed
account.check_publishing - First observed
team.list - First observed
website.edit - First observed
website.edit_images - First observed
website.list - First observed
website.list_versions - First observed
website.publish - First observed
website.read - First observed
website.read_form_responses - First observed
website.read_version - First observed
website.save_draft - First observed
website.unpublish
Related MCP Servers
- AlicenseAqualityCmaintenanceEnables brand visibility monitoring across major AI platforms like ChatGPT, Claude, Gemini, and Perplexity. It allows users to track visibility scores, analyze competitor data, and receive actionable insights to improve AI-generated brand recommendations.1622 npm1MIT
- AlicenseCqualityAmaintenanceCompetitor Monitor AI - MCP server providing AI-powered tools and automation by MEOK AI Labs119 npm37 PyPIMIT
- AlicenseNot gradedqualityBmaintenanceEnables tracking competitor websites, changelogs, blog feeds, and pricing pages with meaningful diffs, classification, and Markdown digests via MCP tools for listing, adding, removing competitors, running checks, and retrieving digests or changes.MIT

industrylens-mcpofficial
AlicenseNot gradedqualityBmaintenanceBrowse IndustryLens's published competitive-intelligence reports and head-to-head competitor comparisons from any AI agent — real, source-backed data.MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.