Model Context Protocol (MCP) 2026-ban: Gyakorlati útmutató MCP szerverek építéséhez Pythonban és TypeScriptben

Lépésről lépésre útmutató MCP szerverek építéséhez Pythonban (FastMCP) és TypeScriptben. Bekötés Claude Desktopba és Cursorba, OAuth 2.1 biztonság és a 2026-os legjobb gyakorlatok.

MCP szerver Python + TypeScript (2026)

Frissítve: 2026. június 15.

A Model Context Protocol (MCP) egy nyílt szabvány, amely egységesíti, hogyan kapcsolódnak az LLM-alapú alkalmazások külső adatforrásokhoz, eszközökhöz és kontextushoz. Gondolj rá úgy, mint az „USB-C portra" az AI ágensek számára. Az Anthropic 2024 novemberében publikálta a protokollt, és 2026 közepére az OpenAI, a Google DeepMind, a Microsoft Copilot Studio és a legtöbb komoly ágens-keretrendszer (LangChain, LlamaIndex, CrewAI) is támogatja. Ebben az útmutatóban egy működő MCP szervert építünk Pythonban és TypeScriptben, bekötjük Claude Desktopba és Cursorba, majd áttekintjük a 2026-os biztonsági és üzemeltetési legjobb gyakorlatokat.

Őszintén szólva, amikor először találkoztam az MCP-vel, kicsit szkeptikus voltam (még egy protokoll, tényleg?), de miután egy hétvégén átírtam egy belső LangChain tool-stacket MCP szerverekre, és ugyanazok a szerverek hirtelen elkezdtek működni Cursorban és Claude Desktopban is, megértettem, miért nem hype ez.

  • Az MCP egy JSON-RPC 2.0 alapú, kétirányú protokoll, amely három primitívre épül: tools (modell által hívható függvények), resources (olvasható kontextus) és prompts (újrahasznosítható sablonok).
  • A 2025-03-26-os specifikáció és a 2026-os 2025-06-18 verzió bevezette a Streamable HTTP transportot, az OAuth 2.1 alapú authorizációt és a strukturált tool outputokat.
  • A hivatalos SDK-k (Python, TypeScript, Java, C#, Kotlin, Swift, Ruby) lefedik a szerver és a kliens oldalt is. A FastMCP Pythonban néhány dekorátorral kész szervert ad.
  • Claude Desktop, Claude Code, Cursor, Zed, Windsurf és a VS Code Copilot mind natívan fogyaszt MCP szervereket. Egy szervert egyszerre több kliens is használhat.
  • Éles használathoz mindig adj jogosultság-szűrést, rate limitet, audit logot és (HTTP transport esetén) OAuth 2.1 + PKCE bejelentkezést.
  • A leggyakoribb hibák a transport-keverés, a hiányzó roots kezelés és a tool leírások túl szűkszavú megfogalmazása. Ezeket részletesen tárgyaljuk.

Mi az a Model Context Protocol és miért érdekes 2026-ban?

A Model Context Protocol az Anthropic által kezdeményezett nyílt protokoll, amely az LLM-alkalmazások és külső rendszerek közötti integrációt szabványosítja. Mielőtt megjelent, minden ágens-keretrendszer (LangChain, LlamaIndex, AutoGen, CrewAI) saját, inkompatibilis tool-formátumot használt. Egy GitHub integrációt mindhez külön kellett implementálni. Az MCP ezt az N×M problémát N+M-re csökkenti: egy MCP szervert egyszer írsz meg, és minden MCP-kompatibilis kliens (Claude Desktop, Cursor, Zed, VS Code Copilot, Windsurf, sőt 2026-tól az OpenAI Agents SDK is) használni tudja.

2026-ra a protokoll túljutott a korai fázison: a 2025-06-18-as verzió már GA-státuszú, a Streamable HTTP transport felváltotta a régi SSE-t, és az ökoszisztémában több mint 4000 nyilvános MCP szerver található (lásd a hivatalos MCP servers repót). A kulcs az, hogy az MCP nem egy újabb ágens-keretrendszer, hanem egy protokoll, ami alatt bármelyik keretrendszer fut.

MCP architektúra: host, kliens, szerver és a három primitív

Az MCP három szereplőt különít el. A host az LLM-et futtató alkalmazás (Claude Desktop, Cursor, saját ágens). A host minden összekapcsolt MCP szerverhez egy-egy kliens példányt indít (egy host több klienst is futtathat párhuzamosan). A szerver egy különálló folyamat (vagy HTTP endpoint), amely capabilities-t ad ki a kliensnek.

A protokoll három primitívet definiál, amit egy szerver felkínálhat:

  • Tools: modell által hívható függvények (pl. create_github_issue, run_sql_query). Mellékhatásuk lehet, paraméter-sémájuk JSON Schema.
  • Resources: olvasható kontextus URI-val azonosítva (pl. file:///docs/api.md, postgres://schema/users). Idempotensek, nincs mellékhatás.
  • Prompts: paraméterezhető prompt-sablonok, amiket a felhasználó kiválaszthat a klienseben (pl. „Review this PR" sablon).

Ezeken túl a kliens is felkínálhat capabilities-t a szervernek: sampling (a szerver kérhet LLM-completiont a kliens modelljétől), roots (a szerver megtudhatja, milyen fájlrendszer-gyökerek elérhetők), és 2026 óta elicitation (a szerver futás közben kérdezhet a felhasználótól). A kommunikáció JSON-RPC 2.0 üzenetekkel történik, kapacitás-egyeztetéssel kezdődik (initialize), és a kliens csak azokat a funkciókat hívhatja, amiket a szerver expliciten kihirdetett.

MCP szerver építése Pythonban (FastMCP)

A hivatalos Python SDK része a FastMCP magas szintű API, ami dekorátorokkal teszi lehetővé az MCP szerverek deklarálását. A példa egy egyszerű „Knowledge Base" szervert épít, ami egy lokális Markdown-mappát expose-ol tools és resources formájában.

Telepítés (Python ≥ 3.10 szükséges):

pip install "mcp[cli]>=1.9.0" httpx
# vagy uv-vel:
uv add "mcp[cli]" httpx

A teljes szerver kódja (mentsd kb_server.py néven):

from pathlib import Path
from mcp.server.fastmcp import FastMCP

KB_ROOT = Path("/Users/me/notes").expanduser()
mcp = FastMCP("knowledge-base", version="1.0.0")

@mcp.resource("kb://{slug}")
def get_note(slug: str) -> str:
    "Beolvas egy jegyzetet a tudásbázisból a megadott slug alapján."
    path = KB_ROOT / f"{slug}.md"
    if not path.is_file() or KB_ROOT not in path.resolve().parents:
        raise FileNotFoundError(f"Nincs ilyen jegyzet: {slug}")
    return path.read_text(encoding="utf-8")

@mcp.tool()
def search_notes(query: str, limit: int = 5) -> list[dict]:
    "Kulcsszavas keresés a jegyzetek között. Visszaad max `limit` találatot."
    results = []
    q = query.lower()
    for md in KB_ROOT.rglob("*.md"):
        text = md.read_text(encoding="utf-8")
        if q in text.lower():
            snippet = text[:200].replace("\n", " ")
            results.append({"slug": md.stem, "snippet": snippet})
            if len(results) >= limit:
                break
    return results

@mcp.prompt()
def summarize_note(slug: str) -> str:
    "Sablon: foglalja össze a megadott jegyzetet bullet pontokban."
    return f"Olvasd be a kb://{slug} resource-t, majd készíts belőle 5 bullet pontos összefoglalót magyarul."

if __name__ == "__main__":
    mcp.run(transport="stdio")

A három dekorátor a három primitívnek felel meg. A resource URI sablonja a {slug} path paramétert tartalmazza, és a kliens a teljes URI-t adja át (pl. kb://machine-learning). Figyeld meg a Path Traversal védelmet: ellenőrizzük, hogy a feloldott útvonal a KB_ROOT alatt van-e. Egy korábbi projektemben pont ezen a check-en csúsztam el, és egy elgépelt slug majdnem kivitt a notes mappából. Azóta mindig duplán ellenőrzöm.

Futtatás és tesztelés MCP Inspectorral:

mcp dev kb_server.py
# Megnyitja a böngészőben a http://localhost:5173 URL-t,
# ahol kipróbálhatod a toolokat és resource-okat.

MCP szerver építése TypeScriptben

A TypeScript SDK ugyanezt a fejlesztői élményt adja Node.js-en (≥ 18). Egy GitHub issue-kereső szervert építünk, ami a GitHub REST API-t expose-olja toolként.

npm init -y
npm install @modelcontextprotocol/sdk@^1.10 zod
npm install -D typescript tsx @types/node

A szerver kódja (src/server.ts):

import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
import { z } from "zod";

const server = new McpServer({
  name: "github-issues",
  version: "1.0.0",
});

const GH_TOKEN = process.env.GITHUB_TOKEN;
if (!GH_TOKEN) throw new Error("GITHUB_TOKEN környezeti változó hiányzik");

server.tool(
  "search_issues",
  "GitHub issue-k keresése egy repóban címke és állapot szerint.",
  {
    repo: z.string().describe("owner/name formátum, pl. anthropics/sdk"),
    state: z.enum(["open", "closed", "all"]).default("open"),
    label: z.string().optional(),
    limit: z.number().int().min(1).max(50).default(10),
  },
  async ({ repo, state, label, limit }) => {
    const params = new URLSearchParams({ state, per_page: String(limit) });
    if (label) params.set("labels", label);
    const res = await fetch(
      `https://api.github.com/repos/${repo}/issues?${params}`,
      {
        headers: {
          Authorization: `Bearer ${GH_TOKEN}`,
          Accept: "application/vnd.github+json",
        },
      },
    );
    if (!res.ok) {
      return {
        content: [{ type: "text", text: `GitHub API hiba: ${res.status}` }],
        isError: true,
      };
    }
    const issues = (await res.json()) as Array<{
      number: number;
      title: string;
      html_url: string;
      state: string;
    }>;
    return {
      content: [
        {
          type: "text",
          text: issues
            .map((i) => `#${i.number} [${i.state}] ${i.title}\n${i.html_url}`)
            .join("\n\n"),
        },
      ],
    };
  },
);

const transport = new StdioServerTransport();
await server.connect(transport);

Néhány dolog, ami eltér a Python változattól: a zod sémából automatikusan generál a runtime JSON Schemát; a tool válasza egy content tömb (text vagy image item-ekkel), és isError: true-val jelezzük a tool-szintű hibát. Ez fontos, mert a modell ekkor megkapja a hibaüzenetet és újrapróbálhatja.

Indítás: npx tsx src/server.ts, de stdio transport esetén normálisan a kliens indítja el a folyamatot.

Hogyan kötöd be Claude Desktopba és Cursorba?

Claude Desktopban a szerver konfigurációja a ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) vagy a %APPDATA%\Claude\claude_desktop_config.json (Windows) fájlban történik:

{
  "mcpServers": {
    "knowledge-base": {
      "command": "uv",
      "args": ["run", "python", "/abs/path/to/kb_server.py"]
    },
    "github-issues": {
      "command": "node",
      "args": ["/abs/path/to/dist/server.js"],
      "env": { "GITHUB_TOKEN": "ghp_..." }
    }
  }
}

A Claude Desktop újraindítása után a chat-mezőben egy „🔌" ikon jelzi a csatlakoztatott szervereket. A toolok a felhasználó engedélye után hívhatók (per-hívás vagy per-szerver engedély).

Cursorban a .cursor/mcp.json fájlba ugyanezt a struktúrát teszed, projekt-szinten. A Cursor 2026-os verziója már támogatja a Streamable HTTP transportot is, így távoli szervereket is be tudsz kötni:

{
  "mcpServers": {
    "company-kb": {
      "url": "https://mcp.company.internal/kb",
      "headers": { "Authorization": "Bearer ${env:KB_TOKEN}" }
    }
  }
}

Stdio vs Streamable HTTP: melyik transportot válaszd?

A 2025-03-26-os specifikáció óta az MCP-nek két hivatalos transportja van: stdio (stdin/stdout pipe) és Streamable HTTP (HTTP POST + opcionális SSE válasz-stream). A régi „HTTP + SSE" transport elavult, új projektben ne használd.

SzempontStdioStreamable HTTP
Tipikus használatLokális, egy-felhasználós eszközök (CLI-szerű)Megosztott / távoli szerverek, csapatszintű telepítés
AuthOS-szintű (a kliens indítja, ugyanaz a user)OAuth 2.1 + PKCE (kötelező scope-okkal)
TelepítésKlienseként konfigurálni kell (config fájl)URL beillesztése, megosztható linkként
Skálázás1 felhasználó / 1 folyamatSok kliens / 1 szerver, horizontális skálázás
Streamelt válaszIgen (stdout)Igen (SSE a POST válaszban)
Mikor válaszd?Helyi fájlok, lokális CLI eszközök, fejlesztésSaaS integrációk, vállalati belső API-k, multi-user

Általános ökölszabály: ha a szerver csak az adott felhasználó gépén futó erőforrásokat ér el (fájlok, lokális Postgres, helyi git repo), válaszd a stdio transportot. Egyszerűbb, és nincs auth komplexitás. Ha a szerver központi szolgáltatás (vállalati Confluence, megosztott adattó, SaaS API), Streamable HTTP-re lesz szükséged. A Python SDK-ban a mcp.run(transport="streamable-http", host="0.0.0.0", port=8000) sorral indítható.

MCP biztonság 2026-ban: OAuth 2.1, scope-ok, prompt injection

Na, itt jön a rész, amit senki nem szeret, de mindenki ráfizet, ha kihagyja. Az MCP nem oldja meg a biztonsági kérdéseket helyetted, ezek a szerver és a host felelősségei. 2026-ban a következő rétegeket kell felépítened:

1. Authentikáció (OAuth 2.1 HTTP transport esetén)

A 2025-06-18 specifikáció kötelezővé tette az OAuth 2.1-et PKCE-vel a HTTP transportokhoz. A szerver közzéteszi a Protected Resource Metadatát a /.well-known/oauth-protected-resource endpointon, a kliens pedig az Authorization Server discovery alapján szerez tokent. Soha ne implementálj saját bearer-token sémát, használj megbízható IdP-t (Auth0, Clerk, Authentik, Keycloak).

2. Authorizáció (scope-ok és per-tool jogosultság)

Minden tool-hoz definiálj scope-ot, és a tool meghívásánál ellenőrizd a token scope-jait. A least privilege elve itt is érvényes: ne adj repo:write scope-ot, ha csak olvasol.

3. Prompt injection ellen védelem

A resource-okból visszaadott szöveg modell-bemenet lesz, ezért a szerver soha nem szabad, hogy „bízzon" külső tartalmakban. Gyakorlati lépések: jelöld meg a külső forrásokat egyértelmű delimiterrel (<untrusted>…</untrusted>), strippeld a system-prompt-szerű utasításokat, és a tool-leírásokban se használj olyan kifejezéseket, amik direkt utasításnak tűnhetnek a modellnek.

4. Audit log és rate limiting

Minden tool-hívást logolj (ki, mikor, milyen paraméterekkel, milyen eredménnyel), és tegyél rate limitet a destruktív műveletekre. A LLM observability 2026-ban cikkben tárgyalt eszközök (Langfuse, Phoenix) 2026 óta natívan értik az MCP eseményeket.

Hibakeresés: MCP Inspector és gyakori csapdák

Az MCP Inspector (Anthropic hivatalos eszköze) egy webes UI, ami kliens-szimulátorként működik. Indítás:

npx @modelcontextprotocol/inspector node ./dist/server.js
# Megnyit egy http://localhost:6274 URL-t, ahol minden
# JSON-RPC üzenetet láthatsz forgatókönyv-szerűen.

Gyakori csapdák, amikkel a fejlesztők találkoznak (és bevallom, én is mindegyiken átestem):

  1. Stdio transport: ne nyomtass stdout-ra. A print() Pythonban vagy a console.log TypeScriptben a JSON-RPC csatornába ír, és törli a kapcsolatot. Minden naplózást stderr-re irányíts (logging.basicConfig(stream=sys.stderr)).
  2. Roots figyelmen kívül hagyása. A kliens elküldi a roots listát (engedélyezett fájlrendszer-területek). Ha kihagyod, a tool olyan fájlokhoz nyúl, amikhez a felhasználó nem adott engedélyt.
  3. Túl szűk tool-leírás. Ha a docstring 1 mondat, a modell nem fogja eltalálni, mikor hívja. Írj 2–4 mondatos leírást példa-használattal: „Use when the user asks about open GitHub issues. Example: 'show open bugs in anthropic/sdk' → repo='anthropic/sdk', label='bug'."
  4. Hiányzó error handling. A tool kivétele lefagyaszthatja a szervert. Mindig csomagold try/except-be, és térj vissza isError: true válasszal.
  5. Verzió-mismatch. A kliens és szerver különböző protocol verziókat tárgyalhat. Tartsd az SDK-t naprakészen, és tartsd be a 2025-06-18 minimumot új szerverekhez.

MCP vs. natív function calling: mikor melyiket?

Felmerül a kérdés: ha az Anthropic API-nak van saját tools paramétere (és az OpenAI-nak is), mi a különbség az MCP-hez képest? A válasz: a natív function calling a modell ↔ API-hívó kód közti protokoll. Az MCP ennél eggyel feljebb van, az API-hívó kód ↔ külső eszköz/adatforrás közti protokoll. A kettő nem helyettesítője egymásnak.

Egy tipikus production setup így néz ki:

  • A modell function callingot használ (Claude tool use / OpenAI tools).
  • A te ügyfél-kódod (host) MCP-n keresztül beszél a tool-implementációkkal (szerverek).
  • A szerverek a háttér-rendszerekkel beszélnek (DB, SaaS API, fájlrendszer).

Ez a réteges szétválasztás teszi lehetővé, hogy egy MCP szervert egyszerre Claude, GPT-4.5, Gemini és Llama-alapú ágensek is használjanak. A function calling formátum különbségei a kliensben oldódnak fel. Ha többágenses rendszert építesz, érdemes a többágenses AI orkesztráció 2026-ban cikkben tárgyalt mintákat kombinálni MCP szerverekkel, így minden ágens ugyanazokat a megosztott eszközöket éri el konzisztensen.

Gyakran ismételt kérdések

Mi a különbség az MCP és a LangChain Tools között?

A LangChain Tools egy keretrendszer-specifikus Python API tool-ok definiálására. Az MCP egy nyelv- és keretrendszer-független protokoll. Egy MCP szerver bármelyik MCP-képes kliensből (LangChain, LlamaIndex, Claude Desktop, Cursor) használható; egy LangChain Tool csak LangChain alkalmazásban. 2026 óta a LangChain natívan tudja használni az MCP szervereket Toolként, így a két réteg jól megfér egymás mellett.

Lehet egy MCP szervert egyszerre több klienssel használni?

Stdio transport esetén nem, mert minden kliens saját szerver-folyamatot indít. Streamable HTTP transport esetén igen: egy szerver-példány több párhuzamos kliens-sessiont tud kezelni, ahol minden sessiont egy egyedi Mcp-Session-Id header azonosít. Ezt használják a vállalati központi MCP szerverek (pl. egy közös belső dokumentum-keresés).

Hogyan kezelje az MCP szerver a hosszú futási idejű műveleteket?

Streamable HTTP transport esetén a tool válasza streamelhető SSE eventekkel, így progress üzeneteket küldhetsz a kliensnek. A 2025-06-18-as spec bevezette a notifications/progress üzeneteket is, amik token-szintű streamhez hasonlóan jelzik az előrehaladást. Stdio transportnál ugyanezt JSON-RPC notification-okkal éred el. Ha a művelet több percig is eltarthat, érdemes job ID-t visszaadni és külön tool-lal kérdezni le az állapotot.

Mi a teendő, ha az MCP szerver nem jelenik meg Claude Desktopban?

Először ellenőrizd a Claude Desktop logokat (~/Library/Logs/Claude/mcp*.log macOS-en). A leggyakoribb okok: 1) abszolút path helyett relatív path a command mezőben, 2) a stdio szerver stdout-ra naplóz (nem stderr-re), 3) a környezeti változók hiányoznak az env blokkból (Claude Desktop nem örökli a shell envet), 4) a config fájl JSON-jában szintaktikai hiba van. Az MCP Inspectorral izoláltan tudod tesztelni a szervert.

Az MCP csak Anthropic Claude-dal működik?

Nem. Az MCP nyílt szabvány, és 2026-ra az OpenAI Agents SDK, a Google Vertex AI Agent Builder, a Microsoft Copilot Studio és számos open-source ágens-keretrendszer (LangChain, LlamaIndex, CrewAI, AutoGen) is natívan támogatja kliens-oldalon. Bár az Anthropic kezdeményezte, a specifikáció nyíltan kormányzott és bármelyik modell-szolgáltatóval kompatibilis.

Editorial Team
A Szerzőről Editorial Team

Our team of expert writers and editors.