MCP server for South African pharma intelligence. Exposes a FastMCP server with tools that query public SAHPRA endpoints to retrieve licensed establishment lists and registered product records. Returns Markdown tables.
The server provides 4 tools for South African pharmaceutical intelligence with reasonable structure but noticeable gaps. All tools have descriptions and input schemas present in the code. Naming is clear and verb-based (get_, search_, analyse_). Descriptions are adequate but generic, they lack actionable context for when to use each tool vs others. Schema completeness varies: some parameters have good constraints (enums for category, filter_type, aggregate_by, sort_by) but descriptions for parameters are inconsistent in quality. Error handling is present but basic, returns string errors without structured guidance. Output is markdown tables, which is inefficient for LLM parsing compared to structured JSON. No tool annotations (readOnlyHint/destructiveHint) despite all being read-only operations. Tool composition is weak: analyse_ndoh_market and analyse_private_market are near-duplicates with identical parameter structures but different domains, this creates cognitive load for the LLM.
Use this to analyse the NDoH Master Health Product List for the South African public sector. Provides real-time procurement data, pricing, and market share.
Use this to analyse the Single Exit Price (MPR) database for private sector pricing, molecule competitiveness, and applicant presence.
Use this to retrieve the official SAHPRA list of establishments for a specific catagory.
Use this to search the SAHPRA website database table for health products registered to a specific company.
Duplicate tool structure (analyse_ndoh_market and analyse_private_market): identical parameter patterns, minimal descriptive differentiation. LLM must read full descriptions to choose correctly, wasting reasoning cycles.
All tools return unstructured markdown tables. LLMs must parse tables to extract structured data (company names, product IDs, prices), which is error-prone and wastes tokens. No response schema documented.
Tool descriptions lack actionable context. E.g., search_sahpra_products does not explain when to call it vs get_licensed_companies. No WHEN-to-use guidance for LLM selection.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | D | 57 | 2026-07-28+ | v2 |
| 2026-03-09 | D | 56 | - | v1 |
Error handling returns raw string errors (e.g., 'Failed to retrieve companies: {str(e)}') without guidance. No recovery suggestions, no error classification (retryable vs user-fixable).
No tool annotations (readOnlyHint/destructiveHint). All 4 tools are read-only but do not declare this. Clients cannot infer safety from metadata.
Parameter 'query' in analyse_ndoh_market and analyse_private_market has default=null. Description says 'Text to search for' but null is not a text value. Ambiguous: does null mean 'no filter' or 'error'?