medical-codes-mcp-server
Server Details
Offline US medical code lookup and crosswalk — ICD-10-CM/PCS, HCPCS Level II, RxNorm. Keyless.
- Status
- Healthy
- Uptime
- 100.0% over 41 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- cyanheads/medical-codes-mcp-server
- GitHub Stars
- 2
- Server Listing
- medical-codes-mcp-server
TDQS
Scored across 6 tools
Each tool has a clearly distinct purpose: browse hierarchy, validate a code, decode descriptions, list systems, crosswalk codes, and search by concept. There is no meaningful overlap—even the hierarchy-walking in browse_hierarchy vs map_codes is differentiated by discovery vs. targeted lookup.
All tools follow the medcode_ verb_noun pattern in snake_case: browse_hierarchy, check_code, get_code, list_systems, map_codes, search_codes. The naming is perfectly uniform and predictable.
Six tools is an ideal scope for a medical code reference server. Each tool earns its place and the count feels neither thin nor bloated.
The server covers the full read-only lifecycle for medical codes: system discovery, search, decode, validate, crosswalk, and hierarchy browsing. There are no obvious dead ends for common workflows like finding a code, confirming billability, or mapping across systems.
Available Tools
6 toolsmedcode_browse_hierarchyBrowse Code HierarchyARead-onlyIdempotentInspect
Walk a US medical code system's hierarchy for discovery without a search term. With no node, returns the top-level entries (ICD-10-CM categories, HCPCS range buckets, or ICD-10-PCS first-axis values). With a node, returns its immediate children. ICD-10-CM and HCPCS use a prefix hierarchy (a shorter code is the parent of a longer one); ICD-10-PCS is axis-based — each of its 7 characters is an independent axis (section, body system, root operation, body part, approach, device, qualifier), but only the top-level Section axis is browsable (omit node): positions 2–7 are context-dependent on the preceding axis path and are not enumerable from a flat partial code. Lets an agent orient in an unfamiliar system or enumerate a category's specific codes. A large child set paginates: when the response carries a nextCursor, pass it back as cursor to fetch the next page.
| Name | Required | Description | Default |
|---|---|---|---|
| node | No | A node to expand — or omit / pass an empty string for the top level. For ICD-10-CM/HCPCS, a code whose children to list; ICD-10-PCS supports only top-level Section browsing. Must not be blank or whitespace-only when provided. | |
| limit | No | Max entries per page. Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200. | |
| cursor | No | Opaque continuation token from a previous response's `nextCursor`, to fetch the next page of children/entries. Omit for the top of the list. | |
| system | Yes | The code system to browse. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The page size that was applied. |
| axes | No | The top-level ICD-10-PCS Section axis values (only the Section axis is enumerable). Empty when kind is "codes". |
| kind | No | "codes" for prefix-hierarchy children (ICD-10-CM/HCPCS); "axes" for ICD-10-PCS axis values. |
| codes | No | Child codes under the requested node or top level. Empty when kind is "axes". |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of entries returned on this page (codes or axes). |
| notice | No | Guidance when a node has no children/axes — suggests the top level or a valid node. |
| truncated | No | True when more entries exist beyond this page. |
| nextCursor | No | Opaque token to pass back as `cursor` for the next page. Present only when more entries exist beyond this page. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark this read-only and idempotent, so the description earn extra credit by disclosing hierarchy semantics: prefix vs axis-based structure, which positions are browsable, the fact that positions 2–7 are context-dependent, and pagination via `nextCursor`/`cursor`. This goes well beyond the annotations and prevents incorrect calls.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place. The core purpose and no-search-term qualifier are front-loaded, and the lengthy ICD-10-PCS explanation is necessary to prevent invalid browsing attempts. There is no fluff or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description is nearly complete: it covers purpose, node semantics, hierarchy models, special ICD-10-PCS constraints, and pagination. The output schema exists, so return-value details are not required. The only substantive gap is the lack of any mention of what `system=RXNORM` returns, even though RXNORM is a valid enum value.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema already documents all 4 parameters, so the baseline is 3. The description adds meaningful context for `node` (top-level vs immediate children), `cursor` (round-trip pagination), and system-specific top-level behaviors. However, the schema allows `RXNORM`, but the description's examples only cover ICD-10-CM, HCPCS, and ICD-10-PCS, leaving RXNORM behavior undocumented.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb ('Walk') and a specific resource ('a US medical code system's hierarchy'), and it clearly distinguishes itself from search tools by emphasizing 'without a search term.' It also explains the top-level forms for ICD-10-CM, HCPCS, and ICD-10-PCS, so an agent can immediately tell what this tool is for.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit invocation variants: with no `node` returns top-level entries, with a `node` returns immediate children System-specific usage is explained, including the ICD-10-PCS axis limitation. It does not explicitly name a sibling alternative like medcode_search_codes for term-based lookup, but the 'without a search term' phrase strongly implies the boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
medcode_check_codeCheck Medical CodeARead-onlyIdempotentInspect
Validate whether a US medical code exists, is current, and is billable in the active bundled release. Returns a discriminated status — valid_billable, valid_not_billable, valid_header, valid, or terminated — with a whyNot explaining non-billable and terminated cases (e.g. "valid ICD-10-CM category but not billable — submit a more specific child code"). This is the detail a coder needs before submitting a claim. RxNorm has no billing concept, so a current RxNorm concept is valid with billable: null and no billing verdict. Auto-detects the system from the code's shape; pass an explicit system to disambiguate. A non-billable or terminated code is a successful result with a whyNot, not an error — only a code absent from the named or detected system raises unknown_code, which names the other bundled system when one holds the code. A code string that also exists in another bundled system carries alsoInSystems naming it, since the verdict applies only to the system that answered.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | The code to validate, with or without dots. Must not be blank or whitespace-only. | |
| system | No | Force the lookup into this system. Omit to auto-detect from the code's shape. |
Output Schema
| Name | Required | Description |
|---|---|---|
| code | No | The code in display form (ICD-10-CM carries the dot). |
| error | No | Present when the call failed. Absent on success. |
| status | No | Validity status. valid_billable = submit as-is; valid_header/valid_not_billable = needs a more specific code; valid = exists and is current in a system with no billing concept (RxNorm), so there is no billing verdict; terminated = retired. |
| system | No | The system the code was resolved in, echoed for chaining. |
| whyNot | No | Explanation for non-billable/terminated statuses, or null when valid_billable or valid. |
| billable | No | True only when status is valid_billable. Null when status is valid — the system has no billing concept. |
| alsoInSystems | No | Other bundled systems holding this same code string, present only when there is at least one. The verdict above is for the system this code resolved in; the code is a DIFFERENT code in each system listed here, with its own billability — "B00" is the ICD-10-CM category "Herpesviral [herpes simplex] infections" and also the ICD-10-PCS table row "Imaging, Central Nervous System, Plain Radiography". Re-call with `system` set to one of these values to validate it there. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnly/idempotent annotations, it discloses error semantics (unknown_code only for absent code), successful non-billable results, whyNot, RxNorm null billable behavior, and alsoInSystems cross-system behavior. These are non-obvious behavioral traits an agent could not infer from annotations or schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The definition is dense but front-loaded: core purpose first, then return statuses, then usage, then edge cases. Every sentence adds meaningful operational detail, but several clauses are packed into long sentences and some explanations add complexity that could be streamlined.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only validation tool with an output schema, the description covers invocation, system resolution, error behavior, and special cases completely. No critical operational fact needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already describes both parameters, including 'Omit to auto-detect from the code's shape.' The description adds helpful behavioral context around system detection and cross-system results, but it does not substantially redefine parameter meanings beyond what the schema gives.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
First sentence uses a specific action ('Validate whether') against a specific resource ('US medical code') with three concrete criteria: exists, current, billable. The rest details the discriminated statuses in a way that distinguishes it from sibling tools like search_codes or browse_hierarchy without needing to see their schemas.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives a clear use context: 'detail a coder needs before submitting a claim.' It also explains when auto-detection is sufficient versus when to pass an explicit system to disambiguate. However, it does not explicitly name sibling tools or state when not to use this tool versus medcode_get_code or medcode_map_codes.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
medcode_get_codeGet Medical CodeARead-onlyIdempotentInspect
Decode one or more US medical codes to their official descriptions across ICD-10-CM (diagnoses), ICD-10-PCS (inpatient procedures), HCPCS Level II (supplies/drugs/services), and RxNorm (drugs, by RXCUI). Also decodes a National Drug Code (NDC) directly to its RxNorm product offline, tagged source: "NDC" — hyphenated in an FDA segment configuration (4-4-2, 5-3-2, 5-4-1, or the 11-digit 5-4-2) or as bare 10/11 digits; any other segment widths are malformed and stay unresolved. Auto-detects the system from each code's shape; pass an explicit system only when a value is genuinely ambiguous. Accepts 1–50 codes and returns partial success: resolved codes in found, unresolved in notFound with a per-code reason, so one bad code never fails the batch. Set includeHierarchy to attach each code's parent and immediate children (with a childrenTruncated flag when a code has more children than the cap returns — walk the full set via medcode_browse_hierarchy or medcode_map_codes). The resolved system is echoed on every result for chaining into a billability check or a medcode_map_codes parents/children walk; a bare integer that resolves nowhere is named as a possible CPT / HCPCS Level I code, which is out of scope, except a bare 10/11-digit one, which is named as an NDC no bundled drug maps to; a code string that also exists in another bundled system carries alsoInSystems naming it, so a single answer to a colliding code is never mistaken for the only one.
| Name | Required | Description | Default |
|---|---|---|---|
| codes | Yes | Codes to decode (1–50). Mixed systems are fine — each is detected independently. An NDC decodes to its RxNorm product: hyphenated as 4-4-2, 5-3-2, 5-4-1, or 5-4-2, or as bare 10/11 digits. | |
| system | No | Force every code to be looked up in this system, which also skips the NDC decode. Omit to auto-detect per code. | |
| includeHierarchy | No | When true, attach each found code's parent and immediate children. |
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| found | No | Successfully decoded codes, in request order. |
| notFound | No | Codes that did not resolve, with per-code reasons. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses rich behavioral traits beyond the read-only/idempotent annotations: partial success with found/notFound and per-code reasons, malformed NDC codes staying unresolved, cross-system collision handling via alsoInSystems, hierarchy attachment with childrenTruncated, and system echoing for chaining. No contradiction with annotations; it enriches them with precise resolution semantics.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose is front-loaded and the text flows logically from decoding to hierarchy to collision handling, with every sentence adding substantive information. However, the long multi-clause, comma-packed sentences require careful parsing, so the efficient density sacrifices some readability and structure.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With full parameter coverage, an output schema, and annotations, the description still adds all needed behavioral context: batch limits, partial-success semantics, malformed-code resolution, hierarchy truncation, and cross-system collision notes. Nothing an agent needs to invoke this tool correctly is missing or ambiguous.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Although the input schema already documents all three parameters at 100% coverage, the description adds operational meaning: codes can be mixed and independently detected, NDC formats are enumerated, forcing the system parameter skips NDC decode, and includeHierarchy attaches parent/children with a truncation flag. This materially improves an agent's ability to choose correct parameter values.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb ('Decode') and names the resource (US medical codes) plus the exact systems covered, including the NDC offline decoding edge case. It distinguishes itself from sibling tools by explicitly referencing medcode_browse_hierarchy/medcode_map_codes for hierarchy walking and a billability check, so an agent can identify it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly tells the agent to omit the system parameter for auto-detection and to pass it only for genuinely ambiguous values. It also names alternatives for walking a full hierarchy (medcode_browse_hierarchy or medcode_map_codes) and for chaining into a billability check, providing clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
medcode_list_systemsList Code SystemsARead-onlyIdempotentInspect
List the bundled US medical code systems with their release identifiers, effective dates, and code counts, and the RxClass drug-class layer the class crosswalks read, with each source’s version. Confirms which ICD-10-CM fiscal year, ICD-10-PCS fiscal year, HCPCS Level II release, RxNorm normalized set, and RxClass sources are active before acting on any decode, search, or crosswalk result. The corpus is offline and built at package-build time — this call reports exactly which release is baked into the running server. ICD-10-CM/PCS are the US clinical modifications, not the ICD-10/ICD-11 base.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| error | No | Present when the call failed. Absent on success. |
| systems | No | One entry per bundled code system, in canonical order — the systems the `system` inputs of the other tools accept. |
| classLayer | No | The RxClass drug-class layer the rxcui_to_classes and class_to_rxcuis directions of medcode_map_codes read — not a code system, so it has no entry in `systems`. Null when this build carries no class layer. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already provide readOnlyHint=true and idempotentHint=true, and the description adds valuable behavioral context: the corpus is offline, built at package-build time, and the call reports exactly which release is baked into the running server. It also clarifies the ICD-10-CM/PCS scope to prevent confusion with base ICD-10/ICD-11. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: the first states what is listed, the second states when to use the result, and the third adds the offline/build-time behavior and the ICD-10 scope clarification. It is dense but not bloated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, the description does not need to detail return values. It fully covers the tool's purpose, the systems involved, versioning semantics, offline behavior, and the relationship to sibling operations, so an agent has enough context to select and invoke it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema description coverage is 100%, so there are no parameter semantics for the description to clarify. The description instead usefully explains what the returned report contains, which is the relevant semantic content for a no-argument call.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb and resource: 'List the bundled US medical code systems' with their release identifiers, effective dates, and code counts, plus the RxClass layer. It also distinguishes this metadata/version-reporting tool from sibling decode/search/crosswalk tools by saying it confirms which releases are active before acting on those operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly frames when to use this tool: 'before acting on any decode, search, or crosswalk result.' It gives clear contextual guidance for version verification, though it does not explicitly name alternative tools or state when not to use it beyond that implied scope.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
medcode_map_codesMap Medical CodesARead-onlyIdempotentInspect
Crosswalk a US medical code or drug across systems and within a hierarchy. Hierarchy directions: parents and children walk a code's prefix hierarchy one level per call — immediate parent/children only (depth-1); call iteratively for the full ancestor or descendant path (ICD-10-CM/HCPCS; ICD-10-PCS codes have no prefix parent, and RxNorm concepts no code hierarchy). A resolvable source with no edge in the requested direction is a successful empty result with a notice, not an error. A source code string that also exists in another bundled system carries alsoInSystems naming it, since only the resolved system's hierarchy was walked. Drug directions (RxNorm): name_to_rxcui (drug name → RXCUI), ndc_to_rxcui and rxcui_to_ndc (NDC ↔ RXCUI; NDCs accepted hyphenated in an FDA segment configuration — 4-4-2, 5-3-2, 5-4-1, or the 11-digit 5-4-2 — or as bare 10/11 digits; ndc_to_rxcui names the product it decoded to), rxcui_to_ingredients and rxcui_to_brands (RXCUI → ingredient/brand RXCUIs, each with the target's RxNorm name and its conceptType — read that before counting a combination product's ingredients). Drug-class directions (RxClass): rxcui_to_classes (RXCUI → its classes: pharmacologic class, mechanism of action, physiologic effect, pharmacokinetics, therapeutic category, chemical structure, the diseases it may treat, prevent, diagnose, or induce or is contraindicated with, VA class, DEA controlled-substance schedule, CDC vaccine code; a drug product also carries its ingredients' classes, naming the ingredient in via, while DEA schedules are recorded only on drug products and VA classes almost only there, so map a product for those) and class_to_rxcuis (class ID → its direct member RXCUIs, each with its RxNorm name and conceptType). Each class hit carries classType, source (the RxClass source asserting it), and relation — a ci_ relation is a contraindication, not an indication; narrow either direction with classType. Every result carries source provenance (which system or edge answered) so a chained call (e.g. into openfda with a resolved NDC) uses the right identifier. The children, name_to_rxcui, rxcui_to_ndc, rxcui_to_classes, and class_to_rxcuis directions can return large sets and paginate: a nextCursor in the response is passed back as cursor (with an optional limit page size) to walk the full set. A field the direction does not use is rejected with field_not_applicable: limit and cursor on the point directions, classType outside the class directions, and a system other than RXNORM on the drug and class directions.
| Name | Required | Description | Default |
|---|---|---|---|
| from | Yes | The source value: a code (for parents/children), a drug name, an NDC, an RXCUI, or an RxClass class ID (for class_to_rxcuis). Must not be blank or whitespace-only. | |
| limit | No | Max results per page, for the paginated directions only (children, name_to_rxcui, rxcui_to_ndc, rxcui_to_classes, class_to_rxcuis). Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200. Rejected on every other direction. | |
| cursor | No | Opaque continuation token from a previous response's `nextCursor`, for the paginated directions only (children, name_to_rxcui, rxcui_to_ndc, rxcui_to_classes, class_to_rxcuis). Omit for the first page; an empty string counts as omitted. A non-empty cursor on any other direction is rejected. | |
| system | No | For parents/children, force the source code into this system. Omit to auto-detect. The drug and class directions resolve in RxNorm and accept only "RXNORM" (no effect); any other value there is rejected. | |
| classType | No | For rxcui_to_classes and class_to_rxcuis only: keep only classes of this RxClass type — EPC (FDA established pharmacologic class), MOA (mechanism of action), PE (physiologic effect), PK (pharmacokinetics), TC (therapeutic category), CHEM (chemical structure), DISEASE (diseases the drug may treat, prevent, diagnose, or induce, or is contraindicated with), VA (VA drug class, recorded almost only on drug products), SCHEDULE (DEA controlled-substance schedule, recorded on drug products only), CVX (CDC vaccine code). Omit for every type. Rejected on every other direction. | |
| direction | Yes | What to map to. parents/children return the immediate parent or children only (depth-1) — call iteratively to walk a full path; the rxcui/ndc/name directions are RxNorm drug crosswalks; rxcui_to_classes and class_to_rxcuis are RxClass drug-class crosswalks. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | Paginated directions only: the page size that was applied. |
| from | No | The source value, echoed back. |
| hits | No | Crosswalk results, each tagged with the edge that produced it. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Paginated directions only: number of hits returned on this page. |
| notice | No | Guidance whenever a resolvable source returns no hits, naming which of the two causes applies: it has no edge in the requested direction (a top-level code has no parent; a leaf has no children; ICD-10-PCS codes have no prefix parent; RxNorm concepts have no code hierarchy; no bundled class, or none of the requested `classType`, covers the RXCUI; a class has no direct member), or the `cursor` starts past the last page of a direction that does have results. |
| direction | No | The mapping direction that was applied. |
| truncated | No | Paginated directions (children, name_to_rxcui, rxcui_to_ndc, rxcui_to_classes, class_to_rxcuis) only: true when more results exist beyond this page. |
| nextCursor | No | Paginated directions only: opaque token to pass back as `cursor` for the next page. Present only when more results exist beyond this page. |
| alsoInSystems | No | Other bundled systems holding the same `from` code string, present only when there is at least one (hierarchy directions only — a drug name, NDC, or RXCUI is not system-scoped). The hits above were walked in `resolvedSystem` alone; the code is a DIFFERENT code with a different hierarchy in each system listed here — "B00" is the ICD-10-CM category "Herpesviral [herpes simplex] infections" and also the ICD-10-PCS table row "Imaging, Central Nervous System, Plain Radiography". Re-call with `system` set to one of these values to walk it there. |
| resolvedSystem | No | The system the source resolved in, or null when not system-scoped. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already mark the tool read-only and idempotent, and the description adds substantial extra behavior: successful empty results with notices, `alsoInSystems` labeling, `field_not_applicable` rejections, pagination cursors, provenance on every result, and caveats like DEA schedules existing only on drug products. No statement contradicts the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every section earns its place: it is organized by hierarchy, drug, and class directions, with edge cases placed next to the relevant direction. It front-loads the core purpose and uses compact, structured prose rather than repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with nine directions and meaningful error/edge-case behavior, the description covers all major contexts: hierarchy depth, pagination, rejected fields, empty results, provenance, and class-type semantics. The presence of an output schema means return-value details are not needed here, so nothing essential is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, and the description goes well beyond it by expanding classType abbreviations, enumerating accepted NDC formats, explaining `via`, `relation`, `source`, and `nextCursor`, and clarifying how `system` behaves differently across direction families. An agent gets far more than the schema alone provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific action, 'Crosswalk a US medical code or drug across systems and within a hierarchy,' and then enumerates the nine mapping directions by family. This clearly distinguishes `map_codes` from the sibling browse/check/get/list/search tools, which are lookup-oriented rather than crosswalk-oriented.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives rich when-to-use details per direction family, including iterative calls for full hierarchy paths, pagination via cursor, and which directions accept which fields. It does not explicitly name alternative sibling tools or state when not to use this tool, so it falls just short of full guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
medcode_search_codesSearch Medical CodesARead-onlyIdempotentInspect
Find US medical codes whose official descriptions match a described concept, via full-text search over the bundled index. Every search term must appear — matched first as a token prefix, then as a substring so inflected and compound forms are also found (a "neuropathy" search surfaces "mononeuropathy"/"polyneuropathy" siblings too, not only a standalone "neuropathy" token). An RxNorm concept matches on its drug name alone, never its term type (SBD, IN, …) — narrow by type with chapter. Filter by system (ICD10CM/ICD10PCS/HCPCS/RXNORM), billableOnly to exclude headers/categories, and chapter. Use when you have a clinical description and need the code — the reverse of medcode_get_code. Results echo the resolved system per row for chaining, rank exact prefix matches ahead of substring-only matches with a deterministic tie-break, and disclose truncation with a nextCursor: pass it back as cursor to page through the full ranked set.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max codes per page. Defaults to the server's MEDCODE_MAX_RESULTS (50), ceiling 200. | |
| query | Yes | Clinical description to match, e.g. "type 2 diabetes with neuropathy". Must not be blank or whitespace-only. | |
| cursor | No | Opaque continuation token from a previous response's `nextCursor`, to fetch the next page of the same ranked result set. Omit for the first page. | |
| system | No | Restrict results to one system. Omit to search all bundled systems. | |
| chapter | No | Restrict to a chapter/range bucket (the value from a code's `chapter` field). Case-insensitive: surrounding whitespace is trimmed and the value is upper-cased to match how chapters are stored, and `appliedFilters.chapter` echoes the upper-cased value that actually ran. A blank or whitespace-only value carries no filtering intent and is treated as omitted, which the response discloses as `appliedFilters.chapter: null`. | |
| billableOnly | No | When true, return only billable leaf codes (exclude headers/categories). RxNorm has no billing concept, so this excludes every RxNorm concept. |
Output Schema
| Name | Required | Description |
|---|---|---|
| cap | No | The page size that was applied. |
| codes | No | Matching codes, ranked by full-text relevance. |
| error | No | Present when the call failed. Absent on success. |
| shown | No | Number of codes returned on this page. |
| notice | No | Guidance when nothing matched — echoes the query and suggests how to broaden, or names `billableOnly` as the cause when the searched system has no billing concept. |
| truncated | No | True when more matches exist beyond this page. |
| nextCursor | No | Opaque token to pass back as `cursor` for the next page. Present only when more matches exist beyond this page. |
| appliedFilters | No | Filters the server applied to the search. |
| effectiveQuery | No | The query as the server parsed it for matching. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes far beyond the readOnly/idempotent annotations by disclosing token-prefix-then-substring matching, the neuropathy example, RxNorm's drug-name-only matching, ranking order, deterministic tie-break, truncation via nextCursor, and echoed resolved system. It adds substantial behavioral context without contradicting the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but every sentence earns its place: purpose, matching semantics, parameter guidance, usage context, and pagination/ranking behavior. The core purpose is front-loaded in the first sentence, and there is no filler or repetition of schema details.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity, the description covers matching semantics, filter behavior, ranking, pagination, and output echoes. An output schema exists, so not explaining return shape is acceptable. The only external nuance, chapter values, is available via sibling tools and the schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline 3 applies, but the description adds meaning beyond the schema: billableOnly excludes all RxNorm concepts, chapter can narrow term-type matches, and cursor should receive nextCursor from a prior response. This enriches the parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Find US medical codes whose official descriptions match a described concept...' It also states the search mechanism (full-text over bundled index). It clearly distinguishes itself from medcode_get_code by framing this as the reverse operation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says 'Use when you have a clinical description and need the code — the reverse of medcode_get_code,' providing an explicit when-to-use and naming the key alternative. It also explains how to narrow with system, billableOnly, and chapter, giving actionable selection guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
- Changed
medcode_list_systems4 fields changed- changed
Output schema / anyOfPrevious value: -[ - { - "not": { - "required": [ - "error" - ] - }, - "required": [ - "systems" - ] - }, - { - "required": [ - "error" - ] - } -]New value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "systems", + "classLayer" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / classLayerAdded value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "classCount": { + "description": "RxClass class nodes bundled, including hierarchy nodes with no direct member.", + "type": "number" + }, + "edgeCount": { + "description": "Drug–class edges bundled, across every source.", + "type": "number" + }, + "sourceUrl": { + "description": "The RxClass API the layer was fetched from.", + "type": "string" + }, + "sources": { + "description": "One entry per bundled RxClass source.", + "items": { + "additionalProperties": false, + "description": "Provenance for one bundled RxClass source.", + "properties": { + "classCount": { + "description": "Classes this source asserts at least one bundled edge to.", + "type": "number" + }, + "edgeCount": { + "description": "Drug–class edges this source contributes.", + "type": "number" + }, + "fetchedAt": { + "description": "ISO 8601 date the RxClass snapshot was fetched — how current the class edges are.", + "type": "string" + }, + "source": { + "description": "The RxClass source, as class hits carry it in `source`: MEDRT, FDASPL, FMTSME, VA, RXNORM (DEA schedules), or CDC (CVX).", + "type": "string" + }, + "version": { + "description": "The release RxClass reports for this source, or null when it publishes none.", + "type": [ + "string", + "null" + ] + } + }, + "required": [ + "source", + "version", + "classCount", + "edgeCount", + "fetchedAt" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "classCount", + "edgeCount", + "sourceUrl", + "sources" + ], + "type": "object" + }, + { + "type": "null" + } + ], + "description": "The RxClass drug-class layer the rxcui_to_classes and class_to_rxcuis directions of medcode_map_codes read — not a code system, so it has no entry in `systems`. Null when this build carries no class layer." +} - changed
Output schema / properties / systems / descriptionPrevious value: -"One entry per bundled code system, in canonical order."New value: +"One entry per bundled code system, in canonical order — the systems the `system` inputs of the other tools accept." - changed
Output schema / properties / systems / items / properties / builtAt / descriptionPrevious value: -"ISO 8601 timestamp when this system was last baked."New value: +"ISO 8601 timestamp of this system’s data. For ICD-10-CM, ICD-10-PCS, and HCPCS, the time the index was built from the release named in `releaseId`. For RxNorm, which publishes no release label, the date the RxNav snapshot was fetched — how current its drug data is, unchanged by a rebuild from the same snapshot."
- Changed
medcode_map_codes18 fields changed- added
Input schema / properties / classTypeAdded value: +{ + "description": "For rxcui_to_classes and class_to_rxcuis only: keep only classes of this RxClass type — EPC (FDA established pharmacologic class), MOA (mechanism of action), PE (physiologic effect), PK (pharmacokinetics), TC (therapeutic category), CHEM (chemical structure), DISEASE (diseases the drug may treat, prevent, diagnose, or induce, or is contraindicated with), VA (VA drug class, recorded almost only on drug products), SCHEDULE (DEA controlled-substance schedule, recorded on drug products only), CVX (CDC vaccine code). Omit for every type. Rejected on every other direction.", + "enum": [ + "EPC", + "MOA", + "PE", + "PK", + "TC", + "CHEM", + "DISEASE", + "VA", + "SCHEDULE", + "CVX" + ], + "type": "string" +} - changed
Input schema / properties / cursor / descriptionPrevious value: -"Opaque continuation token from a previous response's `nextCursor`, for the paginated directions only (children, name_to_rxcui, rxcui_to_ndc). Omit for the first page; an empty string counts as omitted. A non-empty cursor on any other direction is rejected."New value: +"Opaque continuation token from a previous response's `nextCursor`, for the paginated directions only (children, name_to_rxcui, rxcui_to_ndc, rxcui_to_classes, class_to_rxcuis). Omit for the first page; an empty string counts as omitted. A non-empty cursor on any other direction is rejected." - changed
Input schema / properties / direction / descriptionPrevious value: -"What to map to. parents/children return the immediate parent or children only (depth-1) — call iteratively to walk a full path; the rxcui/ndc/name directions are RxNorm drug crosswalks."New value: +"What to map to. parents/children return the immediate parent or children only (depth-1) — call iteratively to walk a full path; the rxcui/ndc/name directions are RxNorm drug crosswalks; rxcui_to_classes and class_to_rxcuis are RxClass drug-class crosswalks." - changed
Input schema / properties / direction / enumPrevious value: -[ - "parents", - "children", - "name_to_rxcui", - "ndc_to_rxcui", - "rxcui_to_ndc", - "rxcui_to_ingredients", - "rxcui_to_brands" -]New value: +[ + "parents", + "children", + "name_to_rxcui", + "ndc_to_rxcui", + "rxcui_to_ndc", + "rxcui_to_ingredients", + "rxcui_to_brands", + "rxcui_to_classes", + "class_to_rxcuis" +] - changed
Input schema / properties / from / descriptionPrevious value: -"The source value: a code (for parents/children), a drug name, an NDC, or an RXCUI. Must not be blank or whitespace-only."New value: +"The source value: a code (for parents/children), a drug name, an NDC, an RXCUI, or an RxClass class ID (for class_to_rxcuis). Must not be blank or whitespace-only." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results per page, for the paginated directions only (children, name_to_rxcui, rxcui_to_ndc). Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200. Rejected on every other direction."New value: +"Max results per page, for the paginated directions only (children, name_to_rxcui, rxcui_to_ndc, rxcui_to_classes, class_to_rxcuis). Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200. Rejected on every other direction." - changed
Input schema / properties / system / descriptionPrevious value: -"For parents/children, force the source code into this system. Omit to auto-detect. The drug directions resolve in RxNorm and accept only \"RXNORM\" (no effect); any other value there is rejected."New value: +"For parents/children, force the source code into this system. Omit to auto-detect. The drug and class directions resolve in RxNorm and accept only \"RXNORM\" (no effect); any other value there is rejected." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `field_not_applicable`: A `system`, `limit`, or `cursor` was sent on a direction that does not use it. `no_mapping`: The source value did not resolve to any bundled code. `direction_unavailable`: A drug-crosswalk direction was requested but this build carries no RxNorm tables. `ambiguous_system`: The source code is present in more than one system and no `system` was given. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `field_not_applicable`: A `system`, `classType`, `limit`, or `cursor` was sent on a direction that does not use it. `no_mapping`: The source value did not resolve to any bundled code, drug, or class. `direction_unavailable`: A drug-crosswalk direction was requested but this build carries no RxNorm tables, or a class direction was requested but it carries no RxClass class layer. `ambiguous_system`: The source code is present in more than one system and no `system` was given. Other values are possible when a failure originates below the handler." - added
Output schema / properties / hits / items / properties / classTypeAdded value: +{ + "description": "The RxClass class type, on `rxcui_to_classes` and `class_to_rxcuis` hits only — the values the `classType` input takes.", + "enum": [ + "EPC", + "MOA", + "PE", + "PK", + "TC", + "CHEM", + "DISEASE", + "VA", + "SCHEDULE", + "CVX" + ], + "type": "string" +} - changed
Output schema / properties / hits / items / properties / conceptType / descriptionPrevious value: -"The target concept's RxNorm type, present on `rxcui_to_ingredients` and `rxcui_to_brands` hits only: \"IN\" (ingredient), \"PIN\" (precise ingredient — a specific salt, ester, or isomer of an ingredient), \"MIN\" (multiple ingredients — a concept naming a combination, never a substance within it), or \"BN\" (brand name). Ingredient hits mix the first three, so the hit count is not the substance count: a \"MIN\" hit is the grouping concept and never counts, and a \"PIN\" names a form of a substance rather than an extra one — usually alongside the \"IN\" it refines, though two \"PIN\" esters can share a single \"IN\". Counting the \"IN\" hits is the closest reading, and under-counts those shared cases."New value: +"The target concept's RxNorm type, present on `rxcui_to_ingredients`, `rxcui_to_brands`, and `class_to_rxcuis` hits only. A class member may be any drug concept: an ingredient type below, or a drug product — \"SCD\"/\"SBD\" (clinical/branded drug) or \"GPCK\"/\"BPCK\" (generic/branded pack). Otherwise \"IN\" (ingredient), \"PIN\" (precise ingredient — a specific salt, ester, or isomer of an ingredient), \"MIN\" (multiple ingredients — a concept naming a combination, never a substance within it), or \"BN\" (brand name). Ingredient hits mix the first three, so the hit count is not the substance count: a \"MIN\" hit is the grouping concept and never counts, and a \"PIN\" names a form of a substance rather than an extra one — usually alongside the \"IN\" it refines, though two \"PIN\" esters can share a single \"IN\". Counting the \"IN\" hits is the closest reading, and under-counts those shared cases." - changed
Output schema / properties / hits / items / properties / description / descriptionPrevious value: -"Description of the target when available: the code description for hierarchy hits, the official RxNorm name for the `name_to_rxcui`, `ndc_to_rxcui`, `rxcui_to_ingredients`, and `rxcui_to_brands` drug concepts. Absent for `rxcui_to_ndc`, whose targets are package identifiers with no description of their own."New value: +"Description of the target when available: the code description for hierarchy hits, the official RxNorm name for the `name_to_rxcui`, `ndc_to_rxcui`, `rxcui_to_ingredients`, `rxcui_to_brands`, and `class_to_rxcuis` drug concepts, and the class name for `rxcui_to_classes`. Absent for `rxcui_to_ndc`, whose targets are package identifiers with no description of their own." - added
Output schema / properties / hits / items / properties / relationAdded value: +{ + "description": "The RxClass relationship between the drug and the class, on `rxcui_to_classes` and `class_to_rxcuis` hits only: has_epc, has_moa, has_pe, has_pk, site_of_metabolism, has_tc, has_ingredient / has_chemical_structure / has_active_metabolites (CHEM), may_treat / may_prevent / may_diagnose / induces (DISEASE), has_vaclass / has_vaclass_extended, has_schedule, isa_cvx. A `ci_` relation (ci_with, ci_moa, ci_pe, ci_chemclass) is a contraindication: the drug is contraindicated with that disease or class — never an indication, and never class membership.", + "type": "string" +} - changed
Output schema / properties / hits / items / properties / source / descriptionPrevious value: -"Which system or relationship edge produced this hit (e.g. \"ICD10CM\", \"has_ingredient\", \"NDC\")."New value: +"Which system or relationship edge produced this hit (e.g. \"ICD10CM\", \"has_ingredient\", \"NDC\"). On the class directions, the RxClass source asserting the drug–class edge: \"MEDRT\" (VA MED-RT), \"FDASPL\" (FDA structured product labels), \"FMTSME\" (Federal Medication Terminologies), \"VA\" (VA National Formulary classes), \"RXNORM\" (DEA schedules as RxNorm records them), or \"CDC\" (CVX vaccine codes)." - changed
Output schema / properties / hits / items / properties / system / descriptionPrevious value: -"The code system of the target value, or null when the target is not a system code (e.g. an NDC)."New value: +"The code system of the target value, or null when the target is not a system code (an NDC, or an RxClass class ID)." - changed
Output schema / properties / hits / items / properties / value / descriptionPrevious value: -"The mapped target value (a code, RXCUI, or NDC)."New value: +"The mapped target value (a code, RXCUI, NDC, or RxClass class ID)." - added
Output schema / properties / hits / items / properties / viaAdded value: +{ + "description": "On `rxcui_to_classes` hits only: the ingredient RXCUI a drug product inherits this class through — RxClass attaches most classes to ingredients. Absent when the class attaches to the source RXCUI itself. When several ingredients carry the same class, names an ingredient (\"IN\") over its precise ingredient (\"PIN\"), then the lowest RXCUI.", + "type": "string" +} - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance whenever a resolvable source returns no hits, naming which of the two causes applies: it has no edge in the requested direction (a top-level code has no parent; a leaf has no children; ICD-10-PCS codes have no prefix parent; RxNorm concepts have no code hierarchy), or the `cursor` starts past the last page of a direction that does have results."New value: +"Guidance whenever a resolvable source returns no hits, naming which of the two causes applies: it has no edge in the requested direction (a top-level code has no parent; a leaf has no children; ICD-10-PCS codes have no prefix parent; RxNorm concepts have no code hierarchy; no bundled class, or none of the requested `classType`, covers the RXCUI; a class has no direct member), or the `cursor` starts past the last page of a direction that does have results." - changed
Output schema / properties / truncated / descriptionPrevious value: -"Paginated directions (children, name_to_rxcui, rxcui_to_ndc) only: true when more results exist beyond this page."New value: +"Paginated directions (children, name_to_rxcui, rxcui_to_ndc, rxcui_to_classes, class_to_rxcuis) only: true when more results exist beyond this page."
5 tool updates
- Changed
medcode_browse_hierarchy2 fields changed- changed
Output schema / properties / codes / items / properties / billable / descriptionPrevious value: -"True when the code is a billable leaf."New value: +"True when the code is a billable leaf. Null when the system has no billing concept." - changed
Output schema / properties / codes / items / properties / billable / typePrevious value: -"boolean"New value: +[ + "boolean", + "null" +]
- Changed
medcode_check_code5 fields changed- changed
Output schema / properties / billable / descriptionPrevious value: -"True only when status is valid_billable."New value: +"True only when status is valid_billable. Null when status is valid — the system has no billing concept." - changed
Output schema / properties / billable / typePrevious value: -"boolean"New value: +[ + "boolean", + "null" +] - changed
Output schema / properties / status / descriptionPrevious value: -"Validity status. valid_billable = submit as-is; valid_header/valid_not_billable = needs a more specific code; terminated = retired."New value: +"Validity status. valid_billable = submit as-is; valid_header/valid_not_billable = needs a more specific code; valid = exists and is current in a system with no billing concept (RxNorm), so there is no billing verdict; terminated = retired." - changed
Output schema / properties / status / enumPrevious value: -[ - "valid_billable", - "valid_not_billable", - "valid_header", - "terminated" -]New value: +[ + "valid_billable", + "valid_not_billable", + "valid_header", + "valid", + "terminated" +] - changed
Output schema / properties / whyNot / descriptionPrevious value: -"Explanation for non-billable/terminated statuses, or null when valid_billable."New value: +"Explanation for non-billable/terminated statuses, or null when valid_billable or valid."
- Changed
medcode_get_code13 fields changed- changed
Input schema / properties / system / descriptionPrevious value: -"Force every code to be looked up in this system. Omit to auto-detect per code."New value: +"Force every code to be looked up in this system, which also skips the NDC decode. Omit to auto-detect per code." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_codes_found`: None of the requested codes exist in any bundled system. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `no_codes_found`: None of the requested codes resolved — in any bundled system, or in the explicit `system` when one is given (the message then names any other bundled system that holds a code). Other values are possible when a failure originates below the handler." - changed
Output schema / properties / found / items / properties / billable / descriptionPrevious value: -"True when the code is a billable leaf. False for headers/categories and non-billable codes."New value: +"True when the code is a billable leaf. False for headers/categories and non-billable codes. Null when the system has no billing concept (RxNorm)." - changed
Output schema / properties / found / items / properties / billable / typePrevious value: -"boolean"New value: +[ + "boolean", + "null" +] - changed
Output schema / properties / found / items / properties / chapter / descriptionPrevious value: -"Chapter/range bucket the code belongs to, or null when not applicable."New value: +"Chapter/range bucket the code belongs to, or null when not applicable. For RxNorm, the concept term type (IN, PIN, MIN, BN, SCD, SBD, GPCK, BPCK)." - changed
Output schema / properties / found / items / properties / children / items / properties / billable / descriptionPrevious value: -"True when the code is a billable leaf. False for headers/categories and non-billable codes."New value: +"True when the code is a billable leaf. False for headers/categories and non-billable codes. Null when the system has no billing concept (RxNorm)." - changed
Output schema / properties / found / items / properties / children / items / properties / billable / typePrevious value: -"boolean"New value: +[ + "boolean", + "null" +] - changed
Output schema / properties / found / items / properties / children / items / properties / chapter / descriptionPrevious value: -"Chapter/range bucket the code belongs to, or null when not applicable."New value: +"Chapter/range bucket the code belongs to, or null when not applicable. For RxNorm, the concept term type (IN, PIN, MIN, BN, SCD, SBD, GPCK, BPCK)." - changed
Output schema / properties / found / items / properties / children / items / properties / shortDescription / descriptionPrevious value: -"Official short/abbreviated description, or null when none is on record."New value: +"Official short/abbreviated description, or null when none is on record. Always null for RxNorm, which publishes a single name." - changed
Output schema / properties / found / items / properties / children / items / properties / system / descriptionPrevious value: -"The system that answered, echoed for chaining: \"ICD10CM\", \"ICD10PCS\", \"HCPCS\", or \"RXNORM\"."New value: +"The system that answered: \"ICD10CM\", \"ICD10PCS\", \"HCPCS\", or \"RXNORM\". Pass it as `system` to medcode_check_code, or to medcode_map_codes on a parents/children walk; the map_codes drug directions accept only \"RXNORM\", which they need no `system` to reach." - changed
Output schema / properties / found / items / properties / shortDescription / descriptionPrevious value: -"Official short/abbreviated description, or null when none is on record."New value: +"Official short/abbreviated description, or null when none is on record. Always null for RxNorm, which publishes a single name." - changed
Output schema / properties / found / items / properties / system / descriptionPrevious value: -"The system that answered, echoed for chaining: \"ICD10CM\", \"ICD10PCS\", \"HCPCS\", or \"RXNORM\"."New value: +"The system that answered: \"ICD10CM\", \"ICD10PCS\", \"HCPCS\", or \"RXNORM\". Pass it as `system` to medcode_check_code, or to medcode_map_codes on a parents/children walk; the map_codes drug directions accept only \"RXNORM\", which they need no `system` to reach." - changed
Output schema / properties / notFound / items / properties / reason / descriptionPrevious value: -"Why it could not be resolved (absent from every bundled system, a well-formed NDC nothing maps to, or ambiguous across systems)."New value: +"Why it could not be resolved (absent from every bundled system — for a bare integer, with a note that CPT / HCPCS Level I codes are out of scope — absent from the explicit `system` while another bundled system holds it, which is named, a well-formed NDC nothing maps to, hyphenated or as bare 10/11 digits, an NDC looked up under an explicit `system` that skips the NDC decode, or ambiguous across systems)."
- Changed
medcode_map_codes6 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"Opaque continuation token from a previous response's `nextCursor`, for the paginated directions (children, name_to_rxcui, rxcui_to_ndc). Omit for the first page."New value: +"Opaque continuation token from a previous response's `nextCursor`, for the paginated directions only (children, name_to_rxcui, rxcui_to_ndc). Omit for the first page; an empty string counts as omitted. A non-empty cursor on any other direction is rejected." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results per page for the paginated directions (children, name_to_rxcui, rxcui_to_ndc). Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200. Ignored by the point directions."New value: +"Max results per page, for the paginated directions only (children, name_to_rxcui, rxcui_to_ndc). Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200. Rejected on every other direction." - changed
Input schema / properties / system / descriptionPrevious value: -"For parents/children, force the source code into this system. Omit to auto-detect."New value: +"For parents/children, force the source code into this system. Omit to auto-detect. The drug directions resolve in RxNorm and accept only \"RXNORM\" (no effect); any other value there is rejected." - changed
Output schema / properties / error / properties / data / properties / reason / descriptionPrevious value: -"Machine-readable failure mode. Declared by this tool: `no_mapping`: The source value did not resolve to any bundled code. `direction_unavailable`: A drug-crosswalk direction was requested but this build carries no RxNorm tables. `ambiguous_system`: The source code is present in more than one system and no `system` was given. Other values are possible when a failure originates below the handler."New value: +"Machine-readable failure mode. Declared by this tool: `field_not_applicable`: A `system`, `limit`, or `cursor` was sent on a direction that does not use it. `no_mapping`: The source value did not resolve to any bundled code. `direction_unavailable`: A drug-crosswalk direction was requested but this build carries no RxNorm tables. `ambiguous_system`: The source code is present in more than one system and no `system` was given. Other values are possible when a failure originates below the handler." - changed
Output schema / properties / error / properties / data / properties / reason / examplesPrevious value: -[ - "no_mapping", - "direction_unavailable", - "ambiguous_system" -]New value: +[ + "field_not_applicable", + "no_mapping", + "direction_unavailable", + "ambiguous_system" +] - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance whenever a resolvable source returns no hits, naming which of the two causes applies: it has no edge in the requested direction (a top-level code has no parent; a leaf has no children; ICD-10-PCS codes have no prefix parent), or the `cursor` starts past the last page of a direction that does have results."New value: +"Guidance whenever a resolvable source returns no hits, naming which of the two causes applies: it has no edge in the requested direction (a top-level code has no parent; a leaf has no children; ICD-10-PCS codes have no prefix parent; RxNorm concepts have no code hierarchy), or the `cursor` starts past the last page of a direction that does have results."
- Changed
medcode_search_codes6 fields changed- changed
Input schema / properties / billableOnly / descriptionPrevious value: -"When true, return only billable leaf codes (exclude headers/categories)."New value: +"When true, return only billable leaf codes (exclude headers/categories). RxNorm has no billing concept, so this excludes every RxNorm concept." - changed
Output schema / properties / codes / items / properties / billable / descriptionPrevious value: -"True when the code is a billable leaf."New value: +"True when the code is a billable leaf. Null when the system has no billing concept (RxNorm)." - changed
Output schema / properties / codes / items / properties / billable / typePrevious value: -"boolean"New value: +[ + "boolean", + "null" +] - changed
Output schema / properties / codes / items / properties / chapter / descriptionPrevious value: -"Chapter/range bucket, or null."New value: +"Chapter/range bucket, or null. For RxNorm, the concept term type (IN, PIN, MIN, BN, SCD, SBD, GPCK, BPCK)." - changed
Output schema / properties / codes / items / properties / shortDescription / descriptionPrevious value: -"Official short description, or null when none is on record."New value: +"Official short description, or null when none is on record. Always null for RxNorm, which publishes a single name." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when nothing matched — echoes the query and suggests how to broaden."New value: +"Guidance when nothing matched — echoes the query and suggests how to broaden, or names `billableOnly` as the cause when the searched system has no billing concept."
6 tool updates
- Changed
medcode_browse_hierarchy6 fields changed- removed
Output schema / properties / codes / items / properties / chapter / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / codes / items / properties / chapter / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / codes / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / codes / items / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / codes / items / properties / shortDescription / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / codes / items / properties / shortDescription / typeAdded value: +[ + "string", + "null" +]
- Changed
medcode_check_code2 fields changed- removed
Output schema / properties / whyNot / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / whyNot / typeAdded value: +[ + "string", + "null" +]
- Changed
medcode_get_code14 fields changed- removed
Output schema / properties / found / items / properties / chapter / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / found / items / properties / chapter / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / found / items / properties / children / items / properties / chapter / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / found / items / properties / children / items / properties / chapter / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / found / items / properties / children / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / found / items / properties / children / items / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / found / items / properties / children / items / properties / shortDescription / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / found / items / properties / children / items / properties / shortDescription / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / found / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / found / items / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / found / items / properties / parent / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / found / items / properties / parent / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / found / items / properties / shortDescription / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / found / items / properties / shortDescription / typeAdded value: +[ + "string", + "null" +]
- Changed
medcode_list_systems6 fields changed- removed
Output schema / properties / systems / items / properties / effectiveEnd / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / systems / items / properties / effectiveEnd / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / systems / items / properties / effectiveStart / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / systems / items / properties / effectiveStart / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / systems / items / properties / sourceUrl / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / systems / items / properties / sourceUrl / typeAdded value: +[ + "string", + "null" +]
- Changed
medcode_map_codes4 fields changed- removed
Output schema / properties / hits / items / properties / system / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / hits / items / properties / system / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / resolvedSystem / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / resolvedSystem / typeAdded value: +[ + "string", + "null" +]
- Changed
medcode_search_codes10 fields changed- removed
Output schema / properties / appliedFilters / properties / chapter / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / appliedFilters / properties / chapter / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / appliedFilters / properties / system / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / appliedFilters / properties / system / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / codes / items / properties / chapter / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / codes / items / properties / chapter / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / codes / items / properties / description / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / codes / items / properties / description / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / codes / items / properties / shortDescription / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / codes / items / properties / shortDescription / typeAdded value: +[ + "string", + "null" +]
6 tool updates
- Changed
medcode_browse_hierarchy6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "kind", + "codes", + "axes", + "truncated", + "shown", + "cap" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `unknown_node`: The node does not exist in the system — for ICD-10-PCS, also when it uses a character outside the axis alphabet or begins no bundled code. Other values are possible when a failure originates below the handler.", + "examples": [ + "unknown_node" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "kind", - "codes", - "axes", - "truncated", - "shown", - "cap" -]
- Changed
medcode_check_code6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "system", + "code", + "status", + "billable", + "whyNot" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `unknown_code`: The code does not exist in the named or detected system. `ambiguous_system`: The code is present in more than one bundled system and no `system` was given. Other values are possible when a failure originates below the handler.", + "examples": [ + "unknown_code", + "ambiguous_system" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "system", - "code", - "status", - "billable", - "whyNot" -]
- Changed
medcode_get_code6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "found", + "notFound" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_codes_found`: None of the requested codes exist in any bundled system. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_codes_found" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "found", - "notFound" -]
- Changed
medcode_list_systems6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "systems" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode.", + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "systems" -]
- Changed
medcode_map_codes6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "from", + "direction", + "resolvedSystem", + "hits" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode. Declared by this tool: `no_mapping`: The source value did not resolve to any bundled code. `direction_unavailable`: A drug-crosswalk direction was requested but this build carries no RxNorm tables. `ambiguous_system`: The source code is present in more than one system and no `system` was given. Other values are possible when a failure originates below the handler.", + "examples": [ + "no_mapping", + "direction_unavailable", + "ambiguous_system" + ], + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "from", - "direction", - "resolvedSystem", - "hits" -]
- Changed
medcode_search_codes6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Output schema / anyOfAdded value: +[ + { + "not": { + "required": [ + "error" + ] + }, + "required": [ + "codes", + "effectiveQuery", + "appliedFilters", + "truncated", + "shown", + "cap" + ] + }, + { + "required": [ + "error" + ] + } +] - added
Output schema / properties / errorAdded value: +{ + "additionalProperties": {}, + "description": "Present when the call failed. Absent on success.", + "properties": { + "code": { + "description": "JSON-RPC error code for this failure.", + "maximum": 9007199254740991, + "minimum": -9007199254740991, + "type": "integer" + }, + "data": { + "additionalProperties": {}, + "properties": { + "reason": { + "description": "Machine-readable failure mode.", + "type": "string" + }, + "recovery": { + "additionalProperties": {}, + "description": "Actionable next step for the caller.", + "properties": { + "hint": { + "type": "string" + } + }, + "required": [ + "hint" + ], + "type": "object" + }, + "retryable": { + "description": "Whether retrying may succeed.", + "type": "boolean" + } + }, + "type": "object" + }, + "message": { + "description": "Human-readable description of what went wrong.", + "type": "string" + } + }, + "required": [ + "code", + "message" + ], + "type": "object" +} - removed
Output schema / requiredRemoved value: -[ - "codes", - "effectiveQuery", - "appliedFilters", - "truncated", - "shown", - "cap" -]
4 tool updates
- Changed
medcode_check_code1 field changed- added
Output schema / properties / alsoInSystemsAdded value: +{ + "description": "Other bundled systems holding this same code string, present only when there is at least one. The verdict above is for the system this code resolved in; the code is a DIFFERENT code in each system listed here, with its own billability — \"B00\" is the ICD-10-CM category \"Herpesviral [herpes simplex] infections\" and also the ICD-10-PCS table row \"Imaging, Central Nervous System, Plain Radiography\". Re-call with `system` set to one of these values to validate it there.", + "items": { + "type": "string" + }, + "type": "array" +}
- Changed
medcode_get_code3 fields changed- changed
Input schema / properties / codes / descriptionPrevious value: -"Codes to decode (1–50). Mixed systems are fine — each is detected independently. An NDC (hyphenated or 10/11-digit) decodes to its RxNorm product."New value: +"Codes to decode (1–50). Mixed systems are fine — each is detected independently. An NDC decodes to its RxNorm product: hyphenated as 4-4-2, 5-3-2, 5-4-1, or 5-4-2, or as bare 10/11 digits." - added
Output schema / properties / found / items / properties / alsoInSystemsAdded value: +{ + "description": "Other bundled systems holding this same code string, present only when there is at least one. The result above is the system this code resolved in; the code is a DIFFERENT code in each system listed here — \"B00\" is the ICD-10-CM category \"Herpesviral [herpes simplex] infections\" and also the ICD-10-PCS table row \"Imaging, Central Nervous System, Plain Radiography\". Re-call with `system` set to one of these values to decode it there.", + "items": { + "type": "string" + }, + "type": "array" +} - changed
Output schema / properties / notFound / items / properties / reason / descriptionPrevious value: -"Why it could not be resolved (unknown shape, not in the bundled release, or ambiguous)."New value: +"Why it could not be resolved (absent from every bundled system, a well-formed NDC nothing maps to, or ambiguous across systems)."
- Changed
medcode_map_codes7 fields changed- changed
Input schema / properties / cursor / descriptionPrevious value: -"Opaque continuation token from a previous response's `nextCursor`, for the paginated directions (children, name_to_rxcui). Omit for the first page."New value: +"Opaque continuation token from a previous response's `nextCursor`, for the paginated directions (children, name_to_rxcui, rxcui_to_ndc). Omit for the first page." - changed
Input schema / properties / limit / descriptionPrevious value: -"Max results per page for the paginated directions (children, name_to_rxcui). Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200. Ignored by the point directions."New value: +"Max results per page for the paginated directions (children, name_to_rxcui, rxcui_to_ndc). Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200. Ignored by the point directions." - added
Output schema / properties / alsoInSystemsAdded value: +{ + "description": "Other bundled systems holding the same `from` code string, present only when there is at least one (hierarchy directions only — a drug name, NDC, or RXCUI is not system-scoped). The hits above were walked in `resolvedSystem` alone; the code is a DIFFERENT code with a different hierarchy in each system listed here — \"B00\" is the ICD-10-CM category \"Herpesviral [herpes simplex] infections\" and also the ICD-10-PCS table row \"Imaging, Central Nervous System, Plain Radiography\". Re-call with `system` set to one of these values to walk it there.", + "items": { + "type": "string" + }, + "type": "array" +} - added
Output schema / properties / hits / items / properties / conceptTypeAdded value: +{ + "description": "The target concept's RxNorm type, present on `rxcui_to_ingredients` and `rxcui_to_brands` hits only: \"IN\" (ingredient), \"PIN\" (precise ingredient — a specific salt, ester, or isomer of an ingredient), \"MIN\" (multiple ingredients — a concept naming a combination, never a substance within it), or \"BN\" (brand name). Ingredient hits mix the first three, so the hit count is not the substance count: a \"MIN\" hit is the grouping concept and never counts, and a \"PIN\" names a form of a substance rather than an extra one — usually alongside the \"IN\" it refines, though two \"PIN\" esters can share a single \"IN\". Counting the \"IN\" hits is the closest reading, and under-counts those shared cases.", + "type": "string" +} - changed
Output schema / properties / hits / items / properties / description / descriptionPrevious value: -"Description of the target when available."New value: +"Description of the target when available: the code description for hierarchy hits, the official RxNorm name for the `name_to_rxcui`, `ndc_to_rxcui`, `rxcui_to_ingredients`, and `rxcui_to_brands` drug concepts. Absent for `rxcui_to_ndc`, whose targets are package identifiers with no description of their own." - changed
Output schema / properties / notice / descriptionPrevious value: -"Guidance when a resolvable code has no edge in the requested direction (e.g. a top-level code has no parent; a leaf has no children; ICD-10-PCS codes have no prefix parent)."New value: +"Guidance whenever a resolvable source returns no hits, naming which of the two causes applies: it has no edge in the requested direction (a top-level code has no parent; a leaf has no children; ICD-10-PCS codes have no prefix parent), or the `cursor` starts past the last page of a direction that does have results." - changed
Output schema / properties / truncated / descriptionPrevious value: -"Paginated directions (children, name_to_rxcui) only: true when more results exist beyond this page."New value: +"Paginated directions (children, name_to_rxcui, rxcui_to_ndc) only: true when more results exist beyond this page."
- Changed
medcode_search_codes1 field changed- changed
Input schema / properties / chapter / descriptionPrevious value: -"Restrict to a chapter/range bucket (the value from a code's `chapter` field)."New value: +"Restrict to a chapter/range bucket (the value from a code's `chapter` field). Case-insensitive: surrounding whitespace is trimmed and the value is upper-cased to match how chapters are stored, and `appliedFilters.chapter` echoes the upper-cased value that actually ran. A blank or whitespace-only value carries no filtering intent and is treated as omitted, which the response discloses as `appliedFilters.chapter: null`."
5 tool updates
- Changed
medcode_browse_hierarchy3 fields changed- added
Input schema / properties / node / anyOfAdded value: +[ + { + "const": "", + "type": "string" + }, + { + "description": "A code whose children to list (ICD-10-CM/HCPCS). ICD-10-PCS supports only top-level Section browsing — a partial PCS code does not expand to next-position axis values.", + "minLength": 1, + "type": "string" + } +] - changed
Input schema / properties / node / descriptionPrevious value: -"A node to expand. For ICD-10-CM/HCPCS, a code whose children to list. ICD-10-PCS supports only top-level Section browsing (omit `node`) — a partial PCS code does not expand to next-position axis values. Omit for the top level."New value: +"A node to expand — or omit / pass an empty string for the top level. For ICD-10-CM/HCPCS, a code whose children to list; ICD-10-PCS supports only top-level Section browsing. Must not be blank or whitespace-only when provided." - removed
Input schema / properties / node / typeRemoved value: -"string"
- Changed
medcode_check_code1 field changed- changed
Input schema / properties / code / descriptionPrevious value: -"The code to validate, with or without dots."New value: +"The code to validate, with or without dots. Must not be blank or whitespace-only."
- Changed
medcode_get_code1 field changed- changed
Input schema / properties / codes / items / descriptionPrevious value: -"A single code to decode (with or without dots), an RXCUI, or an NDC."New value: +"A single code to decode (with or without dots), an RXCUI, or an NDC. Must not be blank or whitespace-only."
- Changed
medcode_map_codes1 field changed- changed
Input schema / properties / from / descriptionPrevious value: -"The source value: a code (for parents/children), a drug name, an NDC, or an RXCUI."New value: +"The source value: a code (for parents/children), a drug name, an NDC, or an RXCUI. Must not be blank or whitespace-only."
- Changed
medcode_search_codes1 field changed- changed
Input schema / properties / query / descriptionPrevious value: -"Clinical description to match, e.g. \"type 2 diabetes with neuropathy\"."New value: +"Clinical description to match, e.g. \"type 2 diabetes with neuropathy\". Must not be blank or whitespace-only."
4 tool updates
- Changed
medcode_browse_hierarchy6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque continuation token from a previous response's `nextCursor`, to fetch the next page of children/entries. Omit for the top of the list.", + "type": "string" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Max entries to return. Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200."New value: +"Max entries per page. Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200." - changed
Output schema / properties / cap / descriptionPrevious value: -"The limit that was applied."New value: +"The page size that was applied." - added
Output schema / properties / nextCursorAdded value: +{ + "description": "Opaque token to pass back as `cursor` for the next page. Present only when more entries exist beyond this page.", + "type": "string" +} - changed
Output schema / properties / shown / descriptionPrevious value: -"Number of entries returned (codes or axes)."New value: +"Number of entries returned on this page (codes or axes)." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when the returned list was capped at the limit."New value: +"True when more entries exist beyond this page."
- Changed
medcode_get_code1 field changed- added
Output schema / properties / found / items / properties / childrenTruncatedAdded value: +{ + "description": "True when the code has more immediate children than `children` carries — the list was capped at the server cap (present only when includeHierarchy is true). Retrieve the full child list with medcode_browse_hierarchy or medcode_map_codes (children) for this code.", + "type": "boolean" +}
- Changed
medcode_map_codes6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque continuation token from a previous response's `nextCursor`, for the paginated directions (children, name_to_rxcui). Omit for the first page.", + "type": "string" +} - added
Input schema / properties / limitAdded value: +{ + "description": "Max results per page for the paginated directions (children, name_to_rxcui). Defaults to MEDCODE_MAX_RESULTS (50), ceiling 200. Ignored by the point directions.", + "maximum": 200, + "minimum": 1, + "type": "integer" +} - added
Output schema / properties / capAdded value: +{ + "description": "Paginated directions only: the page size that was applied.", + "type": "number" +} - added
Output schema / properties / nextCursorAdded value: +{ + "description": "Paginated directions only: opaque token to pass back as `cursor` for the next page. Present only when more results exist beyond this page.", + "type": "string" +} - added
Output schema / properties / shownAdded value: +{ + "description": "Paginated directions only: number of hits returned on this page.", + "type": "number" +} - added
Output schema / properties / truncatedAdded value: +{ + "description": "Paginated directions (children, name_to_rxcui) only: true when more results exist beyond this page.", + "type": "boolean" +}
- Changed
medcode_search_codes6 fields changed- added
Input schema / properties / cursorAdded value: +{ + "description": "Opaque continuation token from a previous response's `nextCursor`, to fetch the next page of the same ranked result set. Omit for the first page.", + "type": "string" +} - changed
Input schema / properties / limit / descriptionPrevious value: -"Max codes to return. Defaults to the server's MEDCODE_MAX_RESULTS (50), ceiling 200."New value: +"Max codes per page. Defaults to the server's MEDCODE_MAX_RESULTS (50), ceiling 200." - changed
Output schema / properties / cap / descriptionPrevious value: -"The limit that was applied."New value: +"The page size that was applied." - added
Output schema / properties / nextCursorAdded value: +{ + "description": "Opaque token to pass back as `cursor` for the next page. Present only when more matches exist beyond this page.", + "type": "string" +} - changed
Output schema / properties / shown / descriptionPrevious value: -"Number of codes returned."New value: +"Number of codes returned on this page." - changed
Output schema / properties / truncated / descriptionPrevious value: -"True when results were capped at the limit."New value: +"True when more matches exist beyond this page."
2 tool updates
- Changed
medcode_get_code4 fields changed- changed
Input schema / properties / codes / descriptionPrevious value: -"Codes to decode (1–50). Mixed systems are fine — each is detected independently."New value: +"Codes to decode (1–50). Mixed systems are fine — each is detected independently. An NDC (hyphenated or 10/11-digit) decodes to its RxNorm product." - changed
Input schema / properties / codes / items / descriptionPrevious value: -"A single code to decode, with or without dots."New value: +"A single code to decode (with or without dots), an RXCUI, or an NDC." - changed
Output schema / properties / found / items / descriptionPrevious value: -"A decoded code, optionally with its parent and immediate children."New value: +"A decoded code, optionally with its parent/children and resolution source." - added
Output schema / properties / found / items / properties / sourceAdded value: +{ + "description": "Resolution provenance when the input was not a direct code: \"NDC\" when an NDC was decoded to its RxNorm product via the NDC↔RxNorm map. Omitted for direct code lookups.", + "type": "string" +}
- Changed
medcode_map_codes1 field changed- changed
Input schema / properties / direction / descriptionPrevious value: -"What to map to. parents/children return the immediate parent or children only (depth-1) — call iteratively to walk a full path; the rxcui/ndc/name directions are RxNorm drug crosswalks (phase 2)."New value: +"What to map to. parents/children return the immediate parent or children only (depth-1) — call iteratively to walk a full path; the rxcui/ndc/name directions are RxNorm drug crosswalks."
2 tool updates
- Changed
medcode_browse_hierarchy2 fields changed- changed
Input schema / properties / node / descriptionPrevious value: -"A node to expand. For ICD-10-CM/HCPCS, a code whose children to list. For ICD-10-PCS, a partial code whose next-position axis values to list. Omit for the top level."New value: +"A node to expand. For ICD-10-CM/HCPCS, a code whose children to list. ICD-10-PCS supports only top-level Section browsing (omit `node`) — a partial PCS code does not expand to next-position axis values. Omit for the top level." - changed
Output schema / properties / axes / descriptionPrevious value: -"Valid next-position axis values for a partial PCS code. Empty when kind is \"codes\"."New value: +"The top-level ICD-10-PCS Section axis values (only the Section axis is enumerable). Empty when kind is \"codes\"."
- Changed
medcode_map_codes2 fields changed- changed
Input schema / properties / direction / descriptionPrevious value: -"What to map to. parents/children walk the code hierarchy; the rxcui/ndc/name directions are RxNorm drug crosswalks (phase 2)."New value: +"What to map to. parents/children return the immediate parent or children only (depth-1) — call iteratively to walk a full path; the rxcui/ndc/name directions are RxNorm drug crosswalks (phase 2)." - added
Output schema / properties / noticeAdded value: +{ + "description": "Guidance when a resolvable code has no edge in the requested direction (e.g. a top-level code has no parent; a leaf has no children; ICD-10-PCS codes have no prefix parent).", + "type": "string" +}
6 tool updates
- First observed
medcode_browse_hierarchy - First observed
medcode_check_code - First observed
medcode_get_code - First observed
medcode_list_systems - First observed
medcode_map_codes - First observed
medcode_search_codes
Related MCP Connectors
Diagnoses, drugs & lab codes: ICD-11, SNOMED, LOINC, RxNorm, MeSH, ATC, CID-10. 33 tools, MIT.
WHO ICD-10/ICD-11 diagnosis codes. Lookup, search, chapters via official WHO API.
WHO ICF codes: lookup, search, hierarchy, qualifiers, and 11 scored clinical assessment instruments.
Offline, keyless lookup of the US civil aircraft registry — decode N-numbers, search records.
Related MCP Servers
- AlicenseAqualityDmaintenanceOffline MCP server for ICD medical code lookup, search, and crosswalk translation with 124K codes and 102K mappings, all local with zero network calls.53MIT
- AlicenseNot gradedqualityBmaintenanceSearch medical codes including ICD-10, LOINC, and clinical terms for conditions, procedures, and drugs via natural language queries.0MIT
- AlicenseAqualityDmaintenanceMCP server for automated ICD-10 medical coding. Code clinical text to ICD-10-CM diagnoses, search 74,000+ codes, and de-identify PHI via the AutoICD API.610 npmMIT

OMOPHub MCP Serverofficial
AlicenseAqualityAmaintenanceProvides AI agents with instant access to 10M+ OMOP medical vocabulary concepts for searching, mapping, and navigating clinical codes across SNOMED, ICD-10, RxNorm, LOINC, and more.11102 npm6MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.