Skip to main content
Glama
OMOPHub

OMOPHub MCP Server

Official
by OMOPHub

Why OMOPHub MCP?

Working with medical vocabularies today means downloading multi-gigabyte CSV files, loading them into a local database, and writing SQL to find what you need. Every time.

OMOPHub MCP Server gives your AI assistant instant access to the entire OHDSI ATHENA vocabulary. No database setup, no CSV wrangling, no context switching. Just ask.

You: "Map ICD-10 code E11.9 to SNOMED"

Claude: Found it - E11.9 (Type 2 diabetes mellitus without complications)
        maps to SNOMED concept 201826 (Type 2 diabetes mellitus)
        via standard 'Maps to' relationship.

Use cases:

  • Concept lookup - Find OMOP concept IDs for clinical terms in seconds

  • Cross-vocabulary mapping - Map between ICD-10, SNOMED, RxNorm, LOINC, and 120+ vocabularies

  • Hierarchy navigation - Explore ancestors and descendants for phenotype definitions

  • Concept set building - Let your AI agent assemble complete concept sets for cohort definitions

  • Code validation - Verify medical codes and check their standard mappings


Related MCP server: snowstorm-mcp-server

Quick Start

1. Get an API Key

Sign up at omophub.com → create an API key in your dashboard.

2. Add to Your AI Client

Open Claude Desktop settings > "Developer" tab > "Edit Config". Add to claude_desktop_config.json:

{
  "mcpServers": {
    "omophub": {
      "command": "npx",
      "args": ["-y", "@omophub/omophub-mcp"],
      "env": {
        "OMOPHUB_API_KEY": "oh_your_key_here"
      }
    }
  }
}
claude mcp add omophub -- npx -y @omophub/omophub-mcp
# Then set OMOPHUB_API_KEY in your environment

Open the command palette and choose "Cursor Settings" > "MCP" > "Add new global MCP server". Add to .cursor/mcp.json:

{
  "mcpServers": {
    "omophub": {
      "command": "npx",
      "args": ["-y", "@omophub/omophub-mcp"],
      "env": {
        "OMOPHUB_API_KEY": "oh_your_key_here"
      }
    }
  }
}

Add to .vscode/mcp.json:

{
  "servers": {
    "omophub": {
      "command": "npx",
      "args": ["-y", "@omophub/omophub-mcp"],
      "env": {
        "OMOPHUB_API_KEY": "oh_your_key_here"
      }
    }
  }
}

Run the MCP server as an HTTP service that clients connect to via URL:

# Start HTTP server on port 3100
npx -y @omophub/omophub-mcp --transport=http --port=3100 --api-key=oh_your_key_here

# MCP endpoint: http://localhost:3100/mcp
# Health check:  http://localhost:3100/health

Connect MCP clients to / or /mcp. Useful for centralized deployments where multiple AI agents share one server instance.

Connect directly to the OMOPHub-hosted MCP server - no installation required. Each client authenticates with their own API key via the Authorization header:

Claude Code:

claude mcp add omophub --transport http \
  -H "Authorization: Bearer oh_your_key_here" \
  https://mcp.omophub.com

VS Code (.vscode/mcp.json):

{
  "servers": {
    "omophub": {
      "type": "http",
      "url": "https://mcp.omophub.com",
      "headers": { "Authorization": "Bearer oh_your_key_here" }
    }
  }
}

Cursor / Windsurf:

{
  "mcpServers": {
    "omophub": {
      "url": "https://mcp.omophub.com",
      "headers": { "Authorization": "Bearer oh_your_key_here" }
    }
  }
}

Note: Claude Desktop's Custom Connectors UI only supports OAuth and cannot send custom headers. Use the npx setup instead.

# HTTP mode (default in Docker) - serves MCP on port 3100
docker run -e OMOPHUB_API_KEY=oh_your_key_here -p 3100:3100 omophub/omophub-mcp

# Stdio mode (for piping)
docker run -i -e OMOPHUB_API_KEY=oh_your_key_here omophub/omophub-mcp --transport=stdio

3. Start Asking

"What's the OMOP concept ID for type 2 diabetes?"

"Map ICD-10 code E11.9 to SNOMED"

"Show me all descendants of Diabetes mellitus in SNOMED"


Available Tools

Tool

What it does

search_concepts

Search for medical concepts by name or clinical term across all vocabularies

get_concept

Get detailed info about a specific OMOP concept by concept_id

get_concept_by_code

Look up a concept using a vocabulary-specific code (e.g., ICD-10 E11.9)

map_concept

Map a concept to equivalent concepts in other vocabularies (paginated — see note below)

get_hierarchy

Navigate concept hierarchy - ancestors, descendants, or both

list_vocabularies

List available medical vocabularies with statistics

semantic_search

Search using natural language with neural embeddings (understands clinical meaning)

find_similar_concepts

Find concepts similar to a reference concept, name, or description

explore_concept

Get concept details, hierarchy, and cross-vocabulary mappings in one call

fhir_resolve

Resolve a FHIR coded value (incl. administrative codes via the HL7 FHIR-to-OMOP IG ConceptMaps) to its OMOP standard concept and CDM target table

fhir_resolve_codeable_concept

Resolve a FHIR CodeableConcept — best match by OHDSI vocabulary preference, honoring userSelected

Resources

URI

Description

omophub://vocabularies

Full vocabulary catalog with statistics

omophub://vocabularies/{vocabulary_id}

Details for a specific vocabulary

Prompts

Prompt

Description

phenotype-concept-set

Guided workflow to build a concept set for a clinical phenotype

code-lookup

Look up and validate a medical code with mappings and hierarchy


Example Prompts

Find a concept → search_concepts

"Search for metformin in RxNorm"

Cross-vocabulary mapping → map_concept

"I have SNOMED concept 201826 - what's the ICD-10 code?"

Build a concept set → search_conceptsget_hierarchymap_concept

"Help me build a concept set for Type 2 diabetes including all descendants"

Completeness matters here. map_concept returns one page at a time (page_size 1-200, default 100). A widely-used drug ingredient can have well over a thousand NDC mappings, so a single call is a sample, not the answer. Check has_more in the response and keep incrementing page until it is false — otherwise the concept set looks complete while silently missing codes.

Use find_similar_concepts for exploration, not for this: it is ranked embedding similarity, so it has no notion of set membership and cannot be exhaustive no matter how large page_size is.

Validate a code → get_concept_by_codemap_concept

"Is ICD-10 code E11.9 valid? What does it map to in SNOMED?"

Semantic search → semantic_search

"Find concepts related to 'heart attack'"

Explore a concept → explore_concept

"Give me everything about SNOMED concept 201826"

FHIR-to-OMOP resolution → fhir_resolve

"Resolve FHIR SNOMED code 44054006 to OMOP — what table does it go in?"

CodeableConcept → fhir_resolve_codeable_concept

"This CodeableConcept has both SNOMED 44054006 and ICD-10 E11.9 — which should I use for OMOP?"

Find similar → find_similar_concepts

"What concepts are similar to 'Type 2 diabetes mellitus'?"


Configuration

Environment Variables

Variable

Required

Description

OMOPHUB_API_KEY

Your OMOPHub API key

OMOPHUB_BASE_URL

Custom API base URL (default: https://api.omophub.com/v1)

OMOPHUB_LOG_LEVEL

debug · info · warn · error (default: info)

OMOPHUB_ANALYTICS_OPTOUT

Set to true to disable analytics headers

OMOPHUB_USER_AGENT_SUFFIX

Optional deployment identifier appended to omophub-mcp/<version> (default: none)

MCP_TRANSPORT

stdio (default) or http

MCP_PORT

HTTP server port (default: 3100, only used with http transport)

HEALTH_PORT

Port for standalone health endpoint in stdio mode (default: disabled)

CLI Arguments

# Stdio mode (default)
npx @omophub/omophub-mcp --api-key=oh_your_key --base-url=https://custom.api.com/v1

# HTTP mode
npx @omophub/omophub-mcp --transport=http --port=3100 --api-key=oh_your_key

# Stdio mode with standalone health endpoint
npx @omophub/omophub-mcp --api-key=oh_your_key --health-port=8080

Health Endpoint (Docker / Kubernetes)

In HTTP mode, the health endpoint is available at /health on the same port as the MCP endpoint:

npx @omophub/omophub-mcp --transport=http --port=3100 --api-key=oh_your_key
curl http://localhost:3100/health
# → {"status":"ok","version":"1.5.0","uptime_seconds":42}

In stdio mode, use --health-port for a standalone health endpoint:

HEALTH_PORT=8080 OMOPHUB_API_KEY=oh_your_key npx @omophub/omophub-mcp
curl http://localhost:8080/health

The Docker image defaults to HTTP mode on port 3100 with health checks built in.


Development

git clone https://github.com/OMOPHub/omophub-mcp.git
cd omophub-mcp
npm install
npm run build
npm test

Run locally:

OMOPHUB_API_KEY=oh_your_key npx tsx src/index.ts

Troubleshooting

Error

Solution

API key required

Set OMOPHUB_API_KEY in your environment or MCP config

Authentication failed

API key may be invalid or expired - generate a new one

Rate limit exceeded

Automatic retries are built in. For higher limits, upgrade your plan

Tools not appearing

Restart your AI client, verify npx @omophub/omophub-mcp runs without errors, check config path



License

MIT - see LICENSE

Available Tools

11 tools
explore_conceptA

Get a comprehensive view of a medical concept in one call: detailed info, ancestors/descendants hierarchy, and cross-vocabulary mappings. Use this instead of calling get_concept + get_hierarchy + map_concept separately. Ideal for understanding what a concept is, where it sits in the classification tree, and how it maps to other coding systems.

ParametersJSON Schema
NameRequiredDescriptionDefault
concept_idYesThe OMOP concept_id to explore
hierarchy_levelsNoHow many hierarchy levels to fetch (1-5, default 2)
include_mappingsNoInclude cross-vocabulary mappings. Default true.
include_hierarchyNoInclude ancestors and descendants. Default true.
mappings_page_sizeNoMaximum mappings to fetch (1-200, default 100). This is an overview tool — for a complete code list use map_concept and page through it.
target_vocabulariesNoComma-separated vocabulary IDs to filter mappings. Examples: 'ICD10CM', 'SNOMED'.

TDQS

A4.2/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries the full burden. It discloses the aggregated nature (combines three operations), and labels itself as an overview tool, but doesn't explicitly state read-only behavior, error handling, or potential for large responses. The verb 'Get' implies safety, but not explicitly.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, first is a clear statement of function and components; second gives usage guidance. No redundant words or irrelevant details.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is complex with 6 parameters and no output schema. The description explains the combined nature and the overview scope, and the schema covers all parameters. However, it lacks a detailed explanation of the response structure or any explicit limitations on result size beyond parameter descriptions, so not fully complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, with thorough parameter descriptions including defaults and ranges. The main description adds no parameter-specific semantics, but the schema fully compensates, so baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses specific verb 'Get', resource 'medical concept', and clearly enumerates the three components (detailed info, ancestors/descendants, mappings). It explicitly distinguishes from siblings by recommending replacing get_concept + get_hierarchy + map_concept, making purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly states 'Use this instead of calling get_concept + get_hierarchy + map_concept separately' and provides ideal use cases ('Ideal for understanding...'), giving clear when-to-use guidance. It also indirectly says this is an overview tool, with additional exclusion note in the mappings_page_size parameter description recommending map_concept for complete code lists.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fhir_resolveA

Resolve a FHIR coded value (system URI + code) to its OMOP standard concept and CDM target table. Supports text-only input via semantic search fallback and optional Phoebe recommendations. Examples: system='http://snomed.info/sct' code='44054006' for Type 2 diabetes, or display='heart attack' for text-only resolution.

ParametersJSON Schema
NameRequiredDescriptionDefault
codeNoCode value from the FHIR Coding
systemNoFHIR code system URI (e.g. http://snomed.info/sct, http://loinc.org)
displayNoDisplay text for semantic search fallback when code is unavailable
on_unmappedNoBehavior when nothing resolves: 'error' (default, 404) or 'sentinel' (return a concept_id 0 record)
resource_typeNoFHIR resource type (Condition, Observation, MedicationRequest, Procedure, etc.)
vocabulary_idNoDirect OMOP vocabulary_id (e.g. SNOMED, ICD10CM), bypasses URI resolution
include_qualityNoInclude mapping quality signal (high/medium/low/manual_review)
include_recommendationsNoInclude Phoebe-recommended related concepts

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses fallback behavior (semantic search), optional recommendations, and unmapped handling, but does not explain output format (e.g., single vs. multiple results), ordering, or error behavior beyond the on_unmapped parameter. Adequate but not thorough.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is relatively concise with three sentences and an example. The main purpose is front-loaded, and the example aids clarity. Minor verbosity could be trimmed, but overall it is well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers input parameters and general behavior but lacks details on the output structure (e.g., what fields are returned for the resolved concept and target table). With no output schema, this gap is notable. Also, given the sibling list, more contextual differentiation would improve completeness.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already documents parameters. The description adds value by explaining the 'display' parameter's role in semantic search fallback and the 'include_recommendations' parameter's relation to Phoebe recommendations. This extra context enhances understanding beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states it resolves FHIR coded values to OMOP standard concepts and CDM target tables, with examples for system/code and text-only input. However, it does not explicitly distinguish itself from the sibling 'fhir_resolve_codeable_concept', which may have similar functionality.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides examples of when to use the tool (e.g., system/code or text-only display) but lacks explicit guidance on when to choose this tool over siblings like 'map_concept' or 'fhir_resolve_codeable_concept'. Usage context is implied but not clearly stated.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

fhir_resolve_codeable_conceptA

Resolve a FHIR CodeableConcept with multiple codings. Picks the best match per OHDSI vocabulary preference (SNOMED > RxNorm > LOINC > CVX > ICD-10). Falls back to the text field via semantic search if no coding resolves.

ParametersJSON Schema
NameRequiredDescriptionDefault
textNoCodeableConcept.text — semantic fallback if no coding resolves
codingYesArray of FHIR Coding entries from the CodeableConcept
on_unmappedNoBehavior when nothing resolves: 'error' (default, 404) or 'sentinel' (concept_id 0 record)
resource_typeNoFHIR resource type
include_qualityNo
include_recommendationsNo

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so the description carries full burden. It discloses vocabulary preference hierarchy, semantic search fallback, unmapped behavior options (error or sentinel), and boolean flags for recommendations and quality. However, it does not mention return format or potential side effects like HTTP status codes or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler, front-loaded with the core purpose. Every sentence adds distinct value: first sentence states main action and preference, second sentence covers fallback and behavior. Efficient and well-structured.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Tool has 6 parameters and no output schema. Description covers core logic but omits what the tool returns (e.g., concept ID, error details). Without an output schema, the agent lacks clarity on result structure. Also does not explain the resource_type parameter's role. Could be more complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67%, but description adds substantial meaning: explains vocabulary preference order, the role of user_selected to override preference, fallback logic using text, and the purpose of on_unmapped, include_recommendations, and include_quality. This goes well beyond the schema's field descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description explicitly states it resolves a FHIR CodeableConcept with multiple codings, specifies vocabulary preference order (SNOMED > RxNorm > LOINC > CVX > ICD-10), and mentions fallback to text via semantic search. This is a specific verb-resource combination that distinguishes it from siblings like fhir_resolve or map_concept.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description implies usage when handling CodeableConcepts with multiple codings and notes the fallback behavior, but does not proactively state when to use this tool versus alternatives (e.g., simpler fhir_resolve, or search_concepts). No explicit when-not-to-use or alternative suggestions.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_similar_conceptsA

Find medical concepts similar to a reference concept, name, or natural language query. Supports three algorithms: 'semantic' (neural embeddings — best for meaning), 'lexical' (text matching — best for typos), 'hybrid' (combined — default). Provide exactly ONE of: concept_id, concept_name, or query. Use this to explore related concepts, find alternative codes, or build phenotype concept sets. Tip: For drug vocabularies like RxNorm, use drug class names ('ACE inhibitors', 'beta blockers', 'antihypertensives') rather than symptom descriptions ('medications for high blood pressure') — the embedding model aligns better with clinical terminology than lay language.

ParametersJSON Schema
NameRequiredDescriptionDefault
queryNoFind concepts matching this natural language description
algorithmNoSimilarity algorithm: 'semantic' (meaning), 'lexical' (text), 'hybrid' (both). Default 'hybrid'.hybrid
page_sizeNoNumber of results (1-1000, default 20)
concept_idNoFind concepts similar to this OMOP concept ID
domain_idsNoComma-separated domain IDs to filter results. Examples: 'Condition', 'Drug'.
concept_nameNoFind concepts similar to this concept name
vocabulary_idsNoComma-separated vocabulary IDs to filter results. Examples: 'SNOMED', 'ICD10CM'.
similarity_thresholdNoMinimum similarity score (0.0-1.0). Default 0.7.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description bears the full burden of behavioral disclosure. It explains the three algorithms with trade-offs ('semantic' best for meaning, 'lexical' best for typos, 'hybrid' default), enforces the exactly-one-input constraint, and offers a practical tip about drug vocabulary usage. It does not describe output format or edge cases, but for a read-only similarity search this is a solid level of transparency.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is compact and front-loaded: it opens with the core function, uses semicolons and em-dashes to pack algorithm details, and remains under three sentences. The final tip is extra but earns its place by providing practical guidance. No wasted words.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given 8 parameters and no output schema, the description covers the main decision points: algorithm selection, the three input modes, and intended use cases. Filters like domain_ids and vocabulary_ids are left to the schema, which adequately documents them. It could mention default thresholds or result ranking, but overall it is sufficiently complete for a search tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so baseline is 3. The description adds meaningful value beyond the schema by explaining algorithm behavior, clarifying that query is natural language, and emphasizing the exactly-one-of constraint. The drug vocabulary tip also enriches parameter semantics, helping agents choose appropriate inputs for RxNorm concepts.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: 'Find medical concepts similar to a reference concept, name, or natural language query.' It specifies the verb (Find), resource (medical concepts), and input types (concept_id, concept_name, query). It also distinguishes from siblings by emphasizing similarity search and naming three algorithms, plus concrete use cases like exploring related concepts and building phenotype sets.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides clear usage context: 'Use this to explore related concepts, find alternative codes, or build phenotype concept sets.' However, it does not explicitly mention when not to use this tool or name alternatives like get_concept or search_concepts, even though sibling tools exist. The guidance is adequate but lacks direct exclusion or comparison.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_conceptA

Get detailed information about a specific OMOP concept by its numeric concept_id. Returns the concept name, vocabulary, domain, concept class, standard status, valid dates, and synonyms. Use this when you already have a concept_id and need its details.

ParametersJSON Schema
NameRequiredDescriptionDefault
concept_idYesThe OMOP concept_id (numeric identifier)

TDQS

A4/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description carries full burden. It lists the returned fields but does not disclose error handling (e.g., behavior for invalid concept_id), rate limits, or any side effects. For a simple retrieval tool, it is adequate but has gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two concise sentences: first defines the action and returns, second states use case. No wasted words or redundancy.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the tool's simplicity (1 required param, no output schema), the description covers the purpose and return fields reasonably. Minor gaps: no mention of error handling or full return structure (e.g., whether concept_id is included in response).

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with a description of concept_id as 'The OMOP concept_id (numeric identifier)'. The description reinforces it is numeric but adds no additional semantic detail beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool retrieves detailed information about a specific OMOP concept by its numeric concept_id, listing specific returned fields. It distinguishes itself from sibling tools like search_concepts or explore_concept by specifying that it requires an exact concept_id.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this when you already have a concept_id and need its details,' providing clear usage context. However, it does not mention when not to use it or suggest alternative tools for searching or exploring concepts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_concept_by_codeA

Look up an OMOP concept using a vocabulary-specific code and vocabulary ID. Both parameters are required to avoid ambiguity - the same code can exist in multiple vocabularies (e.g., 'E11' exists in both ICD10CM and ICD10). If multiple concepts share the same code within a vocabulary, all matches are returned - prefer the one with standard_concept='S'.

ParametersJSON Schema
NameRequiredDescriptionDefault
concept_codeYesThe vocabulary-specific code. Examples: 'E11.9' (ICD-10), '44054006' (SNOMED), '4850' (LOINC)
vocabulary_idYesThe vocabulary system. Examples: 'ICD10CM', 'SNOMED', 'RxNorm', 'LOINC', 'HCPCS', 'NDC'

TDQS

A4.2/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations provided, so description bears full burden. It discloses that same code can exist across vocabularies and that multiple matches may be returned. For a simple lookup, this is adequate, though it does not mention exact match behavior or response structure.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no fluff. Front-loaded with tool purpose, then important details. Every sentence earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no output schema, description mentions the preferred result (standard_concept='S') but lacks details on return format or edge cases. Still, for a lookup tool, it is reasonably complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with detailed descriptions for both parameters. The description reinforces the necessity of both parameters and clarifies ambiguity, adding marginal value beyond the schema. Baseline 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Look up an OMOP concept using a vocabulary-specific code and vocabulary ID.' It specifies verb (look up), resource (OMOP concept), and required parameters, distinguishing it from siblings like search_concepts or get_concept.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Description explains that both parameters are required to avoid ambiguity and provides concrete example (E11 in ICD10CM and ICD10). It advises preferring standard_concept='S' when multiple matches exist. While it doesn't explicitly state when not to use this tool, it provides clear context for its use.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_hierarchyA

Navigate the vocabulary hierarchy for a concept. Use direction='up' for ancestors (broader terms like 'Diabetes mellitus' → 'Metabolic disease'), direction='down' for descendants (narrower terms, essential for building concept sets in phenotype definitions), or direction='both' for full hierarchical context. Results are capped at max_results nodes (default 200). If truncated, the response will indicate total available count so you can narrow with vocabulary_ids or reduce max_levels.

ParametersJSON Schema
NameRequiredDescriptionDefault
directionNoHierarchy direction: 'up' for ancestors, 'down' for descendants, 'both' for full context (default: 'both')both
concept_idYesThe OMOP concept_id
max_levelsNoMaximum levels to traverse (default 5 for 'up', 10 for 'down', 5/3 for 'both')
max_resultsNoMaximum number of nodes to return (1-200, default 200). Use a smaller value for broad concepts.
vocabulary_idsNoComma-separated vocabulary IDs to filter results. Leave empty for all.

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It discloses result capping ('capped at max_results nodes default 200'), truncation behavior ('If truncated, the response will indicate total available count'), and provides remediation guidance ('narrow with vocabulary_ids or reduce max_levels'). This adds behavioral context beyond the schema.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three sentences, front-loaded with the core purpose, each sentence adds meaningful guidance. No filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers direction semantics, result limits, truncation handling, and narrowing strategies. While it lacks explicit return-structure details, the absence of an output schema is partially mitigated by the phrase 'Results are capped at max_results nodes', implying a list of nodes. Overall sufficient for a 5-param hierarchy tool.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3. The description enriches parameters by providing real-world examples for direction, explaining the purpose of 'down' for concept sets, and explaining the interplay between max_results, vocabulary_ids, and max_levels for dealing with truncation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description uses a specific verb ('navigate') and resource ('vocabulary hierarchy for a concept') with concrete examples (e.g., 'Diabetes mellitus' → 'Metabolic disease'). This clearly distinguishes it from sibling tools like search_concepts or get_concept.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It explicitly instructs when to use each direction value ('direction=''up'' for ancestors... down for descendants... both for full context') and highlights a key use case ('essential for building concept sets in phenotype definitions'). It does not explicitly name alternative tools, but the context is clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

list_vocabulariesA

List all available medical vocabularies in the OMOP standardized vocabulary system with concept counts and metadata. Use this to understand what terminology systems are available (SNOMED CT, ICD-10-CM, RxNorm, LOINC, etc.) and their scope.

ParametersJSON Schema
NameRequiredDescriptionDefault
searchNoOptional search term to filter vocabularies by name

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are provided, so the description must disclose behavioral traits. It correctly indicates this is a read-only listing operation with no destructive side effects. It mentions the output includes concept counts and metadata, giving a clear picture of what to expect. Could add more detail about pagination or sorting, but for a simple list tool this is adequate.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is two sentences long with no wasted words. The first sentence states the action and output, the second gives usage guidance. Each sentence serves a clear purpose.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a simple list tool with one optional parameter and no output schema, the description is complete. It conveys the scope (medical vocabularies), output details (concept counts and metadata), and usage context. No further information is needed for an agent to use this tool correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

There is one optional parameter 'search' with a max length of 200, and schema coverage is 100%. The description does not provide additional semantic detail beyond the schema, such as supported search patterns or case sensitivity. The baseline of 3 is appropriate since the schema already documents the parameter sufficiently.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool lists all available medical vocabularies with concept counts and metadata. It gives specific examples (SNOMED CT, ICD-10-CM) and the verb 'list' with resource 'vocabularies' is unambiguous. Sibling tools like 'search_concepts' or 'get_hierarchy' are distinctly different, so this stands out.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly tells when to use the tool: 'Use this to understand what terminology systems are available and their scope.' It implies a discovery purpose. While it doesn't explicitly state when not to use or list alternatives, the context from sibling tools makes it clear this is for browsing vocabularies, not concepts.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

map_conceptA

Find mappings FROM a source concept TO equivalent concepts in other vocabularies. The concept_id you provide is always the SOURCE — results show what it maps TO. Returns cross-vocabulary mappings with relationship types and mapping quality. If no mappings exist, the response explicitly states 'No mappings found' with mapped=false in JSON — never returns ambiguous empty results. Example: provide a SNOMED concept_id and filter by target_vocabularies='ICD10CM' to get the ICD-10 equivalent. PAGINATED: results are one page of a possibly larger set — total_mappings is the full count and has_more says whether further pages exist. When building a complete code list, keep incrementing page until has_more is false; a single call is not the whole answer.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (1-based, default 1)
page_sizeNoMappings per page (1-200, default 100). A concept can have thousands — check has_more in the response and increment page until it is false, otherwise your code list will be incomplete.
concept_idYesThe source OMOP concept_id to map FROM
target_vocabulariesNoComma-separated vocabulary IDs to map TO. Examples: 'ICD10CM', 'SNOMED', 'RxNorm'. Omit to see all available mappings.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Discloses response structure: 'Returns cross-vocabulary mappings with relationship types and mapping quality.' Also reveals edge case behavior: 'If no mappings exist, the response explicitly states "No mappings found" with mapped=false — never returns ambiguous empty results.' Pagination behavior is disclosed in detail. No annotations provided, so description carries full burden and does it well.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is somewhat lengthy but front-loaded with the core purpose in the first sentence. Subsequent sentences add valuable behavioral and usage details. It repeats pagination guidance already in the schema, but the whole description remains readable.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given no annotations and no output schema, the description covers essential context: what the tool does, how to use it, empty-result behavior, and pagination. It gives enough for an agent to call and interpret results correctly. It also provides a practical example.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema covers all parameters (100% coverage), but the description adds a concrete example and clarifies the directionality of concept_id ('always the SOURCE — results show what it maps TO'). This reinforces the parameter semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

Description clearly states 'Find mappings FROM a source concept TO equivalent concepts in other vocabularies' — specific verb, resource, and direction. The example with SNOMED to ICD10CM further clarifies. It distinguishes from siblings like 'find_similar_concepts' (similarity vs exact mappings).

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Provides concrete example usage (SNOMED concept_id filtered by target_vocabularies='ICD10CM') and explicit pagination instructions ('keep incrementing page until has_more is false'). It does not explicitly name alternatives but clearly describes when this tool is appropriate for cross-vocabulary mapping lookup.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

search_conceptsA

Search for medical concepts across OHDSI standardized vocabularies by name, synonym, or clinical term. Returns matching concepts with IDs, names, vocabulary, domain, and standard status. Use this when you need to find the OMOP concept ID for a medical term. Examples: 'type 2 diabetes', 'metformin 500mg', 'systolic blood pressure', 'HbA1c'.

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoPage number (1-based, default 1)
queryYesThe medical term or concept name to search for
page_sizeNoNumber of results to return (1-200, default 10)
domain_idsNoComma-separated domain IDs to filter by. Examples: 'Condition', 'Drug', 'Measurement', 'Procedure'. Leave empty for all domains.
vocabulary_idsNoComma-separated vocabulary IDs to filter by. Examples: 'SNOMED', 'ICD10CM', 'RxNorm', 'LOINC'. Leave empty to search all vocabularies.
standard_conceptNoFilter by standard concept status: 'S' for Standard, 'C' for Classification. Omit to search all.

TDQS

A3.9/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries the full burden of behavioral disclosure. It states what the tool returns (IDs, names, vocabulary, domain, standard status) and the search scope, which is useful. However, it does not mention whether the operation is read-only (though implied by 'search'), how pagination works, or any limitations on search behavior. This is adequate for a search tool but leaves some gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is concise, with two sentences and a list of examples, and it front-loads the primary purpose. The structure is efficient and easy to scan. However, there is a typographical issue ('OHCPD' instead of likely 'OHDSI'), which slightly undermines clarity and precision.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The description covers the essential context for a search tool: what it searches, what it returns, and when to use it. It provides examples and relies on the well-documented schema for parameter details. Since there is no output schema, the description's mention of return fields is important. It could be improved by stating default sorting or pagination behavior, but for a straightforward search/filter tool, it is largely complete.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The input schema already provides 100% coverage for all 6 parameters, including descriptions for query, page, page_size, domain_ids, vocabulary_ids, and standard_concept. The tool description adds example queries but does not add new meaning to the parameters themselves. Since schema coverage is high, the baseline of 3 is appropriate.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the tool's function: searching for medical concepts across standardized vocabularies by name, synonym, or clinical term. It specifies the resource (OMOP concepts) and the action (search), and distinguishes from sibling tools like get_concept or get_concept_by_code by emphasizing term-based lookup and the return of concept IDs and metadata. The examples ('type 2 diabetes', 'metformin 500mg') further clarify the intended use.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly says 'Use this when you need to find the OMOP concept ID for a medical term,' which provides clear context for when to invoke this tool. It does not explicitly name alternatives or when not to use it, but the use case is stated. This is sufficient but lacks the exclusionary guidance seen in the calibration example.

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. Dates show when Glama detected each change.

  1. 6 tool updatesv1.6.0
    • Changedexplore_concept1 field changed
      • addedInput schema / properties / mappings_page_size
        Added value: +{
        +  "default": 100,
        +  "description": "Maximum mappings to fetch (1-200, default 100). This is an overview tool — for a complete code list use map_concept and page through it.",
        +  "maximum": 200,
        +  "minimum": 1,
        +  "type": "number"
        +}
    • Changedfind_similar_concepts2 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"Number of results (1-100, default 20)"New value: +"Number of results (1-1000, default 20)"
      • changedInput schema / properties / page_size / maximum
        Previous value: -100New value: +1000
    • Changedget_hierarchy3 fields changed
      • changedInput schema / properties / max_results / default
        Previous value: -500New value: +200
      • changedInput schema / properties / max_results / description
        Previous value: -"Maximum number of nodes to return (1-500, default 500). Use a smaller value for broad concepts."New value: +"Maximum number of nodes to return (1-200, default 200). Use a smaller value for broad concepts."
      • changedInput schema / properties / max_results / maximum
        Previous value: -500New value: +200
    • Changedmap_concept2 fields changed
      • addedInput schema / properties / page
        Added value: +{
        +  "default": 1,
        +  "description": "Page number (1-based, default 1)",
        +  "minimum": 1,
        +  "type": "number"
        +}
      • addedInput schema / properties / page_size
        Added value: +{
        +  "default": 100,
        +  "description": "Mappings per page (1-200, default 100). A concept can have thousands — check has_more in the response and increment page until it is false, otherwise your code list will be incomplete.",
        +  "maximum": 200,
        +  "minimum": 1,
        +  "type": "number"
        +}
    • Changedsearch_concepts2 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"Number of results to return (1-50, default 10)"New value: +"Number of results to return (1-200, default 10)"
      • changedInput schema / properties / page_size / maximum
        Previous value: -50New value: +200
    • Changedsemantic_search2 fields changed
      • changedInput schema / properties / page_size / description
        Previous value: -"Number of results to return (1-50, default 10)"New value: +"Number of results to return (1-100, default 10)"
      • changedInput schema / properties / page_size / maximum
        Previous value: -50New value: +100
  2. 11 tool updatesv1.5.0
    • First observedexplore_concept
    • First observedfhir_resolve
    • First observedfhir_resolve_codeable_concept
    • First observedfind_similar_concepts
    • First observedget_concept
    • First observedget_concept_by_code
    • First observedget_hierarchy
    • First observedlist_vocabularies
    • First observedmap_concept
    • First observedsearch_concepts
    • First observedsemantic_search

TDQS

A4.3/5.0
Disambiguation5/5

Each tool has a clearly distinct purpose: explore_concept combines multiple operations, FHIR tools handle coding, get/search tools address different lookups, and list_vocabularies is for metadata. No overlap.

Naming Consistency5/5

All tool names follow a consistent verb_noun pattern using snake_case (e.g., explore_concept, fhir_resolve, get_hierarchy), making the API predictable.

Tool Count5/5

With 11 tools covering concept lookup, search, FHIR resolution, hierarchy, mapping, and vocabulary listing, the count is well-scoped for a medical terminology server.

Completeness5/5

The tool surface covers all essential operations for exploring OMOP vocabularies: individual lookups, search, mapping, hierarchy, FHIR integration, and vocabulary metadata. No obvious gaps.

Maintenance

ActivityActive
ResponsivenessNo issues

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides keyless access to NIH clinical data including ICD-10/9, RxTerms, LOINC, NPI, and conditions search, allowing AI agents to query medical terminologies without authentication.
    MIT
  • A
    license
    Not graded
    quality
    B
    maintenance
    Enables AI assistants to look up, search, validate, navigate hierarchies, and expand value sets for SNOMED CT clinical terminology through the Model Context Protocol.
    8
    Apache 2.0
  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables AI agents to manage virtual clinic data including patients, visits, diagnoses, treatments, lab/radiology orders, and search medical literature and internal knowledge base.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables LLMs and AI agents to query a biomedical knowledge graph stored in RedisGraph, with tools for concept search, synonym enrichment, and study variable discovery through semantic relationships.
    -

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/OMOPHub/omophub-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server