Udostępnij przez


Mockowanie odpowiedzi STDIO dla serwerów MCP

Nowoczesne tworzenie sztucznej inteligencji coraz częściej opiera się na lokalnych narzędziach komunikujących się za pośrednictwem stDIO, szczególnie serwerów protokołu MCP (Model Context Protocol). Te serwery odbierają żądania JSON-RPC za pośrednictwem narzędzia stdin i wysyłają odpowiedzi JSON-RPC za pośrednictwem funkcji stdout. Dzięki Dev Proxy można przechwytywać i symulować komunikację STDIO, aby testować aplikacje klienckie sztucznej inteligencji bez potrzeby uruchamiania właściwej logiki serwera.

Wymagania wstępne

Symulowanie odpowiedzi serwera MCP

Aby symulować odpowiedzi serwera MCP, należy użyć polecenia stdio z MockStdioResponsePlugin. Wtyczka przechwytuje stdin i zwraca pozorne odpowiedzi za pośrednictwem stdout lub stderr.

1. Tworzenie pliku konfiguracji serwera proxy dewelopera

devproxyrc.json Utwórz plik z następującą zawartością:

{
  "$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. Tworzenie pliku makiety

stdio-mocks.json Utwórz plik z pozornymi odpowiedziami dla serwera MCP:

{
  "$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. Uruchamianie serwera proxy deweloperskiego

Uruchom serwer proxy deweloperski za pomocą komendy STDIO, określając polecenie do uruchomienia:

devproxy stdio npx -y @modelcontextprotocol/server-filesystem

Serwer "Dev Proxy" uruchamia serwer MCP jako proces podrzędny i przechwytuje całą komunikację stdin/stdout. Gdy stdin zawiera tekst pasujący do makiety bodyFragment, serwer proxy dewelopera zwraca pozorną odpowiedź zamiast przekazywać żądanie do rzeczywistego serwera.

Użyj elementów zastępczych dla odpowiedzi dynamicznych

Aby utworzyć odpowiedzi dynamiczne zawierające wartości z żądania, użyj @stdin.body.* symboli zastępczych:

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

Dostępne symbole zastępcze:

Placeholder Description
@stdin.body.id identyfikator żądania JSON-RPC
@stdin.body.method nazwa metody JSON-RPC
@stdin.body.params.* Dostęp do parametrów żądania

Blokuj niezadokowane żądania

Aby zapobiec dotarciu niezamockowanych żądań do procesu podrzędnego, ustaw wartość blockUnmockedRequeststrue:

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

Blokowanie niezadokowanych żądań jest przydatne, gdy chcesz w pełni wyśmiewać serwer MCP bez uruchamiania rzeczywistej logiki.

Ładowanie szablonowych odpowiedzi z plików

W przypadku złożonych odpowiedzi załaduj zawartość z plików zewnętrznych:

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

Utwórz plik initialize-response.json:

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

Inspekcja ruchu STDIO w narzędziu DevTools

Po włączeniu DevToolsPlugin Dev Proxy, zostanie otwarty program Chrome DevTools, w którym można sprawdzić całą komunikację STDIO.

  • Karta Sieć: Wyświetlanie wszystkich komunikatów stdin/stdout/stderr
  • Adresy URL: Komunikaty są wyświetlane jako stdio://command-name
  • Metody: żądania są wyświetlane jako stdin
  • Kody stanu: stdout są wyświetlane jako 200, stderr jako 500
  • Czas: Zobacz, jak długo trwało każde żądanie/odpowiedź

Użycie elementu DevToolsPlugin jest bezcenne w przypadku debugowania problemów z komunikacją między klientem sztucznej inteligencji a serwerami MCP.

Symulowanie opóźnienia

Aby sprawdzić, jak aplikacja obsługuje powolne odpowiedzi serwera MCP, dodaj element LatencyPlugin:

{
  "$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"
  }
}

Następny krok

Dowiedz się więcej o funkcji serwera proxy STDIO: