Agents, MCP & CLI

Everything the inbox does goes through one REST API. Claude Code, Cursor, Codex or your own scripts can use it with a scoped key, through the MCP server, the CLI or the skill.

API keys and scopes

An admin creates keys in the inbox under Settings → API keys, one per agent or script, so you can tell them apart in the audit log and revoke one without touching the others. Keys look like ig_sk_… and are shown once.

ScopeCan do
readRead conversations, players, bugs, FAQ, tags, stats.
replyEverything in read, plus: reply and leave notes, approve or discard AI drafts, close, snooze, assign, set priority and AI mode, tag, ask the AI, propose refunds, create and update bugs, open GitHub issues, write FAQ articles, block players.
allEverything in reply, plus: app settings such as translation and reviews, pausing the AI or switching it to drafts, automations, FAQ import and generation, fix requests. Letting the AI answer on its own, rewriting its instructions, and moderation, minors and identity settings stay with humans.
no keyReserved for signed-in human admins, whatever the scope: refunds and payment providers, gifting in-game items, billing, API keys, members and invitations, connecting Telegram, Discord, Steam, GitHub, push and webhooks, deleting apps and players, rotating or reading the identity secret. Keys get 403 human_approval_required. A leaked key can't lock you out, read your secrets or move value.

Use the key as a bearer token:

curl https://app.inngame.app/v1/conversations?status=open \
  -H "Authorization: Bearer $INNGAME_API_KEY"

MCP server

The MCP server is at /mcp and speaks Streamable HTTP (stateless). Authenticate with the API key in the Authorization header. Each tool calls the REST API with that key, so an agent can never do more than its key allows, and every action shows up in the audit log under the key's name. An agent already connected to https://inngame.meffysto.workers.dev/mcp keeps working.

Claude Code

claude mcp add --transport http inngame https://app.inngame.app/mcp \
  --header "Authorization: Bearer $INNGAME_API_KEY"

Cursor

In ~/.cursor/mcp.json (all projects) or .cursor/mcp.json (one project):

{
  "mcpServers": {
    "inngame": {
      "url": "https://app.inngame.app/mcp",
      "headers": { "Authorization": "Bearer ig_sk_..." }
    }
  }
}

Codex

In ~/.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 prints these snippets with your saved key filled in.

Web connectors. Connectors that can't send a custom header (claude.ai, ChatGPT) need OAuth, which isn't available yet. Use a desktop or terminal agent for now.

Tools

ToolScopeWhat it does
list_appsreadGames and apps with their ids.
list_conversationsreadConversations, most urgent first. Filter by status, app, unread, tag, search text.
get_conversationreadA conversation with player profile, device, messages, translations, context, drafts and notes.
get_playerreadA player with devices, metadata and conversations.
export_player_datareadEverything held on a player, for a data access request. Deleting a player stays with a human admin.
list_bugsreadBugs grouped from player reports.
get_bugreadA bug with reports, versions, devices, log excerpts, GitHub issue and the url of its page in the inbox.
list_faqreadThe app's FAQ articles.
get_statsreadVolumes, response times, AI share.
replyreplyAnswer the player (auto-translated) or leave an internal note.
approve_draftreplySend a pending AI draft, optionally edited.
discard_draftreplyDelete a pending AI draft.
unsend_messagereplyUnsend a message the AI, an automation or an agent sent by mistake. Not a person's messages, not a claimed item.
update_conversationreplyClose, snooze, assign, set priority or AI mode.
tag_conversationreplyAdd a tag.
ask_aireplyHave the built-in AI answer or draft now, from the FAQ.
propose_refundreplyLeave a refund proposal for a human admin. Never moves money.
update_bugreplyEdit a bug; fixedInVersion notifies reporters when they update.
open_github_issuereplyCreate the GitHub issue for a bug.
add_faq_articlereplyWrite a FAQ article (set published: false for review).
request_fixallAsk the repository's coding agent for a fix PR. Never merges.
set_ai_pausedallPause or resume the AI for a whole app.
set_announcementallPost (or remove, with empty text) a note at the top of the chat for every player, translated, for hours (0 = until removed).

CLI

The inngame CLI has no dependencies and needs Node.js 20 or later. Every command maps to the REST API, with the same key and rights as MCP.

npx inngame login ig_sk_...        # saves the key to ~/.config/inngame/config.json
npx inngame whoami
npx inngame inbox --unread
CommandWhat it does
login <key> [--url URL]Check and save an API key.
whoamiOrganization, plan, key name and scope.
appsList games and apps.
inbox [--status open|closed|snoozed|all] [--unread] [--q text] [--app id] [--lang pt]List conversations (optionally one player language).
show <conversationId>Read a conversation with translations.
reply <conversationId> <text…>Answer the player (auto-translated).
note <conversationId> <text…>Internal note.
close / reopen <conversationId>Change status.
ai <conversationId> draft|off|inheritAI mode for one conversation. Letting the AI answer alone (auto) is a human decision, made in the inbox.
bugs [--status open|fixed|released|wontfix] [--app id]List bugs.
bug <bugId> [--fixed-in 1.4.2] [--issue] [--request-fix]Read a bug, mark it fixed in a version, open the GitHub issue, request a fix PR.
stats [--days 30] [--app id]Volumes, first response time, AI share, satisfaction and player languages.
mcp [claude|cursor|codex|json]Print the MCP config for an agent.
announce <appId> <text…> [--hours 24]Post a note at the top of the chat for every player (translated); --clear removes it, --hours 0 keeps it until removed.
init unity|ios|web [--app id]Print the one-prompt install for your project.

Add --json to any command for raw JSON. Environment variables: INNGAME_API_KEY, INNGAME_URL, INNGAME_CONFIG.

Skill

The Inngame skill teaches a coding agent how to run your support: triage the inbox, answer from the FAQ, handle drafts, triage bugs into GitHub and fix PRs, and install the SDK. It follows the rules below.

Download: inngame.zip (the skill folder) or SKILL.md alone.

Then ask things like "check support", "what are players complaining about this week?" or "any new bugs?".

Install in one prompt

inngame init prints a prompt to paste into your coding agent, with your app key filled in when you pass --app:

npx inngame apps                     # find your app id
npx inngame init unity --app app_... # or: init ios, init web

The agent adds the package, configures the SDK at startup, identifies the player when they're known (Steam ticket on Steam builds), adds a Support entry to your pause or settings menu that works with mouse, touch and gamepad, passes useful context, and checks that the project compiles, without touching gameplay code.

Human approval rules

These are enforced by the server, not just suggested to the agent.

ActionWho can do it
Issue a Stripe or Google Play refund, send the Apple refund sheetA signed-in human admin only. Agents and the built-in AI call propose_refund; the proposal appears in the conversation, which is raised in priority.
Merge or release a fixYour team, on GitHub. request_fix asks the coding agent on the repository for a pull request and never merges.
Start or change the subscriptionA signed-in human admin.
Gift an in-game item (item card)A signed-in human. Agents can suggest it in a note.
Answer playersAny key with reply. Every message is logged with the key's name.

Who has the floor. When a teammate replies in a conversation, the built-in AI pauses there (its mode switches to off). Replies sent with an API key don't change the AI mode; set aiMode yourself if your agent should take over or hand back (inherit returns to the app setting).

The built-in AI and BYOK

Each app has an AI mode (Settings → AI): off (default), draft (the AI writes, a human sends) or auto (the AI answers from the FAQ and hands off when unsure). Each conversation can override it with inherit, auto, draft or off. You can pause the AI for a whole app at any time; humans keep answering.

By default the AI and translation run on Cloudflare Workers AI and AI messages count toward your plan (1,000 or 10,000 a month). Bring your own key to remove the cap: an admin picks Anthropic or OpenAI in Settings → AI and pastes a key, which is stored encrypted. Through the API:

curl -X PATCH https://app.inngame.app/v1/org \
  -H "Authorization: Bearer $INNGAME_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{"aiProvider": "anthropic", "aiKey": "sk-ant-...", "aiModel": null}'

Set aiProvider back to platform to return to the included quota.