Skip to main content
Glama

archicad-mcp

CI PyPI

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

  • uv

  • 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

list_instances

Find running Archicad instances and their ports.

get_docs

Browse, search, or retrieve built-in and Tapir command schemas.

get_properties

Find element properties and property IDs.

execute_script

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 setup prints the client-neutral configuration without editing files.

  • uvx archicad-mcp doctor --json reports package, schema, and local Archicad diagnostics.

  • uvx archicad-mcp config --json prints the effective runtime configuration.

  • uvx archicad-mcp --version and uvx archicad-mcp --help report the installed version and available commands.

For a persistent installation, run:

uv tool install archicad-mcp

The 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

ARCHICAD_MCP_AUTO_UPDATE=0

Disable automatic schema checks while retaining a valid cache.

ARCHICAD_MCP_OFFLINE=1

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

MIT

Available Tools

4 tools
execute_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.

ParametersJSON Schema
NameRequiredDescriptionDefault
portYes
scriptYes
timeout_secondsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
errorYes
resultYes
stderrNo
stdoutYes
successYes
error_codeNo
execution_modelNo
execution_time_msYes

TDQS

A4.7/5.0
Behavior5/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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:

  1. get_docs() -> see categories

  2. get_docs(category="...") -> see command names

  3. 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

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNo
commandNo
categoryNo
commandsNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness4/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
portYes
groupNo
limitNo
searchNo
propertyNo
measure_typeNo
property_typeNo

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A4.8/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters5/5

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.

Purpose5/5

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.

Usage Guidelines5/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

A4.5/5.0
Behavior4/5

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.

Conciseness5/5

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.

Completeness5/5

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.

Parameters4/5

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.

Purpose5/5

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.

Usage Guidelines4/5

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.

  1. 2 tool updatesv0.2.1
    • Changedexecute_script6 fields changed
      • changedInput schema / properties / timeout_seconds / anyOf
        Previous value: -[
        -  {
        -    "type": "integer"
        -  },
        -  {
        -    "type": "null"
        -  }
        -]New value: +[
        +  {
        +    "type": "integer"
        +  },
        +  {
        +    "type": "number"
        +  },
        +  {
        +    "type": "null"
        +  }
        +]
      • changedInput schema / properties / timeout_seconds / default
        Previous value: -nullNew value: +300
      • changedOutput schema / description
        Previous value: -"Result of script execution."New value: +"Result of same-account local-user script execution."
      • addedOutput schema / properties / error_code
        Added 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"
        +}
      • addedOutput schema / properties / execution_model
        Added value: +{
        +  "const": "local_user",
        +  "default": "local_user",
        +  "title": "Execution Model",
        +  "type": "string"
        +}
      • addedOutput schema / properties / stderr
        Added value: +{
        +  "default": "",
        +  "title": "Stderr",
        +  "type": "string"
        +}
    • Changedlist_instances1 field changed
      • addedOutput schema / $defs / ArchicadInstance / properties / tapir_version
        Added value: +{
        +  "anyOf": [
        +    {
        +      "type": "string"
        +    },
        +    {
        +      "type": "null"
        +    }
        +  ],
        +  "default": null,
        +  "title": "Tapir Version"
        +}
  2. 4 tool updatesv0.1.0
    • First observedexecute_script
    • First observedget_docs
    • First observedget_properties
    • First observedlist_instances

TDQS

A4.6/5.0

Scored across 4 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count5/5

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.

Completeness5/5

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

ActivityActive
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers