Circuitry MCP Server
OfficialServer 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 |
Instructions
Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.
This server publishes no instructions, or was last inspected before Glama recorded them.
Capabilities
Features and capabilities supported by this server
Protocol revision2025-11-25
| Capability | Details |
|---|---|
| tools | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| circuitry.statusC | Check connection status to Circuitry. |
| circuitry.connectA | Request connection to Circuitry. Shows permission dialog in Circuitry for user approval. Call this first before using other tools. |
| circuitry.disconnectA | Disconnect from Circuitry. Ends the current MCP session. Call circuitry.connect to reconnect. |
| workflow.getActiveB | Get info about the currently visible workflow. |
| workflow.getStructureB | Get simplified structure of all flows in the workflow. Use this to understand what user has drawn. |
| workflow.resolveFlowA | 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.getNodeSummaryA | Get simplified details about nodes. Returns name, type, and connections - enough for Claude CLI to understand the diagram. |
| workflow.getFlowchartsA | Get existing flow nodes to modify. Use before updateFlowchart to see what exists. |
| workflow.layoutNodesB | Auto-layout specific nodes using dagre (longest-path algorithm). Positions nodes and optimizes edge handles for clean flowchart appearance. |
| workflow.undoA | 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.redoA | Redo the last undone change. Restores nodes, edges, and drawing data to the next state. |
| workflow.canUndoA | Check if undo is available. Call before undo to verify there are changes to revert. |
| workflow.canRedoA | Check if redo is available. Call before redo to verify there are changes to restore. |
| workflow.getSelectionContextA | 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.listB | List all nodes in the active workflow. |
| nodes.getC | Get a specific node by its ID. |
| nodes.searchA | 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.updateC | Update a node's data/configuration. |
| nodes.deleteC | Delete a node from the workflow. |
| nodes.createFlowchartA | 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.updateFlowchartB | Update an existing flowchart. Pass nodeIds from createFlowchart response to modify nodes/edges. |
| nodes.insertBetweenA | Insert node(s) between two connected nodes. Removes existing edge and creates new edges through the inserted nodes. Use |
| nodes.addC | Add a new node to the workflow. |
| nodes.addConnectedC | Create a new node and connect it to an existing node. |
| nodes.getByNameC | Find a node by its display name. |
| nodes.getByTypeB | 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.listB | List all edges in the current workflow. |
| edges.connectC | Connect two nodes with an edge. |
| edges.deleteC | Delete an edge by ID. |
| edges.deleteBetweenC | Delete all edges between two nodes. More intuitive than needing edge IDs. |
| code.createB | Create a code node. Use filePath for bidirectional file sync, OR use name+content for direct creation. |
| code.createBatchC | Create multiple code nodes from file paths. EServer fetches files and sets up sync. |
| code.createBatchGroupedA | 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.getLineCountB | Get the number of lines in a code node. Useful for planning chunked reads of large files. |
| code.getCodeA | 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.setCodeA | 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.setLinesA | 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.createC | Create a new Sheet (spreadsheet) node with data. |
| sheet.setDataC | Replace all data in a Sheet. |
| sheet.getRowCountA | Get the number of rows in a Sheet. Use for planning pagination/chunked reads. |
| sheet.getColumnCountB | Get the number of columns in a Sheet. |
| sheet.getHeadersB | Get the column headers of a Sheet. |
| sheet.getRowsA | Get a range of rows from a Sheet (0-indexed, inclusive). Use for large sheets instead of getData. |
| sheet.getColumnB | Get an entire column from a Sheet by index or letter. |
| sheet.getDataPaginatedA | Get sheet data with pagination. Best for large sheets (100K+ rows). |
| sheet.getCellB | Get a single cell value from a Sheet. |
| sheet.setCellC | Set a single cell value in a Sheet. Can also set formulas (start with =). |
| sheet.getCellInfoC | Get detailed cell info including formula and computed value. |
| sheet.insertRowC | Insert a row at a specific position. |
| sheet.deleteRowC | Delete a row at a specific position. |
| sheet.updateRowC | Replace an entire row at a specific position. |
| sheet.insertColumnC | Insert a column at a specific position. |
| sheet.deleteColumnC | Delete a column at a specific position. |
| sheet.setCellsA | Set multiple cells in one call - efficient for sparse updates. Values starting with "=" are treated as formulas. |
| sheet.fillRangeA | 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.setCellFormulaC | Set a formula for a cell. Formulas must start with =. |
| sheet.getCellFormulaB | Get the formula string for a cell. |
| sheet.getFormulasA | Get all formulas in a Sheet as a map of cell keys to formula strings. |
| sheet.listFunctionsA | List all available formula functions. Sheets support ALL standard Excel/Google Sheets functions including:
|
| text.createA | 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.getContentC | Get markdown content from a Text node. |
| text.setContentC | Update markdown content in a Text node. Supports markdown and LaTeX. |
| codebook.isOpenA | Check if CodeBook (notebook view) is currently active. When CodeBook is open, node creation should use codebook.addCell for proper cell insertion. |
| codebook.getStateB | Get CodeBook state including cell order, selected cell, and execution status. Useful for understanding the current notebook context. |
| codebook.addCellA | 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.openA | Open CodeBook view for the current workflow. Switches to notebook-style linear view. |
| codebook.closeB | Close CodeBook view and return to workflow canvas. |
| codebook.runCellC | Execute a specific cell in CodeBook. |
| codebook.runAllB | Execute all cells in CodeBook in order. |
| codebook.getExecutionTargetA | Get the current Python execution target for new code cells. |
| codebook.setExecutionTargetC | Set the Python execution target for new code cells. |
| drawing.getImageA | 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.getActiveDocumentA | Get information about the active drawing document. Use to determine context (notepad/designer/workflow) and whether HTML components exist. |
| html.createA | Create HTML content in Circuitry. DESIGNER MODE: 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.updateA | 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.deleteB | Delete an HTML component from the drawing layer. In Designer mode, operates on currently selected screen. |
| html.listA | List all HTML components in the current drawing layer. In Designer mode, lists components on currently selected screen. |
| html.getA | 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.getByNameA | 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.getActiveA | 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.getModeA | Get the current Designer mode (design, layout, html, or preview). |
| designer.setModeC | Set the Designer mode.
|
| designer.getDesignContextA | 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.listB | List all screens (pages/artboards) in the current Designer document. |
| screen.getC | Get a screen by ID or name. |
| screen.createA | 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.updateC | Update screen properties (name, dimensions, backgroundColor). |
| screen.deleteC | Delete a screen from the Designer. |
| screen.duplicateC | Duplicate a screen with all its layouts and HTML components. |
| screen.selectC | Select a screen to make it active for editing. |
| screen.captureA | 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.listB | List all layout elements on the current or specified screen. |
| layout.getB | Get a layout element by ID or name. |
| layout.createB | 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.updateC | Update a layout element (name, position, dimensions, style). |
| layout.deleteC | Delete a layout element. |
| layout.setStyleB | Set style properties on a layout element. Available style properties:
|
| layout.searchC | Search for layout elements by name or type. |
| layout.getCellB | Get details about a specific cell in a grid layout. |
| layout.setCellStyleC | 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 | |
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/circuitry-dev/circuitry-mcp-server'
If you have feedback or need assistance with the MCP directory API, please join our Discord server