Archicad-MCP
Server Configuration
Describes the environment variables required to run the server.
| Name | Required | Description | Default |
|---|---|---|---|
| ARCHICAD_MCP_MODE | No | Mode of operation: 'full' or 'verdicts'. Default is 'full'. | full |
| ARCHICAD_MCP_RULES_DIR | No | Directory containing YAML rule files for delivery-readiness QA. Defaults to bundled examples. | bundled examples |
| ARCHICAD_MCP_MAX_PROPERTY_ELEMENTS | No | Maximum number of elements a property fetch may span before being refused. Default is 5000. | 5000 |
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 | {
"listChanged": true
} |
| logging | {} |
| prompts | {
"listChanged": false
} |
| resources | {
"subscribe": false,
"listChanged": false
} |
| extensions | {
"io.modelcontextprotocol/ui": {}
} |
| experimental | {} |
Tools
Functions exposed to the LLM to take actions
| Name | Description |
|---|---|
| list_instancesA | List running Archicad instances: port, version, open project, Tapir add-on availability. Call this first. |
| get_model_summaryA | Aggregate element counts. by_type is always returned (cheap and safe). Set include_layer_story=true to also break down by layer and story, which reads a property across every element and is refused on very large models (can crash Archicad). Counts only, never element data. 'coverage' says what element_count spans: 'whole-plan' with the Tapir add-on, 'model-elements-only' without it (then it is NOT a project total). |
| list_rulesA | List loaded QA rules (id, type, severity, tags) and any rule-file load errors. |
| run_ruleA | Run one QA rule by id. Returns a verdict: pass/fail, failure count, failing element GUIDs. |
| audit_delivery_readinessA | Run all loaded QA rules (optionally only those tagged with 'ruleset') against the open model. Returns a scored verdict. |
| verify_ifc_export_readinessA | Run only the IFC-related QA rules to check IFC export readiness. Requires the Tapir add-on for IFC data. |
| highlight_failuresB | Highlight the elements failing a rule in the Archicad window (requires Tapir add-on). |
| create_issues_from_failuresA | Create an Archicad issue from a rule's failures and attach the failing elements (requires Tapir add-on). |
| find_elementsA | Find elements matching criteria groups. Groups combine with OR; inside a group the comparisons combine with logical_operator 'and' (default) or 'or'. Each group may restrict element types (is / is_not) and lists comparisons of {property, operator, value}; the schema enumerates the element types and the 22 operators, and each field documents its values and units. Call search_definitions to find a property's exact address. An element with no usable value matches no binary operator. Returns GUIDs, counts, how many elements had properties read, and 'coverage' ('whole-plan' with Tapir, 'model-elements-only' without: then 2D elements are invisible and 0 is not proof of absence). Property comparisons read values in the server (no API filters by property); a read spanning more than the element ceiling is refused, so narrow with element_types, story or classification first. |
| search_definitionsA | Fuzzy search over property and attribute definitions, so a caller does not need to know the exact 'Group/Name'. Matches names, groups and enum values; case- and accent-insensitive. kind: 'property', 'attribute' (layers, fills, surfaces, composites, profiles, pen tables, ...) or 'any'. alternatives: up to 6 synonyms or translations searched too (useful on non-English projects). editable_only: keep only properties whose value can be written on at least one element type; check it before set_element_data. Each property match carries 'property', the exact address find_elements, get_element_data, set_element_data and rules accept, plus value_type, measure_type (Length/Area/Volume/Angle values are in m, m2, m3, radian), collection, editable, expression_based and enum_values. Results are ranked: whole-word matches first, then word starts, then substrings; a query word under 4 letters must start a word. total_matches counts everything; pass next_offset as offset to page past limit. Reads definitions only, never property values. |
| get_element_dataA | Read type, layer, requested properties (address user properties as 'Group/Name') and optionally classifications for the given element GUIDs. |
| set_element_dataA | Write element property values. DRY-RUN BY DEFAULT: returns planned changes (current -> new) without touching the model. Pass dry_run=false to commit. A commit returns 'applied'; 'failed', Archicad's refusals grouped by code and message with a count and sample GUIDs; 'skipped' for changes not sent (property type, enum, or an element that is not editable: in another view's database than the active window's, inside a hotlinked module, or not reserved in Teamwork); and 'stopped' if a batch was refused outright after earlier batches landed. |
| edit_property_definitionsA | Edit custom property DEFINITIONS in place (not element values): name, description, group, default value or expressions, availability, enum options. DRY-RUN BY DEFAULT: returns each property's before/after and warnings; pass dry_run=false to commit. Address properties as 'Group/Name' (search_definitions) or GUID; availability entries as 'System/Code', with '/' for the item and everything below it; enum options by their text (or GUID when two options share a text). Example change: {"property": "Office/Status", "name": "Approval", "availability": {"add": ["Uniclass/Ss_25/"]}, "enum": {"rename": {"Old": "New"}, "remove": ["X"], "add": ["Y"], "order": [...]}, "default": "New"}. GUIDs are kept, so element values survive everything except removing an option (those elements show ) or availability. Needs the Tapir build with UpdateClassificationItems. |
| edit_classificationsA | Edit classification systems and items in place. DRY-RUN BY DEFAULT; pass dry_run=false to commit. Items: {"item": "System/Code", "code"?, "name"?, "description"?}. Systems: {"system": "Name", "name"?, "description"?, "source"?, "version"?, "date"? (YYYY-MM-DD)}. Items keep their GUID, so classified elements and property availability stay attached. Moving an item to another parent is not supported. |
| import_definitionsA | Import a Property Manager (kind='property') or Classification Manager (kind='classification') XML file. DRY-RUN BY DEFAULT: lists what is new and what collides with existing names, and what the conflict policy does. conflict: property append|replace|skip; classification merge|replace|skip (item_conflict replace|skip). Commit returns what was created and removed. |
| create_elementsA | Create elements (column/slab/zone/polyline/object/mesh) via Tapir. DRY-RUN BY DEFAULT: shows the exact command and payload. Pass dry_run=false to create. Other types: use execute_write_api_command. |
| create_swept_beamA | Place a Swept Beam: a sloped, curved beam with a Profile Manager profile or a rectangle, as the 'Swept Beam' library part. The path comes from source_guid (a Morph line, Polyline, Line or Arc) or from points [{x, y, z}] in metres. Flat sources take start_height (metres above the source) and slope_percent; morph lines and points keep their own heights. profile is {"attribute": ""} or {"rectangle": {"width", "height", "building_material"}} (default 0.2 x 0.2 rectangle). update_guid rewrites the path of an existing Swept Beam, keeping its GUID; its profile, offsets, flip and end cuts stay unless given, and node roll resets to 0. End cuts in degrees: cut_start_plan and cut_end_plan turn a cut counter-clockwise from square in plan (-80 to 80); cut_start_tilt and cut_end_tilt lean the top of the face out past the end (-85 to 85, 0 is square to the beam, the beam's slope there gives a vertical face). ref_line ('left face', 'centre', 'right face', looking from the first point to the last) puts that face of the beam on the path; ref_offset (metres) moves the beam that far away from it (with centre, to the right). DRY-RUN BY DEFAULT: reports nodes, arcs, the maximum deviation from the source and warnings. Pass dry_run=false to place or update. |
| move_elementsA | Move elements by a vector {x,y,z} in meters. Refuses without confirm=true. Archicad changes only elements in the database of the active window, so elements it would refuse (another view's, on a hidden layer, not reserved in Teamwork, locked, in a hotlinked module, or not found) are not sent. Returns requested; moved, counted from Archicad's per-element results; not_moved grouped by reason with the GUIDs; and active_window when anything was refused up front. |
| delete_elementsA | Delete elements. IRREVERSIBLE. Refuses without confirm=true. Archicad deletes only elements in the database of the active window and still answers success for the rest (a floor-plan label cannot be deleted while a Layout is active), so elements it would refuse (another view's, on a hidden layer, not reserved in Teamwork, locked, in a hotlinked module, or not found) are not sent, and the rest are read back afterwards. Returns requested; deleted, the count that is really gone; not_deleted grouped by reason with the GUIDs; active_window when anything was refused up front; and stopped if the delete command itself errored. |
| get_selectionA | Return the GUIDs of the elements currently selected in Archicad, and 'coverage': 'whole-plan' when read through the Tapir add-on, 'model-elements-only' without it (then selected markers, 2D elements and native MEP routes are left out, and an empty list is not proof that nothing is selected). |
| set_selectionA | Replace the current selection with the given element GUIDs. Whatever the user had selected by hand is deselected. |
| clear_selectionB | Deselect everything in the Archicad window. |
| reserve_elementsA | Reserve elements in a Teamwork project so you can edit them (Tapir). CONFIRM-GATED: without confirm=true it only reports what it can learn without touching the server: not_found, already_mine, and would_attempt. Whether another user holds an element is only learned by attempting, because Archicad exposes no read for it. With confirm=true returns reserved, reserved_by_others (with the user's name), already_mine, not_found, and indirectly_reserved: elements Archicad pulled into your workspace that you did not ask for, such as a door's wall. A reservation is visible to every teammate and blocks their edits until released. |
| release_elementsA | Release elements from your Teamwork workspace (Tapir). CONFIRM-GATED: without confirm=true it reports would_release (the ones actually in your workspace), not_mine and not_found. With confirm=true releases them and reports released and still_mine. Unsent changes on a released element are not lost by this call; TeamworkSend is the gateway's job. |
| get_project_infoB | Project info: Archicad version, project name, stories, hotlinks, geolocation presence (Tapir enriches). |
| list_attributesA | List attribute names by type: Layer, BuildingMaterial, Composite, Surface, Profile, ZoneCategory. |
| list_issuesA | List the issues in the open project, with their ids (requires the Tapir add-on). |
| create_issueA | Create a new issue in the open project and return its id (requires the Tapir add-on). |
| add_issue_commentA | Add a text comment to an existing issue, addressed by its id (requires the Tapir add-on). |
| attach_elements_to_issueA | Attach elements to an existing issue as highlights (requires the Tapir add-on). |
| export_issues_bcfA | Export every issue in the project to a BCF file at the given path, aligned to the survey point. Overwrites the file if it exists (requires the Tapir add-on). |
| import_issues_bcfA | Import issues into the project from a BCF file, aligned to the survey point (requires the Tapir add-on). |
| publishB | Fire an Archicad publisher set by name (Tapir). |
| read_schedule_schemeA | Describe an exported Archicad schedule scheme XML: its criteria and its ordered columns, with what each column binds to. Schedules have no API, so export the scheme first via Document > Schedules > Scheme Settings > Export and pass the file path. Reads the file only, never Archicad. |
| edit_schedule_schemeA | Apply a YAML scheme spec to an exported schedule scheme XML: set the columns and their order, retarget bindings, rename the scheme. DRY-RUN BY DEFAULT: returns the before and after column lists and writes nothing until dry_run=false. Never overwrites the input; writes to 'output' or to .edited.xml beside it. Import the result via Document > Schedules > Scheme Settings > Import. Criteria are preserved, not yet editable. A spec that binds every property by GUID needs no Archicad connection and runs fully offline; a spec that binds a property by a 'Group/Name' string needs Archicad open so the name can be resolved. |
| validate_schedule_schemeA | Check an exported schedule scheme against the open project: do its property bindings still exist, and does any column caption disagree with what it is bound to. Reads property definitions only, not values, so it does not risk the property-read crash. |
| list_api_commandsA | Catalog of ALL available Archicad API commands (official JSON API + Tapir). Filter by group, or by access='read' / 'write' to see which of the two execute tools runs a given command. |
| describe_api_commandA | Full description and input schema for one API command. Call before execute_read_api_command or execute_write_api_command. |
| execute_read_api_commandA | Run one read-only Archicad API command by name and return its result. Covers the official Archicad JSON API (https://archicadapi.graphisoft.com/JSONInterfaceDocumentation/) and the Tapir add-on (https://github.com/ENZYME-APD/tapir-archicad-automation). Reads only: a command that changes the project is refused here and belongs to execute_write_api_command. Params are validated against the bundled schema where available. Prefer the dedicated tools when one exists. |
| execute_write_api_commandA | Run one Archicad API command that changes the project. Covers the official Archicad JSON API (https://archicadapi.graphisoft.com/JSONInterfaceDocumentation/) and the Tapir add-on (https://github.com/ENZYME-APD/tapir-archicad-automation). IRREVERSIBLE for many commands, and reaches DeleteElements and QuitArchicad among others. Refuses without confirm=true; the refusal echoes the command and params it would have run. Params are validated against the bundled schema where available. Prefer the dedicated tools when one exists. |
Prompts
Interactive templates invoked by user choice
| Name | Description |
|---|---|
No prompts | |
Resources
Contextual data attached and managed by the client
| Name | Description |
|---|---|
No resources | |
TDQS
Scored across 40 tools
Most tools target a clear resource+action (issues, elements, properties, selections, schedules), and descriptions explicitly steer callers to dedicated tools over the generic execute_read/write_api_command. A few boundaries blur: find_elements vs get_element_data vs get_model_summary all read elements at different granularity, create_elements vs create_swept_beam overlap, and set_element_data vs edit_property_definitions differ subtly. These are mostly resolvable from the descriptions.
Names are uniformly snake_case with a verb_noun convention (list_issues, create_issue, get_element_data, set_element_data, delete_elements). Minor variants like the single-verb 'publish' and noun-first phrasings (get_model_summary) still fit the same readable pattern.
40 tools is heavy for a single server and sits well past the 25-tool threshold. The surface spans many subdomains (issues/BCF, QA rules, elements, properties, schedules, Teamwork, raw API), so some breadth is justified, but the count is high enough to burden selection.
The set covers full lifecycles: element create/read/update/delete/select, property value and definition editing, issues with comments/BCF import-export, schedules, Teamwork reserve/release, and QA rules. The execute_read/write_api_command escape hatches close any remaining gaps.