Compartir a través de


Simulación de respuestas STDIO para servidores MCP

El desarrollo moderno de inteligencia artificial se basa cada vez más en herramientas locales que se comunican a través de STDIO, especialmente los servidores del Protocolo de contexto de modelo (MCP). Estos servidores reciben solicitudes JSON-RPC a través de stdin y envían JSON-RPC respuestas a través de stdout. Con el proxy de desarrollo, puede interceptar y simular la comunicación STDIO para probar las aplicaciones cliente de IA sin ejecutar lógica de servidor real.

Prerrequisitos

Simulación de respuestas de servidor MCP

Para simular respuestas del servidor MCP, utilice el comando stdio con el MockStdioResponsePlugin. El complemento intercepta stdin y devuelve respuestas simuladas a través de stdout o stderr.

1. Creación de un archivo de configuración de proxy de desarrollo

Cree un archivo devproxyrc.json con el siguiente contenido:

{
  "$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. Crear un archivo ficticio

Cree un stdio-mocks.json archivo con respuestas ficticias para el servidor 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. Iniciar Proxy de desarrollo

Ejecute dev Proxy con el STDIO comando y especifique el comando que se va a ejecutar:

devproxy stdio npx -y @modelcontextprotocol/server-filesystem

El proxy de desarrollo inicia el servidor MCP como un proceso secundario e intercepta toda la comunicación stdin/stdout. Cuando stdin contiene texto que coincide con el bodyFragment de un simulacro, Dev Proxy devuelve la respuesta simulada en lugar de transmitir la solicitud al servidor real.

Uso de marcadores de posición para respuestas dinámicas

Para crear respuestas dinámicas que incluyan valores de la solicitud, use @stdin.body.* marcadores de posición:

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

Marcadores de posición disponibles:

Placeholder Description
@stdin.body.id ID de solicitud de JSON-RPC
@stdin.body.method nombre del método JSON-RPC
@stdin.body.params.* Acceso a los parámetros de solicitud

Bloquear solicitudes no agrupadas

Para evitar que las solicitudes no agrupadas lleguen al proceso secundario, establezca en blockUnmockedRequeststrue:

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

Bloquear solicitudes no simuladas es útil cuando desea imitar completamente el servidor MCP sin ejecutar la lógica actual.

Carga de respuestas ficticias de archivos

Para respuestas complejas, cargue el contenido de archivos externos:

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

Cree el archivo initialize-response.json:

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

Inspeccionar el tráfico STDIO en DevTools

Al habilitar el DevToolsPlugin, el proxy de desarrollo abre Chrome DevTools, donde puede inspeccionar toda la comunicación STDIO.

  • Pestaña Red: Ver todas las mensajes stdin/stdout/stderr
  • Direcciones URL: los mensajes aparecen como stdio://command-name
  • Métodos: las solicitudes se muestran como stdin
  • Códigos de estado: stdout aparece como 200, stderr como 500
  • Tiempo: vea cuánto tiempo tardó cada solicitud o respuesta.

El uso del DevToolsPlugin es inestimable para depurar problemas de comunicación entre el cliente de IA y los servidores MCP.

Simular latencia

Para probar cómo la aplicación controla las respuestas lentas del servidor MCP, agregue :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"
  }
}

Paso siguiente

Obtenga más información sobre la característica de proxy STDIO: