Поделиться через


Моделированные STDIO-ответы для серверов MCP

Современная разработка ИИ все чаще использует локальные средства, взаимодействующие через STDIO, особенно серверы протокола MCP. Эти серверы получают запросы JSON-RPC через stdin и отправляют JSON-RPC ответы через stdout. С помощью прокси-сервера разработки можно перехватывать и макетировать взаимодействие STDIO для тестирования клиентских приложений ИИ без выполнения фактической логики сервера.

Предпосылки

Ответы сервера Mock MCP

Чтобы имитировать ответы сервера MCP, используйте команду stdio вместе с MockStdioResponsePlugin. Плагин перехватывает stdin и возвращает тестовые ответы через stdout или stderr.

1. Создание файла конфигурации прокси-сервера разработки

devproxyrc.json Создайте файл со следующим содержимым:

{
  "$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. Создание файла макетов

stdio-mocks.json Создайте файл с макетными ответами на сервер 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. Запуск прокси-сервера разработки

Запустите прокси-сервер разработки STDIO с помощью команды, указав команду для выполнения:

devproxy stdio npx -y @modelcontextprotocol/server-filesystem

Сервер Dev Proxy запускает сервер MCP в качестве дочернего процесса и перехватывает все связи stdin/stdout. Если stdin содержит текст, соответствующий макету bodyFragment, dev Proxy возвращает макет ответа вместо перенаправления запроса на фактический сервер.

Использование заполнителей для динамических ответов

Чтобы создать динамические ответы, содержащие значения из запроса, используйте @stdin.body.* заполнители:

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

Доступные заполнители:

Placeholder Description
@stdin.body.id идентификатор запроса JSON-RPC
@stdin.body.method имя метода JSON-RPC
@stdin.body.params.* Доступ к параметрам запроса

Блокировать незапрошенные запросы

Чтобы предотвратить передачу немоделируемых запросов в дочерний процесс, установите значение blockUnmockedRequeststrue:

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

Блокировка немокированных запросов полезна, если вы хотите полностью эмулировать сервер MCP без выполнения реальной логики.

Загрузка макетных ответов из файлов

Для сложных ответов загрузите содержимое из внешних файлов:

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

Создайте файл initialize-response.json:

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

Проверка трафика STDIO в DevTools

При включении DevToolsPlugin Dev Proxy откроется Chrome DevTools, где можно проверить весь обмен данными по STDIO:

  • Сетевая вкладка: просмотр всех сообщений stdin/stdout/stderr
  • URL-адреса: сообщения отображаются как stdio://command-name
  • Методы: запросы отображаются как stdin
  • Коды состояния: stdout отображается как 200, stderr как 500
  • Время: узнайте, сколько времени занимает каждый запрос или ответ

Использование DevToolsPlugin неоценимо для отладки проблем коммуникации между клиентом ИИ и серверами MCP.

Имитация задержки

Чтобы проверить, как приложение обрабатывает медленные ответы сервера MCP, добавьте следующее 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"
  }
}

Следующий шаг

Дополнительные сведения о функции прокси-сервера STDIO: