Deutsche Telekom IT GmbH

MCP Security

Deploying Model Context Protocol Safely in the Enterprise Model Context Protocol sicher im Unternehmen einsetzen

Kai Kreuzer · Deutsche Telekom IT GmbH · kai.kreuzer@telekom.de

What is MCP? Was ist MCP?

An open standard by Anthropic (Nov 2024) for connecting AI agents to external tools and data sources via JSON-RPC 2.0. Ein offener Standard von Anthropic (Nov. 2024) für die Verbindung von KI-Agenten mit externen Tools und Datenquellen über JSON-RPC 2.0.

MCP Host Claude Desktop VS Code, Cursor, AI Agent MCP Client JSON-RPC 2.0 stdio / HTTP+SSE MCP Server 🔧 Tools 📦 Resources 💬 Prompts

Growing Fast Wächst schnell

10,000+
Community MCP Servers Community-MCP-Server
6
Months to ecosystem Monate bis zum Ökosystem
1
De-facto standard De-facto-Standard

Security Was an Afterthought Sicherheit war ein Nachgedanke

Nov 2024
MCP spec released MCP-Spezifikation veröffentlicht
Jan 2025
Claude Desktop & major IDE integration Claude Desktop & IDE-Integration
Mar 2025
Ecosystem boom: thousands of servers Ökosystem-Boom: Tausende von Servern
Mar 2025
OAuth 2.1 added to spec OAuth 2.1 zur Spec hinzugefügt

Security was bolted on after the ecosystem already existed. Sicherheit wurde nachträglich aufgesetzt, als das Ökosystem schon existierte.

How MCP Connects Wie MCP sich verbindet

LLM App MCP Client MCP Server initialize initialize response initialize-Antwort initialized

How MCP Exposes Tools Wie MCP Tools bereitstellt

LLM App MCP Client MCP Server tools/list tool objects array Tool-Objekte Array name: "get_employee_data" description: "…any text…" inputSchema: { … }

How MCP Executes Tools Wie MCP Tools ausführt

LLM App MCP Client MCP Server tools/call execute… ausführen… content array content Array [get_employee_data] { name: "Alice", id: "EMP001" }

MCP Extends Your Prompt MCP erweitert deinen Prompt

MCP has no sandbox. It adds text to the LLM's context window — from external, potentially untrusted sources. MCP hat keine Sandbox. Es fügt Text aus externen, potenziell nicht vertrauenswürdigen Quellen in das Kontextfenster des LLM ein.

LLM Context Window LLM-Kontextfenster
System You are a helpful HR assistant… Du bist ein hilfreicher HR-Assistent…
MCP get_employee_data(id: string): Returns employee records for the given ID.
User Who is employee EMP001? Wer ist Mitarbeiter EMP001?
① LLM Response ① LLM-Antwort
Call get_employee_data({ id: "EMP001" })
Tool Execution Tool-Ausführung
Result { name: "Alice", id: "EMP001" } { name: "Alice", id: "EMP001" }
② LLM Response ② LLM-Antwort
Assistant Employee EMP001 is Alice. Mitarbeiter EMP001 ist Alice.
🖥️

Live Demo Live-Demo

Demonstrates attacks on MCP servers and how they manipulate AI agent behavior. Demonstriert Angriffe auf MCP-Server und wie sie das Verhalten von KI-Agenten manipulieren.

Defense Principles Abwehrprinzipien

1

Zero Trust for Tool Outputs Zero Trust für Tool-Ausgaben

Sanitize every tool response before feeding it to the LLM context. Jede Tool-Antwort bereinigen, bevor sie dem LLM-Kontext zugeführt wird.

2

Least Privilege Least Privilege

Each MCP server gets only the permissions it needs — no cross-server authority. Jeder MCP-Server erhält nur die nötigen Berechtigungen — keine serverübergreifende Autorität.

3

Human in the Loop Human in the Loop

Explicit confirmation before any write, send, or delete — regardless of agent confidence. Explizite Bestätigung vor Schreiben, Senden oder Löschen — unabhängig vom Vertrauen des Agenten.

A Secure Architecture Eine sichere Architektur

👤 User / IDE Nutzer 🤖 Agent Host LLM App MCP GATEWAY MCP GATEWAY 🔍 auditprüfen 🧹 sanitizebereinigen 🔒 enforcedurchsetzen 📋 logprotokollieren 🔑 authenticateauthentifizieren MCP SERVERS MCP-SERVER ✅ HR ✅ Calendar ✅ Kalender ✅ Documents ✅ Dokumente verified · scoped · audited geprüft · begrenzt · auditiert

Authentication via the Gateway Authentifizierung über das Gateway

🤖 Agent Host LLM App Client Credentials Client Credentials OAuth 2.1 (M2M) + X-Identity-Header (optional, user context) (optional, Nutzerkontext) MCP GATEWAY ✔ verify client credentials ✔ Client-Credentials prüfen ✔ enforce access policy ✔ Zugriffsrichtlinie durchsetzen ✔ attach gateway token ✔ Gateway-Token anhängen ✔ forward X-Identity-Header ✔ X-Identity-Header weiterleiten gateway token Gateway-Token + X-Identity-Header (optional, user context) (optional, Nutzerkontext) MCP SERVERS MCP-SERVER ✔ verify gateway token ✔ Gateway-Token prüfen ✔ authorize via ✔ autorisieren via X-Identity-Header (if user context needed) (bei Nutzerkontextbedarf)

Problems with this approach Probleme dieses Ansatzes

  • Client Credentials flow is not yet part of the MCP spec.Der Client-Credentials-Flow ist noch nicht Teil der MCP-Spec.
  • MCP servers must be adapted to validate the gateway token and evaluate the X-Identity-Header.MCP-Server müssen angepasst werden, um Gateway-Token und X-Identity-Header auszuwerten.
  • For downstream services, the MCP server may need to perform a token exchange.Für Downstream-Dienste muss der MCP-Server ggf. einen Tokentausch durchführen.

The IDE Auth Problem Das IDE-Auth-Problem

Every coding assistant implements OAuth 2.1 differently — making it hard to support all clients from one MCP server. Jeder Coding-Assistent implementiert OAuth anders — was es schwierig macht, alle Clients von einem MCP-Server zu unterstützen.

🐙 GitHub Copilot
≠
⚡ Claude Code
≠
🤖 Codex CLI
≠
💎 Gemini CLI

🚫 No OAuth Client ID 🚫 Keine OAuth-Client-ID

Local IDEs have no pre-registered client ID — no standard way to identify them. Lokale IDEs haben keine vorregistrierte Client-ID — kein Standard zur Identifikation.

📜 Dynamic Client Registration 📜 Dynamische Client-Registrierung

Was the workaround — already deprecated. Successor (Client ID Metadata Documents) still an IETF draft. War der Workaround — bereits deprecated. Nachfolger (Client ID Metadata Documents) noch ein IETF-Entwurf.

Solving IDE Auth: the h2m Service IDE-Auth lösen: der h2m-Dienst

An optional h2m service bridges human SSO identity into the MCP flow. Ein optionaler h2m-Dienst überbrückt die menschliche SSO-Identität in den MCP-Ablauf.

💻 IDE / Client MCP-Auth h2m human identity menschl. Identität ↓ X-Identity-Header m2m token m2m-Token X-Identity-Header MCP GATEWAY 🔍 auditprüfen 🧹 sanitizebereinigen 📋 logprotokollieren gateway token Gateway-Token X-Identity-Header MCP SERVERS MCP-SERVER ✅ HR ✅ Calendar ✅ Kalender ✅ Documents ✅ Dokumente

More Structural Problems Weitere strukturelle Probleme

⚡ Elicitation ⚡ Elicitation

Requires interactive user input — headless agents running unattended cannot respond to elicitation requests. Erfordert interaktive Benutzereingaben — Headless-Agents, die unbeaufsichtigt laufen, können Elicitation-Anfragen nicht beantworten.

🔄 Sampling 🔄 Sampling

Reverts the client-server architecture — the server calls back into the client LLM, bypassing all control and audit mechanisms. Kehrt die Client-Server-Architektur um — der Server ruft das Client-LLM zurück und umgeht dabei alle Kontroll- und Audit-Mechanismen.

📌 Sessions 📌 Sessions

Requires stateful implementations and sticky routing in the proxy — problematic for high availability and load balancing. Erfordert zustandsbehaftete Implementierungen und Sticky-Routing im Proxy — schwierig für High Availability und Load-Balancing.

🔍 JSON-RPC Routing 🔍 JSON-RPC-Routing

Requires payload inspection to route requests — unlike REST APIs where the URL alone determines the route. Erfordert Payload-Inspektion für das Routing — anders als bei REST-APIs, bei denen die URL allein die Route bestimmt.

The Spec Is Catching Up Die Spezifikation holt auf

🪪

MCP Server Cards (SEP-2127) MCP Server Cards (SEP-2127)

Signed manifests aim to reduce rug pulls — once adopted and enforced by clients, servers can no longer silently swap their tool list. Signierte Manifeste sollen Rug Pulls eindämmen — sobald sie verabschiedet und von Clients durchgesetzt werden, können Server ihre Tool-Liste nicht mehr heimlich austauschen.

🔀

HTTP Header Standardization (SEP-2243) HTTP Header Standardization (SEP-2243)

Standard HTTP transport enables proper middle boxes — proxies and gateways can route MCP traffic without payload inspection. Standardisierter HTTP-Transport ermöglicht echte Middle Boxes — Proxies können MCP-Traffic routen ohne Payload-Inspektion.

🔑

OAuth Client Credentials Flow (SEP-1046) OAuth Client Credentials Flow (SEP-1046)

Adds M2M authentication support to the MCP spec — enabling agents and gateways to authenticate without user interaction via OAuth 2.1 Client Credentials. Fügt M2M-Authentifizierung zur MCP-Spec hinzu — ermöglicht Agents und Gateways die Authentifizierung ohne Nutzerinteraktion via OAuth 2.1 Client Credentials.

🏢

Enterprise-Managed Authorization (SEP-990) Enterprise-Managed Authorization (SEP-990)

Enterprises centrally control which MCP servers users may access. Via IdP authentication and ID-JAG token exchange, access is granted automatically — without manual approval per server. Unternehmen steuern zentral, auf welche MCP-Server Nutzer zugreifen dürfen. Über IdP-Authentifizierung und ID-JAG-Token-Austausch wird der Zugriff automatisch gewährt — ohne manuelle Freigabe pro Server.

What's Still Missing Was noch fehlt

🏷️

No tool-description sanitization Keine Sanitization von Tool-Beschreibungen

Descriptions are passed to the LLM verbatim — hidden instructions or zero-width Unicode go through undetected. Beschreibungen landen unverändert im LLM — versteckte Anweisungen oder Zero-Width-Unicode bleiben unentdeckt.

🧼

No tool-output sanitization standard Kein Standard für Tool-Output-Sanitization

Tool results flow directly into the context window — prompt injections ride along unchecked. Tool-Ergebnisse landen direkt im Kontextfenster — Prompt Injections reisen ungeprüft mit.

🏷️

No tool namespacing Kein Tool-Namespacing

Names collide across servers — a rogue server can silently shadow tools of a trusted one. Namen kollidieren zwischen Servern — ein bösartiger Server kann Tools eines vertrauenswürdigen verdecken.

🧱

No cross-server isolation Keine serverübergreifende Isolation

One server's response can trigger tools of another — perfect vehicle for exfiltration chains. Die Antwort eines Servers kann Tools anderer Server auslösen — ideales Vehikel für Exfiltrations-Ketten.

🔏

No signed / pinned server identity Keine signierten, pinbaren Server-Identitäten

SEP-2127 is still a proposal — pinning and enforcement remain the client's problem, so rug pulls stay possible. SEP-2127 ist noch Vorschlag — Pinning und Durchsetzung bleiben Client-Sache, Rug Pulls bleiben möglich.

✋

No enforceable read / write semantics Keine durchsetzbare Read/Write-Semantik

readOnlyHint and destructiveHint are only hints — each client decides whether to require confirmation for destructive calls. readOnlyHint und destructiveHint sind nur Hinweise — jeder Client entscheidet selbst, ob er bei destruktiven Aufrufen bestätigen lässt.

Three Things to Remember Drei Dinge zum Merken

1

MCP is powerful and insecure by default. The protocol delegates security entirely to the implementation. MCP ist mächtig und standardmäßig unsicher. Das Protokoll delegiert Sicherheit vollständig an die Implementierung.

2

All MCP content is prompt input. Sanitize it. Same principles as SQL injection prevention — applied to LLM context. Alle MCP-Inhalte sind Prompt-Eingaben. Bereinige sie. Gleiche Prinzipien wie SQL-Injection-Schutz — angewendet auf den LLM-Kontext.

3

Build a security layer, not just security checks. A proxy between agent and servers enforces policy centrally. Baue eine Sicherheitsschicht, nicht nur Sicherheitsprüfungen. Ein Proxy zwischen Agent und Servern setzt Richtlinien zentral durch.

Thank You! Danke!

QR code linking to github.com/telekom/mcp-security

github.com/telekom/mcp-security

Interactive demo · Source code Interaktive Demo · Quellcode

Kai Kreuzer · Deutsche Telekom IT GmbH · kai.kreuzer@telekom.de

Slides: CC BY-SA 4.0 · Code: MIT Folien: CC BY-SA 4.0 · Code: MIT