Skip to content

Commit 44b5243

Browse files
committed
Release v0.10.0
Highlights since v0.9.0 (PR #7): - Correctness: LIKE-metacharacter escaping, temporal-distribution filter validation, NFC accent folding on the excerpt path, newspaper-count guards, audiovisual medium validation, collection-stats failure envelope - Robustness: Gemini embed timeout, memoized semantic index build, proper HTTP 413/error handling - Tooling: hermetic HTTP-transport test, manifest parity check, Biome lint, tested-and-smoke-tested release pipeline (image pushed only after the suite passes), lockfile-pinned DuckDB bindings in the .mcpb bundles - Docs: remote HTTP/Docker deployment documented, connection guide linked, skill guidance corrected; July 2026 dataset-refresh pins (47 audiovisual) Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01D43DimDGSAPSR1apd3q4Zm
1 parent 6bfc1fc commit 44b5243

3 files changed

Lines changed: 119 additions & 33 deletions

File tree

mcpb/manifest.json

Lines changed: 116 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"manifest_version": "0.3",
33
"name": "iwac-mcp-server",
44
"display_name": "Islam West Africa Collection (IWAC)",
5-
"version": "0.9.0",
5+
"version": "0.10.0",
66
"description": "Read-only access to the Islam West Africa Collection via Hugging Face datasets.",
77
"long_description": "Search and analyse the Islam West Africa Collection (IWAC): ~12,000 newspaper articles, 1,500 Islamic publications (searchable by keyword, subject, series, and table of contents), 4,700 index entries, plus audiovisual materials, archival documents, and academic references. Includes AI sentiment analysis (Gemini polarity/centrality), per-article AI abstracts, and per-year coverage timelines. All matching is accent- and case-insensitive.\n\n**No API key is required for the 25 core tools** (cross-subset search/fetch, keyword search, filtering, statistics, timelines, item details). Two optional semantic-search tools use Gemini embeddings — covering all articles and the publication series with tables of contents — and need a free Google/Gemini API key; these are disabled by default.\n\nOn first use the server downloads ~250 MB of parquet data from Hugging Face into a local cache.",
88
"author": {
@@ -37,7 +37,9 @@
3737
"entry_point": "server/index.js",
3838
"mcp_config": {
3939
"command": "node",
40-
"args": ["${__dirname}/server/index.js"],
40+
"args": [
41+
"${__dirname}/server/index.js"
42+
],
4143
"env": {
4244
"IWAC_CACHE_DIR": "${user_config.cache_dir}",
4345
"IWAC_SEMANTIC_SEARCH_ENABLED": "${user_config.semantic_search_enabled}",
@@ -47,37 +49,121 @@
4749
}
4850
},
4951
"tools": [
50-
{ "name": "search", "description": "Cross-subset search across IWAC articles, publications, documents, references, index records, and audiovisual materials. Returns namespaced ids for fetch." },
51-
{ "name": "fetch", "description": "Fetch one IWAC item by a namespaced id returned from search, including canonical URL, text, category, and metadata." },
52-
{ "name": "search_articles", "description": "Search newspaper articles by French keyword (title, OCR, AI abstract), country, newspaper, subject, and date range." },
53-
{ "name": "get_article", "description": "Get full metadata, AI abstract, sentiment, and OCR text for a specific article." },
54-
{ "name": "semantic_search_articles", "description": "Optional. Semantic similarity search over article OCR. Disabled by default — requires a free Google/Gemini API key." },
55-
{ "name": "search_by_sentiment", "description": "Filter articles by Gemini polarity and centrality labels." },
56-
{ "name": "get_sentiment_distribution", "description": "Aggregate Gemini sentiment stats across a filter set." },
57-
{ "name": "search_index", "description": "Search the authority index (persons, places, organisations, events, subjects)." },
58-
{ "name": "get_index_entry", "description": "Get full details of an index entry." },
59-
{ "name": "list_subjects", "description": "List subject terms ranked by frequency." },
60-
{ "name": "list_locations", "description": "List locations from the index, ranked by frequency. The optional country filter selects places mentioned in that country's records (not places located there)." },
61-
{ "name": "list_persons", "description": "List persons from the index, ranked by frequency. The optional country filter selects persons mentioned in that country's records." },
62-
{ "name": "get_collection_stats", "description": "Overall stats for all six IWAC subsets." },
63-
{ "name": "get_newspaper_stats", "description": "Per-newspaper article counts and date ranges." },
64-
{ "name": "get_country_comparison", "description": "Compare article counts and sentiment across countries." },
65-
{ "name": "get_temporal_distribution", "description": "Coverage over time: counts of matching items per year or month, with the standard filters and optional grouping by country or newspaper." },
66-
{ "name": "search_publications", "description": "Search Islamic publications (periodical issues, books) by French keyword (title, subject, table of contents, OCR), series, subject, country, and year." },
67-
{ "name": "list_periodicals", "description": "List the periodical/series titles in the publications subset, with issue counts and year ranges." },
68-
{ "name": "get_publication_fulltext", "description": "Retrieve full OCR text of a publication, optionally with capped keyword excerpts." },
69-
{ "name": "semantic_search_publications", "description": "Optional. Semantic similarity search over publication tables of contents (17 of 25 series covered). Disabled by default — requires a free Google/Gemini API key." },
70-
{ "name": "search_references", "description": "Search multilingual academic references (journal articles, chapters, theses, books, reports) by title/abstract keyword, author, French metadata labels, country, language, and year; returns an abstract snippet." },
71-
{ "name": "get_reference", "description": "Get the full bibliographic record for a reference, including the complete abstract, DOI, subjects, and host-work details." },
72-
{ "name": "search_documents", "description": "Search the archival-documents subset with French keywords (association reports, flyers — mostly Burkina Faso)." },
73-
{ "name": "get_document", "description": "Get full metadata, AI description, and OCR text for an archival document." },
74-
{ "name": "search_audiovisual", "description": "Search audiovisual materials by keyword and metadata (Nigeria; includes Hausa and Arabic recordings)." },
75-
{ "name": "get_audiovisual", "description": "Get full metadata and media URL for a specific audiovisual record." },
76-
{ "name": "list_audiovisual", "description": "List audiovisual materials (Nigeria; includes Hausa and Arabic recordings)." }
52+
{
53+
"name": "search",
54+
"description": "Cross-subset search across IWAC articles, publications, documents, references, index records, and audiovisual materials. Returns namespaced ids for fetch."
55+
},
56+
{
57+
"name": "fetch",
58+
"description": "Fetch one IWAC item by a namespaced id returned from search, including canonical URL, text, category, and metadata."
59+
},
60+
{
61+
"name": "search_articles",
62+
"description": "Search newspaper articles by French keyword (title, OCR, AI abstract), country, newspaper, subject, and date range."
63+
},
64+
{
65+
"name": "get_article",
66+
"description": "Get full metadata, AI abstract, sentiment, and OCR text for a specific article."
67+
},
68+
{
69+
"name": "semantic_search_articles",
70+
"description": "Optional. Semantic similarity search over article OCR. Disabled by default — requires a free Google/Gemini API key."
71+
},
72+
{
73+
"name": "search_by_sentiment",
74+
"description": "Filter articles by Gemini polarity and centrality labels."
75+
},
76+
{
77+
"name": "get_sentiment_distribution",
78+
"description": "Aggregate Gemini sentiment stats across a filter set."
79+
},
80+
{
81+
"name": "search_index",
82+
"description": "Search the authority index (persons, places, organisations, events, subjects)."
83+
},
84+
{
85+
"name": "get_index_entry",
86+
"description": "Get full details of an index entry."
87+
},
88+
{
89+
"name": "list_subjects",
90+
"description": "List subject terms ranked by frequency."
91+
},
92+
{
93+
"name": "list_locations",
94+
"description": "List locations from the index, ranked by frequency. The optional country filter selects places mentioned in that country's records (not places located there)."
95+
},
96+
{
97+
"name": "list_persons",
98+
"description": "List persons from the index, ranked by frequency. The optional country filter selects persons mentioned in that country's records."
99+
},
100+
{
101+
"name": "get_collection_stats",
102+
"description": "Overall stats for all six IWAC subsets."
103+
},
104+
{
105+
"name": "get_newspaper_stats",
106+
"description": "Per-newspaper article counts and date ranges."
107+
},
108+
{
109+
"name": "get_country_comparison",
110+
"description": "Compare article counts and sentiment across countries."
111+
},
112+
{
113+
"name": "get_temporal_distribution",
114+
"description": "Coverage over time: counts of matching items per year or month, with the standard filters and optional grouping by country or newspaper."
115+
},
116+
{
117+
"name": "search_publications",
118+
"description": "Search Islamic publications (periodical issues, books) by French keyword (title, subject, table of contents, OCR), series, subject, country, and year."
119+
},
120+
{
121+
"name": "list_periodicals",
122+
"description": "List the periodical/series titles in the publications subset, with issue counts and year ranges."
123+
},
124+
{
125+
"name": "get_publication_fulltext",
126+
"description": "Retrieve full OCR text of a publication, optionally with capped keyword excerpts."
127+
},
128+
{
129+
"name": "semantic_search_publications",
130+
"description": "Optional. Semantic similarity search over publication tables of contents (17 of 25 series covered). Disabled by default — requires a free Google/Gemini API key."
131+
},
132+
{
133+
"name": "search_references",
134+
"description": "Search multilingual academic references (journal articles, chapters, theses, books, reports) by title/abstract keyword, author, French metadata labels, country, language, and year; returns an abstract snippet."
135+
},
136+
{
137+
"name": "get_reference",
138+
"description": "Get the full bibliographic record for a reference, including the complete abstract, DOI, subjects, and host-work details."
139+
},
140+
{
141+
"name": "search_documents",
142+
"description": "Search the archival-documents subset with French keywords (association reports, flyers — mostly Burkina Faso)."
143+
},
144+
{
145+
"name": "get_document",
146+
"description": "Get full metadata, AI description, and OCR text for an archival document."
147+
},
148+
{
149+
"name": "search_audiovisual",
150+
"description": "Search audiovisual materials by keyword and metadata (Nigeria; includes Hausa and Arabic recordings)."
151+
},
152+
{
153+
"name": "get_audiovisual",
154+
"description": "Get full metadata and media URL for a specific audiovisual record."
155+
},
156+
{
157+
"name": "list_audiovisual",
158+
"description": "List audiovisual materials (Nigeria; includes Hausa and Arabic recordings)."
159+
}
77160
],
78161
"compatibility": {
79162
"claude_desktop": ">=0.10.0",
80-
"platforms": ["darwin", "win32"],
163+
"platforms": [
164+
"darwin",
165+
"win32"
166+
],
81167
"runtimes": {
82168
"node": ">=18.0.0"
83169
}

mcpb/package-lock.json

Lines changed: 2 additions & 2 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mcpb/package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "iwac-mcp-server-bundle",
3-
"version": "0.9.0",
3+
"version": "0.10.0",
44
"description": "Node MCP server for the Islam West Africa Collection, packaged as a Claude Desktop extension (.mcpb).",
55
"private": true,
66
"type": "module",

0 commit comments

Comments
 (0)