À 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.
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é.
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
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".
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 ]
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.
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)