MCP Fusion/Protocol and runtime/Moteur de prompts

Moteur de prompts

Demandez à l’IA à propos de Vinkius

Les prompts sont des citoyens de première classe aux côtés des tools : schémas d’arguments typés, exécution de tools en loopback depuis les handlers de prompt, pagination avec curseurs signés, intercepteurs et délais d’hydratation.

Les tools s’exécutent ; les prompts sèment. Un prompt est un modèle de conversation réutilisable, côté serveur : le client les liste, l’utilisateur en choisit un, et le serveur renvoie l’ensemble de messages. MCP Fusion les traite avec la même rigueur d’ingénierie que les tools : entrées typées, middleware, pagination et loopback vers votre propre pipeline de tools.

Définir un prompt

typescript
import { z } from 'zod';

export default f.prompt('issue.review')
  .describe('Review a pull request with the team checklist')
  .input(z.object({
    repo: z.string().describe('Repository slug'),
    pr: z.number().describe('Pull request number'),
  }))
  .handler(async (ctx, args) => ({
    description: 'Review acme/product#42 against the checklist',
    messages: [
      { role: 'user', content: `Review PR ${args.pr} in ${args.repo}. Use the checklist.` },
      { role: 'assistant', content: 'Sharing the checklist first, then the diff.' },
    ],
  }));

La forme fluent reprend celle des tools : .describe(), .input() (un objet Zod, ou une carte plate de descripteurs d’arguments primitifs), .use(middleware), .title(), .icons(), .tags() et le terminal .handler((ctx, args) => PromptResult). Le résultat est { description?, messages } avec les rôles user et assistant, le multi-tour est autorisé, et il existe des blocs de contenu au-delà du texte : image, audio, resource_link, resource et les helpers d’usine de PromptMessage (.system() est encodé comme user : MCP n’a pas de rôle system).

La forme déclarative, definePrompt, et la forme f.prompt(name, config) dans le style de f.presenter() existent pour les layouts config-as-code. Les arguments sont compilés vers Zod avec une validation plate et stricte : uniquement des primitifs, pas de tableaux ni d’objets imbriqués. C’est une contrainte de MCP, appliquée à la définition avec une erreur claire plutôt qu’au moment du wire.

Loopback : des prompts qui appellent des tools

Le contexte du handler de prompt inclut invokeTool(name, args), un dispatcher vers le même pipeline de tools, avec middleware, validation et Presenters. Un prompt n’est donc pas une chaîne statique : il peut récupérer le diff en direct de la PR avec les propres tools de l’utilisateur, hydrater la checklist, puis seulement renvoyer les messages semés. La RBAC est appliquée à l’intérieur du loopback (le contexte de l’appelant est le contexte de l’appelant), et le AbortSignal de la requête se propage : un prompt annulé annule donc le travail de tools qu’il a déclenché.

L’hydratation est bornée dans le temps : une échéance par registre (.timeout(ms) sur le builder ou setDefaultHydrationTimeout) plafonne le temps qu’un prompt peut passer à appeler des tools avant de renvoyer. Passé le délai, la réponse est envoyée avec un bloc d’alerte d’hydratation au lieu de laisser le client suspendu.

Pagination et cycle de vie

prompts/list est paginé côté serveur : CursorCodec transforme le nom « after » en un curseur soit signé HMAC-SHA256, soit chiffré AES-GCM (configuré avec un secret de 32 octets ; à défaut, une clé éphémère par processus). La taille de page par défaut est 50 et le filtrage par tags est pris en charge. Un curseur est opaque pour les clients, par conception.

notifyPromptListChanged() (ou le chemin d’événement list_changed sur les mutations de f.prompt à l’exécution) envoie notifications/prompts/list_changed avec un debounce de 100 ms, pour qu’un registre qui grossit en cours de session ne spamme pas le client.

Interceptors

registry.useInterceptor(fn) s’exécute après qu’un handler a renvoyé et avant que le client ne voie le résultat : ajouter un <compliance_notice>, placer un tour utilisateur en préambule, ou injecter des blocs de contexte enveloppés dans une balise. L’interception est la manière sûre d’ajouter des consignes à l’échelle de l’organisation sans éditer chaque prompt.

Pourquoi c’est important

La taxe d’intégration que paient les équipes qui construisent sur MCP est souvent « le client n’a que des tools ». Les prompts referment l’autre moitié de la boucle : vous livrez le workflow, pas seulement la capacité. Combinés aux Tools, aux Resources et au Wire format, un seul connecteur peut remettre à un agent la forme entière de la façon de travailler avec vos données, dans le protocole natif de l’agent.

Prochaines étapes