search_medical_codesLABSCO SUMMARY
An availability signal that means something.
Tools here appear and disappear with their source data, so a visible tool is one whose dataset actually loaded — a far better signal than a tool that exists and returns empty results. The project is careful about the boundary too: it warns that availability does not mean embeddings are complete, and that search will quietly fall back to keyword matching until they are. The single write tool is fenced three ways — administrator-registered server, allow-list, and an explicit confirmation flag.
What it is
A Node.js MCP server covering Taiwanese health data — TFDA drugs with their leaflets and appearance, health supplements, food nutrition, TWCore IG — alongside the international terminologies clinical work depends on: ICD-10-CM/PCS 2025, SNOMED CT International, LOINC 2.80 and FHIR R4. It exposes 49 tools across 11 groups, and mirrors them as an OpenAPI surface for clients that cannot speak MCP.
What you get
- Diagnosis coding work: search codes, infer complications, list nearby codes, check for conflicts, and browse a category —
search_medical_codes,infer_complications,get_nearby_codes,check_medical_conflict,browse_icd_category - TFDA drug data including identifying an unknown pill from its appearance —
search_drug,identify_unknown_pill,get_drug_details,get_drug_asset_links - Lab results interpreted against LOINC, one at a time or in a batch —
search_loinc,query_loinc,interpret_lab_result,batch_interpret_lab_results - SNOMED CT concepts, their relationships and their mappings —
search_snomed_concept,query_snomed_concept,get_snomed_relationships,query_snomed_mapping - A full FHIR IG authoring and validation surface: list and search artifacts across package-scoped IGs, rank and read profiles and their elements, expand ValueSets, look up and validate codes, resolve references, build and validate bundles, and generate a resource skeleton to fill —
fhir_list_igs,fhir_search_artifacts,fhir_rank_resource_profiles,fhir_get_profile_elements,fhir_expand_valueset,fhir_validate_code,fhir_build_bundle,fhir_validate_bundle,fhir_get_resource_skeleton,fhir_finalize_resource - Condition and Medication resources queried and validated directly —
query_fhir_condition,validate_fhir_condition,query_fhir_medication,validate_fhir_medication - Nutrition data: a food's profile, a single ingredient, foods ranked by a nutrient, and a whole meal analysed —
query_food_nutrition,query_food_ingredient,search_foods_by_nutrient,analyze_meal_nutrition - Registered external FHIR servers, their status, and read/write access to them —
list_fhir_servers,get_fhir_server_status,crud_fhir_server - Semantic or hybrid search backed by an embedding model, falling back to keyword search when embeddings are not yet built
- Tools that register and deregister themselves as each module's data finishes loading, so an available tool means its source data is present
Requirements
This is a deployment, not an install: clone, copy .env.example, set POSTGRES_PASSWORD and the admin variables, and docker compose up -d. That brings up nginx as the single entry point on port 8080, the Node MCP server and admin REST API, a background worker, PostgreSQL 16 with pgvector, pgBouncer, Redis and MinIO. The app container deliberately does not publish port 8000 to the host — all traffic goes through nginx. Clients connect over streamable-http at http://<YOUR_HOST>:8080/mcp, or through the OpenAPI bridge at /openapi.json, where each tool is a POST endpoint under /tools/. Data is loaded from the Admin Console, which is off until you set ADMIN_ENABLED=true with a username, a password hash and a session secret. Every tool is read-only except crud_fhir_server, which can write only to servers an administrator registered, only if that server's allow-list permits it, and only when the caller passes confirm_write=true. Both interfaces ship without enforced authentication — put a reverse proxy or a token in front before exposing them. Licensed MIT.
Setup effort
Follow the published steps — git clone https://github.com/healthymind-tech/Taiwan-Health-MCP.git
USE CASES
Coding a diagnosis correctly
Search the ICD-10 codes, look at neighbouring ones, and check the combination for conflicts before it goes on the claim.
Identifying a pill someone brought in
Query the TFDA data by appearance, then read the drug detail and leaflet assets.
Authoring a FHIR resource against a profile
Rank the candidate profiles for the resource type, read the element definitions, generate the skeleton, fill it, then validate before finalising.
Making sense of a lab panel
Batch-interpret the results against LOINC rather than looking each analyte up separately.
Connecting from a client that only speaks OpenAPI
Point it at the base URL; the spec is generated from the currently enabled tools and each one is a POST endpoint.
49 tools
Listed in project docs. Your client may show a different list.
infer_complicationsget_nearby_codescheck_medical_conflictbrowse_icd_categorysearch_drugidentify_unknown_pillget_drug_detailsget_drug_asset_linkssearch_loincquery_loincinterpret_lab_resultbatch_interpret_lab_resultssearch_snomed_conceptquery_snomed_conceptget_snomed_relationshipsquery_snomed_mappingquery_fhir_conditionvalidate_fhir_conditionquery_fhir_medicationvalidate_fhir_medicationfhir_list_igsfhir_get_igfhir_list_artifactsfhir_search_artifactsfhir_list_resource_profilesfhir_rank_resource_profilesfhir_get_profilefhir_get_profile_elementsfhir_get_valuesetfhir_expand_valuesetfhir_lookup_codefhir_validate_codefhir_normalize_codefhir_resolve_referencefhir_build_bundlefhir_validate_resourcefhir_validate_bundlefhir_get_resource_skeletonfhir_finalize_resourcesearch_health_supplementsquery_food_nutritionquery_food_ingredientsearch_foods_by_nutrientanalyze_meal_nutritionlist_fhir_serversget_fhir_server_statuscrud_fhir_serverhealth_checkBEFORE YOU INSTALL
What to know first
Tools you get
49 tools named in the project's documentation. Module tools register only after their source data is imported, so a fresh docker compose up exposes four. Only crud_fhir_server writes, and it needs an allow-list and confirm_write=true.
Requires
- Docker with Docker Compose
- a .env copied from .env.example, with POSTGRES_PASSWORD (a password you choose for the bundled PostgreSQL) set
- for the Admin Console that loads the data: ADMIN_ENABLED=true plus ADMIN_USERNAME, ADMIN_PASSWORD_HASH and ADMIN_SESSION_SECRET in .env
- the source data imported from the Admin Console before the module tools appear: ICD-10-CM/PCS, LOINC, SNOMED CT, RxNorm and FHIR IG files you upload yourself, while the drug, supplement and food data are fetched by the importer
INSTALLATION
Connect your client
Server setup
git clone https://github.com/healthymind-tech/Taiwan-Health-MCP.git
cd Taiwan-Health-MCP
cp .env.example .env # set POSTGRES_PASSWORD and the other required variables
docker compose up -dMCP Clients
Open WebUI — MCP HTTP
http://<YOUR_HOST>:8080/mcpOpen WebUI — OpenAPI
Base URL http://<YOUR_HOST>:8080 — the client fetches GET /openapi.json and calls POST /tools/<YOUR_TOOL_NAME>