Partilhar via


Respostas simuladas STDIO para servidores MCP

O desenvolvimento moderno de IA depende cada vez mais de ferramentas locais que comunicam via STDIO, particularmente servidores Model Context Protocol (MCP). Estes servidores recebem pedidos JSON-RPC via stdin e enviam respostas JSON-RPC via stdout. Usando Dev Proxy, podes intercetar e simular a comunicação STDIO para testar as tuas aplicações cliente de IA sem correr lógica real do servidor.

Pré-requisitos

Respostas simuladas do servidor MCP

Para simular as respostas do servidor MCP, utiliza-se o stdio comando com o MockStdioResponsePlugin. O plugin interceta stdin e devolve respostas simuladas via stdout ou stderr.

1. Criar um ficheiro de configuração Dev Proxy

Crie um devproxyrc.json arquivo com o seguinte conteúdo:

{
  "$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. Criar um ficheiro simulado

Crie um stdio-mocks.json ficheiro com respostas simuladas para o 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 Desenvolvimento

Execute o Dev Proxy com o STDIO comando, especificando o comando a executar:

devproxy stdio npx -y @modelcontextprotocol/server-filesystem

O Proxy de desenvolvimento inicia o servidor MCP como um processo filho e interceta toda a comunicação stdin/stdout. Quando o stdin contém texto que corresponde a um bodyFragment mock, Dev Proxy devolve a resposta simulada em vez de encaminhar o pedido para o servidor real.

Use marcadores de posição para respostas dinâmicas

Para criar respostas dinâmicas que incluam valores da requisição, use @stdin.body.* marcadores de posição.

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

Marcadores disponíveis:

Placeholder Description
@stdin.body.id JSON-RPC ID de pedido
@stdin.body.method JSON-RPC nome do método
@stdin.body.params.* Acesso aos parâmetros do pedido

Bloquear pedidos não simulados

Para evitar que pedidos não simulados cheguem ao processo filho, defina blockUnmockedRequests para true:

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

Bloquear pedidos não simulados é útil quando se quer simular totalmente o servidor MCP sem correr a sua lógica real.

Carregar respostas simuladas a partir de ficheiros

Para respostas complexas, carregue o conteúdo a partir de ficheiros externos:

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

Crie o arquivo initialize-response.json:

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

Inspecionar o tráfego de STDIO nas Ferramentas de Desenvolvimento

Quando ativas o DevToolsPlugin, Dev Proxy abre o Chrome DevTools, onde podes inspecionar toda a comunicação STDIO:

  • Separador de rede: Ver todas as mensagens stdin/stdout/stderr
  • URLs: As mensagens aparecem como stdio://command-name
  • Métodos: Os pedidos são apresentados como stdin
  • Códigos de estado: stdout aparece como 200, stderr como 500
  • Timing: Veja quanto tempo demorou cada pedido/resposta

A utilização do DevToolsPlugin é inestimável na resolução de problemas de comunicação entre o seu cliente de IA e os servidores MCP.

Simular latência

Para testar como a sua aplicação lida com respostas lentas do servidor MCP, adicione o 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"
  }
}

Próximo passo

Saiba mais sobre a funcionalidade proxy STDIO: