Problème 1
Un agent appelle tout ce qu'il trouve
Exposer une API à un agent ouvre plus que nécessaire.
Réponse de Flexway : Seules les opérations marquées x-flexway-tool sont offertes, filtrées par les portées du jeton.
Agents : MCP et A2A
Les opérations que vous marquez deviennent des outils MCP, appelés avec la même identité, le même quota et le même audit que REST. Les serveurs MCP existants se branchent derrière la passerelle.
8 livrées sur les 9 présentées · depuis v0.1.0
Ce que vous attendez de ce domaine


Problème 1
Exposer une API à un agent ouvre plus que nécessaire.
Réponse de Flexway : Seules les opérations marquées x-flexway-tool sont offertes, filtrées par les portées du jeton.
Problème 2
Un agent réutilise le jeton qu'il a reçu, partout.
Réponse de Flexway : Un jeton est émis pour la surface MCP et n'est jamais relayé ; un amont qui vérifie les jetons reçoit un jeton échangé pour lui (RFC 8693).
Problème 3
Des serveurs MCP épars, chacun avec son authentification et sans quota.
Réponse de Flexway : La fédération les place derrière la passerelle : même autorisation, même quota, même audit.
Chaque étape est une décision lisible dans la trace et dans la console.
Agents : MCP et A2A - Schéma du domaine : qui appelle, les étapes de décision, ce qui est appelé, et le cas de refus.
hors portée : absent de tools/list, 403 à l'appel
Les agents IA : ils appellent des outils MCP et des modèles par Flexway, sous la même identité, le même quota et le même audit qu'une API.
Trajets qui passent ici
Les clients MCP (assistants, IDE) : ils découvrent puis appellent les outils exposés par Flexway, après un jeton OAuth 2.1.
Trajets qui passent ici
Le client MCP lit les métadonnées OAuth publiées par Flexway (RFC 9728) pour savoir où obtenir son jeton.
Trajets qui passent ici
Flexway exige un jeton OAuth 2.1 émis pour sa surface MCP, et le vérifie avant tout routage.
Trajets qui passent ici
Les opérations marquées du contrat deviennent des outils MCP ; un agent ne voit que ceux de ses portées.
Trajets qui passent ici
Un agent agit au nom d'une personne pour une durée et une profondeur bornées ; le jeton est échangé (RFC 8693), révocable en cascade.
Trajets qui passent ici
Un appel d'outil compte dans le même quota et le même audit qu'un appel REST.
Trajets qui passent ici
Le jeton de l'agent n'est jamais relayé à l'amont ; il est échangé quand l'amont vérifie les jetons.
Trajets qui passent ici
Vos services REST et gRPC : ils ne reçoivent que les requêtes que Flexway a laissées passer, sous délai et coupe-circuit.
Trajets qui passent ici
Vos serveurs MCP existants, fédérés derrière Flexway : leurs outils passent sous la même autorisation, le même quota et le même audit.
Trajets qui passent ici
L'essentiel de chaque sujet, avec son statut dans la version publiée ; dépliez une carte pour le texte complet.
Une opération marquée x-flexway-tool devient un outil MCP, filtré par les portées de l'appelant et appelé sous le même verdict et le même quota qu'en REST.
Une opération devient un outil d'agent quand le contrat la marque x-flexway-tool : l'exposition est opt-in, et une écriture n'est jamais offerte à un agent sans que quelqu'un l'ait décidé. tools/list est dérivé de l'OpenAPI - nom (operationId ou nom déclaré), description, schéma d'entrée construit depuis les paramètres et le corps déclarés - et filtré par les portées de l'appelant. Un outil qui n'est pas une opération déclarée n'existe pas.
tools/call construit la requête de l'opération et la fait passer, en mémoire, par la même décision qu'un appel REST : portées, quota de l'appelant, validation, politiques, budgets, métriques. Une opération est donc appelable en REST et via MCP avec le même verdict et le même seau de quota. Un argument non déclaré est refusé ; le résultat est rendu en texte, en structuredContent pour un objet JSON, avec isError pour un statut supérieur ou égal à 400, et borné à 1 Mio.
Le transport est Streamable HTTP sans session : une session vivrait sur une réplique et mourrait au rechargement. Le transport stdio ne traverse pas de réseau, il reste hors du périmètre d'une passerelle. Une opération à réponse en flux ne peut pas être un outil.
La surface MCP est un serveur de ressources OAuth 2.1 : le client découvre où obtenir un jeton émis pour elle, et ce jeton n'est jamais relayé à l'amont.
La surface MCP est un serveur de ressources OAuth 2.1 à part entière. Elle publie ses métadonnées de ressource protégée (RFC 9728) sous /.well-known/oauth-protected-resource/<chemin> et répond 401 avec resource_metadata, pour que le client découvre où obtenir un jeton au lieu de le deviner. Le jeton doit être émis pour cette surface (RFC 8707) : son audience est l'URL publique déclarée dans agents.mcp.resources, jamais déduite de la requête.
Le jeton de l'agent n'est jamais relayé à l'amont, ce qui ferme la voie du « confused deputy ». Un jeton MCP est refusé sur une route REST, et la surface n'accepte que des jetons OAuth : une clé d'API n'est pas l'identité d'un agent qui agit pour quelqu'un. L'émetteur est vérifié, et ses clés ne valident que ses propres jetons.
Le client est lu dans le jeton (client_id, sinon azp) ; agents.mcp.clients ferme la surface aux clients déclarés, par URL de document de métadonnées ou par préfixe. Un agent non surveillé - un client qui agit pour lui-même - est reconnu, et x-flexway-tool: { unattended: false } lui cache et lui refuse un outil.
Un amont reçoit un jeton échangé pour lui au nom de l'appelant (RFC 8693), après toute la décision, avec des portées qui ne font que rétrécir.
Un amont qui déclare token_exchange reçoit un jeton émis pour lui, au nom de l'appelant, par le fournisseur qui a signé le jeton d'origine (RFC 8693) ; la passerelle consomme des identités, elle n'en émet pas. L'échange a lieu après toute la décision - identité, portées, quota, validation, politiques - et avant le relais : un appel refusé ne coûte aucun échange. Un appel anonyme n'a rien à échanger, et l'amont ne reçoit pas d'Authorization.
L'échange ne fait que rétrécir : il demande au plus les portées de l'appelant, et une portée accordée en plus donne 403 sans appeler l'amont. Le sujet (sub) reste l'humain, les acteurs (act imbriqués) sont les agents, lus et tracés. Un refus du fournisseur donne 403 ; un fournisseur injoignable ou un secret introuvable donne 503 avec Retry-After. Il n'y a jamais de repli sur le jeton d'origine.
Le secret client est une référence relue à chaque échange, ce qui permet une rotation sans rechargement. Un jeton échangé est réutilisé jusqu'à son expiration moins 30 s, avec un seul échange en vol par jeton d'origine et audience.
La profondeur et l'âge d'une chaîne d'agents sont plafonnés, et révoquer l'humain coupe toute la chaîne par introspection.
Une chaîne réelle ressemble à « humain -> agent A -> agent B -> service ». agents.delegation borne sa profondeur (max_depth) et son âge (max_age, compté depuis auth_time, sinon iat) ; une opération peut resserrer ces bornes par x-flexway-delegation, jamais les élargir, et c'est le minimum des deux qui s'applique. Au-delà, la réponse est 403 ; un jeton délégué dont l'âge ne peut pas être établi est refusé.
La révocation passe par l'introspection RFC 7662 auprès de l'émetteur, avec un cache court : un jeton révoqué donne 401, un jeton invérifiable 503 avec Retry-After. Révoquer l'humain coupe ainsi toute la chaîne. Ces règles valent en REST, à la connexion à la surface MCP, et pour les outils projetés comme fédérés.
La trace porte delegation.depth et delegation.actors, la métrique flexway.delegation.refused compte les refus par raison, et la ligne d'audit des décisions porte la chaîne entière d'acteurs. Savoir quel humain, quels agents et quelles portées sont derrière une écriture vous aide à répondre aux exigences de traçabilité des actions d'agents.
Vos serveurs MCP existants se placent derrière Flexway sans réécriture, avec une liste d'outils déclarée, fermée par défaut, sous la même autorisation.
Des serveurs MCP existants se placent derrière Flexway sans réécriture : un amont protocol: mcp et une entrée agents.mcp.servers suffisent. L'exposition se fait par une liste déclarée d'outils, fermée par défaut - un outil ajouté côté serveur n'apparaît pas sans décision - ou par "*", choisi explicitement. Les outils gardent leurs noms d'origine, renommables ; une collision sur un même hôte refuse le chargement avec une liste déclarée, et avec "*" l'outil en collision n'est pas servi, et c'est dit.
La découverte se fait en arrière-plan (initialize puis tools/list), retentée avec un délai croissant et rafraîchie à intervalle régulier ; ni le démarrage ni /readyz n'attendent un serveur. Chaque appel exige une identité, des portées (tool_scopes, sinon scopes) et consomme le seau de l'appelant ; la classe de débit est déclarée, sinon read pour un outil annoncé en lecture seule, write autrement. Le serveur reçoit un jeton échangé pour lui s'il déclare token_exchange, jamais le jeton de l'agent.
Chaque appel profite du cloisonnement, du coupe-circuit et du budget de l'amont, avec un résultat borné à 1 Mio. Une même surface sert les outils du contrat et les outils fédérés, en une seule liste triée par nom.
La gouvernance du trafic entre agents (A2A) n'est pas livrée dans son ensemble : le cadre retenu la relaie sous la même décision, sans terminer le protocole.
La gouvernance du trafic entre agents (A2A v1.0) n'est pas livrée dans son ensemble ; son état à cette version est indiqué ci-dessous. Le cadre retenu : relayer A2A sous la même décision que le reste - router, authentifier, autoriser, compter, observer - sans terminer le protocole, c'est-à-dire sans tenir d'état de tâche ni délivrer de notification push. Un agent se déclare par sa carte d'agent, traitée comme un contrat versionné, et l'agent amont reçoit toujours un jeton échangé, jamais celui de l'appelant.
Ce cadre prévoit un tenant tenu égal à celui de l'identité, une classe de débit par méthode, un plafond de flux et une durée de tâche bornée, des cibles de notification push restreintes à une liste d'hôtes déclarés, et un audit sans contenu. La vérification des cartes amont signées, la re-signature de la carte publiée et la délégation d'agent à agent restent à faire.
L'exemple mcp-tools, tel qu'il est livré avec Flexway v1.6.3.
# Agent tools from the contract: one line per host declares the MCP surface, then x-flexway-tool
# per operation. A token must be issued for that URL (RFC 8707); it is never relayed upstream.
version: 1
contracts:
openapi: ./openapi.yaml
upstreams:
default:
url: http://orders.internal:8080
auth:
tenant_header: X-Tenant
issuers:
- name: customers
discovery: https://login.example.net/.well-known/openid-configuration
audience: api # REST tokens; MCP tokens carry the resource below
tenant_claim: org
agents:
mcp:
resources:
api.example.com: https://api.example.com/mcpopenapi: 3.1.0
info: { title: Orders, version: "1.0.0" }
components:
securitySchemes:
customers: { type: openIdConnect, openIdConnectUrl: https://login.example.net/.well-known/openid-configuration }
paths:
/orders/{id}:
get:
operationId: getOrder
summary: Read one order
x-flexway-tool: true # a tool named getOrder, described by the summary
security: [ { customers: [orders:read] } ]
parameters: [ { name: id, in: path, required: true, schema: { type: string } } ]
responses: { "200": { description: One order } }
/orders:
post:
operationId: createOrder
x-flexway-tool: { name: create_order, description: Place an order for the caller }
security: [ { customers: [orders:write] } ]
requestBody:
required: true
content:
application/json:
schema: { type: object, required: [sku], properties: { sku: { type: string } } }
responses: { "201": { description: Created } }
/orders/export:
get:
operationId: exportOrders # not marked: never offered to an agent
responses: { "200": { description: CSV } }Ce qui est livré dans la version publiée v1.6.3, et ce qui vient ; une fonctionnalité n'est jamais présentée comme livrée avant sa version.
| Fonctionnalité | Statut |
|---|---|
| Surface MCP : les opérations du contrat offertes en outils | Livré · v0.1.0 |
| Serveur de ressources OAuth 2.1, métadonnées RFC 9728 | Livré · v0.1.0 |
| Échange de jeton RFC 8693 : sujet humain, acteur agent | Livré · v0.1.0 |
| Délégation bornée en durée et en profondeur, révocation en cascade | Livré · v0.1.0 |
| Fédération MCP : des serveurs MCP existants sous la même autorisation, le même quota, le même audit | Livré · v0.1.0 |
| Gouvernance A2A : cartes d'agent signées, trafic sous quota et audit | En cours |
| Tableau de bord des agents : outils appelés, coût, portées | Livré · v1.2.0 |
| Validation de l'émetteur et indicateurs de ressource (RFC 8707) | Livré · v0.1.0 |
| Client ID Metadata Documents ; cas des agents non surveillés | Livré · v0.1.0 |
Les autres attentes de ce domaine
unattended: false ; manquent l'approbation et les droits de tâcheEn partie · suite en 1.10redact) ; dans les invites, rien : détecteurs déterministes et masquagePrévu en 1.9Flexwiz est une jeune entreprise : vous parlez directement avec la personne qui la fonde. Dites-nous ce que vous voulez faire passer par Flexway. Nous parlons de votre infrastructure et de vos exigences de souveraineté numérique.
La prise de rendez-vous en ligne arrive bientôt ; d'ici là, un e-mail suffit.