Skip to main content
Glama

Ennodia isn't another agent. It connects the agents you use.

Stay in Codex, Claude Code, or any agent you like. When a task needs another model, your agent hands that part over through Ennodia and brings the answer back. Ennodia runs on your computer, and each agent uses your own account.

Have Gemini listen to meeting.mp3 through Ennodia and tell me what was decided.

Why use it

  • Keep the app you like. Ennodia has no window of its own. You work in your agent as before, and it can now reach the others.

  • Your agents work together. Any agent can hand part of a task to any other and get the answer back in your chat.

  • Nothing to pay, nothing to join. Ennodia is free and open source, with no account. It uses the agents and plans you have.

  • It grows with your agents. It is a set of tools, not a framework or a method. Each new model one agent gains becomes an ability for all of them.

  • It stays on your computer. Every handoff leaves a receipt there: who did the work, how long it took, and what came back.

  • Less to keep up with. You don't need to follow every new model. Name the task, and your agent hands it to one that can do it.

Next on the roadmap: Ennodia reads its receipts, so your agent stops repeating what failed.

Related MCP server: agentloop

What each agent adds

No model leads every task, so each agent you connect brings an ability the others lack.

  • Listen. Gemini hears audio files. Codex hands it the file path and gets back what Gemini heard.

  • Draw. Codex draws with GPT Image. Claude Code can hand it a brief and get the images back.

  • Review. Two other agents review the same patch in fresh sessions. Compare maps where they agree and differ.

  • Read. Kimi K3 in OpenCode reads long documents. Your agent hands it a spec and gets back the rules, each with its line number.

When your own agent has the ability, it does the task itself, with no handoff. See each route and the public scores behind each strength.

Install

Send this address to your agent:

try-ennodia.cherninlab.com

For manual setup, add this Model Context Protocol (MCP) server to your client:

{
  "mcpServers": {
    "ennodia": {
      "command": "npx",
      "args": ["-y", "ennodia"]
    }
  }
}

Ennodia loads six core tools by default: about 10,000 characters of tool definitions in each session. Add "--tools", "all" to args for the full tool set.

Requirements: Bun 1.3.14 or newer, a compatible MCP client, and a supported agent with working provider access. npx downloads Ennodia. Bun runs it. You can also use bunx ennodia.

Get your first result · Installation for agents

How a handoff works

  1. Your agent calls ennodia_run with the task, the agent or model to use, and a time limit.

  2. Ennodia starts that agent's own command-line tool in a fresh session, with its own tools and your account for it.

  3. The answer comes back to your conversation, with its status and a receipt saved on your computer.

Your conversation history stays in your agent. For two or more answers, Compare maps agreements, contradictions, and gaps. When one answer is complete as it stands, Compare can choose it, and ennodia_run returns it unchanged.

Supported agents

Codex CLI, Claude Code, OpenCode, Kilo Code, Kiro CLI, Cline, Hermes Agent, and Antigravity. Model availability and tool permissions depend on the installed agent and its provider configuration. Discovery finds executable commands. It does not verify authentication or model access. Codex workers use a read-only sandbox by default.

Ennodia discovers native Agent Skills and can request them for specific tasks. A separate task keeps the trial outside the main conversation. Native agents can also select unrequested skills from their own environment.

Recipes · Using skills · Understand results

Evidence

  • Can Gemini hear this file?: a Codex conversation hands an audio file to Gemini through Antigravity.

  • Measurement plan: how Ennodia compares single agents with teams on public benchmarks.

  • Audio routing pilot: Codex got 10 of 10 speech questions right through Gemini, and 4 of 10 alone. Across all 30 clips the gain was not significant, and each answer took about twice as long.

Data and limits

Ennodia runs locally without an Ennodia-hosted service. Selected agents can send material to their configured model providers. Terminal run history is stored locally and can be disabled with ENNODIA_HISTORY=0.

Each handoff costs time and uses your agents' own quotas and charges. General time or token savings have not been established. Ennodia can limit child tasks and estimated input tokens. Those estimates exclude internal harness work and are not provider bills.

Data governance · Budgets · Roadmap

Technical reference and contribution

The main entry point is ennodia_run. The full tool set adds raw tasks, separate Compare calls, budget estimates, and the Plan Advisor, which proposes explicit tasks before execution.

MCP tools · Experimental Ennodia IO · Contributing · MIT license

bun install
bun run verify

Experimental Pragmatic mode

Pragmatic mode runs independent model attempts, tailored plans, and skill trials, then compares the evidence. It keeps bulky evidence outside the main conversation and returns findings for your agent to verify. Savings are not yet validated.

Available Tools

6 tools
ennodia_cancel_runCancel Ennodia runA
Idempotent

Cancel a high-level run and any active child task, Judge, or Result Advisor.

NameRequiredDescriptionDefault
runIdYesRun ID returned by ennodia_run.

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=false, destructiveHint=false, and idempotentHint=true, so the safety profile is covered. The description adds genuinely non-obvious behavioral context: cancellation cascades to child tasks, Judges, and Result Advisors, which an agent could not infer from the annotations or the single-parameter schema. It stops short of stating post-cancel run state or what happens if the run already finished.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

One sentence, front-loaded with the verb and resource and immediately following with the scope of the effect. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a single-param mutation tool with no output schema and annotations covering safety and idempotency, the description supplies the key missing piece (cascade scope). It does not describe the post-cancellation response or error behavior for an already-completed run, but nothing essential to invoking it is absent.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema description coverage is 100%, so the schema already documents runId as 'Run ID returned by ennodia_run.' The description adds nothing about the parameter, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (cancel) and resource (run) plus the cascade scope: active child task, Judge, or Result Advisor. That scope detail makes it clearly distinct from ennodia_run and ennodia_get_run, though no sibling is named explicitly, which is what would push this to a 5.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description gives no when-to-use guidance, no prerequisites (e.g. run must be in progress), and no mention of alternatives such as ennodia_get_run for inspecting a run instead. Usage is only inferable from the name.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ennodia_get_runGet Ennodia runA
Read-only

Inspect a run or wait up to waitMs for completion. Prefer waitMs: 30000, compact: true and includeEvents: false while awaiting results. A nonterminal response means work continues; do not claim its findings were consumed.

NameRequiredDescriptionDefault
runIdYesRun ID returned by ennodia_run.
waitMsNoWait for a terminal state without cancelling or extending the run. Use 30000 for ordinary polling. Longer waits require a client tool timeout greater than waitMs.
compactNoOmit repeated routing, budget, prompt preview and skill metadata. Preserve status, timing, task IDs, answers and errors. Answer and event limits still apply. Use false for full diagnostics.
maxEventsNoMaximum run events to include. Use 0 to omit events.
includeEventsNoInclude bounded run event history.
maxAnswerCharsNoMaximum final-answer characters to include. Use 0 to omit answer text.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover the read-only safety profile, and the description adds genuinely new semantics: a nonterminal response means work continues, and the agent must not treat its findings as consumed. That is real behavioral context beyond readOnlyHint. It does not cover rate limits, auth, or return shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, zero filler, and the primary action plus recommended configuration are front-loaded ahead of the caveat about nonterminal responses. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a six-parameter polling tool with no output schema, the description covers the action, the recommended invocation profile, and the key interpretation pitfall. The main residual gap is that the response structure itself is undocumented anywhere, though the compact parameter description partially compensates.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so each of the six parameters is already documented with defaults, ranges, and practical guidance. The description restates a recommended combination (waitMs, compact, includeEvents) but adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb pair (inspect / wait for completion) against a named resource (a run), and the required runId parameter ties it to outputs of ennodia_run. It does not explicitly differentiate itself from ennodia_cancel_run or ennodia_history, so an agent must infer the boundary from names alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete operational guidance for the polling case ('Prefer waitMs: 30000, compact: true and includeEvents: false while awaiting results') and states the condition under which the call is not finished. It stops short of naming alternatives or stating when not to use this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ennodia_historyList durable Ennodia run historyA
Read-only

Read terminal run receipts persisted under the local Ennodia history directory. Use after a restart to inspect previous final answers and Judge disagreement analysis.

NameRequiredDescriptionDefault
limitNoMaximum persisted run snapshots to return, newest first.

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds genuine context beyond that: only *terminal* runs are persisted, the receipts live under a local history directory, and they survive a restart. It omits ordering, retention bounds, and pagination behavior, which the schema only partly supplies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, zero filler, with the scoping statement front-loaded and the usage condition following. Nothing needs trimming or reordering.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description carries the burden of saying what comes back, and it does indicate final answers plus Judge disagreement analysis. Minor gaps remain around ordering and retention, but for a one-optional-parameter read tool it is sufficient to call correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100% and the single `limit` parameter is already well documented (newest first, max 500, exclusiveMinimum 0). The description adds nothing about the parameter, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Read terminal run receipts persisted under the local Ennodia history directory"), which is concrete and distinct from a live-run tool. It does not name any sibling such as ennodia_get_run to draw the boundary explicitly, so it falls short of full differentiation.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

"Use after a restart to inspect previous final answers and Judge disagreement analysis" gives a clear triggering condition and intent. It offers no exclusions or named alternative (e.g., when to prefer ennodia_get_run for an in-flight run), which keeps it out of the top band.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ennodia_list_harnessesList Ennodia harnessesA
Read-only

Discover local harnesses, availability, versions, capabilities, adapter notes, and inputGuidance. Before audio/image/video work, read inputGuidance: model capabilities do not guarantee native input through a harness. Use first when setup or routing fails.

NameRequiredDescriptionDefault
refreshNoRe-scan available harnesses instead of returning the short-lived discovery cache.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare it read-only and local, so the safety profile is covered; the description adds the discovery-cache behavior (refresh re-scans), the caveat that model capabilities do not guarantee native input through a harness, and a troubleshooting-first role. It does not describe pagination or the shape of the returned list.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the action and returned facets, then layers the two directives. Dense and telegraphic but every clause carries information; no filler sentences.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

No output schema exists, yet the description enumerates what discovery yields (availability, versions, capabilities, adapter notes, inputGuidance), which compensates. For a single-optional-param read tool with annotations covering safety, this is close to complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema coverage is 100%, so the schema fully documents refresh. The description adds no format or semantic detail about it, which is the expected baseline when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb (Discover) and resource (local harnesses) and enumerates the returned facets: availability, versions, capabilities, adapter notes, inputGuidance. It is clearly distinguishable from ennodia_list_skills, though it never explicitly contrasts itself with that sibling.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete usage context: read inputGuidance before audio/image/video work, and use this first when setup or routing fails. It states when to reach for the tool but names no alternative sibling to prefer instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ennodia_list_skillsList Ennodia skillsA
Read-only

Discover prompt-only skills from project, user, and built-in skill directories without returning full instruction text.

NameRequiredDescriptionDefault
cwdNoOptional working directory to locate project-specific skills.

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds a genuinely useful behavioral disclosure — that the listing deliberately omits full instruction text — which tells the agent it must follow up elsewhere to actually read a skill. It stops short of describing ordering or result shape.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single front-loaded sentence with no filler: it leads with the action and resource, then immediately qualifies the scope and the output limitation. Every clause earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a zero-required-parameter, read-only listing tool with no output schema, the description plus annotations cover what an agent needs: what is listed, from where, and the key fact that instruction bodies are not included. Nothing essential is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the single 'cwd' parameter is already documented as the way to locate project-specific skills. The description says project skills come from directories but adds no semantics beyond the schema, which is the expected baseline when the schema does the work.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description gives a specific verb ('Discover') plus resource ('skills') and names the three source scopes (project, user, built-in directories), so the agent knows exactly what is returned. It does not explicitly contrast itself with the closest sibling ennodia_list_harnesses, but the resource name and the 'prompt-only' qualifier make the distinction reasonably clear.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied: this is the discovery call you make before invoking skills. However, there is no explicit when-to-use statement, no mention of prerequisites such as needing a project context, and no routing advice versus ennodia_list_harnesses or ennodia_run.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

ennodia_runRun EnnodiaA

Start a high-level Ennodia orchestration. Set pragmatic for evidence-focused investigation or patch proposals with one or more independent workers. Use Plan Advisor for tailored model and skill assignments. Use this as the default entrypoint: it plans routing, starts one or more local harness tasks, optionally compares successful outputs, and returns a run ID. Runs usually take minutes; use ennodia_get_run with waitMs: 30000 and includeEvents: false until terminal, then consume and verify its answer. A wait timeout does not cancel or finish the run.

NameRequiredDescriptionDefault
cwdNoWorking directory for child harness commands.
modeNoauto follows the planner; single runs one selected harness; parallel runs all candidate harnesses.auto
modelNoOptional model override passed to the selected task harnesses.
budgetNoOptional preflight budget limits for an Ennodia operation.
promptYesThe user task to route to local AI harnesses. For native media, first read ennodia_list_harnesses inputGuidance, specify local paths and a harness/model, then verify one small sample with mode single and compare false. Ennodia sends text, not media attachments.
compareNoWhether to run the Judge + Result Advisor after tasks finish. auto compares when the planner sees value and at least two tasks produce output.auto
refreshNoRe-scan harnesses before planning the run.
categoryNoOptional caller-provided route category. Pass this when you know the task category; Ennodia then skips keyword classification.
skillIdsNoInstalled native skill IDs to request from child harnesses. Returned metadata does not prove that an agent loaded the skill.
harnessIdNoForce one harness by ID, such as codex or claude-code. Omit to let Ennodia plan.
pragmaticNoExperimental evidence contract for one or more independent workers. Preserves routing and comparison choices. Use Plan Advisor for tailored model and skill assignments. This is workflow guidance, not a permission sandbox or a savings guarantee.
timeoutMsNoPer-task timeout in milliseconds. Defaults to the task manager timeout and is capped at one hour.
isolateCwdNoRun each selected harness against an ephemeral isolated copy of cwd instead of cwd itself. Use this in parallel mode or whenever comparing skills/harnesses against the same cwd, so concurrent file writes cannot clobber each other. Isolation fails before task spawn if the copied tree contains a symbolic link. The reported task cwd is an execution trace; its temporary directory is deleted when the task becomes terminal.
judgeModelNoOptional model override for the comparison Judge.
advisorModelNoOptional model override for the Result Advisor.
nativeSandboxNoCodex worker native sandbox. Defaults to read-only on every turn, including continuation. Request workspace-write only for authorized edits. Other harnesses reject this setting; Judge/Advisor settings are unchanged.
continueTaskIdNoContinue the latest settled persistent task owned by this server. Use its Ennodia task ID. The working directory and harness stay the same. Each follow-up gets a new task and execution allowance.
judgeHarnessIdNoHarness to use as the comparison Judge. Omit to use the default priority: claude-code, codex, antigravity, opencode, kilo, kiro, cline, then hermes-agent.
maxOutputCharsNoMaximum characters from each successful task output to pass into the Judge + Result Advisor workflow. Use 0 to suppress candidate text.
persistSessionNoOpt in to native Codex session persistence. Requires one explicit harness and a persistent cwd. Default tasks remain ephemeral.
nativeSubagentsNoDisable Codex built-in subagent tools for workers. Other harnesses reject this setting. Does not block external commands or affect Judge/Advisor tasks.
reasoningEffortNoOptional reasoning effort for a Codex worker. Other harnesses reject explicit effort settings; omit to preserve native defaults.
advisorHarnessIdNoHarness that runs the Result Advisor after the Judge. Defaults to the judge harness selection.
synthesizerModelNoDeprecated alias for advisorModel. Do not send both fields with different values.
synthesizerHarnessIdNoDeprecated alias for advisorHarnessId. Do not send both fields with different values.

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnlyHint=false and openWorldHint=true; the description adds the operational profile that matters here: runs "usually take minutes," they are asynchronous, and "a wait timeout does not cancel or finish the run." That is genuinely useful beyond the annotations, though it says nothing about cost, concurrency limits, or failure modes of the harness tasks.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four dense, front-loaded sentences that lead with what the tool does and end with the polling contract. Slightly redundant: "Use Plan Advisor for tailored model and skill assignments" repeats guidance already present in the pragmatic schema description.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 25-parameter orchestration tool with no output schema, the description covers the full lifecycle (plan -> run -> poll -> verdict), the return value (run ID), and the async/polling contract. It leaves unstated what the run-ID payload or final answer looks like, and gives no scope on run cost, which keeps it short of complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the baseline is 3 and the schema already covers all 25 parameters. The description still adds selection guidance the schema does not: when to set pragmatic (investigate vs patch) and how to poll via waitMs/includeEvents. It does not attempt to explain the many tuning parameters (judgeModel, nativeSandbox, isolateCwd), leaving those to the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb (start) and resource (Ennodia orchestration) and spells out the mechanics: plans routing, starts local harness tasks, optionally compares outputs, returns a run ID. It also distinguishes itself from the sibling ennodia_get_run by naming it as the follow-up poll step.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicitly positions itself as "the default entrypoint," names the alternative (ennodia_get_run) with concrete parameters (waitMs: 30000, includeEvents: false) and the condition (until terminal). It also routes agents to pragmatic mode for evidence/patch work and to Plan Advisor for model/skill assignments.

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.

  1. 6 tool updatesv0.4.1
    • First observedennodia_cancel_run
    • First observedennodia_get_run
    • First observedennodia_history
    • First observedennodia_list_harnesses
    • First observedennodia_list_skills
    • First observedennodia_run

TDQS

A3.9/5.0

Scored across 6 tools

Disambiguation4/5

Each tool has a distinct lifecycle role: list_harnesses/list_skills are discovery, run starts work, get_run reads status, history reads past receipts, cancel_run stops work. The only mild overlap is get_run vs history (live vs persisted) and run vs list_harnesses routing guidance, but descriptions clarify these boundaries.

Naming Consistency4/5

All tools use the ennodia_ prefix with snake_case verb_noun naming, which is highly consistent. Minor deviation: ennodia_run is a bare verb with no noun, while others include an object (enumodia_list_harnesses, ennodia_get_run).

Tool Count5/5

Six tools is well-scoped for an orchestration server, covering discovery, execution, polling, history, and cancellation without redundancy. Each tool earns its place in the run lifecycle.

Completeness4/5

The lifecycle is well covered: discover harnesses/skills, start run, poll, cancel, and read history. Minor gap: no explicit tool for listing or retrieving an in-progress run's result beyond polling, but get_run with waitMs handles terminal results adequately.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers