Search and cite Frédérick Madore's publications, talks, research projects, DH work and CV.
Runs on your machine from its package; the steps are below.
Not assessed yet.
Odel charges nothing per call. The publisher may charge for its own service.
Runs locally over stdio
This server isn't hosted — your MCP client launches it from a package registry. Use one of the commands below, or drop the config into your client (e.g. Claude Desktop).
Distributed as an MCP bundle (`https://github.com/fmadore/Website/releases/download/mcp-v0.3.0/frederickmadore-website.mcpb`) — download it and import the bundle in your MCP client.
Personal academic website for Dr. Frédérick Madore, a historian and digital humanist specializing in Islam in West Africa, religious activism, and digital approaches to African studies.
Live Site: https://www.frederickmadore.com/
This website showcases my academic work including:
This site is built with:
noUncheckedIndexedAccess) - Languagesrc/styles/CSS-README.md)src/lib/data/ (18 categories), auto-discovered via import.meta.globThe same src/lib/data/ records that render the site are also published as static JSON, prerendered with everything else, so external tools never have to scrape HTML. Start at the discovery manifest, which lists each dataset with its size and URL:
| Endpoint | Contents |
|---|---|
/api/index.json | Discovery manifest — datasets, counts, year ranges, and related feeds |
/api/research.json | Research projects with their full narratives, cross-referencing publications and grants |
/api/publications.json | Publications with identifiers, abstracts, tables of contents, citing works, and reviews |
/api/communications.json | Talks and events with venue, coordinates, and panel programmes |
/api/activities.json | Activity entries, including the full body of each |
/api/digital-humanities.json | DH projects with skills, awards, and reviews |
/api/cv.json | Career record keyed by section (appointments, grants, teaching, service, fieldwork, …) |
Every dataset document carries { version, dataset, url, count, items } (/api/cv.json carries { …, person, sections } instead). Keys with no value are omitted rather than serialised as null; each item's url is its canonical page on this site, with external addresses collected in links. Serialisation lives in src/lib/utils/apiPayload.ts and the endpoints in src/routes/api/.
/api/research.json is the one to start a traversal from: research projects are the spine the rest of the corpus hangs off, and it resolves the free-text project label into arrays of publication, communication, grant, and fieldwork ids.
Every dataset carries its full text, not just metadata — publication and talk abstracts, complete activity bodies, project descriptions, and the research narratives. The last of those are authored as markup in src/routes/research/<id>/+page.svelte, so scripts/generate-research-prose.mjs projects them to plain text at prebuild (npm run gen:prose) and CI checks the committed result is fresh. Without it, the substantive writing about each project would be the only prose on the site an API consumer could not read.
Being static, these are read-only and offer no query interface — fetch a dataset and filter locally. Together the six payloads are ~165 KB gzipped, small enough to load whole. /llms.txt and /robots.txt both advertise the manifest.
mcp/ is an MCP server over those documents: twelve tools for searching publications, talks, activities, research and DH projects, reading the CV, and generating citations, plus seven resources exposing the API documents themselves. It serves both the current 2026-07-28 protocol and legacy 2025-era clients over stdio or stateless Streamable HTTP. The data is read from the published JSON and cached in memory, so the server has no second source of truth to drift.
It ships two ways. npm run mcp:pack produces frederickmadore-website.mcpb — an MCP Bundle that Claude Desktop installs on a double-click, with no config file to edit and no Node install required; CI attaches it to every run as the mcpb artifact. Other stdio clients point at mcp/dist/index.js; remote deployments run mcp/dist/http.js. See mcp/README.md.
Citation output is not reimplemented there — the build aliases $lib and bundles the site's own bibtexGenerator, so what the server returns is byte-identical to the site's download button.
The same twelve tools are registered in the page itself for agents browsing the site, through WebMCP (document.modelContext), with one more, show_publications, that opens the publications index on a filtered view. They read the same API documents through the same search and citation code (src/lib/utils/api*.ts), so an agent gets the same answer either way. Chrome exposes WebMCP to pages under its origin trial or with --enable-experimental-web-platform-features; npm run check:agentic asserts Lighthouse 13's Agentic Browsing category on the build, with the tools listed.
Visited pages are cached after both direct and in-app navigation, including pages first opened before the service worker takes control. Filter/search URLs reuse one static document while retaining their URL state. Documents and API responses share a 150-entry runtime cache; images use a separate 80-entry cache. Immutable build scripts and styles already used before worker control are copied into that deployment's asset cache. Unvisited or evicted pages show the offline fallback. Fonts retain normal browser HTTP caching.
git clone https://github.com/fmadore/Website.git
cd Website
npm install
npm run dev
http://localhost:5173| Command | What it does |
|---|---|
npm run check | Type-checks all Svelte components and TS modules (svelte-check) |
npm run lint | Prettier + ESLint (all rules at error) |
npm run test | Vitest unit tests — pure utils, data-integrity validation of all content |
npm run test:coverage | Unit tests with V8 coverage report |
npm run test:e2e | Playwright smoke tests against the production build |
npm run test:all | Alias for the complete npm run verify workflow |
CI runs the full gate (lint, type-check, unit tests, dependency audit, reference-index freshness, build, E2E) on every pull request, and again on the deploy path before publishing. CodeQL scans weekly and on every change.
Run npm run verify before submitting a broad change. It checks formatting and types,
enforces unit coverage, runs the compiled Svelte lifecycle tests, checks generated data
and font freshness, builds once, checks bundle budgets and prerender output, exercises
the MCP transports and bundle, and runs Playwright against that build. It starts its own
preview server so a stale development server cannot satisfy the checks. Set
PLAYWRIGHT_PORT if the default preview port is occupied.
The font check requires Python with FontTools and Brotli installed; set PYTHON to the
interpreter path if needed. Install the configured Playwright browsers with
npx playwright install before the first browser run. Network-dependent dependency,
link, citation, and Lighthouse checks remain separate from the deterministic workflow.
For focused work, npm run test:lifecycle checks chart/map updates, retry, late imports,
and cleanup using the Svelte client compiler. npm run check:generated checks committed
content projections without rewriting them. Pure-logic coverage floors are defined in vitest.config.ts; browser/lifecycle tests
cover separate behaviour. npm run test:timezones checks calendar-date handling in
UTC, America/Toronto, and Africa/Johannesburg.
This project is licensed under the MIT License.