---
title: Les collègues IA dans Slack ont besoin de leur propre identité
description: MintMCP fait tourner 40 à 50 agents IA dans Slack, et aucun n’emprunte le login d’un humain. Notes sur l’intervention de Jiquan Ngiam : fils multijoueurs, une identité par agent, des permissions décidées à l’exécution et une mémoire cloisonnée.
date: 2026-10-07
tags: agents IA, Slack, MCP, identité des agents, contrôle d’accès
---

MintMCP fait tourner 40 à 50 agents IA dans Slack. Ils ont des noms (Max s’occupe des ventes, Leo du marketing, Peter des achats), les gens leur écrivent comme à des collègues, et aucun n’emprunte le login d’un humain. Chaque agent est son propre principal de sécurité, avec sa propre identité, sa propre liste d’outils autorisés et une piste d’audit au niveau de la gateway.

C’est tiré de [The Context ft MintMCP](https://www.youtube.com/watch?v=xLd-mLCN_t0), le livestream de l’Agentic AI Foundation, où Jiquan Ngiam, cofondateur et CEO de MintMCP, a montré comment son équipe travaille avec des agents. Ma propre [conférence sur ma flotte d’agents](/talks/openclaw/fr/) se termine sur la partie qu’une installation maison peut se permettre de sauter : supervision, traçabilité, gestion des identités. Son intervention, c’est cette partie-là.

## L’identité fait passer de l’outil au coéquipier

JQ (c’est comme ça qu’il se fait appeler) découpe l’adoption de l’IA en quatre niveaux. Le plus intéressant, ce sont les marches entre eux :

<div class="levels" role="group" aria-label="Quatre niveaux d’adoption de l’IA : chat, cowork, collègue et la machine, avec l’accès aux données via MCP, l’identité d’agent et les usines logicielles comme marches entre eux">
  <div class="level">
    <p class="level-num">N1</p>
    <h3>Chat</h3>
    <p>Elle conseille.</p>
  </div>
  <div class="level-step"><span>Accès aux données via MCP</span></div>
  <div class="level">
    <p class="level-num">N2</p>
    <h3>Cowork</h3>
    <p>Elle termine des tâches.</p>
  </div>
  <div class="level-step"><span>Identité d’agent</span></div>
  <div class="level level--focus">
    <p class="level-num">N3</p>
    <h3>Collègue</h3>
    <p>Elle rejoint l’équipe.</p>
  </div>
  <div class="level-step"><span>Usines logicielles</span></div>
  <div class="level">
    <p class="level-num">N4</p>
    <h3>La machine</h3>
    <p>Elle construit le logiciel.</p>
  </div>
</div>

Le niveau 2, c’est là où en sont la plupart d’entre nous. Vous branchez Claude Cowork ou un outil du même genre sur le CRM et vous demandez une présentation de prévisions. Il abat des heures de travail, mais en solo.

Le niveau 3, c’est un agent qu’on n’ouvre pas comme une app. Il vit dans Slack ou Teams, peut-être avec son propre compte et sa propre adresse e-mail, et vous lui écrivez comme vous écririez à un collègue. C’est là que l’identité des agents, le contrôle d’accès et les messages d’agent à agent commencent à compter. Le niveau 4, c’est l’[usine logicielle](/fr/notes/software-factory-2022-to-lights-off.html) dont j’ai parlé le mois dernier.

## Du solo au multijoueur

Quand je lance Claude Code ou Codex dans un terminal, personne d’autre ne voit la session. Personne ne peut l’orienter ni reprendre là où elle s’est arrêtée. JQ appelle ça l’IA en solo.

Dans un fil Slack, plusieurs humains et plusieurs agents travaillent au même endroit, tout le monde voit ce qui se passe, et n’importe qui peut intervenir. Les gens adoptent les agents plus vite quand ils les regardent travailler, et les agents gagnent un endroit où travailler ensemble.

Un chiffre m’a surpris. Sur la gateway de MintMCP, qui traite plus de deux millions d’appels MCP et d’agents par jour, les 20 connecteurs les plus installés sont des outils de travail du quotidien : Google, Slack, Notion, Figma, HubSpot. Les ingénieurs sont arrivés en premier, mais ce sont maintenant les non-ingénieurs qui gagnent le plus de temps. Chez Modern Treasury, les agents font gagner des heures par dossier aux technical account managers.

<figure class="fd-fig ac-play" aria-labelledby="ac1-cap" data-desc="Solo et multijoueur. En solo, c’est Claude Code ou Codex dans un terminal : personne d’autre ne voit la session, et personne ne peut l’orienter ni reprendre là où elle s’est arrêtée. En multijoueur, c’est un fil Slack : plusieurs humains et plusieurs agents travaillent au même endroit, tout le monde voit ce qui se passe, et n’importe qui peut intervenir. En dessous, trois faits tirés de la gateway de MintMCP : elle traite plus de deux millions d’appels MCP et d’agents par jour ; ses 20 connecteurs les plus installés sont des outils de travail du quotidien comme Google, Slack, Notion, Figma et HubSpot ; et chez Modern Treasury, les agents font gagner des heures par dossier aux technical account managers.">
<div class="mp-two-row">
<div class="mp-two-card">
<p class="mp-two-who">Claude Code ou Codex dans un terminal</p>
<p class="mp-two-name">Solo</p>
<svg class="mp-two-art" viewBox="0 0 300 96" aria-hidden="true">
<circle class="mp-you-c" cx="34" cy="48" r="14"/>
<path class="mp-thin" d="M48,48 H84"/>
<rect class="mp-w" x="84" y="14" width="120" height="68"/><rect class="mp-wbar" x="84" y="14" width="120" height="8"/>
<rect class="mp-ln" x="94" y="32" width="70" height="4"/><rect class="mp-ln" x="94" y="42" width="50" height="4"/><rect class="mp-ln" x="94" y="52" width="62" height="4"/>
<rect class="mp-cur" x="94" y="62" width="6" height="10"/>
<path class="ac-wall" d="M230,8 V88"/>
<g class="ac-out"><circle cx="264" cy="28" r="11"/><circle cx="264" cy="68" r="11"/></g>
</svg>
<p class="mp-two-line">Personne d’autre ne voit la session</p>
<p class="mp-two-line">Personne ne peut l’orienter ni reprendre là où elle s’est arrêtée</p>
</div>
<p class="mp-two-vs" aria-hidden="true">vs</p>
<div class="mp-two-card mp-two-peter">
<p class="mp-two-who">Un fil Slack</p>
<p class="mp-two-name">Multijoueur</p>
<svg class="mp-two-art" viewBox="0 0 300 96" aria-hidden="true">
<g class="mp-mates"><circle cx="26" cy="26" r="11"/><circle cx="26" cy="70" r="11"/></g>
<rect class="ac-sq" x="263" y="15" width="22" height="22"/><rect class="ac-sq" x="263" y="59" width="22" height="22"/>
<path class="mp-thin" d="M37,28 L78,36 M37,68 L78,60"/>
<path class="mp-thin mp-thin-agent" d="M263,28 L222,36 M263,68 L222,60"/>
<rect class="mp-w" x="78" y="6" width="144" height="84"/><rect class="mp-wbar" x="78" y="6" width="144" height="8"/>
<g class="ac-row-1"><circle class="ac-av" cx="92" cy="27" r="5"/><rect class="mp-ln" x="102" y="25" width="80" height="4"/></g>
<g class="ac-row-2"><rect class="ac-sq" x="87" y="40" width="10" height="10"/><rect class="mp-ln" x="102" y="43" width="104" height="4"/></g>
<g class="ac-row-3"><circle class="ac-av" cx="92" cy="63" r="5"/><rect class="mp-ln" x="102" y="61" width="60" height="4"/></g>
<g class="ac-row-4"><rect class="ac-sq" x="87" y="74" width="10" height="10"/><rect class="mp-ln" x="102" y="77" width="92" height="4"/></g>
</svg>
<p class="mp-two-line">Plusieurs humains et plusieurs agents, au même endroit</p>
<p class="mp-two-line">Tout le monde voit, n’importe qui peut intervenir</p>
</div>
</div>
<div class="mp-stats">
<p><b>2 M+</b><span>appels MCP et d’agents par jour sur la gateway de MintMCP</span></p>
<p><b>Top 20</b><span>des connecteurs : des outils du quotidien, Google, Slack, Notion, Figma, HubSpot</span></p>
<p><b>Des heures</b><span>gagnées par dossier pour les technical account managers de Modern Treasury</span></p>
</div>
<figcaption id="ac1-cap">Le solo et le multijoueur de JQ, avec les chiffres qu’il a donnés sur la gateway de MintMCP. Les ingénieurs sont arrivés en premier ; ce sont maintenant les non-ingénieurs qui gagnent le plus de temps.</figcaption>
</figure>

## Un fil Slack est une sandbox

La démo en direct était simple. Il a demandé à Leo, l’agent marketing, à quels événements de l’AAIF ils étaient allés et lesquels arrivaient. Leo a ouvert un fil, lancé bash et une recherche, lu Slack via le serveur MCP de Slack, et diffusé chaque étape dans le fil. Sa réponse incluait le livestream qu’on était en train de regarder.

Voici l’installation telle qu’il l’a décrite :

<div class="flow" role="group" aria-label="L’installation de MintMCP : un fil Slack lance une session dans une sandbox éphémère qui fait tourner un harnais (harness) de code, lequel n’atteint chaque outil que par la gateway MCP">
  <div class="flow-node">
    <p class="flow-label">Porte d’entrée</p>
    <h3>Fil Slack</h3>
    <ul>
      <li>Humains et agents ensemble</li>
      <li>Un fil, une session</li>
      <li>Des planifications réveillent aussi les agents</li>
    </ul>
  </div>
  <div class="flow-link" aria-hidden="true"><span>→</span></div>
  <div class="flow-node flow-node--core">
    <p class="flow-label">Sandbox éphémère</p>
    <h3>Harnais de code</h3>
    <ul>
      <li>Claude, Codex ou harnais ouverts</li>
      <li>Chaque étape diffusée dans Slack</li>
      <li>Hooks de supervision · mémoire</li>
    </ul>
  </div>
  <div class="flow-link" aria-hidden="true"><span>⇄</span></div>
  <div class="flow-node">
    <p class="flow-label">La seule sortie</p>
    <h3>Gateway MCP</h3>
    <ul>
      <li>L’identité propre de l’agent</li>
      <li>Listes d’outils et de données autorisés</li>
      <li>Chaque appel journalisé</li>
    </ul>
  </div>
</div>

Mon exemple préféré vient de l’ingénierie. Dan est un agent de code sur Claude, Sam en est un sur Codex. Un humain demande à Dan une modification de leur gateway LLM. Dan lit la base de code, propose un plan et attend un feu vert. Il construit une première version et écrit à Sam, et les deux se relisent mutuellement dans le canal jusqu’à tomber d’accord. Puis Dan notifie l’humain, l’humain relit et merge, et le bot se réveille une dernière fois pour demander si la doc a besoin d’une mise à jour.

<figure class="fd-fig ac-thread-fig" aria-labelledby="ac2-cap" data-desc="Dan et Sam, deux agents de code, qui travaillent dans un même canal Slack. Un humain demande à Dan, un agent de code sur Claude, une modification de leur gateway LLM. Dan lit la base de code, propose un plan et attend un feu vert. Dan construit une première version et écrit à Sam, un agent de code sur Codex. Les deux se relisent mutuellement dans le canal jusqu’à tomber d’accord. Dan notifie l’humain, qui relit et merge. Puis le bot se réveille une dernière fois pour demander si la doc a besoin d’une mise à jour. Tout l’aller-retour se passe dans un canal où les gens peuvent regarder et intervenir.">
<div class="ac-thread-in">
<ol class="ac-thread">
<li><b class="ac-who ac-who-h">humain</b><span>Demande à Dan une modification de leur gateway LLM</span></li>
<li><b class="ac-who">Dan</b><span>Lit la base de code, propose un plan, attend un feu vert</span><i class="ac-tag">Claude</i></li>
<li><b class="ac-who">Dan</b><span>Construit une première version et écrit à Sam</span></li>
<li class="ac-pair"><b class="ac-who">Dan ⇄ Sam</b><span>Se relisent jusqu’à tomber d’accord</span><i class="ac-tag">Claude ⇄ Codex</i></li>
<li><b class="ac-who">Dan</b><span>Notifie l’humain</span></li>
<li><b class="ac-who ac-who-h">humain</b><span>Relit et merge</span></li>
<li><b class="ac-who">bot</b><span>Se réveille une dernière fois : la doc a-t-elle besoin d’une mise à jour ?</span></li>
</ol>
</div>
<p class="mp-strip"><b>À découvert</b><span>Chaque étape se trouve dans un canal où les gens peuvent regarder et intervenir.</span></p>
<figcaption id="ac2-cap">L’exemple d’ingénierie, un message par ligne. Dan tourne sur Claude et Sam sur Codex : deux familles de modèles se relisent l’une l’autre.</figcaption>
</figure>

Mon agent de code, Spark, fait déjà relire ses pull requests par un modèle d’une autre famille. La différence, c’est l’endroit : chez eux, tout l’aller-retour se trouve dans un canal où les gens peuvent regarder et intervenir.

Les autres qu’il a montrés : Peter relance les revues de sécurité, les documents manquants et les tenants d’essai sur les deals en cours, et notifie les gens de ce qui reste ouvert. JQ a dit qu’il ne savait plus très bien si c’est lui qui relance les bots ou eux qui le relancent. Minty répond aux clients dans leurs canaux partagés ; après un long fil sur le SSO, un client a écrit « vous avez été parfait, pas besoin d’humain, c’est tout bon pour moi ».

Leur premier agent, Max, a été mis en service en février. Ils sont vite passés d’un agent à cinq, puis à 20. Aujourd’hui, chaque nouvelle recrue crée un agent dès sa première semaine.

## Chaque agent est son propre principal

Sans couche d’identité, un agent détient les identifiants d’un humain. Un agent commercial agit en tant que JQ dans le CRM, sur LinkedIn et dans Gmail, et vous perdez le contrôle, le journal d’audit et toute trace de qui a fait quoi. Son exemple : vous lui demandez de faire le ménage dans le CRM, et il comprend « faire le ménage » comme « tout supprimer ».

Chez MintMCP, chaque agent a donc :

- sa propre identité et son propre périmètre, avec une liste de ce qu’il a le droit de faire
- des identifiants explicites à chaque appel d’outil : un compte de service, ou un identifiant délégué qui agit pour un utilisateur, avec la chaîne de délégation enregistrée
- l’OAuth géré au niveau de la gateway, renouvellement compris, parce qu’un agent en arrière-plan ne peut pas s’arrêter pour cliquer sur un écran de connexion

<figure class="fd-fig ac-badge-fig" aria-labelledby="ac3-cap" data-desc="Deux façons de donner accès à un agent commercial. Le login emprunté : sans couche d’identité, l’agent détient les identifiants d’un humain et agit en tant que JQ dans le CRM, sur LinkedIn et dans Gmail. Vous perdez le contrôle, le journal d’audit et toute trace de qui a fait quoi, et une demande de faire le ménage dans le CRM peut se lire comme tout supprimer. Son propre principal, comme le fait MintMCP : l’agent a sa propre identité et son propre périmètre, avec une liste de ce qu’il a le droit de faire ; chaque appel d’outil porte des identifiants explicites, soit un compte de service, soit un identifiant délégué qui agit pour un utilisateur, avec la chaîne de délégation enregistrée ; et l’OAuth est géré au niveau de la gateway, renouvellement compris, parce qu’un agent en arrière-plan ne peut pas s’arrêter pour cliquer sur un écran de connexion.">
<div class="mp-two-row">
<div class="mp-two-card">
<p class="mp-two-who">Sans couche d’identité</p>
<p class="mp-two-name">Login emprunté</p>
<svg class="mp-two-art" viewBox="0 0 300 96" aria-hidden="true">
<g class="mp-bot"><rect x="6" y="30" width="36" height="36"/><rect class="mp-bot-eye" x="14" y="40" width="6" height="8"/><rect class="mp-bot-eye" x="28" y="40" width="6" height="8"/><path class="mp-bot-mouth" d="M16,57 H32"/></g>
<g class="mp-id"><rect x="52" y="18" width="92" height="60"/></g>
<circle class="ac-face" cx="72" cy="42" r="10"/>
<text class="mp-id-k" x="90" y="36">HUMAIN</text>
<text class="mp-id-t" x="90" y="54">JQ</text>
<text class="mp-id-s" x="62" y="70">son login</text>
<path class="mp-thin" d="M144,48 L202,18 M144,48 L202,48 M144,48 L202,78"/>
<g class="ac-sys"><rect x="202" y="6" width="90" height="24"/><text x="247" y="22" text-anchor="middle">CRM</text></g>
<g class="ac-sys"><rect x="202" y="36" width="90" height="24"/><text x="247" y="52" text-anchor="middle">LinkedIn</text></g>
<g class="ac-sys"><rect x="202" y="66" width="90" height="24"/><text x="247" y="82" text-anchor="middle">Gmail</text></g>
</svg>
<p class="mp-two-line">Agit en tant que JQ dans le CRM, LinkedIn et Gmail</p>
<p class="mp-two-line">Aucune trace de qui a fait quoi</p>
<p class="mp-two-line ac-bad">« Fais le ménage dans le CRM » compris comme « supprime tout »</p>
</div>
<p class="mp-two-vs" aria-hidden="true">vs</p>
<div class="mp-two-card mp-two-peter">
<p class="mp-two-who">Chez MintMCP</p>
<p class="mp-two-name">Son propre principal</p>
<svg class="mp-two-art" viewBox="0 0 300 96" aria-hidden="true">
<g class="mp-bot"><rect x="6" y="30" width="36" height="36"/><rect class="mp-bot-eye" x="14" y="40" width="6" height="8"/><rect class="mp-bot-eye" x="28" y="40" width="6" height="8"/><path class="mp-bot-mouth" d="M16,57 H32"/></g>
<g class="mp-id"><rect x="52" y="18" width="92" height="60"/><rect class="mp-id-photo" x="62" y="30" width="20" height="22"/></g>
<text class="mp-id-k" x="90" y="36">AGENT</text>
<text class="mp-id-t" x="90" y="54">Max</text>
<text class="mp-id-s" x="62" y="70">agent ventes</text>
<path class="mp-thin mp-thin-agent" d="M144,48 H180"/>
<g class="ac-allow"><rect x="180" y="8" width="112" height="80"/></g>
<text class="mp-art-t" x="190" y="25">autorisés</text>
<path class="ac-ok" d="M190,40 l4,4 l8,-8"/><rect class="mp-ln" x="208" y="38" width="70" height="4"/>
<path class="ac-ok" d="M190,56 l4,4 l8,-8"/><rect class="mp-ln" x="208" y="54" width="56" height="4"/>
<path class="ac-ok" d="M190,72 l4,4 l8,-8"/><rect class="mp-ln" x="208" y="70" width="64" height="4"/>
</svg>
<p class="mp-two-line">Sa propre identité et son périmètre, avec une liste d’autorisations</p>
<p class="mp-two-line">Des identifiants explicites à chaque appel, chaîne de délégation enregistrée</p>
<p class="mp-two-line">L’OAuth à la gateway, renouvellement compris</p>
</div>
</div>
<figcaption id="ac3-cap">Le même agent commercial, deux façons d’entrer. Avec son propre principal, chaque appel dit qui agit et pour qui.</figcaption>
</figure>

## Les permissions se décident à l’exécution

C’est la partie à laquelle je n’avais pas réfléchi. L’agent doit-il lire les données en son nom propre, ou au nom de la personne qui a demandé ? Ça dépend du système. Un assistant qui lit des agendas doit utiliser les identifiants de la personne qui demande. Un agent qui suit le monitoring DevOps doit utiliser un compte de service.

Un consentement OAuth, c’est un token statique, et c’est facile à appréhender. Dans un canal, les bonnes permissions dépendent du consentement, de qui a envoyé le message, de qui d’autre verra la réponse, et de la tâche. JQ appelle ça le passage des permissions statiques aux permissions dynamiques.

<figure class="fd-fig ac-rt" aria-labelledby="ac4-cap" data-desc="Permissions statiques et dynamiques. Statiques : un consentement OAuth est un seul token, et c’est facile à appréhender. Dynamiques : dans un canal, les bonnes permissions pour un message dépendent de quatre choses à la fois : le consentement, qui a envoyé le message, qui d’autre verra la réponse, et la tâche. Les identifiants à utiliser dépendent du système : un assistant qui lit des agendas doit utiliser ceux de la personne qui demande, et un agent qui suit le monitoring DevOps doit utiliser un compte de service.">
<div class="ac-rt-in">
<div class="ac-static">
<p class="ac-k">Statique</p>
<p class="ac-token"><b>Consentement OAuth</b><span>Un seul token, facile à appréhender</span></p>
</div>
<div class="ac-dyn">
<p class="ac-k">Dynamique · dans un canal</p>
<ul class="ac-inputs">
<li>le consentement</li>
<li>qui a envoyé le message</li>
<li>qui d’autre verra la réponse</li>
<li>la tâche</li>
</ul>
<p class="ac-res">les bonnes permissions, pour ce message</p>
</div>
</div>
<div class="ac-as">
<p class="ac-as-row"><span>Un assistant qui lit des agendas</span><i aria-hidden="true">→</i><b>les identifiants de qui demande</b></p>
<p class="ac-as-row"><span>Un agent qui suit le monitoring DevOps</span><i aria-hidden="true">→</i><b>un compte de service</b></p>
</div>
<figcaption id="ac4-cap">Le passage des permissions statiques aux dynamiques selon JQ. Les deux lignes du bas répondent à « en son nom, ou au nom de qui a demandé ? » Ça dépend du système.</figcaption>
</figure>

Environ 99 % des contrôles de MintMCP restent déterministes. Sa règle : ce que vous pouvez rendre déterministe, rendez-le déterministe. Le cas difficile, c’est un fil avec une personne A, qui peut voir certaines données, et une personne B, qui ne peut pas. Si A dit « vas-y, récupère-les », c’est sans doute acceptable, comme si les deux étaient dans une salle de réunion. Ils testent un peu d’IA pour cette décision, à deux conditions : tout le monde dans le fil voit que l’accès a été accordé, et A dispose d’un bouton pour annuler.

<figure class="fd-fig ac-ab" aria-labelledby="ac5-cap" data-desc="Le cas difficile, et la petite part des contrôles de MintMCP qu’il représente. Environ 99 % des contrôles restent déterministes, et la règle est de rendre déterministe tout ce qui peut l’être. Le reste, ce sont des cas comme celui-ci : un fil avec une personne A, qui peut voir certaines données, et une personne B, qui ne peut pas. A dit vas-y, récupère-les. C’est sans doute acceptable, comme si les deux étaient dans une salle de réunion, alors ils testent un peu d’IA pour cette décision, à deux conditions : tout le monde dans le fil voit que l’accès a été accordé, et A dispose d’un bouton pour annuler.">
<div class="ac-split">
<p class="ac-split-bar" aria-hidden="true"><i></i></p>
<p class="ac-split-k"><span><b>Environ 99 %</b> déterministe</span><span>le reste</span></p>
</div>
<div class="ac-ab-in">
<p class="ac-ab-h"><span class="ac-ppl"><b class="ac-pa">A</b>voit les données</span><span class="ac-ppl"><b class="ac-pb">B</b>ne les voit pas</span></p>
<p class="ac-ab-msg"><b class="ac-pa">A</b><span>vas-y, récupère-les</span></p>
<p class="ac-ab-grant"><span>Accès accordé dans ce fil. Tout le monde ici le voit.</span><em>Annuler · A seulement</em></p>
</div>
<p class="mp-strip"><b>Un peu d’IA</b><span>Sans doute acceptable, comme si les deux étaient dans une salle de réunion.</span></p>
<figcaption id="ac5-cap">Le cas difficile de l’intervention, dessiné comme un fil. La notification et le bouton d’annulation sont ses deux conditions ; leur formulation est de moi.</figcaption>
</figure>

## Verrouiller les outils à la gateway

Les scopes OAuth sont souvent trop larges, si bien qu’un agent hérite de tout ce que son utilisateur peut faire, y compris envoyer des e-mails et supprimer des enregistrements. La réponse de MintMCP se trouve dans la gateway MCP, et elle est déterministe :

- les outils risqués sont refusés d’office, comme supprimer des enregistrements ou envoyer des e-mails
- les agents ne détiennent jamais les clés finales, seulement un accès temporaire via la gateway
- la gateway journalise chaque appel, pour qu’on puisse retrouver quel agent a fait quoi
- les outils sont regroupés par rôle, pas par serveur : les ingénieurs ont Jira en lecture et écriture et Intercom en lecture seule, un agent marketing a droit à moins
- les données ont aussi un périmètre : Google Drive, mais seulement ces 10 dossiers

Deux détails qui m’ont plu. L’outil fork-repository du serveur MCP de GitHub est l’un des premiers que leurs clients désactivent. Et les clients de la finance et de la santé font passer leur DLP existant sur chaque appel MCP, ce qui ajoute 100 à 200 ms.

<figure class="fd-fig ac-gw-fig" aria-labelledby="ac6-cap" data-desc="Le verrou déterministe de MintMCP dans la gateway MCP. L’agent ne détient jamais les clés finales, seulement un accès temporaire via la gateway. La gateway journalise chaque appel, regroupe les outils par rôle plutôt que par serveur, et donne aussi un périmètre aux données ; les clients de la finance et de la santé font en plus passer leur DLP existant sur chaque appel, ce qui ajoute 100 à 200 ms. Côté outils, les outils risqués sont refusés d’office, comme supprimer des enregistrements et envoyer des e-mails, et l’outil fork-repository du serveur MCP de GitHub est l’un des premiers que les clients désactivent. Les ingénieurs ont Jira en lecture et écriture et Intercom en lecture seule, un agent marketing a droit à moins, et Google Drive peut être limité à 10 dossiers.">
<div class="ac-gw">
<div class="ac-gw-col ac-gw-agent">
<p class="ac-k">Agent</p>
<p class="ac-gw-big">Pas de clés finales</p>
<p class="ac-gw-sub">Seulement un accès temporaire, via la gateway</p>
</div>
<p class="ac-gw-arrow" aria-hidden="true"><span>→</span></p>
<div class="ac-gw-col ac-gw-gate">
<p class="ac-k">Gateway MCP · déterministe</p>
<ul class="ac-gw-list">
<li>Chaque appel journalisé</li>
<li>Outils regroupés par rôle, pas par serveur</li>
<li>Données sous périmètre aussi</li>
<li>Finance et santé : leur DLP sur chaque appel, +100 à 200 ms</li>
</ul>
<p class="ac-log" aria-hidden="true"><i></i><i></i><i></i><i></i></p>
</div>
<p class="ac-gw-arrow" aria-hidden="true"><span>→</span></p>
<div class="ac-gw-col ac-gw-tools">
<p class="ac-k">Outils</p>
<ul class="ac-tl">
<li class="ac-no"><s>Supprimer des enregistrements</s><span>refusé d’office</span></li>
<li class="ac-no"><s>Envoyer un e-mail</s><span>refusé d’office</span></li>
<li class="ac-no"><s>Fork repository</s><span>GitHub, l’un des premiers désactivés</span></li>
<li>Jira<span>lecture et écriture, pour les ingénieurs</span></li>
<li>Intercom<span>lecture seule, pour les ingénieurs</span></li>
<li>Google Drive<span>seulement ces 10 dossiers</span></li>
</ul>
</div>
</div>
<p class="mp-strip"><b>Le problème</b><span>Les scopes OAuth sont souvent trop larges : un agent hérite de tout ce que son utilisateur peut faire.</span></p>
<figcaption id="ac6-cap">La réponse de MintMCP, de l’agent jusqu’aux outils. Les outils barrés sont refusés d’office ; les autres arrivent dans le lot d’un rôle.</figcaption>
</figure>

J’ai appris la partie déterministe à mes dépens. En août, j’ai interdit les outils MCP de mon app de finances à la plupart de mes agents avec un motif dans la config de ma gateway. Un mois plus tard, j’ai testé : le motif ne correspondait à rien, et un agent censé être bloqué se voyait proposer les 13 outils, outils d’écriture compris. Les noms d’outils utilisaient un autre séparateur que celui que j’avais supposé. Maintenant, je vérifie une règle de refus en demandant à l’agent de lister ses outils.

<figure class="fd-fig ac-deny" aria-labelledby="ac7-cap" data-desc="Ma propre règle de refus, en trois étapes. Un, en août : j’ai interdit les outils MCP de mon app de finances à la plupart de mes agents avec un motif dans la config de ma gateway. Deux, un mois plus tard : le motif ne correspondait à rien, et un agent censé être bloqué se voyait proposer les 13 outils, outils d’écriture compris. Les noms d’outils utilisaient un autre séparateur que celui que j’avais supposé. Trois, maintenant : je vérifie une règle de refus en demandant à l’agent de lister ses outils.">
<ol class="mp-trio">
<li class="mp-trio-step">
<svg class="mp-grow-art" viewBox="0 0 120 110" aria-hidden="true">
<rect class="mp-w" x="14" y="8" width="92" height="94"/><rect class="mp-wbar" x="14" y="8" width="92" height="8"/>
<rect class="mp-ln" x="24" y="28" width="60" height="4"/><rect class="mp-ln" x="24" y="38" width="44" height="4"/>
<g class="fd-box-agent"><rect x="20" y="50" width="80" height="16"/></g>
<text class="mp-art-t mp-art-agent" x="28" y="62">deny</text><path class="ac-x" d="M80,53 l10,10 M90,53 l-10,10"/>
<rect class="mp-ln" x="24" y="76" width="54" height="4"/><rect class="mp-ln" x="24" y="86" width="38" height="4"/>
</svg>
<p class="mp-trio-n"><b>1</b>Août</p>
<p class="mp-trio-what">Un motif de refus pour les outils de mon app de finances, dans la config de ma gateway</p>
</li>
<li class="mp-trio-step">
<svg class="mp-grow-art" viewBox="0 0 120 110" aria-hidden="true">
<text class="fd-s fd-s-alert" x="60" y="12" text-anchor="middle">0 trouvé</text>
<g class="ac-13"><rect x="13" y="22" width="15" height="15"/><rect x="32" y="22" width="15" height="15"/><rect x="51" y="22" width="15" height="15"/><rect x="70" y="22" width="15" height="15"/><rect x="89" y="22" width="15" height="15"/><rect x="13" y="41" width="15" height="15"/><rect x="32" y="41" width="15" height="15"/><rect x="51" y="41" width="15" height="15"/><rect x="70" y="41" width="15" height="15"/><rect x="89" y="41" width="15" height="15"/><rect x="13" y="60" width="15" height="15"/><rect x="32" y="60" width="15" height="15"/><rect x="51" y="60" width="15" height="15"/></g>
<text class="mp-art-t" x="60" y="96" text-anchor="middle">13 sur 13 proposés</text>
</svg>
<p class="mp-trio-n"><b>2</b>Un mois plus tard</p>
<p class="mp-trio-what">Il ne correspondait à rien. Un agent bloqué voyait les 13 outils, outils d’écriture compris</p>
</li>
<li class="mp-trio-step">
<svg class="mp-grow-art" viewBox="0 0 120 110" aria-hidden="true">
<g class="mp-review"><rect x="8" y="8" width="104" height="22"/></g><text class="mp-review-t ac-ask-t" x="60" y="23" text-anchor="middle">liste tes outils</text>
<rect class="mp-w" x="8" y="40" width="90" height="62"/>
<path class="ac-ok" d="M16,52 l4,4 l8,-8"/><rect class="mp-ln" x="34" y="50" width="50" height="4"/>
<path class="ac-ok" d="M16,68 l4,4 l8,-8"/><rect class="mp-ln" x="34" y="66" width="40" height="4"/>
<path class="ac-ok" d="M16,84 l4,4 l8,-8"/><rect class="mp-ln" x="34" y="82" width="46" height="4"/>
</svg>
<p class="mp-trio-n"><b>3</b>Maintenant</p>
<p class="mp-trio-what">Je vérifie une règle de refus en demandant à l’agent de lister ses outils</p>
</li>
</ol>
<p class="mp-strip"><b>Pourquoi</b><span>Les noms d’outils utilisaient un autre séparateur que celui que j’avais supposé.</span></p>
<figcaption id="ac7-cap">Ma propre version de la leçon : une règle de refus ne vaut que par les noms qu’elle reconnaît.</figcaption>
</figure>

## Personne n’avait demandé ce message de 6 h

La meilleure histoire est arrivée pendant les questions. À 6 h du matin, Max a posté dans le canal des deals qu’un même deal avait été attribué à deux commerciaux. JQ a commencé à déboguer le deal, puis s’est arrêté : pourquoi l’agent s’était-il réveillé pour poster ça, au fond ?

Il a fallu le journal d’audit pour le savoir. Un membre de l’équipe avait demandé quelque chose à son propre agent, cet agent avait délégué à Max, et Max avait remonté l’affaire à tout le canal. Sans la chaîne de délégation, personne ne l’aurait su.

<figure class="fd-fig ac-chain-fig" aria-labelledby="ac8-cap" data-desc="Le message de 6 h, remonté jusqu’à sa source. Ce que le canal a vu : à 6 h du matin, Max a posté dans le canal des deals qu’un même deal avait été attribué à deux commerciaux. Ce que montrait le journal d’audit : un membre de l’équipe avait demandé quelque chose à son propre agent, cet agent avait délégué à Max, et Max avait remonté l’affaire à tout le canal. Sans la chaîne de délégation, personne n’aurait su pourquoi Max avait posté.">
<div class="ac-seen">
<p class="ac-k">Ce que le canal a vu, à 6 h</p>
<p class="ac-msg"><b class="ac-who">Max</b><span>Un même deal a été attribué à deux commerciaux.</span></p>
</div>
<div class="ac-trace">
<p class="ac-k">Ce que montrait le journal d’audit</p>
<ol class="ac-chain">
<li><b>Un membre de l’équipe</b><span>demande quelque chose à son propre agent</span></li>
<li class="ac-ag"><b>Son agent</b><span>délègue à Max</span></li>
<li class="ac-ag"><b>Max</b><span>remonte l’affaire à tout le canal</span></li>
<li class="ac-ch"><b>Canal des deals</b><span>le post de 6 h</span></li>
</ol>
</div>
<p class="mp-strip"><b>Journal d’audit</b><span>Sans la chaîne de délégation, personne n’aurait su pourquoi Max avait posté.</span></p>
<figcaption id="ac8-cap">L’histoire de JQ pendant les questions-réponses, lue comme il a dû la lire : du post jusqu’à qui l’a déclenché. Le message de Max est paraphrasé.</figcaption>
</figure>

C’est la prochaine phase qu’il voit venir : qui peut créer un agent, lui écrire et le modifier, qui les orchestre tous, et, selon ses mots, quel est l’équivalent des RH pour les agents.

## La mémoire aussi a besoin d’un contrôle d’accès

Darren Shepherd, l’un des animateurs, a objecté. On ne peut pas étiqueter chaque phrase avec une classification de données, et à mesure que les modèles deviennent plus malins, l’IA devrait peut-être prendre davantage de ces décisions. Nous faisons confiance aux humains, a-t-il dit, à cause des processus qui les entourent, pas parce qu’ils sont fiables.

La réponse de JQ a été une seconde dimension : la mémoire. Quand son agent personnel parle à Darren, il ne doit pas partager les finances de JQ. La mémoire est donc cloisonnée (un silo par personne, par équipe, par entreprise, par client), et l’agent voit des silos différents selon la personne à qui il parle. Le même badge persistant à l’entrée, des livres différents qu’il a le droit de lire. Pour lui, cette partie relève encore largement de la R&D.

<figure class="fd-fig ac-mem" aria-labelledby="ac9-cap" data-desc="Les silos de mémoire, tels que JQ les a décrits. L’agent présente le même badge persistant à l’entrée, quelle que soit la personne à qui il parle. Derrière, la mémoire est découpée en silos, un par personne, par équipe, par entreprise et par client, et l’agent voit des silos différents selon la personne à qui il parle. Quand l’agent personnel de JQ parle à Darren, le silo des finances de JQ reste fermé. Pour lui, cette partie relève encore largement de la R&amp;D.">
<div class="ac-mem-in">
<div class="ac-door">
<svg class="ac-card-art" viewBox="0 0 160 100" aria-hidden="true">
<g class="mp-id"><rect x="10" y="10" width="140" height="80"/><rect class="mp-id-photo" x="22" y="24" width="28" height="32"/></g>
<text class="mp-id-k" x="60" y="34">AGENT</text>
<text class="mp-id-t" x="60" y="52">Agent de JQ</text>
<text class="mp-id-s" x="22" y="76">ID persistant</text>
<rect class="ac-scan" x="10" y="22" width="140" height="2"/>
</svg>
<p class="ac-door-t">Le même badge à l’entrée</p>
</div>
<div class="ac-shelf">
<p class="ac-k">Des livres différents, selon l’interlocuteur</p>
<ul class="ac-silos">
<li class="ac-shut"><b>Par personne</b><span class="ac-books" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i></span><span>Finances de JQ</span><em>fermé pour Darren</em></li>
<li><b>Par équipe</b><span class="ac-books" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i></span></li>
<li><b>Par entreprise</b><span class="ac-books" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i></span></li>
<li><b>Par client</b><span class="ac-books" aria-hidden="true"><i></i><i></i><i></i><i></i><i></i></span></li>
</ul>
</div>
</div>
<p class="mp-strip"><b>R&amp;D</b><span>Ses mots pour cette partie : encore largement de la R&amp;D.</span></p>
<figcaption id="ac9-cap">Un schéma de la réponse de JQ à Darren. Seul le silo qu’il a cité est dessiné fermé ; lesquels s’ouvrent pour qui, il ne l’a pas dit.</figcaption>
</figure>

## Où en est ma propre flotte

Chacun de mes agents a son propre fil Telegram. Sur la carte de JQ, c’est le niveau 2 : un humain et un agent par fil, personne d’autre pour regarder. Telegram ne transmet même pas les messages d’un bot à un autre bot, donc mes agents ne peuvent pas se parler là-bas.

Aujourd’hui, j’ai donné un compte Slack à deux d’entre eux : Nova, mon généraliste, et Spark, mon codeur. Ils vivent dans un espace de travail réservé aux agents, chacun avec sa propre app Slack, parce qu’une app correspond à un utilisateur bot. C’est la première brique d’identité. Prochaine étape : que Nova ouvre un canal pour une tâche de code et y fasse venir Spark, comme Dan fait venir Sam.

Le hic : l’offre gratuite de Slack autorise 10 apps par espace de travail, et j’ai 17 agents. Identifiants délégués, permissions à l’exécution et silos de mémoire : tout ça est encore devant moi.

<figure class="fd-fig ac-fleet" aria-labelledby="ac10-cap" data-desc="Où en est ma propre flotte. Aujourd’hui, chaque agent a son propre fil Telegram : un humain et un agent par fil, personne d’autre pour regarder, et Telegram ne transmet pas les messages d’un bot à un autre bot. Sur la carte de JQ, c’est le niveau 2. Deux d’entre eux, Nova et Spark, ont maintenant un compte Slack dans un espace de travail réservé aux agents, chacun avec sa propre app Slack, parce qu’une app correspond à un utilisateur bot : la première brique d’identité. Prochaine étape : Nova ouvre un canal pour une tâche de code et y fait venir Spark. Le hic : l’offre gratuite de Slack autorise 10 apps par espace de travail, et j’ai 17 agents, donc 7 n’y entrent pas. Encore devant moi : les identifiants délégués, les permissions à l’exécution et les silos de mémoire.">
<div class="mp-two-row">
<div class="mp-two-card">
<p class="mp-two-who">Chaque agent</p>
<p class="mp-two-name">Telegram</p>
<svg class="mp-two-art" viewBox="0 0 300 96" aria-hidden="true">
<path class="ac-wall" d="M150,4 V92 M8,48 H292"/>
<circle class="mp-you-c" cx="28" cy="26" r="9"/><path class="mp-thin" d="M37,26 H92"/><rect class="ac-sq" x="92" y="18" width="16" height="16"/>
<circle class="mp-you-c" cx="28" cy="72" r="9"/><path class="mp-thin" d="M37,72 H92"/><rect class="ac-sq" x="92" y="64" width="16" height="16"/>
<rect class="ac-sq" x="192" y="18" width="16" height="16"/><path class="mp-thin" d="M208,26 H263"/><circle class="mp-you-c" cx="272" cy="26" r="9"/>
<rect class="ac-sq" x="192" y="64" width="16" height="16"/><path class="mp-thin" d="M208,72 H263"/><circle class="mp-you-c" cx="272" cy="72" r="9"/>
<path class="ac-line-alert" d="M110,26 H190"/><path class="ac-x" d="M144,20 l12,12 M156,20 l-12,12"/>
</svg>
<p class="mp-two-line">Un humain et un agent par fil, personne d’autre pour regarder</p>
<p class="mp-two-line">Les bots ne reçoivent pas les messages des autres bots</p>
<p class="mp-two-line">Le niveau 2 de JQ</p>
</div>
<p class="mp-two-vs" aria-hidden="true">désormais</p>
<div class="mp-two-card mp-two-peter">
<p class="mp-two-who">Nova et Spark</p>
<p class="mp-two-name">Slack</p>
<svg class="mp-two-art" viewBox="0 0 300 96" aria-hidden="true">
<rect class="mp-w" x="40" y="6" width="220" height="84"/><rect class="mp-wbar" x="40" y="6" width="220" height="8"/><rect class="mp-wside" x="40" y="14" width="96" height="76"/>
<rect class="ac-sq" x="50" y="28" width="16" height="16"/><text class="ac-name" x="74" y="41">Nova</text>
<rect class="ac-sq" x="50" y="58" width="16" height="16"/><text class="ac-name" x="74" y="71">Spark</text>
<text class="mp-art-t" x="148" y="34">1 app chacun</text>
<text class="mp-art-t" x="148" y="52">= 1 compte bot</text>
<rect class="mp-ln" x="148" y="66" width="96" height="4"/><rect class="mp-ln" x="148" y="76" width="70" height="4"/>
</svg>
<p class="mp-two-line">Un espace de travail Slack réservé aux agents</p>
<p class="mp-two-line">Une app Slack chacun : la première brique d’identité</p>
<p class="mp-two-line">Ensuite : Nova ouvre un canal pour une tâche de code et y fait venir Spark</p>
</div>
</div>
<div class="ac-slots-in">
<p class="ac-k">Offre gratuite de Slack : 10 apps par espace de travail</p>
<div class="ac-slots" aria-hidden="true">
<p class="ac-plan"><i class="on">N</i><i class="on">S</i><i></i><i></i><i></i><i></i><i></i><i></i><i></i><i></i></p>
<p class="ac-left"><i></i><i></i><i></i><i></i><i></i><i></i><i></i></p>
</div>
<p class="ac-slots-k"><span>N, S : Nova et Spark</span><span><b>7 de mes 17 agents</b> n’y entrent pas</span></p>
</div>
<p class="mp-strip"><b>Encore devant moi</b><span>Identifiants délégués, permissions à l’exécution, silos de mémoire.</span></p>
<figcaption id="ac10-cap">Mon installation face à la carte de JQ. Les carrés dans le cadre sont les 10 emplacements d’app de l’offre gratuite ; ceux en pointillés sont les agents qui restent.</figcaption>
</figure>

[L’intervention](https://www.youtube.com/watch?v=xLd-mLCN_t0) dure 40 minutes, et les questions-réponses sur les permissions en sont le meilleur moment. MintMCP a aussi écrit un billet sur [comment construire un collègue IA dans Slack](https://www.mintmcp.com/blog/build-ai-coworker-slack). Et si vous avez résolu le cas du fil avec la personne A et la personne B, je serais ravi de savoir comment.
