Condividi tramite


Simulare le risposte STDIO per i server MCP

Lo sviluppo di intelligenza artificiale moderna si basa sempre più su strumenti locali che comunicano tramite STDIO, in particolare i server MCP (Model Context Protocol). Questi server ricevono JSON-RPC richieste tramite stdin e inviano risposte JSON-RPC tramite stdout. Usando Dev Proxy, è possibile intercettare e simulare la comunicazione STDIO per testare le applicazioni client di intelligenza artificiale senza eseguire la logica effettiva del server.

Prerequisiti

Simulare le risposte del server MCP

Per simulare le risposte del server MCP, usare il stdio comando con .MockStdioResponsePlugin Il plug-in intercetta stdin e restituisce risposte fittizie tramite stdout o stderr.

1. Creare un file di configurazione del proxy di sviluppo

Creare un file devproxyrc.json con i contenuti seguenti:

{
  "$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. Creare un file fittizio

Creare un stdio-mocks.json file con risposte fittizie per il server 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. Avviare il proxy di sviluppo

Eseguire Dev Proxy con il STDIO comando , specificando il comando da eseguire:

devproxy stdio npx -y @modelcontextprotocol/server-filesystem

Dev Proxy avvia il server MCP come processo figlio e intercetta tutte le comunicazioni stdin/stdout. Quando stdin contiene testo corrispondente a un fittizio bodyFragment, Dev Proxy restituisce la risposta fittizia anziché inoltrare la richiesta al server effettivo.

Utilizzare segnaposto per le risposte dinamiche

Per creare risposte dinamiche che includono valori dalla richiesta, usare @stdin.body.* i segnaposto:

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

Segnaposto disponibili:

Placeholder Description
@stdin.body.id Richiesta ID JSON-RPC
@stdin.body.method JSON-RPC nome del metodo
@stdin.body.params.* Accesso ai parametri della richiesta

Bloccare le richieste non rilevate

Per impedire che le richieste non simulate raggiungano il processo figlio, impostare blockUnmockedRequests su true:

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

Il blocco delle richieste non rilevate è utile quando si vuole simulare completamente il server MCP senza eseguire la logica effettiva.

Caricare risposte fittizie dai file

Per risposte complesse, caricare il contenuto da file esterni:

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

Creare il file initialize-response.json:

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

Esaminare il traffico STDIO in DevTools

Quando si abilita DevToolsPlugin, Dev Proxy apre Chrome DevTools in cui è possibile esaminare tutte le comunicazioni STDIO:

  • Scheda Rete: visualizza tutti i messaggi stdin/stdout/stderr
  • URL: i messaggi vengono visualizzati come stdio://command-name
  • Metodi: le richieste vengono visualizzate come stdin
  • Codici di stato: stdout viene visualizzato come 200, stderr come 500
  • Intervallo: vedere per quanto tempo sono stati impiegato ogni richiesta/risposta

L'uso di DevToolsPlugin è estremamente utile per il debug dei problemi di comunicazione tra il client di intelligenza artificiale e i server MCP.

Simulare la latenza

Per testare il modo in cui l'applicazione gestisce le risposte lente del server MCP, aggiungere :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"
  }
}

Passo successivo

Altre informazioni sulla funzionalità proxy STDIO: