This MCP server provides medical terminology lookups for diagnoses, drugs, and lab codes. It covers ICD-11, SNOMED, LOINC, RxNorm, MeSH, ATC, and CID-10, exposing functionality through 33 tools. Licensed under MIT, it is implemented in TypeScript and published for MCP consumers.
Search 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
Set `language` for WHO's official translations — e.g. `language: "pt"` searches and returns the official Portuguese (pt-BR) ICD-11 labels. Never machine-translated.
Returns matching entities with codes, titles, and relevance scores.
Parameters3
query
string
required
Search text (disease name, symptom, or keyword)
language
string
optional
Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated.
max_results
integer
optional
Maximum number of results (1-100). Default: 25
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Search text (disease name, symptom, or keyword)"
},
"language": {
"default": "en",
"type": "string",
"enum": [
"en",
"es",
"pt",
"fr",
"de",
"it",
"zh",
"ja",
"ar",
"ru"
],
"description": "Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated."
},
"max_results": {
"default": 25,
"description": "Maximum number of results (1-100). Default: 25",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"query"
],
"additionalProperties": false
}
icd11_lookup
Get 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. Set `language` for WHO's official translations (e.g. `language: "pt"` for official Portuguese).
Parameters3
code
string
optional
ICD-11 code (e.g., "BA00", "1A00")
uri
string
optional
Full ICD-11 foundation URI
language
string
optional
Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated.
Raw schema
{
"type": "object",
"properties": {
"code": {
"description": "ICD-11 code (e.g., \"BA00\", \"1A00\")",
"type": "string",
"minLength": 1
},
"uri": {
"description": "Full ICD-11 foundation URI",
"type": "string",
"format": "uri"
},
"language": {
"default": "en",
"type": "string",
"enum": [
"en",
"es",
"pt",
"fr",
"de",
"it",
"zh",
"ja",
"ar",
"ru"
],
"description": "Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated."
}
},
"additionalProperties": false
}
icd11_hierarchy
Navigate 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
Name the entity by `code` (a leaf code like "5A11", or a block range like "5A10-5A2Y" — blocks come back from 'parents' with an empty code and a code_range) or by `uri` (the URI any previous answer returned). Direction 'parents' returns ancestor categories, 'children' returns subcategories. ICD-10 codes (like "E11") are not ICD-11 codes: convert them first with map_icd10_to_icd11.
Parameters4
code
string
optional
ICD-11 code (e.g., "BA00", "5A11") or block range (e.g., "5A10-5A2Y")
uri
string
optional
Entity URI as returned by icd11_lookup, icd11_search or a previous icd11_hierarchy call
direction
string
required
Direction: "parents" for ancestors, "children" for subtypes
language
string
optional
Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated.
Raw schema
{
"type": "object",
"properties": {
"code": {
"description": "ICD-11 code (e.g., \"BA00\", \"5A11\") or block range (e.g., \"5A10-5A2Y\")",
"type": "string",
"minLength": 1
},
"uri": {
"description": "Entity URI as returned by icd11_lookup, icd11_search or a previous icd11_hierarchy call",
"type": "string",
"format": "uri"
},
"direction": {
"type": "string",
"enum": [
"parents",
"children"
],
"description": "Direction: \"parents\" for ancestors, \"children\" for subtypes"
},
"language": {
"default": "en",
"type": "string",
"enum": [
"en",
"es",
"pt",
"fr",
"de",
"it",
"zh",
"ja",
"ar",
"ru"
],
"description": "Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated."
}
},
"required": [
"direction"
],
"additionalProperties": false
}
icd11_chapters
List 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.
Parameters1
language
string
optional
Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated.
Raw schema
{
"type": "object",
"properties": {
"language": {
"default": "en",
"type": "string",
"enum": [
"en",
"es",
"pt",
"fr",
"de",
"it",
"zh",
"ja",
"ar",
"ru"
],
"description": "Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated."
}
},
"additionalProperties": false
}
icd11_postcoordination
Get 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.
Parameters1
code
string
required
ICD-11 code to get postcoordination info for
Raw schema
{
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"description": "ICD-11 code to get postcoordination info for"
}
},
"required": [
"code"
],
"additionalProperties": false
}
loinc_search
Search 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 diagnostic observations
Returns matching LOINC codes with names, components, and properties.
Parameters2
query
string
required
Search term (test name, keyword, or partial LOINC code)
Get 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 Glucose).
Get 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 defined answer sets.
Get 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.
Search 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.
Parameters2
query
string
required
Drug name to search (brand or generic)
max_results
integer
optional
Maximum number of results (1-100). Default: 25
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Drug name to search (brand or generic)"
},
"max_results": {
"default": 25,
"description": "Maximum number of results (1-100). Default: 25",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"query"
],
"additionalProperties": false
}
rxnorm_concept
Get 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 Identifier) like "161".
Parameters2
rxcui
string
required
RxNorm Concept Unique Identifier
include_related
boolean
optional
Include related concepts (ingredients, brands, dose forms)
Get 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.
Get 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.
Map 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.
Parameters2
rxcui
string
optional
RxCUI to get NDC codes for
ndc
string
optional
NDC code to look up RxCUI (alternative to rxcui)
Raw schema
{
"type": "object",
"properties": {
"rxcui": {
"description": "RxCUI to get NDC codes for",
"type": "string",
"pattern": "^\\d+$"
},
"ndc": {
"description": "NDC code to look up RxCUI (alternative to rxcui)",
"type": "string",
"minLength": 1
}
},
"additionalProperties": false
}
mesh_search
Search 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
Set `language` to request NLM's official translations where they exist (e.g. `language: "pt"` for Portuguese labels); content is never machine-translated.
Returns matching descriptors with MeSH IDs and labels.
Parameters4
query
string
required
Search term (e.g., "diabetes", "heart failure")
match
string
optional
Match type: exact, contains, or startswith. Default: contains
language
string
optional
Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated.
max_results
integer
optional
Maximum number of results (1-100). Default: 25
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Search term (e.g., \"diabetes\", \"heart failure\")"
},
"match": {
"default": "contains",
"description": "Match type: exact, contains, or startswith. Default: contains",
"type": "string",
"enum": [
"exact",
"contains",
"startswith"
]
},
"language": {
"default": "en",
"type": "string",
"enum": [
"en",
"es",
"pt",
"fr",
"de",
"it",
"zh",
"ja",
"ar",
"ru"
],
"description": "Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated."
},
"max_results": {
"default": 25,
"description": "Maximum number of results (1-100). Default: 25",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"query"
],
"additionalProperties": false
}
mesh_descriptor
Get 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). Set `language` to request NLM's official translations where they exist (e.g. `language: "pt"`).
Parameters2
mesh_id
string
required
MeSH Descriptor ID (e.g., D015242, D003920)
language
string
optional
Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated.
Raw schema
{
"type": "object",
"properties": {
"mesh_id": {
"type": "string",
"pattern": "^D\\d+$",
"description": "MeSH Descriptor ID (e.g., D015242, D003920)"
},
"language": {
"default": "en",
"type": "string",
"enum": [
"en",
"es",
"pt",
"fr",
"de",
"it",
"zh",
"ja",
"ar",
"ru"
],
"description": "Language code (default: en). Returns the source's OFFICIAL translation when it exists (e.g. 'pt' for official Portuguese); content is never machine-translated."
}
},
"required": [
"mesh_id"
],
"additionalProperties": false
}
mesh_tree
Get 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 Myocardial Infarction).
Get 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 therapy").
Authoritative 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 entities). For each mapping, includes the ICD-11 code, title, chapter, and the Foundation URI / Linearization URI for navigating to the full entity definition.
Use this for clinical coding, billing migration, retrospective analysis, and any workflow that needs authoritative mapping rather than text-search candidates. Coverage: 11,243 ICD-10 categories (excludes chapters and blocks like "A00-A09" which aren't used in clinical coding).
Provide a code like "E11" (Type 2 diabetes), "I21" (Acute MI), or "A07.8" (4 alternatives in WHO's table). Both dotted ("A07.8") and undotted ("A078") forms are accepted.
Returns "no mapping" when the code isn't in the WHO category-level table — that's the honest answer rather than a fuzzy search fallback.
Parameters1
icd10_code
string
required
ICD-10 code to query in the ICD-11 search index (e.g., E11, I21.0, J18.9)
Raw schema
{
"type": "object",
"properties": {
"icd10_code": {
"type": "string",
"minLength": 1,
"description": "ICD-10 code to query in the ICD-11 search index (e.g., E11, I21.0, J18.9)"
}
},
"required": [
"icd10_code"
],
"additionalProperties": false
}
map_loinc_to_snomed
This 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 requires an individual UMLS Terminology Services license; the LOINC SNOMED CT Expression Association is published by Regenstrief Institute as part of the LOINC release and requires authenticated download from loinc.org under the LOINC license.
For programmatic LOINC → SNOMED mapping, use UMLS or the LOINC Expression Association files. For interactive lookup, use the SNOMED CT browser available to your organization or the Regenstrief RELMA desktop tool.
Provide a LOINC code like "2339-0" (Glucose) or "718-7" (Hemoglobin).
Validate 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 `{ code, terminology }`, returns:
- **valid**: whether the code exists in the source terminology.
- **active**: whether the code is currently active. Null when the source doesn't expose an explicit active/inactive distinction at category level (CID-10, ATC, ICD-11, RxNorm, MeSH all return null today; SNOMED and LOINC return a real boolean).
- **title**: the official label/name when available.
- **replaced_by**: a successor code, populated today only for ICD-10 codes that have a primary ICD-11 mapping in the bundled WHO transition tables.
- **source**: human-readable provenance of the validation (terminology + release/version).
- **error**: non-null only when validation couldn't be performed (network error, SNOMED feature flag off, etc.). `valid: false` + `error: null` means "code not found"; `valid: false` + `error: set` means "couldn't validate".
Terminology is **required per code** — auto-detection isn't supported because category codes like "A00" exist in both ICD-10 and CID-10. Accepted values: `icd11`, `icd10`, `snomed`, `loinc`, `rxnorm`, `mesh`, `atc`, `cid10`.
Hard cap of 50 codes per call; codes are validated in parallel through their respective clients, so total wall time scales with the slowest upstream + its rate limit (worst case ~10 s for a full batch hitting ICD-11).
Parameters1
codes
array
required
List of code+terminology pairs to validate. Hard cap of 50 per call to keep total latency under ~10 s given upstream rate limits.
Raw schema
{
"type": "object",
"properties": {
"codes": {
"minItems": 1,
"maxItems": 50,
"type": "array",
"items": {
"type": "object",
"properties": {
"code": {
"type": "string",
"minLength": 1,
"description": "The code to validate (raw, as it appears in your data)."
},
"terminology": {
"type": "string",
"enum": [
"icd11",
"icd10",
"snomed",
"loinc",
"rxnorm",
"mesh",
"atc",
"cid10"
],
"description": "Which terminology this code belongs to. Required — auto-detection isn't supported because category-level codes like \"A00\" exist in both ICD-10 and CID-10."
}
},
"required": [
"code",
"terminology"
]
},
"description": "List of code+terminology pairs to validate. Hard cap of 50 per call to keep total latency under ~10 s given upstream rate limits."
}
},
"required": [
"codes"
],
"additionalProperties": false
}
find_equivalent
Ranked unified search 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, RxNorm, and MeSH. Set `target_terminologies` to limit which are searched, or set `source_terminology` to exclude one (e.g. when you already have a code from that terminology and want equivalents elsewhere). The two combine: source is subtracted from targets. `limit` caps candidates per terminology (default 5, max 10).
Every candidate carries `match_score` (lexical similarity to the search term, 0-1) and `rank` (global position across all searched terminologies) — both computed by this server, since upstreams don't expose comparable relevance scores. Candidates from different terminologies whose titles are lexically identical are clustered in `groups` — a strong same-concept signal (absence of a group is NOT evidence of non-equivalence).
Searches upstreams in English. For official pt-BR content, use the dedicated tools: `icd11_search`/`mesh_search` accept `language: "pt"`, and `cid10_search` is natively Portuguese.
Parameters4
term
string
required
Medical term to search (e.g., "diabetes", "aspirin")
source_terminology
string
optional
If set, this terminology is excluded from the search. Use this when the term came from this terminology and you want equivalents in the others. Combines with target_terminologies by subtraction (source is removed from the target list).
target_terminologies
array
optional
Limit the search to these terminologies. If omitted, all five are searched.
limit
integer
optional
Maximum candidates returned PER terminology (1-10, default 5). This is a cap, not a page: the live fan-out has no stable cursor across five upstreams, so raise the limit instead of paging.
Raw schema
{
"type": "object",
"properties": {
"term": {
"type": "string",
"minLength": 1,
"description": "Medical term to search (e.g., \"diabetes\", \"aspirin\")"
},
"source_terminology": {
"description": "If set, this terminology is excluded from the search. Use this when the term came from this terminology and you want equivalents in the others. Combines with target_terminologies by subtraction (source is removed from the target list).",
"type": "string",
"enum": [
"icd11",
"snomed",
"loinc",
"rxnorm",
"mesh"
]
},
"target_terminologies": {
"description": "Limit the search to these terminologies. If omitted, all five are searched.",
"type": "array",
"items": {
"type": "string",
"enum": [
"icd11",
"snomed",
"loinc",
"rxnorm",
"mesh"
]
}
},
"limit": {
"description": "Maximum candidates returned PER terminology (1-10, default 5). This is a cap, not a page: the live fan-out has no stable cursor across five upstreams, so raise the limit instead of paging.",
"type": "integer",
"minimum": 1,
"maximum": 10
}
},
"required": [
"term"
],
"additionalProperties": false
}
atc_classify
Look 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 international ATC codes
Returns one entry per ATC code the drug belongs to. A single-ingredient drug typically maps to one substance-level code; combination products map to multiple. ATC codes are international (WHO Collaborating Centre); this tool retrieves them via NLM RxClass.
Parameters1
drug_name
string
required
Drug name to classify (brand or generic, e.g., "metformin")
Raw schema
{
"type": "object",
"properties": {
"drug_name": {
"type": "string",
"minLength": 1,
"description": "Drug name to classify (brand or generic, e.g., \"metformin\")"
}
},
"required": [
"drug_name"
],
"additionalProperties": false
}
atc_lookup
Look 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 / chemical)
Accepts codes 1-5 characters long: "A" (anatomical), "A10" (therapeutic), "A10B" (pharmacological), "A10BA" (chemical). Substance-level codes (7 chars, e.g., "A10BA02") are not exposed by this endpoint — use atc_classify with the drug name to retrieve the substance code.
Parameters1
atc_code
string
required
ATC code at level 1-4 (1-5 chars). Substance-level codes (7 chars, e.g., A10BA02) are not exposed by this endpoint — use atc_classify with the drug name instead.
Raw schema
{
"type": "object",
"properties": {
"atc_code": {
"type": "string",
"pattern": "^[A-V](\\d{2}([A-Z]([A-Z](\\d{2})?)?)?)?$",
"description": "ATC code at level 1-4 (1-5 chars). Substance-level codes (7 chars, e.g., A10BA02) are not exposed by this endpoint — use atc_classify with the drug name instead."
}
},
"required": [
"atc_code"
],
"additionalProperties": false
}
atc_members
List 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 includes its substance-level (7-char) ATC code via source_atc_code, useful for disambiguation when the queried class is at level 1-4. RxNorm's catalog is US-centric; the ATC class names and codes themselves are international.
Parameters1
atc_code
string
required
ATC code at any level. Higher levels (1-4) return all member substances; level 5 returns the single substance.
Raw schema
{
"type": "object",
"properties": {
"atc_code": {
"type": "string",
"pattern": "^[A-V](\\d{2}([A-Z]([A-Z](\\d{2})?)?)?)?$",
"description": "ATC code at any level. Higher levels (1-4) return all member substances; level 5 returns the single substance."
}
},
"required": [
"atc_code"
],
"additionalProperties": false
}
cid10_search
Search 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) translation of a clinical term
- Locate codes for billing, epidemiology, and clinical documentation in Brazil
Returns matches from CID-10 categories (3-char) and/or subcategories (4-char). Search is diacritic-insensitive: typing "infeccoes" matches "infecções". Every word must match (AND), and everyday Portuguese is resolved to the CID-10's own wording (câncer→neoplasia maligna, AVC→acidente vascular cerebral, pressão alta→hipertensão, suicídio→lesão autoprovocada, aids→HIV); when that happens the response says so in vocabulary_notes. This tool searches the Brazilian Portuguese CID-10 V2008 — for the international ICD-11 (current WHO revision, in English by default), use icd11_search.
Parameters3
query
string
required
Search terms in Portuguese, AND between words (e.g., "diabetes", "infarto", "câncer de mama"); accents ignored, everyday words resolved to CID-10 wording
level
string
optional
Restrict search to 3-char categories, 4-char subcategories, or both. Default: all
max_results
integer
optional
Maximum number of results (1-100). Default: 25
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 2,
"description": "Search terms in Portuguese, AND between words (e.g., \"diabetes\", \"infarto\", \"câncer de mama\"); accents ignored, everyday words resolved to CID-10 wording"
},
"level": {
"default": "all",
"description": "Restrict search to 3-char categories, 4-char subcategories, or both. Default: all",
"type": "string",
"enum": [
"categories",
"subcategories",
"all"
]
},
"max_results": {
"default": 25,
"description": "Maximum number of results (1-100). Default: 25",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"required": [
"query"
],
"additionalProperties": false
}
cid10_lookup
Look 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 restriction flags when applicable
Accepts both dotted ("A00.1") and undotted ("A001") forms; returns the canonical display.
Parameters1
code
string
required
CID-10 code (e.g., "A00", "A00.1", "A001", "I21"). Dotted and undotted forms both accepted.
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 by code range (e.g., I00-I99 → chapter IX)
- Build a navigable table of contents for downstream tooling
Returns 22 entries — CID-10 V2008 has not been updated since 2008.
Get 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 code range
Provide a chapter number (1-22).
Parameters1
num
integer
required
Chapter number (1-22). CID-10 V2008 has 22 chapters.
List 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 before a batch run.
- Verify the bundled CID-10 (frozen at V2008) and ICD-10 → ICD-11 transition tables (currently 2025-01) match expectations.
- Cite the data version in research artifacts.
Pass `terminology` to filter to a single entry; otherwise the full set of 8 is returned. The ICD-10 → ICD-11 version reads live from the bundled dataset; everything else is metadata maintained alongside the project release.
Parameters1
terminology
string
optional
Filter to a single terminology. Omit to return all 8.
Raw schema
{
"type": "object",
"properties": {
"terminology": {
"description": "Filter to a single terminology. Omit to return all 8.",
"type": "string",
"enum": [
"icd11",
"icd10",
"snomed",
"loinc",
"rxnorm",
"mesh",
"atc",
"cid10"
]
}
},
"additionalProperties": false
}
terminology_diff
Report 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` lists the version(s) this server actually has on hand.
For **ICD-10 vs ICD-11** specifically, the tool surfaces a real cross-revision summary from the bundled WHO transition tables (the ICD-10 → ICD-11 case is a structural diff between two WHO revisions). Use `terminology: "icd10"` with no `to_version` to get the cross-revision summary: total mapped ICD-10 categories, how many are 1:1 vs split into multiple ICD-11 codes, and the average number of alternatives when split.
Inputs:
- `terminology` (required): which terminology to report on.
- `from_version` (optional): the version you have data from. If omitted, the tool reports against the currently-bundled version.
- `to_version` (optional): the version you want to compare to. If omitted, the tool reports against the publisher's latest known release.
This tool is intentionally a metadata + guidance layer, not a diff engine — for terminologies that change frequently (SNOMED, LOINC, RxNorm, MeSH), the publisher's official changelog is the authoritative source.
Parameters3
terminology
string
required
Which terminology to report on.
from_version
string
optional
Version you have data from. Optional; behavior depends on terminology.
to_version
string
optional
Version you want to compare to. Optional.
Raw schema
{
"type": "object",
"properties": {
"terminology": {
"type": "string",
"enum": [
"icd11",
"icd10",
"snomed",
"loinc",
"rxnorm",
"mesh",
"atc",
"cid10"
],
"description": "Which terminology to report on."
},
"from_version": {
"description": "Version you have data from. Optional; behavior depends on terminology.",
"type": "string"
},
"to_version": {
"description": "Version you want to compare to. Optional.",
"type": "string"
}
},
"required": [
"terminology"
],
"additionalProperties": false
}
search
Searches the medical terminologies (CID-10 categories and chapters, ICD-11, LOINC, RxNorm, MeSH, terminology version records) catalog and returns up to 10 matching documents as { id, title, url }, ordered by relevance (an empty list means nothing matched).
This tool exists for the OpenAI Deep Research contract: ChatGPT deep research, company knowledge and research workflows over the Responses API require exactly the tools `search` and `fetch`. Pass one of the returned ids to `fetch` to read the document.
For direct questions and for data (values, series, rankings) prefer the terminology tools (`icd11_*`, `cid10_*`, `loinc_*`, `rxnorm_*`, `mesh_*`, `atc_*`, `map_*`, `find_equivalent`, `validate_codes`), which return the actual data with provenance — this is a catalog index, not a data query.
Query: natural language or keywords, Portuguese or English; accents and case are ignored.
Behavior: read-only and idempotent — the catalog comes from the public source and is cached in memory.
Parameters1
query
string
required
Search terms, natural language or keywords (accents and case are ignored)
Raw schema
{
"type": "object",
"properties": {
"query": {
"type": "string",
"description": "Search terms, natural language or keywords (accents and case are ignored)"
}
},
"required": [
"query"
]
}
fetch
Returns the full document for an id obtained from `search`, as { id, title, text, url, metadata }: `text` is the readable content (Markdown) and `url` the canonical public page to cite.
Companion of `search` in the OpenAI Deep Research contract, over the medical terminologies (CID-10 categories and chapters, ICD-11, LOINC, RxNorm, MeSH, terminology version records) catalog. Only ids returned by `search` are valid; an unknown id returns an error.
The terminology tools (`icd11_*`, `cid10_*`, `loinc_*`, `rxnorm_*`, `mesh_*`, `atc_*`, `map_*`, `find_equivalent`, `validate_codes`) remain the tools for data queries.
Behavior: read-only and idempotent — a live GET against the public source when the document needs it.
Parameters1
id
string
required
Identifier of a document returned by `search`
Raw schema
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "Identifier of a document returned by `search`"
}
},
"required": [
"id"
]
}
"What's the ICD-11 code for type 2 diabetes?" → icd11_search
"Map ICD-10 code E11 to ICD-11." → map_icd10_to_icd11
"What does LOINC 2339-0 measure?" → loinc_details
"Qual o código CID-10 para infarto agudo do miocárdio?" → cid10_search
The answers come from authoritative sources (WHO, NLM, NIH, DataSUS) — real codes and mappings, not guesses from training data.
Features
33 default tools (39 with SNOMED enabled): 31 terminology tools plus search/fetch for ChatGPT Deep Research
3 MCP Prompts that orchestrate tool calls into named workflows (find-medical-code, drug-info, cid10-portuguese-lookup) — clients render these as one-click user actions
4 MCP Resources for in-process reference content (info://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)
Multi-terminology support in a single server
Cross-terminology mapping and search
Provenance on every response (since v1.8.0): each successful tool result carries a machine-readable provenance block — source, canonical URL, data vintage, real extraction instant (cache hits keep the original fetch instant), ready-to-use citation, and license — in structuredContent.provenance + attribution, mirrored in _meta under com.sidneybissoli.medical/*, with a compact text footer for text-only clients. Multi-source responses (find_equivalent, validate_codes) carry one block per source; server-computed ranking fields are flagged as derived
Built-in caching for improved performance
Rate limiting to respect API limits
Detailed responses with rich formatting
Two transports: stdio (default; for Claude Desktop, IDE clients) and Streamable HTTP (the hosted Cloudflare Worker at https://medical.sidneybissoli.com/mcp, or your own instance of worker/)
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
Try the hosted instance (no install)
A public Cloudflare Workers deployment runs at:
code
https://medical.sidneybissoli.com/mcp
Connect via the MCP Inspector or any Streamable HTTP MCP client:
The hosted instance has WHO credentials configured, so all 33 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.
ICD-11 release to query (e.g. 2025-01, 2026-01). Default 2026-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.
The server runs over stdio by default — that's what Claude Desktop and IDE clients expect. The Streamable HTTP transport is served by the Cloudflare Worker in worker/ (an instance of the maintainer's Fase 0 hosting template). The --http flag of the Node entry was removed in v1.6.0 — if you need a local HTTP endpoint, run the Worker locally:
bash
npm ci && cd worker && npm ci
npm run dev # wrangler dev on http://localhost:8787# Inspector via HTTP
npx @modelcontextprotocol/inspector --transport streamable-http --server-url http://localhost:8787/mcp
Hosted endpoints (production and local alike):
POST /mcp — JSON-RPC over Streamable HTTP (the MCP protocol). Stateless mode: each request is independent.
GET /status — version + deploy metadata. GET /metrics — aggregated per-tool usage.
GET /stats and GET /stats/badge — public tool-call counter (since 2026-05-13) and its shields.io badge.
GET /.well-known/mcp/server-card.json — static server card for registry scanners.
CORS is permissive (*) so browser clients (e.g. the MCP Inspector web UI) can connect directly.
ChatGPT (Deep Research)
ChatGPT deep research (and company knowledge, and research workflows over the Responses API) only uses an MCP server that exposes exactly search and fetch — this server does, on top of the terminology tools. Point the connector at the hosted endpoint, no key required:
code
https://medical.sidneybissoli.com/mcp
search ranks the query across the bundled CID-10 (categories, subcategories, chapters), the terminology version records and a live fan-out to ICD-11, LOINC, RxNorm and MeSH (the same fan-out find_equivalent does; a source that fails is skipped) and returns { id, title, url }; fetch renders the document through the terminology's own lookup tool (cid10_lookup, icd11_lookup, loinc_details, rxnorm_concept, mesh_descriptor, terminology_versions) as readable Markdown with the canonical public page (WHO ICD browsers, loinc.org, RxNav, MeSH Browser), which is what ChatGPT cites. Both carry the same provenance block as every other tool — search one block per source that answered, like find_equivalent. SNOMED is not part of the corpus (its public browser retired, so there is no page to cite). In ChatGPT's developer mode (Settings → Security and login → Developer mode) any tool is callable — the terminology tools remain the ones to use for data.
Hosted on Cloudflare Workers (primary)
The production deployment is the Cloudflare Worker in worker/, config in worker/wrangler.jsonc, CI deploy in .github/workflows/deploy-worker.yml (auto-runs on every push to main).
To deploy your own instance:
bash
npm ci && npm run build:worker-lib
cd worker && npm ci
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
Note: worker/wrangler.jsonc pins the maintainer's account_id and custom domain route — remove/replace both for your own deployment.
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. The template ships per-IP rate limiting and a usage-stats Durable Object; the upstream-facing cache/rate-limiter are per-isolate (PROGRESS.md Phase 11.9 Stage 2 tracks the KV/DO upgrade).
Listing on Smithery
After your Worker is live, register the URL on Smithery:
Pick the URL submission path (Smithery deprecated container hosting in 2024 — URL is the supported flow now).
Paste https://<your-worker>.workers.dev/mcp. Smithery's gateway scans for compliance and proxies traffic.
Available Tools (33 by default, 39 with SNOMED enabled)
Official Portuguese (pt-BR) content
The server never machine-translates terminology content — but several sources publish official translations, and the tools expose them:
CID-10 is natively Portuguese: cid10_search / cid10_lookup / cid10_chapter(s) serve the DataSUS V2008 dataset (the CID-10 the Brazilian SUS uses operationally).
ICD-11 in official Portuguese: pass language: "pt" to icd11_search / icd11_lookup to search and read WHO's official pt-BR linearization labels.
MeSH: pass language: "pt" to mesh_search / mesh_descriptor to request NLM's official translations where they exist.
SNOMED CT (when enabled): language requests the descriptions loaded in your Snowstorm edition (e.g. a national extension's pt-BR refset).
If a source has no official translation for an entry, you get the source language back — never a machine translation.
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
Ranked unified search across terminologies: server-computed match_score/rank per candidate plus cross-terminology groups of lexically identical titles; SNOMED branch is skipped when SNOMED tools are disabled
term: "diabetes"
ATC Tools (3)
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"
CID-10 Tools (4)
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, AND between words; everyday words resolved to CID-10 wording, and the response says so)
query: "câncer de mama"
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
Ask in your words, not the CID-10's. The CID-10 is worded in clinical Portuguese, and cid10_search matched your words against the code title as one verbatim phrase — so the everyday word returned nothing at all. Measured over the 14,496 categories and subcategories of the bundled V2008 dataset (2026-09-16), fixed since 1.12.0: every word must match (AND), and the everyday word is expanded to the CID-10's own (src/clients/cid10-vocabulary.ts, measured pairs only) — the response says so in vocabulary_notes, and zero results come with a way out.
you ask
hits before
the CID-10 writes
hits
câncer, câncer de mama
0
neoplasia maligna (da mama)
497, 12
ataque cardíaco
0
infarto
42
AVC
0
acidente vascular cerebral
11
pressão alta
0
hipertensão
44
dor de cabeça
0
cefaleia
10
suicídio
0
lesão autoprovocada
167
atropelamento
0
pedestre traumatizado
97
aids
0
doença pelo HIV
45
pedra nos rins, convulsão, tabagismo, maconha, crack, obeso, cachorro
0
calculose, convulsões, fumo, canabinóides, cocaína, obesidade, provocado por cão
19, 41, 17, 12, 13, 6, 11
What the V2008 dataset does not carry stays out and still returns zero — covid (U07.1 is from 2020), zika — because an alias for a code that does not exist promises what the source does not have. The same table feeds the Deep Research search index.
Versioning Tools (2)
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"
ChatGPT Deep Research (2)
The OpenAI Deep Research contract — the only two tools without a terminology prefix (names fixed by OpenAI). See ChatGPT (Deep Research) above.
Tool
Description
Example
search
Searches the catalog (CID-10, ICD-11, LOINC, RxNorm, MeSH, terminology versions) and returns { id, title, url } ranked by relevance
query: "myocardial infarction"
fetch
Returns the full document of an id from search ({ id, title, text, url, metadata }), rendered by the terminology's lookup tool
id: "cid10:I21.0"
Example Outputs
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
markdown
## 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.
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.
# 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.
Common Workflows
ICD-11 lookup:icd11_search with a clinical term → pick the result → icd11_lookup with the code for full details, or icd11_hierarchy to walk parents/children.
Drug pipeline:rxnorm_search for a brand or generic name → rxnorm_concept for the canonical record → rxnorm_ingredients and rxnorm_classes for downstream analysis.
Cross-terminology scaffolding: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.
ICD-10 → ICD-11 (text search, not authoritative):map_icd10_to_icd11 does honest text search against WHO ICD-11. Real WHO transition tables are tracked in PROGRESS.md Phase 13.1.
SNOMED CT setup (advanced)
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 33 tools instead of 39; 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).
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.
Terminology Licenses
The MIT license covers the server code and server-maintained metadata
only — not the terminology content served through it, and not
the two bundled datasets (cid10.json, icd10-to-icd11.json), which
remain under their own terms. The consolidated notice ships with the
package as NOTICE.md; every tool response carries a
per-source provenance block with the applicable license.
Required citation: "International Classification of Diseases, Eleventh Revision (ICD-11), World Health Organization (WHO) 2019 https://icd.who.int/browse11. Licensed under the Creative Commons Attribution-NoDerivatives 3.0 IGO licence (CC BY-ND 3.0 IGO)."
This server always serves ICD-11 codes and titles together with their URIs, verbatim; non-English labels are WHO's own official translations (never machine-translated)
WHO may terminate the license at any time by notice (§4.7)
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).
Member countries have national licenses
Affiliate licenses available for others (Brazil is not a member country)
Served via the free NLM Clinical Tables API; every code comes with its official display name
Terms with third-party copyright are served with their notice passed through verbatim
RxNorm
RxNorm is produced by the U.S. National Library of Medicine; the RxNav APIs serve non-proprietary, public-domain RxNorm content free of charge.
This product uses publicly available data from the U.S. National Library of Medicine (NLM), National Institutes of Health, Department of Health and Human Services; NLM is not responsible for the product and does not endorse or recommend this or any other product.
WHO 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_SECRETsecret
WHO ICD-11 API Client Secret. Required only for ICD-11 tools.
WHO_ICD11_RELEASE_ID
ICD-11 release to query (e.g. 2024-01, 2025-01). Optional; defaults to 2024-01.
ENABLE_SNOMED_TOOLS
Set 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 SNOMED_BASE_URL pointing at a working self-hosted Snowstorm.
SNOMED_BASE_URL
Base 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_LANGUAGE
Accept-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_LEVEL
pino log level (debug, info, warn, error, fatal). Optional; defaults to 'info'. Logs go to stderr only — never stdout (which is the MCP stdio transport).