Skip to main content
Glama

agda-mcp

agda-mcp is a standalone MCP server for Agda's JSON interaction protocol. It keeps one long-lived agda --interaction-json process per active workspace and supports on-disk .agda, .lagda, and .lagda.md modules.

The server exposes normalized, transport-independent results while retaining bounded metadata about Agda's native responses in a raw field. Native events are available on request. Case split, refine, and auto are non-mutating by default. An explicit apply: true, or starting the server with --apply-edits, atomically writes the guarded proposal and typechecks it in the same operation.

End-to-end example

Suppose /workspace/Example.agda contains:

module Example where

data Bool : Set where
  true  : Bool
  false : Bool

not : Bool → Bool
not x = ?

An agent can take the file from one hole to two case-specific holes as follows. Responses below are abbreviated to their normalized data; opaque handles and the source fingerprint must be reused exactly as returned. This example assumes the server was started with --dynamic-workspaces, allowing the first call to select /workspace without per-project server configuration.

# 1. Load and typecheck the top-level module.
agda_load_module({
  "modulePath": "/workspace/Example.agda",
  "workspaceRoot": "/workspace",
  "includeRaw": false
})
→ data.workspace = "workspace_…"

# 2. Retrieve the current goals (the load response includes them too).
agda_retrieve_goals({
  "workspace": "workspace_…",
  "includeRaw": false
})
→ data.goals[0] = { "handle": "goal_…", "type": "Bool", … }

# 3. Inspect the selected goal's local context.
agda_retrieve_context({
  "goal": "goal_…",
  "includeRaw": false
})
→ data = {
    "goal": "goal_…",
    "goalType": "Bool",
    "context": [{ "reifiedName": "x", "type": "Bool", "inScope": true }]
  }

# 4. Ask Agda for a non-mutating case-split preview.
agda_case_split({
  "goal": "goal_…",
  "variables": "x",
  "includeRaw": false
})
→ data.edits[0] = {
    "file": "/workspace/Example.agda",
    "range": <exact UTF-16 range covering `not x = ?`>,
    "replacement": "not true = ?\nnot false = ?",
    "expectedSourceFingerprint": "…"
  }

# 5. Client filesystem action — not an agda-mcp tool:
#    verify the file's SHA-256 fingerprint, then replace precisely the returned
#    range with the returned replacement text.

# 6. Reload the edited file and obtain fresh goal handles.
agda_typecheck({
  "workspace": "workspace_…",
  "includeRaw": false
})
→ data.checked = true
→ data.goals = [{ "handle": "goal_…", … }, { "handle": "goal_…", … }]

For a refinement, use agda_refine in step 4 with an expression; it returns the same fingerprinted edits shape and follows the same apply-then-typecheck flow. Preview operations reload canonical Agda state before returning, so only goal handles from the latest response should be used.

For the faster compound forms, set includeContexts: true on step 1 to receive the goals and every goal context with the load result. Set apply: true on step 4—or enable --apply-edits once for the server—to have it perform steps 5 and 6 as one guarded transaction:

agda_case_split({ "goal": "goal_…", "variables": "x", "apply": true })
→ data.applied = true
→ data.checked = true
→ data.goals = <fresh handles from the edited module>

The preview flow remains the safe startup default and is useful when the client wants to inspect or revise the proposal before changing the file.

Related MCP server: agda-mcp-server

Requirements

  • Node.js 22 or newer

  • Agda installed separately and available as agda, or configured explicitly

  • Agda 2.8.0 for the currently verified protocol adapter

Other Agda versions start in unverified compatibility mode. The server does not bundle Agda or the standard library.

Installation and use

These commands install the published npm version. Features described for the unreleased 0.5.0 candidate require a source build or local tarball until that version is published; see INSTALL.md.

Install the CLI globally:

npm install --global agda-mcp
agda-mcp --help

Or run it without a global installation:

npx -y agda-mcp
# equivalent:
npm exec --yes agda-mcp

The default command starts an MCP stdio server. Stdout is reserved exclusively for MCP framing; operational diagnostics use stderr.

Legacy initialize and modern server/discover publish concise instructions that teach the client the core workflow: inspect effective policy, load an absolute module and optional request-selected workspace, prefer compound context retrieval, reuse only fresh opaque goal handles, and distinguish preview from guarded apply/typecheck transformations. The complete instruction block fits within the self-contained 512-character prefix recommended for Codex tool-selection guidance.

A generic model-selected workspace configuration looks like this:

{
  "mcpServers": {
    "agda": {
      "command": "npx",
      "args": ["-y", "agda-mcp", "--dynamic-workspaces"]
    }
  }
}

The server is installed once. The model then selects an active workspace on its first load instead of requiring a separate client entry for each project:

agda_load_module({
  "modulePath": "/absolute/path/to/project/Main.agda",
  "workspaceRoot": "/absolute/path/to/project"
})

Both paths must exist and be absolute. The server resolves symlinks, requires the module to remain within the selected root, discovers the nearest .agda-lib, and lazily starts or reuses that project's long-lived Agda process. agda_server_info reports this mode as capabilities.workspaceSelection: "request".

--dynamic-workspaces deliberately broadens the directories that MCP calls can target to anything accessible to the server process. Only enable it for a trusted local model/client. Without the flag, a supplied workspaceRoot must exactly match a configured root. The server otherwise uses MCP filesystem roots when the client publishes them, falling back to its working directory. The restricted configuration remains available when a fixed allowlist is preferred:

{
  "command": "npx",
  "args": ["-y", "agda-mcp"],
  "env": {
    "AGDA_MCP_OPTIONS": "{\"workspaceRoots\":[\"/absolute/path/to/project\"]}"
  }
}

Enable in-place transformations

Start the server with --apply-edits to make case split, refine, and auto write their proposed source changes and immediately typecheck them by default:

agda-mcp --apply-edits
# or
npx -y agda-mcp --apply-edits

For an MCP client configuration, add the flag to the command arguments:

{
  "command": "npx",
  "args": ["-y", "agda-mcp", "--apply-edits"]
}

It composes with runtime workspace selection:

npx -y agda-mcp --dynamic-workspaces --apply-edits

Clients that configure the server through the environment can equivalently set "applyEditsByDefault": true inside AGDA_MCP_OPTIONS. The command-line flag wins over an environment value. agda_server_info reports the effective mode as capabilities.transformationDefault.

This mode does not permit arbitrary writes: only edits proposed by Agda for the currently loaded, fingerprint-matching source are eligible. A particular tool call can still request apply: false to obtain a non-mutating preview.

Agent Skill and portable plugin

The Agda proof skill teaches incremental proof development using semantic MCP operations, preferring guarded mutations for authorized proof edits. The portable plugin pairs it with an exact npm server pin. See installation and updates for requirements, local plugin installation, workspace configuration, and acceptance checks.

Build a distributable archive with make pack-plugin; verify its pinned server on a temporary proof with make smoke-plugin. The archive and SHA-256 sidecar are written under .plugin-build/. This is separate from the server npm release pipeline. The npm package also includes skills/agda-proof and serves its files independently of the working directory and Agda installation.

Server-side skill discovery

The server advertises io.modelcontextprotocol/skills in capabilities.extensions through modern discovery and legacy initialization, and exposes:

  • skills/list: one complete skill entry, including verbatim YAML frontmatter and a manifest of every bundled skill file's URI, byte size, and SHA-256 digest.

  • skills/get({uri:"skill://agda-proof/SKILL.md"}): the same entry by URI.

  • resources/list and resources/read: the entrypoint, references, and UI metadata at skill://agda-proof/...; unknown resources return Invalid params.

Modern MCP and backward compatibility

The CLI uses the official v2 SDK's dual-era stdio entry. A modern client sends server/discover or another request with MCP 2026-07-28 metadata and proceeds without initialization. Every modern request carries its version and client capabilities in _meta; results include resultType, server identity, and the required cache fields on cacheable operations. For example, this newline-delimited JSON request discovers the modern server:

{"jsonrpc":"2.0","id":1,"method":"server/discover","params":{"_meta":{"io.modelcontextprotocol/protocolVersion":"2026-07-28","io.modelcontextprotocol/clientCapabilities":{}}}}

Include those two metadata fields on subsequent modern requests as well. io.modelcontextprotocol/clientInfo is optional. The server's identity appears in the response's _meta["io.modelcontextprotocol/serverInfo"], rather than a modern top-level serverInfo field. Unsupported version claims are rejected on every request, including after the connection has been established.

Existing clients continue to use initialize and notifications/initialized with the same 18 tools, inputs, normalized payloads, and application job handles. A modern discovery probe can be followed by a legacy initialization on the same stdio connection. No flag or separate executable is needed. Modern-capable SDK clients can opt into automatic negotiation or pin 2026-07-28; old SDK clients remain covered by the regression and packed-install tests.

Modern workspace-root discovery uses an input_required result containing roots/list, then resumes the original operation with the client's response. It happens before starting an Agda job and never emits a server-initiated JSON-RPC request to a modern client. Explicit configured roots or --dynamic-workspaces avoid that exchange; legacy client roots retain their existing request/response behavior. Long-lived Agda sessions and deferred jobs remain application state referenced by opaque workspace, goal, and job handles.

Progress is scoped to an in-flight request. Completion notices for deferred modern jobs go to stderr; legacy clients retain the existing logging notifications. Cancellation and EOF shut down active work and child processes. The server remains a stdio server; this upgrade does not add an HTTP endpoint.

Protocol and migration references: modern MCP, SDK dual-era stdio serving.

Catalog content is snapshotted for the life of a server instance so its digests and resource reads agree; restart after updating skill files. Discovery never starts Agda. Reading a resource is not skill activation or authorization: that remains the host's responsibility. When both the plugin and server expose the skill, hosts should preserve its origin rather than silently substituting one copy for the other.

Version 0.5.0 is prepared locally and must be published before the plugin's pinned npm command is available to other users. Test the unreleased tarball with npm run test:package and the local-package smoke option in INSTALL.md.

Configuration

Initialization policy is supplied as a JSON object in AGDA_MCP_OPTIONS. Unknown fields and invalid limits are rejected before an Agda process starts.

Option

Meaning

Default

agdaExecutable

Executable name or path resolved at server startup

agda

workspaceRoots

Allowed absolute roots for direct module targets

MCP roots or cwd

allowDynamicWorkspaces

Allow a load request to select a root outside workspaceRoots

false

includePaths

Extra project-relative include paths

[]

libraries

Additional registered Agda libraries

[]

libraryFile

Alternate Agda libraries file

Agda default

additionalFlags

Extra Cmd_load flags

[]

workspaceOverrides

Per-workspace include/library/flag overrides

[]

loadTimeoutMs

Load and restoration command timeout

120000

queryTimeoutMs

Read/query command timeout

30000

transformationTimeoutMs

Case split/refine/auto timeout

60000

commandTimeoutMs

Compatibility umbrella and installation-probe timeout

30000

maxQueuedCommands

Maximum running plus queued calls per workspace

64

rawResponseLimitBytes

Soft native-event return budget per command

131072

stderrReturnLimitBytes

Soft captured-stderr return budget

32768

maxCommandOutputBytes

Hard aggregate child-output limit

16777216

allowAgdaExec

Permit --allow-exec in resolved flags

false

abortGraceMs

Grace period before escalating an aborted command

1000

probeTimeoutMs

Installation-probe timeout

10000

probeMaxBufferBytes

Installation-probe output buffer

1048576

handleEntropyBytes

Random bytes per workspace/goal/job handle (min 16)

24

asyncMode

never, auto, or always; see below

auto

deferAfterMs

How long a tool call may block before deferring to a job

1000

maxJobWaitMs

Ceiling on a single agda_job_await wait

30000

jobRetentionMs

How long an uncollected finished job is kept

300000

maxTrackedJobs

Maximum concurrently tracked jobs

64

progressIntervalMs

Heartbeat for notifications/progress

2000

includeRawByDefault

Ship Agda's native event log

false

maxBatchGoals

Maximum goals one batched request may resolve

32

applyEditsByDefault

Apply/typecheck transformations when apply is omitted

false

Non-blocking operation

Typechecking a large development can take minutes, and holding the MCP request open for that whole time stalls the calling agent completely.

Slow calls defer by default so one expensive load does not hold an agent turn open indefinitely. A call that outruns deferAfterMs returns a job handle instead of blocking:

{
  "status": "pending",
  "job": { "id": "job_...", "tool": "agda_load_module", "state": "running", "elapsedMs": 1000 },
  "guidance": "Agda is still working ... call agda_job_await with job \"job_...\""
}

Agda keeps working in the background while the caller is free to do something else, and the result is collected later with agda_job_await. Calls that finish inside the window return their result inline, exactly as before, so fast operations are unchanged.

asyncMode controls the policy: auto (default) defers only calls slower than deferAfterMs, never always blocks until Agda finishes, and always defers every call. Set async: false on one call, or configure asyncMode: "never", when a client requires the legacy fully synchronous behavior.

Per-call overrides

The transport supports these per-call fields; the tool-specific ones are accepted only where indicated. Policy fields shadow configured values for one call only:

Field

Meaning

timeoutMs

Agda command timeout for this call

deferAfterMs

Defer window for this call, capped by maxJobWaitMs

async

true always returns a job handle; false blocks until Agda finishes

includeRaw

Include Agda's native event log (see below)

diagnosticsOnly

agda_load_module / agda_typecheck only: errors and warnings

includeContexts

agda_load_module / agda_typecheck only: include all goal contexts

apply

Transformation tools only: override server policy (true applies, false previews)

{ "modulePath": "/src/Slow.agda", "timeoutMs": 600000, "async": true }

The cap on deferAfterMs is deliberate: a per-call value can shorten the window but can never reintroduce unbounded blocking.

Progress and completion notices

While a request is open the server emits notifications/progress every progressIntervalMs, provided the client supplied a progress token. When any job settles it emits a notifications/message log line for legacy clients and a stderr completion notice for modern clients. Neither can wake an agent mid-turn — MCP has no such mechanism — but they surface activity in clients that display progress or server logs.

When work is fanned out across several workspaces, agda_job_await_any waits once for whichever job finishes first instead of polling each id in turn.

A deferred job is deliberately detached from the request that created it — the transport closing that request does not cancel the Agda work. Use agda_job_cancel to abandon a job.

When only the legacy commandTimeoutMs is supplied, it applies to all three operation categories. Specific timeout fields override it.

The nearest ancestor .agda-lib inside the selected workspace supplies project includes, dependencies, and flags. Configuration is merged deterministically with global and workspace overrides. Direct source targets must remain inside the selected workspace after canonical path resolution; without --dynamic-workspaces, that selected root must also be configured. Registered imports may live elsewhere.

Tools

Tool

Purpose

agda_server_info

Report Agda discovery, compatibility, capabilities, and sessions

agda_load_module

Select a workspace and load/typecheck one top-level module

agda_typecheck

Reload/typecheck the active workspace module

agda_retrieve_goals

Retrieve current visible goals and opaque handles

agda_retrieve_context

Retrieve a goal type, local context, and boundary

agda_retrieve_contexts

Retrieve contexts for several goals in one round trip

agda_retrieve_constraints

Retrieve current constraints

agda_case_split

Preview case-split clauses, or apply and typecheck them

agda_refine

Preview a refinement/introduction, or apply and typecheck it

agda_auto

Preview proof search, or apply and typecheck its solution

agda_normalize_expression

Normalize in top-level or goal-local scope

agda_infer_type

Infer a type in top-level or goal-local scope

agda_query_metavariables

Query visible and backend-published invisible metas

agda_job_await

Collect a pending job's result, waiting up to waitMs

agda_job_await_any

Wait for the FIRST of several jobs to finish

agda_job_status

Report a job's state without waiting

agda_job_cancel

Abort a pending job

agda_job_list

List jobs still running or awaiting collection

agda_load_module returns an opaque workspace handle. Goal-producing results return opaque goal handles bound to the module path, revision, source fingerprint, interaction point, and range. Reloading, recovering, switching modules, or completing any transformation preview invalidates older goal handles.

Expression tools require exactly one of workspace or goal. Input schemas are strict, so contradictory selectors and unknown properties fail before reaching Agda.

Response size

Agda's native event log is the largest part of most responses, so it is omitted by default. The raw field instead contains a summary — eventsOmitted, eventCount, byte counts, completeness, and stderr — so truncation stays detectable:

{ "adapter": "agda-2.8.0", "eventsOmitted": true, "eventCount": 7,
  "capturedBytes": 812, "totalBytes": 812, "stderr": { "chunks": [] } }

Set includeRaw: true for a call that needs the native event sequence, or set includeRawByDefault: true to restore it globally. A per-call value always wins over the server default.

MCP content contains only a compact human-readable summary. The complete normalized result is sent once in structuredContent, avoiding the previous cost of serializing and transmitting the same large object twice.

diagnosticsOnly: true further drops goals and invisibleMetavariables from a load or typecheck, leaving the verdict and diagnostics — useful for the common "did it compile?" question.

Batched goal contexts

For the common load-and-inspect path, includeContexts: true on agda_load_module or agda_typecheck retrieves every newly returned goal context in that same operation. It uses the same bounded aggregation policy as the explicit batch tool below.

agda_retrieve_contexts takes a list of goal handles and returns one entry per goal, in request order:

{ "requested": 3, "succeeded": 2, "failed": 1,
  "contexts": [ { "goal": "goal_...", "ok": true, "context": { "goalType": "Bool", "context": [] } },
                { "goal": "goal_bad", "ok": false, "error": { "code": "STALE_GOAL_HANDLE" } } ] }

Agda still processes the goals one at a time — the interaction process is single-threaded — but the caller pays for one round trip instead of N.

A batch is limited to maxBatchGoals goals. Only failures attributable to one goal — a stale handle, or a command Agda rejected, timed out on, or answered too voluminously — become that goal's entry. Anything describing the session or the batch (SOURCE_CHANGED, NO_ACTIVE_MODULE, UNKNOWN_WORKSPACE, a dead process, a cancellation) aborts the whole call, because the remaining goals could not be answered either.

The returned raw merges every command that ran and is re-truncated against a single rawResponseLimitBytes budget, so a batch cannot build a response larger than one command may. The combined omittedSha256 covers each source transcript's own omission digest followed by every event the merge dropped.

Transformation previews and guarded direct edits

Case split, refine, and auto select their behavior from the per-call apply value when present, otherwise from the server policy. With the default policy or apply: false, they use the non-mutating preview transaction:

  1. Validate the goal handle and loaded source fingerprint.

  2. Ask Agda for a proposal.

  3. Recheck the file fingerprint.

  4. Map the native response to TextEdit values against the immutable snapshot.

  5. Reload the active module before returning, even when the proposal is rejected.

  6. Return fresh restored goals and separate operation/restore transcripts.

Each edit carries its absolute file path, exact UTF-16 range, replacement text, and expected SHA-256 source fingerprint. Clients should verify that fingerprint before applying an edit, then call agda_typecheck. If restoration fails, the server terminates and invalidates the session and returns no safe proposal.

With apply: true, or when --apply-edits supplies that default, the server verifies the proposal targets the active module and fingerprint, rechecks the source immediately before writing, replaces the file atomically, and reloads/typechecks it once. The result reports applied, checked, diagnostics, the new source fingerprint, and fresh goal handles. If the canonical reload itself fails, the server attempts a fingerprint-guarded rollback and refuses that rollback when the edited fingerprint no longer matches. Changes detected during proposal generation or immediately before an atomic replacement are rejected. File mutation is therefore opt-in per transformation call or server startup, while preview remains available as an explicit override. An ordinary Agda type error is a completed result (checked: false), so the applied source remains on disk and its diagnostics are returned for the caller to address; rollback is reserved for failures that prevent a trustworthy canonical result.

Literate prose and code delimiters are excluded from editable code regions. An ambiguous or cross-region proposal fails with UNSUPPORTED_EDIT_SHAPE.

Output limits and recovery

raw retains complete native JSON events up to the soft response budget. When the budget is exceeded, normalized data still returns with byte counts, omitted event count, and an omission digest. Stderr has an independent soft budget. Crossing the hard aggregate limit aborts the command with OUTPUT_LIMIT_EXCEEDED.

Workspace calls are FIFO; different workspaces progress concurrently. Active cancellation first asks Agda to abort and terminates it after a bounded grace period. After an unexpected exit, old handles are revoked. The next workspace operation starts a fresh process and reloads only if the source fingerprint is unchanged.

Upgrading Agda

After installing or switching Agda, restart the MCP server. On every server start it resolves agda again and reprobes the exact version, Agda application directory, and data directory; it does not cache installation or library locations across runs.

That restart is sufficient when the new version still speaks the supported interaction protocol. Agda 2.8.0 is verified. A different detected version is reported as unverified and uses the 2.8.0 adapter conservatively. If a required command or response shape changed, the affected call returns UNSUPPORTED_AGDA_PROTOCOL with native evidence. Upgrade agda-mcp to a version containing an adapter for that Agda release (or contribute one) before relying on those operations.

Development

npm ci
npm run typecheck
npm test
npm run test:fuzz
npm run test:integration
npm run build
npm run smoke
npm run test:package
npm pack --dry-run

The deterministic fuzz campaign combines grammar-aware properties, arbitrary protocol bytes, recorded-corpus mutation, Unicode range/edit properties, strict schema properties, and queue-policy properties. Defaults are 1,000 cases per property and 5,000 corpus mutations. Longer campaigns can be configured with AGDA_MCP_PROPERTY_RUNS, AGDA_MCP_FUZZ_RUNS, and AGDA_MCP_FUZZ_SEED.

Releasing

Subsequent releases are published to npm and GitHub by .github/workflows/release.yml. Before using the workflow for the first time, configure the agda-mcp package on npmjs.com with this trusted publisher:

  • Provider: GitHub Actions

  • Organization or user: peterthiemann

  • Repository: agda-mcp

  • Workflow filename: release.yml

  • Environment: none

  • Allowed action: npm publish

No npm token or GitHub Actions secret is required. The workflow uses a short-lived OpenID Connect credential and npm automatically records provenance for the public package.

For a release, synchronize package.json, package-lock.json, src/version.ts, plugin.json, and the exact agda-mcp@X.Y.Z pin in mcp.json. Update the versioned examples in INSTALL.md as well. The npm version command updates only the two npm metadata files; it does not update the source constant or plugin configuration. For the prepared 0.5.0 release:

npm version 0.5.0 --allow-same-version --no-git-tag-version
# Update src/version.ts, plugin.json, mcp.json, and INSTALL.md to match.
npm run typecheck
npm run test:all
npm run build
npm run test:package
make check-plugin
make pack-plugin
# Run both local-tarball smoke checks from INSTALL.md before publishing.
git add package.json package-lock.json src/version.ts plugin.json mcp.json INSTALL.md
git commit -m "Release 0.5.0"
git push
git tag -a release-0.5.0 -m "Release 0.5.0"
git push origin release-0.5.0

Commit the complete implementation and skill before tagging, including all new files; the git add line above lists the version-related files only. Tags may be named release-X.Y or release-X.Y.Z; a two-part version normalizes to X.Y.0 and must match package.json exactly. Pushing the tag publishes the npm server through the workflow. The plugin ZIP is built separately with make pack-plugin; the release workflow currently attaches only the npm tarball and its checksum, not the plugin ZIP. Publish the pinned npm version before distributing the plugin for normal registry-backed installation.

The tag workflow validates the version, installs from the lockfile, runs the typecheck and complete test suite, builds and smoke-tests the executable, packs the exact tarball, publishes that tarball to npm through trusted publishing, and finally creates the GitHub release with the tarball and its SHA-256 file. Changing the workflow alone does not publish a package. Publishing runs on a matching release-* tag push, or a manual workflow dispatch naming an existing release tag. npm versions are immutable, so verify the version before pushing the tag.

Genesis and Codex involvement

This project began as a design dialogue between the project maintainer and OpenAI Codex, operating as a GPT-5-based coding agent. The maintainer set the goals and made the consequential design choices: a standalone TypeScript server, one long-lived Agda interaction process per workspace, a transport-independent application API with stdio first, support for all three on-disk Agda source formats, opaque goal handles, normalized responses retaining native events, and non-mutating transformation previews with mandatory reload.

Codex turned that dialogue into the initial design and implementation plan, then implemented the repository in reviewed checkpoints. Its work included the protocol codec and streaming parser, process/session management, the initial twelve MCP tools, literate-source edit planning, recovery and packaging, documentation, and the unit, integration, property-based, mutation-fuzz, live-Agda, and MCP stdio tests. Codex also staged, committed, pushed, and followed the CI results under the maintainer's explicit repository authorization. The maintainer remained the project owner and decision-maker throughout; this history records substantial AI-assisted design and implementation, not an OpenAI endorsement of the software.

Design and license

Available Tools

18 tools
agda_autoC

Run Agda proof search using the server mutation policy; apply overrides it

NameRequiredDescriptionDefault
goalYesOpaque goal handle returned by the latest module state
applyNoOverride the server policy: true applies/typechecks; false previews
asyncNotrue always returns a job handle; false blocks until Agda finishes
queryNoAgda auto search options
timeoutMsNoOverride the configured Agda command timeout for this call
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, yet 'server mutation policy' is never explained: it does not say whether proof search mutates the module state, what the default policy is, or what happens on failure. Async, timeout, and deferral behavior are only visible in the schema, not in the description.

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?

It is a single front-loaded sentence with no wasted words. However, the compression leaves key terms like 'server mutation policy' undefined, making it concise at the cost of clarity.

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

Completeness2/5

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

For a seven-parameter, goal-mutating proof-search tool with no annotations and no output schema, the description is far too thin. It never explains the mutation policy, the async/job-handle behavior, or default versus overridden settings, leaving the agent to infer critical behavior from parameter names alone.

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 all seven parameters including goal, apply, async, query, timeoutMs, includeRaw, and deferAfterMs are already documented in the schema. The description's mention that 'apply overrides it' merely restates the schema and adds no new syntax or format detail, 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: 'Run Agda proof search'. It is distinguishable from siblings like agda_refine and agda_case_split by the proof-search framing, though the trailing clause 'apply overrides it' is oblique and does not clarify how it differs from other goal-mutating tools.

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?

There is no guidance on when to choose this over agda_refine or agda_case_split, nor on prerequisites such as having a valid goal handle from the latest module state. The only routing hint is the cryptic 'using the server mutation policy; apply overrides it', which does not tell the agent when to invoke the tool.

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

agda_case_splitC

Case split using the server mutation policy; apply overrides that policy

NameRequiredDescriptionDefault
goalYesOpaque goal handle returned by the latest module state
applyNoOverride the server policy: true applies/typechecks; false previews
asyncNotrue always returns a job handle; false blocks until Agda finishes
timeoutMsNoOverride the configured Agda command timeout for this call
variablesNoPattern variables to split; empty splits the result
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs

TDQS

C2.5/5.0
Behavior2/5

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

With no annotations provided, the description must carry the full behavioral burden. It hints at a server mutation policy and an override via apply, but does not explain what gets mutated, whether preview is the default, or what side effects to expect.

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

Conciseness3/5

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

The description is short and front-loads "Case split," but the semicolon clause about server mutation policy is ambiguous and weakly structured. It is concise but not as clear or informative as a well-structured definition would be.

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

Completeness2/5

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

The tool has seven parameters and no annotations or output schema, so the description should do more to explain the operation and its behavioral implications. Instead, it is too sparse to fully orient an agent beyond what the parameter schema already says.

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 input schema already documents all seven parameters thoroughly. The description adds no parameter-specific details beyond the schema, making the baseline score of 3 appropriate.

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

Purpose3/5

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

The phrase "Case split" identifies the operation, but it lacks an explicit object such as the Agda goal being split and does not distinguish this tool from siblings like agda_refine or agda_auto. The remainder of the description focuses on server mutation policy rather than clarifying the tool's purpose.

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 guidance about when to use this tool, when not to use it, or which sibling tool is the alternative. Mentioning that "apply overrides that policy" describes a parameter behavior, not a usage condition.

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

agda_infer_typeC

Infer the type of an expression in workspace or goal-local scope

NameRequiredDescriptionDefault
goalNo
asyncNotrue always returns a job handle; false blocks until Agda finishes
rewriteNo
timeoutMsNoOverride the configured Agda command timeout for this call
workspaceNo
expressionYes
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs

TDQS

C2.7/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It does not disclose whether inference is read-only, how async/job handles work, what timeout or defer behavior means, whether raw logs are returned, or what rewrite modes do.

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?

The description is a single front-loaded sentence with no wasted words. It is concise, though its brevity leaves important details unstated for a complex 8-parameter tool.

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

Completeness2/5

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

Given 8 parameters, no annotations, no output schema, and only 50% schema coverage, the description is not complete enough. It omits async/job behavior, rewrite options, timeout/raw-log controls, and the read-only nature of type inference.

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

Parameters2/5

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

There are 8 parameters with only 50% schema description coverage. The description clarifies that workspace and goal determine scope and names expression, but it omits the rewrite enum, async job behavior, timeoutMs, includeRaw, and deferAfterMs semantics.

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 states a specific verb and resource: infer the type of an expression. It also names the scope, workspace or goal-local, which helps distinguish the context. However, it does not differentiate from siblings such as agda_typecheck or agda_normalize_expression.

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 explicit guidance on when to use this tool versus alternatives. It implies usage through the words "infer the type," but does not explain when to choose it over agda_typecheck, agda_normalize_expression, or other query tools.

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

agda_job_awaitA

Collect the result of a pending Agda job, waiting up to waitMs; returns pending again if still running

NameRequiredDescriptionDefault
jobYesJob id returned by a pending tool result
waitMsNoMilliseconds to wait for completion before returning pending again

TDQS

A3.7/5.0
Behavior4/5

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

With no annotations, the description carries the full burden and does disclose the two behaviors that matter: the call blocks for up to waitMs, and it degrades to a pending result rather than failing when the job is still running. It omits error/failure-job behavior and any note on calling repeatedly on the same job id.

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; the blocking behavior and the pending fallback are both stated compactly and nothing is wasted.

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

Completeness3/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 should carry return-value semantics, and it only covers the pending case — what a completed result looks like (result shape, statuses, completed vs failed) is unstated. For a 2-param job-polling tool this is adequate but leaves a clear gap.

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 both parameters are already fully documented in the schema and the description merely restates waitMs. It adds no format or edge-case hints (e.g. waitMs=0 meaning an immediate poll) beyond what the schema provides.

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?

Clear verb+resource: 'Collect the result of a pending Agda job' tells an agent exactly what the call delivers. However, it does not distinguish itself from near siblings like agda_job_status or agda_job_await_any, which an agent could easily confuse with this blocking variant.

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?

'waiting up to waitMs; returns pending again if still running' implies the blocking use case and the poll-loop pattern that follows from it. But it never states when to prefer this over agda_job_status (non-blocking check) or agda_job_await_any (wait on multiple jobs), leaving sibling selection to inference.

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

agda_job_await_anyA

Wait for the FIRST of several pending jobs to finish; use after fanning work out across workspaces

NameRequiredDescriptionDefault
jobsNoJob ids to race; omit to await every tracked job
waitMsNoMilliseconds to wait for the first completion before returning pending

TDQS

A3.7/5.0
Behavior3/5

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

No annotations, so the description carries the behavioral burden; it does disclose the race semantics (returns on first completion rather than all), which is the key trait. However it says nothing about what is returned — the winning job id, its status, or what happens when the waitMs budget expires — leaving a meaningful gap.

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 semicolon-joined sentence with the semantics front-loaded and the usage hint second. No filler, no redundancy with the schema.

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

Completeness3/5

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

With no annotations and no output schema, the description should say what the caller receives on first completion versus on timeout. It conveys the trigger condition but not the result shape, so it is only partially complete for a tool whose return value matters most.

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 both `jobs` (race set, omit to await all tracked) and `waitMs` (timeout before returning pending) are already fully documented. The description adds only the 'FIRST' framing and nothing about ordering or default waitMs behavior, so 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 (wait) and resource (pending jobs) with the distinguishing scope 'FIRST of several', which separates it from a single-job await. It stops short of naming the sibling agda_job_await/agda_job_status, so the differentiation is implied rather than explicit.

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

Usage Guidelines4/5

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

'use after fanning work out across workspaces' gives a clear usage context that tells the agent this is a post-fan-out aggregation call. There is no when-not guidance or explicit pointer to agda_job_await for single-job cases, which keeps it from a 5.

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

agda_job_cancelA

Abort a pending Agda job and release its Agda command slot

NameRequiredDescriptionDefault
jobYesJob id returned by a pending tool result

TDQS

A3.8/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full behavioral burden. It discloses the key side effect (slot release) but leaves open permissions, behavior on already-completed/unknown jobs, and whether the job's results become unrecoverable.

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 short sentence, front-loaded with the verb and resource, with zero filler. Every clause earns its place by adding the side-effect detail.

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-parameter cancel tool with full schema coverage and no output schema, the description covers purpose, scope, and effect sufficiently to invoke it correctly. Missing only edge-case behavior for non-pending jobs.

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 coverage is 100% and the single 'job' parameter is already documented as 'Job id returned by a pending tool result'. 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.

Purpose5/5

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

States a specific verb ('Abort') and resource ('a pending Agda job') and adds the concrete effect ('release its Agda command slot'). No sibling tool cancels jobs, and the description makes its distinct role obvious against agda_job_await / agda_job_status.

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?

The word 'pending' implicitly scopes usage to not-yet-completed jobs, which is genuinely useful guidance. But it never says what to do instead (agda_job_status to check state, agda_job_await to wait) or how it behaves on non-pending jobs.

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

agda_job_listA

List Agda jobs that are still running or awaiting collection

NameRequiredDescriptionDefault

No parameters

TDQS

A3.6/5.0
Behavior3/5

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

With no annotations, the description must carry the behavioral load, and it does disclose one meaningful trait: that finished/collected jobs are excluded from the result. It says nothing about ordering, whether job IDs are returned for reuse, or that it is a non-blocking read, which leaves the read semantics only partly covered.

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 the scope qualifier placed immediately after the resource. Zero filler and nothing an agent must read past to find the point.

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

Completeness3/5

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

For a no-param, no-annotation, no-output-schema tool, the description should say roughly what each entry contains (at minimum that job IDs are returned so they can be fed to agda_job_status/await). That chaining detail is missing, so the definition is usable but incomplete for an agent orchestrating the job tools.

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?

The schema declares zero parameters and 100% description coverage, so there is nothing for the description to disambiguate. The scope qualifier in the description is the only semantics available, and it is consistent with the empty schema.

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 states a specific verb ('List') and resource ('Agda jobs') and narrows scope to jobs that are 'still running or awaiting collection'. That scope filter implicitly separates it from agda_job_status (single-job lookup) and agda_job_await (blocking wait), though neither sibling is named explicitly.

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 only implied: an agent can infer this is how you enumerate in-flight jobs before calling agda_job_status, agda_job_await or agda_job_cancel, but the description never says when to prefer one of those siblings instead. No exclusions or prerequisites are stated.

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

agda_job_statusB

Report the state of a pending Agda job without waiting for it

NameRequiredDescriptionDefault
jobYesJob id returned by a pending tool result

TDQS

B3.4/5.0
Behavior3/5

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

No annotations are provided, so the description carries full disclosure burden. It does contribute one genuinely useful trait — the call is non-blocking and returns immediately rather than awaiting completion — but it says nothing about what states are reported (pending/done/failed), what happens with an invalid or expired job id, or whether the job remains pollable afterward.

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?

A single compact sentence with the non-blocking property front-loaded; nothing is wasted. It is terse to the point of omitting useful state/error detail, but there is no filler.

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

Completeness3/5

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

For a simple one-parameter read tool with full schema coverage and no output schema, the description is close to adequate, but it never states which states can be reported or how terminal states are surfaced, which is the main thing an agent needs before deciding to poll versus await.

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 coverage is 100% and the single 'job' parameter is documented as 'Job id returned by a pending tool result,' so the schema fully carries parameter semantics. The description adds nothing beyond that, which is the expected baseline for a one-param tool.

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?

Specific verb ('Report the state') plus a specific resource ('a pending Agda job'), which clearly separates it from agda_job_await and agda_job_await_any, which block on the job. The differentiating clause 'without waiting for it' is implicit rather than naming siblings, so it falls just short of 5.

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?

The phrase 'without waiting for it' hints that this is the non-blocking/polling alternative to agda_job_await, but no alternative is named and no explicit when-to-use or when-not-to-use guidance is given. Usage must be inferred from the contrast with sibling names.

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

agda_load_moduleA

Load and typecheck one top-level Agda module from disk; with --dynamic-workspaces, pass workspaceRoot to select its workspace at runtime

NameRequiredDescriptionDefault
asyncNotrue always returns a job handle; false blocks until Agda finishes
timeoutMsNoOverride the configured Agda command timeout for this call
includeRawNoInclude Agda's native event log; omitted by default because it is large
modulePathYesAbsolute path to an .agda, .lagda, or .lagda.md file
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs
workspaceRootNoAbsolute workspace root containing modulePath; roots outside the configured allowlist require --dynamic-workspaces
diagnosticsOnlyNoReturn only errors and warnings, dropping goals and metavariables
includeContextsNoRetrieve every returned goal context in the same MCP operation

TDQS

A3.5/5.0
Behavior3/5

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

No annotations are provided, so the description carries the full burden. It discloses the disk-loading scope and the workspace allowlist constraint, but says nothing about blocking behavior, job handles, error/failure semantics, or what gets loaded into the Agda process state—gaps that matter for a tool with async and defer options.

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 dense sentence with the core action front-loaded and the conditional clause second. Zero wasted words.

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

Completeness3/5

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

For an 8-parameter tool with no output schema and no annotations, the description is thin: it never mentions the job-handle model implied by async/deferAfterMs, nor result shape. The schema covers parameters, but the description leaves the overall operating model underspecified.

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 every parameter is already documented in structured form; the description only echoes the workspaceRoot/--dynamic-workspaces condition. Baseline 3 is appropriate since the schema does the heavy lifting.

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 ('Load and typecheck one top-level Agda module from disk') with clear scope. However, it never distinguishes itself from the sibling tool agda_typecheck, so an agent cannot tell from the description alone which one to pick.

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?

The only usage guidance is conditional: pass workspaceRoot with --dynamic-workspaces to select a workspace. There is no statement of when to use this tool versus agda_typecheck or the job tools, so the primary routing decision is left to inference.

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

agda_normalize_expressionC

Normalize an expression in workspace or goal-local scope

NameRequiredDescriptionDefault
goalNo
modeNo
asyncNotrue always returns a job handle; false blocks until Agda finishes
timeoutMsNoOverride the configured Agda command timeout for this call
workspaceNo
expressionYes
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs

TDQS

C2.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden, yet it says nothing about the async/job-handle model, blocking behavior, or timeouts that dominate the parameter set. The only behavioral hint is the vague scope distinction, which is far from sufficient for an 8-parameter tool.

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

Conciseness3/5

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

It is a single front-loaded sentence with no filler, so it is concise. But it is concise by omission rather than by precision – the one sentence could easily carry the missing scope and behavior context without becoming bloated.

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

Completeness2/5

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

For a tool with 8 parameters, an async job model, no annotations, and no output schema, the description is well short of what an agent needs to invoke it correctly. The scope distinction is the only real content and even that is under-explained.

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

Parameters2/5

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

Schema coverage is only 50%, and the description explains only the workspace/goal scope split, adding no meaning for the four undocumented parameters. Notably the mode enum (ignore_abstract, head, use_show_instance) is left completely unexplained despite being central to how normalization behaves.

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

Purpose3/5

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

The description names a specific verb+resource (normalize an expression), which is clearer than a tautology. However, it never explains what 'normalize' produces in Agda terms (a normal form) and the phrase 'workspace or goal-local scope' is ambiguous, so an agent cannot confidently distinguish this from siblings like agda_infer_type or agda_auto.

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?

There is no statement of when to use this tool versus alternatives. With siblings such as agda_infer_type, agda_refine, and agda_auto, the absence of any routing guidance leaves the agent to guess which tool applies to a given proof state.

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

agda_query_metavariablesC

Query visible and interaction-backend invisible metavariables

NameRequiredDescriptionDefault
asyncNotrue always returns a job handle; false blocks until Agda finishes
timeoutMsNoOverride the configured Agda command timeout for this call
workspaceYesOpaque workspace handle returned by agda_load_module
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. 'Query' implies a read operation, but the description does not explain async/job behavior, whether the call blocks, what visible versus invisible metavariables means operationally, or what the response contains.

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?

The description is a single compact sentence with no wasted words and the core resource is front-loaded. It is perhaps too terse, but that is a completeness issue rather than a conciseness problem.

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

Completeness2/5

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

There are five parameters, no annotations, and no output schema, yet the description is only one sentence. It does not explain the job-handle/async model, return values, or how querying metavariables relates to the surrounding Agda workflow tools.

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 all five parameters are already documented in the schema, including async, timeoutMs, workspace, includeRaw, and deferAfterMs. The description adds no parameter-specific meaning beyond the schema baseline.

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 states a specific verb and resource: 'Query ... metavariables'. It also narrows scope to visible and interaction-backend invisible metavariables, but does not explicitly distinguish this from sibling tools like agda_retrieve_goals or agda_retrieve_constraints.

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?

It says what the tool queries but gives no guidance on when to use it instead of alternatives such as agda_retrieve_goals or agda_retrieve_constraints. There are no exclusions, prerequisites, or contextual cues for tool selection.

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

agda_refineC

Refine using the server mutation policy; apply overrides that policy

NameRequiredDescriptionDefault
goalYesOpaque goal handle returned by the latest module state
applyNoOverride the server policy: true applies/typechecks; false previews
asyncNotrue always returns a job handle; false blocks until Agda finishes
timeoutMsNoOverride the configured Agda command timeout for this call
expressionNoExpression to give; empty or omitted requests intro/refine
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs
usePatternLambdaNo

TDQS

C2.3/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden. It hints that the operation is governed by a server mutation policy and can be overridden, but never states what is mutated, whether a preview is a dry run, or what a job handle implies — and the apply/override point is already spelled out in the schema.

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

Conciseness3/5

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

It is a single short sentence with no padding, but the second clause duplicates what the schema already says about `apply`, so one of the two clauses does not earn its place. Being brief here reads as under-specification rather than efficiency.

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

Completeness2/5

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

This is an 8-parameter mutating tool with no annotations and no output schema; the description should at least explain the refine operation, the preview-vs-apply default, and whether a job handle or inline result comes back. The rich schema covers parameters, but the core operation and mutation semantics remain unexplained.

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 88%, so nearly every parameter (goal, apply, async, expression, deferAfterMs, includeRaw) is already documented in the schema. The description adds nothing parameter-specific beyond repeating the apply override, so the baseline 3 applies.

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

Purpose2/5

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

"Refine using the server mutation policy" largely restates the tool name and adds a policy reference, but never says what is being refined (a goal hole / metavariable) or what refinement means in Agda terms. It gives no basis for distinguishing it from siblings like agda_auto, agda_case_split, or agda_infer_type.

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 only usage-adjacent statement is "apply overrides that policy," which describes a parameter rather than when to choose this tool. There is no mention of when to use refine versus auto, case_split, or infer_type, and no prerequisite such as requiring a loaded module or goal handle.

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

agda_retrieve_constraintsC

Retrieve constraints for the active module in a workspace

NameRequiredDescriptionDefault
asyncNotrue always returns a job handle; false blocks until Agda finishes
timeoutMsNoOverride the configured Agda command timeout for this call
workspaceYesOpaque workspace handle returned by agda_load_module
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden, yet it says nothing about blocking versus job-handle behavior, timeouts, or error conditions even though the parameters (async, deferAfterMs, timeoutMs) reveal this is a potentially long-running, deferrable call. The only behavioral fact added is the 'active module' scope.

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?

A single front-loaded sentence with no filler and no redundancy. It is efficient, though its brevity leaves the guidance gaps noted elsewhere.

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

Completeness2/5

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

For a tool with async deferral, timeouts, and no annotations or output schema, the description never explains what a constraint result looks like or how the job-handle path behaves. It is too thin for the tool's operational complexity, even though the schema covers the parameters.

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 every parameter (async, timeoutMs, workspace, includeRaw, deferAfterMs) is already documented in the schema, which sets the baseline at 3. The description adds only the notion of an 'active module' and no per-parameter meaning.

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 ('Retrieve') and resource ('constraints') scoped to 'the active module in a workspace', so an agent can tell what it returns. It does not differentiate itself from close siblings such as agda_retrieve_goals or agda_retrieve_context, so it stops short of 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?

There is no statement of when to use this rather than agda_retrieve_goals, agda_retrieve_context, or agda_query_metavariables, and no prerequisites or exclusions are given. The agent must infer the choice 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.

agda_retrieve_contextC

Retrieve the type and local context for an opaque goal handle

NameRequiredDescriptionDefault
goalYesOpaque goal handle returned by the latest module state
asyncNotrue always returns a job handle; false blocks until Agda finishes
rewriteNo
timeoutMsNoOverride the configured Agda command timeout for this call
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs

TDQS

C2.9/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full burden of behavioral disclosure. It does not mention read-only behavior, async/job-handle semantics, blocking versus non-blocking behavior, timeout implications, or side effects, despite parameters like async, deferAfterMs, and includeRaw implying non-trivial execution behavior.

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?

The description is a single front-loaded sentence with no filler or redundancy. It is efficiently sized and easy to scan, even though its brevity contributes to gaps captured in other dimensions.

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

Completeness2/5

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

This is a 6-parameter tool with no annotations and no output schema, yet the description omits return shape, async/job behavior, error semantics, and relationship to the plural sibling agda_retrieve_contexts. It gives the basic purpose but is not complete enough for confident invocation in non-trivial cases.

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 83%, so the schema already documents most parameters, and this sets the baseline at 3. The description reinforces that the goal parameter is an opaque handle, but it adds no meaning for rewrite, async, timeoutMs, includeRaw, or deferAfterMs beyond what the schema provides.

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 states a specific verb and resource: retrieve the type and local context for a goal handle. It is clear what the tool returns, but it does not distinguish itself from the near-duplicate sibling agda_retrieve_contexts (plural) or from agda_retrieve_goals.

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?

There is no when-to-use guidance, no prerequisites, and no mention of alternatives. With a sibling named agda_retrieve_contexts, an agent has no description-based way to decide which context-retrieval tool to call.

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

agda_retrieve_contextsB

Retrieve types and local contexts for several goal handles in one round trip

NameRequiredDescriptionDefault
asyncNotrue always returns a job handle; false blocks until Agda finishes
goalsYesGoal handles to fetch contexts for, in one round trip
rewriteNo
timeoutMsNoOverride the configured Agda command timeout for this call
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs

TDQS

B3.2/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full behavioral burden. It only discloses batching; it says nothing about the async/job-handle behavior, timeout and deferral semantics, what happens with invalid goal handles, or whether results are ordered per goal.

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; the scope constraint is stated first and nothing is repeated.

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

Completeness2/5

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

For a 6-parameter tool with no annotations and no output schema, one sentence is not enough. An agent still lacks the return shape (how contexts map to each goal handle), the async/defer contract, and how this relates to agda_retrieve_goals versus agda_retrieve_context.

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 83%, so the schema already documents goals, async, timeoutMs, includeRaw, and deferAfterMs. The description adds only the batching context for goals and nothing for rewrite (which lacks a schema description) or the other parameters, so 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 (retrieve) and resource (types and local contexts) scoped to 'several goal handles'. The 'several ... one round trip' framing implicitly distinguishes it from the singular sibling agda_retrieve_context, but never names that sibling explicitly.

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?

The phrase 'in one round trip' implies this is the batch variant to use when multiple goals need contexts, which is useful implied guidance. However, there is no explicit when-to-use/when-not rule, no mention of the singular agda_retrieve_context alternative, and no preconditions such as needing loaded goals.

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

agda_retrieve_goalsC

Retrieve the current visible goals and opaque handles

NameRequiredDescriptionDefault
asyncNotrue always returns a job handle; false blocks until Agda finishes
timeoutMsNoOverride the configured Agda command timeout for this call
workspaceYesOpaque workspace handle returned by agda_load_module
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs

TDQS

C2.5/5.0
Behavior2/5

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

No annotations are provided, so the description bears the full disclosure burden. It says nothing about the tool's asynchronous nature, its blocking behavior, or that it can return a job handle instead of goals (flags that exist in the schema as async/deferAfterMs). For a tool in a job-handle-based workflow, that omission forces the agent to infer behavior from parameter names alone.

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

Conciseness3/5

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

One short sentence with no filler and the object front-loaded, so nothing is wasted. But at eight words it crosses from concise into under-specified, and "opaque handles" adds ambiguity rather than information.

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

Completeness2/5

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

This is a five-parameter tool with async/job-handle semantics, no annotations, and no output schema. The description does not explain what a "handle" is, that results may be deferred into a job, or what the returned goals look like — leaving the agent to reconstruct the interaction model from parameter names.

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%, with every parameter documented in-schema (workspace handle provenance, async semantics, timeout override, includeRaw size caveat). The description adds nothing beyond the schema, so the baseline of 3 applies.

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

Purpose3/5

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

States a verb ("Retrieve") and an object ("current visible goals and opaque handles"), so the intent is roughly graspable. However, "opaque handles" is undefined jargon and there is no differentiation from closely related siblings such as agda_query_metavariables, agda_retrieve_constraints, or agda_retrieve_context. An agent cannot tell from this sentence which of those four it should call.

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?

There is no when-to-use guidance, no prerequisite (e.g., a loaded module), and no mention of alternatives. The only cue is implicit in "current visible goals", which assumes the reader already knows the Agda interaction model.

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

agda_server_infoB

Report the detected Agda installation, compatibility, and active workspaces

NameRequiredDescriptionDefault
asyncNotrue always returns a job handle; false blocks until Agda finishes
timeoutMsNoOverride the configured Agda command timeout for this call
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs

TDQS

B3.4/5.0
Behavior2/5

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

No annotations are provided, so the description carries the full disclosure burden, and it omits important behavior. Most notably, the schema exposes async and deferAfterMs parameters, meaning this call can return a job handle and block or defer — none of that is mentioned. It also says nothing about cost, permissions, or whether the probe touches the filesystem/Agda binary.

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 front-loaded sentence listing the three reported items with zero filler. Nothing in it is redundant given the schema handles parameters.

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?

With no output schema, the description does at least enumerate what gets reported (installation, compatibility, workspaces), which covers the return content at a high level. The main gap is the async/job-handle behavior implied by the parameters, which an agent would only discover from the schema.

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 all four parameters (async, timeoutMs, includeRaw, deferAfterMs) are already documented in the schema with good detail. The description adds no parameter-level meaning beyond the resource list, 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 uses a specific verb ('Report') with three concrete resources: detected Agda installation, compatibility, and active workspaces. This clearly separates it from the action-oriented siblings (load, typecheck, job_*), though it never explicitly contrasts itself with them.

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 only implied: an agent can infer this is a diagnostic/environment-inspection call, likely useful before typechecking or when workspace state is unknown. There is no explicit 'call this when…' statement, no prerequisites, and no mention of alternatives.

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

agda_typecheckC

Reload and typecheck the active module in a workspace

NameRequiredDescriptionDefault
asyncNotrue always returns a job handle; false blocks until Agda finishes
timeoutMsNoOverride the configured Agda command timeout for this call
workspaceYesOpaque workspace handle returned by agda_load_module
includeRawNoInclude Agda's native event log; omitted by default because it is large
deferAfterMsNoHow long this call may block before returning a job handle; capped by maxJobWaitMs
diagnosticsOnlyNoReturn only errors and warnings, dropping goals and metavariables
includeContextsNoRetrieve every returned goal context in the same MCP operation

TDQS

C2.9/5.0
Behavior2/5

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

With no annotations, the description carries the full behavioral burden, but it only states the core action. It omits important traits such as long-running execution, job-handle/blocking behavior, and what diagnostics or goals are returned.

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 wasted words. The brevity is efficient, though it leaves gaps that are better scored under contextual completeness.

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

Completeness2/5

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

The description is incomplete for a typechecking tool with no output schema: it never explains what is returned (e.g., goals, diagnostics, job handle). Schema parameters cover inputs, but an agent cannot tell from the description what a successful result looks like.

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 all seven parameters are documented in the schema. The description adds no parameter semantics beyond that baseline.

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 states a specific compound verb ('Reload and typecheck') and resource ('active module in a workspace'), so the core action is clear. It does not explicitly distinguish itself from sibling agda_load_module or say whether the module must already be loaded, so it stops short of full sibling differentiation.

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?

No when-to-use or when-not-to-use guidance is provided, and no alternative sibling tools are named. The agent must infer that this is for re-checking an already-loaded module rather than initial loading.

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. 18 tool updatesv0.3.1
    • Changedagda_auto2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / apply / description
        Previous value: -"Guardedly write the proposal and typecheck it in one transaction"New value: +"Override the server policy: true applies/typechecks; false previews"
    • Changedagda_case_split2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / apply / description
        Previous value: -"Guardedly write the proposal and typecheck it in one transaction"New value: +"Override the server policy: true applies/typechecks; false previews"
    • Changedagda_infer_type1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_job_await1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_job_await_any1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_job_cancel1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_job_list1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_job_status1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_load_module2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • addedInput schema / properties / workspaceRoot
        Added value: +{
        +  "description": "Absolute workspace root containing modulePath; roots outside the configured allowlist require --dynamic-workspaces",
        +  "minLength": 1,
        +  "type": "string"
        +}
    • Changedagda_normalize_expression1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_query_metavariables1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_refine2 fields changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
      • changedInput schema / properties / apply / description
        Previous value: -"Guardedly write the proposal and typecheck it in one transaction"New value: +"Override the server policy: true applies/typechecks; false previews"
    • Changedagda_retrieve_constraints1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_retrieve_context1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_retrieve_contexts1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_retrieve_goals1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_server_info1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
    • Changedagda_typecheck1 field changed
      • changedInput schema / $schema
        Previous value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
  2. 18 tool updatesv0.3.0
    • First observedagda_auto
    • First observedagda_case_split
    • First observedagda_infer_type
    • First observedagda_job_await
    • First observedagda_job_await_any
    • First observedagda_job_cancel
    • First observedagda_job_list
    • First observedagda_job_status
    • First observedagda_load_module
    • First observedagda_normalize_expression
    • First observedagda_query_metavariables
    • First observedagda_refine
    • First observedagda_retrieve_constraints
    • First observedagda_retrieve_context
    • First observedagda_retrieve_contexts
    • First observedagda_retrieve_goals
    • First observedagda_server_info
    • First observedagda_typecheck

TDQS

B3.1/5.0

Scored across 18 tools

Disambiguation4/5

Most tools map to clearly distinct actions: job lifecycle (cancel/list/await/await_any/status), retrieval (goals/context/contexts/constraints), and mutations (case_split/refine/auto) are well separated. Minor confusion risks remain between agda_retrieve_context vs agda_retrieve_contexts (singular/plural one-vs-many) and between agda_retrieve_goals vs agda_query_metavariables, since goals are metavariables in Agda.

Naming Consistency4/5

Nearly all names follow the agda_<verb>_<noun> snake_case pattern and job-related tools share a coherent agda_job_* prefix. A few deviate to noun-only or bare-verb forms (agda_server_info, agda_job_status, agda_typecheck, agda_auto), which is readable but slightly inconsistent.

Tool Count4/5

18 tools is on the heavy side but each maps to a real Agda interaction-protocol operation, and the job-management cluster is needed for async/multi-workspace use. Nothing appears obviously redundant, though a few retrieval tools could conceivably be folded together.

Completeness3/5

The core proof-interaction lifecycle is covered (load, typecheck, goals, context, constraints, case split, refine, auto, normalize, infer, metavariable queries, job control). However, notable Agda operations are missing: 'give' (fill a goal with an expression, distinct from refine) and 'search/about' for lemma discovery, plus no explicit combined goal type-and-context call.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    Exposes Language Server Protocol (LSP) tools such as diagnostics, goto definition, find references, symbols, and rename as a stdio MCP server.
    8
    MIT
  • F
    license
    B
    quality
    D
    maintenance
    MCP server for Agda, providing type checking, go-to-definition, case splitting, auto proof search, and more directly from Claude Code or any MCP client.
    30
    3
    -
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables MCP clients to analyze call graphs, run Grover-ranked code searches, generate boundary test cases, get refactoring suggestions, and inspect quantum backends through stdio JSON-RPC tools.
    2
    -