Delen via


Mock STDIO-antwoorden voor MCP-servers

Moderne AI-ontwikkeling is in toenemende mate afhankelijk van lokale hulpprogramma's die communiceren via STDIO, met name MCP-servers (Model Context Protocol). Deze servers ontvangen JSON-RPC aanvragen via stdin en verzenden JSON-RPC antwoorden via stdout. Met behulp van Dev Proxy kunt u STDIO-communicatie onderscheppen en mocken om uw AI-clienttoepassingen te testen zonder werkelijke serverlogica uit te voeren.

Vereiste voorwaarden

Gesimuleerde MCP-serverreacties

Als u mcp-serverreacties wilt mocken, gebruikt u de stdio opdracht met de MockStdioResponsePlugin. De invoegtoepassing onderschept stdin en retourneert mock-antwoorden via stdout of stderr.

1. Een Dev Proxy-configuratiebestand maken

Maak een devproxyrc.json bestand met de volgende inhoud:

{
  "$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. Een mocks-bestand maken

Maak een stdio-mocks.json bestand met gesimuleerde antwoorden voor de 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. Dev Proxy starten

Voer Dev Proxy uit met de STDIO opdracht en geef de opdracht op die moet worden uitgevoerd:

devproxy stdio npx -y @modelcontextprotocol/server-filesystem

Dev Proxy start de MCP-server als een onderliggend proces en onderschept alle stdin/stdout-communicatie. Wanneer stdin tekst bevat die overeenkomt met een mock's bodyFragment, retourneert Dev Proxy het mock-antwoord in plaats van de aanvraag door te sturen naar de werkelijke server.

Tijdelijke aanduidingen gebruiken voor dynamische antwoorden

Als u dynamische antwoorden wilt maken die waarden uit de aanvraag bevatten, gebruikt u @stdin.body.* tijdelijke aanduidingen:

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

Beschikbare tijdelijke aanduidingen:

Placeholder Description
@stdin.body.id JSON-RPC aanvraag-id
@stdin.body.method JSON-RPC methodenaam
@stdin.body.params.* Toegang tot aanvraagparameters

Niet-gemockte verzoeken blokkeren

Als u wilt voorkomen dat niet-verwerkte aanvragen het onderliggende proces bereiken, stelt u het volgende in blockUnmockedRequeststrue:

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

Het blokkeren van niet-verwerkte aanvragen is handig wanneer u de MCP-server volledig wilt bespotten zonder de werkelijke logica uit te voeren.

Gesimuleerde antwoorden laden uit bestanden

Laad de inhoud van externe bestanden voor complexe antwoorden:

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

Maak het initialize-response.json-bestand:

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

STDIO-verkeer inspecteren in DevTools

Wanneer u de DevToolsPluginDev Proxy inschakelt, wordt Chrome DevTools geopend, waar u alle STDIO-communicatie kunt inspecteren:

  • Tabblad Netwerk: alle stdin/stdout/stderr-berichten weergeven
  • URL's: berichten worden weergegeven als stdio://command-name
  • Methoden: Aanvragen worden weergegeven als stdin
  • Statuscodes: stdout wordt weergegeven als 200, stderr als 500
  • Timing: Bekijk hoe lang elke aanvraag/reactie duurde

Het gebruik van DevToolsPlugin is van onschatbare waarde bij het opsporen van communicatieproblemen tussen uw AI-client en MCP-servers.

Latentie simuleren

Als u wilt testen hoe uw toepassing trage MCP-serverreacties verwerkt, voegt u het LatencyPluginvolgende toe:

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

Volgende stap

Meer informatie over de functie STDIO-proxy: