DEV Community

Cover image for Comment laisser Claude Code ajouter une petite app dans une Room osFoundry après ton approbation
BBT for BBT Français

Posted on

Comment laisser Claude Code ajouter une petite app dans une Room osFoundry après ton approbation

À la fin de ce tutoriel, Claude Code écrit un petit outil interne sur ta machine (ici, un minuteur de standup : une liste de noms, 90 secondes chacun, un bouton Next) et le propose à une Room cloud dans osFoundry. Rien n'apparaît encore dans la Room. Tu ouvres la proposition, tu lis les deux fichiers source et tu cliques sur Approve and create. Le minuteur s'installe alors dans la barre d'onglets d'apps de la Room, sous forme d'un nouvel onglet que tout le monde dans la Room peut ouvrir. Claude Code vérifie le résultat en lisant le statut, plutôt que de deviner.

Qui fait quoi

Claude Code osFoundry
Connexion Son propre login sur ta machine La connexion que tu as approuvée une fois pour un workspace, avec les scopes osfoundry:read et osfoundry:write
Quelle Room En choisit une parmi celles que liste le serveur Ne liste que les Rooms cloud rattachées à un projet dont fait partie la connexion
Le code Écrit les fichiers complets en local et les envoie dans une seule map files Stocke la proposition et montre chaque fichier, en entier, au propriétaire
Approbation Sa propre demande de permission d'outil, puisque les outils propose sont marqués comme destructifs Tu cliques sur Approve and create sous "Needs your approval" (en attente de ton approbation). D'ici là, la barre d'onglets de la Room ne change pas
Exécution de l'app Ne l'exécute pas La Room l'exécute comme un onglet : une iframe sandboxée dans l'app desktop, une sandbox dans le navigateur sur le web
Ce qu'il relit list_room_apps et read_room_app_status Nom, identité, launcher et état du dernier build. Pas de config d'app, de secrets, de fichiers, de logs ni de contenu de base de données

Mise en place

1. Ajouter osFoundry à Claude Code

Avec --print, la CLI osFoundry affiche la commande qu'elle exécuterait :

$ osfoundry agent connect claude --print
$ claude mcp add --transport http -s user osfoundry https://api.osfoundry.io/api/v1/external-mcp

Sign in: open Claude Code, run /mcp, pick "osfoundry", Authenticate.
Enter fullscreen mode Exit fullscreen mode

Lance-la sans --print, ou colle toi-même la ligne claude mcp add. Dans Claude Code, lance /mcp, choisis osfoundry puis Authenticate. Le navigateur ouvre osFoundry, où tu choisis un workspace. Les outils apparaissent ensuite sous la forme mcp__osfoundry__….

2. Rattacher la Room à un projet

La connexion ne voit jamais une Room toute seule. Il faut que ce soit une Room cloud (créée dans le workspace, pas gardée sur cet appareil) et qu'elle appartienne à un projet.

Ouvre la Room et clique sur l'icône d'engrenage dans son en-tête (paramètres de la Room). Le champ Project affiche "Add to project" quand la Room n'en a pas. Le texte d'aide indique "Project-owned content is accessible to members of this project and its ancestors." (le contenu du projet est accessible aux membres de ce projet et de ses projets parents). Choisis le projet.

3. Ajouter la connexion à ce projet

Ouvre l'icône de clé → Connected, sélectionne la connexion Claude Code, puis sous Projects choisis le même projet et clique sur Add to project. Les Rooms du projet suivent automatiquement, avec ses Notes, ses bases de connaissances et le reste du contenu synchronisé.

Ajouter la connexion au projet auquel appartient la Room

Exemple : Ajouter la connexion au projet auquel appartient la Room

Ouvre Tools dans le même panneau. "All supported tools are on by default." (tous les outils pris en charge sont activés par défaut). Ceux des Rooms sont listés avec des espaces au lieu des underscores :

read room                 propose room snippet app
list room apps            propose room repo app
read room app status
Enter fullscreen mode Exit fullscreen mode

Pour que Claude Code reste en lecture seule sur les Rooms, décoche les deux outils propose et clique sur Save tools.

4. Demander l'outil à Claude Code

Décris l'outil et indique où il doit aller. Claude Code écrit les fichiers dans son dossier de travail comme n'importe quel autre code, puis les propose. Un onglet de Room tourne sous React 18 avec TypeScript. Son point d'entrée est src/App.tsx avec un export par défaut. Les seuls paquets npm disponibles sont dayjs, marked, clsx, lucide-react et recharts. Les données passent par le SDK d'app (docs, kv, db), pas par localStorage ni par des fetch vers des sites externes. Mets ça dans ton prompt ou dans CLAUDE.md, sinon Claude Code ne le saura pas.

Un vrai déroulé

Les noms d'outils et d'arguments sont ceux que renvoie le serveur osFoundry via tools/list. Le projet, la Room, les IDs et les réponses sont du contenu d'exemple. Les deux fichiers sont les vrais de ce tutoriel (63 et 14 lignes).

Example

You: Build a small standup timer for the Launch room in osFoundry. Names list,
     90 seconds each, a Next button, roster saved. Propose it as a Room app.

Claude Code → mcp__osfoundry__list_granted_resources {}
            ← project "Launch plan"
Claude Code → mcp__osfoundry__list_project_resources {"project_id": "…", "resource_type": "room"}
            ← Room "Launch room" (room_7f3c)
Claude Code → mcp__osfoundry__read_room {"room_id": "room_7f3c"}
            ← cloud Room "Launch room"
Claude Code → mcp__osfoundry__list_room_apps {"room_id": "room_7f3c"}
            ← 2 apps, no standup timer
Claude Code → Write src/App.tsx      (63 lines: roster in kv, 90 s countdown, Next/Finish)
Claude Code → Write src/styles.css   (14 lines)
Claude Code → mcp__osfoundry__propose_room_snippet_app
                {"room_id": "room_7f3c", "name": "Standup timer",
                 "files": {"src/App.tsx": "import { useEffect, useState } from 'react'\n…",
                           "src/styles.css": ":root { --bg: #fff; …"},
                 "idempotency_key": "snip-1c9e…"}
            ← proposal waiting for the owner

Claude Code: I proposed "Standup timer" to Launch room. It shows up in the Room
             once you approve it under Connected → Needs your approval.

             (you approve in osFoundry)

You: Approved. Is it there?

Claude Code → mcp__osfoundry__list_room_apps {"room_id": "room_7f3c"}
            ← 3 apps, including "Standup timer"
Claude Code → mcp__osfoundry__read_room_app_status {"room_id": "room_7f3c", "instance_id": "…"}
            ← on the Room launcher

Claude Code: It's in Launch room's tab bar as "Standup timer".
Enter fullscreen mode Exit fullscreen mode

La partie du milieu, c'est toi. La cloche affiche " proposes a Room app". Dans l'icône de clé → Connected, le panneau de la connexion a une section "Needs your approval". La carte indique :

Create Room snippet app in Launch room
Standup timer
▸ Review all proposed files (2)
Approval makes this code available in the Room app launcher. Review the files before approving.
Expires …
[ Approve and create ]  [ Decline ]
Enter fullscreen mode Exit fullscreen mode

Une proposition de snippet app de Room sous Needs your approval, avec les deux fichiers ouverts

Exemple : Une proposition de snippet app de Room sous Needs your approval, avec les deux fichiers ouverts

Ouvre "Review all proposed files". Chaque fichier est affiché en entier, chemin en premier. C'est toute la revue, puisqu'un snippet n'a ni étape de build ni manifeste à vérifier. Approve and create ajoute l'onglet. Decline abandonne la proposition.

Le Standup timer approuvé, sous forme de nouvel onglet dans la Room

Exemple : Le Standup timer approuvé, sous forme de nouvel onglet dans la Room

Où passe la limite

Les Rooms locales sont hors de portée, et read_room le dit dans sa propre description : "Local Rooms are unavailable." Une Room locale est une ligne dans la base de données de l'app desktop sur un seul ordinateur, et elle n'est jamais synchronisée. Le serveur MCP auquel parle Claude Code tourne dans le cloud d'osFoundry, donc le seul moyen pour lui de voir cette Room serait un relais passant par ton desktop, lié à cet appareil et à ce projet. La réponse initialize du serveur pose la règle générale : "Local-only data is unavailable to cloud clients." Si l'outil doit aller dans une Room locale, mets-le d'abord dans une Room cloud. Le menu ⋯ d'un onglet local propose aussi "Move to cloud room…".

Une proposition n'est pas une installation. Claude Code peut en faire autant que tu le laisses faire, et chacune attend une personne. La carte arrive dans le panneau propre à la connexion, avec le nom de la Room, le nom de l'app et tous les fichiers, et elle a une date d'expiration. Chaque appel porte aussi un idempotency_key (8 à 128 caractères) : si Claude Code relance un appel après une réponse perdue, il est reconnu comme la même proposition et ne crée pas de nouvelle carte.

propose_room_repo_app est l'autre porte d'entrée. Il pointe vers une version épinglée d'un dépôt GitNest dans le même projet que la Room, pas vers des fichiers passés dans l'appel. Les apps qui demandent des données, des secrets, des bases de données, des connecteurs ou du calcul sont refusées par cet outil et doivent être configurées dans osFoundry par une personne. Sa carte d'approbation indique "This path does not build or deploy a bundle." et que l'approbation "may incur normal app-serving usage".

Ce que Claude Code relit est volontairement minimal. list_room_apps exclut la config d'app, les secrets, les fichiers et le contenu de la base de données, et read_room_app_status ne renvoie ni config, ni fichiers, ni logs, ni secrets. Il peut donc confirmer que le minuteur est dans le launcher, mais pas lire les noms que ton équipe y a saisis.

Ces noms restent là où ils ont été saisis. Un onglet snippet garde ses données sur l'appareil de la personne qui l'utilise. Dans l'app desktop, l'onglet affiche une icône de disque, "On this device — data is saved on this computer only", donc chaque coéquipier a sa propre liste. Pour faire remonter ces données dans le workspace, il faut enregistrer l'onglet comme app et le déployer depuis la Room. C'est une personne qui le fait dans osFoundry, et Claude Code n'a aucun outil pour ça.

La suite logique, c'est la voie du dépôt : demande à Claude Code de pousser le minuteur dans un dépôt GitNest du même projet, puis d'appeler propose_room_repo_app avec cette version, pour que la Room exécute une version épinglée et vérifiable plutôt qu'une copie collée. La page Rooms montre la barre d'onglets et les paramètres, et apps internes explique à quoi servent les apps de Room.

Top comments (0)