MCP Protocol: Jak jsem propojil AI agenta s českými lékovými daty
autor: Petr Sovadina8 min čtení1428 slov

MCP Protocol: Jak jsem propojil AI agenta s českými lékovými daty

Technology
Ai
Technology
Dev

💡 TL;DR: Vzal jsem databázi 68 000+ českých léků od SÚKL, zabalil ji do MCP serveru a nasadil na Vercel. Celé za víkend. Tady je, co jsem se naučil a proč je MCP game-changer pro healthcare AI.

Kontext: Proč jsem to vůbec dělal

Pracuju na projektu Czech MedAI — AI asistentovi pro české lékaře. Jednou z klíčových funkcí je, že se doktor může zeptat na lék a dostat relevantní, aktuální informace. Ne z Wikipedie, ne z ChatGPT, který si vymýšlí — ale přímo z oficiálních dat SÚKL.

Problém? SÚKL má data, ale nejsou zrovna "AI-friendly". XML dumpy, proprietární kódy, žádné API. Klasická situace v českém healthtechu — data existují, ale dostat se k nim programaticky je jako luštit šifru z 90. let.

Architektura: SÚKL XML data → MCP Server → AI Agent

Co je MCP (a proč by vás to mělo zajímat)

Model Context Protocol (MCP) je otevřený standard od Anthropicu, který řeší jednoduchý problém: jak dát AI modelu přístup k externím nástrojům a datům bez toho, abyste pokaždé psali custom integraci.

Představte si to jako USB pro AI. Místo toho, abyste pro každý model a každý datový zdroj psali specifický kód, vytvoříte jeden MCP server a ten funguje s jakýmkoliv klientem — Claude, GPT, váš vlastní agent, cokoliv.

🔌 MCP = standardní rozhraní mezi AI a vnějším světem. Jeden server, mnoho klientů. Jako REST API, ale navržené specificky pro LLM.

Architektura: Od XML dumpu k živému API

Celý proces měl tři fáze:

1. Extrakce a normalizace dat

SÚKL publikuje data ve formátu, který... řekněme, že nebyl navržený s ohledem na developer experience. Stáhl jsem kompletní databázi registrovaných léčivých přípravků a prošel jsem si strukturu. 68 248 léků, každý s desítkami atributů — od ATC kódů přes sílu účinné látky po formu podání.

// Příklad struktury jednoho léku
{
  "name": "IBALGIN 400",
  "activeSubstance": "IBUPROFENUM",
  "strength": "400MG",
  "form": "Potahovaná tableta",
  "atcCode": "M01AE01",
  "registrationHolder": "Sanofi-Aventis",
  "sukl_code": "0000892"
}

2. MCP Server v TypeScriptu

Zvolil jsem TypeScript — ne z lásky k typovému systému (i když ten pomáhá), ale protože ekosystém kolem MCP je zatím nejsilnější právě v TS/JS. SDK od Anthropicu je dobře udržované a dokumentace je solidní.

Server nabízí tři hlavní nástroje (tools):

  • search_medications — fulltextové vyhledávání přes název, účinnou látku, ATC kód
  • get_medication_detail — kompletní detail léku včetně SPC odkazu
  • check_interactions — kontrola lékových interakcí (experimentální)
// Registrace MCP toolu
server.tool(
  'search_medications',
  'Search Czech medication database (SÚKL)',
  {
    query: z.string().describe('Drug name, substance, or ATC code'),
    limit: z.number().optional().default(10)
  },
  async ({ query, limit }) => {
    const results = await searchMedications(query, limit);
    return {
      content: [{ type: 'text', text: JSON.stringify(results) }]
    };
  }
);

3. Deploy na Vercel

Tady přišla první překvapení. MCP standardně funguje přes stdio (stdin/stdout), což je super pro lokální použití, ale pro cloud deploy potřebujete HTTP transport. Naštěstí existuje Streamable HTTP transport, který MCP podporuje od verze 2025-03.

Deploy na Vercel byl nakonec straightforward — jedna serverless funkce, data bundlovaná přímo v balíčku (68K léků = ~15MB JSON, v gzipu to sedí). Cold start kolem 2 sekund, pak sub-100ms odezvy. Pro healthcare use case naprosto dostačující.

MCP Protocol — USB konektor pro AI a externí data

Co mě překvapilo (pozitivně i negativně)

✅ MCP je překvapivě jednoduchý

Čekal jsem složitý protokol s desítkami konceptů. Realita? Definujete tools (co umí), resources (co obsahuje) a prompts (jak to použít). To je celé. Od nuly k funkčnímu serveru jsem se dostal za odpoledne. Většinu času jsem strávil ne s MCP, ale s parsováním SÚKL dat.

✅ Ekosystém roste rychle

Když jsem server publikoval na Smithery (registr MCP serverů), byl jsem jeden z prvních healthcare-focused serverů. Za týden mi přistálo několik hvězdiček a otázek od vývojářů z jiných zemí, kteří chtějí udělat totéž se svými lékovými databázemi. MCP komunita je malá, ale aktivní.

❌ Debugging je zatím bolestivý

MCP Inspector pomáhá, ale když máte problém na úrovni transportu (HTTP vs stdio), jste většinou odkázaní na vlastní logy. Tooling kolem MCP je mladý. Strávil jsem hodiny debugováním problému, který se nakonec ukázal být špatný Content-Type header. Klasika.

❌ Healthcare data jsou vždycky chaos

SÚKL data mají nekonzistentní kódování, duplicity, historické záznamy smíchané s aktivními. Normalizace zabrala víc času než celý MCP server. Tohle je ale problém domény, ne technologie — a je to důvod, proč tuhle práci někdo musí udělat. Dokud data zůstávají v XML dumpech, žádný AI agent s nimi nic neudělá.

Praktické ukázky: Co s tím doktor udělá?

Tady to přestává být technický článek a začíná to být o reálné hodnotě. Představte si praktického lékaře, který potřebuje rychle ověřit informaci o léku:

👨‍⚕️ Lékař: "Jaká je maximální denní dávka ibuprofenu pro dospělého a existují kontraindikace s warfarinem?"

AI agent (s MCP): Vyhledá IBUPROFEN v SÚKL databázi → najde všechny registrované přípravky → vytáhne SPC data → odpoví s konkrétními čísly a referencí na zdroj.

Bez MCP: ChatGPT odpoví z trénovacích dat (potenciálně zastaralých), bez zdroje, bez jistoty.

Klíčový rozdíl je traceabilita. V healthcare nemůžete říct "AI mi to řekla". Potřebujete zdroj, verzi dat, timestamp. MCP tohle umožňuje nativně — každá odpověď obsahuje metadata o tom, odkud data pochází.

Technický stack a čísla

KomponentaDetail
RuntimeNode.js / TypeScript
Framework@modelcontextprotocol/sdk
TransportStreamable HTTP (Vercel)
Data68 248 léků z SÚKL
ValidaceZod schemas
DeployVercel (serverless)
Latence~80ms (warm), ~2s (cold start)

Co bych udělal jinak

  1. Začal bych s vektorovou databází. Fulltextové vyhledávání funguje, ale pro dotazy typu "lék na bolest hlavy bez ibuprofenu" potřebujete sémantické vyhledávání. Pinecone nebo Chroma by tohle vyřešily elegantně.
  2. Přidal bych cachování od začátku. SÚKL data se mění jednou za měsíc. Není důvod parsovat JSON při každém requestu. Redis nebo i simple in-memory cache by ušetřily spoustu cold startů.

Kam to směřuje

SÚKL MCP server je dnes live na sukl-mcp-ts.vercel.app/mcp a kdokoliv ho může připojit ke svému AI agentovi. Ale to je jen začátek.

Pracuju na Czech MedAI — komplexním AI asistentovi pro české lékaře, kde SÚKL MCP je jeden z mnoha datových zdrojů. Představte si agenta, který má přístup k lékové databázi, zná české klinické guideliny, rozumí MKN-11 kódům a umí to všechno propojit v kontextu konkrétního pacienta.

MCP je přesně ten druh infrastruktury, který tohle umožňuje. Místo monolitického "AI pro zdravotnictví" stavíte modulární systém, kde každý MCP server řeší jednu věc dobře. Lékové interakce? MCP server. Diagnózy? Další server. Pojišťovací kódy? Další. A agent si je orchestruje podle potřeby.

"Rád se věnuji problémům a hledám řešení, kde ostatní už žádné nevidí." — A české healthcare IT je plné takových problémů.


🔗 Odkazy

📬 Děláte něco podobného ve svém regionu? Zajímá vás healthcare AI? Ozvi se — rád sdílím zkušenosti a kód je open source.