wiri
Wiri is a headless wireframing MCP server designed for an LLM operator. It stores each screen as a small semantic scene graph, lays elements out without absolute coordinates, and closes the editing loop with deterministic renders and lint findings.
README
Wiri
Wiri is a headless wireframing MCP server designed for an LLM operator. It stores each screen as a small semantic scene graph, lays elements out without absolute coordinates, and closes the editing loop with deterministic renders and lint findings.
The v1 contract is in SPEC.md. The persisted document shape is also available as schemas/wire-document.schema.json.
Requirements
- Node.js 20.9 or newer
- A local directory for documents and exports
Wiri runs entirely on the local machine. It makes no network requests and sends no telemetry. Documents, checkpoint history, rendered exports, form values, and annotations are stored as plaintext; do not use production secrets as wireframe content.
Install and run
npm install
npm run build
node dist/index.js --workspace ./wireframes
The process speaks MCP over standard input/output. It writes protocol messages only to stdout and exits when its client disconnects. WIRI_WORKSPACE can set the workspace when --workspace is omitted; the current directory is the final default.
An MCP client configuration can launch the built server like this (use absolute paths in a real configuration):
{
"mcpServers": {
"wiri": {
"command": "node",
"args": [
"/absolute/path/to/wiri/dist/index.js",
"--workspace",
"/absolute/path/to/wireframes"
]
}
}
}
For development, npm run dev -- --workspace ./wireframes runs the TypeScript entry point directly.
Canonical workflow
- Call
create_document, then add one or more screens withcreate_screen. - Call
get_treebefore editing a screen that has not been read in the current context. - Prefer one or two atomic
batchcalls to build a screen. A later operation can refer to a node created by an earlier add with$0,$1, and so on. - Use
renderfor visual feedback andlintfor deterministic findings. - Use
checkpointbefore a larger revision;diff,undo, andredomake changes inspectable and reversible. - Use
linksorrender_flowto verify navigation, thenexportto produce PNG, SVG, or static HTML.
A compact signup flow can be built in one document with this shape:
welcome --start_btn--> email --continue_btn--> password
password --continue_btn--> verify --verify_btn--> done
Each arrow is simply a to prop on its source button. HTML export turns those links into fragment navigation between screen sections.
Layered application surfaces use constrained anchors rather than freeform coordinates. For example, a full-screen image or map placeholder can use anchor="stretch", while any number of variant="fab" buttons live in stacks anchored to screen corners. Semantic left, right, and bottom drawers are direct children of the same layer.
Storage
The server owns one active document at a time and writes successful mutations before returning:
<workspace>/
checkout_redesign.wire.json
checkout_redesign.history.json
exports/
...
Writes use a temporary file plus atomic rename. Opening another document clears session-only undo/redo stacks; named checkpoints persist in the history file. Export files are safe to regenerate and overwrite deterministically.
Commands
npm test # unit and integration tests
npm run typecheck # strict TypeScript check
npm run build # emit dist/
npm start -- --workspace ./wireframes
The server intentionally exposes tools only in v1—no MCP resources or prompts. Run node dist/index.js --help for command-line options.
Limits and troubleshooting
- Names and ids must match
[a-z][a-z0-9_]{0,31}. - A document supports 50 screens; a screen supports 300 nodes; a batch supports 100 operations.
- Rendered height is capped at 4000 px.
- If a call returns
NO_ACTIVE_DOCUMENT, callcreate_documentoropen_documentfirst. - If a parent is rejected, call
get_treeand chooseroot,overlay, or an existing container id. - A failed call and a failed batch never change the active graph or its document file.
Wiri reads schema version 1 only. Malformed files, unknown node types, invalid props, or unsupported schema versions are rejected rather than repaired silently.
License notices
Rendered output embeds Inter from @fontsource/inter, distributed under the SIL Open Font License 1.1. See THIRD_PARTY_NOTICES.md.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.