Skip to main content
Glama
jhauga
by jhauga

mcp-chat-cards

An MCP (Model Context Protocol) server that renders interactive HTML cards inside desktop chat clients. Instead of walls of text, conversations get tab boxes, tables, charts, forms, short video clips, collapsible sections, and numbered outlines. On hosts that support the MCP Apps extension (SEP-1865), cards render inline in the conversation as sandboxed iframes; other hosts receive each card as a self-contained embedded HTML resource.

Features

  • Tab cards: view different contexts of one subject side by side (per language, per OS, per skill level), including code samples with copy buttons.

  • Table cards: build HTML tables from explicit rows or loosely delimited raw text. Delimiters are auto-detected, columns are balanced, and URL cells become links.

  • Chart cards: dynamically generated SVG bar, line, pie, and donut charts with legends and a collapsible data table for accessibility.

  • Form cards: forms the user fills in to give the conversation context and direction. Submitting sends the values back to the chat as the next prompt.

  • Mirrored website forms: fetch a real page, rebuild one of its forms as a card, then submit the actual website form with the user-entered values via submit_web_form.

  • Video cards: HTML <video> players for short clips.

  • Animation cards: model-composed animated clips for when no direct video URL exists - sequential scenes of text, staggered bullet builds, simple SVG diagrams that trace themselves in, and single-series charts that zoom into the data range under discussion, all with video-style play/pause, replay, and progress controls.

  • Show/hide cards: collapsible sections with show-all/hide-all controls.

  • Sequential list cards: nested ordered lists numbered 1., 1.1., 1.1.1. via CSS counters.

  • Document cards: render a markdown document (a guide or walkthrough the model wrote) as one interactive card with collapsible sections, styled tables, and copyable code.

  • Code tour cards: present a project as one tab per source file, in the order the files are given (README and manifests hoisted first). Source files are syntax-highlighted for their detected language and line-numbered behind a Raw | Code toggle, the way a repository browser shows a file. Markdown files render as a formatted page instead, behind a Raw | Rendered toggle - a README in a tour reads as documentation, and the source is still one click away.

  • Model-generated file ingestion: read local text files and unpack zip archives the model produced earlier in the conversation, so its own deliverables plug straight into cards without retyping anything.

  • Automatic multi-part splitting: large documents and projects are packed into parts that each stay under a card size budget, so hosts never truncate an oversized result. Each part renders as its own card and the result says exactly how to fetch the next.

  • Reference fetching: fetch_reference pulls a public page and returns structured data (headings, text, tables, images, links, form specs) ready to feed into card tools.

  • Card tutor: educational cards can mark terms that show tooltips after a hover dwell, and define right-click context actions that send model-anticipated prompts.

  • Movable content: card blocks can be drag-reordered, drag out of the card carries the block as HTML, and every card has a "Copy card" button that copies the standalone HTML for pasting into other responses or files.

  • Header toggles: every card header has a </> button that shows or hides the card's own HTML source in a code panel, and a chevron button beside it that collapses the card down to its header row and expands it again.

  • Efficient prompt builder: every card's right-click menu has a built-in "Generate Efficient Verbose Prompt" item that opens a three-step flow: a 350-character gist, up to three rounds of multiple-choice refinement (each question with a free-text "Other"), and a finished prompt shown with its character and token count, editable in place, copyable, and sent only after a confirmation box. The model reads a bounded gist and bounded answers instead of a rambling thread, so the only long text in the exchange is the prompt the user wanted.

  • Copyable cards: every card's right-click menu has a built-in "Copy card" item that copies the standalone HTML, mirroring the header button. For visual placement, get_insert_bookmarklet returns a bookmarklet that shows a floating "Insert Card" item on right-click and injects the copied card at that spot (page-local preview; gone on reload).

Related MCP server: mcp-apps-generative-ui-showcase

When the model should call this server

The server advertises itself for conversations about research, education, professional skills, general hobbyist skills (woodworking, arts, and similar), professional topics, history, and news, plus related subjects, whenever a card communicates better than text.

Installation

git clone https://github.com/jhauga/mcp-chat-cards.git
cd mcp-chat-cards
npm install
npm run build

Requires Node.js 18.17 or newer.

Use with Claude Desktop

Add the server to claude_desktop_config.json (Settings > Developer > Edit Config), adjusting the path to where you cloned the repository:

{
  "mcpServers": {
    "chat-cards": {
      "command": "node",
      "args": ["C:/path/to/mcp-chat-cards/dist/index.js"]
    }
  }
}

Restart the desktop client after saving. The same stdio command works in any MCP host; for hosts that support MCP UI resources, cards render as sandboxed iframes.

Tools

Tool

Purpose

create_tab_card

Tabbed views of one subject (text, HTML, or code per tab)

create_table_card

HTML table from rows or raw text with delimiter detection

create_chart_card

SVG bar, line, pie, or donut chart with data table

create_form_card

Form whose submission becomes the next conversation prompt

create_video_card

HTML video player for a short clip (direct file URL, data:video/*, or blob:; streaming platform pages are rejected)

create_reveal_card

Collapsible show/hide sections (text, HTML, or code per section)

create_list_card

Nested sequential outline (1., 1.1., 1.1.1.)

create_markdown_card

Render a markdown document (content or file path) as one card

create_code_tour_card

Render a project (zip path or explicit files) as file tabs: highlighted source behind Raw/Code, .md behind Raw/Rendered

create_prompt_gist_card

Step 1 of the efficient-prompt flow: collect a 350-character gist

create_prompt_refine_card

Step 2: multiple-choice questions that close the gaps (max 3 rounds)

create_efficient_prompt_card

Step 3: the finished prompt, editable, copyable, sent on confirmation

read_local_file

Read a local text file for review or card building

unpack_archive

List a local zip and return its text file contents

fetch_reference

Fetch a public page and return structured extracted data

mirror_web_form

Rebuild a website form as an interactive card

submit_web_form

Submit user-confirmed values to the real website form

Example: create_table_card

{
  "title": "JavaScript array methods",
  "headers": ["Method", "Purpose"],
  "rows": [
    ["map", "Transform each item"],
    ["filter", "Keep matching items"],
    ["reduce", "Fold items into one value"]
  ]
}

Output: a text summary plus an embedded resource (ui://mcp-chat-cards/<id>, text/html) containing the full card document.

Example: create_form_card

{
  "title": "Study preferences",
  "promptTemplate": "Teach {{topic}} with {{style}} examples.",
  "fields": [
    { "name": "topic", "label": "Topic", "required": true },
    { "name": "style", "type": "select", "options": ["practical", "theoretical"] }
  ]
}

When the user submits the card, the filled template is posted to the host as the next prompt. If the host does not consume the message, the card reveals the prompt text with a copy button as a fallback.

Example: the efficient-prompt flow

"Generate Efficient Verbose Prompt" in any card's right-click menu sends a message tagged [efficient-prompt]. The model answers with create_prompt_gist_card, and the gist the user submits carries the rules for the rest of the flow, so nothing has to be restated:

{
  "round": 1,
  "questions": [
    {
      "name": "depth",
      "question": "How much detail?",
      "options": ["Overview", "Step by step", "Line by line"]
    },
    {
      "name": "output",
      "question": "What should come back?",
      "options": ["A table", "A checklist", "Prose"],
      "multiple": true
    }
  ]
}

Each question also renders a free-text "Other" input under the group's own name, so a typed answer arrives joined with the checked ones. Anything left blank comes back empty, which the submitted prompt spells out as "no preference". The flow ends with:

{
  "prompt": "Audit config/loader.py for unhandled error paths. Output: a table of file, line, failure mode, and fix, then one line on the riskiest one.",
  "notes": "Assumes the current logging setup stays."
}

The card shows that prompt with its character and token count and a Send this prompt button. Clicking it opens a confirmation box; only "Yes, send it" hands the prompt to the conversation. On hosts with no channel back to the chat, the copy button is the whole story: the prompt is copied and the user pastes it as their next message.

Example: plug-n-play with files the model generates

Suppose earlier in the conversation the model built a small project and delivered project.zip plus a GUIDE.md walkthrough. Instead of the user unpacking and reading them by hand, the model turns them into interactive cards in two calls:

{ "path": "C:/Users/jane/Downloads/GUIDE.md" }

sent to create_markdown_card renders the whole guide as one card: the first H1 becomes the title, each H2 section folds into a show/hide reveal, tables get card styling, and every fenced code block gets a copy button.

{
  "title": "Project source tour",
  "archivePath": "C:/Users/jane/Downloads/project.zip",
  "intro": "Read the guide card first, then follow these files in order."
}

sent to create_code_tour_card unpacks the archive in memory and renders one tab per text file, ordered README, manifest, then source, each language-tagged with a copy button. Explicit files keep the order the caller gives them (README and manifests are hoisted to the front), so a deliberate teaching order - data model, then errors, then the entry point - renders as written instead of alphabetically. Build caches (target/, node_modules/) and binary entries are skipped automatically. Use unpack_archive or read_local_file first when the model needs to inspect contents before deciding which cards to build.

When a document or project exceeds the card size budget (default about 32,000 characters of card markup, tunable via MCP_CHAT_CARDS_CARD_BUDGET), the tool splits it at natural boundaries - H2 sections for documents, whole files for tours - and returns part 1 with an instruction like "call create_code_tour_card again with part: 2". The model repeats the call until every part has rendered as its own card, and oversized single files are truncated with a visible notice.

The budget is measured against what a file costs after rendering, not its length on disk: source is HTML-escaped into the tab panel, where a single < becomes four characters, so a handful of markup-dense files can cost far more than their raw size suggests. Every finished result is then measured once more against the host's ceiling (about 40,000 characters of serialized result, tunable via MCP_CHAT_CARDS_RESULT_LIMIT). A card that is still too large and cannot split itself - a table with thousands of rows, say - returns an actionable error naming the overage instead of an oversized result that the host would silently refuse to render.

Example: mirrored website form

  1. mirror_web_form with { "url": "https://example.com/newsletter" } renders the page's signup form as a card.

  2. The user fills it in and submits; the card returns a structured payload to the chat.

  3. The model reviews the values with the user, then calls submit_web_form with the payload to submit the real form and reports the HTTP result.

How cards render

The server supports two delivery paths, negotiated automatically by the host:

Inline in the conversation (MCP Apps, SEP-1865). The server pre-declares one UI template resource at ui://mcp-chat-cards/card.html with MIME type text/html;profile=mcp-app, and every card tool links to it through _meta.ui.resourceUri and declares an output schema (hosts drop structuredContent from schema-less tools, leaving the card nothing to paint). Hosts that support the Apps extension (recent Claude Desktop builds among them) render the template inline in the chat as a sandboxed iframe, complete the ui/initialize handshake, and deliver the tool result to it. The template is defensive about the parts that fail silently: it announces ui/notifications/initialized on a timeout as well as on the handshake reply (the host withholds the tool result until it sees the announcement), locates the card payload by deep search rather than one fixed nesting, reports ui/notifications/size-changed after every paint and on resize so the iframe takes its real height, and adopts the host's theme (including a full dark palette). Card interactions travel back over JSON-RPC postMessage: form submissions and context actions become ui/message requests (the next conversation prompt), links go through ui/open-link, and telemetry uses logging notifications.

Standalone document fallback. For clients that did not declare the Apps extension, each result carries a link to ui://mcp-chat-cards/html/<card-id>. Reading that resource returns the same card as a self-contained HTML document (inline CSS and JS, restrictive Content-Security-Policy, no external scripts). Hosts without Apps support but with MCP-UI style rendering show that document in a sandboxed panel; there the card posts MCP-UI style messages (prompt, notify, link).

The document is deliberately not inlined in the tool result. Its theme and runtime are byte-for-byte identical in every card, so inlining repeated about 16 KB of boilerplate per call: it crowded out the caller's context and was the main reason an otherwise ordinary card could exceed a host's result ceiling and render nothing at all. Set MCP_CHAT_CARDS_EMBED_HTML=1 to restore the inline copy for a host that cannot follow a resource link. The server keeps the last 24 rendered cards available for reading.

Consistent result shape

Every card tool returns the same three things, whatever the card kind:

Part

Contents

content[0]

Text summary of the card, meaningful on its own

content[1]

Resource link to the standalone HTML (omitted for Apps hosts)

structuredContent

{ "card": { "articleHtml": "…", "config": { "id", "kind", … } } }

Rendering surface

Cards render inline in the Claude desktop app sidebar. Other surfaces (mobile and web) receive the text summary and the structured payload but do not paint the card, so each summary is written to stand alone and tools are instructed to state a card's conclusion in the conversation as well.

Text fields are plain text

Every text field a tool accepts - titles, labels, cell values, tutor tips - is plain text and is escaped by the server exactly once. Callers must not pre-escape: pass Predict, Spot & Fix, not Predict, Spot &amp; Fix.

Input is never decoded first, in any field. A caller who does pass &amp; gets a card that displays the six characters &amp;, because that is what a guide documenting HTML, escaping, or templating means to show its reader. The rule is the same everywhere, so the same string renders identically in a table cell, a tab, a markdown table, and a code sample.

Raw HTML is only honoured in fields named html (create_tab_card and create_reveal_card sections), where it is sanitized: scripts, event handlers, frames, forms, and dangerous URLs are stripped while formatting such as <b> and <i> is kept. Everywhere else - including HTML written inside a create_markdown_card document - tags render as literal text, so use markdown syntax for formatting there. Escaped block-level HTML is wrapped in the paragraph the markdown structure implies rather than dropped between siblings as loose text, and HTML comments are dropped rather than shown, since a <!-- markdownlint-disable --> directive is not prose.

Where paths resolve

create_markdown_card(path), create_code_tour_card(archivePath), read_local_file, and unpack_archive all resolve paths on the filesystem of the machine running this server. When the server is reached over a remote bridge, that is not the caller's sandbox: a file the model generated on its own side does not exist here. Pass the content inline (markdown, files) in that case. A path from the wrong operating system - say /home/demo-user/project.zip sent to a server running on Windows - is rejected with an error naming the mismatch rather than resolved onto a drive where it never existed; the same goes for Windows paths sent to a POSIX server and for unexpanded ~/ paths. Set MCP_CHAT_CARDS_FS_ROOT to confine local reads to one directory.

Interactivity notes and limits

  • Drag and drop reorders blocks inside one card. Dragging a block out of the card carries its HTML in the drag data; dropping into another response requires host support, which desktop chat clients generally do not expose yet.

  • "Copy card" copies the standalone HTML document so a card can be reproduced in another response, a file, or a browser tab.

  • Tutor tooltips appear after hovering a marked term for about 1.2 seconds; the card also notifies the host so the model can follow up while the user explores. Each term is marked once per card (longest term wins where two overlap), duplicates in the term list are ignored, and marking never happens inside code samples, native tooltips, or another term's tip. Matching is case-sensitive, so a tip written for PATH does not attach itself to a filesystem path; set caseInsensitive: true on a term to match any casing. Pass tutorTermsInCode: true to create_code_tour_card to opt code in.

  • Every card result carries structuredContent.parts as { current, total, hasMore }, so one completeness check works on every card type. While hasMore is true, content has been withheld and the caller calls the same tool again with part: current + 1. Only create_markdown_card and create_code_tour_card can split; every other card always reports { current: 1, total: 1, hasMore: false }. The rendered title keeps its human-readable (part 1 of 2) suffix for the reader.

  • The split threshold is measured on rendered characters, not on the input a caller writes. Escaping expands source unpredictably - <, >, &, and quotes each become four to six characters - so a payload that looks well under the budget can cross it and a larger-looking one may not. Read parts.hasMore rather than predicting from input size. A markdown document with no H2 headings has no split boundary and always renders as one part.

  • In a code tour, a source file whose language the highlighter knows gets a Raw | Code toggle. Code is the view on arrival: syntax-highlighted, with line numbers in an unselectable gutter, so a copy or a drag through the file picks up the file and not its numbering. Raw is the same text with the highlighting and gutter switched off, so the card carries one copy of the source rather than two. Languages covered: C, C++, C#, CSS, Go, Java, JavaScript, JSON, JSX, PHP, Python, Ruby, Rust, shell, SQL, TOML, TSX, TypeScript, and YAML, plus the usual aliases (node, js, py, golang, yml, and so on). Anything else renders as the plain code block it always did.

  • Highlighted files cost more card budget than plain ones (roughly two to three times, since every token carries a span), and the packer measures the rendered panel, so a large tour splits into more parts than it used to rather than overflowing a card.

  • In a code tour, a .md, .markdown, or .mdx file gets a Raw/Rendered toggle. Rendered is the view on arrival and shows the document as a page (headings, card-styled tables, links, fenced code with copy buttons, never folded into reveals); Raw is the ordinary code block, whitespace preserved, whose copy button returns the source byte for byte. Both views ship inside the card, so switching costs no round trip and the choice survives switching between file tabs. Every other extension is unchanged.

  • Right-click context actions are defined by the model per card; {{selection}} in an action prompt is replaced with the user's selected text. Two items are always present regardless of what the model defined: "Generate Efficient Verbose Prompt" and "Copy card".

  • The finished prompt card never sends on a single click. The first click opens a confirmation box; the prompt goes to the conversation only when that box is accepted, and what is sent is whatever the textarea holds at that moment, edits included.

  • Form answers are gathered per field name, and empty values are dropped, so a choice group and a text input can share one name and arrive as a single comma-joined answer. Every named control still yields a key, so an unanswered group renders as an empty value rather than leaving a literal {{name}} in the prompt.

Security

  • Local file tools (read_local_file, unpack_archive, and the path/archive inputs of the document and code tour cards) read text only, cap sizes, refuse binaries, and cap archive extraction (entry count, per-file, and total bytes). Set MCP_CHAT_CARDS_FS_ROOT to confine all local reads to one directory.

  • Outbound requests are limited to http(s) URLs resolving to public addresses. Localhost, RFC 1918, link-local, CGNAT, and equivalent IPv6 ranges are blocked, redirects are re-validated, bodies are size-capped, and requests time out. Set MCP_CHAT_CARDS_ALLOW_PRIVATE=1 only if you intentionally need intranet fetches.

  • All model- and user-supplied text is HTML-escaped; fetched third-party HTML is sanitized (scripts, event handlers, frames, forms, and dangerous URLs are stripped).

  • Cards ship a restrictive CSP and load no external scripts, stylesheets, or fonts.

  • submit_web_form should only be called with values the user entered in a mirrored form card or explicitly confirmed.

Debugging cards in Claude Desktop

If a card mounts but stays empty, the failure is usually silent, so the template traces everything to the console:

  1. Enable Developer Mode in Claude Desktop (Settings, Developer), then open the webview developer tools for the conversation.

  2. Filter the console for [mcp-chat-cards]. Every JSON-RPC message the card sends and receives is logged with its direction (tx/rx), so a missing handshake reply or an undelivered tool result is visible immediately.

  3. Run window.__mccDebug() in that console for a snapshot: template version, whether initialized was announced, whether a card painted, the rendered card HTML, and the last 50 protocol messages. Paste its output when reporting a rendering issue.

Supplemental ports

The extension/ folder contains supplemental ports of the card tools for other hosts. Both are self-contained - they do not import from src/ or dist/, and the MCP server is unaffected by them.

  • extension/github/ - a GitHub Copilot canvas extension named chat-cards. The agent drives the same card kinds (tabs, tables, charts, forms, show/hide, sequential lists, markdown documents, video) through canvas actions, and form submissions come back to the conversation as prompts. Its README covers the action list, the differences from the MCP tools, and how the folder maps onto the awesome-copilot contribution layout.

  • extension/claude/ - a Claude artifact template: one self-contained HTML page whose card spec block Claude fills and publishes as an artifact. Forms and right-click actions produce prompts the user copies back into the conversation.

Development

npm run build      # compile TypeScript to dist/
npm test           # run the vitest suite (unit + in-memory MCP integration)
npm run coverage   # run tests with V8 coverage
npm run dev        # compile in watch mode

License

MIT. See LICENSE.

Available Tools

19 tools
create_animation_cardCreate animation cardA

Render a short animated clip as a card when no direct video URL exists but motion would communicate better than static content - explanations, walkthroughs, and data stories. Scenes play sequentially in a 16:9 stage with play/pause, replay, and progress controls; everything is generated text, SVG shapes, and CSS animation (no external assets). Compose classic clip patterns and vary them per conversation: title reveal into bullet build (fade/slide), diagram walk-through with arrows tracing in (draw), a chart that zooms into the label range under discussion and back out (chart.zoom), and a closing takeaway scene (zoom). Mix scene kinds freely; per-scene transition and duration make endless variations from the same schema.

ParametersJSON Schema
NameRequiredDescriptionDefault
loopNoRestart from scene 1 after the last scene
titleYes
scenesYes
autoplayNoStart playing on render (default true)
subtitleNo
tutorTermsNoEducational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so "PATH" does not attach its tip to a filesystem "path"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text.
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.
sceneDurationMsNoDefault per-scene duration in ms (default 3500)

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden (baseline 3). It goes beyond by disclosing: scenes play sequentially in a 16:9 stage with controls, everything is procedurally generated (text, SVG shapes, CSS animation) with no external assets, and shows how to handle variations via per-scene transitions/durations. It misses some edge cases (e.g., what happens if scenes is empty – though schema enforces minItems 1), but the disclosed behavioral traits are rich and accurate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is substantial but every sentence earns its place, covering what, why, and how to compose scenes. It could arguably be front-loaded more (the key 'when to use' is first, which is good). Minor deduction for density - an agent might need to parse carefully - but no fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity (nested scenes, transitions, shapes, charts) and the rich schema, the description does an excellent job of tying it together. It explains the animation model (sequential scenes, transitions), provides patterns (title reveal, chart zoom), and even implies limits (no external assets means you can't rely on images). Not a 5 because it doesn't explicitly document error cases or fallbacks, but for the complexity it covers the essentials well.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 63%, so the schema itself documents most parameters. The description adds value by implying how scenes (structure of shapes, bullets, chart) relate to the animation, and clarifies the 'no external assets' constraint that affects how to fill scene content. However, it does not directly explain the semantics of properties like durationMs, loop, or autoplay beyond what the schema already states, so it doesn't fully bridge the 37% gap.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Render'), identifies the resource (a short animated clip as a card), and clearly distinguishes when to use it: when no direct video URL exists but motion would communicate better. It also differentiates from siblings like create_video_card by emphasizing generated content (text, SVG, CSS) over external assets, which is a strong differentiator visible in the sibling list.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The first sentence explicitly states the primary use case and contrasts with the alternative ('when no direct video URL exists'). It also gives composition guidance ('Compose classic clip patterns and vary them per conversation') and lists concrete examples that heavily imply when to use this over a static card. While it doesn't name a specific sibling, the 'no direct video URL' contrast with create_video_card is an explicit exclusion condition.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_chart_cardCreate chart cardA

Render a dynamically generated SVG chart card (bar, line, pie, or donut) with a legend and a collapsible data table. Use for useful graphics summarizing referenced data.

ParametersJSON Schema
NameRequiredDescriptionDefault
typeYes
titleYes
labelsNoX-axis labels (bar/line)
seriesNoData series (bar/line)
valuesNoSlices (pie/donut)
yLabelNo
subtitleNo
tutorTermsNoEducational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so "PATH" does not attach its tip to a filesystem "path"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text.
descriptionNo
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the transparency burden. It discloses the output behavior (SVG chart, legend, collapsible data table) but does not explicitly state that this is a mutating operation inserting a card into the host UI, nor any side effects. This is partial transparency, so a middle score is appropriate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two short sentences front-load the action and output, list chart types, and add a use case without repetition or filler. Every phrase earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter tool with an output schema and no annotations, the description plus the rich schema is nearly sufficient: required inputs are trivial, the data-parameter schemas are described, and the use case is stated. Minor omissions like explicit chart-type selection guidance prevent a 5.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 50%, so the baseline is 3. The description adds no parameter-level guidance, but the schema already describes labels, series, values, tutorTerms, and contextActions; remaining params like title, type, and subtitle are semantically obvious. The description does not undersell the parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific action ('Render'), a concrete resource ('SVG chart card'), and enumerates the supported chart types (bar, line, pie, donut). It clearly differentiates this tool from the table, list, and markdown card siblings by focusing on chart rendering with a legend and collapsible data table.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The sentence 'Use for useful graphics summarizing referenced data' provides a clear, actionable context for when to invoke the tool. It does not explicitly name alternatives or exclusions, but the context is specific enough to route an agent toward this card type over table/list/markdown siblings.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_code_tour_cardCreate code tour cardA

Render a project's source as an interactive card with one tab per file. Source files are syntax-highlighted for their detected language and line-numbered, with a Raw/Code toggle and a copy button, the way a repository browser shows a file; a language with no grammar renders as a plain code block. Markdown files (.md, .markdown, .mdx) render as a formatted page - headings, tables, links, copyable fenced code - with a Raw/Rendered toggle back to the source, so a README in a tour reads as documentation rather than as source. Explicit files keep the order they are given in, with README and manifests hoisted to the front; archive files are ordered README, manifest, then src. Pass the path of a zip archive generated earlier in the conversation for a one-call plug-n-play tour, or pass files explicitly. Files are packed into parts of about 32,000 rendered characters each regardless of how many there are, so a handful of medium files still splits. The result's structuredContent.parts {current,total,hasMore} reports the split: while hasMore is true some files were withheld, so call again with part: current + 1 and identical other arguments until every part has rendered.

ParametersJSON Schema
NameRequiredDescriptionDefault
partNoPart number for large projects (1-based). Big tours split automatically; while structuredContent.parts.hasMore is true, call again with the next part.
filesNoExplicit files to show when not using archivePath
introNoGuidance shown in a leading 'Start here' tab
titleYes
includeNoWith archivePath: only include entries whose path contains one of these
maxTabsNo
subtitleNo
tutorTermsNoEducational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so "PATH" does not attach its tip to a filesystem "path"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text.
archivePathNoPath to a zip ON THE MACHINE RUNNING THIS SERVER, not in the caller's sandbox. Over a remote bridge those are different machines: if the archive exists only on your side, pass its text files as files instead.
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.
tutorTermsInCodeNoAlso highlight tutorTerms inside the code samples. Off by default, because marking up language keywords in source is noise rather than teaching.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With zero annotations, the description carries the full disclosure burden and meets it thoroughly. It reveals the surprising behaviors an agent must know: files split into ~32,000-character parts regardless of count, README/manifests are hoisted, ordering differs for archives vs explicit files, unknown languages degrade to plain code blocks, and the hasMore loop may withhold files. This is exactly the kind of non-obvious behavior that prevents incorrect invocation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is long (~300 words) but earnestly dense: each clause conveys a behavioral fact — rendering features, markdown special-casing, file ordering, splitting, pagination — and there is no filler. It is front-loaded with the core purpose before the detail. The only structural weakness is that it is one undifferentiated block; paragraph breaks at the markdown, ordering, and pagination transitions would improve scanability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 11-parameter, zero-annotation tool with a rich output schema, the description is remarkably complete. It covers the rendering contract, the markdown exception, ordering semantics, both invocation modes, the splitting mechanism, and the paging loop tied to structuredContent.parts. The output schema already documents return shape, so the description needn't repeat it. Nothing an agent needs to call this correctly across multipart tours is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 73%, so the schema already documents most parameters well. The description adds genuine value beyond it: it clarifies the archivePath-vs-files choice ('Pass the path of a zip archive generated earlier in the conversation'), quantifies the part size (~32,000 rendered characters), and adds the 'identical other arguments' constraint for pagination. The few schema-undocumented fields (subtitle, title, path/content/language inside file objects) are self-evident from their names, so the gap is acceptable.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The opening sentence states a specific verb and resource: 'Render a project's source as an interactive card with one tab per file.' It then enumerates concrete rendering features (syntax highlighting, line numbers, Raw/Code toggle, copy button) that make the tool unmistakable against the sibling card-creation tools. The markdown-handling special case further narrows the identity — this is clearly the source-code card, not a generic tab or markdown card.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives explicit invocation guidance: pass a zip archive path for a 'one-call plug-n-play tour' or pass files explicitly, and it specifies the pagination protocol ('while hasMore is true ... call again with part: current + 1 and identical other arguments'). This is strong operational guidance. However, it never names sibling tools or states when NOT to use this tool (e.g., when a plain markdown card would suffice), so exclusions are left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_efficient_prompt_cardDeliver the efficient promptA

Step 3 of the efficient-prompt flow: hand back the finished prompt in an editable card with a character and token count, a copy button, and a send button gated behind a confirmation box. Write one prompt that is verbose only where verbosity buys a complete first-pass answer: no restated context, no filler, an explicit output shape. Do not act on the prompt here - wait for the user to send it back as a message.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoOne line on what the prompt assumes or leaves out, shown under it
titleNo
promptYesThe finished prompt, as plain text
subtitleNo
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden and delivers: it discloses the deliver-only behavior ('Do not act on the prompt here'), the card's UI behaviors (copy button, confirmation-gated send), and the content-quality bar for the prompt (no filler, explicit output shape). No contradictions between description and the absent annotations. Loses a point only because it doesn't describe side effects such as what happens once the user confirms the send.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four sentences, each earning its place: the first front-loads the purpose and UI format, the second sets the prompt-quality standard, and the third guards against a common misuse. No filler, no restatement of schema content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given an output schema exists and the schema covers the required prompt plus notes and contextActions, the description fills the key gaps: workflow position, deliverable format, and the critical non-execution guardrail. Title and subtitle semantics are the only unaddressed gap, and they are low-ambiguity in a card context.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%, with prompt, notes, and contextActions already documented in the schema. The description adds only implicit meaning — that 'prompt' is the finished deliverable — and says nothing to clarify the undocumented title and subtitle parameters. The UI details (character/token count, copy button) describe the card itself, not how the parameters map to it.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: 'hand back the finished prompt in an editable card' with concrete UI elements (character/token count, copy button, confirmation-gated send button). Positions itself as 'Step 3 of the efficient-prompt flow', distinguishing it from sibling card tools like create_prompt_refine_card and create_prompt_gist_card. The title 'Deliver the efficient prompt' reinforces the resource being delivered.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Places the tool explicitly in a workflow ('Step 3 of the efficient-prompt flow'), giving clear context for when to invoke it. Adds an explicit exclusion: 'Do not act on the prompt here - wait for the user to send it back as a message,' which prevents premature execution. Stops short of naming the sibling tools that cover the other steps, so alternative routing 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.

create_form_cardCreate form cardA

Render a form card the user fills in to give the conversation context and direction. Submitting sends the values back to the chat as the next prompt (optionally shaped by promptTemplate with {{fieldName}} tokens).

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
fieldsYes
subtitleNo
descriptionNo
submitLabelNo
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.
promptTemplateNoPrompt sent on submit; {{fieldName}} tokens are replaced with values

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A3.8/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full behavioral burden and delivers the critical trait: submission sends values back to the chat as the next prompt, optionally shaped by promptTemplate with {{fieldName}} tokens. This discloses the non-obvious side effect (values become a user message, not a tool result). Minor traits like required-field validation blocking submission are not covered, but the essential model is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences with zero filler: the render action leads, and the submission mechanism follows directly. Every clause earns its place, including the optional promptTemplate note.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a UI tool with no annotations and an existing output schema, the description covers the essential end-to-end flow: render, user fills, values become the next prompt. The contextActions behavior is already documented in the schema, and the output schema covers return values. The only gap is validation behavior for required fields, which is a minor omission for an interactive tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is low (29%), and the description compensates for the most important semantics — fields' values round-trip into the conversation, and promptTemplate token substitution shapes the prompt. However, it adds no meaning for title, subtitle, description, or submitLabel, relying on their self-explanatory names rather than explaining their presentation role.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Render') with a concrete resource ('a form card') and states its purpose ('to give the conversation context and direction'). The second sentence adds the defining behavior — submitted values return as the next prompt — which distinguishes it from sibling card creators. It doesn't explicitly name a sibling, but the interaction model is specific enough to select correctly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies the use case: render an interactive form when the conversation needs structured context or direction from the user. However, it offers no explicit when-not-to-use guidance or alternatives, and with siblings like mirror_web_form and submit_web_form also handling form-like input, a sentence routing the agent would materially help.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_list_cardCreate sequential list cardB

Render a nested ordered list card with hierarchical numbering (1., 1.1., 1.1.1.). Good for procedures, outlines, and curricula.

ParametersJSON Schema
NameRequiredDescriptionDefault
introNo
itemsYes
titleYes
subtitleNo
tutorTermsNoEducational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so "PATH" does not attach its tip to a filesystem "path"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text.
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

B3.4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral disclosure burden. It does disclose the core rendering behavior: nested ordered list with hierarchical numbering. But it does not mention notable interactive behaviors like tutorTerms underlining/hover or contextActions, which are only described in the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences with no filler. It front-loads the operation and output format, then adds a practical usage note. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a tool with an output schema, the description does not need to explain return values. The core usage is covered, and the more complex optional parameters (`tutorTerms`, `contextActions`) are documented in the schema. Some gaps remain around optional parameters and sibling differentiation, but overall the definition is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 33%, and the tool description does not compensate. It hints at the nested `items` structure through 'nested ordered list card', but it does not explain `title`, `intro`, `subtitle`, or how nesting maps to `children`. Only `tutorTerms` and `contextActions` have schema-level descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb ('Render') and a specific resource ('nested ordered list card') with distinctive behavior (hierarchical numbering). It is clear about what the tool produces, though it does not explicitly distinguish it from sibling card tools by name.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The phrase 'Good for procedures, outlines, and curricula' gives useful intended-use context. However, it does not explain when to choose this over alternatives such as create_markdown_card or create_table_card, nor does it mention any exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_markdown_cardCreate document card from markdownA

Render a markdown document as one interactive card: tables become card tables, fenced code gets copy buttons, and H2 sections fold into show/hide reveals. Pass either the markdown content or the path of a markdown file generated earlier in the conversation (for example a walkthrough or guide) to plug it into the chat in one call. Raw HTML in the markdown is NOT rendered as markup: it is shown as literal text, the same as in every other card's text fields, so use markdown syntax for formatting. Long documents split at H2 boundaries into parts of about 32,000 rendered characters each; the result's structuredContent.parts {current,total,hasMore} says whether more parts remain. A document with no H2 headings cannot be split and renders as one part.

ParametersJSON Schema
NameRequiredDescriptionDefault
partNoPart number for large documents (1-based). Long documents split automatically; while structuredContent.parts.hasMore is true, call again with the next part.
pathNoPath to a markdown file ON THE MACHINE RUNNING THIS SERVER, not in the caller's sandbox. Over a remote bridge those are different machines: if the file exists only on your side, pass its text as markdown instead.
titleNoCard title; defaults to the document's first H1
markdownNoMarkdown content to render
subtitleNo
openFirstNoOpen the first section initially (default true)
tutorTermsNoEducational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so "PATH" does not attach its tip to a filesystem "path"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text.
splitSectionsNoFold H2 sections into reveals (default true)
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4.7/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries full responsibility for behavioral disclosure, and it delivers. It explicitly warns that raw HTML is shown as literal text, explains that long documents split at H2 boundaries into ~32,000-character parts, and tells the caller how to detect remaining parts via structuredContent.parts. This goes well beyond the title and gives the agent actionable expectations about side effects and output.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is dense but efficient: a concrete first sentence, input options, one important formatting caveat, and a clear explanation of splitting behavior. No sentence is wasted, and the most important behavioral facts are front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the tool's rendering behavior, input alternatives, the raw-HTML limitation, split behavior, and how to check for remaining parts. Given the rich input schema and presence of an output schema, an agent has enough context to select and invoke this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is high (89%), so the schema already documents most parameters. The description adds valuable semantics by explaining the either-or relationship between markdown and path, the splitting behavior tied to part, and the constraint that path refers to the machine running the server. This supplements rather than merely restates the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb and resource: 'Render a markdown document as one interactive card.' It then lists concrete affordances (tables become card tables, code gets copy buttons, H2 sections fold into reveals) that make the tool's purpose unmistakable. It also distinguishes it from sibling card creators by tying it to markdown input.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly communicates when to use the tool: pass either markdown content or a previously generated markdown file. It also gives practical guidance about using markdown syntax because raw HTML is not rendered. It does not explicitly name alternative card-creation tools, but the input source and rendering behavior make the intended use unambiguous.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_prompt_gist_cardStart an efficient promptA

Open step 1 of the efficient-prompt flow: a card asking the user to describe, in no more than 350 characters, the gist of where they want to go. Call this when a message is tagged [efficient-prompt], or when the user asks for help writing a prompt. Submitting the card sends back the gist along with the rules for the rest of the flow, so answer with the card and wait rather than asking follow-up questions in chat.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleNo
questionNoReplaces the default gist question when you already know what they are circling
subtitleNo
placeholderNoPlaceholder text inside the gist textarea
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden, and it does well: it explains this is step 1, that submitting sends back the gist plus rules, and instructs the agent to answer with the card and wait. It could add detail on what the resulting card contains visually or how the next flow step is triggered, but the core behavior is disclosed.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, each with a distinct job: what the tool does, when to call it, and how to behave after calling it. The description is front-loaded with the action and contains no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple card-generation tool with an output schema, the description covers the key context: flow position, trigger conditions, character limit, and follow-up behavior. It leaves the relationship to create_efficient_prompt_card and create_prompt_refine_card implicit, which is the main completeness gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 60%, with question, placeholder, and contextActions documented. The description adds flow context but does not explain the remaining title and subtitle parameters or map them to behavior. It is adequate because the purpose of the card clarifies why fields exist, but there is a clear gap for undocumented parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb and resource: 'Open step 1 of the efficient-prompt flow' and a card asking for the gist in no more than 350 characters. This clearly identifies the tool as the entry point of the prompt flow and distinguishes it from later flow steps and sibling card tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states explicit triggers: 'when a message is tagged [efficient-prompt], or when the user asks for help writing a prompt.' It gives behavioral instructions to use the card and wait, but does not explicitly contrast this tool with close siblings such as create_prompt_refine_card or create_efficient_prompt_card, so it stops short of full exclusions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_prompt_refine_cardRefine an efficient promptA

Step 2 of the efficient-prompt flow: ask the fewest multiple-choice questions that close the gaps the gist left. Radios by default, checkboxes when several answers can be true at once; every question also gets a free-text "Other". At most 3 refine rounds - pass the round number so the card can say how many are left. Skip this step entirely when the gist is already clear enough to write the prompt.

ParametersJSON Schema
NameRequiredDescriptionDefault
roundNoWhich refine round this is, 1 to 3 (default 1)
titleNo
subtitleNo
questionsYes
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden, and it handles it well: it discloses the multiple-choice format, radio/checkbox behavior, free-text 'Other', the 3-round limit, and the need to pass the round number. It omits details about return values or side effects, but the output schema exists and these are card-creation semantics.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three tight sentences with the core purpose first, followed by concrete behavioral details and the skip rule. There is no filler or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description plus schema give enough for an agent to decide and call the tool: flow position, round bounds, skip condition, and question format. It references 'gist' without defining it, but that term is established by the sibling flow. Since an output schema exists, omitting return-value details is acceptable.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 40%, so the description should compensate. It adds useful meaning to 'round' and implies the effect of 'multiple' through checkboxes, but it does not explain title, subtitle, questions structure, or contextActions, leaving those to the schema. The nested schema descriptions help, but the compensation is partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific role: 'Step 2 of the efficient-prompt flow: ask the fewest multiple-choice questions that close the gaps the gist left.' This places it distinctly among siblings like create_prompt_gist_card and create_efficient_prompt_card. It is clear the tool produces a refine card, further confirmed by 'so the card can say how many are left.'

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly explains when to use it ('Step 2 of the efficient-prompt flow') and when not to ('Skip this step entirely when the gist is already clear enough'). It does not name alternative tools to use in the skip case, but the flow context makes the alternative implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_reveal_cardCreate show/hide cardA

Render a card of collapsible show/hide sections with show-all/hide-all buttons. Good for step-by-step guides, FAQs, spoilers, and long reference material. Put source in a section's code field rather than inline in text, so it renders as a monospace block with a copy button instead of a paragraph.

ParametersJSON Schema
NameRequiredDescriptionDefault
titleYes
sectionsYes
subtitleNo
tutorTermsNoEducational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so "PATH" does not attach its tip to a filesystem "path"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text.
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description explains rendering details: code fields become monospace blocks with a copy button, tutor terms render as underlined micro-tips with longest-first matching and case-sensitivity. No annotations provided, so the description carries the burden and does it well. It could mention more about interactions beyond the described behaviors, but it's solid.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Description is focused and dense, listing use cases and key behavior without verbose filler. The tutorTerms description is long but necessarily detailed for precise matching semantics.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Covers what the card does, when to use it, and rendering details. Lacks explicit when-not-to-use and alternatives, but with no annotations and a complex schema, it's adequately complete for an agent to select and invoke correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema covers parameter types and minItems, and the description adds meaning: code renders as monospace with copy button, text is plain, tutorTerms matching rules. Some params like subtitle and open are left plain, but overall usage is clear.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific deliverable — a card of collapsible show/hide sections with show-all/hide-all buttons — and lists concrete use cases (step-by-step guides, FAQs, spoilers, long reference material). This makes the tool's purpose unambiguous and distinct from typical siblings like tab or code-tour cards.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly says it's good for step-by-step guides, FAQs, spoilers, and long reference material, which gives clear usage context. It does not name alternatives or state when NOT to use it, so it stops short of full guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_tab_cardCreate tab cardA

Render an interactive card with tabs, each showing a different context of the same subject (for example one tab per programming language, OS, or skill level). Tab content can be plain text, HTML, or code with a copy button.

ParametersJSON Schema
NameRequiredDescriptionDefault
tabsYes
titleYes
subtitleNo
tutorTermsNoEducational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so "PATH" does not attach its tip to a filesystem "path"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text.
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the behavioral transparency burden. It discloses that the card is interactive, tabbed, and supports plain text, HTML, and code with a copy button. It does not mention behaviors like HTML sanitization or tutor-term hover interactions, though those are already documented in the schema fields, so the gap is moderate rather than severe.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single well-structured sentence that front-loads the core operation, then provides concrete examples and content-type options. Every phrase earns its place and there is no filler or repetition of schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool's core purpose is clearly explained, and the schema richly documents the optional tutorTerms and contextActions behaviors, while an output schema is present. The main missing piece is explicit guidance on when to prefer this over sibling card tools, but for a card-rendering tool with modest complexity this is adequately complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is only 40%, so the description should compensate for undocumented parameters. It adds useful semantics for the core 'tabs' parameter: tabs are different contexts of the same subject and can hold text, HTML, or code. However, it does not add meaning for title, subtitle, tutorTerms, or contextActions beyond what the schema already documents, so compensation is partial.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('Render') and resource ('interactive card with tabs'), and explains the organizing principle: tabs show different contexts of the same subject with examples like programming language, OS, or skill level. This clearly distinguishes it from sibling card tools such as create_table_card, create_chart_card, or create_video_card.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear context for when this card is appropriate: when the user needs multiple perspectives on the same subject, e.g., one tab per language or OS. It does not explicitly name alternatives or state when not to use it, but the use case is specific enough for an agent to route correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_table_cardCreate table cardA

Render an HTML table card from explicit rows, or convert loosely delimited text into a balanced table (delimiter auto-detected; newlines can mark cells). URL cells become links.

ParametersJSON Schema
NameRequiredDescriptionDefault
rowsNoExplicit cell data, row-major
textNoRaw text to convert when rows are not given
titleYes
captionNo
columnsNo
headersNoColumn titles; padded if fewer than columns
subtitleNo
tutorTermsNoEducational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so "PATH" does not attach its tip to a filesystem "path"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text.
linkColumnsNo
cellDelimiterNo
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description bears the full burden for behavior. It discloses useful behaviors: delimiter auto-detection, newlines as optional cell markers, and URL cells becoming links. It also implies a balanced table normalization. Yet it does not mention behavior for when both rows and text are supplied, or any failure modes, making it sufficient but not rich.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences, front-loaded with the core purpose and then adds a single behavioral detail (URL links). It is efficient, with no redundant fluff, and every clause adds a distinct use-case or behavior. This is an example of concise, high-value prose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 11 parameters and one required field (title), the description covers two main input modes but does not touch on caption, subtitle, columns, headers, tutorTerms, contextActions, or linkColumns. Though output schema exists, the set of options is broad, and many are left to the schema's implicit meaning. For an agent to use all features correctly, more explanation would be needed, but it suffices for the common path.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 45%, and several parameters (columns, caption, subtitle, linkColumns, cellDelimiter) lack inline descriptions. The description adds meaning for text and cellDelimiter (auto-detected) and linkColumns (URL cells become links), but it ignores caption, columns, subtitle, and headers beyond what is in the schema. It compensates for some gaps but not the majority, so it meets the minimum but not more.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: 'Render an HTML table card from explicit rows, or convert loosely delimited text into a balanced table.' This is a specific verb plus resource, making it distinct from sibling creation tools like create_chart_card or create_form_card. The two modes (explicit rows vs. text) are named, adding specificity, though it doesn't explicitly name a different sibling or exclusion.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies two main use cases (structured rows or raw text conversion) and mentions auto-detection of delimiters, which gives some guidance. However, it does not explicitly state when to favor this over sibling card creators (e.g., for tabular data vs. charts) or provide any 'when not to use' guidance. Since siblings are numerous, a clearer routing could be expected, but the core instruction ('from explicit rows or text') is implied enough for basic use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

create_video_cardCreate video cardA

Render a card with an HTML video player for a short clip. src must point straight at a video file (mp4/webm): a direct http(s) URL, a small data:video/* URI, or a blob: URL. Streaming platform page URLs (YouTube, Vimeo, Twitch, TikTok, and similar) are REJECTED, because a video element pointed at a player page renders a card that can never play. When no direct video source exists, use create_animation_card to generate an animated clip instead.

ParametersJSON Schema
NameRequiredDescriptionDefault
srcYesDirect http(s) URL to a video file, a data:video/* URI, or a blob: URL
loopNo
mutedNo
titleYes
posterNoStill image shown before playback: http(s) URL or data:image/* URI
autoplayNoStart muted playback on render
subtitleNo
descriptionNo
contextActionsNoRight-click menu actions the model anticipates being useful. Choosing one sends its prompt to the conversation; use {{selection}} to include the user's selected text.

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations were provided, so the description carries the transparency burden. It explains why streaming pages fail (video element pointed at a player page), which is useful behavioral context蓬莱. However, it doesn't mention the output/card format, side effects, or limits on file size. The main behavioral constraint (source type) is well-covered, but other runtime behavior is not described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences. The first immediately states the action and the key constraint. The second explains the rejection rule and points to the alternatve tool. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential constraint on src, which is the most error-prone parameter, and named the sibling tool for animations. It doesn't describe the return value, but an output schema exists. Minor gap: no mention of required vs optional fields like title, but the schema lists required. Good overall.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema explains 5 of 9 parameters (src, poster, autoplay, contextActions; loop and muted have only type). The description adds critical detail for src (direct video file only, reject streaming URLs) and ties to the card rendering. That compensates for the low schema coverage on the most important param, but the others remain thin. A middle score is fair.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

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: 'Render a card with an HTML video player for a short clip.' It immediately distinguishes the tool from siblings by specifying the target format (video file) and the explicit exclusion of streaming-platform URLs, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the hard constraint: src must be a direct video file, and explicitly lists what is rejected (streaming URLs) with the reasoning. It also names the alternative tool (create_animation_card) and the condition for using it, so an agent can classify inputs correctly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fetch_referenceFetch reference siteB

Fetch a public web page and return structured data: title, description, headings, readable text, tables, images, links, and form specifications. Feed the results into the card tools (tables into create_table_card, numbers into create_chart_card, and so on).

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
maxTextCharsNo

TDQS

B3.3/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description discloses that the tool returns structured data fields (title, headings, tables, etc.), which gives some behavioral insight. It does not mention failure modes, rate limits, authentication needs, or what happens with inaccessible pages, and annotations are absent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise and well-structured, with the action stated first and the output details and downstream usage mentioned efficiently. No redundant or verbose content.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description gives a clear high-level purpose and output format, and it hints at downstream integration. However, it lacks details about constraints on input, error behavior, or the depth of the structured extraction, leaving some contextual gaps for an agent deciding whether to invoke the tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters2/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides no per-parameter descriptions. The description mentions 'maxTextChars' indirectly through the structured data output, but it does not explain the meaning of the parameter, its unit, or the effect of the minimum/maximum constraints. The 'url' parameter is obvious from context but not formally described.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the specific action 'Fetch a public web page' and distinguishes the tool from siblings by explaining that results feed into card tools. It does not explicitly name sibling tools it differs from, but the downstream use case clarifies its role.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies when to use the tool—when needing structured web content for card creation—but does not explicitly state when not to use it or how it compares to alternatives like read_local_file. The 'and so on' phrase is vague about the full range of downstream tools.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_insert_bookmarkletGet the Insert Card bookmarkletA

Return the Insert Card bookmarklet and usage instructions. Browsers do not let page script extend the native right-click menu, so this bookmarklet is how a copied card gets placed visually: after the user copies a card (right-click menu "Copy card" or the header button), running the bookmarklet on the host page shows an "Insert Card" item beside every right-click, which injects the copied card at that spot. The insertion is cosmetic and page-local (gone on reload, not part of the conversation history). Call this when the user asks how to place a card at an arbitrary spot on the page.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.9/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It thoroughly discloses the bookmarklet's behavior: insertion is cosmetic, page-local, gone on reload, and not part of conversation history. It also clarifies the prerequisite step (copying a card) and the mechanism (right-click menu). This is exemplary transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single, dense sentence that front-loads the purpose, then explains the mechanism and context. Every clause earns its place, providing essential context without redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has no output schema, but the description fully covers what the agent needs: what the tool returns, when to call it, why it's needed, and the behavior of the result. There are no gaps for a 0-parameter retrieval tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so the baseline is 4. The description adds context about the tool's invocation but not parameter semantics since there are none. This matches the rubric for a 0-parameter tool.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's purpose: to return the Insert Card bookmarklet and usage instructions. It explicitly names the verb 'Return' and the resource 'bookmarklet', and distinguishes it from sibling tools (which create cards or handle files) by explaining the specific scenario it addresses.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides explicit usage guidance: 'Call this when the user asks how to place a card at an arbitrary spot on the page.' It also explains the underlying context (browser limitation) and why the bookmarklet is needed, leaving no ambiguity about when to invoke it.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

mirror_web_formMirror a website formA

Fetch a public web page, extract one of its forms, and render it as an interactive card in the conversation. When the user submits the card, the values return to the chat as a structured payload for the submit_web_form tool, so a model-created task can submit the actual website form.

ParametersJSON Schema
NameRequiredDescriptionDefault
urlYes
titleNoCard title override
formIndexNoWhich form on the page, default 0

Output Schema

ParametersJSON Schema
NameRequiredDescription
cardYes
partsYesSplit state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the behavioral burden and does reasonably well: it discloses the side effects (fetching, extracting, rendering, returning a structured payload on submission) and a limitation ('public web page'). It omits details like rate limits, failure behavior, or handling of pages without forms, but the core workflow is transparent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and well-ordered: action, object, output flow, and downstream purpose. Every clause contributes indispensable information, with no filler or redundantly repeated schema details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's complexity and the absence of annotations, the description gives the agent a complete mental model of the execute-and-submit loop, and the presence of an output schema covers return details. It remains slightly thin on edge cases like 'page has no forms' or 'multiple matching forms,' but it is still sufficiently complete for correct tool selection and invocation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema already documents title and formIndex, and the description adds some contextual meaning—especially that the URL must point to a public page and that a single form is extracted. However, it mostly relies on the schema for parameter specifics rather than enriching them, so the added value is moderate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb-resource pair: fetch a public web page, extract one of its forms, and render it as an interactive card. It also distinguishes itself from the sibling submit_web_form tool by describing how the card payload feeds into that separate submission step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description clearly conveys when to use the tool: when a website form should be mirrored into the conversation so a model-created task can later submit it. It even names the follow-up tool (submit_web_form), which gives strong routing context, though it does not explicitly state exclusions such as 'use create_form_card for manually built forms.'

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

read_local_fileRead a local fileA

Read a text file from the filesystem OF THE MACHINE RUNNING THIS SERVER so its content can be reviewed and plugged into cards. Over a remote bridge that is not the caller's sandbox: a file you generated on your side is not visible here, so pass its text to the card tool directly. Size-capped; binary files are refused. Set MCP_CHAT_CARDS_FS_ROOT to confine reads to one directory.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
maxCharsNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden. It discloses size caps, binary refusal, and filesystem confinement, which are critical behavioral traits. It doesn't detail error handling or exact return format, but the key constraints are well covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact, with each sentence adding value: purpose, remote bridge caveat, size/binary limits, and configuration. It's front-loaded with the core purpose and efficiently covers all key points without fluff.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple read tool with two parameters and no output schema, the description covers purpose, constraints, and configuration. It lacks explicit return format details, but given the tool's simplicity and the absence of an output schema, the description is largely sufficient for an agent to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate. It explains the 'path' parameter's context (server filesystem) and implies 'maxChars' via size caps, though it doesn't explicitly name maxChars. The description adds meaning beyond the bare schema, but could be more explicit about maxChars.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool reads a text file from the server's filesystem for review and card integration. It distinguishes itself from siblings by focusing on local file access, which is unique among the listed card creation and web tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly warns about remote bridge scenarios, advising to pass text directly to the card tool instead. It also mentions size caps and binary refusal, and provides configuration guidance via MCP_CHAT_CARDS_FS_ROOT, giving clear when-to-use and when-not-to-use context.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

submit_web_formSubmit a website formA

Submit values to a real website form (form-encoded GET or POST). Only call this with data the user entered in a mirrored form card, or values the user explicitly confirmed. Returns the HTTP status and a snippet of the response.

ParametersJSON Schema
NameRequiredDescriptionDefault
actionYesForm action URL
fieldsYesField name to value map
methodNo
headersNo

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states the action (submit values), the encoding, and the return (HTTP status and snippet). However, it does not disclose potential side effects (e.g., submitting data could mutate server state) or mention authorization, rate limiting, or failure behavior. The clause 'real website form' hints at an actual external action, but more explicit disclosure would be safer for an agent. The constraint on when to call it is a good behavioral trait.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is a single sentence that front-loads the purpose and includes the usage constraint and return format. It is concise with no filler. The critical usage condition is placed early, making it easy for an agent to parse. Slightly more structure (e.g., separating the return statement) could improve readability, but as is, it is efficient.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has four parameters, two of which are nested objects, and no output schema, so the description must cover operational context. It states what it does, when to call it, and what it returns. However, it lacks guidance on error handling, side effects, or details about the structure of 'fields' and 'headers' beyond schema descriptions. Given the absence of annotations, an agent would benefit from explicit notes about the potential mutating nature of submitting a form. It is adequate but not comprehensive.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The schema provides descriptions for 'action' and 'fields' but not for 'method' or 'headers' (50% coverage). The description adds 'form-encoded GET or POST,' which clarifies the method parameter's purpose and its encoding format. However, it does not add meaning for 'headers' or provide additional detail on how 'fields' should be structured beyond the schema. Since the schema already documents half the parameters and the description clarifies method encoding, it meets the baseline but does not fully compensate for the undocumented parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the verb 'Submit' and the resource 'a real website form,' and specifies the encoding ('form-encoded GET or POST'). It distinguishes itself from the sibling card-creation tools by emphasizing this is an actual submission, and the reference to 'mirrored form card' implicitly connects it to mirror_web_form. Specific and unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives a clear condition for use: 'Only call this with data the user entered in a mirrored form card, or values the user explicitly confirmed.' This provides a strong guardrail. It doesn't explicitly name alternatives or say when not to use it, but the constraint implies it should be used only after mirror_web_form and with user consent. Evidence: 'Only call this...'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

unpack_archiveUnpack a zip archiveA

List a zip archive's entries and return the contents of its text files, so a project can be inspected and turned into cards (code tours, tables, walkthroughs). The path is resolved ON THE MACHINE RUNNING THIS SERVER, not in the caller's sandbox. Build caches and binary entries are skipped.

ParametersJSON Schema
NameRequiredDescriptionDefault
pathYes
includeNoOnly include entries whose path contains one of these substrings
maxFilesNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It does well: it explains that the path is resolved on the server machine, not in the caller's sandbox, and that build caches and binary entries are skipped. It does not mention permissions, rate limits, or whether anything is written to disk, but the core behaviors are covered.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, all carrying substantive information. The main behavior is stated first, followed by the important environment safety note and the skip policy. No filler or repetition.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description is sufficiently complete for a moderately simple tool: it defines the operation, the environment constraint, and the filtering behavior. No output schema exists, but because the description says 'return the contents of its text files', the return concept is explained reasonably. It does not specify the output format or potential edge cases, but these are minor gaps.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is low (33%), but the description adds critical semantics for the required 'path' parameter by emphasizing server-side resolution. The 'include' parameter already has a schema description; maxFiles only has numeric bounds, but the tool's purpose implies it limits the number of inspected files. The description partially compensates but does not fully document all parameters.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: 'List a zip archive's entries and return the contents of its text files.' This is unambiguous and clearly distinguishes the tool from siblings like read_local_file by describing a zip-inspection workflow.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The described use case—'so a project can be inspected and turned into cards'—gives clear context for when to call this tool. It does not explicitly name alternative tools or state when not to use it, but the purpose is obvious enough for an agent to choose it appropriately.

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.

  1. 3 tool updatesv0.2.0-alpha
    • Addedcreate_efficient_prompt_card
    • Addedcreate_prompt_gist_card
    • Addedcreate_prompt_refine_card
  2. 16 tool updatesv0.1.3-alpha
    • Changedcreate_animation_card6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so \"PATH\" does not attach its tip to a filesystem \"path\"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text."
      • addedInput schema / properties / tutorTerms / items / properties / caseInsensitive
        Added value: +{
        +  "description": "Match the term regardless of letter case (default false)",
        +  "type": "boolean"
        +}
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedcreate_chart_card6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so \"PATH\" does not attach its tip to a filesystem \"path\"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text."
      • addedInput schema / properties / tutorTerms / items / properties / caseInsensitive
        Added value: +{
        +  "description": "Match the term regardless of letter case (default false)",
        +  "type": "boolean"
        +}
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedcreate_code_tour_card7 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / part / description
        Previous value: -"Part number for large projects (1-based). Big tours split automatically; when the result says more parts remain, call again with the next part."New value: +"Part number for large projects (1-based). Big tours split automatically; while structuredContent.parts.hasMore is true, call again with the next part."
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so \"PATH\" does not attach its tip to a filesystem \"path\"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text."
      • addedInput schema / properties / tutorTerms / items / properties / caseInsensitive
        Added value: +{
        +  "description": "Match the term regardless of letter case (default false)",
        +  "type": "boolean"
        +}
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedcreate_form_card4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedcreate_list_card6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so \"PATH\" does not attach its tip to a filesystem \"path\"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text."
      • addedInput schema / properties / tutorTerms / items / properties / caseInsensitive
        Added value: +{
        +  "description": "Match the term regardless of letter case (default false)",
        +  "type": "boolean"
        +}
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedcreate_markdown_card7 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / part / description
        Previous value: -"Part number for large documents (1-based). Long documents split automatically; when the result says more parts remain, call again with the next part."New value: +"Part number for large documents (1-based). Long documents split automatically; while structuredContent.parts.hasMore is true, call again with the next part."
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so \"PATH\" does not attach its tip to a filesystem \"path\"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text."
      • addedInput schema / properties / tutorTerms / items / properties / caseInsensitive
        Added value: +{
        +  "description": "Match the term regardless of letter case (default false)",
        +  "type": "boolean"
        +}
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedcreate_reveal_card10 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedInput schema / properties / sections / items / properties / code
        Added value: +{
        +  "description": "Code sample shown with a copy button",
        +  "type": "string"
        +}
      • addedInput schema / properties / sections / items / properties / html / description
        Added value: +"HTML content (sanitized)"
      • addedInput schema / properties / sections / items / properties / language
        Added value: +{
        +  "description": "Language for the code sample",
        +  "type": "string"
        +}
      • addedInput schema / properties / sections / items / properties / text / description
        Added value: +"Plain text content; ``` fenced blocks become code blocks"
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so \"PATH\" does not attach its tip to a filesystem \"path\"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text."
      • addedInput schema / properties / tutorTerms / items / properties / caseInsensitive
        Added value: +{
        +  "description": "Match the term regardless of letter case (default false)",
        +  "type": "boolean"
        +}
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedcreate_tab_card6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so \"PATH\" does not attach its tip to a filesystem \"path\"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text."
      • addedInput schema / properties / tutorTerms / items / properties / caseInsensitive
        Added value: +{
        +  "description": "Match the term regardless of letter case (default false)",
        +  "type": "boolean"
        +}
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedcreate_table_card6 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Matching is CASE-SENSITIVE, so \"PATH\" does not attach its tip to a filesystem \"path\"; set caseInsensitive on a term to match any casing. Term and tip are PLAIN text."
      • addedInput schema / properties / tutorTerms / items / properties / caseInsensitive
        Added value: +{
        +  "description": "Match the term regardless of letter case (default false)",
        +  "type": "boolean"
        +}
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedcreate_video_card4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedfetch_reference1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedget_insert_bookmarklet1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedmirror_web_form4 fields changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • removedOutput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
      • addedOutput schema / properties / parts
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Split state, present on EVERY card result so one completeness check works for all card types. Cards that cannot split always report {current:1,total:1,hasMore:false}; create_markdown_card and create_code_tour_card pack oversized content into parts and can report more. Read hasMore rather than the card title to decide whether content was withheld.",
        +  "properties": {
        +    "current": {
        +      "description": "Part number this result rendered (1-based)",
        +      "type": "number"
        +    },
        +    "hasMore": {
        +      "description": "True when content was withheld; call again with part: current + 1",
        +      "type": "boolean"
        +    },
        +    "total": {
        +      "description": "How many parts the content splits into",
        +      "type": "number"
        +    }
        +  },
        +  "required": [
        +    "current",
        +    "total",
        +    "hasMore"
        +  ],
        +  "type": "object"
        +}
      • changedOutput schema / required
        Previous value: -[
        -  "card"
        -]New value: +[
        +  "card",
        +  "parts"
        +]
    • Changedread_local_file1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedsubmit_web_form1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
    • Changedunpack_archive1 field changed
      • removedInput schema / $schema
        Removed value: -"http://json-schema.org/draft-07/schema#"
  3. 9 tool updatesv0.1.1-alpha
    • Changedcreate_animation_card1 field changed
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. Occurrences in the card are underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."
    • Changedcreate_chart_card1 field changed
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. Occurrences in the card are underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."
    • Changedcreate_code_tour_card3 fields changed
      • changedInput schema / properties / archivePath / description
        Previous value: -"Path to a local zip; its text files become tabs"New value: +"Path to a zip ON THE MACHINE RUNNING THIS SERVER, not in the caller's sandbox. Over a remote bridge those are different machines: if the archive exists only on your side, pass its text files as files instead."
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. Occurrences in the card are underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."
      • addedInput schema / properties / tutorTermsInCode
        Added value: +{
        +  "description": "Also highlight tutorTerms inside the code samples. Off by default, because marking up language keywords in source is noise rather than teaching.",
        +  "type": "boolean"
        +}
    • Changedcreate_list_card1 field changed
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. Occurrences in the card are underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."
    • Changedcreate_markdown_card2 fields changed
      • changedInput schema / properties / path / description
        Previous value: -"Path to a local markdown file to render instead"New value: +"Path to a markdown file ON THE MACHINE RUNNING THIS SERVER, not in the caller's sandbox. Over a remote bridge those are different machines: if the file exists only on your side, pass its text as markdown instead."
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. Occurrences in the card are underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."
    • Changedcreate_reveal_card1 field changed
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. Occurrences in the card are underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."
    • Changedcreate_tab_card1 field changed
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. Occurrences in the card are underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."
    • Changedcreate_table_card1 field changed
      • changedInput schema / properties / tutorTerms / description
        Previous value: -"Educational tutor terms. Occurrences in the card are underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up."New value: +"Educational tutor terms. The first occurrence of each term in the card's visible prose is underlined; hovering ~1.2s shows the tip and notifies the host so the model can follow up. Terms are matched once per card, longest first, and never inside code samples, tooltips, or another term's tip. Term and tip are PLAIN text."
    • Changedcreate_video_card7 fields changed
      • addedInput schema / properties / autoplay
        Added value: +{
        +  "description": "Start muted playback on render",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / poster / description
        Added value: +"Still image shown before playback: http(s) URL or data:image/* URI"
      • removedInput schema / properties / poster / format
        Removed value: -"uri"
      • addedInput schema / properties / poster / minLength
        Added value: +1
      • addedInput schema / properties / src / description
        Added value: +"Direct http(s) URL to a video file, a data:video/* URI, or a blob: URL"
      • removedInput schema / properties / src / format
        Removed value: -"uri"
      • addedInput schema / properties / src / minLength
        Added value: +1
  4. 2 tool updatesv0.1.0-alpha
    • Addedcreate_animation_card
    • Addedget_insert_bookmarklet
  5. 14 tool updatesv0.0.0-alpha
    • First observedcreate_chart_card
    • First observedcreate_code_tour_card
    • First observedcreate_form_card
    • First observedcreate_list_card
    • First observedcreate_markdown_card
    • First observedcreate_reveal_card
    • First observedcreate_tab_card
    • First observedcreate_table_card
    • First observedcreate_video_card
    • First observedfetch_reference
    • First observedmirror_web_form
    • First observedread_local_file
    • First observedsubmit_web_form
    • First observedunpack_archive

TDQS

A4/5.0

Scored across 19 tools

Disambiguation4/5

Most card tools target clearly distinct visual formats, and the prompt-flow cards are explicitly staged. The only potential overlaps are create_tab_card vs create_code_tour_card and create_form_card vs mirror_web_form, but the descriptions provide enough detail to disambiguate.

Naming Consistency5/5

All tools follow a consistent verb_noun snake_case pattern: create_* for card renderers, fetch_/mirror_/submit_ for web actions, and read_/unpack_ for file access. Naming is predictable and scannable.

Tool Count4/5

Nineteen tools is slightly above the typical 3-15 well-scoped range, but each tool has a distinct purpose and the server covers a broad range of card types plus supporting utilities. It feels a bit heavy, though not bloated.

Completeness5/5

The set covers a wide range of card types, a complete three-step prompt workflow, local file inspection, web reference fetching, and mirrored form submission without obvious dead ends. Supporting tools feed cleanly into the card renderers, making workflows connected and practical.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    A
    maintenance
    Renders 45+ interactive chart types, dashboards, and KPI widgets directly inside AI conversations. Supports drill-down, live API polling, 20 themes, and one-click export to PNG, PowerPoint, and A4 documents.
    40
    156 npm
    48
    Functional Source , Version 1.1, MIT Future
  • F
    license
    A
    quality
    B
    maintenance
    MCP server that lets agents create, display, and export rich UI widgets (cards, dashboards, charts, forms) inline in conversations, with interactive iframe support in MCP Apps hosts and PNG image fallback for other clients.
    3
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables agents to turn structured tabular data or CSV/XLSX files into interactive charts that render inline in conversations, with client-adaptive output modes and self-contained HTML.
    MIT