Freigeben über


Simulierte STDIO-Antworten für MCP-Server

Moderne KI-Entwicklung basiert zunehmend auf lokalen Tools, die über STDIO kommunizieren, insbesondere auf McP-Servern (Model Context Protocol). Diese Server empfangen JSON-RPC Anfragen über stdin und senden JSON-RPC Antworten über stdout. Mithilfe von Dev Proxy können Sie STDIO-Kommunikation abfangen und modellieren, um Ihre KI-Clientanwendungen zu testen, ohne die tatsächliche Serverlogik auszuführen.

Voraussetzungen

Simulierte MCP-Serverantworten

Um MCP-Serverantworten zu modellieren, verwenden Sie den stdio Befehl mit dem MockStdioResponsePlugin. Das Plug-In fängt stdin ab und gibt simulierte Antworten über stdout oder stderr zurück.

1. Erstellen einer Dev Proxy-Konfigurationsdatei

Erstellen Sie die Datei devproxyrc.json mit folgendem Inhalt:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.1.0/rc.schema.json",
  "plugins": [
    {
      "name": "MockSTDIOResponsePlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "mockSTDIOResponsePlugin"
    },
    {
      "name": "DevToolsPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "devTools"
    }
  ],
  "devTools": {
    "preferredBrowser": "Edge"
  },
  "mockStdioResponsePlugin": {
    "mocksFile": "stdio-mocks.json"
  }
}

2. Erstellen einer Mocks-Datei

Erstellen Sie eine stdio-mocks.json Datei mit simulierten Antworten für den MCP-Server:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.1.0/mockstdioresponseplugin.schema.json",
  "mocks": [
    {
      "request": {
        "bodyFragment": "initialize"
      },
      "response": {
        "stdout": "{\"jsonrpc\":\"2.0\",\"id\":@stdin.body.id,\"result\":{\"protocolVersion\":\"2024-11-05\",\"capabilities\":{\"tools\":{}},\"serverInfo\":{\"name\":\"Mock MCP Server\",\"version\":\"1.0.0\"}}}\n"
      }
    },
    {
      "request": {
        "bodyFragment": "tools/list"
      },
      "response": {
        "stdout": "{\"jsonrpc\":\"2.0\",\"id\":@stdin.body.id,\"result\":{\"tools\":[{\"name\":\"get_weather\",\"description\":\"Get current weather for a location\",\"inputSchema\":{\"type\":\"object\",\"properties\":{\"location\":{\"type\":\"string\",\"description\":\"City name\"}},\"required\":[\"location\"]}}]}}\n"
      }
    },
    {
      "request": {
        "bodyFragment": "tools/call"
      },
      "response": {
        "stdout": "{\"jsonrpc\":\"2.0\",\"id\":@stdin.body.id,\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"Mock response from the tool\"}]}}\n"
      }
    }
  ]
}

3. Starten des Dev-Proxys

Führen Sie Dev Proxy mit dem STDIO Befehl aus, und geben Sie den auszuführenden Befehl an:

devproxy stdio npx -y @modelcontextprotocol/server-filesystem

Dev Proxy startet den MCP-Server als untergeordneter Prozess und fängt alle Stdin/Stdout-Kommunikation ab. Wenn stdin Text enthält, der mit einem Mock bodyFragment übereinstimmt, gibt Dev Proxy die Mock-Antwort zurück, anstatt die Anforderung an den tatsächlichen Server weiterzuleiten.

Verwenden von Platzhaltern für dynamische Antworten

Verwenden Sie @stdin.body.* Platzhalter, um dynamische Antworten zu erstellen, die Werte aus der Anforderung enthalten:

{
  "mocks": [
    {
      "request": {
        "bodyFragment": "echo"
      },
      "response": {
        "stdout": "{\"jsonrpc\":\"2.0\",\"id\":@stdin.body.id,\"result\":{\"message\":\"You said: @stdin.body.params.text\"}}\n"
      }
    }
  ]
}

Verfügbare Platzhalter:

Platzhalter Description
@stdin.body.id JSON-RPC Anforderungs-ID
@stdin.body.method JSON-RPC Methodenname
@stdin.body.params.* Zugriff auf Anforderungsparameter

Blockieren von nicht gemockten Anfragen

Um zu verhindern, dass nicht simulierte Anforderungen den untergeordneten Prozess erreichen, legen Sie folgendes blockUnmockedRequests fest: true

{
  "mockStdioResponsePlugin": {
    "mocksFile": "stdio-mocks.json",
    "blockUnmockedRequests": true
  }
}

Das Blockieren nicht gemockter Anforderungen ist nützlich, wenn Sie den MCP-Server vollständig mocken möchten, ohne dessen tatsächliche Logik auszuführen.

Laden von simulierten Antworten aus Dateien

Laden Sie bei komplexen Antworten den Inhalt aus externen Dateien:

{
  "mocks": [
    {
      "request": {
        "bodyFragment": "initialize"
      },
      "response": {
        "stdout": "@initialize-response.json"
      }
    }
  ]
}

Erstellen Sie die initialize-response.json-Datei:

{"jsonrpc":"2.0","id":1,"result":{"protocolVersion":"2024-11-05","capabilities":{"tools":{}},"serverInfo":{"name":"Mock MCP Server","version":"1.0.0"}}}

STDIO-Datenverkehr in DevTools überprüfen

Wenn Sie den DevToolsPlugin Dev-Proxy aktivieren, öffnet sich Chrome DevTools, wo Sie die gesamte STDIO-Kommunikation inspizieren können.

  • Registerkarte "Netzwerk": Alle Stdin/stdout/stderr-Nachrichten anzeigen
  • URLs: Nachrichten werden als stdio://command-name
  • Methoden: Anfragen werden als stdin
  • Statuscodes: stdout wird als 200 angezeigt, stderr als 500
  • Zeitdauer: Sehen Sie, wie lange jede Anforderung/Antwort gedauert hat

Die Verwendung des DevToolsPlugin zum Debuggen von Kommunikationsproblemen zwischen Ihrem KI-Client und MCP-Servern ist von unschätzbarem Wert.

Simulieren der Latenz

Um zu testen, wie Ihre Anwendung langsame MCP-Serverantworten verarbeitet, fügen Sie Folgendes LatencyPluginhinzu:

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.1.0/rc.schema.json",
  "plugins": [
    {
      "name": "LatencyPlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "latencyPlugin"
    },
    {
      "name": "MockStdioResponsePlugin",
      "enabled": true,
      "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
      "configSection": "mockStdioResponsePlugin"
    }
  ],
  "latencyPlugin": {
    "minMs": 100,
    "maxMs": 500
  },
  "mockStdioResponsePlugin": {
    "mocksFile": "stdio-mocks.json"
  }
}

Nächster Schritt

Weitere Informationen zum STDIO-Proxyfeature: