archicad-mcp
An MCP server for automating Archicad through its built-in JSON API, with optional Tapir support, command/property discovery, and Python workflow execution.
list_instances: Scan ports 19723-19743 and return running Archicad instances with port, project, version, and Tapir availability.
get_docs: Browse, search, and retrieve full schemas for built-in Archicad and Tapir commands, even without a running Archicad instance.
get_properties: Discover element properties and GUIDs by keyword, element group, property type, measure type, or exact property lookup.
execute_script: Run async Python workflows against a selected Archicad port with top-level await, timeout control, stdout/stderr capture, and structured results.
CLI diagnostics & setup: Use commands like
setup,doctor,config, andschemas status/update/resetfor configuration and schema cache management.
Allows AI assistants to automate Archicad via Python scripting, enabling queries and complex multi-step workflows such as element property retrieval, zone area scheduling, and multi-instance project management.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@archicad-mcpgive me a room area schedule by floor"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
archicad-mcp
archicad-mcp is a local stdio MCP server for Archicad automation through Archicad's built-in JSON API, with optional Tapir commands. Its four tool categories cover instance discovery, searchable command documentation, property discovery, and multi-step Python workflows. Validated Archicad and Tapir command documentation is packaged with the server and is available without a running Archicad instance.
Quick start
Requirements
Python 3.11 or newer
An MCP client that can launch a local stdio server
Add the server to the client's MCP configuration:
{
"mcpServers": {
"archicad": {
"command": "uvx",
"args": ["archicad-mcp"]
}
}
}Save the configuration and restart or reload the client. Then call:
get_docs(command="API.GetAllElements")A successful response has the ID native:API.GetAllElements and includes the command schema. This first success requires neither Archicad nor Tapir.
Related MCP server: RevitMCPBridge2026
Tools and workflow
Tool | Purpose |
| Find running Archicad instances and their ports. |
| Browse, search, or retrieve built-in and Tapir command schemas. |
| Find element properties and property IDs. |
| Run a multi-step Python workflow against an instance. |
Use get_docs to move from discovery to exact schemas:
get_docs()
get_docs(search="create slab")
get_docs(command="API.GetAllElements")
get_docs(commands=["API.GetAllElements", "CreateSlabs"])For live work, call list_instances, inspect the needed command schemas with get_docs and property IDs with get_properties, then pass the selected port to execute_script. Live tools require Archicad, and the server and Archicad must run on the same host. Tapir is needed only for Tapir calls and get_properties; built-in Archicad capabilities remain available without it.
Script execution
execute_script accepts the body of an async Python function. It injects archicad and port, permits top-level await, and returns the value assigned to result.
Scripts run as your operating-system user and are not sandboxed; review the code before executing it.
result = await archicad.command("GetProductInfo")See Script execution for the complete authoring, result, cancellation, and safety contract.
Diagnostics and installation alternatives
Use the public console command for setup and diagnostics:
uvx archicad-mcp setupprints the client-neutral configuration without editing files.uvx archicad-mcp doctor --jsonreports package, schema, and local Archicad diagnostics.uvx archicad-mcp config --jsonprints the effective runtime configuration.uvx archicad-mcp --versionanduvx archicad-mcp --helpreport the installed version and available commands.
For a persistent installation, run:
uv tool install archicad-mcpThe installed archicad-mcp command then replaces uvx archicad-mcp in terminal commands and the MCP configuration. If live discovery fails, check that Archicad is listening on its local JSON API port in the range 19723-19743.
For migration from 0.1.x, use the public console command; live schema generation, repository submodules, and a preliminary manual schema refresh are no longer part of command discovery.
Schema updates
get_docs uses the packaged command documentation or a newer validated Tapir snapshot from the user cache. When automatic updates are enabled and the shared 24-hour interval permits, startup schedules at most one bounded, nonblocking check. Startup does not wait for it, and there is no recurring timer or daemon.
Variable | Behavior |
| Disable automatic schema checks while retaining a valid cache. |
| Disable schema-update network access while retaining a valid cache. |
Offline schema mode does not stop uvx from acquiring the package. Use archicad-mcp schemas status, archicad-mcp schemas update, and archicad-mcp schemas reset to inspect, update, or reset the cache. An older installed Tapir add-on may not implement commands in a newer active schema; built-in Archicad documentation is unaffected.
See Schema snapshots and updates for the cache, validation, update, and maintainer contracts.
Contributing and releases
See CONTRIBUTING.md for development setup and checks, report bugs with the GitHub bug form, and find release notes and artifacts on GitHub Releases.
License
Available Tools
4 toolsexecute_scriptA
Execute Python in a disposable same-account local_user worker against the selected Archicad port. This is reliability isolation only, not hostile-code isolation: scripts have ordinary local-user Python builtins and imports and can read or write files, start processes, or make destructive Archicad/Tapir changes with the user's authority. The default timeout is 300 seconds; any positive finite timeout is accepted and null disables it. Timeout or transport cancellation terminates the owned worker. Use get_docs to discover Archicad and Tapir commands.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | ||
| script | Yes | ||
| timeout_seconds | No |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | Yes | |
| result | Yes | |
| stderr | No | |
| stdout | Yes | |
| success | Yes | |
| error_code | No | |
| execution_model | No | |
| execution_time_ms | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so thoroughly. It discloses the disposable worker nature, the isolation boundary (reliability vs. hostile-code), the ability to read/write files, start processes, make destructive changes with user authority, timeout behavior (default, acceptance of finite values, null disables, cancellation termination), and points to get_docs. This is comprehensive and transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is slightly long but every sentence adds value: purpose, safety caveat, timeout semantics, and a helpful pointer to get_docs. It's front-loaded with the core action and efficiently organized, though it could be tightened by removing minor redundancy (e.g., 'any positive finite timeout is accepted' is somewhat implied by 'default timeout is 300 seconds').
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the complexity of code execution, the description covers the essential aspects: environment (local_user, disposable), capabilities and risks, timeout handling, and discovery of commands via get_docs. The presence of an output schema relives it from explaining return values. No critical information is missing for an agent to correctly invoke and handle the tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 0%, so the description must compensate. It does: 'port' is clarified as the Archicad port, 'script' is the Python code to execute, and 'timeout_seconds' is fully explained (default 300, positive finite accepted, null disables, and cancellation behavior). All three parameters gain meaning far beyond the bare schema types.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'Execute Python in a disposable same-account local_user worker against the selected Archicad port.' It identifies a specific verb (execute), resource (Python script), and target (Archicad port), distinguishing it from the sibling list/get tools that are informational.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies use cases (running Python scripts) and provides a pointer to get_docs for command discovery. However, it doesn't explicitly state when NOT to use this tool or name direct alternatives, though siblings are clearly non-execution tools. The safety warning also suggests caution, but not an explicit exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_docsA
Get documentation for Archicad commands.
USAGE: get_docs() # Overview: categories with counts get_docs(category="Element Commands") # Browse: commands in a category get_docs(search="...") # Find commands by keyword get_docs(command="CommandName") # Full schema for one command get_docs(commands=["A", "B"]) # Full schemas for multiple
DISCOVERY WORKFLOW:
get_docs() -> see categories
get_docs(category="...") -> see command names
get_docs(command="...") -> full schema
SEARCH FEATURES:
Searches across: names, descriptions, parameters, examples, notes
Element types: "wall" -> suggests GetElementsByType(elementType="Wall")
Partial match: "prop" finds property commands
Typo tolerant: "proprty" -> property commands
Multi-word: "create slab" finds CreateSlabs
Args: search: Search query (e.g., "wall", "create slab", "property") command: Exact command name for full schema commands: List of command names for full schemas category: Category name to list all commands in it
Examples: get_docs() # Overview get_docs(category="Element Commands") # Browse category get_docs(search="wall") # Commands for walls get_docs(search="create") # Creation commands get_docs(command="CreateSlabs") # Full schema for CreateSlabs
| Name | Required | Description | Default |
|---|---|---|---|
| search | No | ||
| command | No | ||
| category | No | ||
| commands | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations, so description carries full burden. It describes behavior: returns categories, commands, or full schemas, and includes search features (typo tolerance, partial match). It does not mention rate limits or authentication, but as a read-only documentation tool, these are less critical. Could be more precise about output structure, but overall transparent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with sections for usage, discovery workflow, search features, args, and examples. Front-loaded purpose. Slightly long but every section adds value; minor redundancy in examples.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers discovery workflow, search features, and all parameter use cases. Has output schema so no need to explain return format in detail. Given complexity, description is complete and self-contained.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 0%, but description compensates fully: explains each parameter's purpose, provides multiple examples, and details search features (typo tolerance, multi-word). Adds significant meaning beyond the bare schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it provides documentation for Archicad commands. The description distinguishes it from sibling tools (execute_script, get_properties, list_instances) by focusing on documentation retrieval rather than execution or property listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit usage patterns (with and without arguments) and a discovery workflow. It also describes search features. However, it does not explicitly state when not to use this tool (e.g., when needing to execute commands instead of reading docs), which would further enhance clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_propertiesA
Search and discover Archicad element properties.
Properties are attributes like area, length, volume that you query on elements. Use this to find property GUIDs needed for GetPropertyValuesOfElements.
WHEN TO USE:
"Get wall areas" → get_properties(search="area", group="Wall")
"What properties can I query on zones?" → get_properties(group="Zone")
"Find custom/user-defined properties" → get_properties(property_type="Custom")
MODES: get_properties(port) # Overview of all groups get_properties(port, search="length") # Search by keyword get_properties(port, group="Wall") # All properties for element type get_properties(port, property="Length of Reference Line") # Exact lookup
Args: port: Archicad instance port (from list_instances) search: Search property names (e.g., "area", "length", "surface") group: Filter by group/element type (e.g., "Wall", "Zone", "Geometry") property_type: Filter by type: "StaticBuiltIn", "DynamicBuiltIn", "Custom" measure_type: Filter by unit: "Length", "Area", "Volume", "Angle" property: Exact property name lookup (returns single match with GUID) limit: Max results (default 50, max 200)
Returns: Properties with GUIDs ready for GetPropertyValuesOfElements.
NOTE: For command documentation (API schemas), use get_docs instead.
| Name | Required | Description | Default |
|---|---|---|---|
| port | Yes | ||
| group | No | ||
| limit | No | ||
| search | No | ||
| property | No | ||
| measure_type | No | ||
| property_type | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full burden. It describes the search behavior, filtering modes, and return value (GUIDs for use with GetPropertyValuesOfElements). It does not mention any destructive or side effects, but it is clear that this is a read-only search operation. Missing a note about sorting or pagination beyond limit.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear sections (WHEN TO USE, MODES, Args, Returns, NOTE). It is concise, with no redundant sentences. Each part adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with 7 parameters and an output schema, the description covers usage comprehensively. It explains the purpose of parameters, the return format, and typical use cases. The note about get_docs prevents confusion. It is complete for an AI agent to use.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Given 0% schema coverage, the description adds meaning to every parameter. It explains search, group, property_type, measure_type, property, and limit with examples and default values. It also shows how to use them in combination.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: searching and discovering Archicad element properties. It uses specific verbs like 'search and discover' and explicitly distinguishes from the sibling tool 'get_docs' in the final note.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides explicit 'WHEN TO USE' examples and 'MODES' that cover various parameter combinations. It also tells when not to use (for command documentation, use get_docs).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_instancesA
Find all running Archicad instances.
Scans ports 19723-19743 for Archicad's JSON API. Returns instance info including port, project name, version. Use the 'port' value in other tools to target a specific instance.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden of disclosing behavior. It explicitly mentions the port scan range and the API, and lists the returned information. It does not mention side effects (none expected for a listing operation) or potential pitfalls, but it is transparent about how it works and what it returns.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, with the core purpose first, the mechanism second, and usage guidance third. Every sentence adds distinct value with no redundancy or filler. It is appropriately sized and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a discovery tool with zero parameters and an output schema that presumably documents the return structure, the description is complete. It tells the agent what it returns (port, project name, version) and how to use the port. There is nothing missing that an agent needs to call or use it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing to document beyond the schema. The description adds the context that the port value from the output is used elsewhere, which is helpful, but with no parameters the baseline of 4 applies. The description does not need to add parameter detail.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Find all running Archicad instances.' It also explains the scanning mechanism and the return fields, making it distinct from siblings like execute_script or get_docs, which operate on a specific instance rather than discovering them.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear guidance on how the output is used: 'Use the port value in other tools to target a specific instance.' This implicitly tells the agent when to call this tool (before other instance-specific tools) but does not explicitly state when not to use it or compare directly with siblings. It is clear enough but could be more explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.2.1- Changed
execute_script6 fields changed- changed
Input schema / properties / timeout_seconds / anyOfPrevious value: -[ - { - "type": "integer" - }, - { - "type": "null" - } -]New value: +[ + { + "type": "integer" + }, + { + "type": "number" + }, + { + "type": "null" + } +] - changed
Input schema / properties / timeout_seconds / defaultPrevious value: -nullNew value: +300 - changed
Output schema / descriptionPrevious value: -"Result of script execution."New value: +"Result of same-account local-user script execution." - added
Output schema / properties / error_codeAdded value: +{ + "anyOf": [ + { + "enum": [ + "syntax_error", + "runtime_error", + "timeout", + "worker_start", + "worker_exit", + "worker_protocol", + "result_not_json" + ], + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Error Code" +} - added
Output schema / properties / execution_modelAdded value: +{ + "const": "local_user", + "default": "local_user", + "title": "Execution Model", + "type": "string" +} - added
Output schema / properties / stderrAdded value: +{ + "default": "", + "title": "Stderr", + "type": "string" +}
- Changed
list_instances1 field changed- added
Output schema / $defs / ArchicadInstance / properties / tapir_versionAdded value: +{ + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ], + "default": null, + "title": "Tapir Version" +}
4 tool updates
v0.1.0- First observed
execute_script - First observed
get_docs - First observed
get_properties - First observed
list_instances
TDQS
Scored across 4 tools
list_instances, get_docs, get_properties, and execute_script each target a distinct concern: instance discovery, command documentation, property metadata, and script execution. The only plausible confusion is between get_docs and get_properties since both are searchable catalogs, but their descriptions explicitly separate command schemas from element property GUIDs.
Tool names generally follow a verb_noun snake_case pattern (get_docs, get_properties, execute_script), but list_instances uses a different retrieval verb ('list' instead of 'get') and 'docs' is an abbreviation. These are minor deviations rather than a broken naming convention.
With four tools, the set is lean but not thin: each tool has a distinct role, and execute_script intentionally consolidates arbitrary Archicad command execution so dozens of per-command tools aren't needed. This is a well-scoped alternative to exposing every API function as a separate MCP tool.
The set covers the full workflow: discover an instance, learn available commands, look up property GUIDs, and execute arbitrary Python against the selected instance. Because execute_script can invoke any Archicad/Tapir command, there are no obvious CRUD/lifecycle dead ends within the domain.
Maintenance
Related MCP Connectors
- ZapierOAuthcom.zapier
Hosted MCP server connecting AI assistants to 9,000+ apps and 40,000+ actions via Zapier.
MCP server that lets AI assistants use all OneSchema features exposed via the public API.
MCP server unifying ERPs, CRMs, APIs and knowledge base for Claude, ChatGPT and Gemini.
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables MCP clients like Claude to interact with Graphisoft Archicad through the Tapir add-on's JSON commands. Supports automated Archicad operations and custom tool integration for architectural design workflows.24MIT
- AlicenseNot gradedqualityAmaintenanceMCP server for Autodesk Revit (BIM) with 705+ API endpoints. Enables AI agents to create walls, place doors/windows, generate sheets, manage views, and produce construction documents via the Model Context Protocol. Uses named pipes for zero-crash Revit integration.22MIT
- AlicenseAqualityAmaintenanceA bridge allowing AI agents to control Archicad projects via dynamically generated tools from the Tapir and official Archicad JSON APIs.4102MIT
- FlicenseNot gradedqualityDmaintenanceA Model Context Protocol (MCP) server that exposes KiCad PCB design automation tools to AI assistants and other MCP clients.-