Compartilhar via


Respostas STDIO simuladas para servidores MCP

O desenvolvimento de IA moderno depende cada vez mais de ferramentas locais que se comunicam por meio do STDIO, especialmente servidores MCP (Model Context Protocol). Esses servidores recebem solicitações JSON-RPC por meio de stdin e enviam respostas JSON-RPC por meio de stdout. Usando o Proxy de Desenvolvimento, você pode interceptar e simular a comunicação STDIO para testar seus aplicativos cliente de IA sem executar a lógica real do servidor.

Pré-requisitos

Respostas simuladas do servidor MCP

Para simular as respostas do servidor MCP, use o stdio comando com o MockStdioResponsePlugin. O plug-in intercepta stdin e retorna respostas simuladas por meio de stdout ou stderr.

1. Criar um arquivo de configuração do Proxy de Desenvolvimento

Crie um arquivo devproxyrc.json 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 arquivo de simulações

Crie um stdio-mocks.json arquivo 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 Proxy de Desenvolvimento com o STDIO comando, especificando o comando a ser executado:

devproxy stdio npx -y @modelcontextprotocol/server-filesystem

O Proxy de Desenvolvimento inicia o servidor MCP como um processo filho e intercepta toda a comunicação stdin/stdout. Quando o stdin contém texto correspondente a uma simulação específica bodyFragment, o Proxy de Dev retorna a resposta simulada em vez de redirecionar a solicitação para o servidor real.

Usar espaços reservados 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"
      }
    }
  ]
}

Espaços reservados disponíveis:

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

Bloquear solicitações não bloqueadas

Para impedir que solicitações não simuladas atinjam o processo filho, configure blockUnmockedRequests para true:

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

Bloquear solicitações não simuladas é útil quando você deseja emular completamente o servidor MCP sem executar sua lógica original.

Carregar respostas simuladas de arquivos

Para respostas complexas, carregue o conteúdo de arquivos 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 STDIO em DevTools

Quando você habilita o DevToolsPlugin, o Proxy de Desenvolvimento abre o Chrome DevTools, onde você pode inspecionar toda a comunicação STDIO:

  • Guia Rede: Exibir todas as mensagens stdin/stdout/stderr
  • URLs: as mensagens aparecem como stdio://command-name
  • Métodos: As solicitações são mostradas como stdin
  • Códigos de status: stdout aparece como 200, stderr como 500
  • Tempo: veja quanto tempo cada solicitação/resposta levou

Usar o DevToolsPlugin é inestimável para depurar problemas de comunicação entre seu cliente de IA e servidores MCP.

Simular latência

Para testar como seu aplicativo lida com respostas lentas do servidor MCP, adicione :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óxima etapa

Saiba mais sobre o recurso de proxy STDIO: