Enterprise Architect MCP Server
Read-only MCP server that gives AI agents access to Sparx Enterprise Architect .qea models without a running EA instance.
Full-text search across elements, attributes, operations, constraints, and notes, with case- and diacritic-insensitive matching
Retrieve full element details: notes, attributes, operations, diagrams, constraints, and multiplicity requiredness hints
List elements within a package, optionally filtered by type
Get incoming/outgoing/both connectors with feature-link resolution
Get elements and connectors on a diagram, including implied connectors
Read use case scenario flows with steps and attributes
Navigate the package hierarchy recursively
List and filter diagrams by name, type, or package
Resolve braced GUIDs or plain names to elements, diagrams, or packages with match confidence
Inspect the underlying database schema for additional data
Report model identity, file info, and configuration source
Windowed results with completeness metadata and continuation calls for paging
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., "@Enterprise Architect MCP ServerShow me the package structure under the root"
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.
Enterprise Architect MCP Server
A read-only Model Context Protocol (MCP) server for Sparx Enterprise Architect .qea exports. Gives AI agents access to EA analysis models — search elements, navigate packages, read use case scenarios, and traverse connectors — without a running EA instance.
Works with any MCP client (VS Code / GitHub Copilot, Claude Desktop, Cursor, Windsurf). Reads the .qea SQLite export directly, never writes to it, and every response carries completeness metadata so an agent can tell a truncated answer from a complete one.
Keywords: MCP server · Sparx Enterprise Architect · .qea · UML · use case scenarios · package tree · connectors · diagrams · model search · AI agent tooling
Prerequisites
Node.js 22+ (uses the built-in
node:sqlitemodule)A
.qeafile exported from Sparx Enterprise Architect
Related MCP server: jgs-sysmlv2-api-mcp
Installation
VS Code / GitHub Copilot
The quickest route is the Install in VS Code badge at the top of this page. There is nothing to
fill in: the server asks for your .qea path the first time an agent queries the model, and
remembers the answer for next time.
To register it from a terminal instead, which is handier for scripting or a shared setup, use one CLI call:
code --add-mcp '{\"name\":\"enterprise-architect\",\"command\":\"npx\",\"args\":[\"-y\",\"enterprise-architect-mcp\"]}'The \" sequences are for the code shim, which re-parses the argument after PowerShell has
already handed it over — escaping with PowerShell's own backtick, or using --%, still arrives with
the quotes stripped. The single quotes stop PowerShell from touching the string. On bash or zsh the
plain form works instead:
code --add-mcp '{"name":"enterprise-architect","command":"npx","args":["-y","enterprise-architect-mcp"]}'To configure it by hand instead, add to your project's .vscode/mcp.json:
{
"servers": {
"enterprise-architect": {
"type": "stdio",
"command": "npx",
"args": ["-y", "enterprise-architect-mcp"]
}
}
}Nothing personal is in that file, so it can be committed as-is and each developer answers the prompt
once on their own machine. If you would rather not be asked at all, name the path up front — as a
trailing argument, in an env block, or in a gitignored .env in your workspace root:
EA_QEA_PATH=C:\EA\exports\model.qeaClaude Desktop
The same path-less configuration goes in claude_desktop_config.json (%APPDATA%\Claude\ on
Windows, ~/Library/Application Support/Claude/ on macOS):
{
"mcpServers": {
"enterprise-architect": {
"command": "npx",
"args": ["-y", "enterprise-architect-mcp"]
}
}
}Claude Desktop does not run the server from a workspace folder, so a .env there is not reliable.
If the client cannot show the path prompt at all, the server says so instead of failing silently, and
you can name the path in an env block:
"env": { "EA_QEA_PATH": "C:\\EA\\exports\\model.qea" }To run straight from source instead of npm, use "args": ["-y", "github:mm6502/enterprise-architect-mcp"].
Example Prompts
Once connected, try prompts like:
"Search for elements related to 'legal entity'"
"Show me the package structure under the root"
"What are the use case scenarios for UC_SUBMIT_APPLICATION?"
"What elements and connectors are on diagram 0103 Application Processing?"
"Resolve the reference {3F2A7C10-5B4D-4e8a-9C1F-27D6E8B0A4F3}"
"What columns does t_connector have?"
"Which diagrams does element a7680 appear on?"
Configuration
The server does not need a path to start. It looks for one when an agent first queries the model, and takes the first source that actually opens:
CLI argument —
mcp-server-ea C:\path\to\model.qeaEnvironment variable —
EA_QEA_PATH(set in anenvblock or system env).envfile —EA_QEA_PATH=...in a.envfile in the working directoryA remembered answer — whatever you last told the prompt
The prompt — the client asks, and a working answer is remembered for next time
If you would rather never see the prompt — a CI job, a shared image, or simply a preference — put
the path in a gitignored .env in the working directory. Copy the template:
Copy-Item .env.example .envThen set your local path in .env:
EA_QEA_PATH=C:\EA\exports\model.qeaIf the path points to a directory instead of a file, the server automatically picks the newest
.qea file in it by modification time — point it at your export folder and new exports are picked up
without reconfiguring anything:
EA_QEA_PATH=C:\EA\exports\The .env file is gitignored — each developer sets their own path without affecting the shared
config. It is also never committed, which is why it is the one route every new user has to set up by
hand; answering the prompt once is what makes that unnecessary.
A source naming a path that cannot be opened is skipped rather than fatal, so the next source gets
its turn. The reason goes to the server log, and once some later source opens, ea_get_model_info
lists it under skipped. That is deliberate — a sample value left in an env block would otherwise
outrank every answer you could give, and answering the prompt would never help. The cost is that a
genuine typo is demoted quietly, so check ea_get_model_info if the server opens a different model
than you expected.
Skipping is only worth it when an answer can take the skipped source's place, so two cases stay fatal: a path you passed on the command line (that is this run's explicit instruction, not a stale default), and any broken source in a client that cannot show a prompt — falling through there would quietly open some other model instead of telling you.
Answers are remembered per machine, in %APPDATA%\enterprise-architect-mcp\ on Windows,
~/Library/Application Support/enterprise-architect-mcp/ on macOS, and $XDG_CONFIG_HOME (or
~/.config) elsewhere; set EA_MCP_CONFIG_DIR to keep that file somewhere else. A path that does
not open is never remembered, so asking again is enough to correct a mistyped answer.
Available Tools
Tool | Description |
| Full-text search across elements, attributes, operations, and constraints. Takes |
| Same matching as |
| Full element detail — attributes, operations, diagrams it appears on, constraints (pre/post/invariant/process). Flags whether attribute multiplicity is contrastive. |
| List elements in a package, optionally filtered by type. Windowed: reports the total and pages with |
| Relationships for an element — includes feature-link resolution (which attribute/operation each end attaches to). |
| Elements and connectors on a diagram, including implied connectors and feature links. |
| Use case scenario steps with all attributes (trigger, uses, result, link, state) and scenario notes. A step's |
| Navigate the package hierarchy with recursive depth. |
| Search diagrams by name, type and package. Windowed like the tools above. |
| Resolve analyst references (braced GUID or plain name) to model candidates with full package path. Falls back to name-prefix matching for analyst codes; every candidate carries a |
| Introspect the model's database schema — tables, columns, indexes, rowid alias. |
| Identity of the open export — file name, size, modification date, server version, and which configuration source the path came from. |
Response contract
Every tool returns structured JSON with:
_meta.sourceTables— which database tables were consultedtotalMatched/returned/truncated— completeness metadata on every collectioncontinuation— exact call to retrieve the full set when truncatedisError: true+{ error: "not_found" }for non-existent subjects (distinct from empty results)
Two fields exist to stop an inexact answer from being read as a confirmed one:
ea_resolve—matchis always present; onlyprefixis an inexact matchea_get_element—_meta.attributes.multiplicityIsUniform: truemeans the element's attributes show no multiplicity contrast, so1..1is not evidence of requiredness
How Results Are Ordered, Paged, and Narrowed
Name ordering
Matching is locale-independent — search folds case and diacritics across European Latin alphabets,
so Straße, Łódź and Győr are found however they are typed or entity-encoded.
The enumeration tools — ea_search, ea_list_elements, ea_list_diagrams — do not order by name
at all. They order by the model's internal identity: stable and repeatable, but artificial, so
nothing should be read into which row follows which. That is a deliberate trade. Alphabetical
ordering under SQLite's binary collation sorts every accented initial after Z, and since these
tools return a window rather than the whole set, it does not merely reorder the list — it pushes
accented names out of the window entirely. Measured on a real export, names with an accented
initial filled 1.3% of visible slots under binary ordering against 3.0% under identity order, in a
model where they make up 3.9% of all names.
Only ea_get_scenarios still orders names by locale, where the whole set is always returned and no
name can be cut off. EA_LOCALE pins that ordering to a BCP 47 tag (sk, pl, hu, de, …) in
an env block or system env; unset, the host default applies. It does not affect matching.
Paging and narrowing
The enumeration tools return a window, not a sample. Each response carries totalMatched,
returned, offset and truncated, and when rows remain, a continuation naming the next call —
following it repeatedly visits every match once and terminates. Raising limit is not the way to
read a large set; advancing offset is.
When far more rows match than one window could hold, the response also carries a breakdown of how
they distribute. Its keys are parameter names and its values are argument values, so a breakdown is
a prompt to narrow — by objectType, stereotype, diagramType, or, for ea_search when the
result isn't already scoped, by packageScope (reported as the matching package's id, which the
next call can pass straight back) — rather than to page through thousands of rows.
License
Copyright (c) 2026 Michal Mracka
Licensed under the EUPL — see LICENSE for the full text.
Available Tools
12 toolsea_get_connectorsARead-only
Get all relationships (connectors) for a given element. connectors lists what the element is connected to and how (Realisation, Dependency, Association, etc.), each entry naming its source and dest ends. For Generalization connectors, source is always the specific (child) type and dest the general (parent) type — each end also carries a role making this explicit without needing to reason about direction. Filter by connectorType and direction to list an element's direct children (incoming Generalization) or direct parent(s) (outgoing Generalization) without a diagram. Feature links show which specific attribute or operation each end attaches to.
| Name | Required | Description | Default |
|---|---|---|---|
| direction | No | Filter direction: outgoing (element is source), incoming (element is target), or both | both |
| elementId | Yes | The Object_ID of the element to get connectors for | |
| connectorType | No | Filter by connector type (e.g., Realisation, Dependency, Association, InformationFlow, Generalization) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool readOnly, and the description adds meaningful behavioral detail beyond that: it explains the source/dest orientation rule for Generalization connectors, role fields that remove directional ambiguity, and feature links indicating attached attributes or operations. This materially helps an agent interpret results correctly.
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 description is compact yet dense, leading with the core action and then adding only the essential disambiguation rules. Every clause earns its place; there is no filler or repetition of schema details.
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 present, the description compensates by explaining the key output fields (source, dest, role, feature links) and the connector orientation conventions. For a read-only relationship listing with three parameters, this is sufficient for an agent to select and invoke the tool correctly.
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 parameters are already documented. The description adds value by showing how to use direction and connectorType together to achieve specific outcomes, and by clarifying Generalization source/dest semantics. It does not deeply elaborate on elementId, but the schema already defines it as Object_ID.
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 specific verb and resource: 'Get all relationships (connectors) for a given element.' It clarifies what a connector entry contains (source, dest, type) and distinguishes this tool from element/package/diagram sibling tools by focusing on relationship traversal rather than element retrieval or search.
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 gives concrete use conditions: filter by connectorType and direction to list direct children via incoming Generalization or direct parents via outgoing Generalization. It cites the 'without a diagram' context, which points to when this tool is preferred, though it does not name a specific sibling alternative to use instead.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_get_diagram_elementsARead-only
Get all elements and connectors placed on a specific diagram: the diagram itself, plus elements and connectors. elements already includes free-text Note diagram objects, which often carry a legend or abbreviation definitions an agent would otherwise miss. Connectors include feature-link resolution showing which attribute or operation each end attaches to. The connector list is the union of explicit t_diagramlinks rows and implied connectors (both ends on the diagram).
| Name | Required | Description | Default |
|---|---|---|---|
| diagramId | Yes | The Diagram_ID to get elements for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already mark this as read-only, and the description adds meaningful behavioral context: Note objects are included, connectors carry feature-link resolution, and the connector list is the union of explicit and implied connectors. This goes well beyond what the annotations alone convey, though return format details are not described.
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 description is three sentences with no fluff. It front-loads the core purpose, then adds necessary nuances about Note objects and connector resolution. Every sentence earns its place.
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?
For a single-parameter read-only tool with no output schema, the description is remarkably complete. It tells the agent exactly what the response will contain (diagram, elements, connectors), clarifies important inclusion rules, and explains connector semantics. No critical invocation or interpretation details are 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%, and the diagramId parameter is already documented as 'The Diagram_ID to get elements for.' The description reinforces that the tool targets a specific diagram, but it does not add substantial new meaning beyond 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?
The description uses a specific verb ('Get') and resource ('all elements and connectors placed on a specific diagram') and clearly distinguishes itself from siblings like ea_get_element (single element) and ea_list_elements (likely model-wide listing). It unambiguously states the scope of the tool.
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 clearly implies use when an agent needs everything on a diagram, including elements and connectors. It does not explicitly name alternatives or exclusion conditions, but the context is clear enough that an agent can select it appropriately among the sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_get_elementARead-only
Get full details of an Enterprise Architect element by its ID, including its Note, attributes, operations, the diagrams it appears on, and its constraints. Attribute multiplicity supports a requiredness inference only when the element uses multiplicities contrastively; read _meta.attributes.multiplicityIsUniform before making that inference — when it is true the element's attributes carry no multiplicity contrast, so a value like 1..1 is not evidence of requiredness. Attributes and operations are capped inline: attributesTruncated/operationsTruncated say whether the returned list is partial, and attributesTotal/operationsTotal give the full counts, so never infer a count from the inline list alone.
| Name | Required | Description | Default |
|---|---|---|---|
| elementId | Yes | The Object_ID of the element to retrieve |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the read-only annotation by exposing two non-obvious behaviors: the multiplicity inference caveat (and the _meta.multiplicityIsUniform flag) and the truncation semantics (attributesTruncated/operationsTruncated and totals). These are critical for correct interpretation and are not derivable from annotations or schema.
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 description is two sentences: the first provides the main purpose (front-loaded), the second packs essential warnings. While long, every clause carries important operational guidance (multiplicity, truncation counts). It is structured efficiently, though it could be tightened without losing meaning.
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 successfully conveys the response scope (Note, attributes, operations, diagrams, constraints) and the critical meta fields. It doesn't cover error cases or authentication, but for a read-only fetch tool these are less critical. The coverage is strong enough for an agent to call it correctly.
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?
The single parameter elementId is fully described in the schema as 'The Object_ID of the element to retrieve.' The description adds no additional parameter-level detail, so it doesn't extend beyond the schema. With 100% schema coverage, the baseline of 3 is appropriate.
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 specific verb-resource pair ('Get full details of an Enterprise Architect element by its ID') and enumerates the exact data returned (Note, attributes, operations, diagrams, constraints). This is unambiguous and clearly distinguishes it from sibling tools like ea_list_elements or ea_search, even without naming them.
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 when to use this tool—when you need full element details by ID—but it never explicitly contrasts it with siblings or states when not to use it. No exclusions or alternatives are mentioned, leaving the choice somewhat to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_get_model_infoARead-only
Report which .qea export file the server has open: fileName is the citable identity, alongside fileSizeBytes, lastModified, and the serverVersion that produced the answer. The full local path is also returned as resolvedPath, with resolvedPathNote explaining why it is environment detail rather than something to cite. configuration says where that path came from — source in words, sourceId as one of argument/environment/dotenv/remembered/prompt, and the configured value behind it — plus any skipped settings, each with the reason it could not be opened, and shadowed ones a higher-priority source outranked; configurationNote says how much of that is safe to repeat.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The readOnlyHint annotation already marks this as safe, and the description adds meaningful behavior beyond that: it explains that `resolvedPath` is environment detail rather than citable, that `resolvedPathNote` clarifies this, and that configuration sources can include skipped or shadowed entries with reasons. This gives the agent realistic expectations about sensitive or non-portable output.
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 description is a single dense, run-on sentence that front-loads the core purpose and then packs in many field-level details. Every detail is relevant, but the wall of text is harder to parse than it needs to be; breaking it into a short overview plus field list would improve scannability without losing 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 and minimal annotations, the description carries the burden of explaining return values, and it does so thoroughly: it covers the identity fields, server version, resolved path and its note, configuration source and provenance, and skipped/shadowed settings. For a zero-argument read-only status tool, nothing essential 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?
The tool has zero parameters, so the input schema fully covers the parameter surface. Per the baseline for no-parameter tools, 4 is appropriate; there is no parameter information to provide, and the description instead focuses on the output schema, which is the more important gap given no output schema exists.
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 specific verb and resource: 'Report which .qea export file the server has open.' It then enumerates the exact information returned, making its identity and scope unmistakable and clearly distinct from sibling tools that query elements, packages, or diagrams.
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 a use case—when you need to know which file the server has open or how configuration was resolved—but it never states when to use this tool versus alternatives or when not to use it. No sibling tool is named or contrasted, leaving the agent to infer placement entirely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_get_package_treeARead-only
Navigate the package hierarchy. Without parameters, returns top-level packages. With a packageId, returns that package's children up to the specified depth. Each node carries id, name, parentId, and elementCount.
| Name | Required | Description | Default |
|---|---|---|---|
| depth | No | How many levels deep to recurse (max 3, default 1) | |
| packageId | No | Package ID to get children of. Omit for top-level packages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint: true, so the description doesn't need to state safety. It adds context about the return shape (id, name, parentId, elementCount) and the depth behavior, which is useful. It doesn't disclose error cases or edge behavior, but for a read-only navigation tool with these annotations, this is sufficient.
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 sentences with no fluff. The primary purpose is front-loaded, followed by parameter-specific behavior and return structure. Every sentence carries useful information, and the description is appropriately sized for the tool's simplicity.
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?
For a simple read-only tool with no required parameters, the description is complete. It explains the output node fields, the effect of each parameter, and the default/limit for depth. There is no output schema, so the return description is essential and provided. Nothing critical is missing for an agent to call this correctly.
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% – both depth and packageId have clear descriptions. The main description echoes these semantics without adding new meaning. For instance, it repeats that packageId gets children and depth controls recursion. Since the schema already documents the parameters thoroughly, the description adds minimal extra value here.
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 clearly states the tool's function: 'Navigate the package hierarchy.' It specifies two distinct behaviors based on parameter presence (top-level vs. children) and describes the node structure, making it unambiguous what the tool does. This differentiates it from sibling tools that list elements or search, even without naming them.
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 provides clear context for when to use the tool: with no parameters for top-level packages, and with a packageId for children. It implies the tool is for hierarchy browsing, but does not explicitly exclude alternatives or name when not to use it (e.g., when searching for a specific element). The guidance is good but not exhaustive.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_get_scenariosARead-only
Get use case scenario flows for an element. scenarios holds the parsed flows; each has name, type, notes, and steps, and each step carries stepNumber plus its attributes (trigger, uses, result, state, link). Steps are numbered within each scenario. Scenarios ordered by type: Basic Path first, then Alternate, then Exception. A step's uses may name a business rule or constraint by code; that code is not independently searchable or resolvable — look it up among this same elementId's own constraints via ea_get_element, not by a separate lookup.
| Name | Required | Description | Default |
|---|---|---|---|
| elementId | Yes | The Object_ID of the element (typically a UseCase) to get scenarios for |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the operation as read-only; the description adds meaningful behavior beyond that: scenarios are parsed flows ordered by type (Basic Path first, then Alternate, then Exception), steps are numbered within each scenario, and `uses` codes are not independently searchable or resolvable. This gives the agent important runtime expectations without contradicting the annotations.
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?
Purpose is front-loaded in the first sentence, and every subsequent sentence adds necessary information about output shape, ordering, step numbering, or the constraint-lookup caveat. There is no filler and no redundant repetition of schema content.
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?
Since there is no output schema, the description takes on the burden of explaining return shape and does so well: `scenarios` contains flows with name/type/notes/steps, and each step carries stepNumber plus trigger/uses/result/state/link. It also documents ordering and the non-obvious `uses` resolution path, making the tool effectively self-contained for a single-parameter call.
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?
The input schema already provides 100% coverage for the single `elementId` parameter, describing it as the Object_ID of the element, typically a UseCase. The description reinforces that this ID selects whose scenarios to fetch but does not add new parameter-level details, so the baseline 3 is appropriate.
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 first sentence names a specific operation ('Get use case scenario flows') on a specific resource ('an element'), and the rest of the description defines what the result contains. It is clearly distinguishable from the sibling search/list tools because it is specifically about scenario flows for a UseCase element.
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 states this tool is for retrieving scenario flows for a given elementId, which directly implies its primary use. It also gives an explicit when-not/alternative: `uses` codes are not independently resolvable and should be looked up via `ea_get_element` on the same element's constraints. It does not compare against all sibling tools broadly, so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_get_schemaARead-only
List the model's database tables in tables, or pass a tableName to get that table's columns and indexes instead. That form echoes the table name and adds rowidAlias — the INTEGER PRIMARY KEY aliasing SQLite's rowid, so the fastest lookup path, or null when the table has none — with rowidNote saying which case applies. Use this to discover what data the model holds beyond what the typed ea_* tools return. See ea_get_model_info for the export's identity.
| Name | Required | Description | Default |
|---|---|---|---|
| tableName | No | Table name to inspect. Omit to list all tables with row counts. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark readOnlyHint=true, but the description adds substantial behavioral detail: it returns tables, columns, indexes, and explains the rowidAlias (INTEGER PRIMARY KEY aliasing SQLite's rowid) and its null case, plus the rowidNote. It also notes that the table form 'echoes' the table name, giving the agent a clear picture of the output beyond the annotation.
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 description is well-organized: it front-loads the dual-mode behavior, then a detailed but relevant explanation of rowidAlias/rowidNote, followed by usage guidance and a sibling reference. It is not overly verbose and each sentence adds value, though the rowid explanation could be slightly trimmed without losing meaning.
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 burden of explaining return structure. It covers the key fields (tables, columns, indexes, rowidAlias, rowidNote) and their meanings, and notes the relation to sibling tools. It is complete for an agent to understand the tool's behavior and when to invoke it, though it omits exact JSON formatting (e.g., arrays) which is minor given the explanatory depth.
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?
The schema covers the parameter (tableName) with its own description ('Omit to list all tables with row counts'), so baseline is 3. The description enriches this by explaining that providing tableName switches the output to columns and indexes and details the rowid fields, adding meaning beyond what the schema states.
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 clearly states the tool's action ('List the model's database tables') and the conditional behavior with a tableName to get columns and indexes. It differentiates from siblings by noting it reveals data beyond what the typed ea_* tools return and explicitly names ea_get_model_info for identity, so an agent knows exactly what this tool does and how it differs.
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 provides a clear when-to-use directive: 'Use this to discover what data the model holds beyond what the typed ea_* tools return.' It also points to the alternative for identity (ea_get_model_info), offering a distinct context. While it doesn't list explicit exclusions, the guidance is sufficient to route an agent correctly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_list_diagramsARead-only
List diagrams in the model, optionally filtered by package, diagram type, and/or name substring. Each entry in results carries diagramId, name, type, packagePath, and eaGuid. Diagrams are ordered by the model's internal identity — stable but artificial, neither alphabetical nor the analyst's tree order — so adjacency carries no meaning. Walk a large result set with offset rather than a larger limit; while rows remain, continuation names the next call. When far more diagrams match than one window can hold, breakdown reports how many each type holds, so the next call can narrow by diagramType instead of paging.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 50) | |
| offset | No | Zero-based index of the first result to return (default 0). Page by re-calling with the offset carried in continuation. | |
| packageId | No | Filter to diagrams in this package | |
| diagramType | No | Filter by diagram type (e.g., Logical, Use Case, Sequence, Activity, Component) | |
| nameContains | No | Filter to diagrams whose name contains this substring (case- and diacritic-insensitive across European Latin alphabets) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint and openWorldHint annotations, the description discloses that ordering is stable but artificial, that adjacency carries no meaning, that continuation names the next call, and that breakdown reports type counts. These are non-obvious behavioral details an agent needs to interpret results correctly.
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?
Four dense sentences, each earning its place: purpose+filters, result fields, ordering caveat, pagination strategy, and breakdown guidance. The most important information is front-loaded, and there is no filler or repetition of the schema.
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?
For a read-only listing tool with no output schema, the description covers the entry fields returned, ordering semantics, pagination mechanism, and a narrowing strategy for large result sets. An agent can call the tool and interpret results correctly without additional context.
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?
With 100% schema description coverage, the baseline is 3; the description adds meaning by explaining the offset/continuation paging pattern and recommending smaller batches. It also clarifies the filtering intents (package, diagram type, name substring) and the result fields tied to the call, going slightly beyond the raw 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?
The description opens with a specific verb and resource ('List diagrams in the model') and enumerates the optional filters (package, diagram type, name substring), which clearly scopes the operation. The result fields and ordering caveat further distinguish it from sibling tools like ea_list_elements or ea_search, even though no sibling is named.
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 gives practical guidance: use offset rather than larger limit for large result sets, follow continuation, and use breakdown to narrow by diagramType instead of paging. It does not explicitly compare against sibling tools such as ea_search or ea_get_diagram_elements, so the when-to-use-this-versus-alternative guidance is slightly incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_list_elementsARead-only
List elements within a package, optionally filtered by object type. elements is a lightweight list (ID, type, name, alias, stereotype), grouped by element type and then ordered by the model's internal identity. That order is stable but artificial — neither alphabetical nor the analyst's tree order — so adjacency carries no meaning. Walk a large package with offset rather than a larger limit; while rows remain, continuation names the next call. When far more elements match than one window can hold, breakdown reports how many each type holds, so the next call can narrow by objectType instead of paging.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 50) | |
| offset | No | Zero-based index of the first result to return (default 0). Page by re-calling with the offset carried in continuation. | |
| packageId | Yes | The Package_ID to list elements from | |
| objectType | No | Filter by object type (e.g., Class, UseCase, Activity, Screen) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly annotation, the description discloses that ordering is stable but artificial, that adjacency carries no meaning, and that `continuation` and `breakdown` appear as paging aids. This is valuable behavioral context that the schema and annotations alone do not provide.
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?
Three dense sentences deliver exactly the needed information: what is returned, how ordering behaves, and how to page. Nothing is redundant, and key behavioral caveats are front-loaded.
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 burden of explaining return values. It covers the element fields, grouping, ordering, pagination through `continuation`, and the `breakdown` mechanism, making the tool's contract clear enough to call confidently.
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?
Input schema coverage is 100%, so the baseline is 3. The description adds meaningful usage semantics for `offset`, `limit`, and `objectType`, explaining why one pagination strategy is preferable over another and how `breakdown` should drive narrowing.
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 and resource ('List elements within a package') and immediately clarifies the lightweight nature of the result. It also distinguishes itself from single-element retrieval and broader search by describing exact output fields and grouping.
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 provides clear usage context for pagination, explaining to use `offset` rather than a larger `limit` and to narrow by `objectType` when `breakdown` indicates many matches. It does not explicitly name alternatives among siblings, but the context is clear enough for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_resolveARead-only
Resolve an analyst reference (braced GUID or plain name) to model candidates: the input is echoed as reference and the hits are in candidates. A braced GUID is matched exactly. A plain name is matched against the full name first; only if nothing matches exactly is the reference retried as a name prefix, which resolves analyst codes like UC_ABC_2079 or OA_ABC_2280 to elements named 'CODE: description'. An exact hit is returned alone and is never diluted by prefix hits. Each candidate reports its type (element, diagram, package), id, name, fullPackagePath, eaGuid, and a match field that is always present with value "guid", "exact", or "prefix" — a "prefix" candidate is an inexact match and must not be treated as a confirmed identity. Use the optional kind filter to narrow results.
| Name | Required | Description | Default |
|---|---|---|---|
| kind | No | Filter candidates to a specific kind | |
| reference | Yes | The reference to resolve: a braced GUID like {ABC-123} or a plain name |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Although annotations indicate readOnly and closed-world behavior, the description goes far beyond that by explaining the matching algorithm in detail: exact GUID matches, name-first matching, prefix fallback, and the guarantee that exact hits are not diluted. It also warns that 'prefix' candidates are inexact and must not be treated as confirmed identities. This is rich behavioral context not available in annotations or schema.
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 description is a single dense paragraph but each sentence contributes unique value: the action, matching rules, output structure, warning about prefix, and filtering advice. It is not overly verbose, though the structure could be improved with bullets or headings. It is appropriately front-loaded with the purpose and primary behavior.
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?
Despite lacking an output schema, the description fully explains the return format: the echoed 'reference', the 'candidates' array, and each candidate's fields (type, id, name, fullPackagePath, eaGuid, match). It also clarifies the meaning of each match value and the warning about prefix matches. The matching algorithm is completely described, leaving no significant gaps for an agent to correctly invoke and interpret the result.
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?
The schema already documents both parameters, but the description adds meaningful semantic detail for the 'reference' parameter by explaining the matching rules (exact vs prefix) and how analyst codes like UC_ABC_2079 map to elements. For 'kind', it only restates the filter intent with little added value. Overall, the description enhances understanding beyond the schema, earning above the baseline 3.
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 clearly states the tool resolves an analyst reference (braced GUID or plain name) to model candidates. It specifies the verb 'resolve' and the resource 'analyst reference', and the matching behavior distinguishes it from a generic search tool. The detailed matching rules make the purpose unambiguous and differentiate it from sibling tools like ea_search.
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 provides a clear context for when this tool is appropriate: it is used to resolve references to candidates, with explicit guidance on how references are matched (exact, prefix) and a warning about inexact matches. It does not explicitly name alternatives or exclusion conditions, but the resolution-specific behavior makes the use case evident. The optional 'kind' filter is also mentioned as a way to narrow results.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_searchARead-only
Search Enterprise Architect model elements by name, alias, notes, attribute names/notes, operation names/notes, or constraint notes. Matching is case- and diacritic-insensitive across European Latin alphabets and sees through entity-encoded text. requiredTerms is a list of terms every one of which must occur somewhere in an element's searchable text (conjunction) — terms need not share a field, but sharing one ranks higher; each term is matched as a contiguous substring exactly as a single term is, so a term carrying whitespace is a phrase and is never split. A one-entry list behaves exactly as a single search term always has. boostAnyOf is an optional list of further terms: a result also matching at least one of them ranks ahead of one that does not, but nothing is ever excluded on that basis — for narrowing to only elements matching an alternative too, use ea_search_and_any_of instead. When no element matches, termMatches reports, per supplied term, whether that term matched anywhere in the corpus at all — so a caller can tell which term emptied the result rather than re-guessing the whole call. Matching elements are returned in results, strongest match first, each with a decoded note preview and a truncation flag; equally strong matches fall back to the model's internal identity, a stable but artificial order. Each result also carries matches, the evidence for why it was returned: the field that matched, the id and name of the attribute, operation or constraint it came from, and a snippet of the author's own text around the match. Evidence is strongest-first and capped, and _meta.matches on the result reports how many matches were found and how many were withheld. The note preview centres on the match when the element's own note is what matched. packageScope restricts results to a package (given as its id or its name) and its descendants. Walk a large result set with offset rather than a larger limit; while rows remain, continuation names the next call. When far more elements match than one window can hold, breakdown reports how they distribute — by objectType, stereotype, or, unless already scoped, by packageScope (reported as the matching package's id, which the next call can pass straight back) — so the next call can narrow instead of paging.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 25) | |
| offset | No | Zero-based index of the first result to return (default 0). Page by re-calling with the offset carried in continuation. | |
| boostAnyOf | No | Terms that promote a result's rank when also present; never excludes. Use ea_search_and_any_of to narrow instead. | |
| objectType | No | Filter by object type (e.g., Class, UseCase, Activity, Screen, Requirement, Interface, Component) | |
| stereotype | No | Filter by stereotype | |
| packageScope | No | Restrict results to this package and its descendants, given as a package id or name | |
| requiredTerms | Yes | Terms every one of which must occur somewhere in the element's searchable text (names, notes, aliases, attributes, operations, constraints); terms need not share a field; capped at 10 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only carry readOnlyHint=true and openWorldHint=false; the description carries the full burden of behavior and delivers far beyond it. It discloses case/diacritic-insensitive matching, entity-encoded text handling, conjunction and phrase semantics, ranking promotion without exclusion, per-term failure diagnostics, ordering fallback, evidence capping with withheld counts, truncation flags, and descendant-scope traversal. No contradiction with the read-only annotation.
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?
Dense but disciplined — roughly 300 words with every sentence carrying new behavioral information and no restatement of schema content. It is front-loaded with the core search scope and matching semantics before moving to ranking, evidence, and pagination. A slight deduction for being one continuous block that could benefit from paragraph breaks given the breadth of topics covered.
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 must explain return values and it does thoroughly: results ordering, per-result match evidence with source field and snippet, truncated note preview, termMatches diagnostics, continuation tokens, and breakdown distributions. For a 7-parameter search tool with conjunction semantics, ranking, and paging, nothing an agent needs to invoke 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 baseline is 3. The description adds real value on top: contiguous-substring matching rules, whitespace-as-phrase never being split, the one-entry-list behavior, per-term diagnostic reporting, and the boost-promotes-but-never-excludes ranking nuance — none of which appear in the schema. It does not need to repeat the schema's basic field semantics, so 4 is appropriate rather than 5.
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?
Opens with a specific verb and resource — 'Search Enterprise Architect model elements' — and enumerates precisely which searchable fields are covered (name, alias, notes, attribute/operation/constraint names and notes). It also differentiates itself from the sibling `ea_search_and_any_of` by explicitly stating what this tool does not do (never narrows via boost terms).
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 explicit when-to-use guidance with a named alternative and the exact condition selecting it: 'for narrowing to only elements matching an alternative too, use ea_search_and_any_of instead.' It also advises operational strategy — walk large results with offset, use breakdown to narrow instead of paging — so the agent knows how to steer the call sequence.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ea_search_and_any_ofARead-only
Search Enterprise Architect model elements the same way ea_search does, plus andAnyOf: a required-and-alternative filter. requiredTerms still works exactly as it does on ea_search (conjunction, contiguous substring, terms need not share a field). andAnyOf is an optional list of further terms; when supplied, a result must contain requiredTerms AND at least one andAnyOf term, so it can only ever narrow — it never returns a result requiredTerms alone would not. An empty andAnyOf array applies no filter. For promoting rather than narrowing, use ea_search instead, which offers the same alternatives idea as a rank boost. When no element matches the required terms at all, termMatches reports, per supplied term, whether it matched anywhere in the corpus. Matching elements are returned in results, strongest first, each with a decoded note preview, a truncation flag, and matches — the evidence for why it was returned, capped and strongest-first, with _meta.matches reporting how many were found and withheld. packageScope restricts results to a package and its descendants. Walk a large result set with offset; while rows remain, continuation names the next call. When far more elements match than one window can hold, breakdown reports how they distribute by objectType, stereotype, or packageScope.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of results to return (default 25) | |
| offset | No | Zero-based index of the first result to return (default 0). Page by re-calling with the offset carried in continuation. | |
| andAnyOf | No | Terms a result must also contain at least one of, in addition to requiredTerms; never adds results. Use ea_search's boostAnyOf to only reorder instead. | |
| objectType | No | Filter by object type (e.g., Class, UseCase, Activity, Screen, Requirement, Interface, Component) | |
| stereotype | No | Filter by stereotype | |
| packageScope | No | Restrict results to this package and its descendants, given as a package id or name | |
| requiredTerms | Yes | Terms every one of which must occur somewhere in the element's searchable text (names, notes, aliases, attributes, operations, constraints); terms need not share a field; capped at 10 |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Even with readOnlyHint=true, the description adds substantial behavioral context: fallback `termMatches`, strongest-first ordering, truncation flags, capped and withheld match counts, continuation behavior, and breakdown distribution. None of this contradicts the annotations, and it gives the agent a clear model of how the tool behaves beyond the annotation hints.
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 description is long but densely packed with operational value; every clause covers either purpose, filtering semantics, alternatives, result interpretation, or pagination. It is front-loaded with the core distinction from `ea_search` and has no filler or tautological repetition.
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?
For a 7-parameter search tool with no output schema, the description covers input semantics, result shape, fallback behavior, ordering, pagination, and aggregation breakdown. The only parameters not individually expanded in prose are `objectType` and `stereotype`, but their schema descriptions are already clear enough, so nothing essential 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, but the description goes well beyond field names: it defines `requiredTerms` as conjunctive contiguous substrings that need not share a field, clarifies `andAnyOf` narrows and is inert when empty, and ties `offset` to `continuation` and `packageScope` to descendant packages. This materially helps an agent construct correct calls.
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 specific verb and resource: searching Enterprise Architect model elements, and immediately differentiates itself from the sibling `ea_search` by naming `andAnyOf` as the added filter. It clearly explains the relationship to `ea_search` so an agent can tell the two tools apart without inspecting the 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?
It explicitly says when to use `ea_search` instead ('For promoting rather than narrowing'), and explains that `andAnyOf` can only ever narrow results. It also gives practical guidance for large result sets via `offset` and `continuation`, making the use conditions unambiguous.
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.
4 tool updates
v3.0.0- Changed
ea_list_diagrams6 fields changed- added
Input schema / properties / diagramTypeAdded value: +{ + "description": "Filter by diagram type (e.g., Logical, Use Case, Sequence, Activity, Component)", + "type": "string" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results (default 50)"New value: +"Maximum number of results to return (default 50)" - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - changed
Input schema / properties / nameContains / descriptionPrevious value: -"Filter to diagrams whose name contains this substring (case-insensitive across Slovak alphabet)"New value: +"Filter to diagrams whose name contains this substring (case- and diacritic-insensitive across European Latin alphabets)" - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Zero-based index of the first result to return (default 0). Page by re-calling with the offset carried in continuation.", + "minimum": 0, + "type": "integer" +}
- Changed
ea_list_elements4 fields changed- changed
Input schema / properties / limit / descriptionPrevious value: -"Maximum number of results (default 50)"New value: +"Maximum number of results to return (default 50)" - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Zero-based index of the first result to return (default 0). Page by re-calling with the offset carried in continuation.", + "minimum": 0, + "type": "integer" +}
- Changed
ea_search8 fields changed- added
Input schema / properties / boostAnyOfAdded value: +{ + "description": "Terms that promote a result's rank when also present; never excludes. Use ea_search_and_any_of to narrow instead.", + "items": { + "type": "string" + }, + "maxItems": 10, + "type": "array" +} - added
Input schema / properties / limit / minimumAdded value: +1 - changed
Input schema / properties / limit / typePrevious value: -"number"New value: +"integer" - added
Input schema / properties / offsetAdded value: +{ + "default": 0, + "description": "Zero-based index of the first result to return (default 0). Page by re-calling with the offset carried in continuation.", + "minimum": 0, + "type": "integer" +} - added
Input schema / properties / packageScopeAdded value: +{ + "anyOf": [ + { + "type": "integer" + }, + { + "type": "string" + } + ], + "description": "Restrict results to this package and its descendants, given as a package id or name" +} - removed
Input schema / properties / queryRemoved value: -{ - "description": "Search term to find across all model text (names, notes, aliases, attributes, operations, constraints)", - "type": "string" -} - added
Input schema / properties / requiredTermsAdded value: +{ + "description": "Terms every one of which must occur somewhere in the element's searchable text (names, notes, aliases, attributes, operations, constraints); terms need not share a field; capped at 10", + "items": { + "type": "string" + }, + "maxItems": 10, + "minItems": 1, + "type": "array" +} - changed
Input schema / requiredPrevious value: -[ - "query" -]New value: +[ + "requiredTerms" +]
- Added
ea_search_and_any_of
11 tool updates
v2.1.0- First observed
ea_get_connectors - First observed
ea_get_diagram_elements - First observed
ea_get_element - First observed
ea_get_model_info - First observed
ea_get_package_tree - First observed
ea_get_scenarios - First observed
ea_get_schema - First observed
ea_list_diagrams - First observed
ea_list_elements - First observed
ea_resolve - First observed
ea_search
TDQS
Scored across 12 tools
Most tools map cleanly to distinct actions and resources: get vs list vs search vs resolve are easy to separate, and the descriptions carefully explain each tool's role. The only real ambiguity is between ea_search and ea_search_and_any_of, which are near-duplicates differing only in how alternatives are applied, and ea_resolve can overlap with search in intent.
All tools share the ea_ prefix and use snake_case with a consistent verb-first style: get_, list_, search_, and resolve. ea_search_and_any_of is the only name that breaks the simple verb_noun shape, but it is a coherent extension of the existing search name rather than a convention violation.
Twelve tools is well within the ideal range and each tool serves a distinct read-only exploration workflow: navigation, element detail, search, diagrams, connectors, scenarios, schema, and model info. The count feels deliberate rather than bloated, and no tool appears redundant enough to remove.
The read-only Enterprise Architect model surface is well covered: package hierarchy, element details, search, relationship and diagram retrieval, scenarios, schema discovery, and model identity are all present. Minor gaps exist, such as package-level details beyond tree metadata and certain EA extension data like tagged values, but the core exploration workflows have no dead ends.
Maintenance
Related MCP Connectors
Read-only MCP server exposing a user ORANO library to their own AI agent.
Read-only MCP server for The Quiet Protocol's engines, benchmarks, proof, and business data.
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Token-free MCP server for structured RevoGrid Core, Pro, and Enterprise knowledge retrieval.
Related MCP Servers
- AlicenseBqualityDmaintenanceA read-only MCP server connecting AI assistants to Azure DevOps Server (on-premises) for browsing projects, repos, builds, work items, releases, pipelines, and test results.393931MIT
- FlicenseNot gradedqualityAmaintenanceAn MCP server that gives an AI agent read and write access to a live SysML v2 model through the vendor-neutral OMG SysML v2 REST API.2-
- FlicenseAqualityBmaintenanceA read-only MCP server that enables AI clients to search a knowledge base and retrieve complete source documents via narrow search and fetch tools.2-
- FlicenseAqualityCmaintenanceA read-only MCP server that gives AI coding agents structured access to a project's source code, architecture, documentation, and Git context through 16 tools for searching, reading, and comparing evidence without modifying files.16-