EMA Medicines MCP — the European Medicines Agency's public medicines register.
- ✓Open-source license (MIT)
- ✓Actively maintained (<30d)
- ✓Clear description
- ✓Topics declared
- ✓Documented (README)
git clone https://github.com/pipeworx-io/mcp-ema-medicines{
"mcpServers": {
"mcp-ema-medicines": {
"command": "node",
"args": ["/path/to/mcp-ema-medicines/dist/index.js"]
}
}
}MCP Servers overview
# @pipeworx/ema-medicines European Medicines Agency medicines register — every medicine authorised for the EU market through the centralised procedure, plus the committee opinions still awaiting a European Commission decision — the EMA's herbal-medicine inventory (plant/botanical substances the Committee on Herbal Medicinal Products (HMPC) has assessed, with links to each herb's EU herbal monograph and assessment-report PDFs) — and seven sibling XLSX reports from the same download-medicine-data page: shortages, direct healthcare professional communications (DHPC), referrals, periodic safety update single assessments (PSUSA), orphan designations, paediatric investigation plans, and post-authorisation procedures. Part of [Pipeworx](https://pipeworx.io) — an MCP gateway connecting AI agents to 1576+ live data sources. ## Tools - `ema_recent_approvals(from?, to?, month?, category?, limit?)` — new EU marketing authorisations in a date window. Answers "which drugs did the EMA approve in July 2026". - `ema_chmp_opinions(opinion_status?, since?, category?, include_decided?, limit?)` — medicines the CHMP (human) or CVMP (veterinary) has recommended for or against approval and the Commission has not yet decided. Answers "what did the CHMP recommend this month". - `ema_medicine_search(query, status?, category?, orphan_only?, limit?)` — search by brand name, INN / active substance, therapeutic area, indication text, ATC code or authorisation holder. - `ema_medicine(name)` — the full published record for one medicine, by brand name or EMA product number. - `ema_recent_updates(since?, status?, category?, limit?)` — register entries that changed most recently, including withdrawals and suspensions. - `herb_search(name?, latin?, botanical?, therapeutic_area?, status?, limit?)` — search the EMA herbal-medicines inventory (plant/herb substances) by common name, Latin/botanical name, therapeutic area, or HMPC assessment status. Answers "which herbs has the EMA assessed for sleep disorders", "is there an EU herbal monograph for chamomile". - `herb(latin_name?, common_name?)` — the full inventory record for one herb, plus `monograph_url` and `assessment_report_url` scraped (link extraction only) from the herb's EMA page. Answers "what is the EMA monograph link for valerian root". - `herb_monograph_status(latin)` — HMPC assessment status, code/label, and the outcome of the European assessment for one herb by Latin name; explains why well-established-use vs traditional-use is NOT a field the register carries (see below). - `ema_shortages(query?, status?, since?, limit?)` — EU medicine shortages: status (ongoing/resolved/discontinued), forms/strengths affected, alternatives availability, start-of-shortage date. The EU counterpart of the FDA shortages tool. - `ema_dhpc(query?, dhpc_type?, since?, category?, limit?)` — Direct Healthcare Professional Communications: urgent EU-wide safety alerts to prescribers (adverse events, quality defects, shortages, safety signals). - `ema_referrals(query?, status?, safety_only?, category?, since?, limit?)` — EU referral procedures (Article 31/20/107i and related) — safety and scientific reviews of a medicine or substance class. - `ema_psusa(query?, outcome?, since?, limit?)` — Periodic Safety Update Report Single Assessments: the EU-wide joint pharmacovigilance review per active substance. - `ema_orphan_designations(query?, status?, since?, limit?)` — EU orphan medicinal product designations for rare-disease treatments (Positive/Withdrawn/Expired/Negative). - `ema_pip(query?, decision_type?, since?, limit?)` — Paediatric Investigation Plans: the agreed/waived plan for studying a medicine in children. - `ema_post_authorisation(query?, status?, category?, since?, limit?)` — post-marketing variations and label-change activity for centrally authorised medicines. ## Auth Keyless. ## Data sources - <https://www.ema.europa.eu/en/documents/report/medicines-output-medicines-report_en.xlsx> — the whole register as one XLSX, regenerated daily around 18:00 CET. Listed at <https://www.ema.europa.eu/en/medicines/download-medicine-data> alongside ten sibling reports (orphan designations, shortages, referrals, post-authorisation, DHPC, herbal, PSUSA, paediatric plans, MRLs). - <https://www.ema.europa.eu/en/documents/report/medicines-output-herbal_medicines-report_en.xlsx> — the herbal-medicines inventory, same file family, regenerated daily. 251 data rows collapse to 204 distinct herbs (a handful of rows repeat identically 2-4x in the sheet; `herb_search`/`herb` dedup on the per-herb page URL). Each row carries a per-herb page URL (`https://www.ema.europa.eu/en/medicines/herbal/<latin-name-slug>`) whose "Documents" section links the monograph and assessment-report PDFs that `herb` scrapes. - Seven sibling reports, same file family and daily regeneration, listed on the same download page: - `medicines-output-shortages-report_en.xlsx` (`ema_shortages`) - `medicines-output-dhpc-report_en.xlsx` (`ema_dhpc`) - `medicines-output-referrals-report_en.xlsx` (`ema_referrals`) - `medicines-output-periodic_safety_update_report_single_assessments-report_en.xlsx` (`ema_psusa`) — **note the filename is NOT `medicines-output-psusa-report_en.xlsx`**; that guess 404s. - `medicines-output-orphan_designations-report_en.xlsx` (`ema_orphan_designations`) - `medicines-output-paediatric_investigation_plans-report_en.xlsx` (`ema_pip`) - `medicines-output-post_authorisation-report_en.xlsx` (`ema_post_authorisation`) - Deliberately **not** built: `medicines-output-maximum_residue_limits-report_en.xlsx` (veterinary residue limits, out of scope for this pack) and `medicines-output-opinions_outside_eu-report_en.xlsx` (niche Article 58 scientific opinions on non-EU products). ### Things worth knowing before you touch this - **Sheet layout is not row 1.** Sheet `Medicine`: row 1 is a provenance banner, rows 2–8 are blank, **row 9 is the header** (39 columns), rows 10+ are records. The header row uses **inline strings, not shared strings** — a parser that only resolves shared strings reads the header as blank. - **Self-closing cells are a trap.** `<c r="E10" s="1"/>` is an empty cell. A greedy attribute match in the cell regex swallows the `/` and runs on to the *next* cell's `</c>`, silently shifting every value in the row by one column. `src/xlsx.ts` uses a lazy match for exactly this reason. - **Use `Marketing authorisation date` for "new approvals", not `European Commission decision date`.** The Commission decision date also moves on post-authorisation variations — 80–141 rows a month — while genuine initial authorisations run 4–12 a month. Filtering on the wrong one answers a different question without looking wrong. - **The committees meet monthly**, so "what did the CHMP recommend this month" lands on an empty window most of the time. When `since` filters everything out, `ema_chmp_opinions` returns the outstanding opinions and states in `window_note` that none were adopted in the window asked for — the question is about the pipeline, not the calendar. - **`Opinion status` alone does not mean "pending".** Authorised and withdrawn products keep their historical opinion fields. Pending means `Medicine status` starts with `Opinion`; `ema_chmp_opinions` applies that by default and exposes `include_decided` to widen it. - **EMA rate-limits bursts** and answers a 429 with ~40 KB of HTML rather than JSON — reproduced at five sequential requests. A per-call download is not viable, so the pack holds one parsed copy for six hours and the Cloudflare edge cache absorbs repeats on top of that. If a refresh fails while an earlier copy is in hand, the earlier copy is served rather than an error. - **Dates are `DD/MM/YYYY` upstream** and are converted to ISO on the way out. - **`data.europa.eu` is not a route to this data.** The EMA datasets are still listed there but frozen at `modified: 2019-01-09`, and every distribution URL 404s against the pre-redesign `/sites/default/files/Medicines_output_*.xlsx` path. - The register covers the **EU centralised procedure only** — nationally authorised products are not in it. ### The 7 sibling reports — things worth knowing - **The PSUSA filename does not match its tool/report name.** It is `medicines-output-periodic_safety_update_report_single_assessments-report_en.xlsx`, not `medicines-output-psusa-report_en.xlsx` — the latter guess 404s. Verified by fetching `en/medicines/download-medicine-data` and grepping the actual `<a href>` list rather than guessing the pattern from the other reports' names. - **`post_authorisation`'s URL column is `AA`, out of alphabetical order** with the rest of the header row (`A, AA, B, C, ...Z`). The generic loader reads whatever column letter the sheet XML actually uses per header cell, so this is harmless — but do not "fix" it by assuming A..Z order if you ever hand-edit the field map. - **`orphan_designations` has no `Category` column at all** (the register is human-only) — unlike `dhpc`, `referrals` and `post_authorisation`, which are a Human/Veterinary mix and take a `category` filter. - **A rare EMA source-data artifact**, not a parser bug: PSUSA's own export occasionally splits one comma-containing active-substance string into two adjacent shared-string cells with a stray embedded `"` (~0.2% of rows, e.g. `dienogest` / `ethinylestradiol (prolonged-release tablet)"` as two separate cells) — those rows still parse, just with a slightly garbled `category`/`substances_in_scope` value. Not worth a special case for a handful of rows. - Each report gets its own `ReportSpec` (URL, column-header → field map, date fields) fed through one generic `loadReport()`/`reportDataset()` pair — same row-9-is-the-header parsing and same one-download-per-six-hours cache as the main register and the herbal inventory, just parameterised instead of copy-pasted seven times. - All seven probed live 2026-09-13 with real current rows (e.g. shortages: Eskazole/Zentel ongoing
What people ask about mcp-ema-medicines
What is pipeworx-io/mcp-ema-medicines?
+
pipeworx-io/mcp-ema-medicines is mcp servers for the Claude AI ecosystem. EMA Medicines MCP — the European Medicines Agency's public medicines register. It has 0 GitHub stars and its last recorded update is dated 2026-09-16.
How do I install mcp-ema-medicines?
+
You can install mcp-ema-medicines by cloning the repository (https://github.com/pipeworx-io/mcp-ema-medicines) or following the README instructions on GitHub. ClaudeWave also provides quick install blocks on this page.
Is pipeworx-io/mcp-ema-medicines safe to use?
+
Our security agent has analyzed pipeworx-io/mcp-ema-medicines and assigned a Trust Score of 95/100 (tier: Verified). See the full breakdown of passed checks and flags on this page.
Who maintains pipeworx-io/mcp-ema-medicines?
+
pipeworx-io/mcp-ema-medicines is maintained by pipeworx-io. The last recorded GitHub activity is dated 2026-09-16, with 0 open issues.
Are there alternatives to mcp-ema-medicines?
+
Yes. On ClaudeWave you can browse similar mcp servers at /categories/mcp, sorted by popularity or recent activity.
Deploy mcp-ema-medicines to your cloud
Ship this repo to production in minutes. Each platform spins up its own environment with editable env vars.
Maintain this repo? Add a badge to your README
Drop the badge into your GitHub README to show it's tracked on ClaudeWave. Each badge links back to this page and reflects the live Trust Score.
[](https://claudewave.com/repo/pipeworx-io-mcp-ema-medicines)<a href="https://claudewave.com/repo/pipeworx-io-mcp-ema-medicines"><img src="https://claudewave.com/api/badge/pipeworx-io-mcp-ema-medicines" alt="Featured on ClaudeWave: pipeworx-io/mcp-ema-medicines" width="320" height="64" /></a>More MCP Servers
Fair-code workflow automation platform with native AI capabilities. Combine visual building with custom code, self-host or cloud, 400+ integrations.
User-friendly AI Interface (Supports Ollama, OpenAI API, ...)
An open-source AI agent that brings the power of Gemini directly into your terminal.
Real-time global intelligence dashboard. AI-powered news aggregation, geopolitical monitoring, and infrastructure tracking in a unified situational awareness interface
🕷️ An adaptive Web Scraping framework that handles everything from a single request to a full-scale crawl! Don't be shy, join here: https://discord.gg/EMgGbDceNQ
The fastest path to AI-powered full stack observability, even for lean teams.