Skip to main content
Glama

中文导读:DataSentry 会先自动发现数据质量问题,再给出样本、比例、置信度等证据。修复采用 propose → preview → apply to a copy → verify → rollback 的保守流程。检测与评分不依赖 LLM,AI 只作为可选辅助,数据可以完全留在本机。

Try it in 30 seconds

Install the current PyPI release and run the zero-config product tour:

pip install --upgrade datasentry-ai
datasentry demo

datasentry-demo is also available as a direct console alias.

The demo generates synthetic dirty data, runs the built-in detectors, exports JSON + HTML reports, applies one safe repair to a copy, re-scans the repaired copy, and prints a rollback command. It needs no dataset, cloud service, API key, or LLM.

synthetic dirty CSV
        ↓
39 deterministic detectors
        ↓
evidence-backed issues + quality score
        ↓
preview → repaired copy
        ↓
re-scan → verify new/persistent issues

Prefer scanning your own data immediately?

curl -L https://raw.githubusercontent.com/Jackxiaozhiren/datasentry/main/demo-data/orders.csv -o orders.csv
datasentry scan orders.csv
datasentry issues list --severity high

Or launch the interactive interfaces:

datasentry          # terminal UI
datasentry-server   # Web UI + REST API at http://localhost:8000/ui/

Related MCP server: aegis-dq

Start with your problem

If you need to...

Start here

Find suspicious data before you know every rule

datasentry scan data.csv

See the full discovery → repair → verify loop

datasentry demo

Block severe data issues in CI

docs/GITHUB_ACTIONS.md

Add quality gates to dbt / Airflow

examples/integrations/

Inspect and repair issues without overwriting the source

Safe repair

Give AI agents deterministic data-quality tools

docs/MCP.md

The default path is intentionally low-commitment: scan first, inspect evidence, then decide whether a finding deserves a permanent rule or a repair.

Why DataSentry exists

Most data-quality tools are excellent once you already know the expectations, checks, or contracts you want to enforce. Real incidents often start one step earlier: you do not yet know what is wrong.

DataSentry is built around the complete remediation loop:

Find → Explain → Fix safely → Verify
  • Find — discover common quality problems without writing every rule first.

  • Explain — attach samples, affected counts/ratios, detector evidence, and confidence.

  • Fix safely — preview changes and apply repairs to a copy instead of mutating the source.

  • Verify — re-scan the repaired copy and surface persistent or newly introduced issues.

DataSentry fits best when you are looking at data you do not fully trust yet, want evidence before codifying checks, or need a conservative remediation path. It complements expectation- and contract-driven tools rather than requiring you to replace them.

What it catches automatically

DataSentry ships with 39 deterministic detectors covering common failure modes such as:

  • missing and placeholder values;

  • invalid emails, URLs, dates, and encodings;

  • duplicate identifiers and uniqueness violations;

  • inconsistent categories and cross-field contradictions;

  • foreign-key and referential-integrity problems;

  • numeric and statistical outliers;

  • schema, row-count, score, and issue-distribution drift.

Every scan produces an evidence-backed issue list and a six-dimension quality score across completeness, validity, uniqueness, consistency, integrity, and timeliness.

Safe repair, not blind mutation

# inspect the highest-severity findings
datasentry issues list --severity high

# propose a repair without changing data
datasentry repair propose <issue_id> --file orders.csv

# preview the exact effect
datasentry repair preview <issue_id> --file orders.csv

# apply to a repaired copy; the original is not overwritten
datasentry repair apply <issue_id> --file orders.csv

# re-scan the repaired copy and detect regressions
datasentry repair verify <run_id>

# inspect or undo the repair
datasentry repair diff <run_id>
datasentry repair rollback <run_id>

Repairs are fingerprinted, auditable, and reversible. AI-generated repair proposals remain human-approved state changes.

Quality gates for CI

datasentry scan orders.csv --fail-on high

For GitHub repositories, reuse DataSentry's maintained workflow_call gate instead of duplicating installation and exit-code handling:

jobs:
  datasentry:
    uses: Jackxiaozhiren/datasentry/.github/workflows/datasentry-quality-gate.yml@main
    with:
      path: data/orders.csv
      fail_on: high

See docs/GITHUB_ACTIONS.md for inputs, artifacts, security boundaries, and version-pinning guidance.

Reports can be exported as JSON, Markdown, HTML, JUnit, and SARIF. The versioned, machine-readable JSON report Schema is included for downstream validation. The GitHub Actions example fails the workflow on severe findings while still uploading an HTML report for review.

Give AI agents deterministic data-quality tools

DataSentry includes an MCP stdio server:

datasentry mcp --project /path/to/project

MCP-capable clients can scan files, inspect evidence-backed issues, read quality scores and trends, compare drift, validate contracts, manage scheduled jobs, and call DataSentry tools without bypassing the same underlying safety rules used by the CLI and REST API.

Copy-paste setup recipes for VS Code and Claude Desktop are in docs/MCP.md.

Boundary: AI may propose; humans approve state-changing repairs.

This is a positioning guide, not a winner/loser feature scorecard. These projects solve overlapping but different jobs; check their upstream documentation for current capabilities.

Project

Core mental model

A strong fit when you want...

DataSentry

discover → explain → repair → verify

automatic issue discovery plus a controlled, reversible remediation loop

Great Expectations

Expectations / expressive data tests

explicit validation rules, validation results, and generated data-quality documentation

Soda Core

data contracts and quality checks

YAML contracts and verification across a broad data stack

Deequ

“unit tests for data” on Spark

large-scale data verification in Spark-centric environments

ydata-profiling

one-line profiling / EDA

fast exploratory profiling and shareable analysis reports

DataSentry is intentionally not trying to replace a metadata catalog, lineage platform, or every validator. Its focus is narrower: find bad data, show why it was flagged, and close the repair loop without gambling on the source.

Local-first by design

  • deterministic detection and scoring run locally;

  • DuckDB powers core local execution;

  • OpenAI/Ollama assistance is optional;

  • PII redaction, encrypted mappings, and LLM audit records are available when AI is enabled;

  • the original source file is not overwritten by repair workflows.

Data sources

  • CSV, Parquet, JSONL, XLSX

  • DuckDB and SQLite

  • PostgreSQL and MySQL

  • s3://, gs://, and az:// objects

  • single files, batches, and globs

History and drift

Persist scans and compare data over time:

datasentry drift latest orders
datasentry score

Tracked signals include schema changes, row-count movement, quality-score changes, and issue-distribution drift.

Architecture

flowchart LR
    Sources[Files / DBs / cloud objects] --> DuckDB[Local execution]
    DuckDB --> Detect[39 detectors]
    Detect --> Evidence[Evidence fusion]
    Evidence --> Score[6-dimension score]
    Score --> Reports[Reports / history / gates]
    Reports --> CLI[CLI / TUI]
    Reports --> Web[Web / REST]
    Reports --> MCP[MCP]
    Evidence --> Proposal[Repair proposal]
    Proposal --> Preview[Preview]
    Preview --> Apply[Apply to copy]
    Apply --> Verify[Verify by re-scan]
    Verify --> Rollback[Rollback artifact]
    LLM[Optional OpenAI / Ollama] -. proposes .-> Proposal

Reproducible benchmark

uv sync
uv run python benchmarks/bench_scan.py 1000000 42

The benchmark generates synthetic dirty data and measures profiling, detection/fusion/scoring, numeric-outlier detection, JSONL reading, sampling, score drift, and memory high-water marks. See docs/BENCHMARKS.md.

Development

uv sync
make check          # lint + mypy --strict + tests/coverage
make demo           # exercise the public datasentry demo path
make bench          # benchmark
make build          # distributions

Contributing

Useful contributions include new detectors, connectors, integration examples, reproducible benchmark cases, documentation/translations, minimal bug reproductions, and CLI/TUI/Web usability improvements.

Want a small first contribution? Start with good first issue #14 or good first issue #15.

See CONTRIBUTING.md, CODE_OF_CONDUCT.md, SECURITY.md, and ROADMAP.md. Small contributions are tracked with good first issue and help wanted labels.

Documentation

License

Apache-2.0 — see LICENSE.


Available Tools

25 tools
comparison_buildA
Read-only

Same-dataset historical run comparison (V6, ADR-064): per-run overall/dimension scores, issue counts and delta vs previous run. Use the current run id as current_run_id. Returns ok:true with comparison null when fewer than two runs exist.

NameRequiredDescriptionDefault
dataset_idYes
current_run_idYes

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already cover the safety profile (readOnly, non-destructive, closed-world), so the description's added value is the edge-case behavior: ok:true with comparison null when fewer than two runs exist. It also pins the spec version (V6, ADR-064), which is useful provenance but stops short of describing the comparison payload structure.

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?

Three compact sentences, front-loaded with what the tool does and ending on the degenerate-result case. The V6/ADR-064 parenthetical is internal jargon that consumes space without helping an agent invoke the tool.

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 partial duty by sketching the return content and the null-comparison case. Given only two obvious required params, that is close to sufficient, though the exact comparison object shape and the dataset_id semantics remain undocumented.

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 0%, so the description must carry the load. It clarifies current_run_id ('use the current run id'), which is genuinely helpful, but says nothing about dataset_id or the relationship between the two identifiers.

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: a same-dataset historical run comparison returning per-run overall/dimension scores, issue counts, and deltas. It is clear what the tool produces, but it never names or contrasts the close sibling drift_compare, so the agent must infer the boundary itself.

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 by the phrase 'same-dataset historical run comparison' and the note to pass the current run id. There is no explicit when-to-use or when-not-to-use guidance versus drift_compare or trends_list, and no stated prerequisite that two prior runs must exist for a meaningful result.

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

contract_validateB
Read-only

Validate a data contract YAML file and return the structured contract or validation errors.

NameRequiredDescriptionDefault
pathYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already establish the safety profile (readOnlyHint=true, destructiveHint=false, openWorldHint=false). The description adds one useful behavioral fact beyond that: the tool returns either the structured contract or validation errors, i.e. a dual success/failure shape. It stops short of describing error structure or file-format expectations, so a 3 is appropriate.

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; the action and result are stated immediately. It is appropriately sized, though it could pack one more clause of routing or format detail without becoming bloated.

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 output schema, the description is the only place return behavior can be conveyed, and it does signal a dual contract-or-errors return. However, it omits error format, validation strictness, and any prerequisites, leaving meaningful gaps for a validation tool.

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 0% for the single 'path' parameter, so the description must carry the burden. It implies the path points at a YAML contract file, which gives partial meaning, but does not clarify path form (relative/absolute) or expected file extension. Marginal added value over the bare 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?

States a specific verb and resource: 'Validate a data contract YAML file'. An agent knows exactly what the tool does. It does not, however, distinguish itself from plausible siblings such as scan_file or repair_verify, so it falls 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 when-to-use or when-not-to-use guidance and no alternative named. The agent must infer from the name alone that this is the validation entry point rather than scan_file or repair_verify.

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

detectors_listA
Read-only

List all registered quality detectors with id, dimension, capabilities and default thresholds.

NameRequiredDescriptionDefault

No parameters

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered by structured data. The description adds the return payload shape, but says nothing about ordering, pagination, or whether 'registered' implies user-configured vs built-in detectors — relevant for a tool that lists ALL entries.

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 sentence with the verb and resource front-loaded and the payload fields following; there is no filler, hedging, or restatement of the tool name.

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 must carry the return-value burden, and it does list the key fields (id, dimension, capabilities, default thresholds). The remaining gap is completeness of the contract — pagination, ordering, and whether thresholds are unit-bearing — but the core is covered.

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 tool takes zero parameters, so the description bears no parameter burden; baseline for a 0-param schema is 4. The schema is empty and fully consistent with the description's 'list all' framing.

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 (List) and resource (registered quality detectors) and enumerates the returned attributes (id, dimension, capabilities, default thresholds). It is clearly distinguishable from sibling list tools such as trends_list and jobs_list by the resource noun, though it never names a 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 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 call this versus alternatives like quality_score, profiles_get, or trends_list, and no mention of prerequisites. The 'registered detectors' framing implies a discovery step before configuring or interpreting quality results, but that is left entirely to inference.

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

drift_compareB
Read-only

Compare two historical scans of a dataset: schema, row-count, score and issue-distribution drift. Thresholds mirror the CLI (drift compare --row-ratio-threshold/--score-threshold, defaults 0.20/5.0; D1-06).

NameRequiredDescriptionDefault
current_run_idYes
score_thresholdNo
reference_run_idYes
row_ratio_thresholdNo

TDQS

B3.4/5.0
Behavior4/5

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

Annotations already declare readOnly, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuinely new behavioral context: the threshold defaults (0.20/5.0) and their correspondence to the CLI flags, which are absent from 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.

Conciseness4/5

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

Two sentences, front-loaded with the core comparison scope and then the threshold details; little waste. The trailing 'D1-06' ticket reference adds noise without meaning for an agent.

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 read-only tool with no output schema and four undocumented parameters, the description covers the drift dimensions and threshold defaults but omits the meaning of the two run-ID parameters and any hint at the response shape or how drift is reported.

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 0%, so the description must carry the parameter burden. It supplies defaults and CLI equivalents for row_ratio_threshold and score_threshold, but says nothing about the semantics of reference_run_id versus current_run_id beyond the phrase 'two historical scans'.

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 (compare) and resource (two historical scans of a dataset), and enumerates the four drift dimensions: schema, row-count, score, and issue-distribution. It implicitly distinguishes itself from drift_latest by requiring two run IDs, but never names a sibling to differentiate explicitly.

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 reach for this tool versus comparison_build or drift_latest, and no prerequisites or exclusions are given. The mention of CLI-equivalent thresholds describes behavior, not usage conditions.

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

drift_latestA
Read-only

Drift between the two most recent scans of a dataset. Fails if fewer than two completed scans exist. Thresholds mirror the CLI (defaults 0.20/5.0; D1-06).

NameRequiredDescriptionDefault
dataset_idYes
score_thresholdNo
row_ratio_thresholdNo

TDQS

A3.6/5.0
Behavior4/5

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

Annotations already establish readOnly/non-destructive/closed-world, and the description adds real behavioral context on top: the failure mode when scan history is insufficient, and that thresholds default to the CLI values 0.20/5.0. It stops short of describing the response shape or what the thresholds actually gate.

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?

Three dense sentences, front-loaded with purpose, then precondition, then defaults. The trailing '(D1-06)' is internal shorthand that costs a few tokens without informing the agent.

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?

No output schema exists, so the description could reasonably say more about what a drift result contains and what units the thresholds use. Given it is a read-only analytical tool with three parameters at 0% schema coverage, the definition is adequate but leaves real gaps.

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 0%, so the description carries full burden and only partially compensates. It supplies default values (0.20/5.0) for the two thresholds but never names them, leaving the agent to guess which number maps to score_threshold versus row_ratio_threshold; dataset_id is unexplained.

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+resource with scope: drift computed between the two most recent scans of a dataset. The 'two most recent' qualifier implicitly distinguishes it from drift_compare, but the sibling is never named, so the agent must infer the boundary itself.

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?

It gives the precondition under which the tool fails (fewer than two completed scans), which is genuinely useful implicit usage guidance. It does not, however, say when to choose this over drift_compare, which is the most plausible alternative for the same task.

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

issues_listA
Read-only

List quality issues across scans, optionally filtered by minimum severity (info/low/medium/high/critical) or a scan id.

NameRequiredDescriptionDefault
scan_run_idNo
severity_at_leastNo

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so the safety profile is covered by structured data. The description adds that results span multiple scans and can be narrowed, but says nothing about ordering, pagination, limits, or volume, which matters for a list endpoint.

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 well-formed sentence that front-loads the action and resource before listing the optional filters. Nothing superfluous.

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 two-parameter read-only listing tool with no output schema, the definition is minimally adequate. It omits the shape of returned issues and, more importantly, any differentiation from the sibling list_issues, which an agent needs to choose correctly.

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

Parameters4/5

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

Schema coverage is 0%, so the description must carry the load, and it does partially: it enumerates the valid severity values (info/low/medium/high/critical) that the schema does not constrain, and clarifies scan_run_id as a scan id filter. It does not explain the 'at least' semantics of severity_at_least or the identifier format, so it stops short of full compensation.

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 clear verb and resource ('List quality issues across scans') and adds scope ('across scans'). However, it makes no attempt to differentiate itself from the near-identical sibling list_issues, leaving an agent to guess which one to call.

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?

It implies usage by describing the optional filters ('optionally filtered by minimum severity ... or a scan id'), so an agent can infer when filtering matters. But there is no explicit when-to-use guidance and no mention of when to prefer list_issues or quality_score instead.

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

job_createB

Register a scheduled scan job (Step 51): cron expression, data file path, optional quality gate threshold (gate_quality_min, 0-100) and optional webhook URL. Returns the created job view.

NameRequiredDescriptionDefault
cronYes5-field cron, e.g. '0 9 * * *'
nameYes
pathYes
confirmYesmandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)
dataset_idNo
table_nameNo
webhook_urlNo
retry_attemptsNo
gate_quality_minNo

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description adds that the call returns the created job view, which is useful, but it omits the mandatory 'confirm' acknowledgement gate that governs whether anything is written — a meaningful behavioral detail the description could have surfaced.

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?

One tight sentence, front-loaded with the action and followed by the notable inputs. The '(Step 51)' parenthetical is internal jargon that adds no value to an agent, a minor blemish on otherwise efficient writing.

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 mutation tool with no output schema and low schema coverage, the description covers the core fields and states the return value, but it never mentions the required confirm flag or the semantics of name/retry_attempts, leaving gaps an agent would have to infer.

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 only 22% (cron and confirm), so the description must compensate. It documents path, webhook_url and gate_quality_min with a 0-100 range, adding real meaning, but leaves name (required), dataset_id, table_name and retry_attempts entirely unexplained — over a third of the parameters undocumented anywhere.

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: 'Register a scheduled scan job', with the key inputs (cron, path, quality gate, webhook). It is clearly distinct from job_trigger/job_update/job_remove by the word 'Register', but it never explicitly differentiates itself from those siblings or from jobs_list.

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 guidance, no prerequisites, and no mention of how this differs from job_trigger or job_update. The only implied context is that it creates a new job rather than acting on an existing one.

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

job_removeB
Destructive

Delete a scheduled job (Step 88, ADR-088). Returns removed=true.

NameRequiredDescriptionDefault
job_idYes
confirmYesmandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)

TDQS

B3/5.0
Behavior3/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the destructive nature is covered by structured data. The description usefully adds the return shape ('Returns removed=true'), which matters because there is no output schema, but it omits the mandatory confirm acknowledgement and the irreversibility of deletion.

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?

Two tight sentences with the action front-loaded and the return value second; nothing is padded. The internal references '(Step 88, ADR-088)' are the only text that adds little for an invoking agent, keeping it just short of a 5.

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 destructive mutation with no output schema, the description does supply the return value, and annotations cover the safety profile. However, it never states that confirm=true is required to actually mutate state or that deletion is permanent — the two facts an agent most needs before calling this.

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 50%: 'confirm' is documented in the schema, but 'job_id' has no description anywhere. The description contributes no parameter meaning at all, so it does not compensate for the undocumented job_id or clarify the confirm contract beyond what the schema already says.

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 — 'Delete a scheduled job' — which is unambiguous and clearly distinct from siblings like job_create, job_update, and job_trigger. It does not explicitly name an alternative, but the verb alone separates it from every sibling.

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 (e.g., job_update to disable a job, or job_trigger to run it now), and no mention of prerequisites or when deletion is inappropriate. The agent is left to infer that deletion is the terminal, irreversible option.

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

jobs_listA
Read-only

List scheduled scan jobs (Step 51/52): cron, enabled, status, next run time and last result. Optionally filter by status (idle/running/dead).

NameRequiredDescriptionDefault
statusNo

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false and openWorldHint=false, so the safety profile is covered. The description goes further by listing the fields returned and the possible status values, which is genuinely useful since there is no output schema. It omits any note on pagination or result-size limits, keeping it out of 5 territory.

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?

Two sentences, front-loaded with the primary action and the filtering behavior, with essentially no filler. Only the '(Step 51/52)' internal reference fails to earn its place.

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

Completeness4/5

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

For a simple, annotation-covered read tool with no output schema, the description covers purpose, the optional filter, and the shape of the returned data. Nothing critical is missing, though it could note ordering or volume expectations for the job list.

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

Parameters4/5

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

Schema description coverage is 0% and the schema declares no enum, so the description carries the full burden. It supplies the allowed values (idle/running/dead) for the single status parameter, which the schema does not, and marks the parameter as optional. That is meaningful compensation for the coverage gap.

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 (List) and resource (scheduled scan jobs), then enumerates the returned fields (cron, enabled, status, next run time, last result). That clearly separates it from job_create/job_trigger/job_update/job_remove, though it never names those siblings explicitly. The '(Step 51/52)' parenthetical is internal jargon that adds no clarity.

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?

It says the status filter is optional and enumerates the accepted values, which implies the common usage pattern, but there is no explicit when-to-use or when-not guidance relative to job_create/job_update/job_trigger. An agent can infer this is the read path for jobs, but nothing confirms the boundary conditions.

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

job_triggerA

Immediately run a scheduled job once (Step 51). Returns the run id and outcome; mutual exclusion: 409-style error if already running.

NameRequiredDescriptionDefault
job_idYes
confirmYesmandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)

TDQS

A3.5/5.0
Behavior4/5

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

Annotations already declare readOnly=false, destructive=false, openWorld=true, so the concurrency constraint ('409-style error if already running') and the return shape ('run id and outcome') are genuine value-adds beyond structured fields. It could say more about what happens to an in-flight run, but this is solid disclosure for a mutation tool.

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

Conciseness4/5

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

Front-loaded with the action and kept to two tight clauses. The '(Step 51)' reference is internal noise that doesn't help an agent, but otherwise nothing is wasted.

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 correctly covers return values ('run id and outcome') and the concurrency failure mode. For a 2-parameter mutation tool this is largely complete, though the undocumented job_id and vague 'outcome' leave minor gaps.

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%: 'confirm' is well documented in the schema itself, but 'job_id' is undocumented in both schema and description. The description does not compensate for that gap, adding no meaning about how job_id is obtained or formatted.

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: 'Immediately run a scheduled job once.' This is clearly distinct from jobs_list (read) and job_create/update/remove (lifecycle management). However, it never names a sibling or explicitly contrasts itself, so it stops short of full differentiation.

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

Usage Guidelines3/5

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

The word 'Immediately' and 'once' imply on-demand single execution versus scheduled recurrence, and the 409 mutual-exclusion note gives a precondition. But there is no explicit 'use this when / use X instead' guidance, so usage is only implied.

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

job_updateA
Destructive

Update a scheduled job (Step 88, ADR-088): enabled/cron/retry_attempts/webhook_url/gate_quality_min, partial update; cron change recomputes next run time. Returns the updated view.

NameRequiredDescriptionDefault
cronNo5-field cron, e.g. '0 9 * * *'
job_idYes
confirmYesmandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)
enabledNo
webhook_urlNo
retry_attemptsNo
gate_quality_minNo

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already flag this as a non-readOnly, destructive mutation, and the description adds genuinely useful behavior: updates are partial, and a cron change recomputes the next run time. It also notes the response is the updated view, though it says nothing about permissions or reversibility.

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?

One dense sentence that front-loads the verb and resource, then the field set, then the side effect and return value. The ADR/Step citation is arguably noise but small; no sentence is wasted.

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 7-parameter destructive mutation with no output schema, the description covers scope, partial-update semantics, a key side effect, and the return shape. The remaining gap is auth/permission requirements and whether the mutation is reversible.

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 only 29%, so the description must compensate and it does partially by enumerating the five updatable fields (enabled/cron/retry_attempts/webhook_url/gate_quality_min). However, it adds no per-parameter semantics such as value ranges for gate_quality_min or expected webhook_url format, so it mostly restates property names.

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?

Specific verb (update) plus a specific resource (scheduled job), with the mutable field set enumerated. It is clearly distinguishable from siblings like job_create, job_trigger, and job_remove.

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?

States 'partial update' and lists which fields can be changed, which implies the editing context, but it names no alternatives and gives no when-not guidance (e.g. versus job_trigger for forcing a run or job_remove for deletion).

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

pii_delete_sessionB
Destructive

Delete a PII encryption session (Step 100, ADR-100). Removing the encrypted mapping is not reversible and does not require the encryption key. Returns deleted=true or ok:false when the session does not exist.

NameRequiredDescriptionDefault
confirmYesmandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)
session_idYes

TDQS

B3.3/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description adds real context: the removal is irreversible, it does not require the encryption key, and it reports deleted=true or ok:false when the session is absent. That return-value disclosure is especially valuable since there is no output schema.

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?

Three tightly written sentences that are front-loaded with the action and immediately followed by the irreversibility caveat and return contract. The '(Step 100, ADR-100)' reference is internal jargon of marginal value but costs little.

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 two-parameter destructive tool with no output schema, the description covers irreversibility, key independence, and the return shape. It stops short of naming the confirm prerequisite explicitly and does not address permissions or effects on related sessions.

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%: confirm is documented in the schema, but session_id has no description anywhere. The description mentions no parameters at all, so it fails to compensate for the undocumented session_id or explain what a session ID refers to.

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 ('Delete a PII encryption session') and grounds it in an internal reference (Step 100, ADR-100). It does not, however, differentiate itself from the very similar sibling pii_purge_sessions, leaving the agent to infer which delete-like tool applies.

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 explains what the tool does and warns that the operation is irreversible, but never says when to choose it over pii_purge_sessions, pii_sessions, or pii_restore. There are no explicit preconditions beyond the schema-level confirm gate, and no alternatives are named.

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

pii_purge_sessionsA
Destructive

Delete PII encryption sessions older than N days (Step 103, ADR-103). Sessions are matched by creation time only; the encryption key is not required. Returns purged (count of deleted sessions) or ok:false when olderThanDays is invalid (< 1).

NameRequiredDescriptionDefault
confirmYesmandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)
olderThanDaysYesDelete sessions created before this many days (>= 1)

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, so the safety profile is covered. The description adds real context beyond that: age-only matching, no key requirement, and the ok:false failure mode for invalid input.

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?

Three front-loaded sentences with the action first and no padding. The Step 103 / ADR-103 parentheticals are internal references that add mild noise but no real length.

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 correctly covers the return contract (purged count or ok:false on invalid input), which is what an agent most needs. It is largely complete, missing only pagination-style edge cases that don't apply to a purge.

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%, so both parameters are already documented, including the >= 1 constraint. The description only adds the consequence of an invalid olderThanDays and says nothing extra about confirm beyond what the schema already states, 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 (Delete), resource (PII encryption sessions), and scope (older than N days). Against siblings like pii_delete_session and pii_sessions, this reads as a bulk, age-based purge, so an agent can distinguish it without opening any schema.

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

Usage Guidelines3/5

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

"Sessions are matched by creation time only; the encryption key is not required" clarifies the matching criterion, which hints at when it applies. But it never names alternatives (e.g., pii_delete_session for a single session) or says when not to use this bulk purge, 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.

pii_restoreA

Restore plaintext in a text by substituting REDACTED placeholders from a PII session's mapping (Step 100, ADR-100). Explicit authorization semantics: calling this tool is the authorization to view plaintext. Returns ok:false with an error when the session does not exist, the mapping cannot be decrypted (missing or wrong key), or no encryption key is configured.

NameRequiredDescriptionDefault
textYesText containing {{REDACTED:...}} placeholders
confirmYesmandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)
session_idYesPII session id, e.g. pii_abc123

TDQS

A4.1/5.0
Behavior4/5

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

Annotations only declare readOnly=false, destructive=false, openWorld=false; the description adds genuinely new behavior: the authorization semantics of the call and three concrete failure modes (missing session, undecryptable mapping, no key configured) with an ok:false return. It stops short of describing the success payload or confirming that plaintext leaves the PII boundary, which would be valuable for a privacy-sensitive operation.

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?

Well front-loaded: purpose first, then semantics, then error behavior. The parenthetical '(Step 100, ADR-100)' is internal design-doc noise that costs tokens without helping tool selection, and the error enumeration is slightly run-on.

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 correctly carries the return-value burden for the failure path (ok:false plus reason). Combined with the annotations and a fully-described 3-param schema, an agent has enough to call it correctly; only the success return shape is left unstated.

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

Parameters3/5

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

Schema description coverage is 100%, and all three parameters already carry their own descriptions (including the mandatory confirm acknowledgement and its D5-08/D5-12 rationale). The description adds no parameter-level detail, 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 precise verb+resource pair: restore plaintext by substituting {{REDACTED:...}} placeholders using a PII session's mapping. This is clearly distinguishable from the neighboring session-lifecycle tools (pii_sessions, pii_delete_session, pii_rotate_key, pii_purge_sessions), which manage the mapping rather than consume it.

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?

The description gives a strong context cue — calling it is itself the authorization to view plaintext — which tells the agent this is the deliberate, audited path to plaintext. It does not, however, name alternatives or state when-not (e.g., 'do not call during automated pipelines'), so exclusions are left to inference.

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

pii_rotate_keyA
Destructive

Rotate the PII vault encryption key (Step 102, ADR-102): re-encrypts all existing mappings with a new key and writes it to the local key file, making the previous key invalid for existing sessions. Optional newKey supplies the key material; a random key is generated when omitted (mirrors CLI rotate-key --new-key). Returns ok:false with an error when no encryption key is configured.

NameRequiredDescriptionDefault
newKeyNoOptional new key material (auto-generated when omitted)
confirmYesmandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)

TDQS

A4.1/5.0
Behavior5/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, but the description goes well beyond them: it discloses the concrete blast radius (all existing mappings re-encrypted, previous key invalid for existing sessions), the side effect (writes to the local key file), and the failure mode (ok:false with an error when no key is configured). That is exactly the added context the annotations cannot carry.

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 dense paragraph that front-loads the action and its consequence before the parameter and return notes. The parenthetical process references (Step 102, ADR-102, D5-08/D5-12) are mild noise, but every sentence still carries operational information.

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 usefully covers the success/failure contract (ok:false plus an error when no key is configured) and the confirm gating. It stops short of stating any permission or backup prerequisites for a destructive key-rotation, which would be the last piece an agent needs.

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%, so both parameters are already documented in the schema; the description's note that newKey is auto-generated when omitted and that it mirrors the CLI flag only re-states the schema. It adds no format, length, or encoding detail for the key material, so the baseline 3 is appropriate.

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+resource (rotate the PII vault encryption key) plus the concrete effect (re-encrypts all existing mappings, writes the new key to the local key file). It is unambiguous and clearly distinct from the other pii_* siblings such as pii_restore and pii_delete_session.

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

Usage Guidelines3/5

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

Usage is implied rather than stated: the agent can infer this is the key-rotation operation and that it mirrors the CLI 'rotate-key --new-key'. There is no explicit when-to-use/when-not guidance and no routing against the neighboring pii_* tools, so it lands at implied usage rather than a real decision rule.

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

pii_sessionsA
Read-only

List PII encryption sessions (Step 100, ADR-100) with key version and creation time (no ciphertext, no plaintext). Returns ok:false with an error when no encryption key is configured (set DATASENTRY_ENCRYPTION_KEY or run 'datasentry llm rotate-key').

NameRequiredDescriptionDefault

No parameters

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare the safe read profile (readOnly=true, destructive=false), so the bar is lower, yet the description still adds real value: it scopes the payload ('no ciphertext, no plaintext') and discloses the failure mode (ok:false when no encryption key is configured) with concrete remediation (DATASENTRY_ENCRYPTION_KEY or rotate-key).

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

Conciseness5/5

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

Two sentences, no filler: the scope and returned fields come first, the error/edge case second. Every clause earns its place and the most important information is front-loaded.

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 carries the burden of describing returns and does so partially (key version, creation time, absence of ciphertext/plaintext) plus the error path. It omits ordering, volume or pagination behavior for a session listing, which is a minor remaining gap for a zero-parameter tool.

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?

Zero parameters, so per the rubric the baseline is 4; the schema is empty and the description correctly refrains from inventing filter semantics, instead describing what the unfiltered result contains.

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+resource ('List PII encryption sessions') with the returned fields named ('key version and creation time'). It distinguishes itself from mutating siblings like pii_delete_session, pii_purge_sessions and pii_rotate_key by resource+action, though it never names an alternative 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 implied rather than stated: an agent can infer this is the read path for inspecting encryption sessions, but there is no 'use this when / not when' guidance or routing to pii_rotate_key versus pii_purge_sessions. The remediation hint for the missing-key error is useful prerequisite context but not a usage rule.

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

profiles_getC
Read-only

Scan-time column profile sidecar of a scan run (V6, ADR-061) as raw JSON. Returns ok:false with an error when no profile exists.

NameRequiredDescriptionDefault
scan_run_idYes

TDQS

C2.7/5.0
Behavior3/5

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

Annotations already declare this a safe, non-destructive read. The description does add a genuine behavioral fact beyond the annotations: it returns raw JSON and signals a missing profile via ok:false with an error. That error contract is valuable, but auth requirements, profile contents, and size/rate considerations are unstated.

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 short and front-loads the resource description, which is good. The parenthetical '(V6, ADR-061)' is internal-reference noise that consumes space without helping an agent decide or invoke, and the second sentence, while useful, is not structured as explicit guidance.

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 single-parameter read with no output schema, the description does cover the return shape (raw JSON) and the not-found error behavior, so an agent knows what to expect. It still omits how scan_run_id is obtained and what the profile contains, leaving meaningful gaps for a tool that is otherwise simple.

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?

The single required parameter scan_run_id has 0% schema description coverage and the description never explains it – no format, no indication of where the ID comes from or that it must reference an existing scan run. The description only implies the profile is keyed by scan run, which is not enough for the one parameter that drives the call.

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 identifies the resource (a scan-time column profile sidecar for a given scan run) and its return format (raw JSON), which is more than a tautology. However, the core verb is only implied and the framing leans on internal jargon ('sidecar', 'V6, ADR-061') rather than a plain statement like 'retrieve the column profile for a scan run'. It is understandable to a domain-aware agent but not crisply distinguished.

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 use this tool versus alternatives such as scan_file, quality_score, or list_issues. No prerequisites, no conditions, and no sibling is named. The only usable cue is the implicit read of a profile by scan_run_id.

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

quality_scoreA
Read-only

Six-dimension quality score of a scan run (use issues_list or scan_file to obtain scan_run_id). Dimensions below 60 indicate risk.

NameRequiredDescriptionDefault
scan_run_idYes

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true and destructiveHint=false, so safety is covered. The description adds real business context beyond that — that the output has six dimensions and that values below 60 signal risk — but does not describe the return format or the individual dimensions.

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?

Two compact sentences with the core purpose front-loaded and the prerequisite parenthetical attached where needed. Efficient, though the parenthetical slightly interrupts the main sentence.

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 simple single-parameter read tool with no output schema, the description covers what it returns (a six-dimension score), how to supply the required argument, and how to interpret results (below 60 = risk). Only the identity of the six dimensions is left unexplained, which is a minor 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?

With one parameter at 0% schema description coverage, the description must carry the load and does so partially: it explains provenance of scan_run_id (issues_list or scan_file). It gives no format details for the ID itself, so the compensation is incomplete.

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 names a specific resource (a scan run's six-dimension quality score) and characterizes the operation clearly enough to distinguish it from siblings like repair_verify or contract_validate. The verb is nominalized ("score of a scan run") rather than an explicit action, which slightly blunts the clarity.

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?

It gives a prerequisite hint by naming issues_list and scan_file as the way to obtain scan_run_id, which is useful routing context. However, it never states when to reach for quality_score versus alternatives, nor any exclusions, so usage is only partially guided.

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

repair_apply_batchA
Destructive

Apply repair proposals for one or more issues of a scan run. WRITES DATA: each repair writes a repaired copy plus a before snapshot under .datasentry/repairs/; the source file is never overwritten. D5-08: prefer repair_propose_batch first. preview_only is mandatory: true reviews operations without writing, false applies them. Issues without a proposal are skipped (no_proposal), not failed. Returns applied runs and per-issue errors.

NameRequiredDescriptionDefault
confirmYesmandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)
issue_idsNoissue ids to apply (default: all of the run)
scan_run_idYes
source_pathYessource data file
preview_onlyYeswhen true, return proposals without writing any data (D5-08 preview-first)

TDQS

A4.6/5.0
Behavior5/5

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

Goes well beyond the annotations: discloses exactly what is written (repaired copy plus before snapshot under .datasentry/repairs/), that the source file is never overwritten, and that issues without a proposal are skipped (no_proposal) rather than failing. This is rich behavioral context that the destructiveHint alone would not convey.

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

Conciseness4/5

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

Front-loaded with purpose and the WRITES DATA warning, and every sentence carries information. Slightly dense with internal D5-08 references that are not self-explanatory, but there is no wasted filler.

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

Completeness5/5

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

For a mutating tool with no output schema, the description covers the write side effects, safety guarantees, alternative workflow, skip semantics, and return shape (applied runs and per-issue errors). Nothing an agent needs to call it correctly is missing.

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

Parameters4/5

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

Schema coverage is 80%, so the schema already documents most parameters. The description adds real meaning for preview_only (true reviews without writing, false applies) and reinforces the confirm acknowledgement gate, going beyond the schema text.

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 (apply), resource (repair proposals), and scope (one or more issues of a scan run). It explicitly distinguishes itself from the sibling repair_propose_batch, so an agent can route correctly without opening either schema.

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?

Explicitly says to prefer repair_propose_batch first (D5-08), naming the alternative and the ordering condition. It does not spell out a clear when-not to apply, but the preview_only guidance covers the dry-run path well.

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

repair_propose_batchB

Generate repair proposals for one or more issues of a scan run (rule engine, read-only, never writes data). issue_ids: array of issue ids; omit to cover all issues of the run. Returns proposals, unsupported issues and per-issue errors.

NameRequiredDescriptionDefault
issue_idsNoissue ids to propose for (default: all of the run)
scan_run_idYes
source_pathYessource data file

TDQS

B3.2/5.0
Behavior1/5

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

The description claims the tool is "read-only, never writes data," but the annotations set readOnlyHint=false, which indicates the tool may modify state. This is a direct contradiction between the description and structured annotations.

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 compact, front-loads the core purpose, and includes only relevant information: scope, read-only intent, issue_ids behavior, and return contents. 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?

The description covers the return shape in the absence of an output schema and explains the issue_ids default. However, it omits any comparison to sibling repair tools and contradicts the readOnly annotation, leaving important context incomplete.

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 67%, and the description mainly repeats the schema's own issue_ids default behavior. It adds no meaning for scan_run_id or source_path, leaving two parameters without descriptive semantics beyond the minimal schema entries.

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?

The description states a specific verb and resource: "Generate repair proposals" for issues of a scan run. It distinguishes this from sibling tools like repair_apply_batch, repair_rollback_batch, and repair_verify by clarifying that it only proposes and never writes data.

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 description gives guidance on the issue_ids parameter, including that omitting it covers all issues of the run. However, it does not explicitly say when to choose this tool over alternatives such as repair_apply_batch or repair_verify, leaving the workflow context implied rather than stated.

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

repair_rollback_batchA
Destructive

Roll back applied repairs by run id. WRITES DATA: restores the pre-repair snapshot for each run. Returns rolled-back runs and per-run errors.

NameRequiredDescriptionDefault
confirmYesmandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)
repair_run_idsYesrepair run ids (e.g. rep_xxx)

TDQS

A4/5.0
Behavior4/5

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

Annotations already declare destructiveHint=true and readOnlyHint=false, and the description reinforces this with "WRITES DATA" plus the specific effect (restores the pre-repair snapshot). It also discloses return shape (rolled-back runs and per-run errors), adding useful context beyond annotations.

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

Conciseness5/5

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

Three tight sentences, front-loaded with the mutation warning ("WRITES DATA") before the effect and return values. Zero wasted words.

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?

Covers mutation semantics, the confirm gate, effect, and return values for a 2-param tool with no output schema. Minor gap: no mention of irreversibility or idempotency behavior.

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 both parameters—including the confirm gate—fully documented in the schema. The description adds only "by run id" and per-run errors, so the schema does the heavy lifting; baseline 3 fits.

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 ("Roll back") and resource ("applied repairs by run id"), clearly distinguishing it from siblings like repair_apply_batch and repair_propose_batch. An agent can tell exactly what this does.

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?

Implies usage after repairs have been applied ("Roll back applied repairs"), but offers no explicit when-to-use/when-not or named alternatives such as repair_apply_batch as the inverse operation.

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

repair_verifyB

Verify a repair run: re-scan the repaired copy and report remaining issues vs the original scan (fixed/persistent/new issue types). Read-only. Returns the verify scan run id and comparison counts.

NameRequiredDescriptionDefault
repair_run_idYes

TDQS

B3.3/5.0
Behavior1/5

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

The description declares 'Read-only', but the annotations set readOnlyHint=false, and the tool itself persists a new scan run (it returns a verify scan run id) — so the read-only claim directly contradicts the structured safety metadata. Beyond that contradiction, it does disclose the comparison categories (fixed/persistent/new) and the return payload, but the false safety claim is the kind of error that misroutes an agent.

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?

Two tight sentences, front-loaded with the action before the comparison detail and return values, so an agent gets the gist from the opening clause. The standalone 'Read-only.' fragment is short but misleading, which keeps this from being flawless.

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 usefully summarizes the return ('verify scan run id and comparison counts') and the issue categorization (fixed/persistent/new), which is what an agent needs to interpret results. The main gap is the unresolved read-only/readOnlyHint discrepancy and the absence of any prerequisite or failure behavior.

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?

One parameter (repair_run_id) with 0% schema description coverage, so the description must carry the burden. It only obliquely references it via 'a repair run' and never states the accepted identifier form, where to obtain it, or whether it must be a completed/apply run. The parameter name is self-explanatory enough to reach a baseline 3, but no real semantics are added.

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 and resource ('Verify a repair run') plus the mechanism ('re-scan the repaired copy') and the output semantics ('remaining issues vs the original scan (fixed/persistent/new)'). This clearly separates it from the sibling repair_propose_batch / repair_apply_batch / repair_rollback_batch tools without needing to open any schema.

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

Usage Guidelines3/5

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

Usage is implied by the name and the phrase 'Verify a repair run', which points at the post-apply step, but there is no explicit when-to-use, no prerequisite (e.g. a prior apply run), and no named alternative such as list_issues or scan_file for a plain scan. Adequate but leaves the agent to infer the workflow position.

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

report_exportA
Read-only

Export the canonical JSON report of a scan run (same payload as CLI report export --as json / REST GET /scans/{id}/report; D1-06 capability parity). Read-only.

NameRequiredDescriptionDefault
scan_run_idYes

TDQS

A3.9/5.0
Behavior4/5

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

Annotations already declare readOnlyHint/openWorldHint/destructiveHint, so the safety profile is covered. The description adds genuine context: the payload is the canonical JSON report and is byte-equivalent to the CLI and REST paths. It omits size/rate-limit or auth details, but that is a minor gap given annotation coverage.

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?

One dense front-loaded sentence plus a short 'Read-only.' clause; no filler. The trailing read-only note duplicates the annotation, costing a small amount of precision but not clarity.

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

Completeness4/5

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

There is no output schema, and the description adequately characterizes the return as the canonical JSON report with parity to the CLI/REST payloads. For a one-parameter export tool this is close to complete, with only the parameter format left unspecified.

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 0% for the single scan_run_id parameter (no type/format note in the schema). The description partially compensates by indicating the report belongs to 'a scan run', implying the ID identifies a scan, but gives no format or source guidance for the value.

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 (Export) and resource (canonical JSON report of a scan run), plus anchors it to known equivalents (CLI `report export --as json`, REST `GET /scans/{id}/report`). No sibling tool produces a report, so the purpose is unambiguous and distinguishable.

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 description implies the use case (fetching the canonical report payload) but never states when to choose this over siblings like list_issues, quality_score, or contract_validate, nor any prerequisites. Usage is inferable but not guided.

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

scan_fileA

Scan a data file (CSV/Parquet/JSONL/XLSX/DuckDB), a PostgreSQL table (postgresql://DSN, Step 55), a MySQL table (mysql://DSN, Step 56) or a cloud storage file (s3:// gs:// az:// CSV/Parquet/JSONL, Step 57) and persist the quality report. Returns scan id, status, row count, quality score and issue counts. Optional sampling (sampling_size or sampling_ratio; sampling_method random|stratified|reservoir|time_based|rare_oversampling|none, default reservoir; sampling_seed, default 42), detector whitelist and tags mirror the CLI (Step 76, ADR-076).

NameRequiredDescriptionDefault
pathYesPath to the data file, a postgresql:// / mysql:// DSN (table_name required), or an s3:// gs:// az:// cloud file URI
seedNo
tagsNo
detectorsNo
dataset_idNo
table_nameNo
sampling_seedNo
sampling_sizeNo
sampling_ratioNo
sampling_methodNosampling strategy accepted by core (ADR-076)

TDQS

A3.8/5.0
Behavior4/5

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

Annotations only declare readOnlyHint=false, openWorldHint=true, destructiveHint=false. The description adds real behavioral context: it persists a quality report, returns scan id/status/row count/score/issue counts, and documents sampling defaults (reservoir, seed 42) and the detector whitelist/tags behavior. This goes meaningfully beyond the annotations.

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

Conciseness3/5

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

Front-loaded with scan targets and returns, then optional parameters. However, internal references (Step 55/56/57/76, ADR-076) are noise to an agent and clutter the parentheticals without adding decision value.

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 complex 10-parameter tool with no output schema and thin schema coverage, the description supplies return values, sampling defaults, and supported source types. The main gaps (seed, dataset_id, table_name) are minor relative to what is provided.

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 only 20% (10 params, most undocumented), so the description carries the burden. It does explain sampling_size/sampling_ratio, the sampling_method options and default, sampling_seed default, detectors and tags, but leaves seed, dataset_id and table_name semantics unaddressed. Partial compensation, not full.

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 (Scan) plus the resource scope (local data files, PostgreSQL/MySQL tables, cloud-storage files) and the persistence outcome. An agent can distinguish this from siblings like profiles_get or quality_score without opening any schema.

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

Usage Guidelines3/5

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

The accepted input formats and DSN schemes imply when the tool applies, but the description never states when to use it versus alternatives such as job_create or quality_score, nor any preconditions. Usage is inferable but not spelled out.

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. 1 tool updatev0.1.3
    • Removedlist_issues
  2. 1 tool updatev0.1.2
    • Addedissues_list
  3. 14 tool updatesv0.1.1
    • Changeddrift_compare2 fields changed
      • addedInput schema / properties / row_ratio_threshold
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / score_threshold
        Added value: +{
        +  "type": "number"
        +}
    • Changeddrift_latest2 fields changed
      • addedInput schema / properties / row_ratio_threshold
        Added value: +{
        +  "type": "number"
        +}
      • addedInput schema / properties / score_threshold
        Added value: +{
        +  "type": "number"
        +}
    • Changedjob_create2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "mandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "name",
        -  "path",
        -  "cron"
        -]New value: +[
        +  "name",
        +  "path",
        +  "cron",
        +  "confirm"
        +]
    • Changedjob_remove2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "mandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "job_id"
        -]New value: +[
        +  "job_id",
        +  "confirm"
        +]
    • Changedjob_trigger2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "mandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "job_id"
        -]New value: +[
        +  "job_id",
        +  "confirm"
        +]
    • Changedjob_update2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "mandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "job_id"
        -]New value: +[
        +  "job_id",
        +  "confirm"
        +]
    • Changedpii_delete_session2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "mandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "session_id"
        -]New value: +[
        +  "session_id",
        +  "confirm"
        +]
    • Changedpii_purge_sessions2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "mandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "olderThanDays"
        -]New value: +[
        +  "olderThanDays",
        +  "confirm"
        +]
    • Changedpii_restore2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "mandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "session_id",
        -  "text"
        -]New value: +[
        +  "session_id",
        +  "text",
        +  "confirm"
        +]
    • Changedpii_rotate_key2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "mandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[]New value: +[
        +  "confirm"
        +]
    • Changedrepair_apply_batch3 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "mandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)",
        +  "type": "boolean"
        +}
      • addedInput schema / properties / preview_only
        Added value: +{
        +  "description": "when true, return proposals without writing any data (D5-08 preview-first)",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "scan_run_id",
        -  "source_path"
        -]New value: +[
        +  "scan_run_id",
        +  "source_path",
        +  "preview_only",
        +  "confirm"
        +]
    • Changedrepair_rollback_batch2 fields changed
      • addedInput schema / properties / confirm
        Added value: +{
        +  "description": "mandatory acknowledgement that this call mutates state; the tool writes nothing unless it is true (D5-08, D5-12)",
        +  "type": "boolean"
        +}
      • changedInput schema / required
        Previous value: -[
        -  "repair_run_ids"
        -]New value: +[
        +  "repair_run_ids",
        +  "confirm"
        +]
    • Addedreport_export
    • Changedscan_file2 fields changed
      • addedInput schema / properties / sampling_method / description
        Added value: +"sampling strategy accepted by core (ADR-076)"
      • addedInput schema / properties / sampling_method / enum
        Added value: +[
        +  "random",
        +  "stratified",
        +  "reservoir",
        +  "time_based",
        +  "rare_oversampling",
        +  "none"
        +]
  4. 24 tool updatesv0.1.0
    • First observedcomparison_build
    • First observedcontract_validate
    • First observeddetectors_list
    • First observeddrift_compare
    • First observeddrift_latest
    • First observedjob_create
    • First observedjob_remove
    • First observedjob_trigger
    • First observedjob_update
    • First observedjobs_list
    • First observedlist_issues
    • First observedpii_delete_session
    • First observedpii_purge_sessions
    • First observedpii_restore
    • First observedpii_rotate_key
    • First observedpii_sessions
    • First observedprofiles_get
    • First observedquality_score
    • First observedrepair_apply_batch
    • First observedrepair_propose_batch
    • First observedrepair_rollback_batch
    • First observedrepair_verify
    • First observedscan_file
    • First observedtrends_list

TDQS

B3.3/5.0

Scored across 25 tools

Disambiguation4/5

Most tools target distinct resources and actions (PII sessions, scans, repairs, jobs, contracts), but a few pairs like drift_compare/drift_latest and trends_list/comparison_build have overlapping purposes that descriptions mostly clarify.

Naming Consistency3/5

All names use snake_case, but the pattern mixes verb_noun (scan_file, repair_propose_batch) with noun_verb (issues_list, drift_compare, job_create), and pii_sessions is an outlier, making the convention inconsistent.

Tool Count3/5

25 tools is heavy for the stated purpose, though they are divided across coherent domains (PII, scanning, repair, scheduling, contracts). Borderline; some reduction could improve focus.

Completeness4/5

Core domains have strong lifecycle coverage: PII sessions (list/restore/delete/rotate/purge), scans (create/list/score/drift/report/trends/profiles/compare), repairs (propose/apply/rollback/verify), and jobs (list/create/trigger/update/remove). The main gap is contracts, which only has contract_validate with no create/update/delete surface.

Maintenance

ActivityMaintained
ResponsivenessResponsive

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    B
    maintenance
    MCP server with 32 tools for ETL ingestion, AI-generated data quality rules, AI transformations, vector search, and natural-language SQL. Works across Postgres, MongoDB, Kafka, S3/MinIO, HashiCorp Vault, and five vector stores (Qdrant, Weaviate, Milvus, Chroma, pgvector).
    13
    Apache 2.0
  • A
    license
    B
    quality
    D
    maintenance
    Agentic data quality MCP server — runs structured validation rules against warehouses (DuckDB, BigQuery, Athena, Databricks, Postgres), diagnoses failures with LLM root cause analysis, and proposes SQL remediations. Full audit trail of every AI decision.
    6
    4
    Apache 2.0
  • A
    license
    Not graded
    quality
    D
    maintenance
    AI-driven MCP server that audits, profiles, detects schema drift, and auto-generates documentation for dbt projects, enabling natural language interaction with your dbt project's health.
    119
    MIT