- Startseite
- Documentation
- MCP
- MCP-Laufzeit-Lebenszyklus
MCP-Laufzeit-Lebenszyklus
Dieses Dokument beschreibt, wie MCP-Server in der Coding-Agent-Laufzeitumgebung entdeckt, verbunden, als Tools bereitgestellt, aktualisiert und beendet werden.
Lebenszyklus im Überblick
Abschnitt betitelt „Lebenszyklus im Überblick“- SDK-Start ruft
discoverAndLoadMCPTools()auf (sofern MCP nicht deaktiviert ist). - Entdeckung (
loadAllMCPConfigs) löst MCP-Server-Konfigurationen aus Capability-Quellen auf, filtert deaktivierte/Projekt-/Exa-Einträge und bewahrt Quell-Metadaten. - Manager-Verbindungsphase (
MCPManager.connectServers) startet pro Server die Verbindung +tools/listparallel. - Schnelles Startup-Gate wartet bis zu 250ms und kann dann zurückgeben:
- vollständig geladene
MCPTools, - Fehler pro Server,
- oder gecachte
DeferredMCPTools für noch ausstehende Server.
- vollständig geladene
- SDK-Verdrahtung führt MCP-Tools in die Laufzeit-Tool-Registry für die Sitzung zusammen.
- Live-Sitzung kann MCP-Tools über
/mcp-Abläufe aktualisieren (disconnectAll+ Neuentdeckung +session.refreshMCPTools). - Beendigung erfolgt, wenn Aufrufer
disconnectServer/disconnectAllaufrufen; der Manager löscht auch MCP-Tool-Registrierungen für getrennte Server.
Entdeckungs- und Ladephase
Abschnitt betitelt „Entdeckungs- und Ladephase“Einstiegspfad vom SDK
Abschnitt betitelt „Einstiegspfad vom SDK“createAgentSession() in src/sdk.ts führt den MCP-Start durch, wenn enableMCP auf true gesetzt ist (Standard):
- ruft
discoverAndLoadMCPTools(cwd, { ... })auf, - übergibt
authStorage, Cache-Speicher und die Einstellungmcp.enableProjectConfig, - setzt immer
filterExa: true, - protokolliert Lade-/Verbindungsfehler pro Server,
- speichert den zurückgegebenen Manager in
toolSession.mcpManagerund im Sitzungsergebnis.
Wenn enableMCP auf false gesetzt ist, wird die MCP-Entdeckung vollständig übersprungen.
Konfigurationsentdeckung und Filterung
Abschnitt betitelt „Konfigurationsentdeckung und Filterung“loadAllMCPConfigs() (src/mcp/config.ts) lädt kanonische MCP-Server-Einträge über die Capability-Entdeckung und konvertiert sie in das Legacy-Format MCPServerConfig.
Filterverhalten:
enableProjectConfig: falseentfernt Einträge auf Projektebene (_source.level === "project").- Server mit
enabled: falsewerden vor Verbindungsversuchen übersprungen. - Exa-Server werden standardmäßig herausgefiltert und API-Schlüssel werden für die native Exa-Tool-Integration extrahiert.
Das Ergebnis enthält sowohl configs als auch sources (Metadaten, die später für die Provider-Kennzeichnung verwendet werden).
Fehlerverhalten auf Entdeckungsebene
Abschnitt betitelt „Fehlerverhalten auf Entdeckungsebene“discoverAndLoadMCPTools() unterscheidet zwei Fehlerklassen:
- Harter Entdeckungsfehler (Ausnahme von
manager.discoverAndConnect, typischerweise aus der Konfigurationsentdeckung): gibt ein leeres Tool-Set und einen synthetischen Fehler{ path: ".mcp.json", error }zurück. - Laufzeit-/Verbindungsfehler pro Server: der Manager gibt Teilerfolge mit einer
errors-Map zurück; andere Server fahren fort.
Der Start lässt also nicht die gesamte Agent-Sitzung fehlschlagen, wenn einzelne MCP-Server ausfallen.
Manager-Zustandsmodell
Abschnitt betitelt „Manager-Zustandsmodell“MCPManager verfolgt den Laufzeit-Lebenszyklus mit separaten Registries:
#connections: Map<string, MCPServerConnection>— vollständig verbundene Server.#pendingConnections: Map<string, Promise<MCPServerConnection>>— Handshake in Bearbeitung.#pendingToolLoads: Map<string, Promise<{ connection, serverTools }>>— verbunden, aber Tools werden noch geladen.#tools: CustomTool[]— aktuelle MCP-Tool-Ansicht, die Aufrufern bereitgestellt wird.#sources: Map<string, SourceMeta>— Provider-/Quell-Metadaten, auch bevor die Verbindung abgeschlossen ist.
getConnectionStatus(name) leitet den Status aus diesen Maps ab:
connectedwenn in#connections,connectingwenn ausstehende Verbindung oder ausstehender Tool-Ladevorgang,disconnectedandernfalls.
Verbindungsaufbau und Startup-Timing
Abschnitt betitelt „Verbindungsaufbau und Startup-Timing“Verbindungspipeline pro Server
Abschnitt betitelt „Verbindungspipeline pro Server“Für jeden entdeckten Server in connectServers():
- Quell-Metadaten speichern/aktualisieren,
- überspringen, wenn bereits verbunden/ausstehend,
- Transport-Felder validieren (
validateServerConfig), - Auth-/Shell-Substitutionen auflösen (
#resolveAuthConfig), connectToServer(name, resolvedConfig)aufrufen,listTools(connection)aufrufen,- Tool-Definitionen best-effort cachen (
MCPToolCache.set).
Verhalten von connectToServer() (src/mcp/client.ts):
- erstellt stdio- oder HTTP/SSE-Transport,
- führt MCP
initialize+notifications/initializeddurch, - verwendet Timeout (
config.timeoutoder 30s Standard), - schließt den Transport bei Initialisierungsfehler.
Schnelles Startup-Gate + Deferred-Fallback
Abschnitt betitelt „Schnelles Startup-Gate + Deferred-Fallback“connectServers() wartet auf ein Race zwischen:
- allen abgeschlossenen Verbindungs-/Tool-Lade-Aufgaben und
STARTUP_TIMEOUT_MS = 250.
Nach 250ms:
- erfüllte Aufgaben werden zu aktiven
MCPTools, - abgelehnte Aufgaben erzeugen Fehler pro Server,
- noch ausstehende Aufgaben:
- verwenden gecachte Tool-Definitionen wenn verfügbar (
MCPToolCache.get), umDeferredMCPTools zu erstellen, - andernfalls wird gewartet, bis diese ausstehenden Aufgaben abgeschlossen sind.
- verwenden gecachte Tool-Definitionen wenn verfügbar (
Dies ist ein hybrides Startup-Modell: schnelle Rückgabe wenn Cache verfügbar ist, Korrektheitswarten wenn kein Cache vorhanden ist.
Hintergrund-Abschlussverhalten
Abschnitt betitelt „Hintergrund-Abschlussverhalten“Jedes ausstehende toolsPromise hat auch eine Hintergrund-Fortsetzung, die letztendlich:
- den Tool-Anteil dieses Servers im Manager-Zustand über
#replaceServerToolsersetzt, - den Cache beschreibt,
- späte Fehler erst nach dem Startup protokolliert (
allowBackgroundLogging).
Tool-Bereitstellung und Verfügbarkeit in der Live-Sitzung
Abschnitt betitelt „Tool-Bereitstellung und Verfügbarkeit in der Live-Sitzung“Startup-Registrierung
Abschnitt betitelt „Startup-Registrierung“discoverAndLoadMCPTools() konvertiert Manager-Tools in LoadedCustomTool[] und dekoriert Pfade (mcp:<server> via <providerName> wenn bekannt).
createAgentSession() fügt diese Tools dann in customTools ein, die gewrappt und mit Namen wie mcp_<server>_<tool> zur Laufzeit-Tool-Registry hinzugefügt werden.
Tool-Aufrufe
Abschnitt betitelt „Tool-Aufrufe“MCPToolruft Tools über eine bereits bestehendeMCPServerConnectionauf.DeferredMCPToolwartet aufwaitForConnection(server)vor dem Aufruf; dies ermöglicht es, gecachte Tools bereitzustellen, bevor die Verbindung bereit ist.
Beide geben strukturierte Tool-Ausgaben zurück und konvertieren Transport-/Tool-Fehler in MCP error: ...-Tool-Inhalte (Abbruch bleibt Abbruch).
Aktualisierungs-/Neuladeungs-Pfade (Startup vs. Live-Neuladung)
Abschnitt betitelt „Aktualisierungs-/Neuladeungs-Pfade (Startup vs. Live-Neuladung)“Initialer Startup-Pfad
Abschnitt betitelt „Initialer Startup-Pfad“- einmalige Entdeckung/Ladung in
sdk.ts, - Tools werden in der initialen Sitzungs-Tool-Registry registriert.
Interaktiver Neuladeungs-Pfad
Abschnitt betitelt „Interaktiver Neuladeungs-Pfad“Der /mcp reload-Pfad (src/modes/controllers/mcp-command-controller.ts) führt aus:
mcpManager.disconnectAll(),mcpManager.discoverAndConnect(),session.refreshMCPTools(mcpManager.getTools()).
session.refreshMCPTools() (src/session/agent-session.ts) entfernt alle mcp_-Tools, wrappt die neuesten MCP-Tools erneut und reaktiviert das Tool-Set, sodass MCP-Änderungen ohne Neustart der Sitzung wirksam werden.
Es gibt auch einen Folgepfad für späte Verbindungen: Nach dem Warten auf einen bestimmten Server wird, wenn der Status connected wird, erneut session.refreshMCPTools(...) ausgeführt, sodass neu verfügbare Tools in der Sitzung neu gebunden werden.
Gesundheit, Wiederverbindung und Verhalten bei Teilausfällen
Abschnitt betitelt „Gesundheit, Wiederverbindung und Verhalten bei Teilausfällen“Das aktuelle Laufzeitverhalten ist bewusst minimal gehalten:
- Kein autonomer Gesundheitsmonitor im Manager/Client.
- Keine automatische Wiederverbindungsschleife wenn ein Transport abbricht.
- Der Manager abonniert keine
onClose/onError-Ereignisse des Transports; der Status wird registry-gesteuert ermittelt. - Wiederverbindung ist explizit: über den Neuladeungs-Ablauf oder direkten
connectServers()-Aufruf.
Im Betrieb:
- der Ausfall eines Servers entfernt keine Tools von gesunden Servern,
- Verbindungs-/Listenauflistungsfehler sind pro Server isoliert,
- Tool-Cache und Hintergrund-Aktualisierungen sind best-effort (Warnungen/Fehler werden protokolliert, kein harter Stopp).
Beendigungssemantik
Abschnitt betitelt „Beendigungssemantik“Beendigung auf Serverebene
Abschnitt betitelt „Beendigung auf Serverebene“disconnectServer(name):
- entfernt ausstehende Einträge/Quell-Metadaten,
- schließt den Transport wenn verbunden,
- entfernt die
mcp_-Tools dieses Servers aus dem Manager-Zustand.
Globale Beendigung
Abschnitt betitelt „Globale Beendigung“disconnectAll():
- schließt alle aktiven Transporte mit
Promise.allSettled, - löscht ausstehende Maps, Quellen, Verbindungen und die Manager-Tool-Liste.
In der aktuellen Verdrahtung wird die explizite Beendigung in MCP-Befehlsabläufen verwendet (für Neuladung/Entfernung/Deaktivierung). Es gibt keinen separaten automatischen Manager-Disposal-Hook im Startup-Pfad selbst; Aufrufer sind dafür verantwortlich, die Disconnect-Methoden des Managers aufzurufen, wenn sie ein deterministisches MCP-Herunterfahren benötigen.
Fehlermodi und Garantien
Abschnitt betitelt „Fehlermodi und Garantien“| Szenario | Verhalten | Harter Fehler vs. Best-Effort |
|---|---|---|
| Entdeckung wirft Ausnahme (Capability-/Konfigurationsladeepfad) | Loader gibt leere Tools + synthetischen .mcp.json-Fehler zurück | Best-Effort-Sitzungsstart |
| Ungültige Serverkonfiguration | Server wird mit Validierungsfehlereintrag übersprungen | Best-Effort pro Server |
| Verbindungs-Timeout/Initialisierungsfehler | Serverfehler wird aufgezeichnet; andere fahren fort | Best-Effort pro Server |
tools/list beim Startup noch ausstehend mit Cache-Treffer | Deferred-Tools werden sofort zurückgegeben | Best-Effort schneller Start |
tools/list beim Startup noch ausstehend ohne Cache | Startup wartet auf Abschluss der ausstehenden Aufgaben | Hartes Warten auf Korrektheit |
| Später Hintergrund-Tool-Ladefehler | Wird nach dem Startup-Gate protokolliert | Best-Effort-Protokollierung |
| Laufzeit-Transportabbruch | Keine automatische Wiederverbindung; zukünftige Aufrufe schlagen fehl bis zur Wiederverbindung/Neuladung | Best-Effort-Wiederherstellung durch manuelle Aktion |
Öffentliche API-Oberfläche
Abschnitt betitelt „Öffentliche API-Oberfläche“src/mcp/index.ts re-exportiert Loader/Manager/Client-APIs für externe Aufrufer. src/sdk.ts stellt discoverMCPServers() als Komfort-Wrapper bereit, der die gleiche Loader-Ergebnisstruktur zurückgibt.
Implementierungsdateien
Abschnitt betitelt „Implementierungsdateien“src/mcp/loader.ts— Loader-Fassade, Normalisierung von Entdeckungsfehlern,LoadedCustomTool-Konvertierung.src/mcp/manager.ts— Lebenszyklus-Zustandsregistries, paralleler Verbindungs-/Listenauflistungsablauf, Aktualisierung/Trennung.src/mcp/client.ts— Transport-Setup, Initialisierungs-Handshake, Auflisten/Aufrufen/Trennen.src/mcp/index.ts— MCP-Modul-API-Exporte.src/sdk.ts— Startup-Verdrahtung in Sitzung/Tool-Registry.src/mcp/config.ts— Konfigurationsentdeckung/-filterung/-validierung, die vom Manager verwendet wird.src/mcp/tool-bridge.ts—MCPTool- undDeferredMCPTool-Laufzeitverhalten.src/session/agent-session.ts—refreshMCPToolsLive-Neubindung.src/modes/controllers/mcp-command-controller.ts— Interaktive Neuladeungs-/Wiederverbindungsabläufe.src/task/executor.ts— Subagent-MCP-Proxying über übergeordnete Manager-Verbindungen.