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. |
| 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. |
| move_elementsB | Move elements by a vector {x,y,z} in meters. Refuses without confirm=true. |
| delete_elementsA | Delete elements. IRREVERSIBLE. Refuses without confirm=true. |
| get_selectionA | Return the GUIDs of the elements currently selected in Archicad. |
| 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 36 tools
Most tools are scoped to distinct resources, but there is real overlap: the generic execute_read/write_api_command tools can perform many of the same operations as the dedicated read/write tools, and audit_delivery_readiness, verify_ifc_export_readiness, and run_rule all execute QA rules. Descriptions clarify the intended use, but an agent still has to choose among overlapping paths.
The set overwhelmingly follows a snake_case verb_noun pattern (get_element_data, list_issues, edit_schedule_scheme, execute_write_api_command). It is slightly inconsistent because publish is a bare verb, read_schedule_scheme uses read instead of the more common get, and a few names are multi-word phrases like create_issues_from_failures.
36 tools is well above the 25+ threshold and will be heavy for an agent to navigate in every context. The broad Archicad domain explains the variety, but the set could be consolidated: QA readiness checks, issue actions, schedule operations, and the generic API command tools all form clusters that could be trimmed or merged.
The surface covers the main Archicad workflows: element lifecycle, selections, Teamwork reservations, QA rules, issues/BCF, schedules, and a generic API escape hatch. Minor gaps exist, notably updating/closing issues and a dedicated live schedule-scheme enumerator, but the execute_* tools and existing schedule file tools provide workarounds.