Islam West Africa Collection (IWAC)
REMOTE · ISLAM.ZMO.DE · 3 COMPONENTS · SCANNED AUG 3
Read-only access to the Islam West Africa Collection via Hugging Face datasets.
How this component scores in each security and reliability category. Every signal is checked automatically against the live server, and we only credit what we can confirm. How we score →
Endpoint Security80
- The endpoint's TLS certificate is valid, in date, and uses a strong key. View diagnostics → Pass
- No authorisation is required to call this server. Every tool declares its destructiveHint and none is destructive, so open access doesn't expose one. See how to fix → View diagnostics → Partial
- HTTPS is enforced; there's no plaintext access path. View diagnostics → Pass
- The HSTS (Strict-Transport-Security) header is present. View diagnostics → Pass
- DNSSEC check failed: this domain isn't protected by DNSSEC. See how to fix → View diagnostics → Fail
Transport & Reachability100
- Verified streamable-http transport via a live MCP handshake. View diagnostics → Pass
Schema Quality & AI Usability72
- 100% of prompts and resources have a non-trivial description (not blank, and not just the item's name).Pass
- AI-judged instruction clarity (good).Pass
- Context-footprint check failed: tool/resource definitions use about 7742 tokens (~221/item across 35 items; 34 tools + 1 resources), over budget; trim descriptions and params. See how to fix → Fail
- Usage-examples check failed: none of the tools include examples. See how to fix → Fail
Stability & Change Management27
- Stability observed for 8 of 30 days with no destabilising changes; credit accrues until the full window elapses.Partial
Tool Coverage95
- 100% of tools have a non-trivial description (not blank, and not just the tool's name).Pass
- 84% of tool parameters carry a description.Partial
- Structured output schemas are declared (44% of tools); any adoption earns full credit.Pass
Capabilities100
- Implements a current MCP spec version (2026-07-28).Pass
- Supports UI / widget rendering.Pass
Add this component to your MCP client. Where a client-specific snippet is available, pick your client below and copy it straight into your config; otherwise use the connection detail shown.
remote · islam.zmo.de
claude mcp add --transport http fmadore-iwac-mcp-server https://islam.zmo.de/mcp/
[mcp_servers.fmadore-iwac-mcp-server] url = "https://islam.zmo.de/mcp/"
{
"$schema": "https://opencode.ai/config.json",
"mcp": {
"fmadore-iwac-mcp-server": {
"type": "remote",
"url": "https://islam.zmo.de/mcp/",
"enabled": true
}
}
} openclaw mcp add fmadore-iwac-mcp-server --url https://islam.zmo.de/mcp/ --transport streamable-http
mcp_servers:
fmadore-iwac-mcp-server:
url: "https://islam.zmo.de/mcp/" {
"mcpServers": {
"fmadore-iwac-mcp-server": {
"type": "http",
"url": "https://islam.zmo.de/mcp/"
}
}
} The mcpServers block is a cross-client convention. Remote transports vary, so check your client's docs.
Every change we have recorded for this component, newest first. Security-relevant changes are always shown. ▲ marks a change for the better, ▼ a change for the worse; unmarked changes are neutral.
- 3 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 23 to 27. That category is still filling its 30-day observation window: 7 days of observed history at the previous scan, 8 at this one. The score rises as the window fills, whether or not the server changes.
- 2 Aug 26 0
- Server version: 1.3.0 → 1.4.1 functional
- 1 Aug 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 17 to 20. That category is still filling its 30-day observation window: 5 days of observed history at the previous scan, 6 at this one. The score rises as the window fills, whether or not the server changes.
- 31 Jul 26 +3
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
- 30 Jul 26 0
- Server version: 1.0.0 → 1.1.0 functional
- 29 Jul 26 +1
No change was recorded against any check on this day. Stability & Change Management went from 7 to 10. That category is still filling its 30-day observation window: 2 days of observed history at the previous scan, 3 at this one. The score rises as the window fills, whether or not the server changes.
- 28 Jul 26 −1
- The server rewrote its instructions, which are the text every model session reads security
- Tool “get_sentiment_distribution” rewrote its description, which is the text the model reads security
- Schema quality: 170 → 201 ▼ functional
- Resource “coverage-chart” was removed ▼ functional
- Tool coverage: 30% → 44% ▲ functional
- Tool coverage: 74% → 84% ▲ functional
- Schema quality: excellent → good functional
- New resource “iwac-charts” functional
- Server version: 0.12.0 → 1.0.0 functional
- New tool “get_semantic_map” functional
- New tool “get_topic_distribution” functional
- New tool “get_field_distribution” functional
- New tool “get_cooccurrence” functional
- New tool “get_lexical_metrics” functional
- New tool “get_place_distribution” functional
- New tool “get_similar_items” functional
- “get_sentiment_distribution” added an optional parameter “model” cosmetic
- 27 Jul 26 +5
- Schema quality: 4256 → 4784 ▼ functional
- Stability: unverified → 0.03 ▲ functional
- First check of Capabilities: pass functional
- First check of Schema quality: 100 functional
- We updated how we score, so this day's move reflects our rubric, not a change to the server See what changed → functional
Diagnostic detail from the automated scan of this channel: what the scanner observed at each step, so you can see exactly where a check passed or failed. It is informational only and never changes the trust score.
Captured 3 Aug 2026 · Probed https://islam.zmo.de/mcp/
TLS valid
Negotiated TLS 1.3 with TLS_AES_256_GCM_SHA384 .
| Subject | Issuer | Valid from | Valid until | Key | Signature | Serial |
|---|---|---|---|---|---|---|
| CN=*.zmo.de | CN=GEANT TLS RSA 1,O=Hellenic Academic and Research Institutions CA,C=GR | 19 May 2026 | 4 Dec 2026 | RSA 2048 | SHA256-RSA | 4e60f9e2c6c6b0a57ba40eed7264299c |
| SANs: *.zmo.de, zmo.de | ||||||
| CN=GEANT TLS RSA 1,O=Hellenic Academic and Research Institutions CA,C=GR (CA) | CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR | 3 Jan 2025 | 31 Dec 2039 | RSA 3072 | SHA256-RSA | 14d57bf3692228219a5567fa91651b22 |
| CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR (CA) | CN=HARICA TLS RSA Root CA 2021,O=Hellenic Academic and Research Institutions CA,C=GR | 19 Feb 2021 | 13 Feb 2045 | RSA 4096 | SHA256-RSA | 39ca931cef43f3c68e93c7f46489387e |
DNSSEC insecure
Validation of islam.zmo.de. — Not signed
| Zone | DS | Keys | Algorithms | Outcome |
|---|---|---|---|---|
| . | trust_anchor | 20326, 38696 | 8, 8 | Verified |
| de. | present | 26755 | 8 | Verified |
| zmo.de. | absent | Unsigned (proven) parent-signed NSEC/NSEC3 proves an unsigned delegation |
Authentication No authorisation required
The endpoint answered without asking for a token. Anyone who knows the URL can reach it.
| Result | No authorisation required |
|---|---|
| HTTP status | 200 |
| Header | Value |
|---|---|
| strict-transport-security | max-age=63072000; includeSubDomains; preload |
| content-security-policy | frame-ancestors 'self' https://fmadore.github.io https://www.frederickmadore.com https://frederickmadore.com https://slides.frederickmadore.com |
| x-content-type-options | nosniff |
| referrer-policy | strict-origin-when-cross-origin |
| permissions-policy | geolocation=(), midi=(), camera=() |
Transports 2 probes
| Transport | URL | Outcome | Status | Location |
|---|---|---|---|---|
| streamable-http | https://islam.zmo.de/mcp/ | Verified | 200 | |
| http (plaintext) | http://islam.zmo.de/mcp/ | HTTPS enforced |
The tools this component advertises to a client, with an estimated token cost for each. Expand a tool to see its parameters and schema. The per-tool counts are indicative and are not scored directly; the schema's total context footprint is one signal in Schema Quality & AI Usability.
fetch Fetch IWAC item ~148
Retrieve the full text and metadata of one IWAC item by an id returned from `search` (format '<category>:<number>', e.g. 'articles:28576'). Returns {id, title, text, url, metadata}: `text` is the item's OCR / abstract / transcription / description, `url` is the canonical islam.zmo.de link to cite, and `metadata` holds the remaining fields (author, date, country, newspaper, AI sentiment, …). Categories: articles, publications, references, documents, index, audiovisual, images.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Item id from search, e.g. 'articles:28576' or 'references:11045' |
| Name | Type | Req | Description |
|---|---|---|---|
| category | string | yes | — |
| id | string | yes | — |
| metadata | object | yes | — |
| recommended_tool | string | — | — |
| recommended_usage | object | — | — |
| text | string | yes | — |
| text_truncated | boolean | — | — |
| title | string | — | — |
| url | string | — | — |
No examples provided.
get_article Get article details ~118
Get one article (by id): full metadata, the AI abstract (description_ai), AI sentiment, and OCR text. Pass a `keyword` to get ~2000-char excerpts around each match instead of the full (capped) OCR.
| Name | Type | Req | Description |
|---|---|---|---|
| article_id | integer | yes | — |
| context_chars | integer | — | Default 2000, max 5000 |
| keyword | string | — | Return excerpts around matches instead of the full OCR (accent-insensitive) |
| max_excerpts | integer | — | Default 10, max 25 |
No output schema declared.
No examples provided.
get_audiovisual Get audiovisual details ~51
Get one audiovisual record by id, including creator/publisher, media URL, duration, medium, subjects, places, language, source, and IWAC URL.
| Name | Type | Req | Description |
|---|---|---|---|
| audiovisual_id | integer | yes | — |
No output schema declared.
No examples provided.
get_collection_stats Collection statistics ~54
Overall statistics for every IWAC subset, including `fulltext_coverage` — how many items in each subset actually carry searchable full text in this public dataset. Read that before treating any keyword count as a full-text census.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| articles_by_country | object | — | — |
| collection_name | string | yes | — |
| dataset_url | string | yes | — |
| date_range | object | — | — |
| failed_subsets | array | — | — |
| fulltext_coverage | object | — | — |
| fulltext_note | string | — | — |
| newspaper_count | number | — | — |
| subset_counts | object | yes | — |
| total_records | number | yes | — |
| view | string | yes | — |
No examples provided.
get_cooccurrence Co-occurrence matrix ~245
How often the top values of a multi-valued field appear on the SAME item — a subject/place co-mention matrix. Answers 'what is X discussed alongside' without reading anything: the pair counts are the structure of the tagging. Returns the top values, the full symmetric matrix (diagonal = each value's own count) and the strongest pairs.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional) |
| date_from | string | — | YYYY-MM-DD (or YYYY) |
| date_to | string | — | YYYY-MM-DD (or YYYY) |
| field | string | — | subject (default) | spatial | author | language |
| keyword | string | — | ONE French concept keyword; substring over the subset's text fields |
| newspaper | string | — | Newspaper (articles) or periodical/series title (publications) |
| subject | string | — | Exact subject tag (pipe-aware) |
| subset | string | — | articles (default) | publications | references |
| top_n | integer | — | Values on each axis (default 15, max 30) |
| Name | Type | Req | Description |
|---|---|---|---|
| field | string | yes | — |
| filters | object | yes | — |
| matrix | array | yes | — |
| note | string | — | — |
| subset | string | yes | — |
| top_pairs | array | yes | — |
| total_matches | number | yes | — |
| values | array | yes | — |
| view | string | yes | — |
No examples provided.
get_country_comparison Compare countries ~32
Compare article counts, newspaper counts, date ranges, and gemini-3-flash-preview polarity across countries.
Input schema present but exposes no named parameters.
| Name | Type | Req | Description |
|---|---|---|---|
| countries | array | yes | — |
| polarity_model | string | — | — |
| total_countries | number | yes | — |
| view | string | yes | — |
No examples provided.
get_document Get document details ~117
Get one archival document (by id): full metadata, AI description, and OCR text. Pass a `keyword` to get ~2000-char excerpts around each match instead of the full (capped) OCR — useful for long documents.
| Name | Type | Req | Description |
|---|---|---|---|
| context_chars | integer | — | Default 2000, max 5000 |
| document_id | integer | yes | — |
| keyword | string | — | Return excerpts around matches instead of the full OCR (accent-insensitive) |
| max_excerpts | integer | — | Default 10, max 25 |
No output schema declared.
No examples provided.
get_field_distribution Rank a field's values ~299
Rank the values of one multi-valued field across a filtered set — the direct way to answer 'which places does this coverage name most', 'who signs these articles', 'what subjects dominate'. Pipe-joined fields (subject, spatial, author, language, country) are split, so an article tagged 'Prière|Ramadan' counts once for each. Optional over_time adds the per-year share of items that carry ANY value for the field, which is how you see e.g. bylines appearing as the press professionalises.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional) |
| date_from | string | — | YYYY-MM-DD (or YYYY) |
| date_to | string | — | YYYY-MM-DD (or YYYY) |
| field | string | yes | subject | spatial | author | language | newspaper | country |
| keyword | string | — | ONE French concept keyword; substring over the subset's text fields |
| newspaper | string | — | Newspaper (articles) or periodical/series title (publications) |
| over_time | boolean | — | Also return the per-year share of items carrying a value |
| subject | string | — | Exact subject tag (pipe-aware) |
| subset | string | — | articles (default) | publications | references |
| top_n | integer | — | Values returned (default 25, max 100) |
| Name | Type | Req | Description |
|---|---|---|---|
| coverage_by_year | object | — | — |
| distinct_values | number | yes | — |
| field | string | yes | — |
| filters | object | yes | — |
| items_with_value | number | yes | — |
| note | string | — | — |
| other_values | number | — | — |
| subset | string | yes | — |
| total_matches | number | yes | — |
| values | array | yes | — |
| view | string | yes | — |
No examples provided.
get_image Get photograph details ~59
Get one photograph by id: title, photographer, capture date, place and coordinates, subjects, rights, the IIIF manifest, and the full-resolution `image_url`. The server returns URLs, not image bytes.
| Name | Type | Req | Description |
|---|---|---|---|
| image_id | integer | yes | — |
No output schema declared.
No examples provided.
get_index_entry Get index entry details ~44
Get full details of an index entry by id (raw dataset columns, French names — Titre, Prénom, Coordonnées…).
| Name | Type | Req | Description |
|---|---|---|---|
| entry_id | integer | yes | — |
No output schema declared.
No examples provided.
get_lexical_metrics Press language metrics ~304
Readability, lexical richness and length of the press text, averaged by year, newspaper or country. `Lisibilite_OCR` is a French readability score (higher = easier); `Richesse_Lexicale_OCR` is MATTR, a moving-average type-token ratio that is ALREADY length-robust — do not normalise it by word count or bin it by length. Readability is computed against a French lexicon, so non-French items are excluded from that metric (and counted in readability_excluded) rather than reported as unreadable; MATTR and word count need no lexicon and cover everything. Only items whose full text ships in this public dataset carry these columns at all.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional) |
| date_from | string | — | YYYY-MM-DD (or YYYY) |
| date_to | string | — | YYYY-MM-DD (or YYYY) |
| group_by | string | — | year (default) | newspaper | country |
| keyword | string | — | ONE French concept keyword; substring over the subset's text fields |
| newspaper | string | — | Newspaper (articles) or periodical/series title (publications) |
| subject | string | — | Exact subject tag (pipe-aware) |
| top_n | integer | — | Groups returned when grouping by newspaper (default 20, max 60) |
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | — |
| group_by | string | yes | — |
| groups | array | yes | — |
| metrics | object | yes | — |
| note | string | — | — |
| readability_excluded | number | — | — |
| total_matches | number | yes | — |
| view | string | yes | — |
No examples provided.
get_newspaper_stats Newspaper statistics ~49
Per-newspaper article counts and date ranges.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Togo (accents optional) |
| Name | Type | Req | Description |
|---|---|---|---|
| country_filter | string | — | — |
| newspapers | array | yes | — |
| total_articles | number | yes | — |
| total_newspapers | number | yes | — |
| view | string | yes | — |
No examples provided.
get_place_distribution Places on a map ~259
Places named by a filtered set of items, joined to the index's authority records so each carries coordinates where the index has them. Use this rather than get_field_distribution when the question is geographic — where coverage clusters — and the plain ranking when it is not. Only `Lieux` index entries are geocoded (555 of 683); persons, organisations and events carry no coordinates and never will, and any named place with no index entry comes back under `ungeocoded` rather than being dropped.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional) |
| date_from | string | — | YYYY-MM-DD (or YYYY) |
| date_to | string | — | YYYY-MM-DD (or YYYY) |
| keyword | string | — | ONE French concept keyword; substring over the subset's text fields |
| newspaper | string | — | Newspaper (articles) or periodical/series title (publications) |
| subject | string | — | Exact subject tag (pipe-aware) |
| subset | string | — | articles (default) | publications | references |
| top_n | integer | — | Geocoded places returned (default 60, max 200) |
| Name | Type | Req | Description |
|---|---|---|---|
| filters | object | yes | — |
| items_by_country | object | — | — |
| items_with_place | number | yes | — |
| note | string | — | — |
| places | array | yes | — |
| subset | string | yes | — |
| total_matches | number | yes | — |
| ungeocoded | array | — | — |
| ungeocoded_mentions | number | — | — |
| view | string | yes | — |
No examples provided.
get_publication_fulltext Get publication full text ~91
Full OCR text of a publication, optionally returning ~2000-char excerpts around keyword matches (accent-insensitive; capped — see match_count vs excerpts_returned).
| Name | Type | Req | Description |
|---|---|---|---|
| context_chars | integer | — | Default 2000, max 5000 |
| keyword | string | — | — |
| max_excerpts | integer | — | Default 10, max 25 |
| publication_id | integer | yes | — |
No output schema declared.
No examples provided.
get_reference Get reference details ~60
Full bibliographic record for one academic reference (by id), including the complete abstract (present for ~51% of references), subjects, DOI/URL, and host-work details (book, volume, issue, pages).
| Name | Type | Req | Description |
|---|---|---|---|
| reference_id | integer | yes | — |
No output schema declared.
No examples provided.
get_semantic_map Semantic scatter ~397
A 2-D scatter of a filtered set, projected from the stored 768-dimension embeddings by PCA. Shows which items sit near each other in meaning — where a set splits into distinct strands and where it is one cloud. Read `explained_variance` before drawing any conclusion: with 768 dimensions the first two components usually carry a modest share, and a scatter explaining 6% of the variance is a much weaker claim than one explaining 40%. This is PCA, not UMAP: it spreads the broadest axes of variation and flattens fine cluster structure, so it is not comparable to the semantic landscapes on islam.zmo.de. Needs no API key — the vectors are a column in the dataset — but only items whose full text ships are embedded at all. NOTE the payload scales with `limit`: a point cloud is a chart, not something a text-only client can read, so for those the useful part is the explained-variance summary rather than the coordinates. Keep `limit` low unless a chart is going to be drawn.
| Name | Type | Req | Description |
|---|---|---|---|
| color_by | string | — | country | newspaper | subject | lda_topic_label | polarity (gemini-3-flash-preview's label) |
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional) |
| date_from | string | — | YYYY-MM-DD (or YYYY) |
| date_to | string | — | YYYY-MM-DD (or YYYY) |
| keyword | string | — | ONE French concept keyword; substring over the subset's text fields |
| limit | integer | — | Items projected (default 300, max 2000) |
| newspaper | string | — | Newspaper (articles) or periodical/series title (publications) |
| subject | string | — | Exact subject tag (pipe-aware) |
| subset | string | — | articles (default) | publications | references |
| Name | Type | Req | Description |
|---|---|---|---|
| color_by | string | — | — |
| explained_variance | array | yes | — |
| filters | object | yes | — |
| note | string | yes | — |
| points | array | yes | — |
| projected | number | yes | — |
| subset | string | yes | — |
| total_matches | number | yes | — |
| view | string | yes | — |
No examples provided.
get_sentiment_distribution Aggregate AI sentiment ~255
Aggregate AI polarity, centrality and subjectivity across a filter set. Three models scored the corpus independently — gemini-3-flash-preview, gpt-5-mini, ministral-14b-2512 — so model:"all" returns each one's distribution plus how often they AGREE. Treat disagreement as a fact about the judgement rather than noise: in a set where the three models split on polarity, no single model's number should be quoted alone. Articles were scored whether or not their full text ships, so these shares are not subject to the OCR coverage limit; compare scored_by_all against total_articles for the residual gap.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Togo (accents optional) |
| model | string | — | gemini-3-flash-preview | gpt-5-mini | ministral-14b-2512 | all — default gemini-3-flash-preview; "all" adds the cross-model agreement. The vendor shorthands gemini/chatgpt/mistral are also accepted a… |
| newspaper | string | — | — |
| subject | string | — | — |
| Name | Type | Req | Description |
|---|---|---|---|
| agreement | object | — | — |
| agreement_matrix | object | — | — |
| by_model | object | — | — |
| centrality_distribution | object | — | — |
| filters | object | yes | — |
| model | string | yes | — |
| models | array | — | — |
| polarity_distribution | object | — | — |
| subjectivity | object | — | — |
| total_articles | number | yes | — |
| view | string | yes | — |
No examples provided.
get_similar_items Find similar items ~229
The items nearest to a given one in meaning, by cosine similarity over the stored embeddings. Answers 'what else is like this' without a keyword — it finds pieces on the same event or theme that share no vocabulary. A neighbour above ~0.85 is usually the same story reprinted or lightly rewritten, which is how to spot syndication in this corpus; 0.6-0.8 is 'same subject, different piece'. Needs no API key: the item's own vector is a column, so nothing has to be embedded at request time. This is per-item, NOT the corpus-wide near-duplicate sweep — that is an all-pairs job and belongs offline.
| Name | Type | Req | Description |
|---|---|---|---|
| id | string | yes | Item id — either a bare o:id ('3064') or the namespaced form search returns ('articles:3064') |
| limit | integer | — | Neighbours returned (default 12, max 50) |
| min_score | number | — | Drop neighbours below this cosine similarity (0-1) |
| subset | string | — | articles (default) | publications | references |
| Name | Type | Req | Description |
|---|---|---|---|
| neighbours | array | yes | — |
| note | string | yes | — |
| source | object | yes | — |
| subset | string | yes | — |
| view | string | yes | — |
No examples provided.
get_temporal_distribution Coverage over time ~469
Counts of matching items per year (or month) — the direct way to chart coverage trends over time instead of paging through search results. Defaults to articles; also works on publications, references, documents, audiovisual, and images. Accepts the same filters as the corresponding search_* tool (keyword = ONE substring over the subset's text fields, country, newspaper/series, subject, date range). Optional group_by=country|newspaper returns one distribution per group. Items dated only to a year keep a bare-year key even at month granularity; undated items are counted in undated_count, never dropped silently. Set calendar=hijri to bucket by the Islamic (Umm al-Qura) calendar instead — with granularity=lunar_month this collapses every year into the twelve lunar months, which is the ONLY way to see observance-driven coverage (Ramadan, Dhu al-Hijja/hajj, Shawwal/Korité): the lunar year drifts ~11 days against the Gregorian, so a Gregorian axis smears each observance across all twelve months. Hijri buckets need a full YYYY-MM-DD, so items dated only to a year or month are reported in imprecise_date_count.
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | string | — | gregorian (default) | hijri — bucket by the Islamic (Umm al-Qura) calendar |
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional) |
| date_from | string | — | YYYY-MM-DD (or YYYY) |
| date_to | string | — | YYYY-MM-DD (or YYYY) |
| granularity | string | — | year (default) | month | lunar_month (all years collapsed into 12 lunar months; needs calendar=hijri) |
| group_by | string | — | country | newspaper — one distribution per group value |
| keyword | string | — | ONE French concept keyword (French/English for references); substring over the subset's text fields |
| newspaper | string | — | Newspaper (articles) or periodical/series title (publications) |
| subject | string | — | Exact subject tag (pipe-aware) |
| subset | string | — | articles (default) | publications | references | documents | audiovisual |
| Name | Type | Req | Description |
|---|---|---|---|
| calendar | string | — | — |
| dated_count | number | yes | — |
| distribution | object | — | — |
| distribution_by_group | object | — | — |
| filters | object | yes | — |
| granularity | string | yes | — |
| group_by | string | — | — |
| imprecise_date_count | number | — | — |
| month_labels | object | — | — |
| note | string | — | — |
| subset | string | yes | — |
| total_matches | number | yes | — |
| undated_count | number | yes | — |
| view | string | yes | — |
No examples provided.
get_topic_distribution Topic distribution ~339
How a filtered set distributes across the precomputed LDA topics, each labelled by its top terms (articles carry 30 topics and are ~99.5% classified; references have their own 33-topic model and only ~46% carry an assignment, so read its `classified` against `total_matches`). Topics are assigned offline over the full text, so they describe what a piece is ABOUT rather than which words it contains — use this instead of keyword counting to map a corpus. Optional over_time returns per-year counts for the leading topics. min_prob keeps only articles where the topic is at least that dominant (mean assignment probability is 0.34, so 0.5 is already a strong filter).
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional) |
| date_from | string | — | YYYY-MM-DD (or YYYY) |
| date_to | string | — | YYYY-MM-DD (or YYYY) |
| keyword | string | — | ONE French concept keyword; substring over the subset's text fields |
| min_prob | number | — | 0-1; keep only assignments at or above this probability |
| newspaper | string | — | Newspaper (articles) or periodical/series title (publications) |
| over_time | boolean | — | Also return per-year counts for the leading topics |
| subject | string | — | Exact subject tag (pipe-aware) |
| subset | string | — | articles (default) | references |
| top_n | integer | — | Topics given their own band in over_time (default 8, max 15) |
| Name | Type | Req | Description |
|---|---|---|---|
| classified | number | yes | — |
| filters | object | yes | — |
| note | string | — | — |
| periods | array | — | — |
| series_by_topic | object | — | — |
| subset | string | yes | — |
| topics | array | yes | — |
| total_matches | number | yes | — |
| view | string | yes | — |
No examples provided.
list_audiovisual List audiovisual materials ~87
List audiovisual materials (Nigerian recordings, incl. Hausa/Arabic content).
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional). The subset is currently all Nigeria |
| limit | integer | — | Default 20, max 50 |
| offset | integer | — | — |
No output schema declared.
No examples provided.
list_locations List lieux from the index ~164
List lieux from the IWAC index, sorted by frequency (most-referenced first). The optional 'country' filter selects entries that APPEAR IN records from that country (mentioned-in, not located-in), ranked by collection-wide 'frequency' — so foreign and cross-border entries can appear. Nigeria returns none here (index frequency is computed from articles + publications + references, which have no Nigerian items — Nigeria is audiovisual only).
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional). Selects lieux MENTIONED IN records from that country, not entities located there |
| limit | integer | — | Default 50, max 200 |
| offset | integer | — | — |
No output schema declared.
No examples provided.
list_periodicals List periodicals ~76
List the Islamic periodical/series titles in the publications subset, with issue counts and year ranges. Use the returned newspaper value as the `newspaper` filter on search_publications.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Togo (accents optional) |
| Name | Type | Req | Description |
|---|---|---|---|
| country_filter | string | — | — |
| periodicals | array | yes | — |
| total_periodicals | number | yes | — |
| view | string | yes | — |
No examples provided.
list_persons List personnes from the index ~165
List personnes from the IWAC index, sorted by frequency (most-referenced first). The optional 'country' filter selects entries that APPEAR IN records from that country (mentioned-in, not located-in), ranked by collection-wide 'frequency' — so foreign and cross-border entries can appear. Nigeria returns none here (index frequency is computed from articles + publications + references, which have no Nigerian items — Nigeria is audiovisual only).
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional). Selects personnes MENTIONED IN records from that country, not entities located there |
| limit | integer | — | Default 50, max 200 |
| offset | integer | — | — |
No output schema declared.
No examples provided.
list_subjects List sujets from the index ~47
List sujets from the IWAC index, sorted by frequency (most-referenced first).
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Default 50, max 200 |
| offset | integer | — | — |
No output schema declared.
No examples provided.
search Search IWAC ~308
Search the Islam West Africa Collection across newspaper articles, Islamic publications, archival documents, academic references, audiovisual recordings, photographs, and the authority index (persons/places/organisations/events/subjects). Pass ONE concept or name — e.g. 'Tijaniyya', 'laïcité', 'Sheikh Gumi', 'pèlerinage'. Matching is accent- and case-insensitive; a multi-word query requires every word to appear somewhere in the item, so prefer a single concept per call. Write query strings and concept keywords in French for press/publication/document/index discovery even when the user's report language is not French. Academic references are multilingual, so try French and English title/abstract terms when relevant; metadata/filter labels remain French. Use the French transliteration of Islamic terms (Tabaski not 'Eid al-Adha', charia not 'sharia', Maouloud not 'Mawlid'). Returns {results:[{id,title,url,category}], ranking}; each result's `category` names its subset and the `ranking` field documents the ordering. Pass an id to `fetch` to read the full text. For filtered queries (by country, date, or newspaper) use the search_* tools instead.
| Name | Type | Req | Description |
|---|---|---|---|
| limit | integer | — | Max results across all categories. Default 20, max 50. |
| query | string | yes | One concept, name, or short phrase; use French concept terms for primary sources, and French/English terms for references |
| Name | Type | Req | Description |
|---|---|---|---|
| count | integer | yes | — |
| coverage_warning | string | — | — |
| deep_scan | boolean | yes | — |
| limit | integer | yes | — |
| limit_warning | string | — | — |
| ranking | string | yes | — |
| requested_limit | integer | — | — |
| results | array | yes | — |
| unavailable_categories | array | — | — |
No examples provided.
search_articles Search newspaper articles ~300
Search IWAC newspaper articles by keyword (title + OCR + AI abstract), country, newspaper, subject, and date range. Use French concept keywords regardless of the user's report language. Matching is accent- and case-insensitive.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Togo (accents optional) |
| date_from | string | — | YYYY-MM-DD (or YYYY) |
| date_to | string | — | YYYY-MM-DD (or YYYY) |
| hijri_month | string | — | Islamic lunar month: 1-12, or a name (Ramadan, Chaabane, Chawwal, Dhu al-Hijja). Pulls the articles behind an observance peak — matches only items with a full YYYY-MM-DD date. |
| hijri_year | integer | — | Islamic (Umm al-Qura) year, e.g. 1445 |
| keyword | string | — | French concept keyword; substring match on title, OCR text, and AI abstract |
| limit | integer | — | Default 20, max 100 |
| newspaper | string | — | — |
| offset | integer | — | — |
| subject | string | — | — |
| with_description | boolean | — | Include each article's ~500-char AI abstract (description_ai) for triage without get_article. Adds ~125 tokens/row, so pass a smaller limit (≤10) when enabling it. |
No output schema declared.
No examples provided.
search_audiovisual Search audiovisual materials ~165
Search audiovisual materials by keyword and metadata. Keyword matches title, creator, publisher, subject, spatial, language, source, and AI description where present.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional). The subset is currently all Nigeria |
| keyword | string | — | Substring match across audiovisual title/metadata fields |
| language | string | — | Exact language value, e.g. Haoussa | Arabe | Anglais |
| limit | integer | — | Default 20, max 50 |
| medium | string | — | Exact medium: audio | video (validated) |
| offset | integer | — | — |
| subject | string | — | Exact subject tag |
No output schema declared.
No examples provided.
search_by_sentiment Filter articles by AI sentiment ~172
Filter articles by gemini-3-flash-preview sentiment labels (accent/case-insensitive exact match). One model's reading, not a consensus — two other models scored the same articles and often disagree; get_sentiment_distribution with model:"all" shows by how much.
| Name | Type | Req | Description |
|---|---|---|---|
| centrality | string | — | Très central | Central | Secondaire | Marginal | Non abordé |
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Togo (accents optional) |
| limit | integer | — | Default 20, max 100 |
| offset | integer | — | — |
| polarity | string | — | Très positif | Positif | Neutre | Négatif | Très négatif | Non applicable |
| subject | string | — | — |
No output schema declared.
No examples provided.
search_documents Search archival documents ~150
Search the small archival-documents subset (~26 items: Islamic association reports, flyers, project documents — mostly Burkina Faso). Use French concept keywords regardless of the user's report language. Most have OCR text and an AI description. Call with no arguments to list all.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional). Corpus is mostly Burkina Faso/Togo/Benin |
| keyword | string | — | French concept keyword; substring match on title, OCR, AI description and subject (accent-insensitive) |
| limit | integer | — | Default 15, max 50 |
| offset | integer | — | — |
No output schema declared.
No examples provided.
search_images Search photographs ~261
Search the IWAC photographs (30 items: mosques, radio stations, schools, signage and street scenes documented during fieldwork). Keyword matches title, creator, subject, place and the rare caption. Each result carries `image_url` (the full-resolution file), `coordinates` ('lat, lng' where known) and the canonical IWAC page. Call with no arguments to list all. Captions are almost never present, so prefer subject/place filters over keywords, or semantic_search_images when it is enabled.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional) |
| creator | string | — | Photographer name (substring match) |
| date_from | string | — | YYYY-MM-DD (or YYYY) |
| date_to | string | — | YYYY-MM-DD (or YYYY) |
| keyword | string | — | French concept keyword; substring match on title, creator, subject, place and caption |
| limit | integer | — | Default 20, max 50 |
| offset | integer | — | — |
| spatial | string | — | Exact place name, e.g. Ouagadougou (pipe-aware) |
| subject | string | — | Exact subject tag (pipe-aware) |
No output schema declared.
No examples provided.
search_index Search authority index ~120
Search the IWAC authority index (persons, places, organisations, events, subjects) by name. Accent/case-insensitive.
| Name | Type | Req | Description |
|---|---|---|---|
| index_type | string | — | Exact type (accents optional), validated against: Personnes | Lieux | Organisations | Événements | Sujets | Notices d'autorité. An unrecognised value returns an error listing the valid types. |
| keyword | string | yes | Search term matched against the entry title |
| limit | integer | — | Default 20, max 100 |
| offset | integer | — | — |
No output schema declared.
No examples provided.
search_publications Search publications ~310
Search Islamic publications (periodical issues, books). `keyword` matches title, subject, table of contents, and full OCR text (TOC hits come back as matching_toc_entries); use French concept keywords regardless of the user's report language. Filter by newspaper/series, subject, country and year. Use list_periodicals to discover series titles, and get_publication_fulltext for keyword excerpts from a single issue.
| Name | Type | Req | Description |
|---|---|---|---|
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Togo (accents optional) |
| date_from | string | — | Earliest year, YYYY |
| date_to | string | — | Latest year, YYYY |
| hijri_month | string | — | Islamic lunar month: 1-12, or a name (Ramadan, Chaabane, Chawwal, Dhu al-Hijja). Matches only issues with a full YYYY-MM-DD date — ~83% of them. |
| hijri_year | integer | — | Islamic (Umm al-Qura) year, e.g. 1445 |
| keyword | string | — | French concept keyword; substring match on title + subject + table of contents + OCR (accent-insensitive) |
| limit | integer | — | Default 20, max 100 |
| newspaper | string | — | Periodical/series title (see list_periodicals) |
| offset | integer | — | — |
| subject | string | — | Subject tag (~87% of issues are tagged) |
No output schema declared.
No examples provided.
search_references Search academic references ~357
Search academic references (journal articles, book chapters, theses, books, reports) by keyword and metadata. `keyword` is a single substring match over title + abstract, so search ONE term per call (combined terms like 'pèlerinage Mecque' miss results). References are multilingual: try French and English title/abstract keywords when relevant; metadata/filter values such as `reference_type` and `language` use French labels. Results include a short abstract snippet — use get_reference for the full abstract and bibliographic detail.
| Name | Type | Req | Description |
|---|---|---|---|
| author | string | — | — |
| country | string | — | Exact country name: Benin | Burkina Faso | Côte d'Ivoire | Niger | Nigeria | Togo (accents optional) |
| date_from | string | — | Earliest year, YYYY |
| date_to | string | — | Latest year, YYYY |
| keyword | string | — | One French or English concept keyword; substring match on title + abstract (one term per call, accent-insensitive) |
| language | string | — | e.g. Français | Anglais |
| limit | integer | — | Default 20, max 100 |
| offset | integer | — | — |
| reference_type | string | — | Substring match. Values: Article de revue | Chapitre de livre | Livre | Mémoire de maitrise | Rapport | Thèse de doctorat | Communication scientifique | Compte rendu de livre | Article d'encyclopédie… |
| subject | string | — | Subject tag (sparse: ~27% of references are tagged) |
No output schema declared.
No examples provided.