Wraps seven major medical terminologies into 37 tools: ICD-11 and CID-10 for disease classification, SNOMED CT for clinical concepts, LOINC for lab observations, RxNorm for drug names, MeSH for bibliographic indexing, and ATC for therapeutic classification. Ships with three orchestrated prompts for common workflows and four resource endpoints for reference data. Runs over stdio by default for Claude Desktop or switches to Streamable HTTP for hosted deployments on Cloudflare Workers. Includes built-in caching and rate limiting. Aimed at researchers, public health analysts, and clinical informatics developers who need programmatic access to authoritative terminology lookups rather than point-of-care decision support.
claude mcp add --transport http medical-terminologies-mcp https://medical-terminologies-mcp.sidneybissoli.workers.dev/mcpRun in your terminal. Add --scope user to make it available in every project.
Review the command, arguments, and environment values before installing — MCP servers run with your local permissions.
Verified live against the running server on Jun 10, 2026.
icd11_searchSearch for medical conditions, diseases, and health problems in ICD-11 (International Classification of Diseases, 11th Revision). Use this tool to: - Find ICD-11 codes for diagnoses - Search for diseases by name or keyword - Look up conditions in multiple languages Returns mat...3 paramsSearch for medical conditions, diseases, and health problems in ICD-11 (International Classification of Diseases, 11th Revision). Use this tool to: - Find ICD-11 codes for diagnoses - Search for diseases by name or keyword - Look up conditions in multiple languages Returns mat...
query*stringlanguagestringen · es · pt · fr · de · itdefault: enmax_resultsintegericd11_lookupGet detailed information about a specific ICD-11 entity by code or URI. Use this tool to: - Get the full definition of a disease - Retrieve coding notes and exclusions - Get the official title and synonyms Provide either an ICD-11 code (e.g., "BA00") or a full foundation URI.3 paramsGet detailed information about a specific ICD-11 entity by code or URI. Use this tool to: - Get the full definition of a disease - Retrieve coding notes and exclusions - Get the official title and synonyms Provide either an ICD-11 code (e.g., "BA00") or a full foundation URI.
uristringcodestringlanguagestringen · es · pt · fr · de · itdefault: enicd11_hierarchyNavigate the ICD-11 hierarchy to find parent or child entities. Use this tool to: - Find broader categories (parents) of a condition - Find specific subtypes (children) of a condition - Understand the classification structure Direction 'parents' returns ancestor categories, 'c...2 paramsNavigate the ICD-11 hierarchy to find parent or child entities. Use this tool to: - Find broader categories (parents) of a condition - Find specific subtypes (children) of a condition - Understand the classification structure Direction 'parents' returns ancestor categories, 'c...
code*stringdirection*stringparents · childrenicd11_chaptersList all ICD-11 chapters (top-level categories). Use this tool to: - Get an overview of ICD-11 structure - Find which chapter covers a body system or condition type - Navigate to specific disease categories ICD-11 has 28 chapters covering all areas of medicine.1 paramsList all ICD-11 chapters (top-level categories). Use this tool to: - Get an overview of ICD-11 structure - Find which chapter covers a body system or condition type - Navigate to specific disease categories ICD-11 has 28 chapters covering all areas of medicine.
languagestringen · es · pt · fr · de · itdefault: enicd11_postcoordinationGet postcoordination information for an ICD-11 code. Use this tool to: - Find available axes for building composite codes - Check required vs optional postcoordination - Understand code extension possibilities Postcoordination allows adding severity, laterality, anatomy, etc.1 paramsGet postcoordination information for an ICD-11 code. Use this tool to: - Find available axes for building composite codes - Check required vs optional postcoordination - Understand code extension possibilities Postcoordination allows adding severity, laterality, anatomy, etc.
code*stringloinc_searchSearch for laboratory tests, clinical observations, and measurements in LOINC (Logical Observation Identifiers Names and Codes). Use this tool to: - Find LOINC codes for lab tests (e.g., "glucose", "hemoglobin") - Search for clinical measurements and vital signs - Look up diag...2 paramsSearch for laboratory tests, clinical observations, and measurements in LOINC (Logical Observation Identifiers Names and Codes). Use this tool to: - Find LOINC codes for lab tests (e.g., "glucose", "hemoglobin") - Search for clinical measurements and vital signs - Look up diag...
query*stringmax_resultsintegerloinc_detailsGet detailed information about a specific LOINC code. Use this tool to: - Get the full name and description of a LOINC code - Find the component, property, timing, and system - Check the scale type and method Provide a LOINC number in format "XXXXX-X" (e.g., "2339-0" for Gluco...1 paramsGet detailed information about a specific LOINC code. Use this tool to: - Get the full name and description of a LOINC code - Find the component, property, timing, and system - Check the scale type and method Provide a LOINC number in format "XXXXX-X" (e.g., "2339-0" for Gluco...
loinc_num*stringloinc_answersGet the list of valid answers for a LOINC questionnaire item. Use this tool to: - Find valid response options for survey questions - Get answer codes for data entry validation - Look up standardized answer lists Only applicable to LOINC codes that represent questions with defi...1 paramsGet the list of valid answers for a LOINC questionnaire item. Use this tool to: - Find valid response options for survey questions - Get answer codes for data entry validation - Look up standardized answer lists Only applicable to LOINC codes that represent questions with defi...
loinc_num*stringloinc_panelsGet the structure of a LOINC panel or form. Use this tool to: - See all tests included in a panel (e.g., CBC, metabolic panel) - Get the structure of assessment forms - Find related observations grouped together Returns the list of LOINC codes that make up the panel.1 paramsGet the structure of a LOINC panel or form. Use this tool to: - See all tests included in a panel (e.g., CBC, metabolic panel) - Get the structure of assessment forms - Find related observations grouped together Returns the list of LOINC codes that make up the panel.
loinc_num*stringrxnorm_searchSearch for drugs in RxNorm (Normalized names for clinical drugs). Use this tool to: - Find drug concepts by brand or generic name - Look up medications for prescribing - Search for drug formulations Returns matching drugs with RxCUI identifiers, names, and term types.2 paramsSearch for drugs in RxNorm (Normalized names for clinical drugs). Use this tool to: - Find drug concepts by brand or generic name - Look up medications for prescribing - Search for drug formulations Returns matching drugs with RxCUI identifiers, names, and term types.
query*stringmax_resultsintegerrxnorm_conceptGet detailed information about a specific RxNorm concept by RxCUI. Use this tool to: - Get the full name and synonyms for a drug - Check the concept status (active, remapped, etc.) - View related concepts (ingredients, brands, forms) Provide an RxCUI (RxNorm Concept Unique Ide...2 paramsGet detailed information about a specific RxNorm concept by RxCUI. Use this tool to: - Get the full name and synonyms for a drug - Check the concept status (active, remapped, etc.) - View related concepts (ingredients, brands, forms) Provide an RxCUI (RxNorm Concept Unique Ide...
rxcui*stringinclude_relatedbooleanrxnorm_ingredientsGet active ingredients for a drug by RxCUI. Use this tool to: - Find the active ingredients in a medication - Check for single vs. multiple ingredient products - Identify the generic components of brand drugs Returns ingredient RxCUIs and names.1 paramsGet active ingredients for a drug by RxCUI. Use this tool to: - Find the active ingredients in a medication - Check for single vs. multiple ingredient products - Identify the generic components of brand drugs Returns ingredient RxCUIs and names.
rxcui*stringrxnorm_classesGet therapeutic and pharmacologic classes for a drug. Use this tool to: - Find the drug class (e.g., "Beta-blockers", "NSAIDs") - Identify therapeutic categories - Look up mechanism of action classifications Returns class IDs, names, and classification sources.1 paramsGet therapeutic and pharmacologic classes for a drug. Use this tool to: - Find the drug class (e.g., "Beta-blockers", "NSAIDs") - Identify therapeutic categories - Look up mechanism of action classifications Returns class IDs, names, and classification sources.
rxcui*stringrxnorm_ndcMap between RxNorm concepts and National Drug Codes (NDC). Use this tool to: - Get all NDC codes for a drug (by RxCUI) - Find the RxCUI for an NDC code - Cross-reference between coding systems Provide either an RxCUI to get NDCs, or an NDC to get the RxCUI.2 paramsMap between RxNorm concepts and National Drug Codes (NDC). Use this tool to: - Get all NDC codes for a drug (by RxCUI) - Find the RxCUI for an NDC code - Cross-reference between coding systems Provide either an RxCUI to get NDCs, or an NDC to get the RxCUI.
ndcstringrxcuistringmesh_searchSearch for MeSH (Medical Subject Headings) descriptors. Use this tool to: - Find MeSH terms for indexing medical literature - Look up subject headings for PubMed searches - Find controlled vocabulary terms Returns matching descriptors with MeSH IDs and labels.4 paramsSearch for MeSH (Medical Subject Headings) descriptors. Use this tool to: - Find MeSH terms for indexing medical literature - Look up subject headings for PubMed searches - Find controlled vocabulary terms Returns matching descriptors with MeSH IDs and labels.
matchstringexact · contains · startswithdefault: containsquery*stringlanguagestringen · es · pt · fr · de · itdefault: enmax_resultsintegermesh_descriptorGet detailed information about a MeSH descriptor by ID. Use this tool to: - Get the full definition (scope note) of a MeSH term - View tree numbers showing hierarchy location - See related concepts and synonyms Provide a MeSH Descriptor ID like "D015242" (Ofloxacin).2 paramsGet detailed information about a MeSH descriptor by ID. Use this tool to: - Get the full definition (scope note) of a MeSH term - View tree numbers showing hierarchy location - See related concepts and synonyms Provide a MeSH Descriptor ID like "D015242" (Ofloxacin).
mesh_id*stringlanguagestringen · es · pt · fr · de · itdefault: enmesh_treeGet the tree hierarchy location(s) for a MeSH descriptor. Use this tool to: - See where a term fits in the MeSH hierarchy - Understand broader/narrower relationships - Find related terms in the same branch MeSH tree numbers show the hierarchical path (e.g., C14.280.647 for Myo...1 paramsGet the tree hierarchy location(s) for a MeSH descriptor. Use this tool to: - See where a term fits in the MeSH hierarchy - Understand broader/narrower relationships - Find related terms in the same branch MeSH tree numbers show the hierarchical path (e.g., C14.280.647 for Myo...
mesh_id*stringmesh_qualifiersGet allowed qualifiers (subheadings) for a MeSH descriptor. Use this tool to: - Find which qualifiers can be combined with a descriptor - Build precise MeSH search queries - Understand aspects that can be specified Qualifiers refine descriptors (e.g., "Diabetes Mellitus/drug t...1 paramsGet allowed qualifiers (subheadings) for a MeSH descriptor. Use this tool to: - Find which qualifiers can be combined with a descriptor - Build precise MeSH search queries - Understand aspects that can be specified Qualifiers refine descriptors (e.g., "Diabetes Mellitus/drug t...
mesh_id*stringmap_icd10_to_icd11Authoritative ICD-10 → ICD-11 mapping using WHO transition tables (release 2025-01, bundled with the server). Returns the primary 1:1 ICD-11 category for the ICD-10 code plus any alternative ICD-11 candidates that WHO documents (some ICD-10 concepts split into multiple ICD-11...1 paramsAuthoritative ICD-10 → ICD-11 mapping using WHO transition tables (release 2025-01, bundled with the server). Returns the primary 1:1 ICD-11 category for the ICD-10 code plus any alternative ICD-11 candidates that WHO documents (some ICD-10 concepts split into multiple ICD-11...
icd10_code*stringmap_loinc_to_snomedThis tool looks up a LOINC code in NLM Clinical Tables and returns guidance on where to obtain a LOINC → SNOMED CT mapping. It does not perform the mapping. Direct LOINC → SNOMED CT mappings are not freely available via API. UMLS Metathesaurus contains the relationships but re...1 paramsThis tool looks up a LOINC code in NLM Clinical Tables and returns guidance on where to obtain a LOINC → SNOMED CT mapping. It does not perform the mapping. Direct LOINC → SNOMED CT mappings are not freely available via API. UMLS Metathesaurus contains the relationships but re...
loinc_code*stringvalidate_codesValidate a mixed batch of medical codes against their source terminologies. Useful for retrospective analysis of legacy databases — flag codes that no longer exist, surface ICD-10 → ICD-11 replacements, and grade activity status where the terminology exposes it. For each input...1 paramsValidate a mixed batch of medical codes against their source terminologies. Useful for retrospective analysis of legacy databases — flag codes that no longer exist, surface ICD-10 → ICD-11 replacements, and grade activity status where the terminology exposes it. For each input...
codes*arrayfind_equivalentSearch for equivalent terms across multiple medical terminologies. Use this tool to: - Find the same concept in different coding systems - Compare how terminologies represent a concept - Support terminology mapping and data integration Searches across: ICD-11, SNOMED CT, LOINC...3 paramsSearch for equivalent terms across multiple medical terminologies. Use this tool to: - Find the same concept in different coding systems - Compare how terminologies represent a concept - Support terminology mapping and data integration Searches across: ICD-11, SNOMED CT, LOINC...
term*stringsource_terminologystringicd11 · snomed · loinc · rxnorm · meshtarget_terminologiesarrayatc_classifyLook up the WHO ATC (Anatomical Therapeutic Chemical) classification(s) for a drug by name. Use this tool to: - Find the ATC code for a medication (e.g., "metformin" → A10BA02) - Identify the therapeutic and pharmacological class hierarchy - Cross-reference drugs with their in...1 paramsLook up the WHO ATC (Anatomical Therapeutic Chemical) classification(s) for a drug by name. Use this tool to: - Find the ATC code for a medication (e.g., "metformin" → A10BA02) - Identify the therapeutic and pharmacological class hierarchy - Cross-reference drugs with their in...
drug_name*stringatc_lookupLook up an ATC code at level 1-4 to get its name and hierarchy level. Use this tool to: - Resolve an ATC code (e.g., "A10BA") to its class name ("Biguanides") - Confirm a code exists in the current ATC index - Identify the level (anatomical / therapeutic / pharmacological / ch...1 paramsLook up an ATC code at level 1-4 to get its name and hierarchy level. Use this tool to: - Resolve an ATC code (e.g., "A10BA") to its class name ("Biguanides") - Confirm a code exists in the current ATC index - Identify the level (anatomical / therapeutic / pharmacological / ch...
atc_code*stringatc_membersList the drugs (substances) that belong to an ATC class. Use this tool to: - Enumerate all members of a therapeutic class (e.g., "A10BA" → metformin, phenformin) - Build a list of drugs sharing a pharmacological mechanism - Explore an ATC subtree at any level Each member inclu...1 paramsList the drugs (substances) that belong to an ATC class. Use this tool to: - Enumerate all members of a therapeutic class (e.g., "A10BA" → metformin, phenformin) - Build a list of drugs sharing a pharmacological mechanism - Explore an ATC subtree at any level Each member inclu...
atc_code*stringcid10_searchSearch the Brazilian CID-10 (Classificação Estatística Internacional de Doenças, 10ª Revisão) by Portuguese text. Use this tool to: - Find CID-10 codes for Brazilian SUS / ANVISA contexts ("infarto", "diabetes", "tuberculose") - Look up the official Portuguese (CBCD/USP) trans...3 paramsSearch the Brazilian CID-10 (Classificação Estatística Internacional de Doenças, 10ª Revisão) by Portuguese text. Use this tool to: - Find CID-10 codes for Brazilian SUS / ANVISA contexts ("infarto", "diabetes", "tuberculose") - Look up the official Portuguese (CBCD/USP) trans...
levelstringcategories · subcategories · alldefault: allquery*stringmax_resultsintegercid10_lookupLook up a specific CID-10 code and return its Portuguese name. Use this tool to: - Resolve a code to its Brazilian description ("I21" → "Infarto agudo do miocárdio") - Confirm a 3-char category or 4-char subcategory exists in CID-10 - Retrieve gender / cause-of-death restricti...1 paramsLook up a specific CID-10 code and return its Portuguese name. Use this tool to: - Resolve a code to its Brazilian description ("I21" → "Infarto agudo do miocárdio") - Confirm a 3-char category or 4-char subcategory exists in CID-10 - Retrieve gender / cause-of-death restricti...
code*stringcid10_chaptersList the 22 chapters of CID-10 with their code ranges and Portuguese titles. Use this tool to: - See the top-level structure of CID-10 (chapters I-XXII, e.g., "I. Algumas doenças infecciosas e parasitárias", "IX. Doenças do aparelho circulatório") - Map a code to its chapter b...List the 22 chapters of CID-10 with their code ranges and Portuguese titles. Use this tool to: - See the top-level structure of CID-10 (chapters I-XXII, e.g., "I. Algumas doenças infecciosas e parasitárias", "IX. Doenças do aparelho circulatório") - Map a code to its chapter b...
No parameters — call it with no arguments.
cid10_chapterGet one CID-10 chapter and its constituent groups (e.g., "Chapter IX → I00-I02 Febre reumática aguda, I05-I09 Doenças reumáticas crônicas do coração, ..."). Use this tool to: - Drill from a chapter into its groups - Build hierarchical browsers - Find which group contains a cod...1 paramsGet one CID-10 chapter and its constituent groups (e.g., "Chapter IX → I00-I02 Febre reumática aguda, I05-I09 Doenças reumáticas crônicas do coração, ..."). Use this tool to: - Drill from a chapter into its groups - Build hierarchical browsers - Find which group contains a cod...
num*integerterminology_versionsList the current version, release date, publisher, source URL, and update cadence of every terminology this server queries against. Useful for pipeline maintainers who need to: - Confirm which release of ICD-11 / SNOMED / LOINC / RxNorm / MeSH / ATC the server is querying befo...1 paramsList the current version, release date, publisher, source URL, and update cadence of every terminology this server queries against. Useful for pipeline maintainers who need to: - Confirm which release of ICD-11 / SNOMED / LOINC / RxNorm / MeSH / ATC the server is querying befo...
terminologystringicd11 · icd10 · snomed · loinc · rxnorm · meshterminology_diffReport what diff data is available between two versions of a terminology. For most terminologies this is **guidance only** — the server doesn't ship historical snapshots, so the tool points at the publisher's official changelog and explains the cadence. `bundled_versions` list...3 paramsReport what diff data is available between two versions of a terminology. For most terminologies this is **guidance only** — the server doesn't ship historical snapshots, so the tool points at the publisher's official changelog and explains the cadence. `bundled_versions` list...
to_versionstringterminology*stringicd11 · icd10 · snomed · loinc · rxnorm · meshfrom_versionstringA Model Context Protocol (MCP) server providing unified access to major global medical terminologies:
Ask your assistant:
icd11_searchmap_icd10_to_icd11loinc_detailscid10_searchThe answers come from authoritative sources (WHO, NLM, NIH, DataSUS) — real codes and mappings, not guesses from training data.
find-medical-code, drug-info, cid10-portuguese-lookup) — clients render these as one-click user actionsinfo://server, info://cid10/chapters, info://licenses, info://stats) — sub-millisecond reads (except info://stats which round-trips to the StatsCounter Durable Object on the hosted endpoint)This server is not a clinical-care decision tool — practicing clinicians have specialized assistants (UpToDate AI, OpenEvidence, EHR-integrated tools) for that. The actual audience is researchers, public-health analysts, clinical informatics developers, and educators who need programmatic access to authoritative terminology data.
| If you're a... | Start with | Why |
|---|---|---|
| Biomedical researcher / bibliographer | mesh_search, mesh_descriptor, mesh_tree | MeSH is PubMed's indexing vocabulary; tree numbers let you traverse the controlled hierarchy programmatically |
| Public-health analyst (Brazil / SUS) | cid10_search, cid10_chapters, atc_classify | CID-10 V2008 is the Brazilian operational standard; ATC pairs cleanly with DataSUS prescription data |
| Public-health analyst (international) | icd11_search, icd11_lookup, icd11_chapters | WHO ICD-11 is the current international revision; chapters and hierarchy support pipeline classification |
| Clinical-informatics developer | loinc_search, loinc_details, find_equivalent | LOINC for lab/observation interoperability; cross-terminology search to scaffold new mappings |
| Educator / curriculum author | mesh_descriptor, icd11_lookup, rxnorm_search | Authoritative definitions, tree numbers, and drug term-types you can drop into self-checked exercises |
A public Cloudflare Workers deployment runs at:
https://medical.sidneybissoli.com/mcp
Connect via the MCP Inspector or any Streamable HTTP MCP client:
npx @modelcontextprotocol/inspector --transport streamable-http \
--server-url https://medical.sidneybissoli.com/mcp
Or install via Smithery, which proxies the same endpoint through their gateway:
npx -y smithery mcp add sidneybissoli/medical-terminologies-mcp
The hosted instance has WHO credentials configured, so all 31 default tools work without any setup on your side. For your own deployment (e.g. corporate network, different region, custom WHO credentials), see the Installation and Hosted on Cloudflare Workers sections below.
npm install -g medical-terminologies-mcp
npm install medical-terminologies-mcp
Add to your Claude Desktop configuration file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"medical-terminologies": {
"command": "npx",
"args": ["-y", "medical-terminologies-mcp"],
"env": {
"WHO_CLIENT_ID": "your-who-client-id",
"WHO_CLIENT_SECRET": "your-who-client-secret"
}
}
}
}
| Variable | Required | Description |
|---|---|---|
WHO_CLIENT_ID | Yes¹ | WHO ICD API Client ID |
WHO_CLIENT_SECRET | Yes¹ | WHO ICD API Client Secret |
WHO_ICD11_RELEASE_ID | No | ICD-11 release to query (e.g. 2024-01, 2025-01). Default 2024-01. |
ENABLE_SNOMED_TOOLS | No² | Set to true to register the 6 SNOMED-dependent tools. Default off. |
SNOMED_BASE_URL | No² | Base URL for a Snowstorm instance, e.g. https://my-snowstorm.example.com/snowstorm/snomed-ct. |
SNOMED_LANGUAGE | No² | Accept-Language tag(s) for SNOMED responses, e.g. pt, pt-BR, es. Default en. Single-tag values are pass-through reliably; composite values with q-weights (e.g. pt-BR,en;q=0.8) depend on your Snowstorm instance's Accept-Language handling — fallback semantics may vary. Test against your specific deployment if relying on weighted fallback. |
LOG_LEVEL | No | pino log level (debug, info, warn, error, fatal). Default info. |
¹ Required for ICD-11 tools. Get credentials at: https://icd.who.int/icdapi.
² See SNOMED CT setup (advanced) below. LOINC, RxNorm, and MeSH need no configuration.
The server runs over stdio by default — that's what Claude Desktop and IDE clients expect. For hosted deployments (Cloudflare Workers, Smithery, your own Docker container), pass --http to switch to Streamable HTTP transport instead:
medical-terminologies-mcp --http --port 3000
# or, in Docker / containers:
medical-terminologies-mcp --http --host 0.0.0.0 --port 3000
| Flag | Env var | Default | Description |
|---|---|---|---|
--http | MCP_HTTP=true | off | Enable Streamable HTTP transport instead of stdio |
--port N | PORT | 3000 | TCP port to listen on (use 0 for an ephemeral port) |
--host H | HOST | 127.0.0.1 | Bind address. Pass 0.0.0.0 for container/hosted use |
Endpoints:
POST /mcp — JSON-RPC over Streamable HTTP (the MCP protocol). Stateless mode: each request is independent, no session cookies.GET /health — liveness probe returning { status, name, version, tool_count } for load balancers and uptime monitors.*) so browser clients (e.g. the MCP Inspector web UI) can connect directly.Quick smoke test from another terminal:
curl -sS http://localhost:3000/health
# {"status":"ok","name":"medical-terminologies-mcp","version":"1.5.0","tool_count":31}
# Inspector via HTTP
npx @modelcontextprotocol/inspector --transport streamable-http --server-url http://localhost:3000/mcp
The production deployment is a Cloudflare Worker. Source lives in src/worker.ts, config in wrangler.toml, and CI deploy in .github/workflows/deploy-worker.yml (auto-runs on every push to main).
To deploy your own instance:
npm ci
npm run build:worker
npx wrangler login # one-time, browser flow
npx wrangler deploy # publishes to <name>.<account>.workers.dev
# Set ICD-11 secrets so those 5 tools work:
npx wrangler secret put WHO_CLIENT_ID
npx wrangler secret put WHO_CLIENT_SECRET
The public endpoint is POST https://<name>.<account>.workers.dev/mcp. CORS is permissive so the MCP Inspector web UI connects directly. /health returns { status, name, version, tool_count, uptime_s }.
Why Workers: zero cold start at the edge, $5/mo flat for 10M requests (free tier covers up to 100k req/day), and no VMs to size or restart. Stage-1 deploy uses per-isolate cache + rate-limiter — fine for moderate traffic; under sustained high load, swap in Workers KV cache and a Durable Object rate limiter (tracked as PROGRESS.md Phase 11.9 Stage 2 follow-up).
After your Worker is live, register the URL on Smithery:
https://smithery.ai/new).https://<your-worker>.workers.dev/mcp. Smithery's gateway scans for compliance and proxies traffic.If you'd rather run the server in your own infrastructure (private deployment, internal compliance constraints, on-prem), the repo includes a Dockerfile:
docker build -t medical-terminologies-mcp .
docker run --rm -p 3000:3000 \
-e PORT=3000 \
-e WHO_CLIENT_ID=... -e WHO_CLIENT_SECRET=... \
medical-terminologies-mcp
Multi-stage build (~150 MB), runs node dist/index.js --http, binds 0.0.0.0:$PORT. Same MCP endpoints as the Workers deployment.
| Tool | Description | Example |
|---|---|---|
icd11_search | Search ICD-11 by term | query: "diabetes mellitus" |
icd11_lookup | Get entity details by code/URI | code: "5A11" |
icd11_hierarchy | Navigate parent/child relationships | code: "5A11" |
icd11_chapters | List all ICD-11 chapters | - |
icd11_postcoordination | Get postcoordination axes | code: "5A11" |
| Tool | Description | Example |
|---|---|---|
loinc_search | Search lab tests and observations | query: "glucose" |
loinc_details | Get full LOINC code details | loinc_num: "2339-0" |
loinc_answers | Get answer list for surveys | loinc_num: "44249-1" |
loinc_panels | Get panel/form structure | loinc_num: "24331-1" |
| Tool | Description | Example |
|---|---|---|
rxnorm_search | Search drugs by name | query: "metformin" |
rxnorm_concept | Get drug concept details | rxcui: "6809" |
rxnorm_ingredients | Get active ingredients | rxcui: "6809" |
rxnorm_classes | Get therapeutic classes | rxcui: "6809" |
rxnorm_ndc | Map between RxCUI and NDC | rxcui: "6809" |
| Tool | Description | Example |
|---|---|---|
mesh_search | Search MeSH descriptors | query: "hypertension" |
mesh_descriptor | Get descriptor details | mesh_id: "D006973" |
mesh_tree | Get tree hierarchy location | mesh_id: "D006973" |
mesh_qualifiers | Get allowed qualifiers | mesh_id: "D006973" |
These are only registered when ENABLE_SNOMED_TOOLS=true. See SNOMED CT setup (advanced).
| Tool | Description | Example |
|---|---|---|
snomed_search | Search concepts by term | query: "myocardial infarction" |
snomed_concept | Get concept details by SCTID | sctid: "22298006" |
snomed_hierarchy | Get parent/child concepts | sctid: "22298006" |
snomed_descriptions | Get all descriptions | sctid: "22298006" |
snomed_ecl | Execute ECL queries | ecl: "<< 73211009" |
map_snomed_to_icd10 requires SNOMED)| Tool | Description | Example |
|---|---|---|
map_icd10_to_icd11 | Authoritative ICD-10 → ICD-11 mapping via bundled WHO transition tables; returns primary code + chapter + URIs and any WHO-documented alternatives | icd10_code: "E11" |
map_snomed_to_icd10 | SNOMED CT → ICD-10 guidance (only when ENABLE_SNOMED_TOOLS=true) | sctid: "73211009" |
map_loinc_to_snomed | LOINC ↔ SNOMED guidance | loinc_code: "2339-0" |
validate_codes | Batch-validate up to 100 codes across ICD-11, LOINC, RxNorm, MeSH, ATC, CID-10 (and SNOMED when enabled); returns per-code valid/invalid + display name | codes: [{terminology:"icd11",code:"5A11"}, …] |
find_equivalent | Cross-terminology search; SNOMED branch is skipped when SNOMED tools are disabled | term: "diabetes" |
WHO Anatomical Therapeutic Chemical classification, served through NLM RxClass (free, no auth). The WHOCC base itself requires a paid subscription, but RxClass envelopes the same code/name pairs.
| Tool | Description | Example |
|---|---|---|
atc_classify | Drug name → ATC code(s) | drug_name: "metformin" |
atc_lookup | ATC code (level 1-4) → name + level type | atc_code: "A10BA" |
atc_members | ATC class → member drugs | atc_code: "A10BA" |
Brazilian Portuguese translation of ICD-10 (DataSUS V2008). Bundled as a static dataset — no HTTP calls. The Brazilian SUS uses CID-10 V2008 operationally; for the international ICD-11 (current WHO revision), use the ICD-11 tools above.
| Tool | Description | Example |
|---|---|---|
cid10_search | Portuguese text search (diacritic-insensitive) | query: "diabetes" |
cid10_lookup | Code → official Portuguese name | code: "I21" or "A00.1" |
cid10_chapters | List the 22 CID-10 chapters | - |
cid10_chapter | Chapter detail with constituent groups | num: 9 |
Surface what version of each terminology this server queries against today — useful when running batch validation against a pinned release or when investigating an unexpected lookup miss after an upstream update.
| Tool | Description | Example |
|---|---|---|
terminology_versions | List all 8 supported terminologies with current version, release date, publisher, source URL, and update cadence | - |
terminology_diff | Report what diff data is available between two versions of a terminology (real cross-revision stats for ICD-10 → ICD-11; guidance otherwise) | terminology: "icd10-icd11" |
The samples below are the actual formatted output the tools produce — the text body of the CallToolResult. Tools also return a structuredContent object matching each tool's outputSchema for programmatic consumers.
loinc_search — query: "glucose", max_results: 3## LOINC Search Results for "glucose"
Found 1024 total results (showing 3):
1. **74790-7** - Glucose challenge (hydrogen breath test) panel - Exhaled gas
Component: Glucose challenge panel | Method: -
2. **104708-3** - Deprecated Estimated average glucose [Moles/volume] in Blood
Component: Estimated average glucose | Property: SCnc
3. **97510-2** - Glucose measurements in range out of Total glucose measurements during reporting period
Component: Glucose measurements in range/Total glucose measurements | Property: NFr | Method: Calculated
total_count (1024) reflects every match in the NLM Clinical Tables index, not just the page returned. Bump max_results (max 50) to see canonical codes like 2339-0 (Glucose [Mass/volume] in Blood); the API's relevance ranking puts panels and derived measurements above plain blood-glucose at small page sizes.
rxnorm_ingredients — rxcui: "6809" (metformin)# Ingredients for RxCUI 6809
Found 18 ingredient(s):
| RxCUI | Name | Type |
|-------|------|------|
| 6809 | metformin | Single Ingredient |
| 1007411 | chlorpropamide / metformin | Multiple Ingredient |
| 1043562 | metformin / saxagliptin | Multiple Ingredient |
| 1243019 | linagliptin / metformin | Multiple Ingredient |
| 1486436 | dapagliflozin / metformin | Multiple Ingredient |
| 1545149 | canagliflozin / metformin | Multiple Ingredient |
| 1664314 | empagliflozin / metformin | Multiple Ingredient |
| 729717 | metformin / sitagliptin | Multiple Ingredient |
| ... | (10 more combinations) | Multiple Ingredient |
For an RxCUI that is itself an ingredient (TTY=IN), the tool returns that ingredient plus every multi-ingredient (TTY=MIN) concept that includes it. Use this to enumerate combination products built around a substance.
mesh_descriptor — mesh_id: "D006973" (Hypertension)# Hypertension
MeSH ID: D006973
## Scope Note
Persistently high systemic arterial BLOOD PRESSURE. Based on multiple readings (BLOOD PRESSURE DETERMINATION), hypertension is currently defined as when SYSTOLIC PRESSURE is consistently greater than 140 mm Hg or when DIASTOLIC PRESSURE is consistently 90 mm Hg or more.
## Tree Numbers
- C14.907.489
## Concepts
- Hypertension *(preferred)*
## Allowed Qualifiers
35 qualifier(s) allowed. Use mesh_qualifiers for details.
The scope note comes from the descriptor's preferred concept, not its annotation field (which is an indexer-facing note). Tree numbers are the navigable path into MeSH's controlled hierarchy — C14.907.489 places Hypertension under Cardiovascular Diseases → Vascular Diseases.
icd11_search with a clinical term → pick the result → icd11_lookup with the code for full details, or icd11_hierarchy to walk parents/children.rxnorm_search for a brand or generic name → rxnorm_concept for the canonical record → rxnorm_ingredients and rxnorm_classes for downstream analysis.find_equivalent with a clinical term searches ICD-11, LOINC, RxNorm, MeSH, and (when enabled) SNOMED in one call. Use it to bootstrap mappings; the pairwise map_* tools refine them.map_icd10_to_icd11 does honest text search against WHO ICD-11. Real WHO transition tables are tracked in PROGRESS.md Phase 13.1.The 5 SNOMED tools (snomed_search, snomed_concept, snomed_hierarchy, snomed_descriptions, snomed_ecl) plus the SNOMED-dependent crosswalk tool (map_snomed_to_icd10) are disabled by default. With them disabled, the server registers 31 tools instead of 37; find_equivalent still works and skips the SNOMED branch with an explanatory note.
The reason: as of 2026-05-08, the public IHTSDO Snowstorm endpoint that this project historically called (https://browser.ihtsdotools.org/snowstorm/snomed-ct/...) returns HTTP 410 Gone for every path. Without a working backend, registering these tools surfaces 6 guaranteed-broken tools to every client.
To enable the SNOMED tools:
Confirm your SNOMED CT license. SNOMED CT use requires an SNOMED International (IHTSDO) license. Member country residents typically have one through their national release center; non-members can obtain an Affiliate license. See https://www.snomed.org/snomed-ct/get-snomed.
Run a Snowstorm instance. SNOMED International publishes Snowstorm as open source (IHTSDO/snowstorm) and as a Docker image (snomedinternational/snowstorm). Self-hosting requires importing an RF2 release file (provided to license holders).
Configure this server:
{
"mcpServers": {
"medical-terminologies": {
"command": "npx",
"args": ["-y", "medical-terminologies-mcp"],
"env": {
"WHO_CLIENT_ID": "...",
"WHO_CLIENT_SECRET": "...",
"ENABLE_SNOMED_TOOLS": "true",
"SNOMED_BASE_URL": "https://my-snowstorm.example.com/snowstorm/snomed-ct",
"SNOMED_LANGUAGE": "en"
}
}
}
}
SNOMED_BASE_URL should point at the base under which Snowstorm exposes its /MAIN/concepts and related endpoints. SNOMED_LANGUAGE accepts standard Accept-Language tags (e.g. pt, es, pt-BR,en;q=0.8) — Snowstorm returns localized terms when the branch has them and falls back to English otherwise.
Restart the MCP client so the server picks up the env vars.
If you set ENABLE_SNOMED_TOOLS=true without configuring a working Snowstorm, the SNOMED tools will register but every call will fail at the network layer.
ICD-11 content is provided under the Creative Commons Attribution-NoDerivatives 3.0 IGO license (CC BY-ND 3.0 IGO).
SNOMED CT use requires an IHTSDO (SNOMED International) license. The SNOMED tools in this server are disabled by default and only enabled by operators with a valid license and a self-hosted Snowstorm instance — see SNOMED CT setup (advanced).
LOINC content is provided under the LOINC License.
RxNorm is produced by the U.S. National Library of Medicine and is freely available.
MeSH is produced by the U.S. National Library of Medicine and is freely available.
This server implements rate limiting to respect API providers:
| API | Rate Limit |
|---|---|
| WHO ICD-11 | 5 requests/second |
| NLM (LOINC, MeSH) | 10 requests/second |
| RxNorm | 20 requests/second |
| SNOMED CT (Snowstorm) | 10 requests/second |
git clone https://github.com/SidneyBissoli/medical-terminologies-mcp.git
cd medical-terminologies-mcp
npm install
npm run build
npm start
npx @modelcontextprotocol/inspector node dist/index.js
Contributions are welcome! Please feel free to submit a Pull Request.
git checkout -b feature/AmazingFeature)git commit -m 'Add some AmazingFeature')git push origin feature/AmazingFeature)Sidney Bissoli
This project is licensed under the MIT License - see the LICENSE file for details.
Note: While this software is MIT licensed, the medical terminologies accessed through it have their own licenses (see Terminology Licenses above).
If you encounter any issues or have questions:
Made with love for the medical informatics community
WHO_CLIENT_IDWHO ICD-11 API Client ID. Required only for ICD-11 tools (5 tools); the server starts without it and other terminologies (LOINC, RxNorm, MeSH, ATC, CID-10) work unauthenticated. Get credentials at https://icd.who.int/icdapi.
WHO_CLIENT_SECRETsecretWHO ICD-11 API Client Secret. Required only for ICD-11 tools.
WHO_ICD11_RELEASE_IDICD-11 release to query (e.g. 2024-01, 2025-01). Optional; defaults to 2024-01.
ENABLE_SNOMED_TOOLSSet to 'true' to register the 6 SNOMED-dependent tools (snomed_search, snomed_concept, snomed_hierarchy, snomed_descriptions, snomed_ecl, plus map_snomed_to_icd10). Disabled by default because the historical public IHTSDO Snowstorm endpoint was retired (HTTP 410 Gone). Requires S
SNOMED_BASE_URLBase URL of a self-hosted Snowstorm instance (e.g. https://my-snowstorm.example.com/snowstorm/snomed-ct). Required only when ENABLE_SNOMED_TOOLS is true.
SNOMED_LANGUAGEAccept-Language tag(s) for SNOMED responses (e.g. pt, pt-BR, es). Optional; defaults to 'en'. Composite values with q-weights depend on the upstream Snowstorm instance.
LOG_LEVELpino log level (debug, info, warn, error, fatal). Optional; defaults to 'info'. Logs go to stderr only — never stdout (which is the MCP stdio transport).