Mukoko News

io.github.nyuchi由 GitHub 帳號 nyuchi 發布v1.2.0更新於 Oct 24, 2026

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

發布方自己的服務:Nhimbe Events

已驗證Streamable HTTP可網頁執行網頁搜尋與抓取資料與分析

概覽

AI 產生的概覽

Mukoko News 讓助理讀取彙整的泛非新聞,提供簡報、事件追蹤、搜尋、文章閱讀與報導分析。

可以做什麼
取得非洲國家、地區或城市的新闻簡報、熱門話題與地點新聞,並比較不同地點或來源的報導。依關鍵字、標籤、分類或國家搜尋文章,並依 ID 或 slug 內嵌閱讀全文。追蹤某則新聞隨時間的演變,列出分類與來源及其文章數量。檢視熱門話題、分類、關鍵字與來源的開放分析資料,並偵測報導量的突然暴增。對文章執行 AI 充實處理,僅限平台團隊帳號。
適用情境
當助理需要非洲時事背景時適用:國家或區域簡報、追蹤發展中的新聞、比較不同地點或媒體對某議題的報導,或取得開放的報導統計資料。與新聞無關的工作則不需要。
執行需求
以遠端 HTTP 端點 news.mukoko.dev/mcp 執行,也可透過 npm 套件以 npx 在本機執行。讀取類工具可匿名使用。個人化動態與充實工具需要 Authorization Bearer WorkOS 存取權杖,充實還要求平台團隊帳號。
安裝前請注意
充實工具會對文章執行分類、關鍵字、實體與品質評分,因而變更平台資料;待處理清空工具會啟動長時間執行的作業;兩者皆僅限平台團隊帳號。個人化動態需要 WorkOS bearer 權杖,屬於憑證。所有新聞內容來自第三方新聞機構。

安裝

在 SourceWeft 中

  1. 開啟 儀表板中的 Mukoko News,將其新增到工作區。
  2. 為需要使用其工具的對話啟用該服務。

Web executable,透過 Streamable HTTP。 遠端服務在工作區中設定後即可從網頁執行環境執行。

交給代理程式安裝

把這段提示詞貼上到 Claude Code、Codex、Cursor 等代理程式,或 SourceWeft 對話中。代理程式會讀取該伺服器的安裝指南,先向你展示發布者、端點和登入方式,經你同意後再把它新增到你的客戶端。金鑰不會寫進任何命令。

閱讀 https://sourceweft.com/mcp/io.github.nyuchi%2Fmukoko-news/install.md,並按其中說明把這個 MCP 伺服器接入我的客戶端。修改任何設定之前,先告訴我它的發布者、端點和登入方式,等我確認。不要把 API 金鑰寫進命令或我會提交的檔案;問我金鑰應從哪裡取得。

檢視代理程式所依據的安裝指南

其他 MCP 客戶端

把它新增到你客戶端的 mcpServers 設定中。

{
  "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.

來源:README.md,提交 077e3fa

工具

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.

輸入參數focuslimit

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.

輸入參數limitsincetopic必填country

get_location_news

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

輸入參數limitcategorylocation必填

compare_locations

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

輸入參數limittopiclocations必填

get_source_view

See how a specific news source is covering a topic.

輸入參數limittopicsource必填

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.

輸入參數qtaglimitcountrycategory

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.

輸入參數id必填

list_categories

List all news categories with article counts.

無需輸入參數。

list_sources

List active news sources. Optionally filter by country code.

輸入參數country

get_stats

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

無需輸入參數。

get_my_feed

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

輸入參數limit

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.

輸入參數limitlocation

get_content_analytics

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

輸入參數periodlocation

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.

輸入參數limitarticle_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.

無需輸入參數。

版本歷史

1
  1. v1.2.0最新Sep 16, 2026

評分

已滿足適用檢查項的 90%

該評分衡量此收錄條目的完整程度,依據註冊中心條目、端點與公開來源計算得出。它不是對伺服器本身的評價,也不表示伺服器安全或目前可用:可連通性是帶日期的檢查結果,評分也不包含安裝量或使用者評價。

  • 近 30 天內可連通必需25 分
  • 已宣告認證方式必需10 分
  • 已列出工具必需15 分
  • 描述必需15 分
  • 圖示10 分
  • 文件15 分
  • 授權條款10 分

    請在儲存庫或註冊中心條目中宣告授權條款。

其他 Mukoko 整合