Changelog¶
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[Unreleased]¶
Removed¶
Breaking: the
crewaiextra. crewai pinschromadb ~= 1.5.9, and every chromadb release carries unfixed advisories (GHSA-36p7-vc44-83pf and GHSA-f4j7-r4q5-qw2c, critical; GHSA-xph7-9rjv-w5fr and GHSA-2wm9-hf6c-p5cr, high).as_crewai_tools()is unchanged and works with a crewai you install yourself (pip install crewai).
Security¶
The
llamaindexextra installs from Python 3.11 only and pullspillow >= 13.0.0(every earlier Pillow is advised, 5 critical); the fix needs Python 3.11, and on 3.10 it had resolved Pillow 12.3.0. The core package still supports 3.10, and on 3.10 that extra now installs nothing.The release tooling (
requirements/build.txt) floorsfilelock >= 4.2.1(GHSA-9vhv-jxww-xfm5, GHSA-567q-5qvw-pf92, GHSA-v4x8-3wr5-3wq8; it pinned 4.0.10) andcertifi >= 2026.10.19(PYSEC-2026-4320; it pinned 2026.7.22), and keepsvirtualenv >= 21.14.13(GHSA-cx6f-vjhg-g3cc). filelock 4.2.1 needs Python 3.11 and only 3.12 jobs install the tree, so it is compiled for 3.12, universally: that restores the pins (cachecontrol among them) a non-universal Dependabot recompile dropped, without whichpip install --require-hashes -r requirements/build.txtfailed.The release SBOM job points
cyclonedx-py environmentandpip-licensesat the Poetry venv (poetry env info --executable). Run throughpoetry run, they described their own interpreter, so the SBOM listed the SBOM tooling instead of the runtime set.mcp >= 1.30.0, != 2.0.*, != 2.1.*(GHSA-84m7-p3x7-pcfv), so neither affected range can resolve.crewai(optional) is declared for Python < 3.14, the range it supports. Without the marker Poetry could not resolve the project at all, which failed the release SBOM job since 0.0.19.
[0.0.20] - 2026-10-04¶
Changed¶
Standardize license section heading in README to License for Glama directory and registry matcher consistency.
Update locked dependencies to resolve transitive vulnerabilities.
[0.0.19] - 2026-10-03¶
Added¶
Agent framework adapters in
camt_exceptions.adapterswrapping all E&I tools into native tool formats for LangChain (as_langchain_tools), CrewAI (as_crewai_tools), and LlamaIndex (as_llamaindex_tools) via optional extras.Structured Tool Definition Quality Score (TDQS) descriptions across all 4 MCP tools with explicit Purpose, When to use, When NOT to use, Behavioral transparency, and parameter constraints.
Mutation testing of the tool handlers and the generator with mutmut 3, gated in CI by
scripts/mutation_gate.py(workflowmutation.yml). Tools, the prompt and the resources are now registered in one block instead of with decorators, because mutmut never mutates a decorated function; the catalogue a client sees is unchanged.Property-based tests (Hypothesis) over the logic this package owns: every generated camt.056 and camt.029 message validates against its XSD whatever the record holds, every missing required field is named, an unknown message type always yields an
{"error": ...}payload,validate_xmlnever raises and its report is internally consistent, the resources agree with the tools, and the prompt is a pure function of its argument.A 100% docstring gate (
interrogate) in the lint job.A rendered documentation site (Sphinx, furo) at https://sebastienrousseau.github.io/camt-exceptions/ with the README, the API reference, the ADRs, the roadmap and this changelog; built with warnings as errors and deployed from
main.--transport streamable-httpand--transport sse, with--hostand--port. Streamable HTTP serves both current protocol revisions (2026-07-28 stateless withserver/discover, and 2025-11-25 with theinitializehandshake) on one endpoint and streams responses as server-sent events;sseserves the older HTTP+SSE transport. stdio stays the default and is unchanged.--versionprints the version. ADR 0001 records the decision.Governance and supply-chain files at suite parity:
AGENTS.md,Makefile,DEVELOPMENT.md,.editorconfig,.pre-commit-config.yaml,ARCHITECTURE.md,GOVERNANCE.md,ROADMAP.md,MAINTAINERS.md,RELEASING.md,SUPPORT.md,CODE_OF_CONDUCT.md,CITATION.cff,DCO.txtanddocs/adr/; OpenSSF Scorecard and DCO workflows; Dependabot; every action in every workflow pinned by commit SHA.Dual-licensing standard with full Apache-2.0
LICENSE,LICENSE-APACHE,LICENSE-MIT, andLICENSES/tree.
Fixed¶
validate_xmlreports malformed input (empty, not XML, unbalanced tags) asis_valid: falsewith anot well-formed XML: ...error instead of raising. Before, the exception escaped the tool’sValueErrortranslation and reached the client as a bare error, and a string that did not start with<was handed to xmlschema as a file path to open, so the message named a path on the server.
Changed¶
The server is built through a small compatibility shim so it runs on both supported majors of the
mcpSDK: 2.x (MCPServer, the 2026-07-28 stateless revision withserver/discover) and 1.x (FastMCP). The dependency range is nowmcp>=1.2,<3, so a fresh install gets 2.x and speaks the current protocol revision.
[0.0.18] - 2026-08-29¶
Adds the scheduled release-consistency check this repository was missing, and refreshes the shared conformance gate.
Added¶
scripts/check_suite_consistency.pyand a scheduled Release Consistency workflow compare this tree against what is actually published on PyPI. A version bumped in the tree and never released breaks nothing — the tree is consistent, the tests pass, the changelog is written — and only the index disagrees. That has happened three times in this suite, each time stranding a security floor that reached nobody.The check distinguishes the two directions: a tree ahead of the index is the expected transient between merging a bump and pushing its tag, while a tree behind it means a release was cut from somewhere other than this branch.
Changed¶
Refreshed
tests/test_suite_conformance.pyto the current canonical copy. This repository was carrying a 24-invariant version; the twenty-fifth is the one that requires the check added above, so it had been conformant only against an older bar.
[0.0.17] - 2026-08-29¶
The first release since 0.0.15. 0.0.16 was bumped in the tree but never
tagged or published, so the cryptography advisory floor cut then has
never reached a dependent. This release ships it.
Also brings the repository onto the suite conformance gate: it had no
CONTRIBUTING.md, SECURITY.md, docs/, examples/ or benches/.
Fixed¶
cryptographyfloored at 50.0.0 (#9, #10), the release patching a high-severity advisory. Cut as0.0.16and never published. If you are pinned below0.0.17, upgrade.
Added¶
benches/bench_investigations.py. E&I messages are small, so there is no size axis worth sweeping — the cost is per call, which is how they arrive.About 0.25 ms per message warm, so a queue of a few thousand investigations is a background job rather than a capacity problem. Validation costs about the same as generation (0.99x), so generating and then validating pays for the schema twice. Refusal is essentially free (~0.001 ms), the work skipped rather than done and discarded.
The first message in a process costs about 205 ms against 0.32 ms for the second — a 640x difference while the XSD compiles. Measured in a fresh interpreter, because timing it in-process reports the warm number.
docs/index.md,examples/(two runnable examples),SECURITY.mdandCONTRIBUTING.md.tests/test_suite_conformance.py— invariants shared across the suite, vendored from one canonical copy and checksummed by its own test.
Documented¶
The two types do not require the same fields.
camt.029needs aconfirmation_codethatcamt.056does not. Askget_required_fieldsrather than assuming.generate_messagereturns an error dict rather than raising. A caller that does not check"error"will treat a refusal as a message. The benchmark here did exactly that on its first run — timing the rejection path for one of the two types and reporting it as throughput — which is why both the docs andSECURITY.mdnow say so.
Changed¶
CI lints, formats and runs
examples/andbenches/.
[0.0.15] - 2026-07-16¶
Undocumented at the time; reconstructed from the commit history.
Added¶
Prompts and resources, for parity across the MCP suite (#7).
glama.json, so Glama can build the server.
Fixed¶
mcpcapped below 2.0. 2.0 removedmcp.server.fastmcp, the import this server uses (#6).
Changed¶
Release workflow emits real provenance and an SBOM on publish (#5).
Licensing ships as
Apache-2.0 OR MIT(#11).
[0.0.14] - 2026-07-16¶
Changed¶
Version — suite-wide lockstep bump to
0.0.14, following the corecamt0530.0.14 release, to keep the ISO 20022 MCP suite packages on the same version. No functional changes to the library or MCP server.
[0.0.13] - 2026-07-16¶
Changed¶
Version — suite-wide lockstep bump to
0.0.13to keep the ISO 20022 MCP suite packages on the same version. No functional changes to the library or MCP server.
Added¶
Load/stress test suite (
tests/test_stress.py, markerperf, excluded from the default coverage-gated run): sustained concurrent camt.056 generation + validation (32 workers × 300 iterations, zero errors, p95/p99 latency tripwires), a tracemalloc soak loop asserting bounded memory growth, and large-batch cases (500 transactions in one message; a 250-document burst). Run withpytest tests/test_stress.py -m perf --no-cov.
[0.0.2] - 2026-07-12¶
Added¶
Initial public release:
camt.056.001.12(FI to FI Payment Cancellation Request) andcamt.029.001.14(Resolution of Investigation) generation and XSD validation, plus an MCP server exposing 4 tools over stdio.