The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the African Speech Corpora Quality Audit listing page.
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.
The quality pipeline keeps the following stages separate:
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.
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:
audit_assumed_valid, not expert verified;source_reported_expert basis;language_purity=mixed_fr;audit_status=pending;observed_at=2026 intentionally has year-only precision.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:
For development, install an editable checkout with the development dependencies:
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:
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:
It can also be started explicitly:
Example Claude Desktop configuration after installing the package, preferably using an absolute path:
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.
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:
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 semanticsquality 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.
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:
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.
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.
A new audit must:
audit_id, observed_at, source_reference, method, confidence, and verification basis;To enable real filtering, provide a versioned manifest with at least:
Identifiers must come from the audited snapshot. They must never be invented from aggregate counts.
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.
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.