SNOMED CT Terminology MCP server icon

SNOMED CT Terminology

by SNOMED CT Terminology

Healthcare15 toolsNo Auth Required

Look up, validate and expand SNOMED CT clinical concepts from your AI agent. 15 read-only tools, no sign-in, built by SNOMED International — terminology only, never patient data.

Verified connector

Listed by Anthropic as a partner connector in its Connectors Directory.

Connection checked by Agentman on .

Anthropic states this reflects the level of review a connector received, not a security audit.

Connect SNOMED CT Terminology via MCP

https://snowstorm-mcp.snomedtools.org/mcp

Works in any MCP-compatible client. In Agentman Studio it is one click — no config file to edit.

SNOMED CT Terminology Tools & Capabilities (15)

list_terminologiesRead-only

List the SNOMED CT editions and branches available on the connected server. WHEN TO USE: before running edition-specific queries to confirm available terminology keys, checking which release version is loaded, or verifying server connectivity.

server_healthRead-only

Return reachability and basic backend capability flags. Optionally specify terminology and/or target; defaults to the server's default terminology.

server_capabilitiesRead-only

Return backend classification and capabilities for a terminology. Optionally specify terminology and/or target; defaults to the server's default terminology.

fhir_metadataRead-only

Return a parsed FHIR CapabilityStatement summary for a terminology's backend. Set include_raw=true (default) to also include the raw CapabilityStatement payload. Optionally specify terminology and/or target; defaults to the server's default terminology.

snomed_lookupRead-only

Retrieve full concept details via FHIR CodeSystem/$lookup for a known SNOMED CT concept ID. Returns the FSN, synonyms, parent concepts, and all defining attributes with their values. WHEN TO USE: verifying a concept ID before using it in an ECL expression, inspecting the full attribute modelling of a specific concept, retrieving all synonyms and descriptions for a concept, checking whether a concept is active or inactive, or confirming the correct concept ID for a common attribute (e.g. finding site). If the code does not exist, returns found=false with a message (not an error). NOT FOR: searching by text (use snomed_expand with a {{ term = "..." }} filter) or retrieving a concept set (use snomed_expand with ECL). Optionally specify terminology (e.g. 'snomedct-us') and/or target; defaults to the server's default terminology when omitted.

snomed_validate_codeRead-only

Validate whether a SNOMED CT concept ID exists and is currently active via FHIR CodeSystem/$validate-code. Returns true/false with the display name if valid and active. WHEN TO USE: confirming a concept ID is valid and active before storing or querying, checking whether a concept has been inactivated (retired/replaced), handling legacy codes from EHR data (check status before using in ECL), or verifying a code belongs to a specific edition or version. Preferred approach when history supplements are unavailable (they are NOT supported on this server). Use this to check individual inactive codes instead. Optionally specify terminology and/or target; defaults to the server's default terminology.

snomed_subsumesRead-only

FHIR CodeSystem/$subsumes for two SNOMED codes. Optionally specify terminology and/or target; defaults to the server's default terminology.

snomed_expandRead-only

Expand a SNOMED CT value set using FHIR ValueSet/$expand. The primary tool for retrieving concept sets via ECL (Expression Constraint Language) queries. Works on Snowstorm and Lite when FHIR is available. WHEN TO USE: retrieving concepts matching an ECL expression (most common use case), getting members of a reference set, counting concepts in a subhierarchy (use summary_only=true), text-filtering within a concept set, or retrieving attribute values across a concept set (dotted notation). VALUE SET URL FORMAT: Subtype query: http://snomed.info/sct?fhir_vs=ecl/<<CONCEPTID Attribute query: http://snomed.info/sct?fhir_vs=ecl/<<CONCEPTID:ATTR=<<VALUE Refset members: http://snomed.info/sct?fhir_vs=ecl/^REFSETID Full ECL: http://snomed.info/sct?fhir_vs=ecl/<YOUR ECL EXPRESSION> PERFORMANCE RULES (follow on every query): These rules protect the server from overload. Violating them causes timeouts, degraded performance, and may affect other users on shared infrastructure. 1. SCOPE FIRST. Never root a constrained query at a top-level hierarchy concept without narrowing scope first. These roots are TOO BROAD on their own: <<404684003 Clinical finding (~350k concepts) <<71388002 Procedure (~100k concepts) <<105590001 Substance (~70k concepts) <<123037004 Body structure (~40k concepts) Always narrow to a subhierarchy (e.g. <<195967001 Asthma) before adding attribute constraints, filters, or MINUS operations. 2. COUNT BEFORE FETCHING. Always use summary_only=true as the first call to check the total size. If total > 1000, stop and confirm with the user before fetching pages. Never assume a result set is small. 3. DO NOT PAGINATE AUTONOMOUSLY. Fetch the first page, summarise the results, and ask the user whether they need more. Never loop through all pages of a large result set without explicit user instruction. 4. NO TOP-LEVEL MINUS ON LARGE SETS. X MINUS Y at the top level requires materialising both sets in full and will time out on large hierarchies. Always prefer MINUS inside an attribute value expression: GOOD: <<X:{attr=(<<A MINUS <<B)} BAD: (<<X:attr=<<A) MINUS (<<X:attr=<<B) 5. NO WILDCARD QUERIES ON LARGE SETS. Expressions like <<404684003:*=* or <<71388002:attr=* against top-level hierarchies are extremely expensive. Scope to a subhierarchy before using wildcards. 6. NO RECURSIVE CHILDREN CALLS. Never call snomed_get_children in a loop to traverse a hierarchy. Use <<CONCEPTID ECL for transitive closure in one call. 7. NO REPEATED snomed_lookup ACROSS A CONCEPT SET. Use dotted attribute notation (<<X.attrId) to retrieve attribute values across a set in one call instead of calling snomed_lookup for each concept individually. ECL QUICK REFERENCE: Hierarchy operators: <<X Subtype of X (including X) <X Strict subtype of X (excluding X) >>X Supertype of X (including X) >!X Direct parents of X only (ECL 1.4) <!X Direct children of X only (ECL 1.4) ^X Member of reference set X Set operators (use at top level between expressions): X OR Y Union X AND Y Intersection X MINUS Y Difference WARNING: Top-level MINUS between two large expansions will TIME OUT. Prefer MINUS inside an attribute value expression instead. Attribute constraints: <<X : attr=<<Y Ungrouped (attribute may be in any role group) <<X : {attr1=<<Y, attr2=<<Z} Grouped (BOTH attributes in the SAME role group) WARNING: Grouped vs ungrouped returns DIFFERENT results. Always choose deliberately. MINUS inside attribute value (PREFERRED for performance): <<X : {246075003=(<<105590001 MINUS <<410942007), 363698007=<<80891009} Wildcards: <<X : *=<<Y Any attribute with value Y <<X : attr=* Any value for a specific attribute CARDINALITY (constrain how many times an attribute appears): <<X : [0..0] attr=* Concepts with NO instances of attr (content QA) <<X : [1..1] {attr=<<Y} Exactly one instance of attr in the same role group <<X : [2..*] {attr=*} Two or more instances of attr NOTE: [0..0] does not require braces. [1..*] and above should use grouped syntax { }. DOTTED ATTRIBUTE NOTATION (returns attribute VALUES, not filtered concepts): <<X . attrId Returns the SET OF VALUES of attrId across all subtypes of X This is the INVERSE of filtering: it returns destination concepts, not source. Use for: exploring attribute value ranges, building value set pickers, content coverage analysis, verifying modelling scope. DESCRIPTION FILTERS (ECL 1.5/1.6): <<X {{ term = "mild" }} Concepts with "mild" in any description <<X {{ term = "mild", language = en }} English descriptions only <<X {{ typeId = 900000000000003001 }} FSN filter <<X {{ typeId = 900000000000013009 }} Synonym filter Multiple filters are ANDed together. CONCEPT FILTERS (ECL 1.6): <<X {{ active = false }} Inactive concepts only <<X {{ active = true }} Active concepts only (default) <<X {{ effectiveTime > "20200101" }} Modified after Jan 2020 (YYYYMMDD) <<X {{ effectiveTime = "20230901" }} Exact release date <<X {{ effectiveTime >= "20200101", effectiveTime <= "20231001" }} Date range NOTE: Concept filters on very large sets will TIME OUT. Scope first. HISTORY SUPPLEMENTS (ECL 2.0): NOT SUPPORTED on this server (returns HTTP 500). Use snomed_validate_code to check individual inactive codes instead. FUZZY MATCHING: Set fuzzy=true to enable approximate/fuzzy matching on the filter text for misspelled or partial terms (Snowstorm Lite only; silently ignored on full Snowstorm). PAGINATION: ALWAYS use summary_only=true first to check total before fetching. If total > 1000, confirm with user before paginating. Default count=20. Raise explicitly for larger pages. max_contains caps the internal buffer (default 100). Use offset for pagination. EXAMPLES: Count respiratory disorders first (always do this before fetching): value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<50043002', summary_only=true All subtypes of Asthma: value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<195967001' Disorders by finding site (heart), ungrouped: value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<404684003:363698007=<<80891009' Disorders caused by substance on heart, grouped (same role group): value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<404684003:{246075003=<<105590001,363698007=<<80891009}' Excluding drug-caused (MINUS in attribute value, no timeout): value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<404684003:{246075003=(<<105590001 MINUS <<410942007),363698007=<<80891009}' Concepts added to asthma hierarchy since Jan 2020: value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<195967001 {{ effectiveTime > "20200101" }}' Inactive asthma concepts (for EHR legacy code handling): value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<195967001 {{ active = false }}' Asthma concepts with "mild" in any description: value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<195967001 {{ term = "mild" }}' Finding sites across all asthma subtypes (dotted notation, one call not many lookups): value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<195967001.363698007' Clinical findings with exactly one cardiac finding site: value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<404684003:[1..1]{363698007=<<80891009}' Clinical findings with NO finding site modelled (content QA): value_set_url='http://snomed.info/sct?fhir_vs=ecl/<<404684003:[0..0]363698007=*' Reference set members: value_set_url='http://snomed.info/sct?fhir_vs=ecl/^723264001'

snomed_get_ancestorsRead-only

Get ancestor concepts of a SNOMED concept (parents, grandparents, etc. via IS-A hierarchy). Traverses upward through IS-A to find the classification position of a concept. Set direct_only=true to return only immediate parents. Optionally specify terminology and/or target; defaults to the server's default terminology.

snomed_get_childrenRead-only

Get direct IS-A children of a SNOMED concept (one level down in the hierarchy). More efficient than ECL for simple hierarchy browsing when you only need immediate children. WHEN TO USE: exploring the shape of a subhierarchy before writing an ECL query, understanding how a concept is subdivided at the next level, or lightweight hierarchy browsing without full ECL overhead. NOT FOR: transitive closure (all descendants) — use snomed_expand with <<CONCEPTID. Not for attribute-based queries — use snomed_expand with ECL. Not for filtering by description or metadata — use snomed_expand with filters. Optionally specify terminology and/or target; defaults to the server's default terminology.

snomed_get_descendantsRead-only

Get all descendant concepts of a SNOMED concept (children, grandchildren, etc. via IS-A hierarchy). Transitive closure downward, equivalent to <<X in ECL but returned as a hierarchy structure. Use snomed_expand with ECL if you need a flat concept list with attribute constraints instead. Use count and offset to paginate large result sets. Optionally specify terminology and/or target; defaults to the server's default terminology.

snowstorm_list_codesystemsRead-only

List Snowstorm code systems with summarized latest version info. Optionally specify terminology and/or target; defaults to the server's default terminology.

snowstorm_list_versionsRead-only

List versions for a Snowstorm code system short name. Optionally specify terminology and/or target for routing; defaults to the server's default terminology.

snowstorm_search_conceptsRead-only

Snowstorm-native concept search by term. Optionally specify terminology and/or target; defaults to the server's default terminology. Terms need at least 3 searchable characters (letters/digits); shorter terms return zero hits with a notice (not an error), e.g. prefer a longer phrase for acronyms.

snowstorm_get_concept_nativeRead-only

Snowstorm-native concept detail by conceptId. Optionally specify terminology and/or target; defaults to the server's default terminology.

Read from the server on 2026-08-17, including each tool's own safety annotations.

Limits

  • Licence limits what you may do with the answers. Without an Affiliate License you may explore and evaluate, but not copy identifiers into a record system, database or document, not translate or modify the content, and not redistribute it. That rules out the most obvious downstream use — piping returned concept IDs into an EHR or a data warehouse — without a full licence.
  • No warranty on the terminology content. SNOMED International's terms provide the software "as is" and state it makes no representations regarding the accuracy, completeness or fitness for purpose of the terminology content returned.
  • Hosted endpoints carry no availability or currency guarantee. The same terms describe hosted endpoints as provided for evaluation and development, with no guarantee of availability, performance or data currency, and note access may be subject to additional limits communicated separately. Do not build a production dependency on this endpoint without talking to SNOMED International.
  • Query volume is guarded, by design. The documented defaults are a global 10 calls per 60 seconds shared across all callers, three concurrent backend requests, a 500-concept hard ceiling per call, ECL pre-screening that blocks known-expensive patterns, and traversal detection at five hierarchy calls per minute. The repository notes guards are per-process and in-memory, so a multi-process deployment enforces them independently. Bulk extraction is prohibited by the terms regardless.
  • Broad ECL queries will fail before they succeed. snomed_expand's own description names four hierarchy roots too large to constrain directly — Clinical finding at roughly 350,000 concepts, Procedure at 100,000, Substance at 70,000 and Body structure at 40,000 — and instructs the model to scope to a subhierarchy first, count with summary_only before fetching, and never paginate autonomously.
  • ECL history supplements are not supported. The snomed_expand description states they return HTTP 500 on this server and directs you to snomed_validate_code for individual inactive codes instead.
  • Fuzzy matching is backend-dependent. snomed_expand documents that its fuzzy option works on Snowstorm Lite only and is silently ignored on full Snowstorm — silently, so a fuzzy query that returns nothing may not be telling you what you think.
  • Six tools need a full Snowstorm backend. The capability matrix marks the four snowstorm_* native tools as Snowstorm-only, flags snomed_subsumes as varying by backend, and notes snomed_validate_code may fall back to lookup emulation where the operation is unsupported.
  • Writing is out of scope entirely. The capability document places RF2 import, authoring writes to concepts or reference set members, and admin or destructive operations outside the current scope. This is a read-only connector and the annotations agree.
  • Short search terms return nothing. snowstorm_search_concepts needs at least three searchable characters. Shorter terms come back as zero hits with a notice rather than an error, which is easier to misread than a failure.
  • We did not exercise any tool. Our check was a read-only handshake. Everything above about behaviour comes from the server's own tool descriptions and SNOMED International's published documentation, not from calling anything. In particular we did not verify the 29-edition figure or the April 2026 release against the live server; both are the vendor's statements about its hosted deployment, and list_terminologies is the way to confirm them for yourself.

Frequently asked questions

Does the SNOMED CT MCP server access patient records?

No. Every one of the 15 tools queries clinical vocabulary — concept identifiers, names, synonyms and hierarchy — and none takes a patient, record or encounter parameter. SNOMED International describes the server as a stateless proxy that collects no personal data and discards query content after each response. It reads a terminology server, not an electronic health record.

Do I need a SNOMED CT licence to use this connector?

Not to explore it, but yes to use it for anything more. SNOMED International runs this server under the SNOMED CT Browser License Agreement, so an End User without an Affiliate License may explore and evaluate the terminology freely. That same agreement bars copying identifiers into a record system or database, translating the content, and redistributing it. Those uses need a full SNOMED CT licence.

Which SNOMED CT edition and release does the server query?

SNOMED International's connector documentation reports 29 terminology editions on the hosted server, covering the International Edition plus national extensions for 23 countries, and states screenshots ran against the International Edition April 2026 release. Editions differ, so confirm yours at query time by calling list_terminologies, then pass the edition key as the terminology parameter.

Can I use SNOMED CT MCP results for clinical decisions?

No. SNOMED International's terms restrict content returned by this server to terminology and informatics purposes only. They state it is not a substitute for professional medical advice, clinical judgement, diagnosis or treatment, and that no reliance should be placed on terminology outputs in direct patient care without appropriate clinical validation. Treat it as a vocabulary reference.

Does the SNOMED CT MCP server require an account or sign-in?

No. We opened an anonymous handshake against the endpoint on 2026-08-17 and it returned all 15 tool definitions with no credential. The repository states no user account is required when connected to a public Snowstorm instance, and the endpoint host publishes no OAuth protected-resource descriptor. Anthropic's directory records the server as authless.

Why does a large SNOMED CT query fail or get refused?

Because the server enforces performance guards to protect shared infrastructure. Its documented defaults are 10 calls per 60 seconds globally, three concurrent backend requests, a 500-concept ceiling per call, pre-screening that blocks known-expensive ECL patterns, and detection of looping hierarchy calls. Narrow the query to a subhierarchy and count before fetching.

Can this connector write to or edit SNOMED CT?

No. All 15 tools returned readOnlyHint true and destructiveHint false in our live handshake on 2026-08-17, and none is annotated destructive. SNOMED International's capability document places authoring writes, reference set edits, RF2 import and admin operations explicitly outside the current scope. The connector reads a terminology server and changes nothing on it.

Sources

Use in Agentman

Connect once and your agents call these tools on their own — on a schedule, in a workflow, with nobody at the keyboard.

Open in Agentman Studio

Server Info

Category
Healthcare
Developer
SNOMED CT Terminology
Tools
15
Domain
snowstorm-mcp.snomedtools.org

Using Claude Desktop or another MCP client? Setup docs — the connection URL above works anywhere.