Releases: byrondelgado/mcp-archimate
Release list
v0.8.0
Every change here comes from a field report covering two models built end to end
through the tool surface (5 elements / 1 view, and 71 elements / 143
relationships / 5 views).
Breaking, twice: the file tools are now confined to allowed roots, defaulting
to your home directory; and validate_semantics, auto_layout_view and
connect_visible_relationships default to a summary-sized response. See Changed
for what moved and how to restore the previous behaviour.
Changed
-
load_model_from_file,export_model_to_fileandrender_view_to_svg_file
are confined to allowed filesystem roots. They previously accepted any path
the launching account could reach, which is ordinary for a local MCP server but
poor for one whose caller is an LLM agent acting on content it read from a
model file. Two new environment variables set the boundary —
MCP_ARCHIMATE_ALLOWED_READ_ROOTSandMCP_ARCHIMATE_ALLOWED_WRITE_ROOTS—
each taking one or more absolute paths separated by the platform path
separator, with~expanded.Unset, both default to your home directory. That keeps every documented
workflow working (the quickstarts write to~/Desktop) while putting/etc,
system locations and other users' files out of reach. If you read or write
models outside your home directory — a shared drive,/opt, a project under
/srv— set the variables or those calls will now fail.Paths are expanded and fully resolved before the check, so
..segments and
symlinks cannot escape: a symlink inside an allowed root pointing outside it
resolves to its real target and is refused. A rejected path returns
PATH_OUTSIDE_ALLOWED_ROOTSwith the resolved path, the configured roots and
the variable to change inerror.details; an unusable configuration returns
INVALID_ALLOWED_ROOTSrather than silently falling back. For reads the
boundary is checked before the existence check, so an existing file outside the
roots is indistinguishable from a missing one.This is not a sandbox — enforcement is in-process and the server still runs as
the launching account — and the home default still exposes things like
~/.ssh. Narrow the roots when that matters. (ARC-050) -
Three tools default to
detail="summary"; passdetail="full"for the old
response. Response size was the dominant cost of driving this server: on a
71-element, 143-relationship model with no views yet,validate_semantics
returned 214 issues and about 55 KB — large enough that the client spilled it
to disk rather than keep it in context — of which the repeatedcode,
severityandmessagestrings were most of the weight. The completeness
checks fire once per element and once per relationship, so they are loudest
exactly when they are least actionable: mid-build, before any view exists.validate_semanticssummary:issues_by_codemaps each code to
{count, severity, ids}, anderrorscarries the error-severity issues in
full, sois_valid: falsealways arrives with its reason. There is
deliberately noissueskey in the summary — a caller that still reads
it fails loudly rather than silently reading a shorter list.auto_layout_viewsummary: identity, properties, metadata,node_count,
connection_count, and aboundsbox giving the canvas the layout
consumed, which is what you need to place a note in free space.fulladds
the per-node geometry and connections.connect_visible_relationshipssummary: counts only. Every relationship not
drawable in the target view counts as a skip, so on a multi-view model that
id list is close to the whole relationship set and every entry is expected.
Noseverity_filterwas added: the summary already separates errors from
grouped warnings, so a build loop can readdata.errorsdirectly. (ARC-058)
-
build_quality_report(include_togaf=true)returns the findings and the
scale, not just tallies. It reported{"status": "limited", "score": 0, "advisory_findings_count": 7}— seven findings, none of them reachable, and a
score against an unstated maximum. A caller could not tell "this assessment
does not apply to your model" from "your model has seven real problems". The
block now carriesadvisory_findings,max_score,hard_failures_countand
compliance_claim, all of which were already computed. The scoring scale
(0–7;readyat zero findings,partialat 3 or more,limitedbelow) is
now documented onassess_togaf_readiness. Perdecision-015the checklist
itself is unchanged — no check was added, removed or reweighted. (ARC-059) -
auto_layout_viewreports the layer band outcome as data. Requesting
bands on a single-layer view correctly produces none, but the response said so
only by omitting a view property, so "not applicable" and "failed" looked
identical. Both response shapes now carrylayer_bands_createdand
layer_bands_reason(single_layer_view,coverage_view,not_requested,
strategy_does_not_use_bands, orengine_does_not_support_bands). This also
covers the case the property could never express: a view that previously had
bands and no longer qualifies keepsmcp:layer_bandsas an empty string.
(ARC-060)
Fixed
-
A client-supplied ID could be reused across concept types, producing an
export with a duplicate identifier. IDs were checked only against their own
concept namespace, so the same id could be given to an element, a
relationship, a view, a node and a connection at once — each step accepted.
Both writers then emitted that identifier twice in a single document: in the
exchange formatidentifieris thexs:IDthatrelationshipRefpoints at
as a requiredxs:IDREF, so the file failed schema validation; in the native
format two concepts sharing an id let anarchimateElementreference resolve
to the wrong one. Nothing caught it — the round trip through pyArchimate
succeeds because it keys concepts by the same separate namespaces, and
quality_gate="strict"checks visual, semantic and coverage issues but not id
uniqueness. IDs are now unique model-wide. A collision within one concept type
keeps its existing message; a cross-type collision names the holder in
error.details.existing_concept_kind. Behaviour change: a model that
reuses one id across concept types now errors where it previously succeeded —
but that model was already producing an invalid export. (ARC-061) -
create_viewleft a view behind when it rejected the viewpoint. The
viewpoint was validated aftermodel.add(), so a call that returned
{"status": "error"}still added the view — carrying the rejected value as
itsviewpointproperty. The natural recovery, retrying with a corrected
viewpoint, then failed withView with ID '...' already exists, leaving the
caller holding a view it did not believe it had created.update_viewhad
the same defect and was worse: it appliednameanddescriptionbefore
raising, so a failed call renamed the view. Both now validate before any
mutation, so a rejected viewpoint changes nothing and theview_idstays
free for the retry. (ARC-056)
Added
list_supported_typesnow returnsdata.viewpoints. Viewpoints were the
one string-typed enum in the API missing from the catalog the server's own
instructions tell callers to consult, so the only way to discover the
accepted values was to trigger an error. The new key publishes both accepted
namespaces separately —pyarchimate_slugs(13, from pyArchimate's
STANDARD_VIEWPOINTS) andarchi_viewpoint_ids(25, Archi's canonical ids).
They overlap in seven values without either containing the other, which is
why a short-form/long-form rule of thumb does not work:businessis a slug
only,business_process_cooperationan Archi id only, and a plausible
business_processis neither. Both the catalog and the rejection message now
read the same source, so what the server advertises cannot drift from what it
accepts. (ARC-057)
v0.7.4
Documentation only. No code or tool behaviour changed.
Fixed
- The license badge still linked to a 404 on PyPI. 0.7.3 made the README's
links absolute but missed this one, because it is a nested image-link —
[](target)— and the rewrite matched the inner image rather
than the outer target. The verification used the same faulty pattern as the
fix, so it reported clean. Re-checked with a paren-balancing scan that reads
every link target directly. (ARC-055)
v0.7.3
Documentation only. No code or tool behaviour changed.
Fixed
- Every link on the PyPI project page was broken. README.md is the PyPI
long_description, and relative markdown links resolve against the project
page rather than the repository — so[User Guide](docs/USER_GUIDE.md)became
https://pypi.org/project/mcp-archimate/docs/USER_GUIDE.mdand 404'd. That
affected all twelve navigational links, including the license badge, the whole
Documentation table and the SECURITY and CONTRIBUTING pointers. All are now
absolutegithub.comURLs, which work identically on GitHub. (ARC-055)
v0.7.2
Documentation only. No code or tool behaviour changed.
Changed
- README and User Guide no longer contradict each other on installation.
docs/USER_GUIDE.mdpredated the PyPI release and still opened with
git clone <repository-url>while the README said "nothing to clone". The
User Guide now leads withuvx mcp-archimateand treats the source checkout
as the contributor path. Both documents now describe the same four MCP clients
(Claude Code, Claude Desktop, Codex, MCP Inspector) with identical
configuration and the samearchimateserver key, so prompts stay portable
between them. (ARC-054) - The User Guide documents the security model. It was previously silent on
the filesystem trust boundary and on model content being untrusted input —
the one thing worth knowing before pointing an agent at your disk. (ARC-054)
Added
- Worked example prompts in the README, covering building a small model,
exploring an existing one, editing it, improving it, validating and exporting,
and one full end-to-end build. Editing and improving an existing model — the
common case once a model exists — had no example at all before. (ARC-054) - Troubleshooting for two things that look like faults and are not: an MCP
client showing no tools (now with a way to tell a broken server from a broken
config), and the server appearing to hang, which is correct stdio behaviour.
(ARC-054)
Fixed
- Stale references in the User Guide: the server was still described as
archimate-mcp(renamed in 0.7.1), and themcp[cli]section described
Claude Desktop install workflows that no longer exist. (ARC-054)
v0.7.1
Fixed
- The server reported the MCP SDK's version as its own.
initializereturned
serverInfoasarchimate-mcp 1.28.1— the pre-rename name, and the SDK
version rather than this package's.FastMCPaccepts noversionargument, so
the low-levelServerkeptversion=Noneand fell back topkg_version("mcp"),
meaning the reported version tracked whichever SDK release was pinned. Clients
now showmcp-archimateand the real package version. Display metadata only —
no protocol behaviour changed — but a version that follows the SDK is
misleading when diagnosing a problem against a specific release. (ARC-053)
v0.7.0
First public release. The project is now open source on GitHub and published
to PyPI as mcp-archimate, installable with uvx mcp-archimate. No tool, resource
or prompt behaviour changed in this release — the surface is the same 45 tools,
9 resources and 4 prompts as 0.6.0.
Changed
- License is now GPL-3.0-or-later (was a nominal MIT classifier with no
LICENSEfile). This is inherited, not chosen:pyArchimateis GPL-3.0-only
and is a required runtime dependency, so the combined work users run is
governed by the GPL. Using the server does not put your models under the
GPL, and the license does not reach the agent or client calling the server
across the stdio process boundary. SeeLICENSE,NOTICE, and
decision-001. (ARC-041) - Package metadata is now accurate. Real author and project URLs, keywords,
corrected classifiers, and the version single-sourced from
pyarchimate_mcp_server/__init__.pyvia[tool.hatch.version]— it is no
longer duplicated inpyproject.toml. (ARC-042) - Documentation restructured for a public audience. The README is now
install-first;docs/README.mdindexes what remains and names an owner for
each document. (ARC-043)
Added
LICENSE(full GPL-3.0 text) andNOTICE, crediting pyArchimate and
Xavier Mayeur, and recording the licenses of the other runtime dependencies.
(ARC-041)SECURITY.md— vulnerability disclosure, supported versions, and a plain
statement of the trust model: the server runs with the filesystem rights of
whoever launches it, and model content is untrusted input that can carry prompt
injection. A README "Security considerations" section covers the same ground.
(ARC-045)CONTRIBUTING.md— setup, thedev/mainbranch model, the Backlog
workflow, and how to write a decision record. (ARC-044)- Fifteen architecture decision records in
.backlog/decisions/, capturing
the load-bearing choices that were previously only prose warnings in
CLAUDE.mdor buried in task history — including why connection routing is
implemented here rather than delegated upstream, why an explicit layout call
never preserves existing positions, and why native Archi export has to repair
the connection type. (ARC-044, ARC-051) tests/test_security.py— nine adversarial tests of the untrusted-input
boundary covering XXE via inline, external and parameter entities, entity
expansion, and the same payloads throughload_model_from_file. No
vulnerability was found; the existing defences were verified rather than
assumed. (ARC-045)- Continuous integration — lint, format check, and the test suite on Python
3.10 through 3.13, plus a build and an sdist hygiene gate on every pull
request. (ARC-046) - Tag-triggered releases via PyPI Trusted Publishing, with no long-lived
credential stored anywhere. (ARC-047)
Removed
- Task Master and Windsurf tooling, and the local configuration that came
with them. Agent support is now scoped to Claude Code and Codex. The server
itself needs no API keys or environment variables. (ARC-040) - A 5 MB third-party Archi user guide PDF and a vendored snapshot of the MCP
SDK documentation, neither of which was ours to redistribute or could stay
current. (ARC-040) - Four superseded documents —
docs/SDD.md,docs/IMPLEMENTATION_PLAN.md,
docs/UPGRADE_REPORT_2026-07-24.mdanddocs/PYPI_PUBLIC_RELEASE_PLAN.md.
The SDD's glossary survives as an appendix to
docs/TECHNICAL_ARCHITECTURE.md. (ARC-043)
Fixed
- The source distribution shipped internal files. The 0.6.0 sdist was 4.8 MB
and contained.taskmaster/,.backlog/, agent configuration and the Archi
PDF.[tool.hatch.build.targets.sdist]now uses an explicit allow-list, so
anything added to the repository is excluded by default. The sdist is 199 KB
and CI fails the build if a forbidden path reappears. (ARC-042, ARC-046)
Known limitations
- No filesystem sandboxing.
load_model_from_file,export_model_to_file
andrender_view_to_svg_fileaccept any path the launching user can reach, and
exports overwrite without prompting. Configurable allowed roots are planned
(ARC-050); until then the boundary is whatever you impose from outside, such as
a container or a dedicated account. Documented inSECURITY.md.
Note on history
The git history was reset to a single root commit for the public release. The
prior commits described an earlier architecture — FastAPI routes, a Graphviz
layout engine, a different task workflow — that no longer matches the code, so
keeping them would have been more misleading than useful. The decision records
in .backlog/decisions/ are the project's memory from here. See decision-010.
(ARC-048)