Agents, MCP et CLI
Tout ce que fait l'inbox passe par une seule API REST. Claude Code, Cursor, Codex ou vos propres scripts s'en servent avec une clé aux droits limités, par le serveur MCP, la CLI ou le skill.
Clés d'API et droits
Un admin crée les clés dans le tableau de bord sous Réglages → Clés d'API, une par agent ou par script : vous les distinguez dans le journal d'actions et en révoquez une sans toucher aux autres. Les clés ressemblent à ig_sk_… et ne sont affichées qu'une fois. Une clé ne voit jamais que sa propre organisation.
| Droit | Permet de |
|---|---|
read | Lire les apps, les conversations, les joueurs (et exporter les données d'un joueur), les bugs, la FAQ, les étiquettes, les réponses enregistrées, les automatisations, les statistiques et le point hebdomadaire. |
reply | Tout read, plus : répondre et laisser des notes, écrire en premier à un joueur, valider ou jeter les brouillons de l'IA, retirer un message de l'IA ou d'un agent, fermer, mettre en attente, assigner, régler la priorité et le mode de l'IA (draft, off), étiqueter, demander un brouillon à l'IA, proposer des remboursements, créer, modifier, fusionner, marquer corrigés, rouvrir et fermer des bugs, ouvrir des tickets GitHub, écrire, modifier et supprimer des articles de FAQ, renommer ou bloquer des joueurs, gérer les réponses enregistrées, envoyer des fichiers. |
all | Tout reply, plus : les réglages de l'app comme le nom, la traduction, les avis, l'apparence, le logo et l'annonce, mettre l'IA en pause ou passer l'app en brouillons, créer des apps, les automatisations qui ne donnent pas d'objets, l'import et la génération de FAQ, les demandes de correctif, le journal d'actions, les messages de test Telegram. Laisser l'IA répondre seule, réécrire ses instructions, et les réglages de modération, de mode mineurs, d'identité et de conservation restent aux humains. |
| aucune clé | Réservé aux admins humains connectés, quel que soit le droit : remboursements et prestataires de paiement, dons d'objets en jeu, facturation, réglages et clé d'IA de l'organisation, clés d'API, membres et invitations, connexion de Telegram, Discord, Steam, GitHub, des abonnements, du push et des webhooks, suppression d'apps et de joueurs, renouvellement ou lecture du secret d'identité, annulation depuis le journal d'actions. Les clés reçoivent 403 human_approval_required (ou 403 human_session_required). Une clé qui fuite ne peut pas vous mettre dehors, lire vos secrets ni déplacer de valeur. |
Une clé sans droit suffisant reçoit 403 requires_reply ou 403 requires_admin (admin = droit all). Utilisez la clé comme jeton bearer :
curl https://app.inngame.app/v1/conversations?status=open \
-H "Authorization: Bearer $INNGAME_API_KEY"
Chaque route et le droit qu'elle demande : API REST.
Serveur MCP
Le serveur MCP est sur https://app.inngame.app/mcp et parle Streamable HTTP (sans état, réponses JSON). Authentifiez-vous avec la clé d'API dans l'en-tête Authorization. Chaque outil appelle l'API REST avec cette clé : un agent ne peut jamais faire plus que sa clé ne permet, et chaque action apparaît dans le journal d'actions sous le nom de la clé. Un agent déjà branché sur https://inngame.meffysto.workers.dev/mcp continue de fonctionner.
Claude Code
claude mcp add --transport http inngame https://app.inngame.app/mcp \
--header "Authorization: Bearer $INNGAME_API_KEY"
Cursor
Dans ~/.cursor/mcp.json (tous les projets) ou .cursor/mcp.json (un projet) :
{
"mcpServers": {
"inngame": {
"url": "https://app.inngame.app/mcp",
"headers": { "Authorization": "Bearer ig_sk_..." }
}
}
}
Codex
Dans ~/.codex/config.toml :
[mcp_servers.inngame]
url = "https://app.inngame.app/mcp"
http_headers = { Authorization = "Bearer ig_sk_..." }
npx inngame mcp claude|cursor|codex|json affiche ces extraits avec votre clé enregistrée déjà remplie.
Connecteurs web (OAuth)
Les connecteurs qui ne peuvent pas envoyer d'en-tête personnalisé, comme claude.ai ou ChatGPT, passent par OAuth 2.1 : ajoutez https://app.inngame.app/mcp comme connecteur personnalisé, connectez-vous à Inngame, choisissez l'organisation et l'accès (read, reply ou all). Le connecteur reçoit une clé d'API ordinaire avec ce droit, listée sous Réglages → Clés d'API, où vous pouvez la révoquer. Les documents de découverte sont sur /.well-known/oauth-protected-resource et /.well-known/oauth-authorization-server ; les clients s'enregistrent eux-mêmes (enregistrement dynamique) et utilisent PKCE.
Outils MCP
La description de chaque outil indique aussi le droit nécessaire. Les outils en lecture seule portent readOnlyHint ; ceux qui suppriment quelque chose, destructiveHint.
| Outil | Droit | Rôle |
|---|---|---|
| Apps | ||
list_apps | read | Jeux et apps avec leurs identifiants, clés publiques du SDK, réglages et non-lus. |
get_app | read | Une app : réglages (IA, apparence, disponibilité, annonce), logo et intégrations branchées. |
| Conversations | ||
list_conversations | read | Les conversations, les plus urgentes d'abord. Filtres : status, app, unread, tag, lang, assignee, q (recherche), limit, before (curseur). |
get_conversation | read | Une conversation avec la fiche du joueur, ses appareils, les bugs liés et les 50 derniers messages avec traductions, contexte du jeu, brouillons et notes. |
get_older_messages | read | Les 50 messages avant un seq. |
reply | reply | Répondre au joueur (traduit automatiquement) ou laisser une note interne (note: true). |
approve_draft | reply | Envoyer un brouillon de l'IA en attente, retouché ou non. |
discard_draft | reply | Supprimer un brouillon de l'IA en attente. |
unsend_message | reply | Retirer un message envoyé par erreur par l'IA, une automatisation ou un agent. Pas les messages d'une personne, pas un objet déjà récupéré. |
update_conversation | reply | Fermer, rouvrir, mettre en attente (snoozeUntil), assigner, régler la priorité de 0 à 2 ou le mode de l'IA (draft, off, inherit ; auto est réservé aux humains). |
tag_conversation / untag_conversation | reply | Ajouter ou retirer une étiquette. |
list_tags | read | Les étiquettes, avec le nombre de conversations qui portent chacune. |
ask_ai | reply | Faire écrire tout de suite un brouillon par l'IA intégrée, à partir de la FAQ, quel que soit le mode de l'IA. Rien ne part sans validation. |
propose_refund | reply | Laisser une proposition de remboursement à un admin humain. Ne déplace jamais d'argent. |
list_saved_replies | read | Les réponses enregistrées de l'équipe. |
| Joueurs | ||
list_players | read | Trouver des joueurs par nom, e-mail, identifiant externe ou SteamID ; vus le plus récemment d'abord. |
get_player | read | Un joueur avec son identité, ses métadonnées, ses appareils et ses conversations. |
message_player | reply | Écrire en premier à un joueur (démarre ou poursuit sa conversation, traduit, envoyé en push). |
update_player | reply | Régler le nom vu par l'équipe, bloquer ou débloquer. |
export_player_data | read | Tout ce qui est conservé sur un joueur, pour une demande d'accès. La suppression d'un joueur reste à un admin humain. |
| Bugs | ||
list_bugs | read | Les bugs regroupés à partir des signalements des joueurs, avec joueurs, signalements sur 24 h, versions, plateformes, première et dernière apparition, version corrigée, ticket GitHub et url, plus le compte par statut. Filtres : app, status (open, fixed, released, wontfix ou closed, séparés par des virgules, ou all), q, sort (players, newest, recent), limit. |
count_bugs | read | Ouverts, corrigés, fermés et total, pour l'organisation ou une app. |
get_bug | read | Un bug en détail : joueurs par jour sur 30 jours, répartition par version, plateforme, appareil et OS, versions actuelles des joueurs, dernière erreur et lignes de journal, signalements avec le message traduit du joueur et sa conversation, aperçu du ticket GitHub. |
link_conversation_to_bug | reply | Compter une conversation comme signalement d'un bug existant (bugId) ou d'un nouveau (title, summary). |
mark_bug_fixed | reply | Corrigé dans une version : chaque joueur qui l'a signalé est prévenu, dans sa langue, quand il lance cette version ou une plus récente. |
reopen_bug | reply | Retour à ouvert, version corrigée effacée. |
close_bug | reply | Fermer sans correction (wontfix). |
merge_bugs | reply | Fusionner un doublon (bugId) into un autre bug de la même app ; les signalements passent de l'un à l'autre, le doublon est supprimé. |
update_bug | reply | Modifier le titre, le résumé, le statut ou la version corrigée d'un bug. |
open_github_issue | reply | Créer le ticket GitHub d'un bug (intégration GitHub nécessaire). |
request_fix | all | Demander une PR de correctif à l'agent de code du dépôt. Ne fusionne jamais. |
| FAQ, rapports et réglages | ||
list_faq | read | Les articles de FAQ de l'app, publiés ou non. |
add_faq_article | reply | Écrire un article de FAQ (published: false pour relecture). |
update_faq_article | reply | Modifier, publier ou dépublier un article. |
delete_faq_article | reply | Supprimer un article. |
import_faq | all | Importer des articles depuis une page d'aide ou un sitemap (https). |
generate_faq | all | Brouillons d'articles écrits par l'IA à partir des conversations passées, non publiés. |
get_stats | read | Volumes, délai de première réponse, part de l'IA, satisfaction, langues. |
get_weekly_digest | read | Le point hebdomadaire : volumes, joueurs qui attendent, passages de main de l'IA, satisfaction, sujets et bugs principaux, suggestions. |
list_automations | read | Les automatisations de l'app et leurs exécutions sur 30 jours. |
get_audit_log | all | Qui a fait quoi, du plus récent au plus ancien. Filtres : app, actor, target, before. |
set_ai_paused | all | Mettre en pause ou relancer l'IA pour toute une app. |
set_announcement | all | Publier (ou retirer, avec un texte vide) un mot en haut du chat pour tous les joueurs, traduit, pendant hours heures (24 par défaut, 0 = jusqu'au retrait). |
L'administration de la plateforme n'est jamais exposée : aucun outil, aucune clé ni aucun jeton OAuth n'y accède.
CLI
La CLI inngame (0.1.2) n'a aucune dépendance et demande Node.js 20 ou plus. Chaque commande correspond à l'API REST, avec la même clé et les mêmes droits que le MCP.
npx inngame login ig_sk_... # saves the key to ~/.config/inngame/config.json
npx inngame whoami
npx inngame inbox --unread
npx inngame bugs --sort players
npx inngame bugs fixed bug_42 --version 1.4.3
| Commande | Rôle |
|---|---|
| Mise en place | |
login <key> [--url URL] | Vérifier et enregistrer une clé d'API. |
whoami | Organisation, formule, nom et droit de la clé. |
apps | Lister les jeux et apps avec leurs clés publiques. |
app <appId> | Mode de l'IA, annonce et intégrations branchées d'une app. |
mcp [claude|cursor|codex|json] | Afficher la configuration MCP pour un agent. |
init unity|ios|web [--app id] | Afficher l'installation en un prompt pour votre projet. |
| Conversations | |
inbox [--status open|closed|snoozed|all] [--unread] [--q text] [--app id] [--lang pt] [--tag t] [--limit 50] [--before cursor] | Lister les conversations. |
show <conversationId> [--before seq] | Lire une conversation avec traductions, brouillon, identifiants des messages et bugs liés. |
reply <conversationId> <text…> | Répondre au joueur (traduit automatiquement). |
note <conversationId> <text…> | Note interne. |
close / reopen <conversationId> | Changer le statut. |
snooze <conversationId> [--hours 24] | Mettre en attente. |
priority <conversationId> 0|1|2 | Régler la priorité. |
ai <conversationId> draft|off|inherit | Mode de l'IA pour une conversation. Laisser l'IA répondre seule (auto) est une décision humaine, prise dans l'inbox. |
suggest <conversationId> | Faire écrire un brouillon par l'IA (rien n'est envoyé). |
approve <conversationId> <draftId> [text…] | Envoyer un brouillon de l'IA, retouché ou non. |
discard <conversationId> <draftId> | Supprimer un brouillon de l'IA. |
unsend <conversationId> <messageId> | Retirer du chat du joueur un message de l'IA, d'une automatisation ou d'un agent. |
tag / untag <conversationId> <tag> | Ajouter ou retirer une étiquette. |
tags | Les étiquettes et leur fréquence. |
replies [--app id] | Réponses enregistrées. |
propose-refund <conversationId> --provider stripe|googleplay|apple --reference id --reason text [--amount 4.99] | Proposition de remboursement pour un admin humain. |
| Joueurs | |
players [--q text] [--app id] | Trouver des joueurs. |
player <playerId> | Identité, appareils et conversations. |
message <playerId> <text…> | Écrire en premier à un joueur. |
block / unblock <playerId> | Bloquer ou débloquer un joueur. |
export-player <playerId> [--out file.json] | Tout ce qui est conservé sur un joueur, enregistré dans un fichier. |
| Bugs | |
bugs [--status open|fixed|released|wontfix|closed|all] [--app id] [--q text] [--sort players|newest|recent] [--limit 100] | Lister les bugs avec joueurs, pics sur 24 h, versions et comptes. |
bugs counts [--app id] | Ouverts, corrigés, fermés, total. |
bugs show <bugId> | Joueurs, versions, plateformes, appareils, OS, ticket GitHub, dernière erreur, signalements, lien vers le tableau de bord. |
bugs fixed <bugId> --version 1.4.3 | Marquer corrigé dans une version ; les joueurs concernés sont prévenus quand ils mettent à jour. |
bugs reopen / close <bugId> | Rouvrir, ou fermer sans correction. |
bugs merge <bugId> --into <bugId> | Fusionner un doublon dans un autre bug de la même app. |
bugs link <conversationId> --bug <bugId> ou --title texte [--summary texte] | Ranger une conversation sous un bug, existant ou nouveau. |
bugs issue <bugId> | Ouvrir le ticket GitHub. |
bugs request-fix <bugId> | Demander une PR à l'agent de code du dépôt (droit all). |
| FAQ, rapports et réglages | |
faq <appId> | Lister les articles. |
faq add <appId> --title t --body b [--draft] | Écrire un article (non publié avec --draft). |
faq edit <appId> <articleId> [--title t] [--body b] [--publish|--unpublish] | Modifier un article. |
faq rm <appId> <articleId> | Supprimer un article. |
faq import <appId> <url> [--keep] | Importer depuis une page d'aide ou un sitemap (droit all ; --keep garde les articles importés avant). |
faq generate <appId> | Brouillons d'articles à partir des conversations passées (droit all). |
automations <appId> | Les automatisations et leurs exécutions sur 30 jours. |
stats [--days 30] [--app id] | Volumes, délai de première réponse, part de l'IA, satisfaction et langues des joueurs. |
week [--days 7] | Le point hebdomadaire. |
audit [--app id] [--actor user|agent] [--target id] | Le journal d'actions (droit all). |
announce <appId> <text…> [--hours 24] | Publier un mot en haut du chat pour tous les joueurs (traduit) ; --clear le retire, --hours 0 le garde jusqu'au retrait. |
pause-ai / resume-ai <appId> | Mettre en pause ou relancer l'IA pour toute une app (droit all). |
Ajoutez --json à n'importe quelle commande pour le JSON brut ; --version affiche la version. Variables d'environnement : INNGAME_API_KEY, INNGAME_URL, INNGAME_CONFIG.
Skill
Le skill Inngame apprend à un agent de code à tenir votre support : trier l'inbox, répondre à partir de la FAQ, traiter les brouillons, trier les bugs (fusionner les doublons, les marquer corrigés dans une version, tickets GitHub et PR de correctif) et installer le SDK 0.2.3. Il passe par les outils MCP, ou par la CLI à défaut, et respecte les règles ci-dessous.
- Claude Code : placez le dossier du skill
inngamedans~/.claude/skills/inngame. En une commande :mkdir -p ~/.claude/skills/inngame && curl -fsSL https://inngame.app/skill/inngame/SKILL.md -o ~/.claude/skills/inngame/SKILL.md - Codex, Cursor, T3 Code, Hermes : indiquez à l'agent le
SKILL.mddu skill.
Téléchargement : inngame.zip (le dossier du skill) ou SKILL.md seul. Relancez la même commande pour le mettre à jour.
Ensuite, demandez par exemple « fais le point sur le support », « de quoi se plaignent les joueurs cette semaine ? », « des nouveaux bugs ? » ou « on a sorti la 1.4.3, préviens les joueurs ».
Installation en un prompt
inngame init affiche un prompt à coller dans votre agent de code, avec la clé de l'app déjà remplie si vous passez --app :
npx inngame apps # find your app id
npx inngame init unity --app app_... # or: init ios, init web
L'agent ajoute le paquet (SDK 0.2.3), configure le SDK au démarrage, identifie le joueur quand il est connu (ticket Steam sur les builds Steam), ajoute une entrée Support dans votre menu pause ou réglages qui marche à la souris, au tactile et à la manette, transmet un contexte utile et vérifie que le projet compile, sans toucher au code du gameplay.
Règles d'accord humain
Elles sont imposées par le serveur, pas seulement suggérées à l'agent, pour les clés d'API, le MCP et les connecteurs OAuth.
| Action | Qui peut la faire |
|---|---|
| Rembourser par Stripe ou Google Play, envoyer la feuille de remboursement Apple | Un admin humain connecté uniquement. Les agents et l'IA intégrée appellent propose_refund ; la proposition apparaît dans la conversation, dont la priorité monte. |
| Fusionner ou publier un correctif | Votre équipe, sur GitHub. request_fix demande une pull request à l'agent de code du dépôt et ne fusionne jamais. |
Laisser l'IA répondre seule (auto), modifier ses instructions | Un humain connecté (un admin pour le réglage de l'app). Les clés peuvent régler draft, off ou mettre l'IA en pause. |
| Donner un objet en jeu (carte d'objet, ou automatisation qui en donne un) | Un humain connecté. Les agents peuvent le suggérer dans une note. |
| Supprimer un joueur ou une app | Un admin humain connecté. Les agents peuvent exporter les données d'un joueur. |
| Démarrer ou changer l'abonnement, clés d'API, membres, intégrations, webhooks | Un admin humain connecté. |
| Répondre aux joueurs | Toute clé avec reply. Chaque message est journalisé avec le nom de la clé. |
Qui a la main. Quand un membre de l'équipe répond dans une conversation, l'IA intégrée s'y met en pause (son mode passe à off). Les réponses envoyées avec une clé d'API ne changent pas le mode de l'IA ; réglez aiMode vous-même si votre agent doit prendre la main (off) ou recevoir des brouillons (draft). inherit revient au réglage de l'app, sauf qu'une clé ne peut pas rendre une conversation à une app dont l'IA répond seule : c'est aussi une décision humaine.
L'IA intégrée et votre propre clé
Chaque app a un mode d'IA (Réglages → Apps → votre app → IA) : off (par défaut), draft (l'IA écrit, un humain envoie) ou auto (l'IA répond à partir de la FAQ et passe la main dans le doute). Chaque conversation peut le remplacer par inherit, auto, draft ou off. Vous pouvez mettre l'IA en pause pour toute une app à tout moment ; les humains continuent de répondre.
Par défaut, l'IA et la traduction tournent sur Cloudflare Workers AI et les messages de l'IA comptent dans votre formule (1 000 par mois en Indie, 10 000 en Studio). Apportez votre propre clé pour lever la limite : un admin choisit Anthropic ou OpenAI dans Réglages → Organisation et colle une clé, stockée chiffrée. C'est un réglage d'admin humain (PATCH /v1/org depuis une session connectée ; les clés d'API reçoivent 403 human_approval_required) :
PATCH /v1/org
{"aiProvider": "anthropic", "aiKey": "sk-ant-...", "aiModel": null}
Remettez aiProvider à platform pour revenir au quota inclus.