Koskamo

Structomat MCP

An official MCP server for Structomat, an AI engineering agent for structural steel. It allows agents to query company information, list services, find examples, get connection details, estimate portal frame steel tonnage, perform 3D finite-element frame analysis, and draft project request emails.

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.

Structomat MCP logo, by StructomatVendor evidenceStreamable HTTPNo sign-inEndpoint checked 2026-11-01Operated by Structomat
MCP endpoint (Streamable HTTP)
https://structomat.com/mcp/
Vendor documentation

What you can do with it

  • Perform 3D finite-element frame analysis of a template or JSON model
  • Estimate steel tonnage for a portal frame building up to 30 m span
  • Query company information and available services
  • Draft a project request email for user review

Source and maintenance

Vendor evidenceRegistry 1.4.4

Protocol and capabilities

Server
structomat 1.4.4
MCP protocol
2025-06-18
Tools
7 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
Not advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": false
  }
}

Server-provided instructions

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

Structomat is an AI engineering agent for structural steel: structural (static) analysis and design, connection design, calculation reports and shop drawings, reviewed and signed by a licensed partner engineer for construction. Use about_structomat for facts, find_examples for evidence from published work, estimate_portal_frame_steel for a quick steel tonnage of a portal frame building, analyze_frame to run a 3D finite-element frame analysis and get the numbers (deflections, sway, reactions, member forces, periods) with a link that shows them in 3D, and draft_project_request to prepare an e-mail the user sends. Nothing is stored.

Tools

7 advertised

about_structomat — About Structomat
Advertised by the server during the last successful anonymous check.
Advertised read-only

Facts about Structomat, an AI engineering agent for structural steel: what it does, design codes, who signs designs for construction, what to send, what comes back, how to start. Use when the user asks about Structomat or how to engage it.

about_structomat input schema
{
  "type": "object",
  "properties": {},
  "additionalProperties": false
}
about_structomat annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
list_services — List services
Advertised by the server during the last successful anonymous check.
Advertised read-only

Structomat services (analysis & design, connection design, shop drawings, erectability check of a steel model before erection, automation consulting, custom tools) with what the client sends and what comes back.

list_services input schema
{
  "type": "object",
  "properties": {
    "service": {
      "enum": [
        "analysis",
        "connections",
        "drawings",
        "erectability",
        "automation",
        "tools"
      ],
      "type": "string",
      "description": "Optional: one service only."
    }
  },
  "additionalProperties": false
}
list_services annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
find_examples — Find examples of past work
Advertised by the server during the last successful anonymous check.
Advertised read-only

Search Structomat's published work: steel projects, case studies, example situations, checked steel connections, measured benchmarks (e.g. scan-to-BIM from a point cloud), sample deliverables (e.g. a complete US AISC shop drawing submittal with a clouded revision, or an erectability check that finds the pieces of a clash-free model that cannot get into place during erection) and free tools. Returns titles, links and short summaries.

find_examples input schema
{
  "type": "object",
  "properties": {
    "type": {
      "enum": [
        "project",
        "case_study",
        "use_case",
        "connection",
        "benchmark",
        "sample",
        "tool"
      ],
      "type": "string",
      "description": "Optional filter."
    },
    "limit": {
      "type": "integer",
      "maximum": 20,
      "minimum": 1,
      "description": "Default 8."
    },
    "query": {
      "type": "string",
      "description": "What to look for, e.g. \"canopy\", \"mezzanine\", \"base plate\", \"HEB 600\", \"crane\", \"point cloud\"."
    }
  },
  "additionalProperties": false
}
find_examples annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
get_connection — Get a checked steel connection
Advertised by the server during the last successful anonymous check.
Advertised read-only

Details of one connection from the Structomat steel connection library: members, plates, bolts, welds, design code and the utilisation of each component. Use find_examples with type "connection" to get slugs.

get_connection input schema
{
  "type": "object",
  "required": [
    "slug"
  ],
  "properties": {
    "slug": {
      "type": "string",
      "description": "Connection slug from find_examples."
    }
  },
  "additionalProperties": false
}
get_connection annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
estimate_portal_frame_steel — Estimate the steel of a portal frame building
Advertised by the server during the last successful anonymous check.
Advertised read-only

Steel tonnage estimate for a single-span pitched portal frame building (span 15-30 m) before any design: total tonnes, kg per m2 of floor, a range, the weight by part (frames, gable posts, bracing, eave struts, purlins, side rails, plates and connections) and typical member sizes. Interpolated between complete finite-element designs and calibrated against published designs. Use for budgets, tenders and feasibility; a real design needs the actual loads and code.

estimate_portal_frame_steel input schema
{
  "type": "object",
  "required": [
    "span_m",
    "length_m",
    "eave_height_m",
    "ground_snow_kN_m2"
  ],
  "properties": {
    "span_m": {
      "type": "number",
      "maximum": 30,
      "minimum": 15,
      "description": "Clear span of the frames, m (15-30)."
    },
    "bracing": {
      "enum": [
        "tube",
        "rod"
      ],
      "type": "string",
      "description": "Optional: tube (default, tension and compression) or tension-only rods."
    },
    "length_m": {
      "type": "number",
      "maximum": 300,
      "minimum": 12,
      "description": "Building length, m. Frames are at 6 m."
    },
    "eave_height_m": {
      "type": "number",
      "maximum": 11,
      "minimum": 5,
      "description": "Eave height, m (5-11)."
    },
    "ground_snow_kN_m2": {
      "type": "number",
      "maximum": 2,
      "minimum": 0.5,
      "description": "Characteristic ground snow load sk, kN/m2 (0.5-2.0). Roof load = 0.8 sk."
    }
  },
  "additionalProperties": false
}
estimate_portal_frame_steel annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
analyze_frame — Analyze a 3D steel frame (finite elements, returns the numbers)
Advertised by the server during the last successful anonymous check.
Advertised read-only

Runs a 3D finite-element frame analysis and returns the numbers: equilibrium check, largest deflection along the members, largest joint displacement and sway in X and Y, every support reaction, the axial force, shears and moments of every member (the envelope with the governing combination when there are several), and natural periods with mass participation (modal analysis); linear or second order (P-Delta). The model is either a template (a pitched portal frame building, an open mono-pitch canopy, or a multi-storey frame, from a few dimensions, sections and loads) or a full model in JSON (nodes, members, sections, supports, loads, combinations). It is solved by the code of Structomat's free 3D frame analysis page, so the result also has a link that shows the same model and results in 3D (deflected shape, force diagrams, mode shapes). Use it to check a frame, compare sections or see how loads flow, and run it again with changed sections or loads. Elastic analysis only, not a code check: member buckling, connection design and code load combinations are not covered. Nothing is stored.

analyze_frame input schema
{
  "type": "object",
  "properties": {
    "bases": {
      "enum": [
        "fixed",
        "pinned"
      ],
      "type": "string",
      "description": "Column bases (default fixed)."
    },
    "modal": {
      "type": "boolean",
      "description": "Also run a modal analysis: natural periods, mode shapes and mass participation (default true)."
    },
    "model": {
      "type": "object",
      "description": "Instead of a template: a full model, units kN and m, Z vertical. {\"up\":\"Z\", \"nodes\":{\"N1\":[x,y,z],...}, \"members\":[{\"id\":\"M1\",\"i\":\"N1\",\"j\":\"N2\",\"sec\":\"S1\",\"rot\":0,\"pinned\":false}], \"sections\":{\"S1\":{\"A\":m2,\"Iy\":m4 weak,\"Iz\":m4 strong,\"J\":m4}}, \"supports\":{\"N1\":\"fixed\"|\"pinned\"}, \"nodeLoads\":[{\"node\":\"N2\",\"case\":\"G\"|\"Q\"|\"W\",\"F\":[Fx,Fy,Fz]}], \"memberLoads\":[{\"member\":\"M1\",\"case\":\"G\",\"dir\":\"FX\"|\"FY\"|\"FZ\",\"w\":kN_per_m}], \"combos\":[{\"name\":\"ULS1\",\"factors\":{\"G\":1.35,\"Q\":1.5}}], \"selfWeight\":true, \"analysis\":\"pdelta\"|\"linear\", \"modal\":{\"modes\":12,\"G\":1,\"Q\":0.3}}. Load cases may have any name; several combinations are solved and shown with their envelope (a single \"combo\":{...} is still accepted). Gravity loads act in -FZ. A member load may vary from w to w2 between x1 and x2 (m from the i end). \"pinned\": true releases bending at both ends, \"i\" or \"j\" at one end. The modal mass may use any load case, e.g. {\"modes\":12,\"G\":1,\"S\":0.3}. A vertical member has its web (local axis 2) along X; \"rot\":90 turns it to Y. Without \"up\":\"Z\" the older format with Y vertical is read and converted. Steel E = 210 GPa."
    },
    "bays_x": {
      "type": "integer",
      "maximum": 10,
      "minimum": 1,
      "description": "storey: bays in X."
    },
    "bays_z": {
      "type": "integer",
      "maximum": 10,
      "minimum": 1,
      "description": "storey: bays in Y (the second horizontal direction; Z is vertical)."
    },
    "frames": {
      "type": "integer",
      "maximum": 30,
      "minimum": 2,
      "description": "portal, mono: number of frames."
    },
    "span_m": {
      "type": "number",
      "maximum": 60,
      "minimum": 3,
      "description": "portal (4-60) or mono (3-30): frame span, m."
    },
    "bay_x_m": {
      "type": "number",
      "maximum": 15,
      "minimum": 2,
      "description": "storey: bay width in X, m."
    },
    "bay_z_m": {
      "type": "number",
      "maximum": 15,
      "minimum": 2,
      "description": "storey: bay width in Y, m."
    },
    "factors": {
      "type": "object",
      "properties": {
        "G": {
          "type": "number"
        },
        "Q": {
          "type": "number"
        },
        "W": {
          "type": "number"
        }
      },
      "description": "Combination factors {\"G\":1.0,\"Q\":1.0,\"W\":1.0} (default all 1.0).",
      "additionalProperties": false
    },
    "storeys": {
      "type": "integer",
      "maximum": 15,
      "minimum": 1,
      "description": "storey: number of storeys."
    },
    "analysis": {
      "enum": [
        "pdelta",
        "linear"
      ],
      "type": "string",
      "description": "Second order (default) or linear."
    },
    "template": {
      "enum": [
        "portal",
        "mono",
        "storey"
      ],
      "type": "string",
      "description": "portal = pitched portal frame building; mono = open mono-pitch canopy; storey = multi-storey frame. Omit when sending model."
    },
    "column_web": {
      "enum": [
        "x",
        "y"
      ],
      "type": "string",
      "description": "Direction of the column webs: x (default) = strong axis resists sway in X, the frame direction; y = strong axis resists sway in Y."
    },
    "dead_kN_m2": {
      "type": "number",
      "maximum": 20,
      "minimum": 0,
      "description": "Dead load on roof/floor, kN/m2 (self-weight of members is added)."
    },
    "live_kN_m2": {
      "type": "number",
      "maximum": 20,
      "minimum": 0,
      "description": "Live or snow load, kN/m2."
    },
    "wind_kN_m2": {
      "type": "number",
      "maximum": 5,
      "minimum": 0,
      "description": "portal, storey: wind pressure on the windward face (see wind_direction); mono: net wind pressure on the roof, positive upward (uplift); kN/m2."
    },
    "beam_section": {
      "enum": [
        "IPE 160",
        "IPE 180",
        "IPE 200",
        "IPE 220",
        "IPE 240",
        "IPE 270",
        "IPE 300",
        "IPE 330",
        "IPE 360",
        "IPE 400",
        "IPE 450",
        "IPE 500",
        "IPE 550",
        "IPE 600",
        "HEA 160",
        "HEA 180",
        "HEA 200",
        "HEA 220",
        "HEA 240",
        "HEA 260",
        "HEA 280",
        "HEA 300",
        "HEA 320",
        "HEA 340",
        "HEA 360",
        "HEA 400",
        "HEA 450",
        "HEA 500",
        "HEA 550",
        "HEA 600",
        "HEB 160",
        "HEB 180",
        "HEB 200",
        "HEB 220",
        "HEB 240",
        "HEB 260",
        "HEB 280",
        "HEB 300",
        "HEB 320",
        "HEB 340",
        "HEB 360",
        "HEB 400",
        "HEB 450",
        "HEB 500",
        "HEB 550",
        "HEB 600"
      ],
      "type": "string",
      "description": "Hot-rolled I-section for beams / rafters."
    },
    "low_height_m": {
      "type": "number",
      "maximum": 15,
      "minimum": 2,
      "description": "mono: height of the low side, m."
    },
    "ridge_rise_m": {
      "type": "number",
      "maximum": 10,
      "minimum": 0,
      "description": "portal: ridge rise above eave, m."
    },
    "brace_section": {
      "enum": [
        "CHS 48.3x3.2",
        "CHS 60.3x3.2",
        "CHS 76.1x3.2",
        "CHS 88.9x3.2",
        "CHS 88.9x4",
        "CHS 114.3x4",
        "CHS 139.7x5",
        "CHS 168.3x5",
        "CHS 193.7x6.3",
        "CHS 219.1x6.3",
        "SHS 60x60x3",
        "SHS 70x70x3",
        "SHS 80x80x4",
        "SHS 100x100x4",
        "SHS 100x100x5",
        "SHS 120x120x5",
        "SHS 140x140x5",
        "SHS 150x150x6",
        "SHS 160x160x6",
        "SHS 200x200x8"
      ],
      "type": "string",
      "description": "portal, mono: hollow section for the bracing (default CHS 139.7x5)."
    },
    "eave_height_m": {
      "type": "number",
      "maximum": 20,
      "minimum": 2,
      "description": "portal: eave height, m."
    },
    "high_height_m": {
      "type": "number",
      "maximum": 15,
      "minimum": 2,
      "description": "mono: height of the high side, m."
    },
    "leeward_kN_m2": {
      "type": "number",
      "maximum": 5,
      "minimum": 0,
      "description": "portal, storey: leeward suction, kN/m2 (not used for mono)."
    },
    "column_section": {
      "enum": [
        "IPE 160",
        "IPE 180",
        "IPE 200",
        "IPE 220",
        "IPE 240",
        "IPE 270",
        "IPE 300",
        "IPE 330",
        "IPE 360",
        "IPE 400",
        "IPE 450",
        "IPE 500",
        "IPE 550",
        "IPE 600",
        "HEA 160",
        "HEA 180",
        "HEA 200",
        "HEA 220",
        "HEA 240",
        "HEA 260",
        "HEA 280",
        "HEA 300",
        "HEA 320",
        "HEA 340",
        "HEA 360",
        "HEA 400",
        "HEA 450",
        "HEA 500",
        "HEA 550",
        "HEA 600",
        "HEB 160",
        "HEB 180",
        "HEB 200",
        "HEB 220",
        "HEB 240",
        "HEB 260",
        "HEB 280",
        "HEB 300",
        "HEB 320",
        "HEB 340",
        "HEB 360",
        "HEB 400",
        "HEB 450",
        "HEB 500",
        "HEB 550",
        "HEB 600"
      ],
      "type": "string",
      "description": "Hot-rolled I-section for columns."
    },
    "wind_direction": {
      "enum": [
        "x",
        "y",
        "xy"
      ],
      "type": "string",
      "description": "portal, storey: x (default) = wind on the long wall / the face at X = 0; y = wind on the gable / the face at Y = 0; xy = both together in the same combination (conservative)."
    },
    "combination_set": {
      "enum": [
        "single",
        "en",
        "asce"
      ],
      "type": "string",
      "description": "single (default) = one combination with the factors given; en = a typical EN 1990 ultimate set (expression 6.10); asce = ASCE 7 LRFD basic combinations. en and asce are solved as an envelope."
    },
    "frame_spacing_m": {
      "type": "number",
      "maximum": 15,
      "minimum": 2,
      "description": "portal, mono: frame spacing, m."
    },
    "storey_height_m": {
      "type": "number",
      "maximum": 8,
      "minimum": 2,
      "description": "storey: storey height, m."
    },
    "modal_live_share": {
      "type": "number",
      "maximum": 1,
      "minimum": 0,
      "description": "Share of the live or snow load in the modal mass, psi (default 0.3); mass = self-weight + dead + psi x live."
    }
  },
  "additionalProperties": false
}
analyze_frame annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}
draft_project_request — Draft a project request e-mail
Advertised by the server during the last successful anonymous check.
Advertised read-only

Prepare an e-mail to Structomat (info@structomat.com) describing a project, ready for the user to review and send. This tool sends nothing and stores nothing; it returns the draft text and a mailto link.

draft_project_request input schema
{
  "type": "object",
  "required": [
    "need"
  ],
  "properties": {
    "need": {
      "type": "string",
      "description": "What the user needs, e.g. \"structural analysis and calculation report for a 12 x 6 m steel canopy\"."
    },
    "deadline": {
      "type": "string",
      "description": "Optional."
    },
    "design_code": {
      "type": "string",
      "description": "Optional: Eurocode, AISC 360 or the code the project requires."
    },
    "structure_type": {
      "type": "string",
      "description": "Optional: canopy, mezzanine, warehouse, stair, connection, ..."
    },
    "available_files": {
      "type": "string",
      "description": "Optional: drawings, photos, IFC or analysis model the user can send."
    }
  },
  "additionalProperties": false
}
draft_project_request annotations
{
  "readOnlyHint": true,
  "openWorldHint": false,
  "idempotentHint": true,
  "destructiveHint": false
}

Prompts

Not advertised

No prompt definitions available.

Resources

Not advertised

No resource definitions available.

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
767 ms
95th percentile latency
767 ms

Maintenance history

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

  • · probe · passed · 767 ms · metadata changed · 7 tool(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 structomat-mcp https://structomat.com/mcp/

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 structomat-mcp --url https://structomat.com/mcp/

Cursor

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

Cline

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

VS Code

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

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 structomat-mcp https://structomat.com/mcp/

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": {
    "structomat-mcp": {
      "url": "https://structomat.com/mcp/"
    }
  }
}

Windsurf

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

Let your agent find its tools

Find servers like Structomat 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 Structomat 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