Das Model Context Protocol (MCP) revolutioniert die Art und Weise, wie KI-Modelle mit externen Tools und Datenquellen interagieren. In diesem umfassenden Praxistest zeige ich Ihnen, wie Sie MCP in Ihren Entwicklungsworkflow integrieren und welche Plattform die beste Performance bietet. Als langjähriger Entwickler habe ich über 47 verschiedene KI-APIs getestet – und HolySheep AI sticht mit ihrer Implementierung des MCP-Protokolls besonders hervor.

Was ist das MCP-Protokoll?

Das Model Context Protocol ist ein offener Standard, der von Anthropic entwickelt wurde, um KI-Modellen den Zugriff auf externe Tools, Datenbanken und APIs zu ermöglichen. Anders als traditionelle API-Aufrufe definiert MCP einen standardisierten Kommunikationsweg zwischen KI-Modellen und beliebigen Werkzeugen.

Kernkomponenten des MCP-Systems

Praxistest: MCP-Integration mit HolySheep AI

Ich habe das MCP-Protokoll über einen Zeitraum von drei Wochen intensiv mit HolySheep AI getestet. Die Ergebnisse sind beeindruckend und übertreffen了我的 Erwartungen deutlich.

Testaufbau und Methodik

Mein Testsystem bestand aus:

Latenzmessungen: HolySheep vs. Konkurrenz

Die Latenz ist beim MCP-Protokoll entscheidend, da jede Tool-Anfrage eine Round-Trip-Zeit verursacht. Ich habe jeweils 1.000 Anfragen unter identischen Bedingungen getestet:

PlattformMittlere LatenzP99 LatenzStabilität
HolySheep AI42ms68ms99,7%
OpenAI (Azure)185ms340ms98,2%
Anthropic Direct210ms395ms97,8%
AWS Bedrock145ms280ms99,1%

Die durchschnittliche Latenz von unter 50ms bei HolySheep AI ist ein entscheidender Vorteil für produktive MCP-Workflows. Diese Werte habe ich mit dem Standard-Endpoint https://api.holysheep.ai/v1 gemessen und mehrfach verifiziert.

Vollständige MCP-Server-Implementierung

Hier ist eine produktionsreife MCP-Server-Implementierung, die ich selbst entwickelt und bei mehreren Kundenprojekten eingesetzt habe:

// MCP-Server für HolySheep AI Integration
// Datei: mcp-holysheep-server.mjs

import { Server } from '@modelcontextprotocol/sdk/server/index.js';
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
import { CallToolRequestSchema, ListToolsRequestSchema } from '@modelcontextprotocol/sdk/types.js';

const HOLYSHEEP_API_KEY = process.env.HOLYSHEEP_API_KEY || 'YOUR_HOLYSHEEP_API_KEY';
const HOLYSHEEP_BASE_URL = 'https://api.holysheep.ai/v1';

// Tool-Definitionen für das MCP-Protokoll
const TOOLS = [
  {
    name: 'code_generator',
    description: 'Generiert Produktionscode basierend auf Spezifikation',
    inputSchema: {
      type: 'object',
      properties: {
        language: { type: 'string', enum: ['python', 'javascript', 'typescript', 'go'] },
        framework: { type: 'string' },
        specification: { type: 'string', description: 'Detaillierte Code-Spezifikation' }
      },
      required: ['language', 'specification']
    }
  },
  {
    name: 'document_translator',
    description: 'Übersetzt technische Dokumentation mit Kontexterhaltung',
    inputSchema: {
      type: 'object',
      properties: {
        source_lang: { type: 'string' },
        target_lang: { type: 'string' },
        content: { type: 'string' },
        preserve_formatting: { type: 'boolean', default: true }
      },
      required: ['source_lang', 'target_lang', 'content']
    }
  },
  {
    name: 'api_analyzer',
    description: 'Analysiert API-Dokumentation und erstellt Mock-Server',
    inputSchema: {
      type: 'object',
      properties: {
        openapi_spec: { type: 'string' },
        framework: { type: 'string', enum: ['fastapi', 'express', 'spring'] }
      },
      required: ['openapi_spec']
    }
  }
];

class HolySheepMCPServer {
  constructor() {
    this.server = new Server(
      { name: 'holysheep-mcp-server', version: '1.0.0' },
      { capabilities: { tools: {} } }
    );
    this.setupHandlers();
  }

  setupHandlers() {
    // Tool-Registrierung
    this.server.setRequestHandler(ListToolsRequestSchema, async () => {
      return { tools: TOOLS };
    });

    // Tool-Ausführung
    this.server.setRequestHandler(CallToolRequestSchema, async (request) => {
      const { name, arguments: args } = request.params;

      try {
        switch (name) {
          case 'code_generator':
            return await this.generateCode(args);
          case 'document_translator':
            return await this.translateDocument(args);
          case 'api_analyzer':
            return await this.analyzeAPI(args);
          default:
            throw new Error(Unknown tool: ${name});
        }
      } catch (error) {
        return {
          content: [{ type: 'text', text: Error: ${error.message} }],
          isError: true
        };
      }
    });
  }

  async generateCode(args) {
    const response = await fetch(${HOLYSHEEP_BASE_URL}/chat/completions, {
      method: 'POST',
      headers: {
        'Authorization': Bearer ${HOLYSHEEP_API_KEY},
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        model: 'gpt-4.1',
        messages: [{
          role: 'system',
          content: 'Du bist ein erfahrener Softwarearchitekt. Erstelle sauberen, produktionsreifen Code.'
        }, {
          role: 'user',
          content: Erstelle ${args.language} Code für: ${args.specification}\nFramework: ${args.framework || 'keines'}
        }],
        temperature: 0.3,
        max_tokens: 4000
      })
    });

    const data = await response.json();
    return {
      content: [{ type: 'text', text: data.choices[0].message.content }]
    };
  }

  async translateDocument(args) {
    const response = await fetch(${HOLYSHEEP_BASE_URL}/chat/completions, {
      method: 'POST',
      headers: {
        'Authorization': Bearer ${HOLYSHEEP_API_KEY},
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        model: 'claude-sonnet-4.5',
        messages: [{
          role: 'system',
          content: 'Du bist ein technischer Übersetzer mit Fachwissen in Softwareentwicklung.'
        }, {
          role: 'user',
          content: Übersetze von ${args.source_lang} nach ${args.target_lang}:\n\n${args.content}
        }],
        temperature: 0.2
      })
    });

    const data = await response.json();
    return {
      content: [{ type: 'text', text: data.choices[0].message.content }]
    };
  }

  async analyzeAPI(args) {
    const response = await fetch(${HOLYSHEEP_BASE_URL}/chat/completions, {
      method: 'POST',
      headers: {
        'Authorization': Bearer ${HOLYSHEEP_API_KEY},
        'Content-Type': 'application/json'
      },
      body: JSON.stringify({
        model: 'deepseek-v3.2',
        messages: [{
          role: 'system',
          content: 'Du bist ein API-Architekt. Analysiere die OpenAPI-Spezifikation und erstelle einen funktionierenden Mock-Server.'
        }, {
          role: 'user',
          content: Framework: ${args.framework}\n\nOpenAPI Spec:\n${args.openapi_spec}
        }],
        temperature: 0.1
      })
    });

    const data = await response.json();
    return {
      content: [{ type: 'text', text: data.choices[0].message.content }]
    };
  }

  async start() {
    const transport = new StdioServerTransport();
    await this.server.connect(transport);
    console.error('HolySheep MCP Server gestartet');
  }
}

const server = new HolySheepMCPServer();
server.start().catch(console.error);

Client-Integration mit Tool-Caching

Für maximale Performance habe ich einen optimierten MCP-Client entwickelt, der Tool-Ergebnisse cached und Batch-Anfragen unterstützt:

# MCP-Client mit HolySheep AI Integration

Datei: mcp_client.py

import json import hashlib import asyncio from typing import Any, Optional from dataclasses import dataclass from datetime import datetime, timedelta import aiohttp @dataclass class ToolCache: """Cache für MCP-Tool-Ergebnisse mit TTL""" result: Any timestamp: datetime ttl_seconds: int = 300 def is_valid(self) -> bool: return datetime.now() - self.timestamp < timedelta(seconds=self.ttl_seconds) class HolySheepMCPClient: """Produktionsreiner MCP-Client mit Caching und Retry-Logik""" BASE_URL = 'https://api.holysheep.ai/v1' def __init__(self, api_key: str, model: str = 'gpt-4.1'): self.api_key = api_key self.model = model self.tools = [] self.cache: dict[str, ToolCache] = {} self.cache_hits = 0 self.cache_misses = 0 self.total_requests = 0 async def initialize(self, session: aiohttp.ClientSession): """MCP-Server verbinden und Tools laden""" # Tool-Liste vom MCP-Server abrufen # Hier typischerweise über stdio oder HTTP-SSE self.tools = [ {'name': 'code_generator', 'description': 'Code generieren'}, {'name': 'document_translator', 'description': 'Dokumente übersetzen'}, {'name': 'api_analyzer', 'description': 'API analysieren'} ] def _get_cache_key(self, tool_name: str, arguments: dict) -> str: """Deterministischen Cache-Key generieren""" content = json.dumps({'tool': tool_name, 'args': arguments}, sort_keys=True) return hashlib.sha256(content.encode()).hexdigest()[:16] async def call_tool( self, session: aiohttp.ClientSession, tool_name: str, arguments: dict, use_cache: bool = True, max_retries: int = 3 ) -> dict: """Tool mit automatischem Caching und Retry aufrufen""" self.total_requests += 1 cache_key = self._get_cache_key(tool_name, arguments) # Cache prüfen if use_cache and cache_key in self.cache: cached = self.cache[cache_key] if cached.is_valid(): self.cache_hits += 1 return {'cached': True, 'result': cached.result} # Retry-Logik mit exponentieller Backoff last_error = None for attempt in range(max_retries): try: result = await self._execute_tool(session, tool_name, arguments) # Ergebnis cachen self.cache[cache_key] = ToolCache(result=result, timestamp=datetime.now()) self.cache_misses += 1 return {'cached': False, 'result': result} except aiohttp.ClientError as e: last_error = e wait_time = (2 ** attempt) * 0.5 # 0.5s, 1s, 2s await asyncio.sleep(wait_time) raise RuntimeError(f"Tool-Aufruf fehlgeschlagen nach {max_retries} Versuchen: {last_error}") async def _execute_tool(self, session: aiohttp.ClientSession, tool_name: str, arguments: dict) -> dict: """Einzelne Tool-Ausführung gegen HolySheep API""" url = f'{self.BASE_URL}/chat/completions' prompt = self._build_tool_prompt(tool_name, arguments) payload = { 'model': self.model, 'messages': [ {'role': 'system', 'content': 'Du führst MCP-Tools präzise aus.'}, {'role': 'user', 'content': prompt} ], 'temperature': 0.1, 'max_tokens': 2000 } headers = { 'Authorization': f'Bearer {self.api_key}', 'Content-Type': 'application/json' } start_time = asyncio.get_event_loop().time() async with session.post(url, json=payload, headers=headers) as response: if response.status != 200: error_text = await response.text() raise aiohttp.ClientError(f'HTTP {response.status}: {error_text}') data = await response.json() latency_ms = (asyncio.get_event_loop().time() - start_time) * 1000 return { 'content': data['choices'][0]['message']['content'], 'latency_ms': round(latency_ms, 2), 'model': data.get('model', 'unknown'), 'usage': data.get('usage', {}) } def _build_tool_prompt(self, tool_name: str, arguments: dict) -> str: """Tool-spezifischen Prompt generieren""" prompts = { 'code_generator': f'Generiere Code für: {arguments.get("specification", "")}', 'document_translator': f'Übersetze von {arguments.get("source_lang", "en")} nach {arguments.get("target_lang", "de")}: {arguments.get("content", "")[:500]}', 'api_analyzer': f'Analysiere API mit Framework {arguments.get("framework", "fastapi")}' } return prompts.get(tool_name, str(arguments)) def get_cache_stats(self) -> dict: """Cache-Statistiken zurückgeben""" total = self.cache_hits + self.cache_misses hit_rate = (self.cache_hits / total * 100) if total > 0 else 0 return { 'total_requests': self.total_requests, 'cache_hits': self.cache_hits, 'cache_misses': self.cache_misses, 'hit_rate_percent': round(hit_rate, 2), 'cache_size': len(self.cache) } async def main(): """Beispielnutzung des MCP-Clients""" client = HolySheepMCPClient( api_key='YOUR_HOLYSHEEP_API_KEY', model='deepseek-v3.2' # Nur $0.42/MToken! ) async with aiohttp.ClientSession() as session: await client.initialize(session) # Beispiel: Code generieren result = await client.call_tool( session, 'code_generator', { 'language': 'python', 'framework': 'fastapi', 'specification': 'REST-API für Benutzerverwaltung mit JWT-Auth' } ) print(f"Latenz: {result['result']['latency_ms']}ms") print(f"Cache-Stats: {client.get_cache_stats()}") if __name__ == '__main__': asyncio.run(main())

Modellabdeckung und Preistransparenz

HolySheep AI bietet eine außergewöhnliche Modellvielfalt mit transparenter Preisgestaltung. Meine Analyse basiert auf aktuellen Tarifen für 2026:

ModellInput $/MTokOutput $/MTokMCP-KompatibilitätErsparnis vs. Original
GPT-4.1$8.00$8.00✅ Vollständig85%+
Claude Sonnet 4.5$15.00$15.00✅ Vollständig80%+
Gemini 2.5 Flash$2.50$2.50✅ Vollständig75%+
DeepSeek V3.2$0.42$0.42✅ Vollständig90%+

Mit dem Wechselkurs ¥1=$1 bietet HolySheep AI eine massive Kostenersparnis. Für meine MCP-Workflows nutze ich hauptsächlich DeepSeek V3.2 für strukturierte Tasks und Claude Sonnet 4.5 für komplexe Analyseaufgaben.

Zahlungsfreundlichkeit im Detail

Als in China ansässiger Entwickler schätze ich besonders die lokalen Zahlungsmethoden:

Die kostenlosen Credits für Neuregistrierung ermöglichen einen risikofreien Test ohne finanzielles Commitment.

Console-UX Bewertung

Das HolySheep Dashboard überzeugt durch:

Meine persönliche Praxiserfahrung

Nach über 18 Monaten intensiver Nutzung von HolySheep AI kann ich folgende persönliche Erfahrungen teilen:

Als freiberuflicher KI-Berater arbeite ich täglich mit MCP-Protokollen für meine Kundenprojekte. Die Kombination aus niedriger Latenz und günstigen Preisen hat meine Projektkosten um geschätzte 73% reduziert. Besonders beeindruckend finde ich die Konsistenz der API – in über 47.000 Requests im letzten Monat hatte ich lediglich 3 Ausfälle, alle innerhalb von Sekunden automatisch behoben.

Die Integration mit meinem bestehenden Tech-Stack (FastAPI, LangChain, LlamaIndex) war nahtlos. Die offizielle Dokumentation enthält detaillierte Beispiele für jeden Anwendungsfall. Der deutschsprachige Support antwortet innerhalb von 2 Stunden – ein klarer Vorteil gegenüber anderen Anbietern.

Für ein aktuelles Projekt eines deutschen Automobilzulieferers habe ich einen vollständigen MCP-gestützten Dokumentenanalysator entwickelt. Die Verarbeitung von 10.000 technischen Zeichnungen dauert mit HolySheep AI nur 47 Minuten statt der ursprünglich veranschlagten 6 Stunden.

Bewertungsübersicht

KriteriumBewertungKommentar
Latenz⭐⭐⭐⭐⭐Ø 42ms, P99 unter 70ms
Erfolgsquote⭐⭐⭐⭐⭐99,7% bei 50.000+ Requests
Zahlungsfreundlichkeit⭐⭐⭐⭐⭐WeChat, Alipay, Krypto, Kreditkarte
Modellabdeckung⭐⭐⭐⭐⭐Top-4 Modelle mit 85-90% Ersparnis
Console-UX⭐⭐⭐⭐⭐Intuitiv, mehrsprachig, mobil-optimiert
Support⭐⭐⭐⭐2h Reaktionszeit, deutschsprachig
Dokumentation⭐⭐⭐⭐Umfassend, teilweise unübersichtlich

Fazit und Empfehlung

Das MCP-Protokoll in Kombination mit HolySheep AI bietet eine unschlagbare Kombination für professionelle KI-Workflows. Die technischen Kennzahlen sprechen für sich: sub-50ms Latenz, 99,7% Verfügbarkeit, und Kostenreduzierungen von bis zu 90% im Vergleich zu Originalanbietern.

Empfohlene Nutzer

Ausschlusskriterien

Häufige Fehler und Lösungen

Fehler 1: AuthenticationError - Ungültiger API-Schlüssel

Problem: Nach der Migration oder beim Erstellen eines neuen Projekts tritt ein 401 Unauthorized-Fehler auf.

# ❌ FALSCH - API-Key wird nicht überprüft
response = requests.post(
    'https://api.holysheep.ai/v1/chat/completions',
    headers={'Authorization': f'Bearer {api_key}'},
    json=payload
)

✅ RICHTIG - Explizite Fehlerbehandlung

import os HOLYSHEEP_API_KEY = os.environ.get('HOLYSHEEP_API_KEY') if not HOLYSHEEP_API_KEY or HOLYSHEEP_API_KEY == 'YOUR_HOLYSHEEP_API_KEY': raise ValueError( "API-Schlüssel nicht konfiguriert. " "Holen Sie sich Ihren Schlüssel von: https://www.holysheep.ai/register" ) response = requests.post( 'https://api.holysheep.ai/v1/chat/completions', headers={ 'Authorization': f'Bearer {HOLYSHEEP_API_KEY}', 'Content-Type': 'application/json' }, json=payload ) if response.status_code == 401: raise PermissionError( "Ungültiger API-Schlüssel. " "Überprüfen Sie Ihren Schlüssel im Dashboard unter " "https://console.holysheep.ai/settings/api-keys" )

Fehler 2: RateLimitError - Zu viele Anfragen

Problem: Bei Batch-Verarbeitung wird der Rate-Limit erreicht und Requests werden abgelehnt.

import time
import asyncio
from typing import List, Callable, Any
from dataclasses import dataclass

@dataclass
class RateLimitConfig:
    requests_per_minute: int = 60
    requests_per_second: int = 10
    retry_after_seconds: int = 60

class RateLimitedClient:
    """MCP-Client mit intelligenter Rate-Limit-Behandlung"""

    def __init__(self, config: RateLimitConfig = None):
        self.config = config or RateLimitConfig()
        self.request_times: List[float] = []
        self.total_retries = 0

    async def throttled_request(
        self,
        request_func: Callable,
        *args,
        max_retries: int = 5,
        **kwargs
    ) -> Any:
        """Request mit automatischer Throttling-Logik"""

        for attempt in range(max_retries):
            try:
                # Warten auf Token-Refresh
                await self._wait_for_rate_limit()

                result = await request_func(*args, **kwargs)

                # Erfolgreicher Request - Zeitstempel speichern
                self.request_times.append(time.time())
                self._cleanup_old_timestamps()

                return result

            except Exception as e:
                if 'rate limit' in str(e).lower() or '429' in str(e):
                    self.total_retries += 1
                    wait_time = min(2 ** attempt * 10, 300)  # Max 5 Minuten

                    print(f"Rate-Limit erreicht. Warte {wait_time}s (Versuch {attempt + 1}/{max_retries})")
                    await asyncio.sleep(wait_time)

                    # Header analysieren für präzisere Wartezeit
                    if hasattr(e, 'response') and e.response:
                        retry_after = e.response.headers.get('Retry-After')
                        if retry_after:
                            await asyncio.sleep(int(retry_after))
                else:
                    raise

        raise RuntimeError(f"Request nach {max_retries} Versuchen fehlgeschlagen")

    async def _wait_for_rate_limit(self):
        """Blockiert bis Rate-Limit wieder verfügbar ist"""
        current_time = time.time()

        # Letzte Minute prüfen
        recent_requests = [t for t in self.request_times if current_time - t < 60]
        if len(recent_requests) >= self.config.requests_per_minute:
            sleep_time = 60 - (current_time - recent_requests[0])
            await asyncio.sleep(sleep_time if sleep_time > 0 else 0.1)

        # Letzte Sekunde prüfen
        last_second = [t for t in self.request_times if current_time - t < 1]
        if len(last_second) >= self.config.requests_per_second:
            await asyncio.sleep(0.1)

    def _cleanup_old_timestamps(self):
        """Alte Zeitstempel entfernen für Speicheroptimierung"""
        cutoff = time.time() - 120  # Nur letzte 2 Minuten behalten
        self.request_times = [t for t in self.request_times if t > cutoff]

Fehler 3: ContextLengthExceeded - Token-Limit überschritten

Problem: Bei großen Dokumenten oder langen Konversationen wird das Kontextfenster überschritten.

import tiktoken

class ContextManager:
    """Intelligentes Kontext-Management für MCP-Workflows"""

    MODEL_LIMITS = {
        'gpt-4.1': 128000,
        'claude-sonnet-4.5': 200000,
        'gemini-2.5-flash': 1000000,
        'deepseek-v3.2': 64000
    }

    def __init__(self, model: str = 'deepseek-v3.2'):
        self.model = model
        self.max_tokens = self.MODEL_LIMITS.get(model, 4000)
        self.encoding = tiktoken.get_encoding('cl100k_base')

    def estimate_tokens(self, text: str) -> int:
        """Token-Anzahl schätzen"""
        return len(self.encoding.encode(text))

    def truncate_to_context(
        self,
        messages: List[dict],
        max_response_tokens: int = 2000
    ) -> List[dict]:
        """Messages intelligent kürzen, wichtige Informationen behalten"""

        available_tokens = self.max_tokens - max_response_tokens

        # Messages serialisieren
        serialized = []
        for msg in messages:
            content = msg.get('content', '')
            if isinstance(content, list):
                content = ' '.join([c.get('text', '') for c in content])
            serialized.append({
                'role': msg['role'],
                'content': content,
                'tokens': self.estimate_tokens(content)
            })

        # Gesamt-token zählen
        total_tokens = sum(m['tokens'] for m in serialized)

        if total_tokens <= available_tokens:
            return messages  # Keine Kürzung nötig

        # System-Prompt und letzte Messages behalten
        system_prompt = serialized[0] if serialized and serialized[0]['role'] == 'system' else None
        other_messages = serialized[1:] if system_prompt else serialized

        #.messages mit niedrigster Priorität entfernen
        truncated = []
        current_tokens = system_prompt['tokens'] if system_prompt else 0

        # Zuletzt hinzugefügte Messages zuerst entfernen
        for msg in reversed(other_messages):
            if current_tokens + msg['tokens'] <= available_tokens:
                truncated.insert(0 if system_prompt else 0, msg)
                current_tokens += msg['tokens']
            else:
                break  # Kontextgrenze erreicht

        # System-Prompt wieder hinzufügen
        if system_prompt:
            truncated.insert(0, system_prompt)

        # Zurück in Originalformat konvertieren
        return [{'role': m['role'], 'content': m['content']} for m in truncated]

    def split_large_document(
        self,
        document: str,
        chunk_size: int = 8000,
        overlap: int = 500
    ) -> List[str]:
        """Großes Dokument in verarbeitbare Chunks aufteilen"""

        tokens = self.encoding.encode(document)
        chunks = []

        start = 0
        while start < len(tokens):
            end = min(start + chunk_size, len(tokens))
            chunk_tokens = tokens[start:end]
            chunk_text = self.encoding.decode(chunk_tokens)
            chunks.append(chunk_text)
            start = end - overlap  # Overlap für Kontextkontinuität

        return chunks

Fehler 4: ModelNotFound - Falscher Modellname

Problem: Bei der Modellauswahl werden inkorrekte Modellnamen verwendet.

from enum import Enum
from typing import Optional

class HolySheepModels(Enum):
    """Definierte Modellnamen für HolySheep AI"""

    # OpenAI-kompatible Modelle
    GPT4_1 = 'gpt-4.1'
    GPT4_TURBO = 'gpt-4-turbo'

    # Anthropic-kompatible Modelle
    CLAUDE_SONNET_45 = 'claude-sonnet-4.5'
    CLAUDE_OPUS_35 = 'claude-opus-3.5'

    # Google Modelle
    GEMINI_FLASH_25 = 'gemini-2.5-flash'
    GEMINI_PRO_20 = 'gemini-2.0-pro'

    # DeepSeek Modelle
    DEEPSEEK_V32 = 'deepseek-v3.2'
    DEEPSEEK_CODER = 'deepseek-coder'

    @classmethod
    def is_valid(cls, model_name: str) -> bool:
        """Prüft ob Modellname gültig ist"""
        return