Bagikan melalui


Meniru respons STDIO untuk server MCP

Pengembangan AI modern semakin bergantung pada alat lokal yang berkomunikasi melalui STDIO, terutama server Model Context Protocol (MCP). Server ini menerima permintaan JSON-RPC melalui stdin dan mengirim respons JSON-RPC melalui stdout. Dengan menggunakan Dev Proxy, Anda dapat mencegat dan menipu komunikasi STDIO untuk menguji aplikasi klien AI Anda tanpa menjalankan logika server yang sebenarnya.

Prasyarat

Simulasi respons server MCP

Untuk mensimulasikan respons server MCP, Anda menggunakan perintah stdio dengan MockStdioResponsePlugin. Plugin mencegat stdin dan mengembalikan respons tiruan melalui stdout atau stderr.

1. Buat file konfigurasi Proksi Dev

Buat devproxyrc.json file dengan konten berikut:

{
  "$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. Buat file tiruan

Buat stdio-mocks.json file dengan respons tiruan untuk 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. Mulai Proksi Dev

Jalankan Proksi Dev dengan STDIO perintah , tentukan perintah yang akan dijalankan:

devproxy stdio npx -y @modelcontextprotocol/server-filesystem

Dev Proxy memulai server MCP sebagai proses anak dan mencegat semua komunikasi stdin/stdout. Saat stdin berisi teks yang cocok dengan tiruan bodyFragment, Proksi Dev mengembalikan respons tiruan alih-alih meneruskan permintaan ke server yang sebenarnya.

Gunakan tempat penampung untuk respons dinamis

Untuk membuat respons dinamis yang menyertakan nilai dari permintaan, gunakan @stdin.body.* placeholder:

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

Placeholder yang tersedia:

Placeholder Description
@stdin.body.id ID permintaan JSON-RPC
@stdin.body.method nama metode JSON-RPC
@stdin.body.params.* Akses ke parameter permintaan

Memblokir permintaan yang tidak dibuat tiruannya

Untuk mencegah permintaan yang tidak dimock mencapai proses anak, atur blockUnmockedRequests ke true:

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

Memblokir permintaan yang tidak di-mock berguna ketika Anda ingin sepenuhnya memanipulasi server MCP tanpa menjalankan logika aslinya.

Memuat respons tiruan dari file

Untuk respons kompleks, muat konten dari file eksternal:

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

Buat 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"}}}

Memeriksa lalu lintas STDIO di DevTools

Saat Anda mengaktifkan DevToolsPlugin, Dev Proxy akan membuka Chrome DevTools tempat Anda dapat memeriksa semua komunikasi STDIO:

  • Tab Jaringan: Menampilkan semua pesan stdin/stdout/stderr
  • URL: Pesan muncul sebagai stdio://command-name
  • Metode: Permintaan ditampilkan sebagai stdin
  • Kode status: stdout muncul sebagai 200, stderr sebagai 500
  • Waktu: Lihat berapa lama setiap permintaan/respons berlangsung

Penggunaan DevToolsPlugin sangat berharga untuk menyelesaikan masalah komunikasi antara AI client dan server MCP Anda.

Mensimulasikan latensi

Untuk menguji bagaimana aplikasi Anda menangani respons server MCP yang lambat, tambahkan 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"
  }
}

Langkah selanjutnya

Pelajari selengkapnya tentang fitur proksi STDIO: