eu-ai-act-mcp
Provides tools for verifying quotes from the EU AI Act against versioned European Union legal texts sourced from EUR-Lex/CELLAR, including citation checks, version diffs, applicability dates, and signed evidence records.
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., "@eu-ai-act-mcpverify this Article 57(1) quote as of 2026-09-01: 'operational by 2 August 2026'"
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.
EU AI Act workbench
Answers about the EU AI Act that you can check: which obligations apply to you and when, whether a document still states the law correctly, and a proof anyone can recompute.
Every result cites the provision, quotes it word for word from the text in force on your date, and says when it applies. Where the law requires a judgement, the tools say so instead of making it. Deterministic, no language model at runtime, runs in your browser or inside your AI assistant.
Status: v0.1.0 (October 2026), stable; see the changelog.
The problem
The AI Act (Regulation (EU) 2024/1689) was amended in July 2026 by the Digital Omnibus on AI (Regulation (EU) 2026/1744). Application dates moved, provisions were inserted, moved and removed. Policies, vendor answers, slide decks and language models still describe the 2024 version.
So "high-risk obligations under Annex III apply from 2 August 2026" is right for the 2024 text and wrong today: the date is 2 December 2027. In a pre-registered evaluation, three frontier models without tools gave the old answer on almost every question the amendment changed.
Related MCP server: mcp-eur-lex
Three workflows
1. Which obligations apply to us, and when? (Obligations navigator)
Describe your organisation and AI system in a few fields: role (provider, deployer, importer, …), Annex III area or Annex I product, general-purpose model, transparency cases, company size. You get the obligations that apply now and the ones coming, each with provision, verbatim quote, date and days left, plus open questions where the answer depends on facts or a legal judgement.
// aiact_obligations({ profile: { role: ["provider"], annex_iii_area: "4", annex_iii_art6_3_exception_concluded: false, enterprise_size: "sme" },
// as_of: "2026-10-05" }) -> 30 obligations, high-risk via Annex III
{ "id": "risk-management-system", "status": "upcoming", "applies_from": "2027-12-02", "days_until": 423,
"provisions": ["Article 9"], "quote_verified": true, "changed_by_omnibus": true },
{ "id": "conformity-assessment-annex-iii-internal", "applies_from": "2027-12-02",
"applies_from_literal": "2026-08-02", // Art. 113 literally leaves Chapter III Section 5 at the general date
"deadline_caveat": "Literally, the residual rule of Art. 113 second paragraph (2026-08-02) applies …" },
{ "id": "ai-literacy", "status": "applicable", "applies_from": "2025-02-02", "changed_by_omnibus": true }The map behind it covers 95 obligations, reliefs and transitional rules for providers, deployers, importers, distributors and authorised representatives. All 106 quotations are checked against the corpus on every build. The classification (Article 6(1) and 6(2), the Article 6(3) exception and its profiling override, Annex I Section A vs. B, systemic-risk GPAI, open-source exemptions) is explicit, versioned data, not code.
2. Is this document still right? (Document checker)
Paste a policy, a vendor's answer, a slide or a chatbot answer. The checker finds references, dates and quotations and compares them with the text in force on your date.
Our hiring assistant is high-risk under Annex III; the obligations apply from 2 August 2026.
Under Article 10(5) we may process special categories of personal data to detect bias.
error outdated deadline "2 August 2026" -> 2 December 2027 (changed by Regulation (EU) 2026/1744)
error removed provision "Article 10(5)" -> the text moved to Article 4a(1)It knows deadlines written into provisions (Article 57(1): sandboxes "operational by 2 August 2027") as well as application dates from Article 113, recognises EN and DE citation styles, skips other acts (GDPR, Data Act, …), and checks quotations word for word. 5,000 words take well under a second.
3. Can I prove what the text said? (Evidence records)
One check, packed into a link: the quotation, the version, the date and the result, hash-sealed and tied to a signed corpus release. The verify page recomputes it in the browser. No server, no account, no trust in the author required.
→ Open the example evidence record: a quote from Article 9(2), checked as of 1 September 2026. The wording is exact, but the provision does not apply yet.
Use it
In the browser: Obligations navigator · Document checker · Verify a record. Your text stays in your browser; the pages check the signature of the corpus release before using it.
From your AI assistant (MCP): six read-only tools, local over stdio, no network calls.
Tool | Answers |
| Obligations for a profile on a date, with quotes, dates, caveats and open questions |
| Outdated deadlines, moved or unknown provisions, wrong quotations in a text |
| Provisions by keyword in the version in force on a date (EN/DE) |
| A provision in the version in force on a date, with applicability and neighbouring provisions |
| Does a quotation exist, where, in which version, and does it apply on that date |
| What the 2026 amendment changed in a provision |
How it works
flowchart LR
A[EUR-Lex / CELLAR<br/>XHTML, EN + DE] --> B[Parser<br/>provision tree]
B --> C[Corpus<br/>2024 + 2026]
C --> D[Diff + deadline table<br/>Art. 113]
C --> E[Tools: navigator · checker<br/>search · get · diff · verify]
O[Obligations map<br/>95 entries, quotes checked] --> E
D --> E
C --> F[Release<br/>manifest + Ed25519]
E --> G[Evidence record<br/>record_hash]
F --> H[Verify page<br/>recomputes in browser]
G --> HA verification gives three separate answers, never one combined "verified":
V0, wording: exact, fuzzy, found at another provision, found only in the other version or language, or not found. Numbers, dates and negations must match exactly.
V1, applicability: applicable on the given date, not yet applicable until a date, superseded or inserted by the 2026 amendment. Based on a deadline table written from Article 113 of each version.
V2, language: does the quote match the requested language.
Key numbers
Provisions | 1,437 operative provisions and 180 recitals (2024), 1,587 provisions (2026), per language |
Operative provisions traceable from 2024 to 2026 | 98.7 % (EN), 98.6 % (DE) |
EN/DE structural parity | 100 % |
Application-date rules (2026 version) | 7, each linked to its source sentence in Art. 113 |
Obligations map | 95 entries, 106 verbatim quotations, all checked against the corpus |
Tests | 981, including golden tests written before the implementation |
Verify page | 52 KB, no framework, no external requests |
Does it matter? A pre-registered evaluation
45 questions on deadlines and versions of the AI Act after the 2026 amendment, asked to three frontier models with and without this project's tools. Errors per question:
Model | No tools | With these MCP tools |
Claude Opus 5.5 | 24/45 | 3/30 (v1) · 2/15 (v2) |
GPT-6 Astra | 26/45 | 2/30 (v1) · 1/15 (v2) |
Gemini 3.1 Pro | 25/42 | 5/27 (v1) · 2/12 (v2) |
Without tools the models were right on what the amendment left unchanged and wrong on almost everything it changed. Opus with web search: 6/45. The pre-registered rule for that arm (at least 5 % errors, lower 95 % bound) is formally met, but not robustly: it depends on one case with a known answer-key erratum, which we report up front. Each run also exposed tool weaknesses that were then fixed (date-aware version selection; showing inserted provisions such as Article 99(6a) next to the one asked for); the fixes after v2 are not yet measured. Cases, pre-registrations, raw answers and limitations: eval/results/.
Quick start
Requires Node 20+.
Option A, no clone:
claude mcp add eu-ai-act -- npx -y github:altanziya/eu-ai-act-mcpFor other MCP clients, use command npx with arguments -y github:altanziya/eu-ai-act-mcp. The first start builds the package (about a minute); after that the server runs locally over stdio and makes no network calls.
Option B, from a clone:
git clone https://github.com/altanziya/eu-ai-act-mcp.git
cd eu-ai-act-mcp
npm ci # also builds dist/server.js
claude mcp add eu-ai-act -- node "$(pwd)/dist/server.js"Development:
npm test
npm run mcp # the server from the sources, via tsxThen ask, for example: "We sell an AI tool that ranks job applicants. Which AI Act obligations apply to us and when? Use the eu-ai-act tools." or "Check this vendor answer against the current AI Act: …"
Create your own evidence record:
npm run record -- --quote "..." --ref "Article 9(2)" --as-of 2026-09-01 --lang en \
--release aiact-corpus-2026-10-05Trust model
A record with a valid signature shows that the quoted passages read as stated in the signed corpus release, and that the check was recomputed on the page. It does not show who created the record, whether a legal claim is right, or that any system is compliant.
Signing key
71fa6df7215bb8b9, published atkeys/index.json. The private key never touches the repository or CI.The record hash is plain SHA-256 over canonical JSON and can be recomputed in three lines of Python (reference).
The consolidated text from EUR-Lex is not legally authentic. Only the Official Journal is binding. Not legal advice.
Known limitations
Articles 105 to 108 (amendments to other acts) are not fully structured.
A provision that was both moved and reworded shows as removed plus added.
Transitional rules for systems already on the market (Art. 111) are in the obligations map, not in the deadline table.
The obligations map covers duties of operators, not of authorities, the Commission or notified bodies, and covers sector-specific reliefs only for financial institutions.
The document checker reads citations, dates and quotations; it does not judge legal arguments. Relative deadlines ("two years after entry into force") are not resolved.
No lawyer has reviewed the deadline table or the obligations map yet. Two independent model reviews found and fixed errors; every entry cites its source so it can be checked.
Exactly two versions of the Act are built in: the Official Journal text and the consolidated text after the Digital Omnibus. A further amendment needs code changes, not only new data.
English and German only.
Releases are signed with a single key. A key can be revoked through the key list; there is no key rotation yet.
In German mode the obligations navigator quotes the English text.
Details in the technical reference.
Roadmap
Parser, diff and provision IDs for both versions, EN + DE
MCP tools with three-level verification
Signed releases, evidence records, browser verify page
Evaluation: pre-registered run with three frontier models, with and without these tools, extended to 45 cases (results)
Obligations navigator, document checker and search, as MCP tools and browser pages
Re-run the evaluation with the current tools, including the navigator and checker
Legal review of the obligations map
Hosted MCP endpoint
Further acts: GDPR, Data Act, Cyber Resilience Act
How this was built
This project was built with AI coding agents under my direction. I set the goal and the scope, decided at each gate what to build, what counts as done and what to publish, reviewed the results and am responsible for the errors. The agents wrote the research drafts, the specification, the tests and the code:
Each build step had a written contract and an acceptance script. The expected results (golden tests) were fixed by the orchestrating agent before the implementing agent started, and the implementing agent could not change them.
Every merge passed the acceptance script and two independent reviews in a fresh context. The reviews found real defects, such as a silently redefined metric and an incomplete verdict on the verify page, which were fixed before merge.
The legal content (deadline table, obligations map) was checked by two independent model reviews, not yet by a lawyer; every entry cites its source so it can be checked.
Repository layout
Path | Content |
| Parser, diff, tools (navigator, checker, search, verify), MCP server, release, record, browser pages |
| Raw XHTML, parsed corpus, diffs, deadline table, obligations map |
| Signed corpus releases |
| Landing page, obligations navigator, document checker, verify page (GitHub Pages) |
| Unit and golden tests |
| Full technical reference |
License
Code: Apache-2.0 (
LICENSE)Legal texts: © European Union, eur-lex.europa.eu, reuse under Commission Decision 2011/833/EU
Own data (IDs, hashes, diffs, measurements): CC BY 4.0
See NOTICE.
Built by Altan Kömek.
Available Tools
6 toolsaiact_audit_textAudit textARead-onlyIdempotent
Checks a text (policy, provider answer, slides, AI-generated answer) against the AI Act in the version in force on as_of: outdated application dates, citations of provisions that were removed or do not exist (with the place a removed provision moved to), and quotations that differ from the wording in force. Returns findings with severity, span in the text, expected and found values and sources. Deterministic, no language model. Orientation only, not legal advice; it never certifies compliance.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the text and of the messages; en (default) or de | |
| text | Yes | The text to check (any length; citations like Article 6(2), Annex III, Artikel 9 Absatz 2, dates, and quotations of six or more words next to a citation are checked) | |
| as_of | No | Reference date YYYY-MM-DD; default today. Selects the version checked. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive and closed-world, so the safety profile is covered. The description adds real value beyond that: it is deterministic with no language model, returns findings carrying severity, span, expected/found values and sources, and explicitly disclaims certification of compliance. It does not mention rate limits or text-size limits, but it is a batch read with nothing destructive to disclose.
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 core operation and scope are front-loaded in the first clause, followed by the output shape and the legal caveat. The prose is dense and every clause carries information, though the long parenthetical enumerations make single sentences heavier than necessary.
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?
With no output schema, the description carries the return-value burden and does so: it names the finding fields (severity, span, expected, found, sources). Combined with the deterministic/no-LLM note, the disclaimer, and the parameter semantics already in the schema, an agent has everything needed to call and interpret it.
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 100%, so the baseline is 3. The description still adds meaning by explaining that as_of selects the version of the Act in force and that the text may be any length, framing what the checker actually inspects. It adds marginal rather than decisive detail over the schema, so it sits just above baseline.
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?
States a specific verb and resource (checks a text against the AI Act) and enumerates the three concrete check classes: outdated application dates, citations to removed/nonexistent provisions, and altered quotations. It is clear enough to separate from siblings by scope (whole document vs. a single citation), but it never names a sibling such as aiact_verify_citation to make the boundary explicit.
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 usage by listing accepted inputs (policy, provider answer, slides, AI-generated answer) and adds a clear caveat that results are orientation only and never certify compliance. However, it gives no explicit when-to-use or when-to-prefer-an-alternative guidance relative to aiact_verify_citation or aiact_obligations, leaving routing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aiact_diffDiff provisionARead-onlyIdempotent
What happened to a provision between 32024R1689 and 02024R1689-20260727 (Omnibus, amending act 32026R1744): unchanged, changed (with word diff), added, removed, moved.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Node id or citation | |
| lang | No | en (default) or de |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false and closed-world, so the safety profile is covered. The description adds genuinely useful behavior detail the annotations cannot: the exact baseline and target versions being compared, the role of the Omnibus amending act, and that changes are reported as a word-level diff.
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?
A single dense sentence with the compared-version identifiers front-loaded and the result taxonomy trailing after the colon. Every clause carries information, though the parenthetical version identifiers make it heavier than strictly necessary.
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?
With no output schema, the description usefully names the possible return categories and flags the word-diff modality. It does not describe the shape of the diff payload or how 'moved' is represented, but for a read-only two-parameter tool this is largely sufficient.
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 100%, so 'id' (node id or citation) and the en/de 'lang' enum are already documented in the schema. The description adds no syntax, format, or defaulting detail beyond what the schema provides, so the baseline 3 applies.
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 states a specific verb (diff/what happened), a specific resource (a provision), and pins the two compared versions by their exact identifiers (32024R1689 vs 02024R1689-20260727) plus the amending act. It also enumerates the outcome space (unchanged, changed with word diff, added, removed, moved), which cleanly separates it from aiact_get_provision.
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 comparison intent strongly implies when to use it (to see version-to-version changes rather than fetch content), but there is no explicit when-to-use/when-not statement and no sibling is named as an alternative. The guidance is inferable rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aiact_get_provisionGet provisionARead-onlyIdempotent
Returns one provision of Regulation (EU) 2024/1689 by id or citation (e.g. "art_50.par_1" or "Article 50(1)"), with all descendants. as_of: reference date; without version the text in force on that date is returned (before 2026-07-27 the Official Journal version 32024R1689, after it the consolidated version 02024R1689-20260727); default today. version: 32024R1689 (Official Journal) or 02024R1689-20260727 (consolidated after the Omnibus); an explicit version wins over as_of. Recitals exist only in 32024R1689; asking for one in 02024R1689-20260727 returns found=false with a fallback. The result carries applicability: whether the provision applies on as_of (from the deadline table). The response lists neighbouring provisions (including ones inserted by the 2026 amendment, such as paragraph 6a); check them before concluding that the Act says nothing more.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Node id (art_50.par_1.a, anx_3.pt_1, rec_12, cpt_3.sct_2) or citation (Article 50(1)(a), Anhang III Nummer 1) | |
| lang | No | en (default) or de | |
| as_of | No | Reference date YYYY-MM-DD; default today. Selects the version (before 2026-07-27 the Official Journal version, after it the consolidated version) unless version is given. | |
| version | No | Corpus version; default: the version in force on as_of | |
| include_children | No | Include all descendants (default true) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare a safe read-only, idempotent profile, and the description adds genuinely new behavior: the version-selection rule tied to as_of, the recitals-only-in-OJ limitation and the found=false fallback, plus an applicability flag derived from the deadline table. This is well beyond what the annotations and schema convey.
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?
Front-loads the core purpose in the first clause and keeps every subsequent sentence informational, with no filler. It is a dense, semicolon-chained paragraph though, and the parameter mechanics could be split from the return-value notes for easier scanning.
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?
With no output schema, the description carries the return-value burden and does so: the applicability field, the neighbouring-provisions list (including amendment-inserted items like paragraph 6a), and the found=false case. An agent knows both what it gets back and how to interpret it.
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 100%, so the baseline is 3, but the description goes further by explaining the interaction between as_of and version (explicit version wins over as_of), the date that flips the default corpus, and the consequence of requesting a recital under the consolidated version. It adds real semantics on top of the schema text it partially echoes.
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?
States a specific verb and resource: returns exactly one provision by id or citation, with all descendants, and gives concrete id/citation examples. The singular, identifier-driven retrieval is naturally distinct from aiact_search, but no sibling is named, so the differentiation is implicit rather than explicit.
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?
Offers useful in-tool guidance (when to pass version vs as_of, precedence rules, and the warning to inspect neighbouring provisions before concluding nothing more exists), but never says when to reach for this tool instead of aiact_search, aiact_verify_citation, or aiact_diff. Usage relative to alternatives must be inferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aiact_obligationsObligations navigatorARead-onlyIdempotent
For a company profile, returns the applicable and upcoming obligations of the AI Act with citation, verbatim quotation, application date on as_of and notes where a legal assessment is needed. Dates follow Article 113 and the classification route (Annex III / Annex I); where the literal rule differs the entry carries applies_from_literal and a caveat. Covers the consolidated text from 2026-07-27. Deterministic, no language model. Orientation only, not legal advice; it flags legal assessments, it does not make them.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the citations; en (default) or de (quotations stay in English) | |
| as_of | No | Reference date YYYY-MM-DD, not before 2026-07-27; default today | |
| detail | No | compact (default): without summary, omnibus_note and profile_echo, quotations cut to 300 characters; full: everything | |
| profile | Yes | Company profile; `role` (array of provider|deployer|importer|distributor|authorised_representative|product_manufacturer) is required, missing flags count as false (uses_or_provides_ai_system: true), other missing fields as unknown |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent safety, and the description adds substantial non-obvious behavior: deterministic with 'no language model,' coverage of the consolidated text from 2026-07-27, dates derived from Article 113 plus the Annex I/III classification route, the applies_from_literal caveat when the literal rule diverges, and an explicit boundary that it flags but does not perform legal assessments.
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 definition is front-loaded with the core behavior in sentence one, and each subsequent sentence earns its place (classification route, caveat handling, coverage date, determinism, legal boundary). It is dense with legal/technical terms but appropriately sized with no filler.
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 a 4-parameter tool with a deeply nested profile object and no output schema, the description helpfully enumerates what the response carries (citation, verbatim quotation, application date on as_of, legal-assessment notes) and the conditional applies_from_literal field. It stops short of describing response structure or error/edge behavior in detail, but is largely complete for correct invocation.
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 100%, so the parameters and every nested profile field are already documented in the schema, establishing the baseline of 3. The description adds only light framing ('application date on as_of', the classification route affecting dates) and does not deepen the enumerated profile flags.
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 precise verb+resource+input: 'For a company profile, returns the applicable and upcoming obligations of the AI Act with citation, verbatim quotation, application date.' This is clearly distinguishable from siblings like aiact_get_provision or aiact_search, which do not take a company profile and map it to obligations.
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?
'For a company profile' implies the usage context, but the description never states when to prefer this over siblings such as aiact_get_provision or aiact_search, nor any when-not conditions. The 'Orientation only, not legal advice' line is a scope disclaimer rather than routing guidance, leaving alternatives to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aiact_searchSearch provisionsARead-onlyIdempotent
Full-text search (BM25) over the AI Act in the version in force on as_of: returns the best matching provisions with citation, heading, snippet, score and applicability on as_of (from the deadline table). Before 2026-07-27 the Official Journal version 32024R1689 is searched (with recitals), after it the consolidated version 02024R1689-20260727. Finds provisions by wording; it does not interpret them or say which one applies to a system.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | en (default) or de | |
| as_of | No | Reference date YYYY-MM-DD; default today. Selects the version searched. | |
| limit | No | Maximum number of results (default 8, at most 20) | |
| query | Yes | Search words or a phrase, in the language of lang |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint, so the safety profile is covered. The description adds genuinely non-obvious behavior: the searched corpus switches at 2026-07-27 (32024R1689 with recitals vs consolidated 02024R1689-20260727), and per-result applicability is derived from the deadline table. It does not mention pagination or ranking caveats, which keeps it below a 5.
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?
Front-loaded with the core operation and result shape, then the version-selection rule, then the negative scoping clause. Dense but every clause is load-bearing; slightly long as a single paragraph where the version-switch detail could be tighter.
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?
With no output schema, the description still enumerates the returned fields (citation, heading, snippet, score, applicability) and explains the version-dependent corpus, so an agent knows both what it gets back and why results vary by as_of. Nothing needed to call it correctly is missing.
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 100%, so the baseline is 3, and the description goes further by explaining that as_of selects the version searched and that results carry applicability on that date – semantics not conveyed by the pattern description alone. query and limit semantics are left to the 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?
States a specific verb and resource ('Full-text search (BM25) over the AI Act') plus the exact return contents, and explicitly contrasts itself with interpretation/obligation tools ('Finds provisions by wording; it does not interpret them or say which one applies to a system'). An agent can distinguish this from aiact_obligations and aiact_get_provision without opening any schema.
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?
Gives a clear usage boundary: use it to find provisions by wording, not to interpret them or determine applicability to a system. It stops short of naming the alternative sibling tool (e.g. aiact_obligations) that should be used instead for interpretation, so the routing is implied rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
aiact_verify_citationVerify citationARead-onlyIdempotent
Checks that a quotation exists in the AI Act text (V0, with pinpoint), whether it applies on as_of (V1, from a deadline table), and its language (V2). It never checks that the text supports a claim (support_checked is always false) and never certifies compliance.
| Name | Required | Description | Default |
|---|---|---|---|
| lang | No | Language of the quote; en (default) or de | |
| as_of | No | Reference date YYYY-MM-DD; default today. Before 2026-07-27 the Official Journal version is checked, after it the consolidated version. | |
| quote | Yes | The quoted wording (at least 6 words; [...] marks omissions) | |
| claimed_ref | No | Where the quote is claimed to be, e.g. Article 50(1) or art_50.par_1 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, closed-world), so the description's added value is the semantic limit disclosure: support_checked is always false and compliance is never certified. That is genuinely useful guardrail context a caller must not assume, though auth, rate limits, and the exact result shape remain undisclosed.
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?
Two dense sentences, front-loaded with the core action, and the negative guarantees are packed into a single clause with no filler. Every clause carries information.
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?
With no output schema, the description is responsible for return context, and it partially delivers by naming the V0/V1/V2 check layers and one always-false response field (support_checked). It still leaves the overall response structure (found/applicable results, per-layer outcomes) to inference, which is the main remaining gap for a verification 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 coverage is 100%, so the baseline is 3, but the description maps the parameters to check tiers — as_of drives applicability (V1), lang drives the language check (V2), and the pinpoint (claimed_ref) participation in the V0 text match. That mapping is interpretive value the schema alone does not provide.
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 names a specific verb and resource ('Checks that a quotation exists in the AI Act text') and decomposes it into three precise sub-checks (verbatim presence with pinpoint, applicability at a reference date, language). This is clearly distinguishable from retrieval/search/diff siblings, which do not verify quotations.
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?
It states what the tool does NOT do ('never checks that the text supports a claim... never certifies compliance'), which is meaningful when-not guidance for a verification tool. It does not, however, point to a sibling for the adjacent task (finding a quote via aiact_search) or give a positive 'use this when' trigger.
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.
6 tool updates
v0.1.0- First observed
aiact_audit_text - First observed
aiact_diff - First observed
aiact_get_provision - First observed
aiact_obligations - First observed
aiact_search - First observed
aiact_verify_citation
TDQS
Scored across 6 tools
Each tool has a distinct action: get, search, diff, verify, audit, obligations. The main overlap is between aiact_verify_citation (single quotation existence check) and aiact_audit_text (whole-text scan for bad citations/quotations/dates), but the descriptions explicitly bound each (verify never checks support, audit is broader). Boundaries are clear enough that misselection is unlikely.
All tools share the aiact_ prefix and read as verb or verb_noun (aiact_get_provision, aiact_verify_citation, aiact_audit_text), which is predictable. Minor deviation: aiact_diff and aiact_obligations are bare verb/noun without an explicit object, slightly breaking the verb_noun pattern but still readable and consistent in style.
Six tools is well-scoped for a domain-specific legal reference server. Each tool earns its place covering a distinct capability (retrieve, search, version-diff, cite-verify, text-audit, obligations) with no redundancy.
The surface covers retrieval, search, versioning/diff, verification, auditing, and company obligations, which is strong lifecycle coverage. Minor gaps: no explicit listing/table-of-contents or enumeration tool and no structured 'classification for a system' beyond the profile-based obligations, but agents can work around these.
Maintenance
Related MCP Connectors
Provenance-backed EU and UK legislation for AI agents, addressable to the individual provision.
Resolve, search and verify legal citations against the official sources, with provenance.
AI document intelligence: extract, summarize, claim-check, notarize, and signed action receipts.
EU compliance corpus across 8 frameworks (NIS2, DORA, AI Act, ISO 27001 + more) via MCP.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceCite-grade German legal-text infrastructure for LLM agents, providing access to federal, Länder, and EU laws with cryptographic provenance.2Apache 2.0
- AlicenseNot gradedqualityBmaintenanceEnables searching and quoting EU legislation with verifiable EUR-Lex citations, including GDPR, NIS2, DORA, and the EU AI Act.251 npmMIT
- AlicenseNot gradedqualityCmaintenanceAcquis gives your assistant exact, verifiable access to EU digital regulation. Instead of paraphrasing from training data, it returns the verbatim provision of the current consolidated version — with the full citation (act, article, paragraph, point), its in-force status, the consolidation date, and a deep link to EUR-Lex so every claim can be checked. The legal text is rendered from the signed cMIT
- AlicenseBqualityCmaintenanceEnables revision-bound source audits with exact article fingerprinting, claim-to-source mapping, quotation verification, and immutable JSON evidence reports for prepublication review.9MIT