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.

DroitPermet de
readLire 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.
replyTout 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.
allTout 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.

OutilDroitRôle
Apps
list_appsreadJeux et apps avec leurs identifiants, clés publiques du SDK, réglages et non-lus.
get_appreadUne app : réglages (IA, apparence, disponibilité, annonce), logo et intégrations branchées.
Conversations
list_conversationsreadLes conversations, les plus urgentes d'abord. Filtres : status, app, unread, tag, lang, assignee, q (recherche), limit, before (curseur).
get_conversationreadUne 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_messagesreadLes 50 messages avant un seq.
replyreplyRépondre au joueur (traduit automatiquement) ou laisser une note interne (note: true).
approve_draftreplyEnvoyer un brouillon de l'IA en attente, retouché ou non.
discard_draftreplySupprimer un brouillon de l'IA en attente.
unsend_messagereplyRetirer 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_conversationreplyFermer, 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_conversationreplyAjouter ou retirer une étiquette.
list_tagsreadLes étiquettes, avec le nombre de conversations qui portent chacune.
ask_aireplyFaire é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_refundreplyLaisser une proposition de remboursement à un admin humain. Ne déplace jamais d'argent.
list_saved_repliesreadLes réponses enregistrées de l'équipe.
Joueurs
list_playersreadTrouver des joueurs par nom, e-mail, identifiant externe ou SteamID ; vus le plus récemment d'abord.
get_playerreadUn joueur avec son identité, ses métadonnées, ses appareils et ses conversations.
message_playerreplyÉcrire en premier à un joueur (démarre ou poursuit sa conversation, traduit, envoyé en push).
update_playerreplyRégler le nom vu par l'équipe, bloquer ou débloquer.
export_player_datareadTout ce qui est conservé sur un joueur, pour une demande d'accès. La suppression d'un joueur reste à un admin humain.
Bugs
list_bugsreadLes 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_bugsreadOuverts, corrigés, fermés et total, pour l'organisation ou une app.
get_bugreadUn 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_bugreplyCompter une conversation comme signalement d'un bug existant (bugId) ou d'un nouveau (title, summary).
mark_bug_fixedreplyCorrigé 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_bugreplyRetour à ouvert, version corrigée effacée.
close_bugreplyFermer sans correction (wontfix).
merge_bugsreplyFusionner 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_bugreplyModifier le titre, le résumé, le statut ou la version corrigée d'un bug.
open_github_issuereplyCréer le ticket GitHub d'un bug (intégration GitHub nécessaire).
request_fixallDemander une PR de correctif à l'agent de code du dépôt. Ne fusionne jamais.
FAQ, rapports et réglages
list_faqreadLes articles de FAQ de l'app, publiés ou non.
add_faq_articlereplyÉcrire un article de FAQ (published: false pour relecture).
update_faq_articlereplyModifier, publier ou dépublier un article.
delete_faq_articlereplySupprimer un article.
import_faqallImporter des articles depuis une page d'aide ou un sitemap (https).
generate_faqallBrouillons d'articles écrits par l'IA à partir des conversations passées, non publiés.
get_statsreadVolumes, délai de première réponse, part de l'IA, satisfaction, langues.
get_weekly_digestreadLe point hebdomadaire : volumes, joueurs qui attendent, passages de main de l'IA, satisfaction, sujets et bugs principaux, suggestions.
list_automationsreadLes automatisations de l'app et leurs exécutions sur 30 jours.
get_audit_logallQui a fait quoi, du plus récent au plus ancien. Filtres : app, actor, target, before.
set_ai_pausedallMettre en pause ou relancer l'IA pour toute une app.
set_announcementallPublier (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
CommandeRôle
Mise en place
login <key> [--url URL]Vérifier et enregistrer une clé d'API.
whoamiOrganisation, formule, nom et droit de la clé.
appsLister 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|2Régler la priorité.
ai <conversationId> draft|off|inheritMode 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.
tagsLes é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.3Marquer 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.

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.

ActionQui peut la faire
Rembourser par Stripe ou Google Play, envoyer la feuille de remboursement AppleUn 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 correctifVotre é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 instructionsUn 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 appUn 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, webhooksUn admin humain connecté.
Répondre aux joueursToute 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.