Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| CIRCUITRY_ACCESS_KEY | No | Override access key | |
| CIRCUITRY_ESERVER_URL | No | Override EServer URL | http://localhost:3030 |
Capabilities
Features and capabilities supported by this server
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| circuitry.status | Check connection status to Circuitry. |
| circuitry.connect | Request connection to Circuitry. Shows permission dialog in Circuitry for user approval. Call this first before using other tools. |
| circuitry.disconnect | Disconnect from Circuitry. Ends the current MCP session. Call circuitry.connect to reconnect. |
| workflow.getActive | Get info about the currently visible workflow. |
| workflow.getStructure | Get simplified structure of all flows in the workflow. Use this to understand what user has drawn. |
| workflow.resolveFlow | Resolve which flow/nodes the user is referring to based on their message. Uses heuristics to match: selected node content, node names, code/text content keywords. Call this instead of fetching entire workflow for context. |
| workflow.getNodeSummary | Get simplified details about nodes. Returns name, type, and connections - enough for Claude CLI to understand the diagram. |
| workflow.getFlowcharts | Get existing flow nodes to modify. Use before updateFlowchart to see what exists. |
| workflow.layoutNodes | Auto-layout specific nodes using dagre (longest-path algorithm). Positions nodes and optimizes edge handles for clean flowchart appearance. |
| workflow.undo | Undo the last workflow change. Reverts nodes, edges, and drawing data to previous state. Use this when changes need to be reverted or the user asks to undo. |
| workflow.redo | Redo the last undone change. Restores nodes, edges, and drawing data to the next state. |
| workflow.canUndo | Check if undo is available. Call before undo to verify there are changes to revert. |
| workflow.canRedo | Check if redo is available. Call before redo to verify there are changes to restore. |
| workflow.getSelectionContext | Get currently selected nodes and what is selected within them (cells in sheets, text in code/text/agent nodes). Use this to understand what the user is referring to when they say "this", "what does this do?", "explain this", etc. Returns empty array if nothing is selected. |
| nodes.list | List all nodes in the active workflow. |
| nodes.get | Get a specific node by its ID. |
| nodes.search | Search workflow nodes by name or content. Returns ALL matches with confidence scores - let AI decide which is most relevant. Use cases:
Content searched by type:
Large sheets (>1000 rows) are skipped by default to avoid slowness. Use includeLargeSheets: true to include them. |
| nodes.update | Update a node's data/configuration. |
| nodes.delete | Delete a node from the workflow. |
| nodes.createFlowchart | Create a flowchart with nodes and edges on the canvas. Returns nodeIds mapping for subsequent modifications via nodes.updateFlowchart. Nodes: { id, name, shape?, color? }
Edges: { from, to, fromHandle?, toHandle?, label? }
|
| nodes.updateFlowchart | Update an existing flowchart. Pass nodeIds from createFlowchart response to modify nodes/edges. |
| nodes.insertBetween | Insert node(s) between two connected nodes. Removes existing edge and creates new edges through the inserted nodes. Use |
| nodes.add | Add a new node to the workflow. |
| nodes.addConnected | Create a new node and connect it to an existing node. |
| nodes.getByName | Find a node by its display name. |
| nodes.getByType | Get all nodes of a specific type. Types: start, agent, code, datagrid (Sheet), text, image, chart, condition, loop, then, trigger, action, sticky, flow, web, terminal, scene3d |
| edges.list | List all edges in the current workflow. |
| edges.connect | Connect two nodes with an edge. |
| edges.delete | Delete an edge by ID. |
| edges.deleteBetween | Delete all edges between two nodes. More intuitive than needing edge IDs. |
| code.create | Create a code node. Use filePath for bidirectional file sync, OR use name+content for direct creation. |
| code.createBatch | Create multiple code nodes from file paths. EServer fetches files and sets up sync. |
| code.createBatchGrouped | Create code nodes organized in named groups with flow node headers. Each group gets a label header (flow node) with its code files arranged below it. Groups are placed side-by-side (horizontal) or stacked (vertical). IMPORTANT: Provide descriptive names for each file. For Next.js page.tsx files, derive the name from the folder path (e.g., "/app/login/page.tsx" → "Login", "/app/dashboard/settings/page.tsx" → "Dashboard Settings"). Avoid generic names like "page" or "index". Example: Organize files by folder structure like "Controllers", "Services", "Models". |
| code.getLineCount | Get the number of lines in a code node. Useful for planning chunked reads of large files. |
| code.getCode | Get code from a Code node. Supports optional line range for large files (like Claude Code's Read tool). Without offset/limit: returns full code. With offset/limit: returns specific lines (0-indexed). Example: offset=100, limit=50 returns lines 100-149. |
| code.setCode | Update code content in a code node. Use showDiff: true to show inline diff UI for user to review/accept changes. If node is EServer-sourced, will sync to source file. CRITICAL: Use this for "remove/add/change the X function" requests - EDIT the code content, don't delete the node!
|
| code.setLines | Replace a range of lines in a code node. More efficient than setCode for partial updates. The number of lines being replaced equals the length of the 'lines' array. Lines at startLine through startLine + lines.length - 1 will be replaced. |
| sheet.create | Create a new Sheet (spreadsheet) node with data. |
| sheet.setData | Replace all data in a Sheet. |
| sheet.getRowCount | Get the number of rows in a Sheet. Use for planning pagination/chunked reads. |
| sheet.getColumnCount | Get the number of columns in a Sheet. |
| sheet.getHeaders | Get the column headers of a Sheet. |
| sheet.getRows | Get a range of rows from a Sheet (0-indexed, inclusive). Use for large sheets instead of getData. |
| sheet.getColumn | Get an entire column from a Sheet by index or letter. |
| sheet.getDataPaginated | Get sheet data with pagination. Best for large sheets (100K+ rows). |
| sheet.getCell | Get a single cell value from a Sheet. |
| sheet.setCell | Set a single cell value in a Sheet. Can also set formulas (start with =). |
| sheet.getCellInfo | Get detailed cell info including formula and computed value. |
| sheet.insertRow | Insert a row at a specific position. |
| sheet.deleteRow | Delete a row at a specific position. |
| sheet.updateRow | Replace an entire row at a specific position. |
| sheet.insertColumn | Insert a column at a specific position. |
| sheet.deleteColumn | Delete a column at a specific position. |
| sheet.setCells | Set multiple cells in one call - efficient for sparse updates. Values starting with "=" are treated as formulas. |
| sheet.fillRange | Fill a range with a formula pattern - efficient for computed columns/rows. Use {row} for 1-indexed row number (Excel-style), {col} for column letter. |
| sheet.setCellFormula | Set a formula for a cell. Formulas must start with =. |
| sheet.getCellFormula | Get the formula string for a cell. |
| sheet.getFormulas | Get all formulas in a Sheet as a map of cell keys to formula strings. |
| sheet.listFunctions | List all available formula functions. Sheets support ALL standard Excel/Google Sheets functions including:
|
| text.create | Create a Text (documentation) node with markdown and LaTeX support. Text nodes are ideal for:
In CodeBook: Use codebook.addCell('text') instead for proper cell insertion. |
| text.getContent | Get markdown content from a Text node. |
| text.setContent | Update markdown content in a Text node. Supports markdown and LaTeX. |
| codebook.isOpen | Check if CodeBook (notebook view) is currently active. When CodeBook is open, node creation should use codebook.addCell for proper cell insertion. |
| codebook.getState | Get CodeBook state including cell order, selected cell, and execution status. Useful for understanding the current notebook context. |
| codebook.addCell | Add a new cell to CodeBook. Creates a linked node in the workflow and inserts it in the cell order. Supported cell types:
This is the preferred way to add nodes when CodeBook is open. For workflow canvas, use code.create, text.create, or sheet.create instead. |
| codebook.open | Open CodeBook view for the current workflow. Switches to notebook-style linear view. |
| codebook.close | Close CodeBook view and return to workflow canvas. |
| codebook.runCell | Execute a specific cell in CodeBook. |
| codebook.runAll | Execute all cells in CodeBook in order. |
| codebook.getExecutionTarget | Get the current Python execution target for new code cells. |
| codebook.setExecutionTarget | Set the Python execution target for new code cells. |
| drawing.getImage | Get the drawing layer as an image for visual interpretation. Use this when user sketches an idea and you need to "see" what they drew. Returns base64 PNG. |
| drawing.getActiveDocument | Get information about the active drawing document. Use to determine context (notepad/designer/workflow) and whether HTML components exist. |
| html.create | Create HTML content in Circuitry. DESIGNER MODE: Use
For Designer screens, ALWAYS use Only use WORKFLOW context - TWO options (ASK USER if unclear):
CRITICAL CSS STRUCTURE - Prevents zoom scaling bugs:
NEVER put visual styles (background, border-radius, padding, box-shadow) on :host - causes border-radius to scale incorrectly when zooming. Use MOBILE UI SIZING:
After editing components: Use |
| html.update | Update an existing HTML component. Only provided fields will be updated. In Designer mode, operates on currently selected screen - use screen.select first if needed. |
| html.delete | Delete an HTML component from the drawing layer. In Designer mode, operates on currently selected screen. |
| html.list | List all HTML components in the current drawing layer. In Designer mode, lists components on currently selected screen. |
| html.get | Get full details of an HTML component including HTML, CSS, and JS content. In Designer mode, searches currently selected screen - use screen.select first if needed. |
| html.getByName | Get an HTML component by its display name. Case-insensitive search. Use this to find components like "Login Form" or "Navigation Menu" without needing to know the ID. In Designer mode, searches currently selected screen. |
| designer.getActive | Check if Designer mode is active and get current document info. Returns null if not in Designer mode. Use this before calling screen.* or layout.* tools. |
| designer.getMode | Get the current Designer mode (design, layout, html, or preview). |
| designer.setMode | Set the Designer mode.
|
| designer.getDesignContext | Get design context (fonts, colors, patterns, buttons) extracted from all screens. Use this to understand the user's design style before generating HTML components. The returned context includes:
TIP: When generating HTML with html.create, use this context to match colors, fonts, and button styles to the existing design. |
| screen.list | List all screens (pages/artboards) in the current Designer document. |
| screen.get | Get a screen by ID or name. |
| screen.create | Create a new screen (page/artboard) in the Designer. Device presets: iPhone 15, iPhone SE, iPad Pro 12", Desktop 1920, etc. Or use "custom" with explicit dimensions. TIP: After adding components to a screen, run |
| screen.update | Update screen properties (name, dimensions, backgroundColor). |
| screen.delete | Delete a screen from the Designer. |
| screen.duplicate | Duplicate a screen with all its layouts and HTML components. |
| screen.select | Select a screen to make it active for editing. |
| screen.capture | Capture a Designer screen as a PNG image. Use this to verify layouts and catch visual issues like:
Returns the screen as a base64 PNG image that Claude can analyze visually. |
| layout.list | List all layout elements on the current or specified screen. |
| layout.get | Get a layout element by ID or name. |
| layout.create | Create a layout element on a screen. Layout Types:
Full-width types (header, footer, hero, grids, container) auto-snap to screen width. Semantic elements auto-position: header at top, footer at bottom. |
| layout.update | Update a layout element (name, position, dimensions, style). |
| layout.delete | Delete a layout element. |
| layout.setStyle | Set style properties on a layout element. Available style properties:
|
| layout.search | Search for layout elements by name or type. |
| layout.getCell | Get details about a specific cell in a grid layout. |
| layout.setCellStyle | Set style properties on a specific grid cell. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |