fact_sim_mcp is a standalone MCP server that controls the fact_sim web app from a separate repository.
load_example(example: string)start_simulation()stop_simulation()run_benchmark(wallMs?: number)export_timeline_csv()build_share_url()get_simulation_status()get_kpi_summary()run_scenario_matrix(examples: string[], wallMs?: number)list_examples()set_simulation_mode(mode: "dt" | "event")set_playback_speed(speed?: number, fastest?: boolean)reset_simulation_clock()capture_snapshot_png(fileName?: string)export_graph_json(pretty?: boolean)import_graph_json(graphJson: string)set_simulation_time(simTimeMs: number)get_graph_overview(includeNodes?: boolean, maxNodes?: number)export_embedded_html(fileName?: string)save_timeline_csv(fileName?: string)save_graph_json(fileName?: string, pretty?: boolean)load_graph_json_file(filePath: string)run_matrix_and_save_report(examples: string[], wallMs?: number, fileName?: string)validate_graph_json(graphJson: string)save_kpi_summary_json(fileName?: string, pretty?: boolean)save_graph_overview_json(fileName?: string, includeNodes?: boolean, maxNodes?: number, pretty?: boolean)evaluate_candidate_graph(graphJson: string, wallMs?: number, objective?: "throughput" | "throughput_per_node" | "balanced")rank_candidate_graphs(candidates: string[], wallMs?: number, objective?: "throughput" | "throughput_per_node" | "balanced", topK?: number)suggest_topology_improvements(graphJson: string, maxSuggestions?: number)list_node_types()add_node(nodeType: string, title?: string, x?: number, y?: number, properties?: Record<string, unknown>)get_node_ports(nodeId: string | number)get_node_ports_by_kind(nodeId: string | number, portKind: "work" | "signal" | "carrier" | "pallet")connect_nodes_by_port_kind(fromNodeId: string | number, toNodeId: string | number, portKind: "work" | "signal" | "carrier" | "pallet", fromSlot?: number, toSlot?: number, allowDuplicate?: boolean)connect_work_ports(fromNodeId: string | number, toNodeId: string | number, fromSlot?: number, toSlot?: number, allowDuplicate?: boolean)connect_signal_ports(fromNodeId: string | number, toNodeId: string | number, fromSlot?: number, toSlot?: number, allowDuplicate?: boolean)connect_carrier_ports(fromNodeId: string | number, toNodeId: string | number, fromSlot?: number, toSlot?: number, allowDuplicate?: boolean)connect_pallet_ports(fromNodeId: string | number, toNodeId: string | number, fromSlot?: number, toSlot?: number, allowDuplicate?: boolean)update_node(nodeId: string | number, title?: string, properties?: Record<string, unknown>, mergeProperties?: boolean)connect_nodes(fromNodeId: string | number, toNodeId: string | number, fromSlot?: number, toSlot?: number, allowDuplicate?: boolean)disconnect_nodes(linkId?: number, fromNodeId?: string | number, toNodeId?: string | number, fromSlot?: number, toSlot?: number, removeAllMatches?: boolean)remove_node(nodeId: string | number)clear_graph()repair_graph_links()run_simulation_for(wallMs: number, mode?: "dt" | "event", fastest?: boolean, includeBenchmark?: boolean, benchmarkWallMs?: number)get_bottleneck_report(topN?: number, minSampleSec?: number)describe_node_type(nodeType: string)build_graph_from_blueprint(nodes: BlueprintNodeInput[], edges?: BlueprintEdgeInput[], clearExisting?: boolean, originX?: number, originY?: number, xPitch?: number, yPitch?: number)optimize_line_by_bottleneck(iterations?: number, runWallMs?: number, bottleneckTopN?: number, minSampleSec?: number, maxNodesPerIteration?: number, processReductionRatio?: number, downReductionRatio?: number, minProcessTime?: number, minDownTime?: number)set_takt_target_and_objective(taktSec: number, objectiveWeights?: { throughput?: number; taktGap?: number; cycleTime?: number; nodeCount?: number; linkCount?: number; completion?: number })validate_layout_rules(minDistance?: number, forbiddenAdjacency?: string[])run_design_of_experiments(paramGrid: DoeParamGridInput, wallMs?: number)set_random_seed(seed: number)get_random_seed()
- Node.js + TypeScript
- Local stdio transport (for VSCode/Codex)
- Exception handling (tool-level, startup-level, process-level)
- Stderr logging with request ID (
req:<id>) - Minimal dependencies (
@modelcontextprotocol/sdk,playwright,zod)
fact_sim_mcp/
src/
index.ts
fact-sim-runtime.ts
dist/ # generated by npm run build
.vscode/
mcp.json # VSCode local server definition
package.json
tsconfig.json
mcp.config.example.json # generic MCP client example
README.md
- Node.js 18+
fact_simrepository withindex.htmlavailable- Chromium for Playwright
npm install
npx playwright install chromium
npm run buildnpm startThe server targets fact_sim root in this order:
FACT_SIM_ROOTenvironment variable- sibling path
../fact_simrelative to this repository
If neither resolves to a directory containing index.html, startup fails with an explicit error.
Place fact_sim and fact_sim_mcp under the same parent directory. Then no environment variable is required.
{
"servers": {
"fact-sim-mcp": {
"command": "node",
"args": ["dist/index.js"]
}
}
}{
"mcpServers": {
"fact-sim-mcp": {
"command": "node",
"args": ["G:/マイドライブ/プログラミング/github/fact_sim_mcp/dist/index.js"]
}
}
}If repositories are not siblings, set FACT_SIM_ROOT explicitly in your MCP client config.
- Playwright startup error: run
npx playwright install chromium fact_sim root not found: setFACT_SIM_ROOTto the folder that containsindex.html- Port
8123in use: server automatically falls back to an open local port