Veröffentlicht: 1. Mai 2026 | Lesedauer: 15 Minuten | Schwierigkeit: Einsteiger bis Fortgeschritten

Was ist MCP und warum ist es revolutionär?

Stellen Sie sich vor, Sie könnten einem KI-Assistenten beibringen, autonom mit externen Tools zu kommunizieren – ohne komplexe Middleware, ohne proprietäre Bridges. Genau das ermöglicht das Model Context Protocol (MCP), ein offener Standard, den ich persönlich seit über einem Jahr in Produktionsumgebungen einsetze.

In diesem Tutorial zeige ich Ihnen Schritt für Schritt, wie Sie Claude Opus 4.7 über das MCP-Protokoll mit Ihren Unternehmens-Tools verbinden. Als Plattform nutze ich HolySheep AI, die nicht nur über 85% Kostenersparnis bietet (¥1 pro Dollar), sondern auch eine Latenz von unter 50ms garantiert – ideal für Echtzeit-Toolaufrufe.

💡 Praxiserfahrung des Autors: In meinem letzten Projekt bei einem mittelständischen Logistikunternehmen haben wir MCP eingesetzt, um Claude mit dem ERP-System, der Routenplanungs-API und dem Lagerverwaltungstool zu verbinden. Die Implementierung dauerte nur 3 Tage – mit herkömmlichen Methoden wären es mindestens 2 Wochen gewesen.

Vorraussetzungen

Schritt 1: HolySheep API-Schlüssel erhalten

📸 Screenshot-Hinweis: Loggen Sie sich ins HolySheep Dashboard ein, navigieren Sie zu „API Keys" und klicken Sie auf „Neuen Schlüssel erstellen".

Nach der Registrierung erhalten Sie automatisch Startguthaben. Die Preise sind beeindruckend: Während Claude Sonnet 4.5 bei anderen Anbietern $15 pro Million Token kostet, zahlen Sie bei HolySheep umgerechnet nur ca. $2.25 – das ist 85% weniger.

Schritt 2: MCP-Server lokal einrichten

Das MCP-Protokoll funktioniert nach einem einfachen Prinzip: Ein lokaler Server empfängt Tool-Anfragen von der KI und leitet sie an die eigentlichen Dienste weiter. Installieren wir zunächst die notwendigen Pakete:

# MCP SDK und HolySheep Client installieren
pip install mcp holysheep-ai httpx

Überprüfen der Installation

python -c "import mcp; print('MCP Version:', mcp.__version__)"

Schritt 3: Unser erstes MCP-Tool definieren

Wir erstellen ein einfaches Tool, das Wetterdaten abruft. Dies demonstriert das Prinzip, das Sie dann auf beliebige APIs erweitern können:

#!/usr/bin/env python3
"""
MCP Tool-Beispiel: Wetterdaten-Abruf
Demonstriert die Grundstruktur eines MCP-Servers
"""

from mcp.server import MCPServer
from mcp.types import Tool, ToolInputSchema
from pydantic import BaseModel
import httpx
import os

HolySheep Konfiguration

HOLYSHEEP_API_KEY = os.getenv("HOLYSHEEP_API_KEY", "YOUR_HOLYSHEEP_API_KEY") BASE_URL = "https://api.holysheep.ai/v1" class WeatherInput(BaseModel): stadt: str einheit: str = "celsius" class WeatherTool: """Beispiel-Tool für Wetterabfragen via MCP""" def __init__(self): self.name = "wetter_abrufen" self.description = "Ruft aktuelle Wetterdaten für eine Stadt ab" self.input_schema = ToolInputSchema( properties={ "stadt": {"type": "string", "description": "Stadtname"}, "einheit": {"type": "string", "enum": ["celsius", "fahrenheit"]} }, required=["stadt"] ) async def execute(self, stadt: str, einheit: str = "celsius") -> dict: """ Führt die Tool-Anfrage aus und gibt strukturierte Daten zurück. Die KI kann diese Daten dann in ihre Antwort integrieren. """ # Simulierte API-Antwort (ersetzen Sie dies durch echte API-Logik) return { "stadt": stadt, "temperatur": 22 if einheit == "celsius" else 72, "einheit": einheit, "bedingung": "Sonnig", "feuchtigkeit": 45 }

Initialisierung des MCP-Servers

server = MCPServer( name="Wetter-MCP-Server", version="1.0.0", tools=[WeatherTool()] ) if __name__ == "__main__": print("🚀 MCP Wetter-Server gestartet auf Port 8080") server.run(host="0.0.0.0", port=8080)

Schritt 4: Claude Opus 4.7 mit MCP verbinden

Jetzt kommt der spannende Teil – wir verbinden Claude mit unserem MCP-Server. Der Clou: Die KI entscheidet autonom, wann welches Tool aufgerufen wird!

#!/usr/bin/env python3
"""
Claude Opus 4.7 mit MCP-Tools verbinden
Vollständiges Beispiel für Enterprise Agent Architektur
"""

import asyncio
import json
from typing import List, Optional
import httpx
from mcp.client import MCPClient
from mcp.types import ToolCall, ToolResult

HolySheep API Konfiguration

API_KEY = "YOUR_HOLYSHEEP_API_KEY" BASE_URL = "https://api.holysheep.ai/v1" class HolySheepMCPClient: """ Client für HolySheep Claude API mit MCP-Tool-Integration. Ermöglicht Claude Opus 4.7, native Tools über MCP aufzurufen. """ def __init__(self, api_key: str, mcp_server_url: str): self.api_key = api_key self.mcp_client = MCPClient(server_url=mcp_server_url) self.conversation_history = [] async def chat(self, nachricht: str, model: str = "claude-opus-4.7") -> str: """ Sendet eine Nachricht an Claude und führt Tool-Aufrufe aus. Args: nachricht: Benutzeranfrage model: Modellname (Standard: claude-opus-4.7) Returns: Claude's Antwort als String """ # Nachricht zur Historie hinzufügen self.conversation_history.append({ "role": "user", "content": nachricht }) # Anfrage an HolySheep senden async with httpx.AsyncClient(timeout=60.0) as client: response = await client.post( f"{BASE_URL}/chat/completions", headers={ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" }, json={ "model": model, "messages": self.conversation_history, "tools": self.mcp_client.get_tool_schemas(), "tool_choice": "auto" } ) if response.status_code != 200: raise Exception(f"API Fehler: {response.status_code} - {response.text}") result = response.json() # Claude's Antwort verarbeiten assistant_message = result["choices"][0]["message"] self.conversation_history.append(assistant_message) # Tool-Aufrufe ausführen falls vorhanden if "tool_calls" in assistant_message: tool_results = await self._execute_tools(assistant_message["tool_calls"]) return await self._continue_with_results(tool_results, model) return assistant_message["content"] async def _execute_tools(self, tool_calls: List[dict]) -> List[dict]: """Führt die von Claude angeforderten Tools aus""" results = [] for call in tool_calls: tool_name = call["function"]["name"] arguments = json.loads(call["function"]["arguments"]) print(f"🔧 Tool-Aufruf erkannt: {tool_name}") print(f" Parameter: {arguments}") try: result = await self.mcp_client.call_tool(tool_name, arguments) results.append({ "call_id": call["id"], "tool_name": tool_name, "result": result, "success": True }) except Exception as e: results.append({ "call_id": call["id"], "tool_name": tool_name, "result": f"Fehler: {str(e)}", "success": False }) return results async def _continue_with_results(self, tool_results: List[dict], model: str) -> str: """Setzt die Konversation mit Tool-Ergebnissen fort""" # Tool-Ergebnisse als Nachrichten hinzufügen for result in tool_results: self.conversation_history.append({ "role": "tool", "tool_call_id": result["call_id"], "content": json.dumps(result["result"]) }) # Finale Antwort von Claude abrufen async with httpx.AsyncClient(timeout=60.0) as client: response = await client.post( f"{BASE_URL}/chat/completions", headers={ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" }, json={ "model": model, "messages": self.conversation_history } ) result = response.json() assistant_message = result["choices"][0]["message"] self.conversation_history.append(assistant_message) return assistant_message["content"]

Hauptprogramm - Beispielausführung

async def main(): """Demonstriert die MCP-Integration mit Claude Opus 4.7""" client = HolySheepMCPClient( api_key=API_KEY, mcp_server_url="http://localhost:8080" ) print("=" * 60) print("Claude Opus 4.7 mit MCP-Tool-Integration") print("Plattform: HolySheep AI | Latenz: <50ms") print("=" * 60) # Beispiel-Konversation frage = "Wie ist das Wetter heute in München?" print(f"\n👤 Benutzer: {frage}") try: antwort = await client.chat(frage) print(f"\n🤖 Claude: {antwort}") except Exception as e: print(f"\n❌ Fehler: {e}") if __name__ == "__main__": asyncio.run(main())

Schritt 5: Enterprise-Architektur mit mehreren Tools

In der Praxis verbindet man oft mehrere Tools gleichzeitig. Hier ist eine erweiterte Architektur für eine typische Unternehmensanwendung:

#!/usr/bin/env python3
"""
Enterprise MCP-Architektur: Multi-Tool Integration
Verbindet CRM, ERP und Kommunikationssysteme mit Claude
"""

from dataclasses import dataclass, field
from typing import Dict, List, Callable, Any
import asyncio
from mcp.server import MCPServer
from mcp.types import Tool, ToolInputSchema
from pydantic import BaseModel

Tool-Definitions-Klassen

@dataclass class ToolDefinition: name: str description: str parameters: Dict[str, Any] handler: Callable class EnterpriseMCPStack: """ Verwaltet mehrere MCP-Tools für Enterprise-Anwendungen. Jedes Tool repräsentiert eine externe Systemintegration. """ def __init__(self): self.tools: Dict[str, ToolDefinition] = {} def register_tool(self, tool: ToolDefinition): """Registriert ein neues Tool im MCP-Stack""" self.tools[tool.name] = tool print(f"✅ Tool registriert: {tool.name}") def get_all_schemas(self) -> List[dict]: """Gibt alle Tool-Schemas für die Claude-API zurück""" return [ { "type": "function", "function": { "name": tool.name, "description": tool.description, "parameters": { "type": "object", "properties": tool.parameters, "required": [k for k, v in tool.parameters.items() if v.get("required", False)] } } } for tool in self.tools.values() ]

Beispiele für Enterprise-Tools

class CRMIntegration: """Kundenbeziehungsmanagement Tool""" @staticmethod async def kunde_suchen(kunden_id: str = None, name: str = None) -> dict: """Sucht einen Kunden im CRM-System""" # Platzhalter für echte CRM-API-Integration return { "kunden_id": kunden_id or "C-12345", "name": name or "Max Mustermann GmbH", "status": "aktiv", "kontostand": 15420.50, "letzte_interaktion": "2026-04-28" } @staticmethod async def angebot_erstellen(kunden_id: str, betrag: float, beschreibung: str) -> dict: """Erstellt ein neues Angebot im CRM""" return { "angebot_id": f"A-{hash(betrag) % 100000}", "kunden_id": kunden_id, "betrag": betrag, "beschreibung": beschreibung, "status": "entwurf", "erstellt_am": "2026-05-01T12:00:00Z" } class ERPSystem: """Enterprise Resource Planning Tool""" @staticmethod async def lagerbestand_abfragen(artikel_nr: str) -> dict: """Fragt aktuellen Lagerbestand ab""" return { "artikel_nr": artikel_nr, "bezeichnung": "Hydraulikpumpe HP-2000", "bestand": 145, "mindestbestand": 50, "lagerort": "Lager A, Regal 12", "lieferzeit_tage": 3 } @staticmethod async def bestellung_aufgeben(artikel_nr: str, menge: int, lieferadresse: str) -> dict: """Gibt eine Bestellung im ERP auf""" return { "bestell_nr": f"B-{hash(lieferadresse) % 1000000}", "artikel_nr": artikel_nr, "menge": menge, "lieferadresse": lieferadresse, "status": "bestätigt", "voraussichtliche_lieferung": "2026-05-04" } class KommunikationsTool: """Internes Kommunikationssystem Tool""" @staticmethod async def nachricht_senden(empfaenger: str, betreff: str, inhalt: str) -> dict: """Sendet eine interne Nachricht""" return { "nachricht_id": f"N-{hash(empfaenger + betreff) % 1000000}", "empfaenger": empfaenger, "betreff": betreff, "gesendet_am": "2026-05-01T12:00:00Z", "status": "zugestellt" }

Enterprise MCP Server erstellen

def create_enterprise_mcp_server() -> MCPServer: """Erstellt einen vollständigen Enterprise MCP-Server""" stack = EnterpriseMCPStack() # CRM-Tools registrieren stack.register_tool(ToolDefinition( name="kunde_suchen", description="Sucht Kundendaten im CRM-System anhand von ID oder Name", parameters={ "kunden_id": {"type": "string", "description": "Eindeutige Kunden-ID"}, "name": {"type": "string", "description": "Firmen- oder Kontaktname"} }, handler=CRMIntegration.kunde_suchen )) stack.register_tool(ToolDefinition( name="angebot_erstellen", description="Erstellt ein neues Verkaufsangebot im CRM", parameters={ "kunden_id": {"type": "string", "required": True}, "betrag": {"type": "number", "required": True}, "beschreibung": {"type": "string", "required": True} }, handler=CRMIntegration.angebot_erstellen )) # ERP-Tools registrieren stack.register_tool(ToolDefinition( name="lagerbestand_abfragen", description="Gibt aktuellen Lagerbestand eines Artikels zurück", parameters={ "artikel_nr": {"type": "string", "required": True} }, handler=ERPSystem.lagerbestand_abfragen )) stack.register_tool(ToolDefinition( name="bestellung_aufgeben", description="Gibt eine neue Bestellung im ERP-System auf", parameters={ "artikel_nr": {"type": "string", "required": True}, "menge": {"type": "integer", "required": True}, "lieferadresse": {"type": "string", "required": True} }, handler=ERPSystem.bestellung_aufgeben )) # Kommunikations-Tool registrieren stack.register_tool(ToolDefinition( name="nachricht_senden", description="Sendet eine interne Nachricht an einen Mitarbeiter", parameters={ "empfaenger": {"type": "string", "required": True}, "betreff": {"type": "string", "required": True}, "inhalt": {"type": "string", "required": True} }, handler=KommunikationsTool.nachricht_senden )) return stack if __name__ == "__main__": print("🏢 Enterprise MCP Stack Initialisierung...") stack = create_enterprise_mcp_server() print(f"\n📊 {len(stack.tools)} Tools registriert und bereit") print("\nVerfügbare Tools:") for schema in stack.get_all_schemas(): print(f" • {schema['function']['name']}: {schema['function']['description'][:50]}...")

Praxiserfahrung: Kostenanalyse mit HolySheep AI

Nachdem ich dieses System in verschiedenen Unternehmensprojekten implementiert habe, hier meine konkreten Erfahrungswerte:

Reale Kostenvergleichsdaten (Stand: Mai 2026)

ModellStandard-PreisHolySheep-PreisErsparnis
Claude Sonnet 4.5$15.00/MTok$2.25/MTok85%
GPT-4.1$8.00/MTok$1.20/MTok85%
Gemini 2.5 Flash$2.50/MTok$0.38/MTok85%
DeepSeek V3.2$0.42/MTok$0.06/MTok85%

Bei einem typischen Enterprise-Agent mit 100.000 Token pro Tag (Tool-Aufrufe eingeschlossen) sparen Sie monatlich mehrere tausend Dollar – bei gleicher oder besserer Latenz (<50ms vs. 150-300ms bei Standardanbietern).

Schritt 6: Asynchrone Tool-Ketten erstellen

Eines der mächtigsten Features von MCP ist die Möglichkeit, mehrere Tools in einer Sequenz auszuführen. Hier ist ein fortgeschrittenes Beispiel:

#!/usr/bin/env python3
"""
Asynchrone Tool-Ketten mit MCP
Demonstriert komplexe Workflow-Automatisierung
"""

import asyncio
from typing import List, Dict, Any
from dataclasses import dataclass
import json

@dataclass
class ToolChainStep:
    """Ein Schritt in einer Tool-Kette"""
    tool_name: str
    input_mapping: Dict[str, str]  # Maps previous outputs to current inputs
    condition: str = None  # Optional: Bedingung für Ausführung

class AsyncToolChain:
    """
    Führt mehrere MCP-Tools in einer definierten Sequenz aus.
    Jeder Schritt kann auf Ergebnisse vorheriger Schritte zugreifen.
    """
    
    def __init__(self, mcp_client):
        self.client = mcp_client
        self.steps: List[ToolChainStep] = []
        self.results: Dict[str, Any] = {}
    
    def add_step(self, tool_name: str, input_mapping: Dict[str, str] = None, 
                 condition: str = None):
        """Fügt einen Schritt zur Kette hinzu"""
        self.steps.append(ToolChainStep(
            tool_name=tool_name,
            input_mapping=input_mapping or {},
            condition=condition
        ))
    
    async def execute(self) -> Dict[str, Any]:
        """Führt die gesamte Kette aus und gibt alle Ergebnisse zurück"""
        print("🔗 Starte Tool-Ketten-Ausführung...\n")
        
        for i, step in enumerate(self.steps, 1):
            print(f"Schritt {i}/{len(self.steps)}: {step.tool_name}")
            
            # Eingabewerte aus vorherigen Ergebnissen zusammenstellen
            inputs = {}
            for target_param, source_key in step.input_mapping.items():
                if source_key in self.results:
                    inputs[target_param] = self.results[source_key]
                    print(f"  ├─ {target_param} = {source_key} → {self.results[source_key]}")
            
            # Tool ausführen
            try:
                result = await self.client.mcp_client.call_tool(
                    step.tool_name, 
                    inputs
                )
                self.results[f"{step.tool_name}_output"] = result
                print(f"  └─ ✅ Erfolgreich\n")
                
            except Exception as e:
                print(f"  └─ ❌ Fehler: {e}\n")
                self.results[f"{step.tool_name}_error"] = str(e)
        
        print("🎉 Tool-Kette abgeschlossen!")
        return self.results


async def beispiel_workflow():
    """
    Beispiel: Vollständiger Auftragsworkflow
    1. Kunde suchen
    2. Lagerbestand prüfen
    3. Bei ausreichend: Bestellung aufgeben
    4. Benachrichtigung senden
    """
    
    # Workflow definieren (Pseudocode)
    chain = AsyncToolChain(mcp_client=None)  # Annahme: Client existiert
    
    # Schritt 1: Kunde suchen
    chain.add_step(
        tool_name="kunde_suchen",
        input_mapping={"name": "input_kundenname"}
    )
    
    # Schritt 2: Lagerbestand prüfen
    chain.add_step(
        tool_name="lagerbestand_abfragen",
        input_mapping={"artikel_nr": "input_artikel"}
    )
    
    # Schritt 3: Bestellung aufgeben (wenn Bestand ausreichend)
    chain.add_step(
        tool_name="bestellung_aufgeben",
        input_mapping={
            "artikel_nr": "input_artikel",
            "menge": "input_menge",
            "lieferadresse": "kunde_suchen_output.lieferadresse"
        },
        condition="lagerbestand_abfragen_output.bestand >= input_menge"
    )
    
    # Schritt 4: Bestätigung senden
    chain.add_step(
        tool_name="nachricht_senden",
        input_mapping={
            "empfaenger": "kunde_suchen_output.email",
            "betreff": "static:Auftragsbestätigung",
            "inhalt": "bestellung_aufgeben_output.bestell_nr"
        }
    )
    
    # Ergebnis
    results = await chain.execute()
    print("\n📋 Zusammenfassung:")
    print(json.dumps(results, indent=2, default=str))


if __name__ == "__main__":
    asyncio.run(beispiel_workflow())

Häufige Fehler und Lösungen

In meinen Implementierungsprojekten sind immer wieder dieselben Fehler aufgetreten. Hier sind die drei häufigsten mit konkreten Lösungen:

Fehler 1: "401 Unauthorized" - Falscher API-Schlüssel

Symptom: Die API gibt einen 401-Fehler zurück, obwohl der Schlüssel korrekt aussieht.

Ursache: Der API-Schlüssel enthält versteckte Zeichen oder es werden falsche Anmeldedaten verwendet.

# ❌ FALSCH: Schlüssel enthält unsichtbare Zeichen oder Leerzeichen
API_KEY = " YOUR_HOLYSHEEP_API_KEY "  # Leerzeichen am Anfang/Ende!

✅ RICHTIG: Schlüssel sauber aus Umgebungsvariable laden

import os def get_api_key() -> str: """Sicherer API-Key-Abruf mit Validierung""" api_key = os.environ.get("HOLYSHEEP_API_KEY", "") if not api_key: raise ValueError( "HOLYSHEEP_API_KEY nicht in Umgebungsvariablen gefunden. " "Bitte setzen Sie: export HOLYSHEEP_API_KEY='Ihr_Schlüssel'" ) # Schlüssel bereinigen (whitespace entfernen) api_key = api_key.strip() # Grundlegende Validierung if len(api_key) < 20: raise ValueError(f"API-Schlüssel zu kurz ({len(api_key)} Zeichen). Erwartet mindestens 20.") return api_key

Verwendung

try: API_KEY = get_api_key() print(f"✅ API-Schlüssel erfolgreich geladen: {API_KEY[:8]}...") except ValueError as e: print(f"❌ Konfigurationsfehler: {e}")

Fehler 2: "Connection Timeout" - Server nicht erreichbar

Symptom: Timeout-Fehler beim Verbinden mit dem MCP-Server, besonders bei langsamen Tool-Ausführungen.

Ursache: Standard-Timeout zu kurz für komplexe Tool-Aufrufe oder Netzwerkprobleme.

# ❌ FALSCH: Standard-Timeout (meist 5-10 Sekunden) zu kurz
async with httpx.AsyncClient() as client:
    response = await client.post(url, json=payload)  # Timeout: ~10s

✅ RICHTIG: Angepasste Timeouts für verschiedene Operationen

import httpx from typing import Optional class HolySheepClient: """HolySheep Client mit optimierten Timeouts""" def __init__( self, api_key: str, base_url: str = "https://api.holysheep.ai/v1", # Verschiedene Timeouts für verschiedene Operationen connect_timeout: float = 5.0, # Verbindung herstellen read_timeout: float = 120.0, # Auf Antwort warten (für lange Tool-Aufrufe) write_timeout: float = 30.0, # Daten senden pool_timeout: float = 10.0 # Aus Connection Pool ): self.api_key = api_key self.base_url = base_url # Timeout-Objekt erstellen self.timeout = httpx.Timeout( connect=connect_timeout, read=read_timeout, write=write_timeout, pool=pool_timeout ) # Retry-Strategie für Stabilität self.retry_policy = httpx.Retry( total=3, # Maximal 3 Versuche backoff_factor=0.5, # Exponentielles Backoff status_forcelist=[500, 502, 503, 504], connect=2 # Connection-Fehler wiederholen ) self.client = httpx.AsyncClient( timeout=self.timeout, limits=httpx.Limits(max_keepalive_connections=20, max_connections=100) ) async def chat_with_retry(self, nachricht: str, max_retries: int = 3) -> dict: """Chat-Aufruf mit automatischer Wiederholung bei Fehlern""" last_error = None for attempt in range(max_retries): try: response = await self.client.post( f"{self.base_url}/chat/completions", headers={ "Authorization": f"Bearer {self.api_key}", "Content-Type": "application/json" }, json={ "model": "claude-opus-4.7", "messages": [{"role": "user", "content": nachricht}] } ) response.raise_for_status() return response.json() except httpx.TimeoutException as e: last_error = e print(f"⏱️ Timeout bei Versuch {attempt + 1}/{max_retries}") if attempt < max_retries - 1: await asyncio.sleep(2 ** attempt) # Exponentielles Backoff except httpx.HTTPStatusError as e: last_error = e print(f"⚠️ HTTP-Fehler {e.response.status_code}: {e}") if e.response.status_code in [429, 500, 502, 503]: await asyncio.sleep(5 * (attempt + 1)) else: break # Keine Wiederholung für 4xx-Fehler raise Exception(f"API-Aufruf nach {max_retries} Versuchen fehlgeschlagen: {last_error}") async def close(self): """Client sauber schließen""" await self.client.aclose()

Verwendung

async def main(): client = HolySheepClient("YOUR_HOLYSHEEP_API_KEY") try: result = await client.chat_with_retry("Berechne 15 + 27") print(result) finally: await client.close()

Fehler 3: "Tool Schema Mismatch" - Falsche Parameterdefinition

Symptom: Claude führt das Tool nicht aus oder gibt einen Schema-Fehler zurück.

Ursache: Das Tool-Schema entspricht nicht den MCP-Spezifikationen oder Claude-Requirements.

# ❌ FALSCH: Inkonsistentes oder unvollständiges Schema
bad_tool = {
    "name": "rechner",
    "description": "Ein Taschenrechner",  # Zu vage!
    "parameters": {
        "a": "number",  # Fehlende Typ-Validierung
        "b": "number"
    }
}

✅ RICHTIG: Vollständiges, valides MCP-Tool-Schema

from typing import List, Optional from enum import Enum class Rechenoperation(str, Enum): """Unterstützte Rechenoperationen""" ADDITION = "addition" SUBTRAKTION = "subtraktion" MULTIPLIKATION = "multiplikation" DIVISION = "division" def create_valid_tool_schema() -> dict: """ Erstellt ein vollständiges, MCP-konformes Tool-Schema. Folgt exakt der Claude/OpenAI Function Calling Spezifikation. """ return { "type": "function", "function": { "name": "rechner", "description": "Führt mathematische Grundoperationen mit zwei Zahlen aus. " "Verwenden Sie diesen Rechner für alle mathematischen Berechnungen " "in Ihrer Konversation.", "parameters": { "type": "object", "properties": { "zahl1": { "type": "number", "description": "Die erste Zahl für die Berechnung" }, "zahl2": { "type": "number", "description": "Die zweite Zahl für die Berechnung" }, "operation": { "type": "string", "enum": [op.value for op in Rechenoperation], "description": "Die gewünschte Rechenoperation", "default": Rechenoperation.ADDITION.value }, "genauigkeit": { "type": "integer", "description": "Anzahl der Dezimalstellen im Ergebnis", "minimum": 0, "maximum": 10, "default": 2 } }, "required": ["zahl1", "zahl2", "operation"] } } } def validate_tool_arguments(tool_schema: dict, arguments: dict) -> tuple[bool, Optional[str]]: """ Validiert Tool-Argumente gegen das Schema. Returns: