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.
| Scope | Can do |
|---|---|
read | Read conversations, players, bugs, FAQ, tags, stats. |
reply | Everything 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. |
all | Everything 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 key | Reserved 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
| Tool | Scope | What it does |
|---|---|---|
list_apps | read | Games and apps with their ids. |
list_conversations | read | Conversations, most urgent first. Filter by status, app, unread, tag, search text. |
get_conversation | read | A conversation with player profile, device, messages, translations, context, drafts and notes. |
get_player | read | A player with devices, metadata and conversations. |
export_player_data | read | Everything held on a player, for a data access request. Deleting a player stays with a human admin. |
list_bugs | read | Bugs grouped from player reports. |
get_bug | read | A bug with reports, versions, devices, log excerpts, GitHub issue and the url of its page in the inbox. |
list_faq | read | The app's FAQ articles. |
get_stats | read | Volumes, response times, AI share. |
reply | reply | Answer the player (auto-translated) or leave an internal note. |
approve_draft | reply | Send a pending AI draft, optionally edited. |
discard_draft | reply | Delete a pending AI draft. |
unsend_message | reply | Unsend a message the AI, an automation or an agent sent by mistake. Not a person's messages, not a claimed item. |
update_conversation | reply | Close, snooze, assign, set priority or AI mode. |
tag_conversation | reply | Add a tag. |
ask_ai | reply | Have the built-in AI answer or draft now, from the FAQ. |
propose_refund | reply | Leave a refund proposal for a human admin. Never moves money. |
update_bug | reply | Edit a bug; fixedInVersion notifies reporters when they update. |
open_github_issue | reply | Create the GitHub issue for a bug. |
add_faq_article | reply | Write a FAQ article (set published: false for review). |
request_fix | all | Ask the repository's coding agent for a fix PR. Never merges. |
set_ai_paused | all | Pause or resume the AI for a whole app. |
set_announcement | all | Post (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
| Command | What it does |
|---|---|
login <key> [--url URL] | Check and save an API key. |
whoami | Organization, plan, key name and scope. |
apps | List 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|inherit | AI 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.
- Claude Code: put the
inngameskill folder in~/.claude/skills/inngame. In one command: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: point the agent at the skill's
SKILL.md.
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.
| Action | Who can do it |
|---|---|
| Issue a Stripe or Google Play refund, send the Apple refund sheet | A 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 fix | Your team, on GitHub. request_fix asks the coding agent on the repository for a pull request and never merges. |
| Start or change the subscription | A signed-in human admin. |
| Gift an in-game item (item card) | A signed-in human. Agents can suggest it in a note. |
| Answer players | Any 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.