[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"article-ersten-mcp-server-erstellen-praxisleitfaden-entwickler":3},{"article":4,"author":50},{"id":5,"category_id":6,"title":7,"slug":8,"excerpt":9,"content_md":10,"content_html":11,"locale":12,"author_id":13,"published":14,"published_at":15,"meta_title":7,"meta_description":16,"focus_keyword":17,"og_image":18,"canonical_url":18,"robots_meta":19,"created_at":15,"updated_at":15,"tags":20,"category_name":30,"related_articles":31},"d0000000-0000-0000-0000-000000000516","a0000000-0000-0000-0000-000000000076","Ihren ersten MCP-Server erstellen: Praxisleitfaden fuer Entwickler","ersten-mcp-server-erstellen-praxisleitfaden-entwickler","Ein praktisches Schritt-fuer-Schritt-Tutorial zum Erstellen eines Model Context Protocol (MCP) Servers in TypeScript und Python, zur Verbindung mit Claude Desktop oder Cursor und zum Deployment in der Produktion.","## Was ist das Model Context Protocol (MCP)?\n\nDas **Model Context Protocol (MCP)** ist ein offener Standard, der von Anthropic entwickelt wurde und definiert, wie AI-Anwendungen mit externen Datenquellen und Tools kommunizieren. Stellen Sie sich MCP als **USB-C fuer die AI-Integration** vor: So wie USB-C einen einzigen universellen Anschluss fuer Laden, Datenuebertragung und Bildschirmausgabe bietet, stellt MCP ein einziges universelles Protokoll bereit, um AI-Modelle mit Datenbanken, APIs, Dateisystemen und anderen Diensten zu verbinden. MCP eliminiert den Bedarf an individuellen Integrationen zwischen jeder AI-Anwendung und jedem Tool.\n\nIm Jahr 2026 ist MCP zum dominierenden Standard fuer die AI-Tool-Kommunikation geworden. Gartner prognostiziert, dass **40 % der Unternehmensanwendungen bis Ende 2026 AI-Agenten enthalten werden**, und MCP ist das Protokoll, das dies in grossem Massstab praktikabel macht. Vor MCP erforderte die Verbindung eines AI-Modells mit N Tools N individuelle Integrationen. Bei M AI-Anwendungen und N Tools benoetigte man M x N Integrationsadapter. MCP reduziert dies auf M + N: Jede AI-App implementiert einen MCP Client, jedes Tool implementiert einen MCP Server.\n\n## MCP-Architektur: Host, Client, Server und Transport\n\nDas Verstaendnis der MCP-Architektur ist wesentlich, bevor Sie Code schreiben. Das Protokoll definiert vier Schluesselrollen:\n\n| Komponente | Rolle | Beispiel |\n|------------|-------|---------|\n| **Host** | Die AI-Anwendung, mit der Endbenutzer interagieren | Claude Desktop, Cursor, VS Code Copilot |\n| **Client** | Der MCP-Protokollhandler innerhalb des Hosts | In die Host-Anwendung eingebaut |\n| **Server** | Stellt Tools, Resources und Prompts ueber MCP bereit | Ihr benutzerdefinierter Server (den wir erstellen) |\n| **Transport** | Die Kommunikationsschicht zwischen Client und Server | stdio, HTTP+SSE, Streamable HTTP |\n\nDer Kommunikationsfluss funktioniert folgendermassen:\n\n1. Der **Host** startet und initialisiert einen MCP **Client** fuer jeden konfigurierten Server.\n2. Der **Client** verbindet sich mit dem **Server** ueber einen **Transport** (stdio fuer lokal, HTTP fuer remote).\n3. Der **Client** sendet eine `initialize`-Anfrage und handelt Protokollversion und Faehigkeiten aus.\n4. Der **Server** antwortet mit seinen verfuegbaren **Tools**, **Resources** und **Prompts**.\n5. Wenn das AI-Modell externe Daten oder Aktionen benoetigt, ruft der **Client** die entsprechende Server-Methode auf.\n6. Der **Server** fuehrt die Operation aus und gibt Ergebnisse ueber JSON-RPC 2.0-Nachrichten zurueck.\n\n### Tools vs Resources vs Prompts\n\nMCP-Server koennen drei Arten von Faehigkeiten bereitstellen:\n\n- **Tools** sind Funktionen, die das AI-Modell aufrufen kann. Sie akzeptieren strukturierte Eingaben und geben strukturierte Ausgaben zurueck. Beispiel: `query_database(sql: string)` oder `send_email(to: string, subject: string, body: string)`.\n- **Resources** sind Daten, die das AI-Modell lesen kann. Sie werden durch URIs identifiziert und geben Inhalte zurueck. Beispiel: `file:\u002F\u002F\u002Fpath\u002Fto\u002Fdocument.md` oder `postgres:\u002F\u002Flocalhost\u002Fmydb\u002Fusers`.\n- **Prompts** sind wiederverwendbare Prompt-Vorlagen, die der Server bereitstellt. Sie helfen bei der Standardisierung der Interaktion der AI mit der Domaene des Servers. Beispiel: eine `summarize_ticket`-Vorlage fuer einen Jira MCP Server.\n\n## Schritt fuer Schritt: MCP-Server in TypeScript erstellen\n\nLassen Sie uns einen praktischen MCP-Server erstellen, der ein Tool zum Abfragen einer SQLite-Datenbank bereitstellt. Dies ist ein haeufiger Anwendungsfall: einem AI-Modell sicheren, schreibgeschuetzten Zugriff auf Ihre Anwendungsdaten zu geben.\n\n### Schritt 1: Projekt initialisieren\n\n```bash\nmkdir mcp-sqlite-server && cd mcp-sqlite-server\nnpm init -y\nnpm install @modelcontextprotocol\u002Fsdk better-sqlite3\nnpm install -D typescript @types\u002Fnode @types\u002Fbetter-sqlite3\nnpx tsc --init\n```\n\n`tsconfig.json` konfigurieren:\n\n```json\n{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"Node16\",\n    \"moduleResolution\": \"Node16\",\n    \"outDir\": \".\u002Fdist\",\n    \"rootDir\": \".\u002Fsrc\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"declaration\": true\n  },\n  \"include\": [\"src\u002F**\u002F*\"]\n}\n```\n\n### Schritt 2: Server implementieren\n\n`src\u002Findex.ts` erstellen:\n\n```typescript\nimport { McpServer } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js\";\nimport Database from \"better-sqlite3\";\nimport { z } from \"zod\";\n\nconst db = new Database(process.env.DB_PATH || \".\u002Fdata.db\", {\n  readonly: true,\n});\n\nconst server = new McpServer({\n  name: \"sqlite-query\",\n  version: \"1.0.0\",\n});\n\nserver.tool(\n  \"query\",\n  \"Fuehrt eine schreibgeschuetzte SQL-Abfrage auf der SQLite-Datenbank aus\",\n  {\n    sql: z.string().describe(\"Die auszufuehrende SQL SELECT-Abfrage\"),\n  },\n  async ({ sql }) => {\n    const normalized = sql.trim().toUpperCase();\n    if (!normalized.startsWith(\"SELECT\")) {\n      return {\n        content: [{ type: \"text\", text: \"Fehler: Nur SELECT-Abfragen sind erlaubt.\" }],\n        isError: true,\n      };\n    }\n    try {\n      const rows = db.prepare(sql).all();\n      return {\n        content: [{ type: \"text\", text: JSON.stringify(rows, null, 2) }],\n      };\n    } catch (error) {\n      return {\n        content: [{ type: \"text\", text: `Abfragefehler: ${(error as Error).message}` }],\n        isError: true,\n      };\n    }\n  }\n);\n\nserver.tool(\n  \"list_tables\",\n  \"Listet alle Tabellen in der Datenbank mit ihren Schemas auf\",\n  {},\n  async () => {\n    const tables = db\n      .prepare(\n        `SELECT name, sql FROM sqlite_master\n         WHERE type='table' AND name NOT LIKE 'sqlite_%'\n         ORDER BY name`\n      )\n      .all();\n    return {\n      content: [{ type: \"text\", text: JSON.stringify(tables, null, 2) }],\n    };\n  }\n);\n```\n\n### Schritt 3: Kompilieren und lokal testen\n\n```bash\nnpx tsc\necho '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-03-26\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"1.0\"}}}' | node dist\u002Findex.js\n```\n\nSie sollten eine JSON-RPC-Antwort mit den Faehigkeiten des Servers sehen.\n\n### Schritt 4: Denselben Server in Python erstellen\n\nFuer Python-Entwickler zeigen wir hier die aequivalente Implementierung mit dem offiziellen MCP Python SDK:\n\n```python\nimport sqlite3\nimport json\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"sqlite-query\")\nDB_PATH = \"data.db\"\n\n@mcp.tool()\ndef query(sql: str) -> str:\n    \"\"\"Fuehrt eine schreibgeschuetzte SQL-Abfrage auf der SQLite-Datenbank aus.\"\"\"\n    normalized = sql.strip().upper()\n    if not normalized.startswith(\"SELECT\"):\n        raise ValueError(\"Nur SELECT-Abfragen sind erlaubt.\")\n    conn = sqlite3.connect(DB_PATH)\n    conn.row_factory = sqlite3.Row\n    try:\n        cursor = conn.execute(sql)\n        rows = [dict(row) for row in cursor.fetchall()]\n        return json.dumps(rows, indent=2, default=str)\n    finally:\n        conn.close()\n\n@mcp.tool()\ndef list_tables() -> str:\n    \"\"\"Listet alle Tabellen in der Datenbank mit ihren Schemas auf.\"\"\"\n    conn = sqlite3.connect(DB_PATH)\n    conn.row_factory = sqlite3.Row\n    try:\n        cursor = conn.execute(\n            \"SELECT name, sql FROM sqlite_master \"\n            \"WHERE type='table' AND name NOT LIKE 'sqlite_%'\"\n        )\n        tables = [dict(row) for row in cursor.fetchall()]\n        return json.dumps(tables, indent=2)\n    finally:\n        conn.close()\n\nif __name__ == \"__main__\":\n    mcp.run(transport=\"stdio\")\n```\n\n## Verbindung mit Claude Desktop\n\nClaude Desktop unterstuetzt MCP-Server nativ. Um Ihren Server zu verbinden, bearbeiten Sie die Claude Desktop-Konfigurationsdatei:\n\n**macOS:** `~\u002FLibrary\u002FApplication Support\u002FClaude\u002Fclaude_desktop_config.json`\n**Windows:** `%APPDATA%\\Claude\\claude_desktop_config.json`\n\n```json\n{\n  \"mcpServers\": {\n    \"sqlite-query\": {\n      \"command\": \"node\",\n      \"args\": [\"\u002Fabsolute\u002Fpath\u002Fto\u002Fdist\u002Findex.js\"],\n      \"env\": {\n        \"DB_PATH\": \"\u002Fabsolute\u002Fpath\u002Fto\u002Fyour\u002Fdata.db\"\n      }\n    }\n  }\n}\n```\n\nStarten Sie Claude Desktop neu. Sie sehen ein Hammer-Symbol in der Chat-Oberflaeche, das verfuegbare MCP-Tools anzeigt. Jetzt koennen Sie Claude Fragen stellen wie „Welche Tabellen gibt es in der Datenbank?\" oder „Zeige mir die 10 neuesten Benutzer nach Registrierungsdatum\" und Claude wird Ihren MCP-Server verwenden, um die Datenbank direkt abzufragen.\n\n## Verbindung mit Cursor\n\nCursor unterstuetzt ebenfalls MCP-Server. Fuegen Sie die Konfiguration in `.cursor\u002Fmcp.json` im Stammverzeichnis Ihres Projekts hinzu:\n\n```json\n{\n  \"mcpServers\": {\n    \"sqlite-query\": {\n      \"command\": \"node\",\n      \"args\": [\".\u002Fdist\u002Findex.js\"],\n      \"env\": {\n        \"DB_PATH\": \".\u002Fdata.db\"\n      }\n    }\n  }\n}\n```\n\nNach dem Speichern starten Sie Cursor neu. Die MCP-Tools erscheinen im AI-Assistenten-Panel und koennen waehrend der Codegenerierung und Debugging-Sitzungen aufgerufen werden.\n\n## Testen und Debuggen Ihres MCP-Servers\n\n### Verwendung des MCP Inspector\n\nDer MCP Inspector ist das offizielle Debugging-Tool. Er bietet eine Web-Oberflaeche zur Interaktion mit Ihrem Server:\n\n```bash\nnpx @modelcontextprotocol\u002Finspector node dist\u002Findex.js\n```\n\nDies oeffnet eine Browser-Oberflaeche unter `http:\u002F\u002Flocalhost:5173`, wo Sie:\n\n- Alle registrierten Tools, Resources und Prompts anzeigen koennen\n- Tools mit benutzerdefinierten Eingaben aufrufen und Antworten ueberpruefen koennen\n- Den JSON-RPC-Nachrichtenstrom in Echtzeit ueberwachen koennen\n- Die Fehlerbehandlung durch Senden fehlerhafter Anfragen testen koennen\n\n### Haeufige Debugging-Probleme\n\n| Problem | Ursache | Loesung |\n|---------|---------|---------|\n| Server erscheint nicht in Claude Desktop | Konfigurationspfad oder JSON-Syntaxfehler | JSON validieren, absolute Pfade ueberpruefen |\n| Fehler „Tool not found\" | Tools nicht vor der Verbindung registriert | Tools vor dem Aufruf von `server.connect()` registrieren |\n| Timeout bei Tool-Aufrufen | Langandauernde Operation ohne Fortschritt | Fortschrittsbenachrichtigungen ueber `server.sendProgress()` hinzufuegen |\n| stderr-Ausgabe beschaedigt das Protokoll | console.log schreibt auf stdout (stdio-Transport) | `console.error()` fuer Logging bei stdio verwenden |\n| Verbindungsabbruch nach Inaktivitaet | Transport-Timeout | Heartbeat implementieren oder HTTP-Transport verwenden |\n\n## Best Practices fuer die Produktion\n\n1. **Eingabevalidierung**: Validieren und bereinigen Sie immer Tool-Eingaben. Verwenden Sie Zod-Schemas (TypeScript) oder Pydantic-Modelle (Python) fuer strenge Typueberpruefung.\n\n2. **Standardmaessig schreibgeschuetzt**: Beginnen Sie mit schreibgeschuetztem Zugriff. Fuegen Sie Schreibfaehigkeiten nur hinzu, wenn sie wirklich benoetigt werden, und fordern Sie immer eine Bestaetigung fuer destruktive Operationen an.\n\n3. **Fehlerbehandlung**: Geben Sie strukturierte Fehlermeldungen mit `isError: true` zurueck. Legen Sie niemals interne Stack-Traces oder Datenbank-Verbindungsstrings offen.\n\n4. **Protokollierung**: Protokollieren Sie alle Tool-Aufrufe mit Zeitstempel, Eingaben und Ausfuehrungsdauer. Verwenden Sie stderr fuer die Protokollierung (nicht stdout) bei stdio-Transport.\n\n5. **Ratenbegrenzung**: Implementieren Sie Tool-spezifische Ratenbegrenzungen, um zu verhindern, dass unkontrollierte AI-Schleifen Ihre Backend-Dienste ueberlasten.\n\n6. **Timeout**: Setzen Sie Ausfuehrungs-Timeouts fuer alle Tool-Handler. AI-Modelle koennen Tools aufrufen, die teure Abfragen ausloesen — schuetzen Sie Ihre Infrastruktur.\n\n7. **Umgebungstrennung**: Verwenden Sie Umgebungsvariablen fuer alle Konfigurationen. Codieren Sie niemals Datenbank-URLs, API-Schluessel oder Dateipfade fest ein.\n\n8. **Versionierung**: Verwenden Sie semantische Versionierung fuer Ihren MCP-Server. Der `initialize`-Handshake umfasst eine Versionsverhandlung — inkompatible Aenderungen erfordern einen Major-Versionsbump.\n\n## FAQ\n\n**F: Was ist der Unterschied zwischen MCP und Function Calling?**\nA: Function Calling (verwendet von OpenAI, Anthropic und anderen) definiert Tools inline in jeder API-Anfrage. MCP externalisiert Tool-Definitionen auf eigenstaendige Server, die von MCP-kompatiblen Hosts entdeckt und genutzt werden. Function Calling ist pro Anfrage; MCP ist ein persistentes Protokoll mit Stateful Sessions.\n\n**F: Kann ich MCP mit anderen Modellen als Claude verwenden?**\nA: Ja. MCP ist ein offenes Protokoll. OpenAI, Google DeepMind und Microsoft haben seit Anfang 2026 MCP-Unterstuetzung in ihre Plattformen integriert. Jede AI-Anwendung, die einen MCP Client implementiert, kann sich mit jedem MCP Server verbinden.\n\n**F: Ist MCP nur fuer lokale Tools?**\nA: Nein. Obwohl der stdio-Transport fuer lokale Server konzipiert ist, unterstuetzen die HTTP+SSE- und Streamable-HTTP-Transporte entfernte MCP-Server. Sie koennen einen MCP-Server als netzwerkzugaenglichen Cloud-Dienst bereitstellen.\n\n**F: Wie handhabt MCP die Authentifizierung?**\nA: Das Protokoll unterstuetzt OAuth 2.0 fuer entfernte Server. Lokale stdio-Server erben den Sicherheitskontext des Host-Prozesses. Fuer Enterprise-Deployments kann ein MCP-Gateway die Authentifizierung und Autorisierung zentralisieren.\n\n**F: Welche Sprachen koennen zum Erstellen eines MCP-Servers verwendet werden?**\nA: Offizielle SDKs sind fuer TypeScript, Python, Java, Kotlin, C# und Swift verfuegbar. Community-SDKs umfassen Rust, Go, Ruby und PHP. Das Protokoll ist sprachunabhaengig — jede Sprache, die JSON-RPC ueber stdio oder HTTP lesen\u002Fschreiben kann, kann einen MCP-Server implementieren.\n\n**F: Wie aktualisiert man einen MCP-Server ohne den Host neu zu starten?**\nA: MCP unterstuetzt Faehigkeitsaenderungs-Benachrichtigungen. Wenn sich die Tools Ihres Servers aendern, kann der Server eine `notifications\u002Ftools\u002Flist_changed`-Nachricht senden, die den Client auffordert, die Tool-Liste erneut abzurufen. Bei stdio-Servern muss der Host normalerweise neu gestartet werden. HTTP-Server koennen ohne Host-Neustart aktualisiert werden.","\u003Ch2 id=\"was-ist-das-model-context-protocol-mcp\">Was ist das Model Context Protocol (MCP)?\u003C\u002Fh2>\n\u003Cp>Das \u003Cstrong>Model Context Protocol (MCP)\u003C\u002Fstrong> ist ein offener Standard, der von Anthropic entwickelt wurde und definiert, wie AI-Anwendungen mit externen Datenquellen und Tools kommunizieren. Stellen Sie sich MCP als \u003Cstrong>USB-C fuer die AI-Integration\u003C\u002Fstrong> vor: So wie USB-C einen einzigen universellen Anschluss fuer Laden, Datenuebertragung und Bildschirmausgabe bietet, stellt MCP ein einziges universelles Protokoll bereit, um AI-Modelle mit Datenbanken, APIs, Dateisystemen und anderen Diensten zu verbinden. MCP eliminiert den Bedarf an individuellen Integrationen zwischen jeder AI-Anwendung und jedem Tool.\u003C\u002Fp>\n\u003Cp>Im Jahr 2026 ist MCP zum dominierenden Standard fuer die AI-Tool-Kommunikation geworden. Gartner prognostiziert, dass \u003Cstrong>40 % der Unternehmensanwendungen bis Ende 2026 AI-Agenten enthalten werden\u003C\u002Fstrong>, und MCP ist das Protokoll, das dies in grossem Massstab praktikabel macht. Vor MCP erforderte die Verbindung eines AI-Modells mit N Tools N individuelle Integrationen. Bei M AI-Anwendungen und N Tools benoetigte man M x N Integrationsadapter. MCP reduziert dies auf M + N: Jede AI-App implementiert einen MCP Client, jedes Tool implementiert einen MCP Server.\u003C\u002Fp>\n\u003Ch2 id=\"mcp-architektur-host-client-server-und-transport\">MCP-Architektur: Host, Client, Server und Transport\u003C\u002Fh2>\n\u003Cp>Das Verstaendnis der MCP-Architektur ist wesentlich, bevor Sie Code schreiben. Das Protokoll definiert vier Schluesselrollen:\u003C\u002Fp>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Komponente\u003C\u002Fth>\u003Cth>Rolle\u003C\u002Fth>\u003Cth>Beispiel\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>\u003Cstrong>Host\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Die AI-Anwendung, mit der Endbenutzer interagieren\u003C\u002Ftd>\u003Ctd>Claude Desktop, Cursor, VS Code Copilot\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Cstrong>Client\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Der MCP-Protokollhandler innerhalb des Hosts\u003C\u002Ftd>\u003Ctd>In die Host-Anwendung eingebaut\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Cstrong>Server\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Stellt Tools, Resources und Prompts ueber MCP bereit\u003C\u002Ftd>\u003Ctd>Ihr benutzerdefinierter Server (den wir erstellen)\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>\u003Cstrong>Transport\u003C\u002Fstrong>\u003C\u002Ftd>\u003Ctd>Die Kommunikationsschicht zwischen Client und Server\u003C\u002Ftd>\u003Ctd>stdio, HTTP+SSE, Streamable HTTP\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Cp>Der Kommunikationsfluss funktioniert folgendermassen:\u003C\u002Fp>\n\u003Col>\n\u003Cli>Der \u003Cstrong>Host\u003C\u002Fstrong> startet und initialisiert einen MCP \u003Cstrong>Client\u003C\u002Fstrong> fuer jeden konfigurierten Server.\u003C\u002Fli>\n\u003Cli>Der \u003Cstrong>Client\u003C\u002Fstrong> verbindet sich mit dem \u003Cstrong>Server\u003C\u002Fstrong> ueber einen \u003Cstrong>Transport\u003C\u002Fstrong> (stdio fuer lokal, HTTP fuer remote).\u003C\u002Fli>\n\u003Cli>Der \u003Cstrong>Client\u003C\u002Fstrong> sendet eine \u003Ccode>initialize\u003C\u002Fcode>-Anfrage und handelt Protokollversion und Faehigkeiten aus.\u003C\u002Fli>\n\u003Cli>Der \u003Cstrong>Server\u003C\u002Fstrong> antwortet mit seinen verfuegbaren \u003Cstrong>Tools\u003C\u002Fstrong>, \u003Cstrong>Resources\u003C\u002Fstrong> und \u003Cstrong>Prompts\u003C\u002Fstrong>.\u003C\u002Fli>\n\u003Cli>Wenn das AI-Modell externe Daten oder Aktionen benoetigt, ruft der \u003Cstrong>Client\u003C\u002Fstrong> die entsprechende Server-Methode auf.\u003C\u002Fli>\n\u003Cli>Der \u003Cstrong>Server\u003C\u002Fstrong> fuehrt die Operation aus und gibt Ergebnisse ueber JSON-RPC 2.0-Nachrichten zurueck.\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch3>Tools vs Resources vs Prompts\u003C\u002Fh3>\n\u003Cp>MCP-Server koennen drei Arten von Faehigkeiten bereitstellen:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>\u003Cstrong>Tools\u003C\u002Fstrong> sind Funktionen, die das AI-Modell aufrufen kann. Sie akzeptieren strukturierte Eingaben und geben strukturierte Ausgaben zurueck. Beispiel: \u003Ccode>query_database(sql: string)\u003C\u002Fcode> oder \u003Ccode>send_email(to: string, subject: string, body: string)\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Resources\u003C\u002Fstrong> sind Daten, die das AI-Modell lesen kann. Sie werden durch URIs identifiziert und geben Inhalte zurueck. Beispiel: \u003Ccode>file:\u002F\u002F\u002Fpath\u002Fto\u002Fdocument.md\u003C\u002Fcode> oder \u003Ccode>postgres:\u002F\u002Flocalhost\u002Fmydb\u002Fusers\u003C\u002Fcode>.\u003C\u002Fli>\n\u003Cli>\u003Cstrong>Prompts\u003C\u002Fstrong> sind wiederverwendbare Prompt-Vorlagen, die der Server bereitstellt. Sie helfen bei der Standardisierung der Interaktion der AI mit der Domaene des Servers. Beispiel: eine \u003Ccode>summarize_ticket\u003C\u002Fcode>-Vorlage fuer einen Jira MCP Server.\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch2 id=\"schritt-fuer-schritt-mcp-server-in-typescript-erstellen\">Schritt fuer Schritt: MCP-Server in TypeScript erstellen\u003C\u002Fh2>\n\u003Cp>Lassen Sie uns einen praktischen MCP-Server erstellen, der ein Tool zum Abfragen einer SQLite-Datenbank bereitstellt. Dies ist ein haeufiger Anwendungsfall: einem AI-Modell sicheren, schreibgeschuetzten Zugriff auf Ihre Anwendungsdaten zu geben.\u003C\u002Fp>\n\u003Ch3>Schritt 1: Projekt initialisieren\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">mkdir mcp-sqlite-server &amp;&amp; cd mcp-sqlite-server\nnpm init -y\nnpm install @modelcontextprotocol\u002Fsdk better-sqlite3\nnpm install -D typescript @types\u002Fnode @types\u002Fbetter-sqlite3\nnpx tsc --init\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>\u003Ccode>tsconfig.json\u003C\u002Fcode> konfigurieren:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"compilerOptions\": {\n    \"target\": \"ES2022\",\n    \"module\": \"Node16\",\n    \"moduleResolution\": \"Node16\",\n    \"outDir\": \".\u002Fdist\",\n    \"rootDir\": \".\u002Fsrc\",\n    \"strict\": true,\n    \"esModuleInterop\": true,\n    \"declaration\": true\n  },\n  \"include\": [\"src\u002F**\u002F*\"]\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Schritt 2: Server implementieren\u003C\u002Fh3>\n\u003Cp>\u003Ccode>src\u002Findex.ts\u003C\u002Fcode> erstellen:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-typescript\">import { McpServer } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fmcp.js\";\nimport { StdioServerTransport } from \"@modelcontextprotocol\u002Fsdk\u002Fserver\u002Fstdio.js\";\nimport Database from \"better-sqlite3\";\nimport { z } from \"zod\";\n\nconst db = new Database(process.env.DB_PATH || \".\u002Fdata.db\", {\n  readonly: true,\n});\n\nconst server = new McpServer({\n  name: \"sqlite-query\",\n  version: \"1.0.0\",\n});\n\nserver.tool(\n  \"query\",\n  \"Fuehrt eine schreibgeschuetzte SQL-Abfrage auf der SQLite-Datenbank aus\",\n  {\n    sql: z.string().describe(\"Die auszufuehrende SQL SELECT-Abfrage\"),\n  },\n  async ({ sql }) =&gt; {\n    const normalized = sql.trim().toUpperCase();\n    if (!normalized.startsWith(\"SELECT\")) {\n      return {\n        content: [{ type: \"text\", text: \"Fehler: Nur SELECT-Abfragen sind erlaubt.\" }],\n        isError: true,\n      };\n    }\n    try {\n      const rows = db.prepare(sql).all();\n      return {\n        content: [{ type: \"text\", text: JSON.stringify(rows, null, 2) }],\n      };\n    } catch (error) {\n      return {\n        content: [{ type: \"text\", text: `Abfragefehler: ${(error as Error).message}` }],\n        isError: true,\n      };\n    }\n  }\n);\n\nserver.tool(\n  \"list_tables\",\n  \"Listet alle Tabellen in der Datenbank mit ihren Schemas auf\",\n  {},\n  async () =&gt; {\n    const tables = db\n      .prepare(\n        `SELECT name, sql FROM sqlite_master\n         WHERE type='table' AND name NOT LIKE 'sqlite_%'\n         ORDER BY name`\n      )\n      .all();\n    return {\n      content: [{ type: \"text\", text: JSON.stringify(tables, null, 2) }],\n    };\n  }\n);\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch3>Schritt 3: Kompilieren und lokal testen\u003C\u002Fh3>\n\u003Cpre>\u003Ccode class=\"language-bash\">npx tsc\necho '{\"jsonrpc\":\"2.0\",\"id\":1,\"method\":\"initialize\",\"params\":{\"protocolVersion\":\"2025-03-26\",\"capabilities\":{},\"clientInfo\":{\"name\":\"test\",\"version\":\"1.0\"}}}' | node dist\u002Findex.js\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Sie sollten eine JSON-RPC-Antwort mit den Faehigkeiten des Servers sehen.\u003C\u002Fp>\n\u003Ch3>Schritt 4: Denselben Server in Python erstellen\u003C\u002Fh3>\n\u003Cp>Fuer Python-Entwickler zeigen wir hier die aequivalente Implementierung mit dem offiziellen MCP Python SDK:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-python\">import sqlite3\nimport json\nfrom mcp.server.fastmcp import FastMCP\n\nmcp = FastMCP(\"sqlite-query\")\nDB_PATH = \"data.db\"\n\n@mcp.tool()\ndef query(sql: str) -&gt; str:\n    \"\"\"Fuehrt eine schreibgeschuetzte SQL-Abfrage auf der SQLite-Datenbank aus.\"\"\"\n    normalized = sql.strip().upper()\n    if not normalized.startswith(\"SELECT\"):\n        raise ValueError(\"Nur SELECT-Abfragen sind erlaubt.\")\n    conn = sqlite3.connect(DB_PATH)\n    conn.row_factory = sqlite3.Row\n    try:\n        cursor = conn.execute(sql)\n        rows = [dict(row) for row in cursor.fetchall()]\n        return json.dumps(rows, indent=2, default=str)\n    finally:\n        conn.close()\n\n@mcp.tool()\ndef list_tables() -&gt; str:\n    \"\"\"Listet alle Tabellen in der Datenbank mit ihren Schemas auf.\"\"\"\n    conn = sqlite3.connect(DB_PATH)\n    conn.row_factory = sqlite3.Row\n    try:\n        cursor = conn.execute(\n            \"SELECT name, sql FROM sqlite_master \"\n            \"WHERE type='table' AND name NOT LIKE 'sqlite_%'\"\n        )\n        tables = [dict(row) for row in cursor.fetchall()]\n        return json.dumps(tables, indent=2)\n    finally:\n        conn.close()\n\nif __name__ == \"__main__\":\n    mcp.run(transport=\"stdio\")\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Ch2 id=\"verbindung-mit-claude-desktop\">Verbindung mit Claude Desktop\u003C\u002Fh2>\n\u003Cp>Claude Desktop unterstuetzt MCP-Server nativ. Um Ihren Server zu verbinden, bearbeiten Sie die Claude Desktop-Konfigurationsdatei:\u003C\u002Fp>\n\u003Cp>\u003Cstrong>macOS:\u003C\u002Fstrong> \u003Ccode>~\u002FLibrary\u002FApplication Support\u002FClaude\u002Fclaude_desktop_config.json\u003C\u002Fcode>\n\u003Cstrong>Windows:\u003C\u002Fstrong> \u003Ccode>%APPDATA%\\Claude\\claude_desktop_config.json\u003C\u002Fcode>\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"mcpServers\": {\n    \"sqlite-query\": {\n      \"command\": \"node\",\n      \"args\": [\"\u002Fabsolute\u002Fpath\u002Fto\u002Fdist\u002Findex.js\"],\n      \"env\": {\n        \"DB_PATH\": \"\u002Fabsolute\u002Fpath\u002Fto\u002Fyour\u002Fdata.db\"\n      }\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Starten Sie Claude Desktop neu. Sie sehen ein Hammer-Symbol in der Chat-Oberflaeche, das verfuegbare MCP-Tools anzeigt. Jetzt koennen Sie Claude Fragen stellen wie „Welche Tabellen gibt es in der Datenbank?“ oder „Zeige mir die 10 neuesten Benutzer nach Registrierungsdatum“ und Claude wird Ihren MCP-Server verwenden, um die Datenbank direkt abzufragen.\u003C\u002Fp>\n\u003Ch2 id=\"verbindung-mit-cursor\">Verbindung mit Cursor\u003C\u002Fh2>\n\u003Cp>Cursor unterstuetzt ebenfalls MCP-Server. Fuegen Sie die Konfiguration in \u003Ccode>.cursor\u002Fmcp.json\u003C\u002Fcode> im Stammverzeichnis Ihres Projekts hinzu:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-json\">{\n  \"mcpServers\": {\n    \"sqlite-query\": {\n      \"command\": \"node\",\n      \"args\": [\".\u002Fdist\u002Findex.js\"],\n      \"env\": {\n        \"DB_PATH\": \".\u002Fdata.db\"\n      }\n    }\n  }\n}\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Nach dem Speichern starten Sie Cursor neu. Die MCP-Tools erscheinen im AI-Assistenten-Panel und koennen waehrend der Codegenerierung und Debugging-Sitzungen aufgerufen werden.\u003C\u002Fp>\n\u003Ch2 id=\"testen-und-debuggen-ihres-mcp-servers\">Testen und Debuggen Ihres MCP-Servers\u003C\u002Fh2>\n\u003Ch3>Verwendung des MCP Inspector\u003C\u002Fh3>\n\u003Cp>Der MCP Inspector ist das offizielle Debugging-Tool. Er bietet eine Web-Oberflaeche zur Interaktion mit Ihrem Server:\u003C\u002Fp>\n\u003Cpre>\u003Ccode class=\"language-bash\">npx @modelcontextprotocol\u002Finspector node dist\u002Findex.js\n\u003C\u002Fcode>\u003C\u002Fpre>\n\u003Cp>Dies oeffnet eine Browser-Oberflaeche unter \u003Ccode>http:\u002F\u002Flocalhost:5173\u003C\u002Fcode>, wo Sie:\u003C\u002Fp>\n\u003Cul>\n\u003Cli>Alle registrierten Tools, Resources und Prompts anzeigen koennen\u003C\u002Fli>\n\u003Cli>Tools mit benutzerdefinierten Eingaben aufrufen und Antworten ueberpruefen koennen\u003C\u002Fli>\n\u003Cli>Den JSON-RPC-Nachrichtenstrom in Echtzeit ueberwachen koennen\u003C\u002Fli>\n\u003Cli>Die Fehlerbehandlung durch Senden fehlerhafter Anfragen testen koennen\u003C\u002Fli>\n\u003C\u002Ful>\n\u003Ch3>Haeufige Debugging-Probleme\u003C\u002Fh3>\n\u003Ctable>\u003Cthead>\u003Ctr>\u003Cth>Problem\u003C\u002Fth>\u003Cth>Ursache\u003C\u002Fth>\u003Cth>Loesung\u003C\u002Fth>\u003C\u002Ftr>\u003C\u002Fthead>\u003Ctbody>\n\u003Ctr>\u003Ctd>Server erscheint nicht in Claude Desktop\u003C\u002Ftd>\u003Ctd>Konfigurationspfad oder JSON-Syntaxfehler\u003C\u002Ftd>\u003Ctd>JSON validieren, absolute Pfade ueberpruefen\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Fehler „Tool not found“\u003C\u002Ftd>\u003Ctd>Tools nicht vor der Verbindung registriert\u003C\u002Ftd>\u003Ctd>Tools vor dem Aufruf von \u003Ccode>server.connect()\u003C\u002Fcode> registrieren\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Timeout bei Tool-Aufrufen\u003C\u002Ftd>\u003Ctd>Langandauernde Operation ohne Fortschritt\u003C\u002Ftd>\u003Ctd>Fortschrittsbenachrichtigungen ueber \u003Ccode>server.sendProgress()\u003C\u002Fcode> hinzufuegen\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>stderr-Ausgabe beschaedigt das Protokoll\u003C\u002Ftd>\u003Ctd>console.log schreibt auf stdout (stdio-Transport)\u003C\u002Ftd>\u003Ctd>\u003Ccode>console.error()\u003C\u002Fcode> fuer Logging bei stdio verwenden\u003C\u002Ftd>\u003C\u002Ftr>\n\u003Ctr>\u003Ctd>Verbindungsabbruch nach Inaktivitaet\u003C\u002Ftd>\u003Ctd>Transport-Timeout\u003C\u002Ftd>\u003Ctd>Heartbeat implementieren oder HTTP-Transport verwenden\u003C\u002Ftd>\u003C\u002Ftr>\n\u003C\u002Ftbody>\u003C\u002Ftable>\n\u003Ch2 id=\"best-practices-fuer-die-produktion\">Best Practices fuer die Produktion\u003C\u002Fh2>\n\u003Col>\n\u003Cli>\n\u003Cp>\u003Cstrong>Eingabevalidierung\u003C\u002Fstrong>: Validieren und bereinigen Sie immer Tool-Eingaben. Verwenden Sie Zod-Schemas (TypeScript) oder Pydantic-Modelle (Python) fuer strenge Typueberpruefung.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Standardmaessig schreibgeschuetzt\u003C\u002Fstrong>: Beginnen Sie mit schreibgeschuetztem Zugriff. Fuegen Sie Schreibfaehigkeiten nur hinzu, wenn sie wirklich benoetigt werden, und fordern Sie immer eine Bestaetigung fuer destruktive Operationen an.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Fehlerbehandlung\u003C\u002Fstrong>: Geben Sie strukturierte Fehlermeldungen mit \u003Ccode>isError: true\u003C\u002Fcode> zurueck. Legen Sie niemals interne Stack-Traces oder Datenbank-Verbindungsstrings offen.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Protokollierung\u003C\u002Fstrong>: Protokollieren Sie alle Tool-Aufrufe mit Zeitstempel, Eingaben und Ausfuehrungsdauer. Verwenden Sie stderr fuer die Protokollierung (nicht stdout) bei stdio-Transport.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Ratenbegrenzung\u003C\u002Fstrong>: Implementieren Sie Tool-spezifische Ratenbegrenzungen, um zu verhindern, dass unkontrollierte AI-Schleifen Ihre Backend-Dienste ueberlasten.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Timeout\u003C\u002Fstrong>: Setzen Sie Ausfuehrungs-Timeouts fuer alle Tool-Handler. AI-Modelle koennen Tools aufrufen, die teure Abfragen ausloesen — schuetzen Sie Ihre Infrastruktur.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Umgebungstrennung\u003C\u002Fstrong>: Verwenden Sie Umgebungsvariablen fuer alle Konfigurationen. Codieren Sie niemals Datenbank-URLs, API-Schluessel oder Dateipfade fest ein.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003Cli>\n\u003Cp>\u003Cstrong>Versionierung\u003C\u002Fstrong>: Verwenden Sie semantische Versionierung fuer Ihren MCP-Server. Der \u003Ccode>initialize\u003C\u002Fcode>-Handshake umfasst eine Versionsverhandlung — inkompatible Aenderungen erfordern einen Major-Versionsbump.\u003C\u002Fp>\n\u003C\u002Fli>\n\u003C\u002Fol>\n\u003Ch2 id=\"faq\">FAQ\u003C\u002Fh2>\n\u003Cp>\u003Cstrong>F: Was ist der Unterschied zwischen MCP und Function Calling?\u003C\u002Fstrong>\nA: Function Calling (verwendet von OpenAI, Anthropic und anderen) definiert Tools inline in jeder API-Anfrage. MCP externalisiert Tool-Definitionen auf eigenstaendige Server, die von MCP-kompatiblen Hosts entdeckt und genutzt werden. Function Calling ist pro Anfrage; MCP ist ein persistentes Protokoll mit Stateful Sessions.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>F: Kann ich MCP mit anderen Modellen als Claude verwenden?\u003C\u002Fstrong>\nA: Ja. MCP ist ein offenes Protokoll. OpenAI, Google DeepMind und Microsoft haben seit Anfang 2026 MCP-Unterstuetzung in ihre Plattformen integriert. Jede AI-Anwendung, die einen MCP Client implementiert, kann sich mit jedem MCP Server verbinden.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>F: Ist MCP nur fuer lokale Tools?\u003C\u002Fstrong>\nA: Nein. Obwohl der stdio-Transport fuer lokale Server konzipiert ist, unterstuetzen die HTTP+SSE- und Streamable-HTTP-Transporte entfernte MCP-Server. Sie koennen einen MCP-Server als netzwerkzugaenglichen Cloud-Dienst bereitstellen.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>F: Wie handhabt MCP die Authentifizierung?\u003C\u002Fstrong>\nA: Das Protokoll unterstuetzt OAuth 2.0 fuer entfernte Server. Lokale stdio-Server erben den Sicherheitskontext des Host-Prozesses. Fuer Enterprise-Deployments kann ein MCP-Gateway die Authentifizierung und Autorisierung zentralisieren.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>F: Welche Sprachen koennen zum Erstellen eines MCP-Servers verwendet werden?\u003C\u002Fstrong>\nA: Offizielle SDKs sind fuer TypeScript, Python, Java, Kotlin, C# und Swift verfuegbar. Community-SDKs umfassen Rust, Go, Ruby und PHP. Das Protokoll ist sprachunabhaengig — jede Sprache, die JSON-RPC ueber stdio oder HTTP lesen\u002Fschreiben kann, kann einen MCP-Server implementieren.\u003C\u002Fp>\n\u003Cp>\u003Cstrong>F: Wie aktualisiert man einen MCP-Server ohne den Host neu zu starten?\u003C\u002Fstrong>\nA: MCP unterstuetzt Faehigkeitsaenderungs-Benachrichtigungen. Wenn sich die Tools Ihres Servers aendern, kann der Server eine \u003Ccode>notifications\u002Ftools\u002Flist_changed\u003C\u002Fcode>-Nachricht senden, die den Client auffordert, die Tool-Liste erneut abzurufen. Bei stdio-Servern muss der Host normalerweise neu gestartet werden. HTTP-Server koennen ohne Host-Neustart aktualisiert werden.\u003C\u002Fp>\n","de","b0000000-0000-0000-0000-000000000001",true,"2026-03-28T10:44:39.323374Z","Schritt-fuer-Schritt-Tutorial zum Erstellen eines MCP-Servers in TypeScript und Python. Verbinden Sie ihn mit Claude Desktop oder Cursor, testen Sie mit dem MCP Inspector und deployen Sie in die Produktion.","mcp server tutorial",null,"index, follow",[21,26],{"id":22,"name":23,"slug":24,"created_at":25},"c0000000-0000-0000-0000-000000000008","AI","ai","2026-03-28T10:44:21.513630Z",{"id":27,"name":28,"slug":29,"created_at":25},"c0000000-0000-0000-0000-000000000002","TypeScript","typescript","Ingenieurwesen",[32,38,44],{"id":33,"title":34,"slug":35,"excerpt":36,"locale":12,"category_name":30,"published_at":37},"d0000000-0000-0000-0000-000000000680","Warum Bali 2026 zum Impact-Tech-Hub Südostasiens wird","warum-bali-2026-impact-tech-hub-suedostasiens","Bali rangiert auf Platz 16 unter den Startup-Ökosystemen Südostasiens. Mit einer wachsenden Konzentration von Web3-Entwicklern, AI-Nachhaltigkeits-Startups und Eco-Travel-Tech-Unternehmen formt die Insel ihre Nische als Impact-Tech-Hauptstadt der Region.","2026-03-28T10:44:49.720230Z",{"id":39,"title":40,"slug":41,"excerpt":42,"locale":12,"category_name":30,"published_at":43},"d0000000-0000-0000-0000-000000000679","ASEAN-Datenschutz-Flickenteppich: Compliance-Checkliste für Entwickler","asean-datenschutz-flickenteppich-compliance-checkliste-entwickler","Sieben ASEAN-Länder verfügen mittlerweile über umfassende Datenschutzgesetze mit unterschiedlichen Einwilligungsmodellen, Lokalisierungsanforderungen und Sanktionsstrukturen. Eine praktische Compliance-Checkliste für Entwickler.","2026-03-28T10:44:49.715484Z",{"id":45,"title":46,"slug":47,"excerpt":48,"locale":12,"category_name":30,"published_at":49},"d0000000-0000-0000-0000-000000000678","Indonesias 29-Milliarden-Dollar-Digitaltransformation: Chancen für Softwareunternehmen","indonesias-29-milliarden-dollar-digitaltransformation-chancen-softwareunternehmen","Indonesias IT-Dienstleistungsmarkt wird voraussichtlich 2026 29,03 Milliarden Dollar erreichen, gegenüber 24,37 Milliarden im Jahr 2025. Cloud-Infrastruktur, AI, E-Commerce und Rechenzentren treiben das schnellste Wachstum in Südostasien.","2026-03-28T10:44:49.697275Z",{"id":13,"name":51,"slug":52,"bio":53,"photo_url":18,"linkedin":18,"role":54,"created_at":55,"updated_at":55},"Open Soft Team","open-soft-team","The engineering team at Open Soft, building premium software solutions from Bali, Indonesia.","Engineering Team","2026-03-28T08:31:22.226811Z"]