A person and their agent
using one screen.
Normally an agent talks to a server the person cannot see. These pages hand the agent tools of their own, so when the agent filters the catalogue the list the human is watching actually changes, and when it flips the model to wireframe the model in front of them changes. Every number a tool returns was measured by the asset pipeline and is served by the same API the page reads — nothing is estimated, and a figure that was never measured comes back as null rather than as a guess.
보통 에이전트는 사람이 보는 화면과 다른 곳(서버)에 말을 겁니다. 이 사이트는 화면 자신이 도구를 내줍니다. 에이전트가 마켓을 걸러 보면 사람이 보고 있던 그 목록이 그대로 바뀌고, 모델을 선으로 바꾸면 사람이 보던 모델이 그 자리에서 바뀝니다. 도구가 돌려주는 숫자는 전부 파일에서 직접 측정한 값입니다.
Asking this browser for its model context.
이 브라우저에서 쓸 수 있는지 확인하고 있습니다.
How to test this
- Chrome 149 or newer — open
chrome://flags/#enable-webmcp-testing, enable it, restart the browser, then reload this page. The status panel above will name the tools that registered. - The ChatGPT in-app browser — open this address inside ChatGPT and the model in that conversation can call these tools directly.
- Neither? Every page still works exactly as before. The tools simply do not register; nothing breaks and nothing is logged at the visitor.
Without signing in
Search the catalogue, read any asset's measured facts, navigate the site, and drive the 3D bench on any product page — wireframe, background, grid, shadows, auto-rotate, motion clips, and the ±30° part test. Asking for the file itself returns the sign-up address instead of a download.
After signing in
Four more tools open on two surfaces: the studio (list templates, create through the screen's own create flow, list what you made) and the inspector (inspect a GLB from a URL in the browser tab). An agent never signs anyone in; the human does that themselves at /signup.
Prompts to try
- Show me the tree assets in this shop and tell me each one's grade and why it got that grade.이 가게의 나무 에셋을 보여 주고, 각각의 등급과 그 등급이 나온 까닭을 알려 줘.
- Search this shop for assets that carry animation and are under 2,000 polygons.이 가게에서 움직임이 있고 폴리곤 2,000개 미만인 에셋을 찾아 줘.
- Open the lightest S-grade asset's product page, switch the viewer to wireframe, then play its motion.S 등급 중 가장 가벼운 상품 화면을 열고, 뷰어를 와이어프레임으로 바꾼 다음 동작을 재생해 줘.
- On this product page, swing every named moving part one at a time and tell me which ones really move.이 상품 화면에서 이름이 붙은 부품을 하나씩 흔들어 보고, 정말 움직이는 것이 무엇인지 알려 줘.
- Compare the two heaviest models in the shop: polygons, materials, real size and file size.가게에서 가장 무거운 모델 둘을 비교해 줘 — 폴리곤, 재질, 실제 크기, 파일 크기.
- I am signed in: make a 3D model from a template in the studio, then inspect the file it produced and read me the score.로그인했어. 스튜디오에서 템플릿으로 3D 모델을 하나 만들고, 그 파일을 검사해서 점수를 읽어 줘.
Tools are registered with navigator.modelContext.registerTool(), falling back to document.modelContext, which is what the specification's own text uses. The server-side path (MCP over HTTP) still exists and is separate: it does not move this screen.
Global — registered on every page. Read the catalogue, move the screen.
전역 — 어느 화면에서나 걸립니다. 카탈로그를 읽고, 화면을 옮깁니다.clunk_connection_checkevery pageCheck that the public MCP endpoint is answering.
공개 MCP 주소가 살아 있는지 확인합니다.
- Input
- none
- Returns
- The response code and body of GET /api/mcp, unchanged.
GET /api/mcp 의 응답 코드와 본문 그대로.
clunk_product_capabilitiesevery pageDescribe the read-only contracts this product exposes, and where its evidence stops.
이 서비스가 읽기 전용으로 무엇을 내주는지, 근거가 어디서 끊기는지 알려 줍니다.
- Input
- none
- Returns
- Contract ids and the four evidence states (structural, visual runtime, player-facing, human decision).
계약 이름과 근거 상태 넷(구조·런타임·플레이어·사람 판단).
clunk_site_mapevery pageWhich tools live on which page, which are registered right now, and how the human signs in.
어느 화면에 어떤 도구가 걸리는지, 지금 무엇이 걸려 있는지, 로그인은 어떻게 하는지 알려 줍니다.
- Input
- none
- Returns
- The page map, the tools registered on this page at this moment, and the sign-in addresses.
화면별 도구 목록, 지금 이 화면에 등록된 도구 이름, 로그인 주소.
clunk_search_assetsevery pageSearch the marketplace by text, theme, grade, polygon budget, or whether the asset has motion.
마켓에 올라온 에셋을 낱말·갈래·등급·폴리곤 수·움직임 여부로 찾습니다.
- Input
- querythemegrademaxPolygonsminPolygonshasAnimationlimit
- Returns
- Slug, title, grade and its basis, polygons, materials, size in metres, bytes, animations and URL — every figure measured by the pipeline and served by GET /api/marketplace.
슬러그·이름·등급과 그 근거·폴리곤·재질·실제 크기·용량·동작·주소. 전부 GET /api/marketplace 의 측정값.
clunk_asset_factsevery pageRead one listing's measured facts by slug.
에셋 하나의 측정값을 슬러그로 읽습니다.
- Input
- slug
- Returns
- The full measured record. Anything the pipeline could not measure comes back as null, never as a guess.
그 상품의 측정치 한 벌. 측정하지 못한 항목은 null 이고 채워 넣지 않습니다.
clunk_navigateevery pageMove the page the human is looking at.
사람이 보는 화면을 다른 페이지로 옮깁니다.
- Input
- pageslug
- Returns
- The address the screen moved to.
옮겨 간 주소.
Product page — registered only while one product is open. The bench's own controls become the agent's handles.
상품 화면 — 상품 하나를 열어 둔 동안만 걸립니다. 작업대의 도구가 그대로 손잡이가 됩니다.viewer_set/marketplace/<slug>Change what the product page's 3D bench shows: wireframe, background, grid, shadows, auto-rotate, flat shading.
작업대의 보기 상태를 바꿉니다 — 와이어프레임·배경·격자·그림자·자동 회전·면 보기.
- Input
- wireframebackgroundgridshadowsautoRotateflatShadingmirrordimensions
- Returns
- The full view state after the change, plus which settings changed. The file on sale is untouched.
바뀐 뒤의 보기 상태 전부. 파는 파일은 그대로입니다.
viewer_play_clip/marketplace/<slug>Play one of this model's motions on the bench.
이 모델이 가진 동작을 재생합니다.
- Input
- name
- Returns
- The clip that started, and every clip this file carries.
재생한 동작과 이 파일이 가진 동작 목록.
viewer_stop/marketplace/<slug>Stop the motion playing on the bench.
재생을 멈춥니다.
- Input
- none
- Returns
- The view state after stopping.
멈춘 뒤의 상태.
viewer_pivot_test/marketplace/<slug>Swing one named part ±30° so the human can see it really is a separate, turnable piece.
이름이 붙은 부품을 ±30° 흔들어 정말 따로 도는 조각인지 보입니다.
- Input
- part
- Returns
- The part that swung, and every named part this file has.
흔든 부품과 이 파일이 가진 부품 목록.
viewer_state/marketplace/<slug>Read the bench's current settings, clips and moving parts.
작업대가 지금 어떤 상태인지 봅니다.
- Input
- none
- Returns
- View state, clip list, moving-part list, file name.
보기 상태, 동작 목록, 부품 목록, 파일 이름.
asset_download_link/marketplace/<slug>Return the exact address the page's receive button opens.
받기 버튼이 쓰는 그 주소를 알려 줍니다.
- Input
- none
- Returns
- The file address, name and size. Signed out, the sign-up address instead.
파일 주소·이름·크기. 로그아웃이면 가입 주소.
Studio — after sign-in, on /studio. Runs the screen's own create flow.
스튜디오 — 로그인한 뒤 /studio 에서 걸립니다. 화면의 만들기 흐름을 그대로 부릅니다.studio_templates/studiosign-in requiredList the templates, palettes and sizes the studio can build from.
만들기에 쓸 수 있는 템플릿·팔레트·크기를 봅니다.
- Input
- kind
- Returns
- The list GET /api/series/templates serves.
GET /api/series/templates 의 목록 그대로.
studio_create/studiosign-in requiredMake an asset through the studio's own create flow — the request lands in the visible form first, then goes to the same endpoint the button uses.
화면의 만들기 흐름을 그대로 눌러 에셋을 만듭니다.
- Input
- kindprompttemplateIdpaletteIdsizeId
- Returns
- The stored asset id, its entry file, every artifact with its URL, and the server's inspection evidence.
저장된 에셋의 id·파일 이름·파일 목록·검사 근거.
studio_my_generations/studiosign-in requiredList what this workspace has made.
이 워크스페이스가 만든 것들을 봅니다.
- Input
- none
- Returns
- The list GET /api/generation serves, with a URL per file.
GET /api/generation 의 목록과 파일 주소.
Inspector — after sign-in, on /app. The file is opened in this browser only; nothing is uploaded.
검사 — 로그인한 뒤 /app 에서 걸립니다. 파일은 이 브라우저에서만 열립니다.inspect_url/appsign-in requiredFetch a GLB/GLTF from a URL and inspect it inside this browser tab. The bytes are never uploaded.
주소에서 파일을 받아 이 브라우저에서 검사합니다. 파일은 서버로 올라가지 않습니다.
- Input
- url
- Returns
- Score against the profile the screen is set to, the hard blockers, the warnings, and the figures read out of the file itself.
점수, 막는 항목, 경고, 그리고 파일에서 읽은 수치.
The lines this does not cross
An agent never signs in for the human: signed out, a claim returns the sign-up URL, not a file. A tool never invents a number: a field the pipeline could not measure is absent or null, never filled with a dash. Every tool result is plain JSON — no DOM nodes, no undefined — and a failure comes back as { ok: false, error } instead of throwing. And a file passing structural inspection is not the same as a frame passing in a shipped game; that boundary is written out on the agent connection page and repeated inside the tool results.
로그인은 사람이 직접 합니다. 도구가 돌려주는 값은 전부 이 사이트가 측정한 것이고, 측정하지 못한 항목은 결과에서 빠집니다. 파일 검사는 규격을 봅니다 — 게임 화면에서 어떻게 보이는지는 엔진에서 그린 최신 화면이 말해 줍니다.