SkillAgentSearch skills...

fhir-terminology-server-mcp-wrapper

An MCP server that exposes FHIR Terminology services as structured, AI and LLM-friendly tools, designed to seamlessly connect to existing terminology servers.

Install / Use

claude mcp add viniciusfinger -- npx -y github:viniciusfinger/fhir-terminology-server-mcp-wrapper

If the server publishes to npm under a different name, use that package instead — check the repo README.

About this skill
🔌

MCP Server

Model Context Protocol server

Quality Score

77/100

Supported Platforms

Claude Code
Claude Desktop

Our assessment of fhir-terminology-server-mcp-wrapper

fhir-terminology-server-mcp-wrapper scores 77/100 on our quality scale, 813th of 955 AI & Machine Learning skills we index.

Its MCP Server is 7.7 KB long, well organised into 21 sections with 6 code examples: a thorough specification that gives an agent plenty to work with.

It has 3 GitHub stars, so there is little community track record yet; judge it on its content.

Substance
29/30
Structure
20/20
Description
15/15
Adoption
3/20
Freshness
11/15

Maintenance, license and trust

  • The repository was last updated about 7 months ago. That is recent enough to be usable, but agent tooling moves fast, so check the instructions against your agent's current version.
  • No license is declared. By default that means all rights are reserved: you can read it, but reusing or redistributing it is not clearly permitted. Ask the author before building on it commercially.
  • Its trust signals score 74/100, with 3 cautions from licensing, adoption, age or documentation. These come from repository metadata, not a code audit — read the skill file before letting an agent act on it.

fhir-terminology-server-mcp-wrapper compared with similar skills

All 4 of these similar skills score higher than fhir-terminology-server-mcp-wrapper; compare them before choosing.

SkillScoreStarsUpdatedFormat
fhir-terminology-server-mcp-wrapper (this skill)by viniciusfinger7737mo agoMCP Server
claude-memby thedotmack100113.9ktodayCLAUDE.md
taste-skillby Leonxlnx100111.2k1d agoCLAUDE.md
Agent-Reachby Panniantong100109.6ktodayCLAUDE.md
Understand-Anythingby Egonex-AI10091.1ktodayCLAUDE.md

Frequently asked questions

How do I install fhir-terminology-server-mcp-wrapper?
Run claude mcp add viniciusfinger -- npx -y github:viniciusfinger/fhir-terminology-server-mcp-wrapper. The install tabs above show the steps for each supported agent.
Which AI agents does fhir-terminology-server-mcp-wrapper work with?
It is written for Claude Code and Claude Desktop, as a MCP Server file. Other agents that read the same format can often use it too.
Is fhir-terminology-server-mcp-wrapper safe to use?
It declares no license and scores 74/100 on trust signals. Skills are instructions an agent will follow, so read the file before installing it and do not approve commands you do not understand.
Is fhir-terminology-server-mcp-wrapper still maintained?
The repository was last updated about 7 months ago. That is recent enough to be usable, but agent tooling moves fast, so check the instructions against your agent's current version.

FHIR Terminology Server MCP Wrapper

<p align="center"> <img src="https://i.ibb.co/CsTXdVb7/logo.png" alt="Model Context Protocol (MCP) plus HL7 FHIR" width="480" /> </p>

Overview

This project is an MCP (Model Context Protocol) wrapper: it turns standard FHIR Terminology Services operations into tools that LLMs and AI assistants can call safely and predictably.

It is not a terminology server. It does not store code systems or ValueSets. It forwards requests to a real FHIR terminology backend (for example the public tx.fhir.org, or your own HAPI FHIR, Ontoserver, or vendor TS endpoint) and returns normalized results to the client.

Tools and resources are implemented with FastMCP: Python modules under mcp/tools/ and mcp/resources/ are loaded via FileSystemProvider from server.py (see Run).

Why use it?

  • Familiar interface for AI applications — Any MCP-compatible host (Claude Desktop, custom agents or other MCP servers) can resolve clinical codes without hard-coding HTTP clients or FHIR URLs in the prompt.
  • Reuse your existing stack — Point FHIR_TERMINOLOGY_SERVER_URL at the same server your EHR or integration layer already uses; no duplicate terminology store.
  • Structured, typed calls — Tools expose parameters such as system and code instead of asking the model to craft raw operation URLs.
  • Separation of concerns — Clinical vocabulary stays on the authoritative TS; this repo only bridges MCP ↔ FHIR.

What you can do with it

  • Resolve codes to human-readable labels — SNOMED CT, LOINC, ICD, and others (depending on the backend), via lookup_code (CodeSystem/$lookup).
  • Validate codes — Against a whole code system (validate_code, CodeSystem/$validate-code) or against a specific ValueSet (validate_code_in_valueset, ValueSet/$validate-code).
  • Expand ValueSets — List member concepts with expand_valueset (ValueSet/$expand).
  • Map between code systems — translate_code (ConceptMap/$translate).
  • Hierarchical checks — subsumes_codes (CodeSystem/$subsumes) for is-a relationships where the server supports them.
  • Swap backends — Use the public terminology service for demos, or a private endpoint for restricted or local code systems.

Connect your agents to the free hosted server

A free public instance runs on Render. Point any MCP client that supports Streamable HTTP at the endpoint below.

Note: on the free tier the service may spin down when idle. The first request after idle can take up to about 50 seconds while the instance wakes up; later calls are much faster.

Endpoint: https://fhir-terminology-server-mcp-wrapper.onrender.com/mcp

Example with Python MCP client: uses the official mcp SDK with Streamable HTTP:

import asyncio

from mcp import ClientSession
from mcp.client.streamable_http import streamable_http_client

MCP_URL = "https://fhir-terminology-server-mcp-wrapper.onrender.com/mcp"

async def main() -> None:
    async with streamable_http_client(MCP_URL) as (read, write, _):
        async with ClientSession(read, write) as session:
            await session.initialize()
            tools = await session.list_tools()
            print([t.name for t in tools.tools])
            
            await session.call_tool("lookup_code", {"system": "http://loinc.org", "code": "718-7"})

asyncio.run(main())

MCP tools (FHIR Terminology Services)

Each tool maps to a GET on the configured server's base URL, using the FHIR operation named below (R4-style paths). Parameters are the query parameters those operations expect; responses are normalized into small JSON objects for the client.

| Tool | FHIR operation | Purpose | |------|----------------|---------| | lookup_code | GET CodeSystem/$lookup | Returns display text and related metadata for a single system + code. Does not test ValueSet membership or hierarchy. | | validate_code | GET CodeSystem/$validate-code | Returns whether a code is valid in the code system (and optional display/version checks). Not the same as membership in a ValueSet. | | validate_code_in_valueset | GET ValueSet/$validate-code | Returns whether a system + code is in the expansion of the ValueSet identified by valueset_url. | | expand_valueset | GET ValueSet/$expand | Expands a ValueSet by canonical url, with optional filter and count (default cap 50 in the tool). Returns a flat list of contains entries. | | translate_code | GET ConceptMap/$translate | Uses a known concept_map_url to map a source system + code to target concept(s), with optional target_system. | | subsumes_codes | GET CodeSystem/$subsumes | Compares two codes in the same system; outcome reflects equivalence or subsumption (subsumes, subsumed-by, not-subsumed, etc.) when the terminology server supports hierarchies. |

Official operation semantics and parameters: FHIR Terminology Service (R4).

MCP resources

Resources are read-only data exposed to MCP clients (no call to the remote terminology server). They help pick correct canonical URIs before calling tools.

| URI | Name | Purpose | |-----|------|---------| | fhir://code-systems | FHIR Common Code Systems | JSON catalog of common code systems: canonical URLs, OIDs, domains, descriptions, and example codes. | | fhir://code-systems/by-domain/{domain} | Code Systems by Domain | Same catalog filtered by domain keyword (e.g. medications, laboratory). If nothing matches, the JSON includes available_domains. |

Prerequisites

  • Python 3.10+

Setup

python -m venv .venv

# Windows
.venv\Scripts\activate

# Linux/macOS
source .venv/bin/activate

pip install -r requirements.txt

Configuration

Copy .env.example to .env and adjust the variables:

# Linux/macOS
cp .env.example .env

# Windows (cmd)
copy .env.example .env

| Variable | Description | Default | |---|---|---| | FHIR_TERMINOLOGY_SERVER_URL | Base URL of the target FHIR terminology server | https://tx.fhir.org/r4 | | FHIR_HTTP_CACHE_ENABLED | Enable in-memory LRU+TTL cache for cacheable terminology GETs | true | | FHIR_HTTP_CACHE_TTL_SECONDS | Time-to-live for cache entries (seconds) | 300 | | FHIR_HTTP_CACHE_MAX_ENTRIES | Maximum cached responses | 512 | | MCP_SERVER_NAME | MCP wrapper display name | FHIR Terminology Server MCP Wrapper | | PORT | Port for HTTP transport | 8000 | | MCP_ENV | Set to development to reload mcp/ modules on change (FileSystemProvider) | production |

Run

# stdio (default for IDE integration)
python server.py

# FastMCP CLI
fastmcp run server.py:mcp

Test

Tests use pytest. Configuration is in pytest.ini (e.g. testpaths, asyncio mode). Run from the repository root with the virtual environment activated:

pytest -v

-v prints each test name and outcome; add -x to stop on the first failure, or -k <substring> to filter by name.

Markers

Markers group tests by how they behave. This repo uses:

| Marker | Meaning | |--------|---------| | integration | Hits a real FHIR terminology server (FHIR_TERMINOLOGY_SERVER_URL in .env). Needs network. |

Examples:

# Only integration tests
pytest -v -m integration

# One file
pytest -v test/lookup_test.py

Related Skills

View on GitHub
GitHub Stars3
CategoryAI
Updated7mo ago
Forks0

Languages

Python

Trust signals

74/100

From repository metadata: license, adoption, age and documentation. Not a code audit — see the Safety scan above for what the skill file itself contains.

1 medium2 low