Koskamo

BlockWerk MCP

An official Model Context Protocol server that enables AI assistants to build, edit, simulate, and analyze block diagrams for system modeling. It supports PID tuning, Bode and FFT analysis, system identification, and code export to C++, Python, or Rust.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

BlockWerk MCP logo, by BlockWerkVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by BlockWerk
MCP endpoint (Streamable HTTP)
https://blockwerk-mcp-worker.blockwerk.workers.dev/
Vendor documentation

What you can do with it

  • Build and simulate block diagrams for control systems
  • Tune PID controllers using automatic parameter search
  • Generate Bode and FFT data for frequency response analysis
  • Export simulation models as standalone C++ or Python code

Source and maintenance

Vendor evidenceRegistry 1.1.2

Protocol and capabilities

Server
blockwerk-mcp 1.0.0
MCP protocol
2025-06-18
Tools
42 advertised
Resources
1 advertised
Resource templates
0 advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "resources": {
    "listChanged": true
  }
}

Server-provided instructions

Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.

BlockWerk is a visual block-diagram simulation canvas. These tools drive a live blockwerk.tech browser tab over a relay. PAIRING: when a blockwerk.tech tab is paired, every tool drives that live canvas. When none is paired, the remote server still answers on its own: you can browse the block library, build and edit a diagram, inspect it, export it, and call get_share_link. Tools that need the browser (run_simulation and everything reading its results, optimisation, and jobs) require a pairing — when unpaired those return the same share link; give it to the user and ask them to open it and press Run. SHARING: get_share_link works either way and carries the whole project inside the URL. Offer it whenever the user wants to see, keep or hand off what you built. BUILD A DIAGRAM — preferred path: - For a classic system (PID loop, cruise control, inverted pendulum, a filter, a rectifier), call get_templates FIRST. These diagrams are verified and already run, so load_template removes the guessing about block types, port ids and gains entirely. Both work with or without a paired tab. - For a whole diagram in one shot, use load_diagram. It is the fastest and most reliable. Each connection MUST include a unique "id" field; omitting it fails. - For incremental edits, use: get_available_blocks (discover types + port ids) -> add_block -> connect_blocks -> run_simulation. - Parameter keys are normalized automatically: standard mathematical notation (Kp/Ki/Kd/N, frequency, lower/upper, duty_cycle) works for both add_block inline params and update_params. - Never guess block types or port ids — read get_available_blocks first. READING RESULTS (ground truth): - After run_simulation, read get_signal_data for actual values. Scope and Sink blocks automatically trace connected upstream source signals. - Inspect canvas state with describe_canvas / analyze_topology rather than assuming. CODE GENERATION: - To export standalone production code (C++/Arduino, Python, Safe Rust) from any canvas diagram, use generate_code. Use InPort and OutPort blocks to define explicit external hardware I/O interfaces. APPROVALS: clear_canvas, delete_block, load_diagram and load_template ask the user for an in-tab approval click. Use them deliberately; prefer one load_diagram over many destructive calls.

Tools

42 advertised

describe_canvas — Describe canvas
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns a structured description of all blocks and connections currently on the canvas. Set "compact" to true for a token-efficient summary.

describe_canvas input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "compact": {
      "type": "boolean",
      "description": "If true, returns a minimal description without full parameter details."
    }
  }
}
describe_canvas annotations
{
  "title": "Describe canvas",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_available_blocks — List available blocks
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns the block types in the library with their descriptions, configurable parameters, and exact input/output port IDs. Without a filter it returns a compact list of all types; with a list of type IDs it returns full details for those types. Example port IDs: Step out "out"; Sum in "in", out "out"; Gain in "in", out "out"; PIDController in "error","reset", out "out"; uPlotDisplay in "signal". Common aliases (e.g. "in" for PID error, "in" for uPlotDisplay signal, "+" / "-" for Subtraction) are resolved automatically.

get_available_blocks input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "filter": {
      "type": "array",
      "items": {
        "type": "string"
      },
      "description": "Optional: List of block type IDs to get full details for. If omitted, returns a compact list of all blocks."
    }
  }
}
get_available_blocks annotations
{
  "title": "List available blocks",
  "readOnlyHint": true,
  "openWorldHint": false
}
add_block — Add block
Advertised by the server during the last successful anonymous check.

Add a new block to the canvas. Returns the new block ID.

add_block input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "type",
    "x",
    "y"
  ],
  "properties": {
    "x": {
      "type": "number",
      "description": "Horizontal position in canvas pixels"
    },
    "y": {
      "type": "number",
      "description": "Vertical position in canvas pixels"
    },
    "type": {
      "type": "string",
      "description": "Block type from the library, e.g. \"PIDController\", \"Gain\", \"Integrator\""
    }
  }
}
add_block annotations
{
  "title": "Add block",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
connect_blocks — Connect blocks
Advertised by the server during the last successful anonymous check.

Connect an output port of one block to an input port of another. Automatically resolves common port aliases (e.g., "in" -> "signal" for uPlotDisplay, "in" -> "error" for PIDController, "+" / "-" for Subtraction).

connect_blocks input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "fromBlockId",
    "fromPortId",
    "toBlockId",
    "toPortId"
  ],
  "properties": {
    "toPortId": {
      "type": "string",
      "description": "Input port ID of the destination block, e.g. \"in\" (aliases like \"signal\" or PID \"error\" are supported)"
    },
    "toBlockId": {
      "type": "string",
      "description": "ID of the destination block"
    },
    "fromPortId": {
      "type": "string",
      "description": "Output port ID of the source block, e.g. \"out\" (aliases like \"signal\", \"y\" are supported)"
    },
    "fromBlockId": {
      "type": "string",
      "description": "ID of the source block"
    }
  }
}
connect_blocks annotations
{
  "title": "Connect blocks",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
update_params — Update block parameters
Advertised by the server during the last successful anonymous check.

Update one or more parameters of an existing block.

update_params input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "blockId",
    "params"
  ],
  "properties": {
    "params": {
      "type": "object",
      "description": "Key-value pairs of parameter names and their new values",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    },
    "blockId": {
      "type": "string",
      "description": "ID of the block to update"
    }
  }
}
update_params annotations
{
  "title": "Update block parameters",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
delete_block — Delete block
Advertised by the server during the last successful anonymous check.
Advertised destructive

Delete a block and all its connections from the canvas. This is a destructive action that asks the user for approval in the BlockWerk tab.

delete_block input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "blockId"
  ],
  "properties": {
    "blockId": {
      "type": "string",
      "description": "ID of the block to delete"
    }
  }
}
delete_block annotations
{
  "title": "Delete block",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
load_diagram — Load diagram
Advertised by the server during the last successful anonymous check.
Advertised destructive

Atomically replaces the entire canvas with a complete diagram defined as a BlockWerk project JSON string. The JSON has a "blocks" array (each block needs a unique "id" and "type"; "x"/"y"/"params" are optional) and a "connections" array (each connection needs a unique "id" plus "fromBlockId", "fromPortId", "toBlockId", "toPortId"; a missing id fails validation of the whole load). Block types and port ids are listed by get_available_blocks. This is a destructive action that asks the user for approval in the BlockWerk tab.

load_diagram input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "json"
  ],
  "properties": {
    "json": {
      "type": "string",
      "description": "Full BlockWerk project JSON, e.g. {\"blocks\":[{\"id\":\"b1\",\"type\":\"Step\",\"x\":100,\"y\":100,\"params\":{}},{\"id\":\"b2\",\"type\":\"Integrator\",\"x\":300,\"y\":100,\"params\":{}}],\"connections\":[{\"id\":\"c1\",\"fromBlockId\":\"b1\",\"fromPortId\":\"out\",\"toBlockId\":\"b2\",\"toPortId\":\"in\"}]}"
    }
  }
}
load_diagram annotations
{
  "title": "Load diagram",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
export_diagram — Export diagram
Advertised by the server during the last successful anonymous check.
Advertised read-only

Exports the current canvas project as a complete BlockWerk JSON string.

export_diagram input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
export_diagram annotations
{
  "title": "Export diagram",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_share_link — Get share link
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns a link that opens the current diagram on the BlockWerk canvas. The whole project travels compressed inside the URL, so it needs no account and nothing is uploaded. Opening the link in a browser shows the diagram, where the simulation can be run.

get_share_link input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
get_share_link annotations
{
  "title": "Get share link",
  "readOnlyHint": true,
  "openWorldHint": false
}
clear_canvas — Clear canvas
Advertised by the server during the last successful anonymous check.
Advertised destructive

Remove all blocks and connections from the canvas. This is a destructive action that asks the user for approval in the BlockWerk tab.

clear_canvas input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
clear_canvas annotations
{
  "title": "Clear canvas",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
tidy_layout — Tidy layout
Advertised by the server during the last successful anonymous check.

Automatically rearrange all blocks on the canvas into a clean, left-to-right flow.

tidy_layout input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
tidy_layout annotations
{
  "title": "Tidy layout",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
batch_commands — Run command batch
Advertised by the server during the last successful anonymous check.
Advertised destructive

Executes multiple canvas manipulation and background job commands in a single round-trip. Use "handle" strings to refer to blocks added earlier in the same batch. When adding TextNote annotations, set "anchors" to the handles/IDs of the described blocks so auto-layout keeps each note next to them.

batch_commands input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "commands"
  ],
  "properties": {
    "commands": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "type"
        ],
        "properties": {
          "x": {
            "type": "number"
          },
          "y": {
            "type": "number"
          },
          "max": {
            "type": "number"
          },
          "min": {
            "type": "number"
          },
          "type": {
            "enum": [
              "add_block",
              "move_block",
              "connect_blocks",
              "update_params",
              "delete_block",
              "tidy_layout",
              "clear_canvas",
              "start_optimization",
              "get_job_status",
              "cancel_job"
            ],
            "type": "string"
          },
          "jobId": {
            "type": "string"
          },
          "handle": {
            "type": "string"
          },
          "params": {
            "type": "object",
            "propertyNames": {
              "type": "string"
            },
            "additionalProperties": {}
          },
          "anchors": {
            "type": "array",
            "items": {
              "type": "string"
            },
            "description": "For add_block of a TextNote: handles/IDs of the blocks the note describes. Auto-layout and drag then keep the note beside those blocks."
          },
          "blockId": {
            "type": "string"
          },
          "setpoint": {
            "type": "number"
          },
          "toPortId": {
            "type": "string"
          },
          "blockType": {
            "type": "string"
          },
          "objective": {
            "enum": [
              "iae",
              "overshoot",
              "settling_time"
            ],
            "type": "string"
          },
          "paramName": {
            "type": "string"
          },
          "toBlockId": {
            "type": "string"
          },
          "fromPortId": {
            "type": "string"
          },
          "fromBlockId": {
            "type": "string"
          },
          "maxIterations": {
            "type": "number"
          },
          "measureBlockId": {
            "type": "string"
          }
        }
      }
    }
  }
}
batch_commands annotations
{
  "title": "Run command batch",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
analyze_topology — Analyze topology
Advertised by the server during the last successful anonymous check.
Advertised read-only

Analyzes the block diagram structure: detects feedback loops, signal paths, and system order.

analyze_topology input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
analyze_topology annotations
{
  "title": "Analyze topology",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_signal_data — Get signal data
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns time series data from a Scope block output for analysis.

get_signal_data input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "blockId"
  ],
  "properties": {
    "blockId": {
      "type": "string",
      "description": "ID of the Scope block"
    },
    "channel": {
      "type": "number",
      "description": "Channel index (default: 0)"
    }
  }
}
get_signal_data annotations
{
  "title": "Get signal data",
  "readOnlyHint": true,
  "openWorldHint": false
}
calculate_metrics — Calculate signal metrics
Advertised by the server during the last successful anonymous check.
Advertised read-only

Calculates step response metrics from signal data: rise time, settling time, overshoot percentage, and steady-state error.

calculate_metrics input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "blockId"
  ],
  "properties": {
    "blockId": {
      "type": "string",
      "description": "ID of the Scope block"
    },
    "setpoint": {
      "type": "number",
      "description": "Target setpoint value (default: 1)"
    }
  }
}
calculate_metrics annotations
{
  "title": "Calculate signal metrics",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_analysis_measurements — Get analysis measurements
Advertised by the server during the last successful anonymous check.
Advertised read-only

Retrieves the currently active pinned measurements and their computed values across plotted signals in the Analysis panel.

get_analysis_measurements input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "blockId": {
      "type": "string",
      "description": "Optional blockId or signalId filter"
    }
  }
}
get_analysis_measurements annotations
{
  "title": "Get analysis measurements",
  "readOnlyHint": true,
  "openWorldHint": false
}
evaluate_spec_mask — Evaluate spec mask
Advertised by the server during the last successful anonymous check.
Advertised read-only

Evaluates signal data against automated design specifications and tolerance corridors (rise time, settling time, overshoot %, steady-state error, min/max limits).

evaluate_spec_mask input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "blockId"
  ],
  "properties": {
    "blockId": {
      "type": "string",
      "description": "ID of the Scope or signal source block"
    },
    "setpoint": {
      "type": "number",
      "description": "Target setpoint value (default: 1)"
    },
    "lowerLimit": {
      "type": "number",
      "description": "Absolute lower bound corridor"
    },
    "upperLimit": {
      "type": "number",
      "description": "Absolute upper bound corridor"
    },
    "maxRiseTime": {
      "type": "number",
      "description": "Maximum allowable rise time (seconds)"
    },
    "maxSettlingTime": {
      "type": "number",
      "description": "Maximum allowable settling time (seconds)"
    },
    "maxOvershootPercent": {
      "type": "number",
      "description": "Maximum allowable overshoot %"
    },
    "maxSteadyStateError": {
      "type": "number",
      "description": "Maximum allowable steady-state error"
    }
  }
}
evaluate_spec_mask annotations
{
  "title": "Evaluate spec mask",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_architect_memory — Get architect memory
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns the persistent memory object of the Architect.

get_architect_memory input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
get_architect_memory annotations
{
  "title": "Get architect memory",
  "readOnlyHint": true,
  "openWorldHint": false
}
update_architect_memory — Update architect memory
Advertised by the server during the last successful anonymous check.

Updates the persistent memory of the Architect. Provide a JSON object with keys to update/merge.

update_architect_memory input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "updates"
  ],
  "properties": {
    "updates": {
      "type": "object",
      "description": "Keys and values to store",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {}
    }
  }
}
update_architect_memory annotations
{
  "title": "Update architect memory",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
validate_engineering_units — Validate engineering units
Advertised by the server during the last successful anonymous check.
Advertised read-only

Checks the consistency of engineering units across the diagram. Detects incompatible connections and missing units.

validate_engineering_units input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
validate_engineering_units annotations
{
  "title": "Validate engineering units",
  "readOnlyHint": true,
  "openWorldHint": false
}
validate_canvas — Validate canvas
Advertised by the server during the last successful anonymous check.
Advertised read-only

Performs pre-flight topological and numerical integrity checks on the canvas. Detects unconnected required input ports, isolated blocks, parameter domain anomalies, and direct algebraic feedthrough loops.

validate_canvas input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
validate_canvas annotations
{
  "title": "Validate canvas",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_canvas_preview — Get canvas preview
Advertised by the server during the last successful anonymous check.
Advertised read-only

Captures a visual screenshot preview of the canvas branded with the official BlockWerk watermark badge and returns the live interactive URL to view and edit the diagram online.

get_canvas_preview input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "type": {
      "enum": [
        "canvas",
        "scope",
        "combined"
      ],
      "type": "string",
      "description": "Which visual region to capture: \"canvas\", \"scope\", or \"combined\" (default: \"combined\")."
    }
  }
}
get_canvas_preview annotations
{
  "title": "Get canvas preview",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_templates — List diagram templates
Advertised by the server during the last successful anonymous check.
Advertised read-only

Lists the built-in, verified BlockWerk diagrams: classic control systems (PID loop, cruise control, inverted pendulum), signal processing, electrical and physics models. Each entry gives an id, what the diagram does, its difficulty and the blocks it uses. Returns metadata only; load_template puts a diagram on the canvas by id.

get_templates input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "category": {
      "enum": [
        "Control Systems",
        "Signal Processing",
        "Physics",
        "Electrical"
      ],
      "type": "string",
      "description": "Optional filter by category."
    },
    "interactive": {
      "type": "boolean",
      "description": "If true, only diagrams with live on-canvas controls (sliders, joystick, keyboard) meant to be driven while the simulation runs."
    }
  }
}
get_templates annotations
{
  "title": "List diagram templates",
  "readOnlyHint": true,
  "openWorldHint": false
}
load_template — Load diagram template
Advertised by the server during the last successful anonymous check.
Advertised destructive

Replaces the entire canvas with one of the built-in verified diagrams, by id from get_templates. The template carries its topology, parameters and simulation settings. Returns the block and connection counts, the verified simulation settings, and the attribution when the model is based on third-party material. This is a destructive action that asks the user for approval in the BlockWerk tab.

load_template input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "templateId"
  ],
  "properties": {
    "templateId": {
      "type": "string",
      "description": "Template id from get_templates, e.g. \"inverted_pendulum\" or \"pid_loop\"."
    }
  }
}
load_template annotations
{
  "title": "Load diagram template",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
run_simulation — Run simulation
Advertised by the server during the last successful anonymous check.

Triggers a new simulation run with the current canvas state and settings, refreshing the signal data.

run_simulation input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "reason": {
      "type": "string",
      "description": "User-facing explanation of why settings were changed (e.g., Nyquist constraint)"
    },
    "duration": {
      "type": "number",
      "description": "Duration in seconds"
    },
    "sampleTime": {
      "type": "number",
      "description": "Optional custom step size (dt) for high frequency or stiff systems (e.g., 0.001)"
    }
  }
}
run_simulation annotations
{
  "title": "Run simulation",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
sweep_parameter — Sweep parameter
Advertised by the server during the last successful anonymous check.

Runs simulations across a list of values for one parameter, returning control quality metrics (IAE, overshoot, settling_time, steady_state_error) per value. Requires measureBlockId and setpoint.

sweep_parameter input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "blockId",
    "paramName",
    "values"
  ],
  "properties": {
    "values": {
      "type": "array",
      "items": {
        "type": "number"
      },
      "description": "List of values to test"
    },
    "blockId": {
      "type": "string",
      "description": "ID of the block to tune"
    },
    "setpoint": {
      "type": "number",
      "description": "Expected final value for error calculation (default: 1)"
    },
    "paramName": {
      "type": "string",
      "description": "Parameter key to vary (e.g., \"gain\", \"Kp\")"
    },
    "measureBlockId": {
      "type": "string",
      "description": "Scope or Display block ID to read the controlled signal from"
    }
  }
}
sweep_parameter annotations
{
  "title": "Sweep parameter",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
optimize_parameters — Optimize parameter
Advertised by the server during the last successful anonymous check.

Finds the optimal value for a single parameter using golden-section search. Minimizes IAE (integral absolute error), overshoot, or settling_time within a [min, max] range. Converges in about 10 simulations.

optimize_parameters input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "blockId",
    "paramName",
    "min",
    "max",
    "measureBlockId"
  ],
  "properties": {
    "max": {
      "type": "number",
      "description": "Upper bound of the search range"
    },
    "min": {
      "type": "number",
      "description": "Lower bound of the search range"
    },
    "blockId": {
      "type": "string",
      "description": "ID of the block containing the parameter to tune"
    },
    "setpoint": {
      "type": "number",
      "description": "Target steady-state value (default: 1)"
    },
    "objective": {
      "enum": [
        "iae",
        "overshoot",
        "settling_time"
      ],
      "type": "string",
      "description": "Metric to minimize (default: iae)"
    },
    "paramName": {
      "type": "string",
      "description": "Parameter key to optimize (e.g., \"Kp\", \"gain\")"
    },
    "maxIterations": {
      "type": "number",
      "description": "Maximum simulations to run, 3–20 (default: 10)"
    },
    "measureBlockId": {
      "type": "string",
      "description": "Scope or Display block ID to read the controlled signal from"
    }
  }
}
optimize_parameters annotations
{
  "title": "Optimize parameter",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
optimize_multi_parameter — Optimize multiple parameters
Advertised by the server during the last successful anonymous check.

Optimizes 2–6 parameters simultaneously using Nelder-Mead simplex search, for example Kp, Ki and Kd of a PID controller at once.

optimize_multi_parameter input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "targets",
    "measureBlockId"
  ],
  "properties": {
    "targets": {
      "type": "array",
      "items": {
        "type": "object",
        "required": [
          "blockId",
          "paramName",
          "min",
          "max"
        ],
        "properties": {
          "max": {
            "type": "number"
          },
          "min": {
            "type": "number"
          },
          "blockId": {
            "type": "string"
          },
          "paramName": {
            "type": "string"
          }
        }
      },
      "description": "Parameters to optimize simultaneously"
    },
    "setpoint": {
      "type": "number",
      "description": "Target steady-state value (default: 1)"
    },
    "objective": {
      "enum": [
        "iae",
        "overshoot",
        "settling_time"
      ],
      "type": "string",
      "description": "Metric to minimize (default: iae)"
    },
    "maxIterations": {
      "type": "number",
      "description": "Max simulations to run, 5–60 (default: 30)"
    },
    "measureBlockId": {
      "type": "string",
      "description": "Scope or Display block to read the controlled signal from"
    }
  }
}
optimize_multi_parameter annotations
{
  "title": "Optimize multiple parameters",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
auto_tune_pid — Auto-tune PID
Advertised by the server during the last successful anonymous check.

Automatically tunes a PID controller using the Ziegler-Nichols ultimate cycle method. Finds the ultimate gain (Ku) and oscillation period (Tu) via binary search, then applies ZN formulas. No prior knowledge of the plant required.

auto_tune_pid input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "pidBlockId",
    "measureBlockId"
  ],
  "properties": {
    "maxGain": {
      "type": "number",
      "description": "Upper bound for Ku search (default: 200)"
    },
    "minGain": {
      "type": "number",
      "description": "Lower bound for Ku search (default: 0.1)"
    },
    "setpoint": {
      "type": "number",
      "description": "Desired setpoint value (default: 1)"
    },
    "pidBlockId": {
      "type": "string",
      "description": "ID of the PIDController block to tune"
    },
    "controlType": {
      "enum": [
        "P",
        "PI",
        "PID"
      ],
      "type": "string",
      "description": "Controller type to tune for (default: PID)"
    },
    "measureBlockId": {
      "type": "string",
      "description": "Scope or Display block showing the controlled variable"
    }
  }
}
auto_tune_pid annotations
{
  "title": "Auto-tune PID",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
identify_fopdt — Identify FOPDT model
Advertised by the server during the last successful anonymous check.
Advertised read-only

Analyzes a step response from a plant to identify its First-Order Plus Dead Time (FOPDT) parameters: Gain (K), Time Constant (tau), and Dead Time (theta). Requires a completed simulation with a step input connected to the plant. Returns the calculated parameters.

identify_fopdt input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "blockId"
  ],
  "properties": {
    "blockId": {
      "type": "string",
      "description": "Scope or Display block ID showing the plant output"
    },
    "stepTime": {
      "type": "number",
      "description": "Time when the step input occurred (default: 0)"
    },
    "stepAmplitude": {
      "type": "number",
      "description": "Amplitude of the step input (default: 1)"
    }
  }
}
identify_fopdt annotations
{
  "title": "Identify FOPDT model",
  "readOnlyHint": true,
  "openWorldHint": false
}
start_optimization — Start background optimization
Advertised by the server during the last successful anonymous check.

Start a parameter optimization job in the background.

start_optimization input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "blockId",
    "paramName",
    "min",
    "max",
    "measureBlockId"
  ],
  "properties": {
    "max": {
      "type": "number"
    },
    "min": {
      "type": "number"
    },
    "blockId": {
      "type": "string"
    },
    "setpoint": {
      "type": "number"
    },
    "objective": {
      "enum": [
        "iae",
        "overshoot",
        "settling_time"
      ],
      "type": "string"
    },
    "paramName": {
      "type": "string"
    },
    "maxIterations": {
      "type": "number"
    },
    "measureBlockId": {
      "type": "string"
    }
  }
}
start_optimization annotations
{
  "title": "Start background optimization",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
get_job_status — Get job status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Check the status and progress of a background job.

get_job_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "jobId"
  ],
  "properties": {
    "jobId": {
      "type": "string"
    }
  }
}
get_job_status annotations
{
  "title": "Get job status",
  "readOnlyHint": true,
  "openWorldHint": false
}
cancel_job — Cancel job
Advertised by the server during the last successful anonymous check.

Cancel a running background job.

cancel_job input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "jobId"
  ],
  "properties": {
    "jobId": {
      "type": "string"
    }
  }
}
cancel_job annotations
{
  "title": "Cancel job",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": false
}
list_jobs — List jobs
Advertised by the server during the last successful anonymous check.
Advertised read-only

List all recent background jobs and their status.

list_jobs input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
list_jobs annotations
{
  "title": "List jobs",
  "readOnlyHint": true,
  "openWorldHint": false
}
explain_simulation — Explain simulation
Advertised by the server during the last successful anonymous check.
Advertised read-only

Analyze the last completed simulation and return a structured diagnosis: signal anomalies (NaN, divergence, oscillation), solver health (rejection rate, efficiency), algebraic loops, and optional stability margins. Returns JSON with severity-tagged findings and actionable suggestions.

explain_simulation input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "stabilityMargins": {
      "type": "object",
      "required": [
        "gainMarginDb",
        "phaseMarginDeg",
        "stable"
      ],
      "properties": {
        "stable": {
          "type": "boolean"
        },
        "gainMarginDb": {
          "type": "number"
        },
        "phaseMarginDeg": {
          "type": "number"
        }
      },
      "description": "Optional pre-computed stability margins from a Bode sweep. If omitted, stability analysis is skipped."
    }
  }
}
explain_simulation annotations
{
  "title": "Explain simulation",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_bode_data — Get Bode data
Advertised by the server during the last successful anonymous check.
Advertised read-only

Computes magnitude and phase frequency response (Bode data) between two blocks. Traces path backwards from outputBlockId. Returns analytic response if the path contains only linear blocks, otherwise runs numerical sweep.

get_bode_data input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "inputBlockId",
    "outputBlockId"
  ],
  "properties": {
    "endFreq": {
      "type": "number",
      "description": "End frequency in rad/s (default: 100)"
    },
    "startFreq": {
      "type": "number",
      "description": "Start frequency in rad/s (default: 0.1)"
    },
    "inputBlockId": {
      "type": "string",
      "description": "ID of the input source block"
    },
    "outputBlockId": {
      "type": "string",
      "description": "ID of the output measurement block"
    },
    "pointsPerDecade": {
      "type": "number",
      "description": "Number of points per decade (default: 10)"
    }
  }
}
get_bode_data annotations
{
  "title": "Get Bode data",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_fft_data — Get FFT data
Advertised by the server during the last successful anonymous check.
Advertised read-only

Computes FFT (frequency spectrum) of a Scope signal. Returns frequencies and magnitudes.

get_fft_data input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "blockId"
  ],
  "properties": {
    "blockId": {
      "type": "string",
      "description": "ID of the Scope block"
    },
    "channel": {
      "type": "number",
      "description": "Channel index (default: 0)"
    }
  }
}
get_fft_data annotations
{
  "title": "Get FFT data",
  "readOnlyHint": true,
  "openWorldHint": false
}
get_engine_status — Get engine status
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns the simulation engine status, including supported solvers, active background jobs, and compilation/WASM capabilities.

get_engine_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
get_engine_status annotations
{
  "title": "Get engine status",
  "readOnlyHint": true,
  "openWorldHint": false
}
generate_code — Generate code
Advertised by the server during the last successful anonymous check.
Advertised read-only

Generates standalone production code (C++, Python, Rust) from the current canvas diagram. Returns structured code files, interfaces (inputs/outputs), execution order, and diagnostics.

generate_code input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "target": {
      "enum": [
        "all",
        "cpp",
        "python",
        "rust"
      ],
      "type": "string",
      "description": "Filter code generation to a specific target language (default: \"all\")"
    },
    "modelName": {
      "type": "string",
      "description": "Name of the generated model class/module (e.g., \"MotorController\", default: \"BlockWerkModel\")"
    },
    "sampleTime": {
      "type": "number",
      "description": "Optional custom step size in seconds (default: current canvas sampleTime)"
    },
    "encapsulateSubsystems": {
      "type": "boolean",
      "description": "Whether to generate encapsulated subsystem classes (default: false)"
    }
  }
}
generate_code annotations
{
  "title": "Generate code",
  "readOnlyHint": true,
  "openWorldHint": false
}
undo_last_ai_action — Undo last AI action
Advertised by the server during the last successful anonymous check.
Advertised destructive

Undoes the last canvas modification made by the AI (add block, connect, delete, update parameter).

undo_last_ai_action input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
undo_last_ai_action annotations
{
  "title": "Undo last AI action",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
redo_last_ai_action — Redo last AI action
Advertised by the server during the last successful anonymous check.
Advertised destructive

Redoes the last undone canvas modification.

redo_last_ai_action input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
redo_last_ai_action annotations
{
  "title": "Redo last AI action",
  "readOnlyHint": false,
  "openWorldHint": false,
  "destructiveHint": true
}
get_ai_history — Get AI action history
Advertised by the server during the last successful anonymous check.
Advertised read-only

Returns the list of recent canvas operations performed by the AI, showing what can be undone.

get_ai_history input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
get_ai_history annotations
{
  "title": "Get AI action history",
  "readOnlyHint": true,
  "openWorldHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

1 advertised

blockwerk-canvas-viewer — BlockWerk canvas

Advertised by the server during the last successful anonymous check.

Interactive BlockWerk simulation canvas shown inline in the chat.

blockwerk-canvas-viewer URI
ui://blockwerk/viewer

MIME type: text/html;profile=mcp-app

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
375 ms
95th percentile latency
375 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 375 ms · metadata changed · 42 tool(s), 1 resource(s), 0 resource template(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport http blockwerk-mcp https://blockwerk-mcp-worker.blockwerk.workers.dev/

Codex

Run this once. Codex stores MCP servers in ~/.codex/config.toml (or .codex/config.toml in a trusted project).
Codex configuration
codex mcp add blockwerk-mcp --url https://blockwerk-mcp-worker.blockwerk.workers.dev/

Cursor

Merge this server into .cursor/mcp.json in your project, then enable blockwerk-mcp in your MCP settings.
Cursor configuration
{
  "mcpServers": {
    "blockwerk-mcp": {
      "url": "https://blockwerk-mcp-worker.blockwerk.workers.dev/"
    }
  }
}

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "blockwerk-mcp": {
      "type": "streamableHttp",
      "url": "https://blockwerk-mcp-worker.blockwerk.workers.dev/",
      "disabled": false
    }
  }
}

VS Code

Merge this server into .vscode/mcp.json. Use MCP: List Servers to start blockwerk-mcp and inspect its tools.
VS Code configuration
{
  "servers": {
    "blockwerk-mcp": {
      "type": "http",
      "url": "https://blockwerk-mcp-worker.blockwerk.workers.dev/"
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport http blockwerk-mcp https://blockwerk-mcp-worker.blockwerk.workers.dev/

Claude Desktop

Merge this into claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/, Windows: %APPDATA%\Claude\), then restart Claude Desktop.
Claude Desktop configuration
{
  "mcpServers": {
    "blockwerk-mcp": {
      "url": "https://blockwerk-mcp-worker.blockwerk.workers.dev/"
    }
  }
}

Windsurf

Merge this into ~/.codeium/windsurf/mcp_config.json, then refresh MCP in Cascade. Windsurf remote servers use serverUrl, not url.
Windsurf configuration
{
  "mcpServers": {
    "blockwerk-mcp": {
      "serverUrl": "https://blockwerk-mcp-worker.blockwerk.workers.dev/"
    }
  }
}

Let your agent find its tools

Find servers like BlockWerk MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.

Do you run BlockWerk MCP?

Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.

Claim this listing