femtech-radar
π€ Read this with your AI agent β don't read it by hand.
This repo is written agent-first. Point Claude Code, GitHub Copilot, Cursor, or any agent at it:
"Read the README and AGENTS.md, then help me run / extend this."
Structure + AGENTS.md are optimized for agent comprehension.
π femtech-radar
FemTech intelligence as a GitHub-native, agent-driven pipeline
A project of FemTech Weekend β the live site shares the org's brand identity.
Agent-first FemTech intelligence: an MCP server that fetches, dedupes, and scores women's-health & FemTech research and industry news, designed to feed GitHub Agentic Workflows and an auto-updating Astro + RSS site.
Live Demo Β· Documentation Β· Changelog Β· Report Bug Β· Request Feature
π Introduction
The FemTech and women's-health world produces a scattered firehose of signal β research preprints, funding and product news, community opportunities, technical discussion β across dozens of sources. femtech-radar turns that noise into a curated, deduplicated, ranked digest, using only GitHub-native primitives plus a reusable Model Context Protocol (MCP) server.
It's a complete, live three-unit pipeline β scrape β curate β publish:
an MCP server (the deterministic "brain") fetches from multiple sources, normalizes into one shape, dedupes, and scores each item by relevance Γ popularity Γ freshness, exposing the result over MCP;
a weekly GitHub Agentic Workflow (
gh aw) drives the MCP, lets Copilot curate the digest, and commits the week'sdata/*.jsonvia a review-gated PR;an Astro + RSS site reads that data and auto-deploys to GitHub Pages.
It's built for FemTech / women-in-tech practitioners who want signal without the noise β and as a reference implementation of the gh aw Γ MCP Γ GitHub Pages pattern. The product is live: a subscribable weekly intelligence site at https://chanmeng666.github.io/femtech-radar/ that updates itself for free on a public GitHub repo.
β¨ Key Features
1 One MCP tool, a whole radar β radar_collect returns normalized, deduped, scored items per section. All five sections are live: industry (Google News), research (arXiv), opportunities (LinkedIn, with opt-in SerpAPI Google Jobs), discussions (Hacker News + Mastodon), and china β a China-focused "China Watch" lens on Chinese women's-health / FemTech + ζθθ΅ (funding) news (Google News δΈζ + 36ζ°ͺ + ζ°ζ΅ͺθ΄’η») plus China-scoped research (PubMed + ClinicalTrials.gov).
2 Deterministic, testable core β fetch β normalize β dedupe β score. The server makes no editorial judgment; that's left to the agent that drives it. 46 unit tests, and zero real network calls in tests (all I/O is injected).
3 Pluggable source adapters β each source is one file behind a uniform Adapter interface. Add a feed by writing a collect() that returns RadarItem[].
4 Resilient by construction β every source failure degrades to an empty result plus a warning; a malformed URL or date never throws out of a run.
5 GitHub-native, near-zero cost β designed to run inside GitHub Actions on a public repo, where Actions and Pages are free; the only metered resource is a few Copilot credits per week.
6 Reusable anywhere MCP runs β drop it into Claude Desktop or any MCP client; it isn't coupled to this project.
7 Live, self-updating, subscribable β a weekly gh aw workflow curates the digest into a review-gated data/*.json PR, and an Astro + RSS site rebuilds itself on GitHub Pages. Readers subscribe via the full RSS feed or per-section feeds at /rss/<section>.xml β no manual scraping, no server to run.
π οΈ Tech Stack
Language / Runtime: TypeScript 5 (strict, ESM) Β· Node.js β₯ 20
MCP:
@modelcontextprotocol/sdk(stdio server)Parsing / validation: Zod (schema & runtime validation) Β· fast-xml-parser (Atom/RSS)
Tooling: pnpm workspaces (monorepo) Β· Vitest (tests) Β· tsup (build)
Orchestration: GitHub Agentic Workflows (
gh aw) Β· enginecopilot, modelgpt-4.1Β· weekly schedule β review-gated data PRSite: Astro 5 (
femtech-radar-site) Β·@astrojs/rssΒ· GitHub Pages deploy viadeploy-pages.ymlDesign: vanilla CSS design system (
site/src/styles/global.css) aligned to the FemTech Weekend brand β warm-brown editorial palette, Georgia serif + system sans, sharp corners, light mode only. Full reference:docs/design-system.mdBuilt on: the
opportunitiesadapter ports LinkedIn guest-endpoint logic from the owner'slinkedin-jobs-searchproject (inspired bylinkedin-jobs-api); the opt-in SerpAPI Google Jobs path is ported fromserver-google-jobs
ποΈ Architecture
graph TD
subgraph Sources
A1[arXiv API]
A2[Google News RSS<br/>+ δΈζ]
A3[LinkedIn Jobs]
A4[Hacker News + Mastodon]
A5[36ζ°ͺ Β· ζ°ζ΅ͺθ΄’η»]
A6[PubMed Β· ClinicalTrials.gov]
end
A1 --> AD[Source adapters<br/>normalize β RadarItem]
A2 --> AD
A3 --> AD
A4 --> AD
A5 --> AD
A6 --> AD
AD --> P["collect()<br/>dedupe β score β sort β since-filter"]
P --> T[MCP tools<br/>radar_collect Β· radar_sources]
T --> C[MCP clients]
C --> W[Weekly gh aw workflow<br/>Copilot curates Β· writes why_it_matters]
W --> D[(data/YYYY-Www.json<br/>review-gated PR)]
D --> S[Astro + RSS site<br/>GitHub Pages Β· live]All three units are built and live; all five source sections are active.
Separation of determinism vs judgment: the MCP server does only deterministic work (fetch, normalize, dedupe, score). Editorial choices β which items to feature, how to summarize β belong to the agent (gh aw + Copilot) that drives it. This keeps the core unit-testable and reusable.
π Getting Started
Prerequisites
Node.js β₯ 20 (the server uses global
fetch)pnpm β₯ 9 (
npm i -g pnpm)(optional) an MCP client such as Claude Desktop, or the
gh awCLI
Installation
git clone https://github.com/ChanMeng666/femtech-radar.git
cd femtech-radar
pnpm install
# Build the MCP server
pnpm --filter @chanmeng666/femtech-radar-mcp build
# Run the test suite (46 tests)
pnpm --filter @chanmeng666/femtech-radar-mcp testThe built server is an executable stdio MCP server at packages/mcp-server/dist/index.js. It's also published to npm, so any MCP client can run it with npx -y @chanmeng666/femtech-radar-mcp.
Run the site locally
# Dev server (reads data/*.json)
pnpm --filter femtech-radar-site dev
# Production build + preview
pnpm --filter femtech-radar-site build
pnpm --filter femtech-radar-site previewThe published site is live at https://chanmeng666.github.io/femtech-radar/ (RSS: /rss.xml); it rebuilds automatically whenever a new weekly data/*.json lands on master.
π³ Project Status & Roadmap
All three planned layers are built and live in production (see docs/superpowers/specs for the full design and docs/superpowers/plans for the per-unit implementation plans):
β v1 β MCP server: industry (Google News) + research (arXiv) adapters, dedupe/score pipeline,
radar_collect/radar_sourcestools, resilient error handling, 46 tests. Published to npm as@chanmeng666/femtech-radar-mcp.β v2 β orchestration: a weekly
gh awworkflow (enginecopilot, modelgpt-4.1) that drives the MCP, curates a digest, and emits a review-gated data PR plus a summary issue β proven end-to-end in production (first digest:data/2026-W27.json).β v3 β publishing (live): Astro 5 site auto-deployed to GitHub Pages at https://chanmeng666.github.io/femtech-radar/ with a subscribable RSS feed at https://chanmeng666.github.io/femtech-radar/rss.xml; rebuilds automatically on every weekly data update.
β vNext β 4-section pipeline:
opportunities(LinkedIn, with opt-in SerpAPI Google Jobs) anddiscussions(Hacker News + Mastodon) adapters now active; per-section RSS feeds at/rss/<section>.xml; site polish (favicon, numeric-entity decode, sources chip); weekly workflow updated to collect all four sections.β China Watch β 5th section (npm
0.4.1): a China-focusedchinasection merging Chinese women's-health / ζθθ΅ news (Google News δΈζ + 36ζ°ͺ + ζ°ζ΅ͺθ΄’η») and China-scoped research (PubMed + ClinicalTrials.gov); Chinese titles with Englishwhy_it_matters. Live on the site as05 Β· CHINAwith a/rss/china.xmlfeed. Includes a CJK-aware dedupe fix and a women's-health-specific filter for the general Chinese feeds. Structured funding-round data (paid databases) is intentionally out of scope. Seedocs/operations.md.
Deferred to a future version: ChatOps slash commands (/deep-dive), full bilingual support (i18n routing is reserved), a newsletter, femtech-weekend.com domain integration, and a structured funding-round database.
π Usage Guide
femtech-radar is consumed as an MCP server. It exposes two tools:
Tool | Parameters | Returns |
|
|
|
| none | the configured source list per section |
All five sections are live.
industry(Google News) andresearch(arXiv) require no API key.opportunitiesuses LinkedIn by default (opt-in SerpAPI Google Jobs whenSERP_API_KEYis set).discussionsmerges Hacker News Algolia + Mastodon hashtag timelines (both free, no key).chinamerges Google News δΈζ + 36ζ°ͺ + ζ°ζ΅ͺθ΄’η» (Chinese women's-health / ζθθ΅ news, keyword-filtered) + PubMed + ClinicalTrials.gov (China-scoped research) β all free, no key. Every source degrades gracefully to[]if unavailable.
Subscribe via RSS: the weekly digest is published at https://chanmeng666.github.io/femtech-radar/rss.xml and works in any feed reader.
Use with GitHub Agentic Workflows (gh aw)
mcp-servers:
femtech-radar:
command: npx
args: ["-y", "@chanmeng666/femtech-radar-mcp"]Use with Claude Desktop
{
"mcpServers": {
"femtech-radar": {
"command": "node",
"args": ["/absolute/path/to/femtech-radar/packages/mcp-server/dist/index.js"]
}
}
}The package is published to npm, so
npx -y @chanmeng666/femtech-radar-mcpworks out of the box (current version0.4.1). The localdist/index.jspath above is an alternative for development.
See packages/mcp-server/README.md for the full tool reference.
β¨οΈ Development
pnpm install # install workspace deps
pnpm --filter @chanmeng666/femtech-radar-mcp test # run tests (Vitest)
pnpm --filter @chanmeng666/femtech-radar-mcp build # build with tsupProject layout
packages/mcp-server/src/
βββ schema.ts # Zod RadarItem / WeeklyData (the shared data contract)
βββ dedup.ts # URL canonicalization + title-similarity dedupe
βββ score.ts # relevance Γ popularity Γ freshness scoring
βββ adapters/ # one file per section (industry = Google News, research = arXiv, opportunities = LinkedIn/SerpAPI, discussions = HN + Mastodon, china = Google News δΈζ + 36ζ°ͺ + Sina + PubMed + ClinicalTrials)
βββ collect.ts # orchestration: adapter β dedupe β score β sort β since-filter
βββ tools.ts # radar_collect / radar_sources handlers
βββ index.ts # stdio MCP server entryAdding a source adapter: implement the Adapter interface in adapters/, return RadarItem[] from collect(opts) using the injected fetcher (never call fetch directly β that keeps it testable), then wire it into ADAPTERS in collect.ts.
See AGENTS.md for AI-agent-oriented project conventions and gotchas, and
docs/operations.md for the operational runbook (weekly workflow, Copilot
credits/quota, engine choices, npm publish, and manual data seeding).
π€ Contributing
Contributions make the open-source community an amazing place to learn and create. Please read the Contributing Guide and the Code of Conduct before you start, and use the provided issue / pull-request templates.
β€οΈ Sponsor
If this project helps you, please consider supporting its development:
For questions and help, see SUPPORT.md. For security issues, see SECURITY.md.
π License
This project is released under the MIT license.
πββοΈ Author
Chan Meng