The per-part regex only saw defineEmits<{ inline literal }>(), so a named
interface — how Flow, Popover, Dialog, Menu and Drawer all declare their
events — extracted as zero emits, and defineExpose was not extracted at
all: 36 components' template-ref surfaces were invisible. Consumers
rebuilt what existed (nodeDragStop from @nodes-change, a renderless
child to reach fitView).
- extractor: one type-checking project per components package with a
virtual <file>.vue.ts mirror per SFC, so cross-file emits interfaces
(extends included) and expose spreads resolve through the checker —
...api expands into the composable's full return with its JSDoc
- parts gain exposes; emits/exposes members carry their JSDoc text;
update:* model emits get a stock description
- UI: Description column on emits, an Exposes (template ref) table; MCP
get_doc renders the same
- FlowRoot: JSDoc on every emit and exposed member
- new primitives guide page: building flow graphs — sizing, custom
nodes, .nodrag, click family, instance API, edge labels
Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Docs MCP server
An MCP server that exposes the @robonen/tools
documentation to any MCP client (Claude Code, Claude Desktop, Cursor, …).
It is served by the Nuxt/Nitro docs server itself — there is no separate
process. The documentation metadata is the same data that renders the docs site
(produced by ../extractor at build time and injected into Nitro
as the #docs/server-metadata virtual), so what an agent reads is always in sync
with the site.
Run
Start the docs server, and the MCP endpoint comes up with it:
pnpm docs:dev # → http://localhost:3000, MCP at http://localhost:3000/mcp
POST /mcp speaks the MCP Streamable HTTP transport (stateless, JSON
responses). The route lives at ../../server/routes/mcp.post.ts.
Register with a client
A project-scoped .mcp.json at the repo root already points
Claude Code at the endpoint — start the docs server, then approve the
robonen-docs server:
{
"mcpServers": {
"robonen-docs": { "type": "http", "url": "http://localhost:3000/mcp" }
}
}
Tools
| Tool | Arguments | Returns |
|---|---|---|
list_packages |
— | Every documented package grouped by core / vue / configs / infra. |
search_docs |
query, limit? |
Ranked package/slug matches across items, components and guides. |
get_package |
slug |
A package's table of contents (categories, components or sections). |
get_doc |
package, name |
Full reference for one item: signatures, params, examples, props/emits. |
name accepts either the URL slug (use-clipboard) or the exported name
(useClipboard). Slugs are unique within a package; case-only collisions (e.g.
the useProjection function vs the UseProjection type) are disambiguated with
a kind suffix (use-projection-type).
Resources
robonen-docs://index— the documentation index.robonen-docs://{package}/{slug}— full Markdown for a single documented item (listable, one entry per leaf).
Layout
| File | Responsibility |
|---|---|
../../server/routes/mcp.post.ts |
Nitro HTTP route — bridges the request to the MCP transport. |
create-server.ts |
Builds the configured McpServer (tools + resources) from metadata. |
docs-index.ts |
Pure query layer — flatten, unique-slug, search, resolve. |
format.ts |
Markdown renderers for tool/resource payloads. |
*.test.ts |
Unit tests for the query layer. |