Mukoko News

io.github.nyuchiPublished by GitHub account nyuchiv1.2.0Updated Oct 24, 2026

Pan-African news & analytics for Zimbabwe and 15 African countries: briefings and trends.

The publisher's own server: Nhimbe Events

VerifiedStreamable HTTPWeb executableWeb Search & ScrapingData & Analytics

Overview

AI-generated overview

Mukoko News gives an assistant read access to aggregated Pan-African news, with briefings, story tracking, search, article reading and coverage analytics.

What you can do
Get briefings, trending topics and location news for African countries, regions or cities, and compare coverage between places or sources. Search articles by keyword, tag, category or country, and read a full article body inline by ID or slug. Track how a story developed over time and list categories and sources with counts. View open analytics on trending topics, categories, keywords and sources, and detect sudden surges in coverage. Run AI enrichment over articles, restricted to platform-team accounts.
When to use it
Useful when an assistant needs current African news context: country or regional briefings, following a developing story, comparing how places or outlets cover a topic, or pulling open coverage statistics. Not needed for non-news tasks.
Requirements
Runs as a remote HTTP endpoint at news.mukoko.dev/mcp, or locally via npx from the npm package. Read tools work anonymously. The personalised feed and the enrichment tools need an Authorization Bearer WorkOS access token, and enrichment requires a platform-team account.
Before you install
The enrichment tools change platform data by running classification, keyword, entity and quality scoring over articles, and the backlog tool starts a long-running job; both are restricted to platform-team accounts. The personalised feed requires a WorkOS bearer token, which is a credential. All news content comes from third-party newsrooms.

Installation

In SourceWeft

  1. Open Mukoko News in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Web executable via Streamable HTTP. Remote servers run from the web runtime once configured in a workspace.

Use with an agent

Paste this prompt into Claude Code, Codex, Cursor or another agent — or into SourceWeft chat. The agent reads this server's install guide, shows you its publisher, endpoint and sign-in, and adds it to your client once you agree. Keys never go into a command.

Read https://sourceweft.com/mcp/io.github.nyuchi%2Fmukoko-news/install.md and connect the MCP server it describes to my client. Before changing any config, show me its publisher, endpoint and sign-in method and wait for my OK. Never put an API key in a command or in a file I would commit; ask me where it should come from.

Read the install guide the agent follows

Other MCP clients

Add this to your client's mcpServers config.

{
  "mcpServers": {
    "mukoko-news": {
      "type": "http",
      "url": "https://news.mukoko.dev/mcp"
    }
  }
}

README

Mukoko News

Pan-African news, in one place.

"Mukoko" means beehive in Shona — where the community gathers and stores knowledge. Mukoko News aggregates hundreds of African newsrooms into one feed, so a reader in Harare can follow Lagos, Nairobi and Dakar without opening twenty tabs.

All 54 African Union member states are in scope. How many are live is a number the app measures rather than asserts — see Coverage.

Version: 4.58.0  ·  Live: news.mukoko.com

Read the news →  ·  Join the Discord →  ·  Contribute →


[TypeScript] [Next.js] [React] [Tailwind CSS] [MongoDB] [Vitest] [Vercel]

[Discord] [Live site] [CI] [PRs Welcome]


The sibling repos. This one is the reader-facing web app. The gateway is the public API and MCP server; the pipeline does the ingestion and enrichment. Issues land in whichever repo owns the code.


What is this?

This repository is the Next.js 15 frontend for Mukoko News, deployed on Vercel. It is one part of a three-repo platform:

RepoRole
mukoko-dev/mukoko-news (this repo)Web frontend — Next.js 15, Vercel
mukoko-dev/mukoko-news-gatewayPublic API + MCP server — Cloudflare Workers
mukoko-dev/mukoko-ingestion-pipelineData pipeline — Fly.io + Cloudflare

The frontend reads news data directly from MongoDB Atlas via Next.js Server Actions.


Features

  • Pan-African coverage — see Coverage for what that claim means
  • Discover — browse by country, category, or source
  • NewsBytes — TikTok-style vertical swipe feed for quick headlines
  • Search — full-text search across all articles
  • Dark mode — respects system preference
  • Embed widgets — drop a news feed into any site with one <script> tag
  • MCP server — AI assistants can query Pan-African news at news.mukoko.dev/mcp
  • Accessible — Radix UI primitives, WCAG AAA contrast, Schema.org structured data

Coverage

All 54 African Union member states are in scope. The number that is live is a query, not a constant.

getLiveCoverageAction() counts the countries that actually cleared the publishing bar in the last 30 days, and coverageFragment(n) / coverageClaim(n) in src/lib/constants.ts are the only sanctioned wording — every page, meta tag and JSON-LD blurb interpolates one of them. So a country that starts producing appears on its own, and one that goes quiet drops off on its own, with no code change and nobody editing a number in a file.

This README deliberately does not print the current figure. A hard-coded count in a document nothing tests is exactly how the app came to claim "16 African countries" on nine surfaces that had each drifted apart. src/lib/__tests__/coverage-claim.test.ts enforces the rule for src/; here it is enforced by not writing one down.

Contributing

We welcome contributions to the frontend — UI improvements, new features, bug fixes, accessibility, tests, and documentation are all fair game. You do not need a database connection to contribute: the whole suite runs against mocked data, and most UI work can be done with the dev server pointed at the live API.

See CONTRIBUTING.md for the full guide, and come say hello in the Discord — it is the fastest way to get a question answered or to find out whether someone is already on the issue you picked.

Quick start for contributors

bash
# Prerequisites: Node.js 20+, pnpm 10+git clone https://github.com/mukoko-dev/mukoko-news.gitcd mukoko-newspnpm install
# Run the test suite — no credentials neededpnpm test
# Start the dev server (reads from the live API by default)cp .env.example .env.localpnpm dev

Open http://localhost:3000.

What you can work on without credentials

  • All React components in src/components/
  • Page layouts and routing in src/app/
  • The embed widget script in public/embed/
  • Any of the unit and integration tests — they all mock the data layer
  • Documentation and accessibility improvements

Running tests

bash
pnpm test             # full suitepnpm test:watch       # watch modepnpm test:coverage    # with coverage report

Tech stack

LayerTechnology
FrameworkNext.js 15, App Router, React 19
StylingTailwind CSS 4, CSS variables
ComponentsRadix UI (accessible primitives)
IconsLucide React
Themenext-themes
AuthWorkOS AuthKit
DataMongoDB Atlas via Server Actions
TestsVitest, React Testing Library
DeployVercel

Design system

Mzizi is the upstream source for the palette, the background scale and the type ramp. Be precise about how that binding works, because it is looser than "read from Mzizi" suggests:

  • src/app/globals.css holds this app's copy of the values. Nothing is fetched at build time or at runtime — there is no Mzizi package dependency and no network call.
  • src/app/__tests__/design-tokens.test.ts parses that stylesheet and asserts every value against a SNAPSHOT object literal inside the test file itself. There is no separate snapshot artefact.
  • That snapshot is a copy of what mzizi_get_tokens returned on a dated, recorded refresh. It is updated deliberately, by a human re-querying the MCP in a reviewed change — never by relaxing an assertion.

So CI catches globals.css drifting away from the frozen copy. It does not catch Mzizi itself moving; that is what the deliberate refresh is for.

Mzizi's full palette is 21 colour families — seven minerals, seven heritage, seven experimental. This app uses the seven minerals; these four are the ones you meet first:

RoleLightDarkMineral
--primary#4B0082#B388FFTanzanite
--secondary#0047AB#00B0FFCobalt
--success#004D40#64FFDAMalachite
--surface#EEEEEC#131211(Mzizi surface — a background step, not a mineral)

Fonts: Noto Serif (display/headings), Noto Sans (UI/body), JetBrains Mono (data and labels) — self-hosted via next/font.


Embed widget

Add a Mukoko News feed to any website:

html
<script src="https://news.mukoko.com/embed/widget.js"        data-layout="cards"        data-feed="latest"        data-country="ZW"></script>

Layouts: cards · compact · hero · ticker · list
Feeds: top · featured · latest · location
Country: any ISO 3166-1 alpha-2 code (e.g. ZW, KE, ZA, NG)


MCP server

AI assistants and agents can query Pan-African news via the Model Context Protocol:

json
{  "mcpServers": {    "mukoko-news": {      "type": "http",      "url": "https://news.mukoko.dev/mcp"    }  }}

The read tools answer anonymously. The server itself lives in mukoko-dev/mukoko-news-gateway and is deployed to news.mukoko.dev, not to this app — news.mukoko.com serves no /mcp route.


Project structure

src/├── app/              # Pages (Next.js App Router)├── components/│   ├── ui/           # Primitives (Button, Card, Skeleton, ErrorBoundary, …)│   ├── layout/       # Header, footer, mobile nav│   └── *.tsx         # Feature components (ArticleCard, HeroCard, ShareModal, …)├── contexts/         # PreferencesContext, CoverageContext (theme via next-themes)└── lib/    ├── actions/      # Server Actions — all database reads go through here    ├── mongodb/      # MongoDB query helpers    ├── constants.ts  # Countries, categories, URL utilities    └── utils.ts      # Formatting + security helperspublic/└── embed/            # Self-contained widget script

Security

We take security seriously. Report vulnerabilities by email to [email protected] — please do not open a public GitHub issue. See SECURITY.md for details.


Licence

This repository ships no LICENSE file, and package.json declares no license field. Despite the wording below, no licence is currently granted — a LICENSE file needs adding before the "open-source contributors" framing is accurate.

© Nyuchi Africa (PVT) Ltd.


"Ndiri nekuti tiri" — I am because we are

Built by Nyuchi Web Services and contributors.

Source: README.md at commit 077e3fa

Tools

16

get_briefing

Answer "What's happening in [place/topic]?" — top story, recent articles, and trending topics in one call. Accepts country codes (ZW, KE), region names (East Africa, Southern Africa), category topics (politics, business), or omit focus for a pan-African overview. Returns short excerpts with word counts and app links only — call get_article with an article id to read a full article body inline.

Parametersfocuslimit

track_story

Follow the development of a news story over time. Returns articles in chronological order showing how a story evolved. Use since to control the lookback window.

Parameterslimitsincetopicrequiredcountry

get_location_news

News from a specific place in Africa. Accepts country codes, country names, region names, or city names.

Parameterslimitcategorylocationrequired

compare_locations

Compare news coverage between 2–4 African countries or regions side by side.

Parameterslimittopiclocationsrequired

get_source_view

See how a specific news source is covering a topic.

Parameterslimittopicsourcerequired

find_stories

Search articles by keyword, tag, category, or country. Results carry short excerpts, word counts, and app links only — call get_article with a result's id to read the full article body inline.

Parametersqtaglimitcountrycategory

get_article

Read a single article by ID or slug. Returns the full article body inline as markdown (truncated at ~8000 characters with a link to continue in the app) plus source metadata and the Mukoko app URL. Use this after a list tool (get_briefing, find_stories, …) to read an article without leaving the conversation.

Parametersidrequired

list_categories

List all news categories with article counts.

Takes no parameters.

list_sources

List active news sources. Optionally filter by country code.

Parameterscountry

get_stats

Platform statistics: total articles, active sources, and today's output.

Takes no parameters.

get_my_feed

Personalised news feed based on the authenticated user's article likes and saves. Requires Authorization: Bearer <WorkOS access token>.

Parameterslimit

detect_surge

Detect sudden spikes in news coverage — compares last 24h against 7-day baseline. Surfaces unusual increases like crime up 5× in Bulawayo or a football surge in Ghana.

Parameterslimitlocation

get_content_analytics

Open data breakdown of news coverage by category, country, and keyword for a given period.

Parametersperiodlocation

trigger_enrichment

Manually run the AI enrichment agent over existing articles (classification, keywords, entities, quality scoring). RESTRICTED to platform-team accounts — requires a WorkOS bearer token issued inside the platform-team org. By default enriches the most recent un-enriched articles; pass article_ids to target specific ones, or reset_attempts to re-run articles that previously hit the failure cap.

Parameterslimitarticle_idsreset_attempts

drain_enrichment_backlog

Drain the ENTIRE un-enriched article backlog, not just one batch. RESTRICTED to platform-team accounts (WorkOS bearer issued inside the platform-team org). Fire-and-forget: asks the pipeline worker to enrich un-enriched articles in batches (oldest first) until the backlog is clear, running independently of the automatic 10-minute sweep. Returns immediately; use trigger_enrichment for a single targeted batch instead.

Takes no parameters.

Version history

1
  1. v1.2.0LatestSep 16, 2026

Score

90% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 daysRequired25 pts
  • Auth declaredRequired10 pts
  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.

Other Mukoko integrations