MCP server: One MCP server.

Frédérick Madore — Academic Record

@fmadoreMCP server · External

Search and cite Frédérick Madore's publications, talks, research projects, DH work and CV.

Academic papersv0.3.0MITTypeScript
Freeno charge per call

Runs on your machine from its package; the steps are below.

What it does

  1. Reads
  2. Writes
  3. High impact

Not assessed yet.

What it costs

Free

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).

MCP Bundlehttps://github.com/fmadore/Website/releases/download/mcp-v0.3.0/frederickmadore-website.mcpb

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.

README6 min read

Dr. Frédérick Madore - Academic Website

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/

About

This website showcases my academic work including:

  • Research Projects: Focus on Islam in West Africa, religious activism on university campuses in Togo and Benin, and digital humanities approaches to African studies
  • Publications: Books, journal articles, chapters, and other scholarly works
  • Digital Humanities: Projects like the Islam West Africa Collection (IWAC)
  • Teaching: Course materials and teaching philosophy
  • Activities: Conferences, workshops, and academic events

Research Focus Areas

  • Islam in West Africa (Burkina Faso, Côte d'Ivoire, Benin, Togo)
  • Religious activism on university campuses
  • Digital humanities applications in African studies
  • Muslim minorities in urban contexts

Major Projects

  • Digital Humanities and AI in African Studies: Exploring how DH and AI can transform knowledge production in African studies through ethical, sustainable, and Africa-centred digital infrastructures
  • Religious Activism on Campuses in Togo and Benin: Research on Christian and Muslim student organizations
  • Muslim Minorities in Southern Cities of Benin and Togo
  • Youth and Women's Islamic Activism in Côte d'Ivoire and Burkina Faso

Technical Implementation

This site is built with:

  • SvelteKit 2 with Svelte 5 runes - Frontend framework, fully prerendered to static HTML
  • TypeScript (strict, noUncheckedIndexedAccess) - Language
  • Custom token-driven CSS system — the Ink + Signal design language (see src/styles/CSS-README.md)
  • Content as typed TypeScript data files in src/lib/data/ (18 categories), auto-discovered via import.meta.glob
  • Deployed to GitHub Pages via GitHub Actions

Machine-Readable Data

The 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:

EndpointContents
/api/index.jsonDiscovery manifest — datasets, counts, year ranges, and related feeds
/api/research.jsonResearch projects with their full narratives, cross-referencing publications and grants
/api/publications.jsonPublications with identifiers, abstracts, tables of contents, citing works, and reviews
/api/communications.jsonTalks and events with venue, coordinates, and panel programmes
/api/activities.jsonActivity entries, including the full body of each
/api/digital-humanities.jsonDH projects with skills, awards, and reviews
/api/cv.jsonCareer 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 Server

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.

WebMCP

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.

Offline browsing

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.

Development

Running Locally

  1. Clone this repository
    bash
    git clone https://github.com/fmadore/Website.git
    cd Website
    
  2. Install dependencies (Node ≥ 24)
    bash
    npm install
    
  3. Start the development server
    bash
    npm run dev
    
  4. Open your browser and navigate to http://localhost:5173

Quality Gates

CommandWhat it does
npm run checkType-checks all Svelte components and TS modules (svelte-check)
npm run lintPrettier + ESLint (all rules at error)
npm run testVitest unit tests — pure utils, data-integrity validation of all content
npm run test:coverageUnit tests with V8 coverage report
npm run test:e2ePlaywright smoke tests against the production build
npm run test:allAlias 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.

License

This project is licensed under the MIT License.

Similar modules

Browse Academic papers