Model Context Protocol server for ArchiMate enterprise architecture modeling
Strong foundation with 20 well-named tools following verb_noun convention (add_element, create_view, delete_relationship). All tools have descriptions (avg 180 chars, within 10-1024 baseline). Input schemas present with type definitions and parameter descriptions. However, output schemas are documented only in docstrings, not in the JSON Schema itself, LLMs cannot parse docstring-only schemas. Tool annotations (ADDITIVE_TOOL, DESTRUCTIVE_TOOL) are present in code but not visible in the MCP schema registration. Error handling is basic (success_response/error_response pattern) without recovery guidance or error categorization. Some parameter descriptions lack format constraints (e.g., folder_path normalization rules are documented but not enforced via regex/enum).
Add a new ArchiMate element to the active model. Call `list_supported_types` to discover valid `element_type` values if you are not certain. The response `data.id` is the canonical element ID; use it as `source_id`/`target_id` when adding relationships and as `element_id` when adding view nodes.
Add multiple elements to the active model in one call. Each element item supports the same fields as `add_element`. Both short and long field names are accepted (`type` or `element_type`, `id` or `element_id`).
Add an ArchiMate element as a visual node in a view. If `x`/`y` are omitted, or the requested rectangle would overlap an existing node, the server places the node in the next free slot. Default node size is 160x80 (junctions are normalized to 32x32 by `auto_layout_view`).
Add a diagram-only note (sticky annotation) to a view. Use this to comment on a diagram — a caveat, an owner, a "retire in FY27". Do NOT create a `Grouping` element just to write a comment: that pollutes the model tree and participates in validation, while a note does not.
Add a new ArchiMate relationship between two elements. Both endpoints must already exist as elements in the active model. Use `list_supported_types` to discover valid `relationship_type`, `access_type`, and `influence_strength` values.
Output schemas documented only in docstrings, not in JSON Schema. LLMs cannot parse docstring-only schemas and cannot plan downstream tool calls or extract required fields for chaining.
Tool annotations (ADDITIVE_TOOL, DESTRUCTIVE_TOOL, IDEMPOTENT_TOOL) present in Python code but not exposed in MCP schema. Clients cannot see which tools are safe to retry or have side effects.
Error responses lack recovery guidance. No categorization of errors as retryable, user-fixable, or fatal. Agents cannot determine next steps on failure.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | C | 61 | 2026-07-28+ | v2 |
Add multiple relationships to the active model in one call. Each relationship item supports the same fields as `add_relationship`. Short and long field names are both accepted (`type` or `relationship_type`, `source` or `source_id`, `target` or `target_id`, `id` or `relationship_id`).
Create a new empty ArchiMate model and make it the active model. Replaces any currently active model. Call this (or one of the `load_model_*` tools) before any element/relationship/view tool. Use `update_model` to change this metadata later, including on a model that was loaded rather than created.
Create a new ArchiMate view (diagram) in the active model. Views are containers for visual nodes and connections. Add nodes with `add_node_to_view` and connections with `add_connection_to_view` once both endpoint elements are visible.
Delete an ArchiMate element from the active model. pyArchimate also removes dependent concepts such as relationships and visual nodes/connections referencing the deleted element.
Delete an ArchiMate relationship from the active model.
Delete an ArchiMate view from the active model. Removes the view and its visual nodes/connections. Underlying elements and relationships are NOT removed.
Serialize the active model as XML string content. Use this when the caller wants the XML in the response payload. Use `export_model_to_file` to write directly to disk.
Return the client-facing usage guide for this ArchiMate MCP server. Call this tool when you are unsure how to operate the server. It is intended to prevent source-code inspection: do not inspect the MCP server source code to learn normal usage. Use this guide, prompts, tools/list, and resources/list instead.
Load an ArchiMate model from XML string content (replaces active model). For loading large files or paths use `load_model_from_file` instead; this tool expects the actual XML payload, not a path.
Query elements in the active model with optional filters. All filters are AND-combined. Pass an empty `{}` to list every element (equivalent to the `pyarchimate://activemodel/elements` resource).
Query relationships in the active model with optional filters. All filters are AND-combined. Pass an empty `{}` to list every relationship (equivalent to the `pyarchimate://activemodel/relationships` resource).
Update an existing ArchiMate element. Updates is a dict containing only the fields to change. Other fields are left untouched. Properties are merged into existing properties (use an empty value to clear a key on subsequent updates).
Update the active model's name, documentation, and properties. Updates is a dict containing only the fields to change; other fields are left untouched and properties are merged into the existing ones. There is no `model_id` parameter because exactly one model is active. Works on a loaded model, not only on one created by this server.
Update an existing ArchiMate relationship. Endpoints (source/target) and relationship type cannot be changed. Recreate the relationship to change those.
Update an existing ArchiMate view. Only metadata fields can be updated; nodes and connections are managed by `add_node_to_view`, `add_connection_to_view`, and the layout tools.
Batch operations (add_elements, add_relationships) accept rollback_on_error but lack per-item success/failure reporting. If 1 of 50 items fails with rollback=false, agent cannot determine which items succeeded.
Parameter constraints (e.g., folder_path normalization, element_id uniqueness scope, relationship_type enum values) documented in descriptions but not enforced via JSON Schema enums or patterns. LLMs cannot discover valid values without calling list_supported_types.