Partager via


MockStdioResponsePlugin

Simule des réponses pour les applications BASÉEs sur STDIO, telles que les serveurs MCP (Model Context Protocol).

Définition de l’instance de plug-in

{
  "name": "MockStdioResponsePlugin",
  "enabled": true,
  "pluginPath": "~appFolder/plugins/DevProxy.Plugins.dll",
  "configSection": "mockStdioResponsePlugin"
}

Exemple de configuration

{
  "$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"
    }
  ],
  "mockStdioResponsePlugin": {
    "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.1.0/mockstdioresponseplugin.schema.json",
    "mocksFile": "stdio-mocks.json"
  }
}

Propriétés de configuration

Propriété Descriptif Par défaut
mocksFile Chemin d’accès au fichier contenant des réponses fictives STDIO stdio-mocks.json
blockUnmockedRequests Quand true, empêche la stdin sans correspondance d’atteindre le processus enfant false

Options de ligne de commande

Nom Descriptif Par défaut
--no-stdio-mocks Désactiver le chargement des réponses fictives STDIO false
--stdio-mocks-file Chemin d’accès au fichier contenant des réponses fictives STDIO -

Exemples de fichiers fictifs

Voici des exemples d’objets fictifs STDIO.

Répondre avec stdout

Répondez à stdin contenant un texte spécifique avec une réponse stdout.

Fichier : stdio-mocks.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.1.0/mockstdioresponseplugin.schema.json",
  "mocks": [
    {
      "request": {
        "bodyFragment": "tools/list"
      },
      "response": {
        "stdout": "{\"jsonrpc\":\"2.0\",\"id\":1,\"result\":{\"tools\":[]}}\n"
      }
    }
  ]
}

Répondre avec stderr

Répondez à stdin avec un message d’erreur sur stderr.

Fichier : stdio-mocks.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.1.0/mockstdioresponseplugin.schema.json",
  "mocks": [
    {
      "request": {
        "bodyFragment": "invalid_method"
      },
      "response": {
        "stderr": "Error: Unknown method\n"
      }
    }
  ]
}

Utiliser des espaces réservés à partir de stdin

Utilisez @stdin.body.* des espaces réservés pour inclure dynamiquement des valeurs de stdin dans la réponse.

Fichier : stdio-mocks.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.1.0/mockstdioresponseplugin.schema.json",
  "mocks": [
    {
      "request": {
        "bodyFragment": "tools/list"
      },
      "response": {
        "stdout": "{\"jsonrpc\":\"2.0\",\"id\":@stdin.body.id,\"result\":{\"tools\":[]}}\n"
      }
    }
  ]
}

Les espaces réservés suivants sont 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.name Accès à la propriété imbriquée

Charger la réponse à partir d’un fichier

Chargez le contenu de réponse fictif à partir d’un fichier externe à l’aide @filename de la syntaxe.

Fichier : stdio-mocks.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.1.0/mockstdioresponseplugin.schema.json",
  "mocks": [
    {
      "request": {
        "bodyFragment": "initialize"
      },
      "response": {
        "stdout": "@initialize-response.json"
      }
    }
  ]
}

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

Répondre à la nième occurrence

Répondez uniquement après avoir intercepté la stdin correspondante pour la nième fois.

Fichier : stdio-mocks.json

{
  "$schema": "https://raw.githubusercontent.com/dotnet/dev-proxy/main/schemas/v2.1.0/mockstdioresponseplugin.schema.json",
  "mocks": [
    {
      "request": {
        "bodyFragment": "tools/call",
        "nth": 2
      },
      "response": {
        "stdout": "{\"jsonrpc\":\"2.0\",\"id\":@stdin.body.id,\"result\":{\"content\":[{\"type\":\"text\",\"text\":\"Operation completed\"}]}}\n"
      }
    }
  ]
}

Propriétés de fichier fictifs

Propriété Descriptif Obligatoire
request Objet de requête qui définit la stdin à mettre en correspondance oui
response Objet response qui définit la réponse à retourner oui

Objet de Requête

Chaque requête a les propriétés suivantes :

Propriété Descriptif Obligatoire Valeur par défaut Valeur d'échantillon
bodyFragment Chaîne qui doit être présente dans stdin oui tools/list
nth Répondre uniquement lors de l’interception de la demande pour la nième fois Non 2

Objet Response

Chaque réponse a les propriétés suivantes :

Propriété Descriptif Obligatoire Valeur par défaut Valeur d'échantillon
stdout Contenu à envoyer à stdout Non empty {"result": "ok"}\n
stderr Contenu à envoyer à stderr Non empty Error: Something went wrong\n

Remarques de réponse

Si vous souhaitez charger le contenu de réponse à partir d’un fichier, définissez la ou stderr la stdout propriété sur une valeur de chaîne qui commence par @ suivi du chemin d’accès du fichier par rapport au fichier fictif. Par exemple, @response.json retourne le contenu stocké dans le response.json fichier dans le même répertoire que le fichier fictif.

Pour inclure dynamiquement des valeurs de stdin dans la réponse, utilisez @stdin.body.* des espaces réservés. Par exemple, @stdin.body.id retourne la valeur de la id propriété à partir du code JSON stdin.

Remarques sur le plug-in

Ce plug-in est conçu pour être utilisé avec la stdio commande pour intercepter et simuler la communication STDIO avec des exécutables locaux. Il est utile pour tester et déboguer des serveurs MCP (Model Context Protocol) et d’autres applications STDIO.

Quand blockUnmockedRequests est défini truesur , toute stdin qui ne correspond pas à une simulation est consommée et n’est pas transférée au processus enfant. Le blocage des requêtes non bloquées est utile lorsque vous souhaitez simuler complètement le comportement d’un exécutable sans exécuter sa logique réelle.

Étape suivante