Partager via


Simuler des réponses STDIO pour les serveurs MCP

Le développement d’IA moderne s’appuie de plus en plus sur les outils locaux qui communiquent via STDIO, en particulier les serveurs MCP (Model Context Protocol). Ces serveurs reçoivent JSON-RPC demandes via stdin et envoient des réponses JSON-RPC via stdout. À l’aide du proxy de développement, vous pouvez intercepter et simuler la communication STDIO pour tester vos applications clientes IA sans exécuter de logique serveur réelle.

Prerequisites

Simuler les réponses du serveur MCP

Pour simuler les réponses du serveur MCP, vous utilisez la stdio commande avec le MockStdioResponsePlugin. Le plug-in intercepte stdin et retourne des réponses fictifs via stdout ou stderr.

1. Créer un fichier de configuration du proxy de développement

Créez un fichier devproxyrc.json avec le contenu suivant :

{
  "$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. Créer un fichier fictif

Créez un stdio-mocks.json fichier avec des réponses fictifs pour le serveur 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. Démarrer le proxy de développement

Exécutez le proxy de développement avec la STDIO commande, en spécifiant la commande à exécuter :

devproxy stdio npx -y @modelcontextprotocol/server-filesystem

Le proxy de développement démarre le serveur MCP en tant que processus enfant et intercepte toutes les communications stdin/stdout. Lorsque stdin contient du texte correspondant à un mock bodyFragment, le proxy de développement retourne la réponse mock au lieu de transférer la requête au serveur réel.

Utilisez des espaces réservés pour les réponses dynamiques

Pour créer des réponses dynamiques qui incluent des valeurs à partir de la requête, utilisez les espaces réservés @stdin.body.*.

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

Espaces réservés disponibles :

Placeholder Descriptif
@stdin.body.id ID de requête JSON-RPC
@stdin.body.method nom de la méthode JSON-RPC
@stdin.body.params.* Accès aux paramètres de requête

Bloquer les demandes non bloquées

Définissez blockUnmockedRequests à true pour empêcher les requêtes non simulées d’atteindre le processus enfant :

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

Le blocage des requêtes non bloquées est utile lorsque vous souhaitez simuler complètement le serveur MCP sans exécuter sa logique réelle.

Charger des réponses fictives à partir de fichiers

Pour les réponses complexes, chargez le contenu à partir de fichiers externes :

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

Créez le fichier initialize-response.json :

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

Inspecter le trafic STDIO dans DevTools

Lorsque vous activez le DevToolsPlugin, le proxy de développement ouvre Chrome DevTools, où vous pouvez inspecter toutes les communications STDIO :

  • Onglet Réseau : Afficher tous les messages stdin/stdout/stderr
  • URL : les messages s’affichent en tant que stdio://command-name
  • Méthodes : Les demandes s’affichent en tant que stdin
  • Codes d’état : stdout apparaît comme 200, stderr comme 500
  • Minutage : voir combien de temps chaque demande/réponse a pris

L'utilisation de DevToolsPlugin est inestimable pour le débogage des problèmes de communication entre votre client IA et les serveurs MCP.

Simuler la latence

Pour tester la façon dont votre application gère les réponses lentes du serveur MCP, ajoutez les LatencyPluginpoints suivants :

{
  "$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"
  }
}

Étape suivante

En savoir plus sur la fonctionnalité de proxy STDIO :