====== MCP szerverek és LLM integráció ====== Ez a rész azt mutatja be, hogyan lehet egy nagy nyelvi modellt szabályozott módon összekapcsolni külső rendszerekkel MCP szerverek segítségével. A fókusz a modern integrációs szemléleten van: nem az a cél, hogy az LLM közvetlenül érje el a legacy rendszereket, hanem az, hogy egy szabályozott, egységes interfészen keresztül kapjon hozzáférést adatokhoz és műveletekhez. Az MCP rövidítés jelentése: **Model Context Protocol**. ===== Miért érdekes ez rendszerintegrációban? ===== Sok szervezetnél már léteznek olyan rendszerek, amelyek üzletileg kritikusak, de technológiailag régebbiek: * vállalatirányítási rendszerek; * belső SQL adatbázisok; * fájlszerverek; * dokumentumtárak; * régebbi SOAP vagy REST szolgáltatások; * egyedi fejlesztésű, legacy alkalmazások. Ha egy LLM-et szeretnénk ezekkel együtt használni, akkor gyorsan felmerülnek a következő kérdések: * honnan szerezzen adatot a modell; * milyen műveleteket hajthat végre; * milyen jogosultságokkal férhet hozzá a rendszerekhez; * hogyan lehet korlátozni és naplózni a műveleteit; * hogyan lehet egységesíteni a sokféle háttérrendszer elérését. Erre ad egy modern, egységes megközelítést az MCP. ===== Mi az MCP lényege? ===== Az MCP egy szabványos protokoll arra, hogy egy kliensalkalmazás strukturált módon összekapcsolódjon olyan szerverekkel, amelyek adatot, promptokat vagy végrehajtható műveleteket tesznek elérhetővé egy LLM számára. Egyszerűen megfogalmazva: * az **LLM** nem közvetlenül beszél a háttérrendszerrel; * a **kliensalkalmazás** kezeli a modellt és a felhasználói interakciót; * az **MCP szerver** egy jól definiált felületen keresztül elérhetővé teszi a szükséges adatokat és funkciókat. ==== Fogalmi ábra ==== flowchart LR U[Felhasznalo] H[Host alkalmazas
AI asszisztens vagy belso kliens] L[LLM] C[MCP kliens] S[MCP szerver] DB[(SQL adatbazis)] DOC[Dokumentumtar] LEG[Legacy uzleti rendszer] U --> H H --> L H --> C C <--> S S --> DB S --> DOC S --> LEG S --> C C --> H H --> U
===== Az MCP fő szereplői ===== ==== 1. Host alkalmazás ==== Ez az a program, amelyben a felhasználó ténylegesen dolgozik. Például: * egy AI asszisztens; * egy fejlesztői környezet; * egy belső vállalati chat alkalmazás; * egy saját integrációs felület. Ez a komponens jeleníti meg a választ a felhasználónak, és ez kapcsolja össze az LLM-et az MCP világával. ==== 2. MCP kliens ==== Az MCP kliens a host alkalmazás része vagy annak egy komponense. Feladata: * kapcsolatot létesíteni az MCP szerverrel; * lekérdezni, milyen képességeket kínál a szerver; * átadni a modellnek a releváns eszközöket és adatokat; * továbbítani a szerver felé a műveletkéréseket. ==== 3. MCP szerver ==== Az MCP szerver teszi elérhetővé a háttérrendszerek képességeit egységes formában. Nem maga a legacy rendszer az MCP szerver, hanem egy olyan adapter vagy köztes réteg, amely becsomagolja a háttérrendszer funkcióit. Például: * egy adatbázis-lekérdező szolgáltatás; * egy dokumentumtár adapter; * egy CRM vagy ERP rendszerhez kapcsolódó integrációs réteg; * egy ticketing rendszer műveleteit kiajánló szerver. ===== Mit tud egy MCP szerver biztosítani? ===== Az MCP három különösen fontos szerveroldali fogalmat használ. ==== 1. Tools ==== A tool egy végrehajtható művelet. Ilyen lehet például: * ügyfél adatainak lekérdezése azonosító alapján; * rendelési státusz lekérdezése; * hibajegy létrehozása; * jelentés generálása; * belső API meghívása. Lényeges, hogy a tool nem csak adatot ad vissza, hanem valamilyen műveletet is képviselhet. ==== 2. Resources ==== A resource olyan adat vagy tartalom, amelyet a kliens és a modell kontextusként felhasználhat. Például: * dokumentáció; * konfiguráció; * kézikönyv; * adatbázisból lekért strukturált adatok; * riportok vagy logfájlok tartalma. Ez különösen hasznos akkor, ha az LLM-nek először információt kell olvasnia és értelmeznie, mielőtt választ adna. ==== 3. Prompts ==== A prompt ebben a kontextusban nem egyszerűen egy szabad szöveg, hanem egy újrahasznosítható sablon vagy workflow. Például: * "elemezd ezt a logfájlt"; * "készíts összefoglalót a kiválasztott hibajegyről"; * "magyarázd el a kiválasztott SQL lekérdezés működését". Ez segít abban, hogy a gyakori feladatok szabványos módon jelenjenek meg a kliensben. ===== Egy tipikus vállalati példa ===== Tegyük fel, hogy egy vállalatnál van: * egy régi ügyviteli rendszer; * egy SQL adatbázis; * egy dokumentumtár; * és egy belső AI asszisztens. Egy felhasználó ezt kérdezi: * "Mondd meg, miért csúszik a 48291-es rendelés teljesítése." Ilyenkor egy lehetséges folyamat: * a host alkalmazás elküldi a kérdést az LLM-nek; * a kliens látja, hogy elérhető például egy `get_order_status` tool; * az LLM meghívja ezt a toolt; * az MCP szerver a háttérben lekérdezi a legacy rendszert; * az eredményt strukturált formában visszaadja; * az LLM ebből természetes nyelvű választ fogalmaz. Ha szükséges, a modell további toolokat is használhat, például: * ''get_customer_notes'' * ''get_delivery_events'' * ''search_manual'' Így az LLM nem "kitalálja" az adatokat, hanem valós rendszerekből dolgozik. ===== Miért hasznos az MCP legacy rendszerek esetén? ===== ==== 1. Nem kell az LLM-et közvetlenül a háttérrendszerre engedni ==== Az MCP szerver egy köztes réteg. Ez biztonságosabb és jobban ellenőrizhető. ==== 2. Egységes interfészt ad ==== Az LLM vagy a kliens szempontjából mindegy lehet, hogy a háttérben SQL, REST, SOAP vagy fájlrendszer van. Az MCP szerver egységesen hirdeti a képességeit. ==== 3. Könnyebb jogosultságot és naplózást kezelni ==== Az integrációs logikát nem a modellbe építjük, hanem a szerveroldali komponensbe. ==== 4. Jobban karbantartható ==== Ha megváltozik a háttérrendszer API-ja, elég lehet az MCP szervert módosítani, és nem kell az egész kliensoldali megoldást újratervezni. ===== Milyen kommunikációs elemek vannak a háttérben? ===== Az MCP koncepcionálisan egy szabványos kliens-szerver kommunikáció. A specifikáció a képességek egységes leírását és a hívások szabályos szerkezetét adja meg. Oktatási szempontból a legfontosabb gondolatok: * a kliens először felderíti, mire képes a szerver; * a szerver deklarálja, milyen képességei vannak; * a kliens ezeket a képességeket átadhatja a modellnek; * a modell vagy a felhasználó ezek alapján kezdeményez műveleteket. ===== Hogyan néz ki egy egyszerű integrációs gondolkodásmód? ===== Ha egy legacy rendszert szeretnénk LLM-mel összekapcsolni, akkor érdemes a következő lépésekben gondolkodni: ==== 1. Azonosítsuk a hasznos üzleti műveleteket ==== Nem azt kell kitenni, hogy "itt a teljes adatbázis", hanem azt, hogy: * milyen kérdésekre akarunk választ kapni; * milyen műveleteket akarunk engedélyezni; * milyen információkat kell a modell számára elérhetővé tenni. ==== 2. Ezeket bontsuk le toolokra és resource-okra ==== Példák: * tool: rendelési státusz lekérdezés; * tool: hibajegy létrehozás; * resource: termékdokumentáció; * resource: belső folyamatleírás. ==== 3. Korlátozzuk a hozzáférést ==== Nem minden művelet való automatikus modellhasználatra. Egyes tooloknál emberi jóváhagyás kellhet. ==== 4. Gondoljunk a hibatűrésre ==== Mi történik, ha: * a legacy rendszer nem elérhető; * hibás adatot ad vissza; * a felhasználó pontatlanul fogalmaz; * több rendszer válaszát kell egyesíteni. ===== Egyszerű fogalmi példa ===== Tegyük fel, hogy van egy egyetemi tanulmányi rendszer. Az MCP szerver az alábbi toolokat teheti elérhetővé: * ''get_student_data(neptunKod)'' * ''get_course_list(neptunKod)'' * ''get_exam_results(neptunKod, felev)'' * ''create_helpdesk_ticket(szoveg)'' Lehetséges resource-ok: * hallgatói szabályzat; * tantárgyleírások; * vizsgaszabályok; * ügyintézési útmutatók. Lehetséges prompt: * ''Fogalmazz udvarias választ a hallgatónak a vizsgajelentkezési problémájára a szabályzat alapján.'' Ez már egy teljes, modern integrációs minta: az LLM nem csak beszélget, hanem szabályozott módon kapcsolódik valódi szervezeti tudáshoz és műveletekhez. ===== Kipróbálható Python példa ===== Az alábbi példa egy minimális, kipróbálható MCP szervert mutat be Python nyelven. A cél nem egy teljes vállalati megoldás, hanem annak szemléltetése, hogy egy legacy jellegű háttérrendszer képességeit hogyan lehet toolok, resource-ok és promptok formájában kiajánlani. Ez a példa a jelenlegi, 2026. március 27-én ellenőrzött Python MCP SDK szemléletéhez igazodik. ==== Mit csinál a példa? ==== * van egy egyszerű MCP szerver; * a szerver két toolt kínál: * hallgatói alapadatok lekérdezése; * vizsgaeredmények lekérdezése; * van egy resource is, amely egy rövid vizsgaszabályzati szöveget ad vissza; * van egy promptsablon is; * a kliens csatlakozik a szerverhez és közvetlenül meghív két toolt. ==== Példafájlok ==== * ''mcp_demo_server.py'' * ''mcp_demo_client.py'' ==== MCP szerver kód ==== from mcp.server.fastmcp import FastMCP mcp = FastMCP("Legacy Student MCP", json_response=True) STUDENTS = { "ABC123": { "name": "Kiss Anna", "program": "Mernokinformatikus BSc", "status": "aktiv", "semester": 4, }, "XYZ987": { "name": "Nagy Bela", "program": "Programtervezo informatikus BSc", "status": "aktiv", "semester": 6, }, } EXAM_RESULTS = { ("ABC123", "2025-26-1"): [ {"course": "Halozatok", "grade": 4}, {"course": "Adatbazisok", "grade": 5}, ], ("XYZ987", "2025-26-1"): [ {"course": "Szoftvertechnologia", "grade": 3}, {"course": "Mesterseges intelligencia", "grade": 5}, ], } @mcp.tool() def get_student_data(neptun_code: str) -> dict: """Hallgatoi alapadatok lekerdezese Neptun-kod alapjan.""" student = STUDENTS.get(neptun_code.upper()) if student is None: return {"error": "Nincs ilyen hallgato."} return {"neptun_code": neptun_code.upper(), **student} @mcp.tool() def get_exam_results(neptun_code: str, semester: str) -> dict: """Vizsgaeredmenyek lekerdezese egy adott felevre.""" key = (neptun_code.upper(), semester) results = EXAM_RESULTS.get(key) if results is None: return {"error": "Nincs talalat a megadott hallgatohoz vagy felevhez."} return { "neptun_code": neptun_code.upper(), "semester": semester, "results": results, } @mcp.resource("guide://exam-rules") def exam_rules() -> str: """Rovid vizsgaszabalyzati minta.""" return ( "A hallgato a vizsgara a hivatalos tanulmanyi rendszeren keresztul jelentkezhet. " "Vizsgaidoszakban a jelentkezes es a lejelentkezes hataridokhoz kotott. " "Problema eseten a hallgato helpdesk jegyet nyithat." ) @mcp.prompt() def answer_student_question(question: str) -> str: """Promptsablon hallgatoi ugyintezesi kerdesek megvalaszolasahoz.""" return ( "Valaszolj roviden, targyszeruen es udvariasan a hallgatoi kerdesre. " "Ha szukseges, hasznald a vizsgaszabalyzatot es a kapcsolodo toolokat. " f"Kerdes: {question}" ) if __name__ == "__main__": mcp.run(transport="stdio") ==== Egyszerű Python kliens ==== import asyncio import sys from pathlib import Path from mcp import ClientSession, StdioServerParameters from mcp.client.stdio import stdio_client async def main() -> None: server_script = Path(__file__).with_name("mcp_demo_server.py") server_params = StdioServerParameters( command=sys.executable, args=[str(server_script)], ) async with stdio_client(server_params) as (read_stream, write_stream): async with ClientSession(read_stream, write_stream) as session: await session.initialize() tools_result = await session.list_tools() print("Elerheto toolok:") for tool in tools_result.tools: print(f"- {tool.name}: {tool.description}") student_result = await session.call_tool( "get_student_data", {"neptun_code": "ABC123"}, ) print("\\nget_student_data valasz:") print(student_result.content) exam_result = await session.call_tool( "get_exam_results", {"neptun_code": "ABC123", "semester": "2025-26-1"}, ) print("\\nget_exam_results valasz:") print(exam_result.content) if __name__ == "__main__": asyncio.run(main()) ==== Futtatás ==== Ha a ''mcp'' csomag még nincs telepítve: python -m venv .venv .venv\Scripts\activate pip install mcp Ezután a kliens futtatása: python mcp_demo_client.py Ha a kliens sikeresen kapcsolódik, akkor: * kilistázza az elérhető toolokat; * meghívja a ''get_student_data'' toolt; * meghívja a ''get_exam_results'' toolt; * kiírja a visszakapott strukturált választ. ==== Mit érdemes megfigyelni? ==== * A szerver nem egy teljes tanulmányi rendszer, hanem annak MCP adaptere. * A kliens nem közvetlenül adatbázist hív, hanem a szerver által publikált toolokat. * A háttérrendszer lecserélhető úgy, hogy a kliensoldali gondolkodás változatlan marad. * A prompt és a resource külön fogalom a toolokhoz képest. ===== Mire kell figyelni tervezéskor? ===== ==== 1. Biztonság ==== * milyen adatot érhet el az LLM; * milyen műveletet indíthat; * kell-e emberi jóváhagyás; * hogyan naplózzuk a hívásokat. ==== 2. Adatminőség ==== Ha a háttérrendszer hibás vagy hiányos adatot ad, az LLM válasza is gyenge lesz. ==== 3. Jogosultságkezelés ==== Nem biztos, hogy minden felhasználó minden toolhoz hozzáférhet. ==== 4. Promptolási fegyelem ==== Érdemes világosan meghatározni: * mit csináljon a modell; * mikor használjon toolt; * hogyan hivatkozzon a visszakapott adatokra; * mikor mondja azt, hogy nincs elég információja. ===== Gyakorló kérdések ===== * Milyen legacy rendszert érdemes toolként becsomagolni, és mit érdemes inkább csak resource-ként elérhetővé tenni? * Milyen műveleteknél szükséges emberi jóváhagyás? * Miért nem jó ötlet a teljes belső adatbázist közvetlenül az LLM-nek adni? * Hogyan lehet egy MCP szerverrel egységesíteni több különböző belső rendszer elérését? * Milyen hibák jelenhetnek meg az integrációs láncban a felhasználói kérdéstől a háttérrendszerig? ===== Összefoglalás ===== Az MCP szerver egy modern integrációs minta LLM-ek számára. Legfontosabb tanulságok: * az MCP szerver köztes réteg a modell és a háttérrendszerek között; * egységesen tesz elérhetővé műveleteket, adatokat és promptokat; * különösen hasznos belső és legacy rendszerek LLM-alapú integrációjánál; * a technikai integráció mellett a biztonság, jogosultság és adatminőség is központi kérdés. ===== További információ ===== Hivatalos MCP dokumentáció: * [[https://modelcontextprotocol.io/specification/2025-06-18/basic|Model Context Protocol specification]] * [[https://modelcontextprotocol.io/specification/2025-06-18/server/prompts|MCP prompts]] * [[https://modelcontextprotocol.io/docs/concepts/tools|MCP tools]]