Skip to main content
Glama
papasega

African Speech Corpora MCP

by papasega

African Speech Corpora MCP

A read-only server implementing the Model Context Protocol, an open standard created by Anthropic, over public speech corpora for African languages: Wolof first, plus Pulaar and Sereer.

The project is Wolof-first. The 2.0 catalog contains 14 variants: 11 variants of original sources and 3 derivatives. Pulaar (ful) and Sereer (srr) are represented only by Kallaama variants without local metrics; the project does not claim Swahili or Amharic coverage. The bundled validation lock, generated on August 26, 2026, makes 6 Hugging Face variants queryable. A later validation run may naturally produce a different state.

Version 2.0.0 is distributed on PyPI and published as io.github.papasega/african-speech-corpora in the official MCP Registry.

The server does not train models, download complete corpora, or write to Hugging Face, OpenSLR, Kaggle, GitHub, or any other remote source.

What the server measures

The quality pipeline keeps the following stages separate:

raw audio → usable audio → transcribed audio → audit-accepted audio → expert-verified audio
  • Raw: a file present in the observed snapshot.

  • Usable: a file remaining after the audit's quantifiable exclusions.

  • Transcribed: audio associated with a transcription.

  • Audit accepted: an explicitly named union of expert-verified material and material only assumed valid by the audit.

  • Expert verified: only expert_audited or source_reported_expert. An “a priori” assessment never enters this level.

Seconds are the canonical duration representation. Decimal hours and HH:MM:SS strings are derived at serialization time. Every audited metric states its scope, source, method, observation date, and confidence. A missing value remains null; it is never converted to zero. Figures published by a project remain under published_metrics, separate from local observations.

Related MCP server: repocritics-mcp-server

2026 Wolof snapshot

The machine-readable source is assets/wolof-audit-2026.csv. The protocol, limitations, and discrepancies with the source table's TOTAL cells are documented in assets/wolof-audit-2026.md.

Seven Wolof variants have a local observation: ALFFA, FLEURS wo_sn, Kallaama Wolof, Urban Bus, Waxal crowdsource, Wolof TTS Baamtu, and WolBanking77. Totals are recomputed from these seven rows and are never stored as a redundant manual total: 148,102 usable files, 64,609 transcribed files, 50,494 audit-accepted files, 2,329,382.06 seconds of audio, 515,185.06 transcribed seconds, and 302,048.06 audit-accepted seconds.

Important limitations:

  • the FLEURS, Urban Bus, Waxal, Wolof TTS, and WolBanking77 observations described as “a priori” are audit_assumed_valid, not expert verified;

  • ALFFA explicitly has zero expert-verified files in this snapshot;

  • the 153 Kallaama files are long radio or interview recordings, not 153 speech turns; 36 files and 12:49:36 are attributed to the local protocol's source_reported_expert basis;

  • Urban Bus contains substantial French content without a quantified rate and therefore has language_purity=mixed_fr;

  • Waxal separates 517:38:05 of raw audio, usable notably for SSL, from only 13:41:28 transcribed for supervised ASR;

  • the local Wolof TTS Baamtu snapshot—36,009 files and 37:04:49—is distinct from the rounded public metric, and this TTS corpus is excluded from ASR by default;

  • WolBanking77 distinguishes 2,563 observed audio files from the 9,791 text phrases reported elsewhere;

  • Afrivoice publishes 530.74 hours of Wolof audio, including 102.96 transcribed hours. These are source-published figures, not measurements from the 2026 local audit and not evidence of expert verification. The dataset is auto-gated on Hugging Face, so its files, schema, splits, and durations cannot be independently checked without accepting its access conditions and supplying a token; it therefore remains audit_status=pending;

  • because the exact source observation date is unavailable, observed_at=2026 intentionally has year-only precision.

Installation

The package requires Python 3.11 or newer. Python 3.12 is recommended and is selected explicitly below so that the virtual environment does not accidentally inherit an older system interpreter such as Python 3.9:

Install the published release from PyPI:

python3.12 --version
python3.12 -m venv .venv
source .venv/bin/activate
python --version
python -m pip install "african-speech-mcp==2.0.0"

For development, install an editable checkout with the development dependencies:

git clone https://github.com/papasega/african-speech-mcp.git
cd african-speech-mcp
python3.12 --version
python3.12 -m venv .venv
source .venv/bin/activate
python --version
python -m pip install -e ".[dev]"

Both version commands should report Python 3.12.x. Creating the environment with python -m venv .venv is safe only when that python executable is already Python 3.11 or newer. If installation fails with an error such as:

ERROR: Package 'african-speech-mcp' requires a different Python: 3.9.6 not in '>=3.11'

then the virtual environment was created with Python 3.9.6. Deactivate it, remove or rename that local .venv, install Python 3.12 if necessary, and recreate the environment with python3.12 -m venv .venv. A virtual environment keeps the interpreter with which it was created; activating it does not upgrade Python.

The stdio server starts with no arguments:

african-speech-mcp

It can also be started explicitly:

african-speech-mcp serve --transport stdio
african-speech-mcp serve --transport streamable-http

Example Claude Desktop configuration after installing the package, preferably using an absolute path:

{
  "mcpServers": {
    "african-speech-corpora": {
      "command": "/absolute/path/to/.venv/bin/african-speech-mcp"
    }
  }
}

Version 2.0.0 is published on PyPI and can be installed with pip. The repository installation remains the appropriate choice for development or unreleased changes.

MCP tools

All eight tools declare read_only_hint=true, destructive_hint=false, and idempotent_hint=true.

Tool

Purpose

list_corpora

List variants, audit state, recommended use, and validation state.

audit_corpus

Return counts, durations, verification basis, warnings, and separate published figures.

plan_training_set

Build a plan without double-counting derivatives or including benchmarks by default.

filter_segments

Filter only when a row-level manifest exists; otherwise refuse to promise exclusions.

compare_corpora

Compare quality, domain, language purity, license, and metric freshness.

search_segments

Search rows in a variant whose remote schema has been validated.

corpus_stats

Return sizes for the variant's config only and report schema discrepancies.

cite_corpus

Return the license, citation, and parent citations for a derivative.

Conceptual examples:

audit_corpus(corpus="waxal-crowdsource")

plan_training_set(language="wol", task="asr", quality="transcribed")
plan_training_set(language="wol", task="asr", quality="expert_verified")
plan_training_set(
  language="wol",
  task="asr",
  quality="audit_accepted",
  include_mixed_language=true,
)

filter_segments(
  corpus="waxal-crowdsource",
  exclude_duplicates=true,
  exclude_non_wolof=true,
  exclude_corrupt=true,
)

The last call currently returns filter_available=false. Aggregate totals establish that Waxal contains 430 duplicates and 22 corrupt or non-Wolof files, but they provide no row identifiers. The server therefore refuses to pretend that it removed those rows.

plan_training_set semantics

quality accepts:

  • any: select by task and license without requiring transcription;

  • transcribed: use actually transcribed duration;

  • audit_accepted: include expert and assumed-valid material, with a visible breakdown and warning;

  • expert_verified: use only genuinely expert verification bases;

  • wolof_only: exclude mixed_fr, mixed, unknown, and variants without sufficient language-purity evidence.

metric_source is either latest_audit (the default) or published. Variants without a known duration remain listed in hours_unknown_for. FLEURS is a benchmark and stays out of training unless include_benchmarks=true. Urban Bus requires include_mixed_language=true. TTS variants stay out of ASR unless explicitly enabled, and derivatives are never added to their parents. Unknown, non-commercial, share-alike, or unconfirmed licenses produce appropriate warnings; commercial_use=null is never presented as commercially compatible.

Persistent Hugging Face validation

african-speech-mcp validate
african-speech-mcp validate --write
african-speech-mcp validate --output validation-lock.json

Validation checks the dataset identifier, config, splits, transcription column, and any declared language column. The lock is written through atomic replacement and records checked_at, observed schema information, and a stable fingerprint. It is also bound to the catalog hash, so the server rejects a stale lock.

By default, --write creates validation-lock.json in the current directory without modifying the installed package. To use it afterward:

export ASM_VALIDATION_LOCK_PATH="$PWD/validation-lock.json"
african-speech-mcp

Possible states are unverified, verified, gated, unavailable, schema_mismatch, and quality_blocked. A responding identifier is never marked verified when the expected config or column is missing. For Afrivoice, set ASM_HF_TOKEN locally before validation; the token is neither serialized nor logged.

corpus_stats filters strictly by config, so FLEURS wo_sn never includes another language. A multilingual distribution without a separate config must declare a language column and accepted values. When the server cannot guarantee that filter, it refuses the request or returns an explicit warning.

Catalog and architecture

src/african_speech_mcp/
├── audit.py              # audited CSV, duration formats, deterministic aggregation
├── catalog.py            # Pydantic v2 variants and invariants
├── cli.py                # serve, validate, catalog-show
├── config.py             # ASM_* settings
├── hf_client.py          # GET only, retries, bounded concurrency
├── models.py             # structured responses
├── server.py             # eight MCP tools
├── validation.py         # schema inspection and atomic lock files
└── data/
    ├── corpora.json      # single canonical catalog
    └── validation-lock.json

There is no longer a second root-level corpora.json. The audit CSV remains canonical under assets/, and Hatch includes it deterministically in the wheel. Tests check totals and references between the CSV and catalog.

Useful variables include ASM_CATALOG_PATH, ASM_VALIDATION_LOCK_PATH, ASM_AUDIT_LOG_PATH, ASM_HF_TOKEN, ASM_REQUEST_TIMEOUT_S, ASM_REQUEST_RETRIES, and ASM_VALIDATION_CONCURRENCY. Runtime logs go to stderr so that stdout remains reserved for the stdio protocol.

Contributing an audit or manifest

A new audit must:

  1. add unit rows to the CSV, never a manual TOTAL row;

  2. provide audit_id, observed_at, source_reference, method, confidence, and verification basis;

  3. distinguish an observed zero from a missing value;

  4. reference the audit from the matching variant;

  5. document limitations in Markdown and add consistency tests.

To enable real filtering, provide a versioned manifest with at least:

audit_id,corpus_key,revision,row_id,audio_path,is_duplicate,is_empty,is_corrupt,is_wolof,transcript_quality,reason

Identifiers must come from the audited snapshot. They must never be invented from aggregate counts.

Development and release preparation

python -m pip install -e ".[dev]"
ruff check src tests scripts
pytest -q
python -m build

CI runs these checks on Python 3.11 and 3.12, installs the built wheel in a clean environment, and tests both the CLI and a real MCP stdio exchange. Version 2.0.0 is a documented breaking release: the public unit is now a single-language, single-task, single-config variant with more structured quality responses.

Publishing a non-prerelease GitHub Release runs .github/workflows/publish-pypi.yml. The workflow verifies the attached distributions, publishes them to PyPI through Trusted Publishing, then validates and publishes the matching server.json to the official MCP Registry through GitHub OIDC. No long-lived PyPI or MCP Registry token is stored. If PyPI succeeded but the registry step failed, rerun the workflow manually with the same tag and registry_only=true; an already active registry version is detected and treated as success.

License

The server code is licensed under Apache-2.0. Each corpus retains its own license. Catalog entries marked TO BE CONFIRMED or SEE DATASET ... intentionally remain uncertain and must be checked against the primary source before any use, especially commercial use.

Available Tools

8 tools
audit_corpusA
Read-onlyIdempotent

Return dated observed quality metrics separately from published figures. Missing observations remain null, never implicit zero.

ParametersJSON Schema
NameRequiredDescriptionDefault
corpusYesVariant key.
audit_idNoSpecific audit snapshot.
include_publishedNoInclude source figures.

Output Schema

ParametersJSON Schema
NameRequiredDescription
taskYes
configNo
corpusYes
countsNo
domainNo
licenceYes
audit_idNo
citationYes
languageYes
speakersNo
warningsNo
durationsNo
confidenceNo
provenanceYes
observed_atNo
speech_typeNo
split_scopeNo
audit_statusYes
quality_notesNo
commercial_useYes
dataset_familyYes
language_purityNo
source_referenceNo
published_metricsNo
measurement_methodNo
verification_basisNo

TDQS

A3.6/5.0
Behavior4/5

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

The description adds a valuable non-obvious behavior: 'Missing observations remain null, never implicit zero.' This goes beyond the annotations, which only declare the operation as read-only, idempotent, and non-destructive. It informs the agent about data representation, which is critical for interpreting results. The description does not contradict 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 a single, tightly worded sentence that states the core purpose and a key behavioral caveat. No filler or redundancy. The most important information (purpose and null handling) is front-loaded. It earns its place entirely.

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?

Given the presence of an output schema, the description does not need to explain return values. It covers the primary action and a critical data-representation detail. The only missing piece is explicit usage context, but that is already scored low under usage guidelines. For a read-only tool with strong annotations and schema coverage, the description is reasonably complete.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (corpus, audit_id, include_published) are already documented in the schema. The description does not add parameter-level details beyond what the schema provides. It mentions 'dated observed quality metrics' but that relates to the output, not the parameters. Baseline 3 applies because the schema carries the full load.

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-resource pairing: 'return dated observed quality metrics'. It distinguishes from published figures, which hints at differentiation from sibling tools like corpus_stats or compare_corpora, though it does not name them explicitly. This is clear but not as sharply differentiated as the calibration example.

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 guidance is given on when to use this tool versus alternatives. It does not mention context, exclusions, or a preferred use case. The mention of 'separately from published figures' implies a distinction but does not state when to choose this over corpus_stats or compare_corpora. An agent would infer usage from the name and parameters rather than from explicit guidance.

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

cite_corpusB
Read-onlyIdempotent

Return licence and citations, including parents of derivatives.

ParametersJSON Schema
NameRequiredDescriptionDefault
corpusYesVariant key.

Output Schema

ParametersJSON Schema
NameRequiredDescription
bibtexYes
licenceYes
homepageYes
also_citeNo
usage_noteNo
commercial_useYes

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, covering the safety profile. The description adds a small behavioral detail beyond annotations — that the result includes parents of derivatives — which is useful. It doesn't contradict annotations, and given the rich annotation coverage the bar is lower, 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 zero filler. The one qualification (including parents of derivatives) is placed where it adds value. It is lean without being under-specified to the point of meaninglessness.

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 a single well-documented parameter, an output schema present, and full annotation coverage, the tool is largely self-documenting. The thin description is adequate but leaves behavioral specifics like output shape and scope unaddressed; the 'including parents of derivatives' hint covers part of that, but not all.

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

Parameters3/5

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

Schema coverage is 100%, and the sole parameter 'corpus' already carries a description ('Variant key.'). The description adds nothing about how this parameter is used or validated, so it sits at the baseline 3 where the schema does the heavy lifting.

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

Purpose4/5

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

The description gives a specific verb (Return) and resource (licence and citations), plus an informative qualifier about including parents of derivatives. This is clear enough for an agent to guess its purpose, though it doesn't explicitly differentiate itself from siblings like audit_corpus or corpus_stats, which a reader might conflate with it.

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 guidance is given about when to use this tool versus any of the seven siblings such as audit_corpus or corpus_stats. An agent must infer context from the name and description alone; there is no statement of when not to use it or which alternative fits which scenario.

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

compare_corporaB
Read-onlyIdempotent

Compare variant quality, provenance, licence and benchmark status.

ParametersJSON Schema
NameRequiredDescriptionDefault
corporaYes

Output Schema

ParametersJSON Schema
NameRequiredDescription
corporaYes
comparedYes
warningsNo

TDQS

B3.1/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds the specific comparison dimensions, which is a form of scoping that slightly goes beyond the annotations. However, it does not disclose any additional behavioral traits (e.g., output format, performance, rate limits) and is mostly a restatement of purpose.

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

Conciseness5/5

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

The description is a single, concise sentence with no fluff. It front-loads the core verb and resource, and lists the key comparison dimensions efficiently. There is no wasted text or redundancy.

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 tool is relatively simple with one parameter, and an output schema exists (so return values are presumably documented elsewhere). However, the description leaves the exact meaning of 'corpora' strings ambiguous and offers no connection to sibling tools like list_corpora for obtaining valid values. It is functional but not fully complete for an agent unfamiliar with the domain.

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 schema description coverage is 0%, so the description must compensate for explaining the 'corpora' parameter. While the tool name and description imply that each string is a corpus identifier, it doesn't clarify whether these are names, IDs, or paths, nor how to obtain them. This is minimal added meaning over the raw schema type.

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 ('Compare') and a specific resource ('corpora') with enumerated dimensions (variant quality, provenance, licence, benchmark status). It clearly conveys what the tool does, though it doesn't explicitly distinguish it from siblings like 'corpus_stats' which might also cover some of these dimensions.

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 guidance is provided on when to use this tool versus alternatives such as list_corpora or corpus_stats. There is no mention of prerequisites, when not to use it, or how it relates to siblings. The usage context is only implied by the verb 'compare'.

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

corpus_statsA
Read-onlyIdempotent

Return rows and schema for exactly one declared dataset configuration.

ParametersJSON Schema
NameRequiredDescriptionDefault
corpusYesVariant key.

Output Schema

ParametersJSON Schema
NameRequiredDescription
splitsYes
columnsYes
warningsNo
provenanceYes
total_rowsYes
declared_splitsYes
observed_configsNo
undeclared_splitsNo

TDQS

A3.8/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds that the tool returns rows and schema, which is useful but superficial; it does not disclose potential error behavior, auth needs, or performance implications. Since the annotations carry most of the burden, the description adds moderate value.

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

Conciseness5/5

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

The description is a single, front-loaded sentence with zero fluff. It immediately states what the tool does and the scope, making it easy for an agent to parse quickly.

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 read-only operation with one parameter and an existing output schema, the description is adequate. It defines the tool's function and scope without leaving major gaps. It does not mention edge cases (e.g., what happens if the corpus key is invalid) but those are minor given the tool's simplicity and the presence of an output schema.

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

Parameters3/5

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

The schema fully documents the sole parameter (corpus: 'Variant key.') with 100% coverage. The description does not add any parameter-specific meaning, so the baseline score of 3 applies—the schema already does the heavy lifting.

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 action (“Return”) and resource (“rows and schema for exactly one declared dataset configuration”), which clearly distinguishes it from siblings like list_corpora (which lists datasets) and search_segments (which searches within data). The phrase 'exactly one' further narrows the scope, making the tool's purpose unambiguous.

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 usage—when you need both the data and structure of a specific dataset configuration—but it does not explicitly state when to choose this tool over alternatives, nor does it mention any exclusions. The usage context 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.

filter_segmentsC
Read-onlyIdempotent

Filter rows only when a versioned row-level audit manifest exists; aggregated audit totals alone produce a structured refusal.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryNo
splitNoDeclared split.
corpusYesVariant key.
min_qualityNoRequested row quality.transcribed
exclude_corruptNo
exclude_non_wolofNo
exclude_duplicatesNo

Output Schema

ParametersJSON Schema
NameRequiredDescription
corpusYes
reasonYes
audit_idNo
segmentsNo
warningsNo
provenanceYes
manifest_pathNo
filter_availableYes
required_manifest_columnsYes

TDQS

C2.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, covering safety and mutability. The description adds a useful behavioral trait: that aggregated audit totals alone trigger a structured refusal. This goes beyond annotations and helps the agent anticipate failure modes. However, it doesn't disclose success behavior, pagination, or return structure, though an output schema exists.

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

Conciseness3/5

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

The description is a single sentence, so it's concise and not bloated. However, it's cryptic and not well-structured—it reads like an error condition rather than an overview. It's front-loaded with the condition but the phrasing is convoluted. It earns its place by adding behavioral info, but clarity suffers.

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

Completeness2/5

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

Given the tool has 8 parameters, 1 required, and an output schema, the description is severely incomplete. It doesn't explain what the tool does with segments, what filters apply, or how output is organized. The output schema covers return values, but the description lacks essential context about the operation's purpose and scope. The precondition about audit manifests is useful but insufficient.

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

Parameters1/5

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

Schema description coverage is only 38%, with split, corpus, and min_quality having descriptions. The description text itself provides no explanation for any parameter (limit, query, exclude_* flags). With low schema coverage, the description should compensate, but it doesn't mention parameters at all. This leaves the agent guessing about parameter meaning and usage.

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 name 'filter_segments' implies filtering rows/segments, and the description begins with 'Filter rows', so the core action is present. However, it doesn't specify what criteria filter on (quality, duplicates, etc.) or what makes it distinct from search_segments. The description is more about a precondition than a clear statement of purpose.

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

Usage Guidelines2/5

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

The description gives no guidance on when to use this tool versus alternatives like search_segments or list_corpora. It only mentions a precondition (versioned row-level audit manifest), which is a behavioral constraint, not a usage guideline. No exclusions or alternative routing are provided.

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

list_corporaB
Read-onlyIdempotent

List language/task/config variants with audit and verification state.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskNoTask filter.
languageNoISO 639-3 filter.
include_derivativesNoInclude derivatives.

Output Schema

ParametersJSON Schema
NameRequiredDescription
totalYes
corporaYes
disclaimerNo
audited_countYes
originals_countYes
queryable_countYes
derivatives_countYes

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is fully covered. The description adds the useful context that the listing surfaces audit/verification state, but it omits scope details like pagination or result limits. Consistent with annotations; no contradiction.

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 ten-word sentence with zero filler. The verb and core output are front-loaded, and nothing needs to be trimmed.

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 listing tool with full schema coverage, rich read-only/idempotent annotations, and an output schema present, the description is largely complete. The only real gap is the absence of sibling-routing guidance, which was already penalized under usage guidelines.

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

Parameters3/5

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

Schema description coverage is 100%, so all three parameters (task, language, include_derivatives) are already documented. The description loosely hints at the filters via 'language/task/config variants' but adds no syntax or format detail beyond the schema. Baseline 3 applies since the schema does the heavy lifting.

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

Purpose4/5

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

The description uses a specific verb-resource pair ('List ... variants') and tells the agent what kind of data is returned (language/task/config variants plus audit and verification state). It does not explicitly differentiate from siblings like audit_corpus or corpus_stats, so it misses the top score.

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. With siblings such as audit_corpus, corpus_stats, and compare_corpora, an agent gets no help deciding between listing state and performing an audit or computing stats. Only implicit usage is conveyed by the verb 'List.'

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

plan_training_setA
Read-onlyIdempotent

Build a de-duplicated variant plan using published or dated audit metrics, with explicit quality, licence, benchmark and language-purity decisions.

ParametersJSON Schema
NameRequiredDescriptionDefault
taskNoRequested task.asr
qualityNoMinimum/selection quality.transcribed
languageNowol
metric_sourceNoMetric provenance.latest_audit
include_benchmarksNoInclude evaluation benchmarks.
include_tts_for_asrNoExplicitly permit TTS variants in an ASR plan.
include_mixed_languageNoOpt in to known mixed-language variants.
exclude_evaluation_setsNoDeprecated compatibility alias for include_benchmarks.

Output Schema

ParametersJSON Schema
NameRequiredDescription
taskYes
qualityYes
includedYes
languageYes
licencesYes
warningsNo
citationsYes
metric_sourceYes
total_durationYes
excluded_variantsYes
hours_unknown_forNo
include_benchmarksYes
include_tts_for_asrYes
excluded_derivativesYes
assumed_valid_durationNo
include_mixed_languageYes
total_hours_transcribedYesCompatibility alias for total_duration.hours_decimal.
expert_verified_durationNo

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, idempotentHint=true, and destructiveHint=false, so the agent knows this is a safe, non-mutating operation. The description adds context about the data source (published or dated audit metrics) and the decision areas (quality, licence, benchmark, language-purity), which is useful but does not disclose any additional behavioral nuances beyond what annotations state. It does not contradict 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.

Conciseness5/5

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

The description is a single, well-constructed sentence that immediately states the core purpose and key differentiators. There is no redundancy or filler; every phrase contributes to understanding the tool's function. It is appropriately concise and front-loaded with the main verb and object.

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?

The tool has 8 parameters but no required ones, an output schema, and safety annotations covering read-only/idempotent behavior. The description provides sufficient purpose and input context for an agent to infer how to invoke it, and the output schema handles return values. However, it does not explain the concept of a 'variant plan' or detail how the quality/licence/benchmark/language-purity decisions are made, which could be ambiguous for an unfamiliar agent. Given the complexity, this is a minor gap, so a 4 is appropriate.

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

Parameters3/5

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

Schema description coverage is 88%, so most parameters already have explanatory text in the schema. The description mentions 'published or dated audit metrics' which maps to the metric_source parameter, and 'language-purity' aligns with include_mixed_language, but these are not elaborated beyond the schema's own descriptions. The description adds high-level context but does not meaningfully clarify individual parameters beyond what the schema already provides.

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

Purpose4/5

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

The description clearly states the tool's purpose: to build a de-duplicated variant plan, using audit metrics and making explicit decisions on quality, licence, benchmark, and language-purity. The verb 'build' and specific resource 'variant plan' differentiate it from sibling tools like list_corpora, search_segments, and filter_segments, which perform more basic operations. It is specific enough for an agent to understand what the tool accomplishes, though it does not elaborate on what a 'variant plan' entails.

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 when to use this tool—when a de-duplicated variant plan with explicit quality and language-purity decisions is needed—but it does not explicitly mention alternatives or conditions when other tools (e.g., filter_segments, corpus_stats) would be more appropriate. No exclusions or contrasting guidance is provided, leaving the agent to infer usage from context rather than clear direction.

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

search_segmentsC
Read-onlyIdempotent

Search a schema-verified variant. Config overrides cannot cross language boundaries; temporary audio URLs are explicitly marked ephemeral.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNo
queryYes
splitNoDeclared split.
configNoCompatibility parameter; must equal the variant config.
corpusYesVariant key.

Output Schema

ParametersJSON Schema
NameRequiredDescription
queryYes
returnedYes
segmentsYes
warningsNo
provenanceYes
total_matchesNo
filter_availableYes

TDQS

C2.6/5.0
Behavior3/5

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

Annotations already declare readOnly/idempotent/destructive status. The description adds specific behavioral constraints (config cannot cross language boundaries, ephemeral audio URLs) that go beyond the annotations, providing some useful context, though limited in scope.

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

Conciseness3/5

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

The description is concise (two sentences) but not front-loaded with a clear purpose. The first sentence is vague, and the second adds peripheral constraints without enriching the core definition.

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

Completeness2/5

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

For a search tool with 5 parameters and an output schema, the description lacks essential context about search semantics, parameter combinations, and result interpretation. It does not suffice to guide correct usage without additional documentation.

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 description coverage is 60%, and the description does not clarify the remaining parameters. The mention of config overrides hints at the config parameter but does not map parameters to their roles, leaving agents to infer meaning from names and schema defaults.

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 states the verb 'Search' and a resource ('a schema-verified variant'), but 'variant' is ambiguous and not tied to the tool's name 'segments'. It does not clearly explain what is searched or what results look like, offering only a weak distinction from siblings.

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 guidance is given on when to use this tool versus alternatives like filter_segments or compare_corpora. The notes about config overrides and audio URLs are operational constraints, not usage direction.

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. 8 tool updatesv2.0.0
    • First observedaudit_corpus
    • First observedcite_corpus
    • First observedcompare_corpora
    • First observedcorpus_stats
    • First observedfilter_segments
    • First observedlist_corpora
    • First observedplan_training_set
    • First observedsearch_segments

TDQS

A3.5/5.0

Scored across 8 tools

Disambiguation5/5

Each tool targets a distinct operation: listing variants, searching segments, getting stats, citing, auditing, planning, filtering, and comparing. Though search_segments and filter_segments both work on segments, their preconditions and purposes are clearly different—search is free-form with overrides, while filter requires a versioned audit manifest. No two tools appear interchangeable.

Naming Consistency4/5

Most tools follow a clear verb_noun pattern (list_corpora, search_segments, cite_corpus, audit_corpus, plan_training_set, filter_segments, compare_corpora). The outlier is 'corpus_stats' which uses noun_noun instead of a get/stats verb, breaking the pattern slightly. This is a minor deviation that doesn't hinder readability.

Tool Count5/5

With 8 tools, the server is well-scoped for its domain of managing and analyzing African speech corpora. Each tool addresses a distinct aspect of the workflow without redundancy or bloat. The count feels just right—not too thin, not overwhelming.

Completeness5/5

The tool surface covers the core lifecycle of corpus exploration and usage: discovering corpora, searching segments, retrieving stats, citations, audit metrics, planning training sets, filtering based on audits, and comparing variants. There are no glaring gaps such as missing download or update operations, as the focus is analysis rather than modification. The server fulfills its stated purpose comprehensively.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    A
    maintenance
    A read-only MCP server that enables natural language querying of DSpace 7+ repositories via the REST API, allowing users to search, retrieve items, and analyze repository data.
    2
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Provides read access to community-written summaries, scores, and reviews of open-source repositories via the RepoCritics corpus. Enables search and retrieval of wiki pages, reviews, metadata, and AI reports for repositories.
    7
    5 npm
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Enables users to search and retrieve research datasets via natural language queries, with tools for proposing and committing tag changes. Includes robust authorization, idempotent mutations, and an audit trail.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables agents to search, retrieve, and list open-licensed documents with verifiable provenance, attaching sha256, DOI, and OpenTimestamps proof to every response.
    1,446 npm
    Creative Commons Zero v1.0 Universal