Skip to main content
Glama
mcp-chat-cards
by jhauga

mcp-chat-cards

데스크톱 채팅 클라이언트 안에서 인터랙티브 HTML 카드를 렌더링하는 MCP(Model Context Protocol) 서버입니다. 긴 텍스트의 벽 대신, 대화에 탭 박스, 표, 차트, 폼, 짧은 비디오 클립, 접이식 섹션, 번호 매기기 개요가 들어옵니다. MCP Apps 확장(SEP-1865)을 지원하는 호스트에서는 카드가 샌드박스 iframe으로 대화에 인라인 렌더링되고, 다른 호스트에서는 각 카드가 독립형 임베디드 HTML 리소스로 전달됩니다.

기능

  • 탭 카드: 한 주제의 서로 다른 맥락(언어별, OS별, 숙련도별)을 나란히 볼 수 있으며, 복사 버튼이 있는 코드 샘플을 포함합니다.

  • 표 카드: 명시적 행 또는 느슨하게 구분된 원시 텍스트로 HTML 표를 만듭니다. 구분 기호는 자동 감지되고, 열은 균형을 이루며, URL 셀은 링크가 됩니다.

  • 차트 카드: 범례와 접근성을 위한 접이식 데이터 테이블을 갖춘 동적으로 생성된 SVG 막대, 선, 파이, 도넛 차트입니다.

  • 폼 카드: 사용자가 대화에 맥락과 방향을 주기 위해 작성하는 폼입니다. 제출하면 값이 다음 프롬프트로 채팅에 다시 전송됩니다.

  • 미러링된 웹사이트 폼: 실제 페이지를 가져와 그 폼 중 하나를 카드로 재구성한 다음, submit_web_form을 통해 사용자가 입력한 값으로 실제 웹사이트 폼을 제출합니다.

  • 비디오 카드: 짧은 클립을 위한 HTML <video> 플레이어입니다.

  • 애니메이션 카드: 직접적인 비디오 URL이 없을 때 모델이 구성한 애니메이션 클립 - 텍스트의 순차 장면, 계단식 불릿 빌드, 스스로 그려지는 간단한 SVG 다이어그램, 논의 중인 데이터 범위로 확대되는 단일 계열 차트 등이 모두 비디오 스타일의 재생/일시정지, 다시보기, 진행 컨트롤을 갖춥니다.

  • 표시/숨기기 카드: 모두 표시/모두 숨기기 컨트롤이 있는 접이식 섹션입니다.

  • 순차 목록 카드: CSS 카운터를 통해 1., 1.1., 1.1.1.로 번호가 매겨진 중첩 순서 목록입니다.

  • 문서 카드: 마크다운 문서(모델이 작성한 가이드 또는 워크스루)를 접이식 섹션, 스타일링된 표, 복사 가능한 코드가 있는 하나의 인터랙티브 카드로 렌더링합니다.

  • 코드 투어 카드: 프로젝트를 파일이 주어진 순서대로 소스 파일당 하나의 탭으로 제시합니다(README와 매니페스트가 먼저 올라감). 언어 태그가 붙은 코드와 복사 버튼이 포함됩니다.

  • 모델 생성 파일 수집: 대화 초반에 모델이 생성한 로컬 텍스트 파일을 읽고 zip 아카이브의 압축을 풀어, 모델의 산출물을 다시 입력하지 않고 바로 카드에 연결할 수 있습니다.

  • 자동 다중 부분 분할: 큰 문서와 프로젝트는 각 부분이 카드 크기 예산을 넘지 않도록 분할되어, 호스트가 과도하게 큰 결과를 잘라내는 일이 없습니다. 각 부분은 자체 카드로 렌더링되며 결과는 다음 부분을 정확히 가져오는 방법을 알려줍니다.

  • 참조 가져오기: fetch_reference는 공개 페이지를 가져와 카드 도구에 바로 공급할 수 있는 구조화된 데이터(제목, 텍스트, 표, 이미지, 링크, 폼 사양)를 반환합니다.

  • 카드 튜터: 교육용 카드는 호버 후 툴팁을 표시하는 용어를 표시할 수 있고, 모델이 예상한 프롬프트를 보내는 우클릭 컨텍스트 액션을 정의할 수 있습니다.

  • 이동 가능한 콘텐츠: 카드 블록은 드래그로 재정렬할 수 있고, 카드 밖으로 드래그하면 블록이 HTML로 전달되며, 모든 카드에는 독립형 HTML을 복사하여 다른 응답이나 파일에 붙여넣을 수 있는 "카드 복사" 버튼이 있습니다.

  • 헤더 토글: 모든 카드 헤더에는 카드 자체의 HTML 소스를 코드 패널에 표시하거나 숨기는 </> 버튼과, 그 옆에 카드를 헤더 행까지 접었다가 다시 펼치는 셰브론 버튼이 있습니다.

  • 복사 가능한 카드: 모든 카드의 우클릭 메뉴에는 헤더 버튼을 반영하여 독립형 HTML을 복사하는 기본 제공 "카드 복사" 항목이 있습니다. 시각적 배치를 위해 get_insert_bookmarklet은 우클릭 시 떠 있는 "카드 삽입" 항목을 표시하고 복사된 카드를 해당 위치에 주입하는 북마클릿을 반환합니다(페이지 로컬 미리보기, 새로고침 시 사라짐).

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

모델이 이 서버를 호출해야 하는 경우

이 서버는 연구, 교육, 전문 기술, 일반 취미 기술(목공, 예술 등), 전문 주제, 역사, 뉴스 및 관련 주제에 대한 대화에서 카드가 텍스트보다 더 잘 전달될 때마다 자신을 광고합니다.

설치

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

Node.js 18.17 이상이 필요합니다.

Claude Desktop에서 사용

claude_desktop_config.json(설정 > 개발자 > 구성 편집)에 서버를 추가하고, 저장소를 클론한 경로에 맞게 조정합니다:

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

저장 후 데스크톱 클라이언트를 다시 시작합니다. 동일한 stdio 명령이 모든 MCP 호스트에서 작동합니다. MCP UI 리소스를 지원하는 호스트에서는 카드가 샌드박스 iframe으로 렌더링됩니다.

도구

도구

용도

create_tab_card

한 주제의 탭 뷰(탭마다 텍스트, HTML 또는 코드)

create_table_card

구분 기호 감지가 있는 행 또는 원시 텍스트의 HTML 표

create_chart_card

데이터 테이블이 있는 SVG 막대, 선, 파이 또는 도넛 차트

create_form_card

제출이 다음 대화 프롬프트가 되는 폼

create_video_card

짧은 클립용 HTML 비디오 플레이어(직접 파일 URL, data:video/* 또는 blob:; 스트리밍 플랫폼 페이지는 거부됨)

create_reveal_card

접이식 표시/숨기기 섹션(섹션마다 텍스트, HTML 또는 코드)

create_list_card

중첩 순차 개요(1., 1.1., 1.1.1.)

create_markdown_card

마크다운 문서(콘텐츠 또는 파일 경로)를 하나의 카드로 렌더링

create_code_tour_card

프로젝트(zip 경로 또는 명시적 파일)를 파일 탭으로 렌더링

read_local_file

검토 또는 카드 구축을 위해 로컬 텍스트 파일 읽기

unpack_archive

로컬 zip 목록을 표시하고 텍스트 파일 내용 반환

fetch_reference

공개 페이지를 가져와 구조화된 추출 데이터 반환

mirror_web_form

웹사이트 폼을 인터랙티브 카드로 재구성

submit_web_form

사용자가 확인한 값을 실제 웹사이트 폼에 제출

예시: 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"]
  ]
}

출력: 전체 카드 문서를 포함하는 텍스트 요약과 임베디드 리소스 (ui://mcp-chat-cards/<id>, text/html).

예시: 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"] }
  ]
}

사용자가 카드를 제출하면 채워진 템플릿이 다음 프롬프트로 호스트에 게시됩니다. 호스트가 메시지를 소비하지 않으면 카드는 폴백으로 복사 버튼과 함께 프롬프트 텍스트를 표시합니다.

예시: 모델이 생성한 파일의 플러그 앤 플레이

대화 초반에 모델이 작은 프로젝트를 만들어 project.zip과 GUIDE.md 워크스루를 전달했다고 가정해 봅시다. 사용자가 직접 압축을 풀고 읽는 대신, 모델은 두 번의 호출로 이들을 인터랙티브 카드로 바꿉니다:

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

create_markdown_card에 보내면 전체 가이드가 하나의 카드로 렌더링됩니다: 첫 번째 H1이 제목이 되고, 각 H2 섹션은 표시/숨기기 리빌로 접히며, 표는 카드 스타일링을 받고, 모든 펜스 코드 블록에는 복사 버튼이 생깁니다.

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

create_code_tour_card에 보내면 아카이브를 메모리에서 압축 해제하고 텍스트 파일당 하나의 탭을 렌더링하며, README, 매니페스트, 소스 순으로 정렬되고 각각 언어 태그와 복사 버튼이 붙습니다. 명시적 files는 호출자가 준 순서를 유지하므로(README와 매니페스트는 앞으로 올려짐), 의도된 교육 순서 - 데이터 모델, 그다음 오류, 그다음 진입점 - 가 알파벳순 대신 작성된 대로 렌더링됩니다. 빌드 캐시(target/, node_modules/)와 바이너리 항목은 자동으로 건너뜁니다. 모델이 어떤 카드를 만들지 결정하기 전에 내용을 검사해야 할 때는 먼저 unpack_archive 또는 read_local_file을 사용하세요.

문서나 프로젝트가 카드 크기 예산(기본 약 32,000자의 카드 마크업, MCP_CHAT_CARDS_CARD_BUDGET으로 조정 가능)을 초과하면 도구는 자연스러운 경계 - 문서의 경우 H2 섹션, 투어의 경우 전체 파일 - 에서 분할하고 "part: 2로 create_code_tour_card를 다시 호출하세요"와 같은 지침과 함께 1부를 반환합니다. 모델은 모든 부분이 자체 카드로 렌더링될 때까지 호출을 반복하며, 과도하게 큰 단일 파일은 표시되는 공지와 함께 잘립니다.

예산은 파일의 디스크 길이가 아니라 렌더링 후 비용을 기준으로 측정됩니다: 소스는 탭 패널에 HTML 이스케이프되어 단일 <가 네 문자로 바뀌므로, 마크업이 많은 몇 개의 파일은 원시 크기가 시사하는 것보다 훨씬 더 많은 비용이 들 수 있습니다. 완성된 모든 결과는 그다음 호스트의 상한(직렬화된 결과 약 40,000자, MCP_CHAT_CARDS_RESULT_LIMIT으로 조정 가능)에 대해 한 번 더 측정됩니다. 여전히 너무 커서 스스로 분할할 수 없는 카드 - 예를 들어 수천 개의 행이 있는 표 - 는 호스트가 조용히 렌더링을 거부할 과도한 결과 대신 초과분을 명명하는 실행 가능한 오류를 반환합니다.

예시: 미러링된 웹사이트 폼

  1. mirror_web_form을 { "url": "https://example.com/newsletter" }와 함께 호출하면 페이지의 가입 폼이 카드로 렌더링됩니다.

  2. 사용자가 작성하고 제출하면 카드가 구조화된 페이로드를 채팅에 반환합니다.

  3. 모델이 사용자와 값을 검토한 다음 submit_web_form을 페이로드와 함께 호출하여 실제 폼을 제출하고 HTTP 결과를 보고합니다.

카드 렌더링 방식

서버는 호스트가 자동으로 협상하는 두 가지 전달 경로를 지원합니다:

대화에 인라인(MCP Apps, SEP-1865). 서버는 MIME 유형 text/html;profile=mcp-app의 UI 템플릿 리소스 하나를 ui://mcp-chat-cards/card.html에 사전 선언하고, 모든 카드 도구는 _meta.ui.resourceUri를 통해 이를 연결하며 출력 스키마를 선언합니다(호스트는 스키마 없는 도구에서 structuredContent를 제거하여 카드가 그릴 내용을 남기지 않습니다). Apps 확장을 지원하는 호스트(최근 Claude Desktop 빌드 포함)는 템플릿을 샌드박스 iframe으로 채팅에 인라인 렌더링하고, ui/initialize 핸드셰이크를 완료하며, 도구 결과를 전달합니다. 템플릿은 조용히 실패하는 부분에 대해 방어적입니다: 핸드셰이크 응답뿐 아니라 타임아웃에도 ui/notifications/initialized를 알리고(호스트는 알림을 볼 때까지 도구 결과를 보류함), 하나의 고정 중첩 대신 깊이 검색으로 카드 페이로드를 찾고, 모든 페인트 후와 리사이즈 시 ui/notifications/size-changed를 보고하여 iframe이 실제 높이를 갖도록 하며, 호스트의 테마(전체 다크 팔레트 포함)를 채택합니다. 카드 상호작용은 JSON-RPC postMessage를 통해 다시 전달됩니다: 폼 제출과 컨텍스트 액션은 ui/message 요청(다음 대화 프롬프트)이 되고, 링크는 ui/open-link을 거치며, 텔레메트리는 로깅 알림을 사용합니다.

독립형 문서 대체. Apps 확장을 선언하지 않은 클라이언트의 경우 각 결과는 ui://mcp-chat-cards/html/<card-id>에 대한 링크를 전달합니다. 해당 리소스를 읽으면 동일한 카드가 자체 포함 HTML 문서(인라인 CSS 및 JS, 제한적인 Content-Security-Policy, 외부 스크립트 없음)로 반환됩니다. Apps 지원은 없지만 MCP-UI 스타일 렌더링이 있는 호스트는 해당 문서를 샌드박스 패널에 표시합니다. 이때 카드는 MCP-UI 스타일 메시지(prompt, notify, link)를 게시합니다.

이 문서는 의도적으로 도구 결과에 인라인되지 않습니다. 테마와 런타임은 모든 카드에서 바이트 단위로 동일하므로 인라인하면 호출당 약 16KB의 상용구가 반복됩니다. 이는 호출자의 컨텍스트를 밀어내고, 평범한 카드가 호스트의 결과 상한을 초과하여 아무것도 렌더링하지 않는 주된 이유였습니다. 리소스 링크를 따라갈 수 없는 호스트를 위해 MCP_CHAT_CARDS_EMBED_HTML=1을 설정하면 인라인 복사본을 복원할 수 있습니다. 서버는 마지막 24개의 렌더링된 카드를 읽을 수 있도록 유지합니다.

일관된 결과 형태

모든 카드 도구는 카드 종류와 관계없이 동일한 세 가지를 반환합니다.

부분

내용

content[0]

카드의 텍스트 요약, 단독으로도 의미 있음

content[1]

독립형 HTML에 대한 리소스 링크(Apps 호스트에서는 생략)

structuredContent

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

렌더링 표면

카드는 Claude 데스크톱 앱 사이드바에 인라인으로 렌더링됩니다. 다른 표면(모바일 및 웹)은 텍스트 요약과 구조화된 페이로드를 받지만 카드를 그리지는 않으므로 각 요약은 단독으로도 의미 있게 작성되며 도구는 대화에서도 카드의 결론을 언급하도록 지시됩니다.

텍스트 필드는 일반 텍스트입니다

도구가 받아들이는 모든 텍스트 필드(제목, 레이블, 셀 값, 튜터 팁)는 일반 텍스트이며 서버에서 정확히 한 번 이스케이프됩니다. 호출자는 사전 이스케이프하면 안 됩니다. Predict, Spot &amp; Fix가 아니라 Predict, Spot & Fix를 전달하세요.

입력은 어떤 필드에서도 먼저 디코딩되지 않습니다. &amp;를 전달하는 호출자는 &amp;라는 여섯 문자를 표시하는 카드를 받게 됩니다. HTML, 이스케이프 또는 템플릿을 문서화하는 가이드가 독자에게 보여주려는 것이 바로 그렇기 때문입니다. 규칙은 모든 곳에서 동일하므로 동일한 문자열은 테이블 셀, 탭, 마크다운 테이블 및 코드 샘플에서 동일하게 렌더링됩니다.

원시 HTML은 html이라는 이름의 필드(create_tab_card 및 create_reveal_card 섹션)에서만 허용되며, 여기서는 살균됩니다. 스크립트, 이벤트 핸들러, 프레임, 양식 및 위험한 URL은 제거되고 <b> 및 <i>와 같은 서식은 유지됩니다. 다른 모든 곳( create_markdown_card 문서 내부에 작성된 HTML 포함)에서는 태그가 리터럴 텍스트로 렌더링되므로 서식에는 마크다운 구문을 사용하세요. 이스케이프된 블록 수준 HTML은 형제 요소 사이에 느슨한 텍스트로 버려지는 대신 마크다운 구조가 암시하는 단락으로 감싸지며, <!-- markdownlint-disable --> 지시문은 산문이 아니므로 HTML 주석은 표시되지 않고 제거됩니다.

경로가 해석되는 위치

create_markdown_card(path), create_code_tour_card(archivePath), read_local_file 및 unpack_archive는 모두 이 서버를 실행하는 머신의 파일 시스템에서 경로를 해석합니다. 서버가 원격 브리지를 통해 연결되는 경우 이는 호출자의 샌드박스가 아닙니다. 모델이 자체 측에서 생성한 파일은 여기에 존재하지 않습니다. 이 경우 콘텐츠를 인라인(markdown, files)으로 전달하세요. 잘못된 운영 체제의 경로(예: Windows에서 실행되는 서버로 전송된 /home/demo-user/project.zip)는 존재한 적 없는 드라이브로 해석되는 대신 불일치를 명명하는 오류와 함께 거부됩니다. POSIX 서버로 전송된 Windows 경로와 확장되지 않은 ~/ 경로도 마찬가지입니다. MCP_CHAT_CARDS_FS_ROOT를 설정하여 로컬 읽기를 단일 디렉터리로 제한하세요.

상호 작용 참고 사항 및 제한 사항

  • 끌어서 놓기는 한 카드 내에서 블록을 재정렬합니다. 카드 밖으로 블록을 끌면 해당 HTML이 드래그 데이터에 포함됩니다. 다른 응답에 놓으려면 호스트 지원이 필요하며, 데스크톱 채팅 클라이언트는 일반적으로 아직 이를 노출하지 않습니다.

  • "카드 복사"는 독립형 HTML 문서를 복사하여 카드를 다른 응답, 파일 또는 브라우저 탭에서 재현할 수 있게 합니다.

  • 튜터 도구 설명은 표시된 용어 위에 약 1.2초 동안 마우스를 올리면 나타납니다. 카드는 또한 호스트에 알리므로 모델은 사용자가 탐색하는 동안 후속 조치를 취할 수 있습니다. 각 용어는 카드당 한 번 표시되며(두 용어가 겹치는 경우 가장 긴 용어가 우선), 용어 목록의 중복은 무시되며 코드 샘플, 기본 도구 설명 또는 다른 용어의 팁 내부에서는 표시가 발생하지 않습니다. 일치는 대소문자를 구분하므로 PATH에 대해 작성된 팁은 파일 시스템 path에 붙지 않습니다. 용어에 caseInsensitive: true를 설정하면 모든 대소문자와 일치합니다. create_code_tour_card에 tutorTermsInCode: true를 전달하여 코드를 옵트인하세요.

  • 모든 카드 결과는 structuredContent.parts를 { current, total, hasMore }로 전달하므로 모든 카드 유형에서 하나의 완전성 검사가 작동합니다. hasMore가 true인 동안 콘텐츠가 보류되었으며 호출자는 part: current + 1로 동일한 도구를 다시 호출합니다. create_markdown_card와 create_code_tour_card만 분할할 수 있습니다. 다른 모든 카드는 항상 { current: 1, total: 1, hasMore: false }를 보고합니다. 렌더링된 제목은 독자를 위해 사람이 읽을 수 있는 (part 1 of 2) 접미사를 유지합니다.

  • 분할 임계값은 호출자가 작성한 입력이 아닌 렌더링된 문자로 측정됩니다. 이스케이프는 소스를 예측할 수 없게 확장합니다. <, >, & 및 따옴표는 각각 4~6자가 되므로 예산보다 훨씬 작아 보이는 페이로드가 이를 초과할 수 있고 더 커 보이는 페이로드는 그렇지 않을 수 있습니다. 입력 크기로 예측하지 말고 parts.hasMore를 읽으세요. H2 제목이 없는 마크다운 문서에는 분할 경계가 없으며 항상 한 부분으로 렌더링됩니다.

  • 마우스 오른쪽 버튼 클릭 컨텍스트 작업은 카드별로 모델이 정의합니다. 작업 프롬프트의 {{selection}}은 사용자가 선택한 텍스트로 대체됩니다.

보안

  • 로컬 파일 도구(read_local_file, unpack_archive, 문서 및 코드 투어 카드의 경로/아카이브 입력)는 텍스트만 읽고, 크기를 제한하고, 바이너리를 거부하고, 아카이브 추출(항목 수, 파일당, 총 바이트)을 제한합니다. MCP_CHAT_CARDS_FS_ROOT를 설정하여 모든 로컬 읽기를 단일 디렉터리로 제한하세요.

  • 나가는 요청은 공용 주소로 해석되는 http(s) URL로 제한됩니다. localhost, RFC 1918, link-local, CGNAT 및 이에 상응하는 IPv6 범위는 차단되고, 리디렉션은 재검증되며, 본문은 크기가 제한되고, 요청은 시간 초과됩니다. 인트라넷 가져오기가 의도적으로 필요한 경우에만 MCP_CHAT_CARDS_ALLOW_PRIVATE=1을 설정하세요.

  • 모델 및 사용자가 제공한 모든 텍스트는 HTML 이스케이프됩니다. 가져온 타사 HTML은 살균됩니다(스크립트, 이벤트 핸들러, 프레임, 양식 및 위험한 URL 제거).

  • 카드는 제한적인 CSP를 제공하며 외부 스크립트, 스타일시트 또는 글꼴을 로드하지 않습니다.

  • submit_web_form은 사용자가 미러링된 양식 카드에 입력했거나 명시적으로 확인한 값으로만 호출해야 합니다.

Claude Desktop에서 카드 디버깅

카드가 마운트되었지만 비어 있으면 실패는 일반적으로 조용하므로 템플릿은 모든 것을 콘솔에 기록합니다.

  1. Claude Desktop에서 개발자 모드를 활성화하고(설정, 개발자) 대화의 webview 개발자 도구를 엽니다.

  2. 콘솔을 [mcp-chat-cards]로 필터링합니다. 카드가 보내고 받는 모든 JSON-RPC 메시지는 방향(tx/rx)과 함께 기록되므로 누락된 핸드셰이크 응답이나 전달되지 않은 도구 결과가 즉시 표시됩니다.

  3. 해당 콘솔에서 window.__mccDebug()를 실행하여 스냅샷을 확인합니다. 템플릿 버전, initialized가 알려졌는지 여부, 카드가 그려졌는지 여부, 렌더링된 카드 HTML 및 마지막 50개의 프로토콜 메시지. 렌더링 문제를 보고할 때 출력을 붙여넣으세요.

보조 포트

extension/ 폴더에는 다른 호스트용 카드 도구의 보조 포트가 포함되어 있습니다. 둘 다 자체 포함되어 있습니다. src/ 또는 dist/에서 가져오지 않으며 MCP 서버는 이들의 영향을 받지 않습니다.

  • extension/github/ - chat-cards라는 GitHub Copilot 캔버스 확장입니다. 에이전트는 캔버스 작업을 통해 동일한 카드 종류(탭, 테이블, 차트, 양식, 표시/숨기기, 순차 목록, 마크다운 문서, 비디오)를 구동하며 양식 제출은 프롬프트로 대화에 다시 돌아옵니다. README는 작업 목록, MCP 도구와의 차이점, 폴더가 awesome-copilot 기여 레이아웃에 매핑되는 방식을 다룹니다.

  • extension/claude/ - Claude 아티팩트 템플릿: Claude가 카드 사양 블록을 채우고 아티팩트로 게시하는 자체 포함 HTML 페이지 하나. 양식 및 마우스 오른쪽 버튼 클릭 작업은 사용자가 대화에 다시 복사하는 프롬프트를 생성합니다.

개발

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

라이선스

MIT. 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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A4.4/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 and does substantial work: 16:9 stage, play/pause/replay/progress controls, sequential scene playback, no external assets, and 'vary them per conversation' hinting at repetition control. It doesn't cover permissions, persistence, or error behavior, so it falls short of exhaustive.

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?

Purpose and routing condition are front-loaded in the first sentence, followed by rendering behavior and composition patterns. The dense last sentence earns its place by showing how the schema yields varied output, though it borders on repeating the scene-kind list.

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 high-complexity nested-scene tool with an output schema (so returns need no explanation), the description covers purpose, rendering behavior, and composition patterns well. Minor gaps remain around lifecycle and error cases, but nothing an agent needs to author a valid card 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 coverage is 63%, and the description adds real meaning on top: per-scene transition and duration, the chart.zoom camera behavior into a label range, and shapes as diagram elements with arrows tracing in. It is silent on tutorTerms and contextActions, but those carry rich schema descriptions of their own.

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 (render) and resource (short animated clip as a card) and pins the exact scope: 'when no direct video URL exists but motion would communicate better than static content'. This implicitly separates it from the sibling create_video_card without opening either schema.

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?

Gives clear when-to-use conditions ('explanations, walkthroughs, and data stories') and a negative trigger (no direct video URL exists), which routes the agent away from the video sibling. It stops short of naming the alternative tool explicitly, but the selecting condition is unambiguous.

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 cardB

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

B3.2/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does disclose output composition (SVG, legend, collapsible data table) and that the chart is 'dynamically generated,' which is useful. But it says nothing about rendering context, permissions, or side effects on the host.

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?

Two tight sentences with the core capability front-loaded and no wasted words. Efficient for a complex tool, though the second sentence is too vague to fully earn its place.

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?

An output schema exists so return values need no explanation, and the schema richly covers the nested tutorTerms/contextActions params. However, for a 10-parameter tool with no annotations, the description is thin on usage routing and rendering behavior, leaving real 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 coverage is 50% and the schema already documents that labels/series are for bar-line versus values for pie-donut, plus rich descriptions for tutorTerms and contextActions. The description's enumeration of chart types merely repeats the enum and adds no meaning beyond the schema, so baseline 3 fits.

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?

Names a specific verb and resource ('Render a dynamically generated SVG chart card') and enumerates the supported chart types (bar, line, pie, donut) plus the legend and collapsible data table it produces. This distinguishes it from sibling card tools like create_table_card or create_markdown_card, though it never names them directly.

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

Usage Guidelines2/5

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

The only guidance is 'Use for useful graphics summarizing referenced data,' which is vague and offers no when-not-to-use or alternatives. Against a large sibling set of card creators, the description does nothing to route the agent to the right one.

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A4.5/5.0
Behavior5/5

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

No annotations exist, so the description carries the full burden, and it delivers: ordering rules (explicit order with README/manifests hoisted; archive order README, manifest, src), the ~32,000-character part split and why small files still split, the exact resume loop against structuredContent.parts.hasMore, and the archivePath-on-server-vs-sandbox caveat. This is unusually rich behavioral disclosure for a mutation/render tool.

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?

Front-loaded with purpose, then rendering behavior, then input-mode selection, then pagination — a sensible order. A few clauses are UI minutiae ('copy button,' 'Raw/Code toggle') that don't aid invocation, keeping it just short of tight.

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 an 11-parameter, annotation-free tool this covers the risky paths — archive vs explicit files, part-splitting and resumption, ordering, tutor-term matching rules. Remaining gaps (maxTabs interaction with the split, subtitle/intro/contextActions purpose) are covered by the schema, so the omission is minor.

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?

At 73% schema coverage the baseline is elevated, and the description genuinely adds meaning for the high-stakes params: the part/resume protocol, files ordering and hoisting behavior, and the archivePath machine caveat. It is silent on maxTabs, subtitle, and intro, which are left entirely to 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?

States a specific verb and resource: 'Render a project's source as an interactive card with one tab per file,' then elaborates with syntax highlighting, Raw/Code toggle, and markdown rendering. An agent can immediately tell this is the code-tour card, not the table, chart, or markdown card among its siblings.

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?

Gives explicit selection criteria between the two input modes ('Pass the path of a zip archive generated earlier... or pass files explicitly') and a precise continuation protocol for pagination. It does not name sibling tools as alternatives, so it stops short of full when-not guidance.

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A3.9/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 and does disclose real behavior: the card renders character/token counts, a copy button, and a send button gated behind a confirmation box, and critically that the tool does not itself act on the prompt. Permission, state, or edge-case behavior (e.g. what happens if prompt is blank beyond minLength) is not covered, keeping it out of 5 territory.

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?

Three sentences, front-loaded with the flow position and artifact, then the authoring rule, then the do-not-act constraint. Every sentence contributes, though the first sentence is dense with UI feature enumeration that borders on over-specification.

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?

An output schema exists, so return values need no explanation, and the description covers flow position, authoring intent, and the non-action constraint. The only meaningful gap is undocumented title/subtitle parameters, which is a minor incompleteness rather than a blocker.

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 the main required 'prompt' param described in the schema, and the description adds genuinely useful authoring guidance for it (verbose only where verbosity buys a complete first-pass answer, explicit output shape). However, 'title' and 'subtitle' remain undocumented in both schema and description, and 'contextActions' semantics are largely carried by the schema itself, so this sits at the baseline-3 level.

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?

States a specific verb and output artifact: hand back the finished prompt in an editable card with counts, copy and send controls. It also situates itself as step 3 of the efficient-prompt flow, which helps distinguish it from siblings, though it never names the adjacent prompt-card siblings (create_prompt_gist_card, create_prompt_refine_card) so an agent must infer the routing.

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 'Step 3 of the efficient-prompt flow' framing plus the explicit prohibition 'Do not act on the prompt here - wait for the user to send it back as a message' gives clear when-to-use and when-not-to-act guidance. It does not, however, state when to choose this card over the other prompt-card siblings.

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).

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A3.7/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, and it does disclose the critical side effect: submitting returns the values to the chat as the next prompt, optionally shaped by promptTemplate. That is the behavior an agent most needs to know for an interactive, non-read-only tool, though it says nothing about blocking, rendering timing, or cancellation.

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 tight sentences with no filler, front-loading the render action and follow-on submit behavior. Every clause earns its place.

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?

An output schema exists, so return values need not be explained, and the submit-to-prompt flow is covered. Still, a 7-parameter interactive tool with no annotations and only 29% schema coverage leaves the non-promptTemplate parameters (fields, submitLabel, contextActions semantics) under-explained.

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 29% across 7 parameters, so the description must compensate. It explains promptTemplate and its {{fieldName}} substitution tokens, which is real added meaning, but title, fields, subtitle, description, submitLabel and contextActions receive no explanation in the description (contextActions is only covered inside the schema).

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?

States a specific verb and resource ('Render a form card') and adds the interaction model: the user fills it in to give the conversation context and direction. An agent can distinguish it from the other card creators by the 'form' noun, though the description never explicitly contrasts it with siblings like create_list_card or create_prompt_refine_card.

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?

It implies the usage context ('to give the conversation context and direction'), which is a genuine hint about when to reach for a form rather than a static card. However, there is no explicit when-to-use/when-not statement and no named alternative among the many sibling card tools, so selection still requires inference.

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

B3.3/5.0
Behavior2/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, yet it only describes what the card looks like. It says nothing about the creation/mutation semantics, the interactive tutorTerms and contextActions behavior, or any side effects — all of which matter for a tool that constructs a live card.

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 tight sentences with the core capability front-loaded and the numbering scheme given concretely. No filler or redundancy.

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?

An output schema exists, so return values need not be described, and the two complex params carry rich schema docs. However, with no annotations and no mention of the card's interactive features, the definition is only minimally complete for an agent deciding how to populate it.

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 only 33%, so the description must compensate. It does explain the nested/hierarchical nature that maps to items.children (which itself has no schema description), but it never mentions title, intro, subtitle, tutorTerms, or contextActions, leaving half the parameters to the schema alone.

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?

States a specific verb (Render) and resource (nested ordered list card) plus the distinctive feature (hierarchical numbering 1., 1.1., 1.1.1.). It is clearly distinguishable from sibling card types like create_table_card or create_chart_card, though it never names them explicitly.

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?

"Good for procedures, outlines, and curricula" gives implied usage context, but there is no explicit when-not guidance and no routing to alternatives (e.g., a flat list or a markdown card). The agent must infer when this card beats its siblings.

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A4.6/5.0
Behavior5/5

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

With no annotations provided, the description carries the full burden and does so well: it discloses that raw HTML renders as literal text, that long documents split at H2 boundaries into ~32,000-character parts, how to detect more parts via structuredContent.parts.hasMore, and that documents without H2 headings cannot be split. These are non-obvious behavioral traits an agent would otherwise discover only by trial and error.

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 purpose and rendering behavior are front-loaded, and each subsequent sentence covers a distinct concern (input choice, HTML handling, splitting, no-H2 edge case) with no filler. It is slightly long for a single paragraph but every sentence earns its place.

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 a 9-parameter tool with no required parameters and an output schema that handles return values, the description covers everything an agent needs: rendering semantics, input source caveats, pagination behavior, and the HTML limitation. Nothing material is left to inference.

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 baseline is 3 and the description only needs to add marginal value. It does: it explains the interaction between the `part` parameter and the automatic splitting/hasMore flow, and ties H2 folding to splitSections, adding cross-parameter semantics the schema documents only in isolation.

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+resource: 'Render a markdown document as one interactive card', then immediately enumerates the concrete rendering behaviors (tables, code copy buttons, H2 folding). This clearly separates it from siblings like create_table_card or create_code_tour_card, which would render those elements standalone rather than as parts of one markdown document.

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 tells the agent which inputs are acceptable and where content should come from: 'Pass either the markdown content or the path of a markdown file generated earlier in the conversation (for example a walkthrough or guide)'. The schema further warns about the path-vs-sandbox distinction. However, there is no explicit when-to-use-this-vs-a-sibling guidance (e.g. when to prefer create_table_card over a markdown table), which would be needed for a 5.

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A4.1/5.0
Behavior4/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, and it does disclose key behavior: submitting the card returns the gist plus the flow rules, and the agent should wait instead of asking follow-ups. It does not cover permissions or error conditions, but for a UI card launcher this is substantial behavioral context.

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?

Two sentences are used efficiently, front-loading the purpose and flow step before the trigger conditions and behavior. The 350-character detail is embedded usefully, though the sentence is dense with instructions.

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?

With an output schema present, the description need not explain return values, and it focuses on when and how to call. It is largely complete for a card-launcher tool, though it could better distinguish itself from the similarly named create_efficient_prompt_card sibling.

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 60%, so the schema does most of the work for parameters like question and contextActions. The description adds the 350-character limit and the gist concept, but does not explain the title, subtitle, or placeholder parameters, leaving a moderate gap.

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 and resource: opening step 1 of the efficient-prompt flow via a card that asks the user to describe their goal gist. It clarifies the tool's role but does not distinguish it from its close sibling create_efficient_prompt_card, which remains ambiguous.

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 gives explicit triggers (a message tagged [efficient-prompt], or a user asking for help writing a prompt) and even directs the agent to wait rather than follow up in chat. The when-to-use context is complete and actionable.

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A4/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 and does add real behavioral context: default radio widgets, checkbox mode when several answers are true, an always-present free-text 'Other', and a hard cap of 3 refine rounds. It doesn't say what happens to submitted answers or what the card renders/returns, but it discloses enough UI and lifecycle behavior to be usable.

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?

Three tight sentences, front-loaded with the flow position, with no filler. The widget-behavior sentence is dense but each clause carries distinct information; slight trimming of the radios/checkboxes detail is conceivable, but nothing is wasted.

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?

An output schema exists, so return values need no explanation, and the flow guidance is solid. However, for a 5-parameter tool with a nested `questions` array, several parameters (`title`, `subtitle`, `contextActions`) receive no semantic coverage anywhere, leaving the definition short of 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 40%, so the description must compensate. It explains the `round` semantics ('how many are left') and maps onto the `questions`/`multiple`/`options` structure via the radios-vs-checkboxes and Other rules, but leaves `title`, `subtitle`, and `contextActions` entirely unexplained in both places.

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 gives a specific verb and resource ('ask the fewest multiple-choice questions that close the gaps the gist left') and explicitly positions itself as 'Step 2 of the efficient-prompt flow', which cleanly separates it from the sibling gist and efficient-prompt card tools. An agent can tell what this tool does and where it sits without opening the schema.

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 clear usage context ('Step 2 of the efficient-prompt flow') and an explicit exclusion ('Skip this step entirely when the gist is already clear enough to write the prompt'), plus the round cap. It stops short of naming the concrete alternative tools (e.g. the gist card as step 1, the efficient-prompt card as step 3), so the routing is implied by flow position rather than explicit.

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A3.9/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It does disclose a real render behavior (source placed in a section's code field becomes a monospace block with a copy button rather than a paragraph), which is useful. However it says nothing about permissions, size/length limits, sanitization of html, or other operational traits an agent would need.

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?

Three tight sentences, front-loaded with what renders first, then use cases, then a practical placement tip. Nothing is wasted, though the final tip is narrow enough that it slightly dilutes the otherwise clean structure.

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?

An output schema exists, so return values need not be explained. The description covers the core capability plus one important param behavior, and the complex tutorTerms/contextActions params are richly documented in the schema. It is largely sufficient, with only sibling-routing detail missing.

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 low (40%) so the description must compensate. It adds meaningful semantics for the code field (monospace rendering plus copy button) versus the text field, partially closing the gap. The remaining params (title, subtitle, and the 'open' behavior behind show-all/hide-all) get no explanation, and tutorTerms/contextActions rely entirely on their schema text.

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 (Render) and a precise resource (a card of collapsible show/hide sections with show-all/hide-all buttons), which is clearly distinguishable from sibling card types like animation, chart, table, or markdown cards. An agent can identify this tool without opening sibling schemas.

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?

Gives concrete when-to-use guidance ('step-by-step guides, FAQs, spoilers, and long reference material'), which helps selection. It stops short of naming which sibling card to prefer for adjacent scenarios or any exclusion conditions, so it lacks explicit alternative routing.

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description carries the full behavioral burden. It discloses useful rendering behavior (interactive tabs, copy button for code, plain text/HTML/code content), but says nothing about persistence, side effects, permissions, size limits, or how tutorTerms/contextActions behave at runtime beyond what the schema already documents.

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 tight sentences, front-loaded with the what and immediately followed by the concrete example and content-type capabilities. No filler, no restatement of the tool name.

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?

An output schema exists, so return format need not be explained, and the rich schema descriptions cover tutorTerms and contextActions. The description sufficiently explains the card's purpose and content model, though it leaves the role of subtitle and the educational/context-action features entirely to the schema.

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?

Top-level schema coverage is only 40% (title and subtitle undocumented in schema), and the description partially compensates by describing tab content types (text/HTML/code-with-copy-button), which maps to the tab item properties. However, it adds nothing about title, subtitle, or how tutorTerms/contextActions interact with the rendered card beyond what the schema already says. Baseline 3 for low coverage with partial compensation.

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?

States a specific verb ('Render') and resource ('interactive card with tabs') and explains the organizing concept: one tab per context of the same subject. It is distinguishable in substance from card siblings like create_chart_card or create_markdown_card, though it never explicitly names or contrasts them.

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 example ('one tab per programming language, OS, or skill level') implies the use case and content-type fit, but there is no explicit when-to-use guidance, no conditions for choosing this over create_code_tour_card or create_markdown_card, and no prerequisites stated.

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A3.7/5.0
Behavior3/5

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

With no annotations, the description carries the full burden and does disclose real behavior: delimiter auto-detection, newlines as cell markers, and URL cells becoming links. However it is silent on the other high-impact behaviors that only the schema hints at (linkColumns, cellDelimiter override, tutorTerms underlining, contextActions, the 12-column cap), so coverage is partial.

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 compact sentences, front-loaded with the primary action, no filler. Every clause carries information (input modes, delimiter detection, newline cells, URL linking).

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?

An output schema exists so return values need not be described, but for an 11-parameter tool with no annotations the description omits several non-obvious parameters (tutorTerms, contextActions, linkColumns) and never signals the non-destructive nature of the operation.

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 only 45%, so the description must compensate; it clarifies rows, text, delimiter auto-detection, and newline handling, but leaves title, caption, subtitle, columns, headers, linkColumns, tutorTerms, and contextActions unaddressed in prose. Partial compensation over an incomplete 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?

States a specific verb ('Render') and resource ('HTML table card') and enumerates both input modes: explicit rows vs. converting loosely delimited text. The 'table card' resource is clearly distinguishable from sibling card tools like create_list_card and create_chart_card even though no sibling is named.

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 which of the two main inputs to supply ('from explicit rows, or convert ... text'), which is useful conditional guidance, but it never states when to choose a table card over alternatives such as create_list_card or create_markdown_card, and gives no prerequisites or exclusions.

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.

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

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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

TDQS

A4.4/5.0
Behavior4/5

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

No annotations are provided, so the description carries the burden, and it does well: it discloses a hard validation rule (platform page URLs rejected), the accepted source forms, and the rationale (a video element on a player page can never play). It does not cover auth/permission needs or persistence, but the failure-mode disclosure is substantive.

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, front-loaded with the core purpose, then the constraint, then the fallback. No filler; 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?

An output schema exists, so return values need not be explained. The description covers the decisive routing constraint and the fallback path, leaving only secondary parameter behavior to the schema, which is acceptable for a card renderer.

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 44% (<50%), so the description must compensate. It adds strong meaning for the critical 'src' parameter (accepted formats mp4/webm, http(s)/data:/blob:, rejected platforms) but says nothing about loop, muted, poster, autoplay, subtitle, or contextActions, leaving most parameters to the sparse 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?

States a specific verb ('Render a card') plus resource ('HTML video player for a short clip') and implicitly separates itself from the sibling create_animation_card. An agent can distinguish this from other card-creation tools immediately.

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?

Explicitly states when to use it (direct video file sources), when NOT to use it (streaming platform page URLs are REJECTED), and names the alternative (create_animation_card) with the condition that selects it.

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).

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.

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.

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

Output 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.
displayNoPresent only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.

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 does disclose a genuinely non-obvious trait: the card is interactive, and on submit the values return to the chat as a structured payload routed to submit_web_form. The word "public" implicitly flags that no authentication is available. It does not cover failure modes (JS-rendered forms, unreachable pages) or any rate limiting.

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, no filler, with the core action stated first and the downstream handoff second. Every clause adds information the agent needs.

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?

An output schema exists, so return-value explanation is rightly omitted, and the description supplies the workflow context an unannotated tool needs. Minor gaps remain around error behavior and whether non-public or login-gated pages are rejected, but nothing essential to a correct call is missing.

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 67% with url fully specified as a URI, and title/formIndex already documented in the schema. The description adds only marginal semantics — "public web page" constrains url, and "one of its forms" loosely maps to formIndex, but it never mentions the title override. Roughly baseline for partially-covered params.

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 gives a precise verb chain — fetch a public page, extract one of its forms, render it as an interactive card — which is clearly distinct from sibling tools like create_form_card (builds a card from scratch) and fetch_reference (plain fetch). It even names submit_web_form as the downstream consumer, so the agent can place this tool in the workflow without opening another schema.

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 use case is explicit: mirror a real website's form so a model-created task can submit it. The description explains the full round trip, ending with submit_web_form. It falls short of naming when *not* to use it (e.g., versus fetch_reference or create_form_card for non-web forms), which keeps it out of the top band.

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.

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.

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.

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. 14 tool updatesv1.0.0-alpha.1.0.1
    • Changedcreate_animation_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_chart_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_code_tour_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_efficient_prompt_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_form_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_list_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_markdown_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_prompt_gist_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_prompt_refine_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_reveal_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_tab_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_table_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedcreate_video_card1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
    • Changedmirror_web_form1 field changed
      • addedOutput schema / properties / display
        Added value: +{
        +  "additionalProperties": false,
        +  "description": "Present only when the host is not mounting this server's MCP Apps template (see MCP_CHAT_CARDS_RENDER): the card ships as a ready-made visualizer widget instead.",
        +  "properties": {
        +    "action": {
        +      "description": "What the caller must do to put the card in front of the user",
        +      "type": "string"
        +    },
        +    "loading_messages": {
        +      "description": "show_widget loading_messages",
        +      "items": {
        +        "type": "string"
        +      },
        +      "type": "array"
        +    },
        +    "shown": {
        +      "description": "False: the user cannot see this card until action is taken",
        +      "type": "boolean"
        +    },
        +    "title": {
        +      "description": "show_widget title (snake_case)",
        +      "type": "string"
        +    },
        +    "widget_code": {
        +      "description": "show_widget widget_code, passed unchanged",
        +      "type": "string"
        +    }
        +  },
        +  "required": [
        +    "shown",
        +    "action",
        +    "title",
        +    "loading_messages",
        +    "widget_code"
        +  ],
        +  "type": "object"
        +}
  2. 3 tool updatesv0.2.0-alpha
    • Addedcreate_efficient_prompt_card
    • Addedcreate_prompt_gist_card
    • Addedcreate_prompt_refine_card
  3. 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#"
  4. 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
  5. 2 tool updatesv0.1.0-alpha
    • Addedcreate_animation_card
    • Addedget_insert_bookmarklet
  6. 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

A3.8/5.0

Scored across 19 tools

Disambiguation4/5

Most card tools target distinct content types (table, chart, list, video, animation, form), and descriptions actively steer between close pairs like animation vs video and tab vs code-tour. Minor overlap remains: create_tab_card and create_code_tour_card both render tabbed content, and create_markdown_card folds H2s into reveals like create_reveal_card, so a few boundaries require reading the descriptions carefully.

Naming Consistency4/5

The dominant create_*_card pattern (create_table_card, create_chart_card, etc.) is highly predictable, and the non-card tools follow verb_noun (fetch_reference, submit_web_form, unpack_archive). Minor deviations like create_efficient_prompt_card vs create_prompt_gist_card/create_prompt_refine_card break the pattern slightly but stay readable.

Tool Count4/5

19 tools sits at the upper end but is justified by genuinely diverse needs: ~10 distinct card renderers plus input ingest (fetch/read/unpack), a 3-step prompt flow, and a 3-tool form flow. Each tool appears to earn its place, though the surface is on the heavier side.

Completeness4/5

The surface covers a wide card lifecycle (animation, tab, table, chart, video, reveal, list, markdown, code tour, form) plus data ingestion and form submission, with no obvious dead ends. Only marginal gaps remain, such as a dedicated image/plain-text card, which the animation and markdown tools partly absorb.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    A
    quality
    B
    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
    144 npm
    53
    Functional Source , Version 1.1, MIT Future
  • A
    license
    A
    quality
    D
    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
    MIT
  • A
    license
    Not graded
    quality
    C
    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