The AI Power Tools MCP Server for Sparx EA
ea-mcp-server.exe is the AI Power Tools MCP Server for Sparx EA: a Windows console program that exchanges requests and results with the AI client over standard input and output and drives EA through its automation interface. It announces itself to the client as AI-Power-Tools-for-Sparx-EA.
What it is
- Compiled, not interpreted. Release builds are compiled to native code, so no Python is needed on your machine. The build is a folder holding the program and the libraries it needs, packed into the Claude Desktop extension and the VS Code extension.
- Signed. Every program file and library in the package is signed under the NovoCircle publisher with Microsoft's code-signing service, and the signature is checked again inside the finished archive. A build that cannot be signed cannot be published. Signing every file individually is what avoids the Windows Defender false alarms that unsigned libraries trigger.
- No listener. It opens no network port and cannot be reached by other machines.
- Its version is reported by
pingand by the update check.
Tools it offers
Seven tools. Six grouped tools dispatch to named operations, and ping is a health check.
| Tool | Operations | What it covers |
|---|---|---|
ping |
none | A health check. Needs no EA. Reports the server and its version |
ea_repository |
27 | Projects, baselines, import and export, the reporting business layer, and the older skills installer. See ea_repository |
ea_model |
50 | Packages, elements, connectors, class members, tagged values. See ea_model |
ea_diagram |
46 | Diagrams, layout, appearance, verification, images, export, manifests, descriptions. See ea_diagram |
ea_analyze |
13 | Summaries, graph and traceability, audit trail, direct queries. See ea_analyze |
ea_mdg |
12 | Modeling-language technologies. See ea_mdg |
ea_validate |
1 | audit, the conformance check. See ea_validate |
That is 149 operations in total. MCP server: tools and operations documents each one.
How the server checks a call
Before any call reaches EA, the server checks it in order and returns a structured failure for the first check that fails. The assistant reads the failure and corrects the call.
- The operation name must be a plain name. A name written as a function call is rejected.
- The name must be an operation of that tool. An unknown name is rejected, with the list of valid operations.
- Read-only mode must not block it. A blocked call returns
readonly_mode. - Every argument must be one the operation accepts. An unknown argument returns
unknown_parameters, naming the offenders, what the operation accepts and a close match. - Every required argument must be present. Otherwise the call returns
missing_required_params.
Two EA-state failures come from a wrapper around every tool except ping: ea_not_running, which names launch_ea as the remedy, and ea_no_model_open, which names open_model and create_model. The error code and the remedy are the contract. Troubleshooting lists the codes you may meet.
Lifecycle
- Start. The AI client launches the program: Claude from the Claude Desktop extension, VS Code from its registration of the VS Code extension. The process is named
ea-mcp-server. - Initialize. It sets up logging, notes whether diagnostics are on, and answers the client's
initializeandtools/listrequests. The two background checks for updates start only after the client has itsinitializereply (see below). - Serve. It answers requests. It does not contact EA at startup. The first call that needs EA attaches to it (How the server connects to Enterprise Architect).
- Stay resident. The process lives as long as the client keeps it. It holds its connection to EA between calls and re-attaches if the connection goes stale.
- Stop. The server stops when the client closes the connection or stops the process. Stopping the server does not close EA or the open model. A reporting refresh runs inside the server process, and the server keeps its runs in memory: keep the server running until a refresh finishes, because after a restart it does not recognize the run id of a refresh started before it.
While it runs, the process holds a Windows file lock on its own program. That is why a Desktop-extension upgrade must disable the extension first (Updating and uninstalling).
EA is a single-threaded desktop application, so a slow EA operation blocks everything behind it. See How the server connects to Enterprise Architect.
What the server writes to disk
It keeps almost nothing.
| What | Where | When |
|---|---|---|
| Diagnostic reports | %LOCALAPPDATA%\ea-mcp-server\diagnostics, or the folder you choose |
Only with diagnostics on, and only for a failing, error-returning or slow call |
| Preview images of diagrams | A diagrams folder next to the open project file |
When a diagram operation returns a preview and the project is a file. The path is returned with the result |
| Installed rulesets and the install record | %USERPROFILE%\.claude\ai-power-tools\ |
The older skills and rulesets installer |
| Skills | %USERPROFILE%\.claude\skills |
The older skills installer, which declines when the plugin is found installed |
| Exports you ask for | The path you give | export_xmi, diagram exports, generate_report and similar |
| The reporting definition file | Beside the reporting profile | Every reporting build and refresh. It lists every table, its columns, types and row counts, for the Power BI generator |
| The kept extract, and for Parquet files the computed rows | Beside the reporting profile | Every build and refresh of a reporting database or Parquet files. Each build replaces the kept extract, so only the last one is kept. It holds only included content |
Background update checks
Two checks run in the background at every server start. They begin after the client has its initialize reply, so they never delay the connection: Claude Desktop waits ten seconds for all of its local servers and starts the session without any that are late. Until a check finishes, ping and get_repository_info report it as not checked yet. A failed check is silent.
Update check. It fetches the latest release from the public releases page on GitHub, compares its version with the running one, and caches the result. A result less than 24 hours old is not refreshed. The result appears in two places:
get_repository_infoincludes an update notice when a newer release exists (update_checkreads "not checked yet" until the check finishes and "unavailable" if it ended without reaching GitHub, andskills_update_checkdoes the same for the skills check), with the current and latest versions, the download address, the release notes, how AI Power Tools was installed, and the upgrade steps for that package.check_for_updatesreturns the cached result. Called withforce, it starts a fresh check and returns immediately. The fresh result arrives on the next call.
The server tells how it was installed from where its own program sits on disk. The upgrade steps it gives depend on the answer:
| Where the program sits | Install route reported | Upgrade steps in the notice |
|---|---|---|
Claude Desktop's Claude Extensions folder |
The Claude Desktop extension | Download the new .mcpb file and drag it onto the Extensions pane. Switch the extension's Enabled toggle off, click Update, switch it back on (Updating and uninstalling). The running server otherwise holds a lock on its program file and the update fails with an "EPERM" error |
| Among VS Code's extensions | The VS Code extension | Install the new .vsix file from the release page, then reload the window |
| In Claude's plugin cache, or in Claude Desktop's staging and cache folders for plugin servers | A server that arrived inside a plugin package | The notice says the plugin carries only the skills and the server is the Claude Desktop extension, gives the steps to install the extension, and gives the skills update steps. For a plugin file uploaded in Claude Desktop, it sends you to the skills release for the newer file, because an uploaded plugin does not update itself |
| Anywhere else | Not recognized | Neutral guidance: download the new release from the stable link, install it the way you installed this one, and restart the application that runs the server |
A server launched by another client from an unrecognized location is therefore reported as not recognized and never as the Claude Desktop extension. The server never downloads or installs anything by itself.
The notice from ping. The ea-start-here skill opens every session by calling ping with the release the skills were stamped with. The reply carries an update summary (the server's version, the latest release the check found, and whether the server or the skills are behind) and, only when something is behind, a notice that the skill shows you word for word. The current release is the newest of the server's own version, the latest published release and the skills version, so skills that are newer than the server are caught without the network. ping never waits for the release check. While the check is running, latest_version is empty and the update summary carries release_check with the value "not checked yet"; call ping again for the result. If the check could not reach GitHub, release_check says "unavailable". Skills that send no version are not compared.
- Skills behind: "Your AI Power Tools skills are X; the current release is Y. Open https://claude.ai/customize/plugins, choose Manage marketplaces, and sync novocircle. Then quit Claude Desktop completely and reopen it."
- Server behind: "AI Power Tools for Sparx EA X is installed; Y is available.", followed by the upgrade steps for the install route in the table above.
The first tool response after the release check has finished also carries the server-behind notice once, when a newer server release exists, unless ping has already answered.
Skills check. The comparison of the skills against the release manifest depends on whether the server finds the plugin installed. It finds the plugin when it runs from the plugin cache, or when Claude's plugin register (installed_plugins.json in %USERPROFILE%\.claude\plugins) lists the plugin and does not mark it orphaned:
- Where the plugin is found installed. The plugin carries the skills, so the check fetches nothing and stays silent about updates. It reports only copies the older skills installer left in
%USERPROFILE%\.claude\skills, as named in that installer's own record. Those copies load a second time beside the plugin's. When there are any,get_repository_infolists them as legacy copies and namesmigrate-to-plugin.ps1as the remedy (Moving from an older installation). The list is read fresh at each call, so it shrinks as you remove copies. - Where the server is the Claude Desktop extension and the plugin is not found installed. Claude Desktop keeps plugins installed on a claude.ai account in a store the server cannot read, so this is the usual case for an account install, and the skills come from that plugin. The check fetches nothing and never recommends
install_skills, which would copy every skill into%USERPROFILE%\.claude\skillsand load each one twice. Whatget_repository_inforeports depends on what is in that folder and what the assistant reports throughping. With copies the older installer left there, it lists them as legacy copies. Those copies load a second time beside the plugin's skills in the Code tab; Claude Desktop chat and Claude Cowork do not read that folder. It says to add the plugin on your claude.ai account if it is not there yet, and to remove the copies withmigrate-to-plugin.ps1, or by asking forprune_legacy_skillsto apply withplugin_confirmedonce you confirm the plugin is installed on your account. On the extension that confirmation is enough, whether or not the assistant has reported a skills release (Skills (legacy)). With no copies and no skills release reported throughping, it gives one pointer to where the skills come from: open claude.ai/customize/plugins, choose Add marketplace, enterNovoCircle/ai-power-tools-skills, install AI Power Tools, then quit Claude Desktop completely and reopen it. With no copies and a skills release reported throughping, it reports nothing. - Where the server runs from another location and the plugin is not found installed. The check fetches the skills repository's release manifest and compares it with
%USERPROFILE%\.claude\skills. When it finds updates, conflicts or missing skills there,get_repository_infoincludes a skills notice that namesinstall_skillsas the way to apply them. The comparison looks only at that folder, so a skill that Claude loads from a plugin on your account does not count as present. - Where the server runs from another location and the skills version reported through
pingshows the plugin may be in use. If the release the assistant reports is one that no copy in the skills folders can have produced,get_repository_infolists the copies the older installer wrote, with a conditional note: if you installed the plugin from your claude.ai account, those copies duplicate its skills. This is a hint, not proof, because skills can also come from a project's own.claude\skillsfolder. It does not stopinstall_skills, and nothing is removed unless you say you installed the plugin on your claude.ai account and ask forprune_legacy_skillsto apply withplugin_confirmed(Skills (legacy)).
Neither check sends anything beyond a standard secure web request that identifies the server and its version. No setting turns either check off. Two environment settings redirect them (see below).
Logging and diagnostics
Logging. The server writes its own log lines at the level set by EA_MCP_LOG_LEVEL (INFO by default) to its standard error stream, which the client captures. Where the client keeps that stream depends on the client.
Where each package sets the log level, diagnostics and read-only mode. Each package that carries the server sets the server's environment itself, and they differ. The plugin carries no server and has no settings.
| Package | Log level | Diagnostics |
|---|---|---|
| VS Code extension | The setting eaMcp.logLevel: DEBUG, INFO, WARNING or ERROR, default INFO. Use DEBUG when reproducing a problem |
The settings eaMcp.diagnostics (on or off) and eaMcp.diagnosticsDir (the report folder). See Settings |
| Claude Desktop extension | The Configure screen's Log level: DEBUG, INFO, WARNING or ERROR, default INFO. Any other value is treated as INFO |
The Configure screen offers Enable diagnostic reports (off by default), Diagnostic report directory (blank means the default folder) and Slow-call threshold (30 seconds by default). See Claude Desktop extension |
Call history. Every call except ping is timed and recorded in memory, with its outcome, in a buffer of the last 25 calls. Nothing is written to disk by this.
Diagnostic reports (opt-in). With diagnostics on, a call that raises an exception, returns a structured error, or takes at least the slow-call threshold (30 seconds by default) writes a self-contained Markdown report named for the time and the tool. The call's response then also points to the report and to help@novocircle.com. A report holds:
- a summary of the failure
- the environment: server version, operating system, EA version, repository type and project path
- the call's arguments and result, with any value over 500 characters shortened
- the error trace, if there was an exception
- the last 25 calls
- the server's uptime and counts
Review a report, remove anything you do not want to share, and email it to help@novocircle.com. Nothing is sent automatically. Element and package names appear in full. get_repository_info shows the resolved diagnostics settings, so you can confirm the mode without restarting.
Read-only mode
Read-only mode is an administrator control for giving people the tools without write access. When it is on, an operation that modifies the repository returns readonly_mode, with a message naming the operation. Queries and every read operation keep working, and execute_sql still runs, with writes forced off.
In the Claude Desktop extension, turn on Read-only mode on the extension's Configure screen; it is off by default. The setting sets the environment variable EA_MCP_READONLY, which the server reads once at start, so a change takes effect when the extension restarts the server. The VS Code extension has no setting for it. Where a client launches the server some other way, set EA_MCP_READONLY to 1, true, yes or on in the server's environment; whether a system-wide Windows environment variable reaches the server depends on the client and is not confirmed. Test that a write is refused before you rely on it.
Which operations count as writes. The server decides by operation name. An operation is blocked when its name starts with create_, update_, delete_, set_, add_, move_, duplicate_, apply_, import_, install_ or write_. A few others are named individually and blocked too: execute_sql when it is a write, layout_diagram, remove_element_from_diagram, clear_element_image, and the reporting operations build_business_layer and remove_business_layer, which are blocked whichever database their profile names. start_reporting_refresh is blocked only when its profile builds views in the EA repository's database. build_reporting_database and replay_reporting_database are not blocked, because they write a separate database or files, not the repository. Three skill-management operations (install_skills, prune_legacy_skills, resolve_skill_conflict) are exempt, because they write files on disk, not to the repository.
Diagram layout operations are blocked by name too. An operation that changes a diagram but has none of those name patterns is listed individually. That covers layout_diagram, remove_element_from_diagram, the tidy operations neaten_diagram_objects and resize_diagram_objects, and collapse_parallel_connectors and expand_parallel_connectors; a collapse dry run is refused as well. Operations that write files outside the repository, such as exports and generate_report, are not blocked, except write_mdg_xml. Treat read-only mode as a guard against accidental changes, not as a security boundary, until you have tested it against the operations you care about.
Environment settings
The server reads its settings from its process environment once, at start. A change needs a server restart.
Where each package sets the log level, diagnostics and read-only mode is in Logging and diagnostics and Read-only mode. No package exposes the other variables below as settings.
If an optional Desktop-extension setting is left blank, the host can leave literal template text in the variable. The server recognizes that and treats the variable as unset.
| Variable | Default | Effect |
|---|---|---|
EA_MCP_LOG_LEVEL |
INFO |
The detail of the server's own log. One of DEBUG, INFO, WARNING, ERROR, CRITICAL |
EA_MCP_DIAGNOSTICS |
Off | Turned on by 1, true, yes or on. Writes a Markdown report on a failing, error-returning or slow call |
EA_MCP_DIAGNOSTICS_DIR |
%LOCALAPPDATA%\ea-mcp-server\diagnostics |
Where reports are written |
EA_MCP_DIAGNOSTICS_TIMEOUT |
30 | Seconds at or above which a call counts as slow. A non-positive or unreadable value falls back to 30 |
EA_MCP_READONLY |
Off | Repository read-only mode, described above |
EA_MODEL_PATTERNS |
The ModelPatterns folder in the EA install folder |
Where find_icon and set_element_icon read EA's shipped icon libraries |
EA_MCP_UPDATE_URL, EA_MCP_SKILLS_MANIFEST_URL, EA_MCP_SKILLS_TARGET |
Unset | Redirect the update checks and the older skills installer. For support and testing |
EA_MCP_DEMO_LANGUAGES |
Off | Adds a fictitious demonstration language to the language listing. For NovoCircle's own testing. Leave unset |