{"format_version":1,"title":"Feedback in Games MCP reference","endpoint":"https://app.feedbackingames.com/api/mcp","authentication":"OAuth; scopes, selected games and business access are enforced on every call. This reference does not grant access.","protocol_versions":["2026-07-28","2025-11-25","2025-06-18","2025-03-26"],"toolsets":[{"name":"analysis","count":25},{"name":"authoring","count":61},{"name":"localization","count":28},{"name":"administration","count":23}],"output_schema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"data":{},"error":{"type":"object","properties":{"code":{"type":"string"},"message":{"type":"string"},"recovery":{"type":"string"}},"required":["code","message"],"additionalProperties":false}},"additionalProperties":false},"output_notes":"The shared result envelope contains data or error, with compatible text content. Individual data payloads are not fully described by this envelope. Input refinements and business constraints are enforced server-side; consult each tool description.","tools":[{"name":"accept_invite","title":"Accept a team invite","description":"Accept a pending invitation addressed to the calling user's email, by numeric invite id (from list_my_invites). Joins that team; a user belongs to one team, so this replaces the current membership.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"invite_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric invite id"}},"required":["invite_id"]}},{"name":"bulk_upgrade_survey_questions","title":"Upgrade a survey's pinned questions to latest KPI versions","description":"Move every KPI-pinned question in one survey up to its KPI's current published version, by numeric survey id. Returns { upgraded, skipped, blocked } per question. Use this to refresh a single survey (vs bulk_upgrade_surveys_for_kpi which spans all surveys using a KPI).","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"}},"required":["survey_id"]}},{"name":"bulk_upgrade_surveys_for_kpi","title":"Upgrade all surveys to a KPI's latest version","description":"Move every survey question pinned to any version of this KPI question up to its current published version, by numeric kpi_question_id. Returns { upgraded, skipped, blocked } per survey question (blocked = an incompatible change with existing responses, or logic that references a removed option). Requires a published version.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question id"}},"required":["kpi_question_id"]}},{"name":"buy_response_credits","title":"Buy permanent response credits","description":"Create a Stripe Checkout URL to buy a public one-time pack of permanent (never-expiring) response credits for a team. First call list_subscription_plans with kind=response_credits and pass a selected rows[].priceId as price_id. Requires a team admin; availability is rechecked. Returns { url } for the user to review and complete payment; credits apply only via the payment webhook. One credit pays for one individual question answer, not an entire survey.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"},"price_id":{"type":"string","minLength":1,"description":"priceId from list_subscription_plans with kind=response_credits"}},"required":["team_id","price_id"]}},{"name":"cancel_survey_response_export","title":"Cancel response export","description":"Cancel your originating connection's queued/capturing export or invalidate its ready file. Requires BOTH mcp:read and mcp:write and live survey access. Repeated cancellation is harmless. Publication rights and downloads are denied before asynchronous artifact/multipart cleanup. Receipt under 8 KiB.","toolsets":["authoring"],"scope":"mcp:read mcp:write","requiredScopes":["mcp:read","mcp:write"],"requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"export_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["export_id"],"additionalProperties":false}},{"name":"create_currency","title":"Create currency","description":"Create a reward currency for a game. Returns the created currency.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"title":{"type":"string","minLength":1,"description":"Display name, e.g. Gold"},"code":{"type":"string","minLength":1,"maxLength":256,"description":"Short code/symbol, e.g. GLD"},"icon":{"description":"Optional icon (URL or data URI)","type":"string"}},"required":["game_id","title","code"]}},{"name":"create_event","title":"Create event","description":"Create an event (trigger occurrence) for a game. Returns the created event.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"title":{"type":"string","minLength":1,"description":"Display name, e.g. Level Complete"},"value":{"type":"string","minLength":1,"description":"SDK key the game reports this event under, e.g. level_complete"}},"required":["game_id","title","value"]}},{"name":"create_game","title":"Create game","description":"Create a new game for the authenticated developer. Returns the game (including its SDK api_key). Status starts as 'draft'.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Game name"},"description":{"description":"Short description (optional)","type":"string"},"icon":{"description":"Icon URL (optional)","type":"string"},"development_stage":{"description":"Free-form development stage label (optional)","type":"string"},"sdk_version":{"description":"SDK version (one of 3.1.0, 4.0.0, 4.1.0, 4.2.0, 4.3.0); defaults to 4.3.0","type":"string","enum":["3.1.0","4.0.0","4.1.0","4.2.0","4.3.0"]}},"required":["name"]}},{"name":"create_invite","title":"Invite a user to a team","description":"Send a team invitation to an email address with a role, by numeric team id. Admin only. Emails the recipient an invite link.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"},"receiver_email":{"type":"string","format":"email","pattern":"^(?!\\.)(?!.*\\.\\.)([A-Za-z0-9_'+\\-\\.]*)[A-Za-z0-9_+-]@([A-Za-z0-9][A-Za-z0-9\\-]*\\.)+[A-Za-z]{2,}$","description":"Email address to invite"},"role":{"default":"editor","type":"string","enum":["admin","editor","member"],"description":"Membership role (admin can manage the team)"}},"required":["team_id","receiver_email"]}},{"name":"create_kpi_question","title":"Create KPI question","description":"Create a KPI question for a game by numeric game id. Its first version is published immediately. Returns the created KPI question. Options apply to choice/multipleChoice; scale_* to scale; tracked_words to text; target_* set the goal it's measured against.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"type":{"type":"string","enum":["text","choice","multipleChoice","scale"],"description":"Question type: text, choice, multipleChoice, or scale"},"value":{"type":"string","minLength":1,"description":"Question text"},"options":{"description":"Choices (choice/multipleChoice only)","type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"Stable option key (referenced by choice logic rules' condition_value)"},"value":{"type":"string","description":"Option display text"}},"required":["id","value"]}},"allow_other":{"description":"Allow a free-text \"Other\" answer (choice types)","type":"boolean"},"randomize_options":{"description":"Shuffle option order when shown (choice types)","type":"boolean"},"scale_from":{"description":"Scale lower bound (scale only)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"scale_to":{"description":"Scale upper bound (scale only)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"scale_from_label":{"description":"Label for the lower bound (scale only)","type":"string"},"scale_to_label":{"description":"Label for the upper bound (scale only)","type":"string"},"tracked_words":{"description":"Words to track frequency of (text KPIs)","type":"array","items":{"type":"string"}},"target_value":{"description":"Numeric target the KPI is measured against","anyOf":[{"type":"number"},{"type":"null"}]},"target_direction":{"anyOf":[{"type":"string","enum":["above","below","equal"],"description":"Target comparison: above (≥), below (≤), or equal (=) the target_value"},{"type":"null"}]},"target_option_id":{"description":"For choice KPIs: the option id that counts toward the target","anyOf":[{"type":"string"},{"type":"null"}]}},"required":["game_id","type","value"]}},{"name":"create_question","title":"Create question","description":"Add a question to a survey by numeric survey id. The question is appended last. Returns the created question. Options apply to choice/multipleChoice; scale_* to scale. Logic rules are validated server-side. To pin the question to a KPI, set kpi_question_version_id — then type/value/options/scale are inherited from that KPI version and only logic_rules/rewards are taken from your input (type and value are otherwise required).","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"kpi_question_version_id":{"description":"Pin the new question to a KPI question version (currentPublishedVersionId from list_kpi_questions). When set, type/value/options/scale are inherited from that version — supply only logic_rules/rewards.","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"type":{"description":"Question type: text, choice, multipleChoice, or scale. Required unless kpi_question_version_id is set.","type":"string","enum":["text","choice","multipleChoice","scale"]},"value":{"description":"Question text. Required unless kpi_question_version_id is set.","type":"string","minLength":1},"options":{"description":"Choices (choice/multipleChoice only)","type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"Stable option key (referenced by choice logic rules' condition_value)"},"value":{"type":"string","description":"Option display text"}},"required":["id","value"]}},"allow_other":{"description":"Allow a free-text \"Other\" answer (choice types)","type":"boolean"},"randomize_options":{"description":"Shuffle option order when shown (choice types)","type":"boolean"},"scale_from":{"description":"Scale lower bound (scale only)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"scale_to":{"description":"Scale upper bound (scale only)","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"scale_from_label":{"description":"Label for the lower bound (scale only)","type":"string"},"scale_to_label":{"description":"Label for the upper bound (scale only)","type":"string"},"logic_rules":{"description":"Branching rules, first-match-wins (persisted in priority order). The full set — replaces existing on update; omit to leave logic rules unchanged on update.","type":"array","items":{"type":"object","properties":{"condition_operator":{"type":"string","enum":["always","equals","not_equals","contains","not_contains","less_than","greater_than","less_than_or_equal","greater_than_or_equal"],"description":"Condition operator. Valid set depends on the question type (e.g. choice: always/equals/not_equals; scale adds the numeric comparisons); the server rejects invalid combinations."},"condition_value":{"description":"Value the operator compares against (option id for choice equals; number for scale; substring for text). Omit for the \"always\" operator.","anyOf":[{"type":"string"},{"type":"null"}]},"action_type":{"type":"string","enum":["skip_to","end_survey"],"description":"What the rule does: \"skip_to\" a question or \"end_survey\""},"skip_to_question_id":{"description":"Target question id when action_type is \"skip_to\"","anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["condition_operator","action_type"]}},"rewards":{"description":"Per-question currency rewards. Replaces the set; omit to preserve existing, pass [] to clear.","type":"array","items":{"type":"object","properties":{"currency_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric currency id (from list_currencies)"},"amount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Whole units of the currency to award"}},"required":["currency_id","amount"]}}},"required":["survey_id"]}},{"name":"create_survey","title":"Create survey","description":"Create an empty survey draft for incremental editing. Prefer create_survey_from_spec when the questions and triggers are already known. This tool never publishes.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"title":{"type":"string","minLength":1,"description":"Survey title"},"description":{"description":"Survey description","type":"string"},"type":{"type":"string","enum":["dynamic","static"],"description":"Survey type: \"dynamic\" or \"static\""},"start_date":{"description":"ISO start date (optional)","type":"string"},"end_date":{"description":"ISO end date (optional)","type":"string"},"response_limit":{"description":"Max responses to collect; 0 = unlimited","type":"integer","minimum":0,"maximum":9007199254740991},"priority":{"description":"Ordering priority among the game's surveys","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"repeat_interval_days":{"description":"Days after completion before the survey is eligible again; null = once per player","anyOf":[{"type":"integer","minimum":1,"maximum":3650},{"type":"null"}]},"dismissal_retry_hours":{"description":"Hours before an incomplete or dismissed attempt may be offered again","type":"integer","minimum":1,"maximum":720}},"required":["game_id","title"]}},{"name":"create_survey_from_spec","title":"Create a complete survey draft","description":"Create a draft with ordered questions, triggers and in-game rewards in one atomic call. All referenced variables/events/currencies must belong to the game. Never publishes. Review with get_survey; add KPI pins or branching via individual tools, then explicitly publish with update_survey. External reward integrations are configured separately.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Target game; all referenced variables, events and currencies must belong to it."},"title":{"type":"string","minLength":1,"maxLength":4000},"description":{"type":"string","maxLength":8000},"type":{"default":"dynamic","type":"string","enum":["dynamic","static"]},"priority":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"response_limit":{"type":"integer","minimum":0,"maximum":9007199254740991},"repeat_interval_days":{"anyOf":[{"type":"integer","minimum":1,"maximum":3650},{"type":"null"}]},"dismissal_retry_hours":{"type":"integer","minimum":1,"maximum":720},"questions":{"minItems":1,"maxItems":40,"type":"array","items":{"type":"object","properties":{"type":{"type":"string","enum":["text","choice","multipleChoice","scale"]},"value":{"type":"string","minLength":1,"maxLength":4000},"options":{"maxItems":64,"type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"maxLength":128},"value":{"type":"string","minLength":1,"maxLength":4000}},"required":["id","value"],"additionalProperties":false}},"allow_other":{"type":"boolean"},"randomize_options":{"type":"boolean"},"scale_from":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"scale_to":{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"scale_from_label":{"type":"string","maxLength":256},"scale_to_label":{"type":"string","maxLength":256},"rewards":{"maxItems":20,"type":"array","items":{"type":"object","properties":{"currency_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"amount":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["currency_id","amount"],"additionalProperties":false}}},"required":["type","value"],"additionalProperties":false},"description":"Questions in display order. KPI pins and branching logic can be added with individual tools after creation."},"triggers":{"default":[],"maxItems":20,"type":"array","items":{"type":"object","properties":{"title":{"type":"string","minLength":1,"maxLength":4000},"event_condition_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"variable_conditions":{"default":[],"maxItems":64,"type":"array","items":{"type":"object","properties":{"variable_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"operator":{"type":"string","enum":["greaterThan","lessThan","equalTo","notEqualTo","greaterThanOrEqualTo","lessThanOrEqualTo","contains"]},"value":{"type":"string","maxLength":256}},"required":["variable_id","operator","value"],"additionalProperties":false}}},"required":["title"],"additionalProperties":false}},"reward_type":{"description":"Survey-level rewards apply per completion or per answered question; custom_per_question uses each question's rewards.","type":"string","enum":["per_survey","per_question","custom_per_question"]},"rewards":{"default":[],"maxItems":20,"type":"array","items":{"type":"object","properties":{"currency_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"amount":{"type":"integer","exclusiveMinimum":0,"maximum":2147483647}},"required":["currency_id","amount"],"additionalProperties":false}}},"required":["game_id","title","questions"],"additionalProperties":false}},{"name":"create_team","title":"Create a team","description":"Create a new team; the calling user becomes its admin. Any authenticated user may create a team.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"name":{"type":"string","minLength":1,"description":"Team name"},"logo":{"description":"Team logo URL/path","type":"string"}},"required":["name"]}},{"name":"create_trigger","title":"Create trigger","description":"Create a trigger for a survey by numeric survey id. Returns the created trigger.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"title":{"type":"string","minLength":1,"description":"Trigger name"},"variable_conditions":{"description":"Variable conditions, AND-ed together. On creation omit for none; on update omit to preserve, supply [] to clear, or an array to replace.","type":"array","items":{"type":"object","properties":{"variable_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric variable id (from get_game's variables)"},"operator":{"type":"string","enum":["greaterThan","lessThan","equalTo","notEqualTo","greaterThanOrEqualTo","lessThanOrEqualTo","contains"],"description":"Comparison operator: greaterThan, lessThan, equalTo, notEqualTo, greaterThanOrEqualTo, lessThanOrEqualTo, or contains"},"value":{"type":"string","maxLength":4096,"description":"Value to compare against (numbers passed as strings)"}},"required":["variable_id","operator","value"]}},"event_condition_id":{"description":"Numeric event id to require (from get_game's events); omit/null for none","anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["survey_id","title"]}},{"name":"create_variable","title":"Create variable","description":"Create a variable (trigger input) for a game. Returns the created variable.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"title":{"type":"string","minLength":1,"description":"Display name, e.g. Xp Level"},"value":{"type":"string","minLength":1,"maxLength":256,"description":"SDK key the game reports this variable under, e.g. XpLevel"},"type":{"type":"string","enum":["number","text"],"description":"Variable value type: \"number\" or \"text\""}},"required":["game_id","title","value","type"]}},{"name":"decline_invite","title":"Decline a team invite","description":"Decline a pending invitation addressed to the calling user's email, by numeric invite id (from list_my_invites).","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"invite_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric invite id"}},"required":["invite_id"]}},{"name":"delete_currency","title":"Delete currency","description":"Delete a reward currency by numeric currency id. Returns the deleted currency.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"currency_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric currency id"}},"required":["currency_id"]}},{"name":"delete_event","title":"Delete event","description":"Delete an event by numeric event id. Also detaches it from triggers and removes any triggers left with no conditions. Returns the deleted event.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"event_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric event id"}},"required":["event_id"]}},{"name":"delete_invite","title":"Cancel a pending team invite","description":"Delete/cancel a pending team invitation by numeric invite id. Admin of the invite's team only.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"invite_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric invite id"}},"required":["invite_id"]}},{"name":"delete_kpi_question","title":"Delete KPI question","description":"Delete a KPI question (and all its versions) by numeric kpi_question_id. Survey questions pinned to it are detached (their KPI link is cleared). Returns the deleted KPI question.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question id"}},"required":["kpi_question_id"]}},{"name":"delete_question","title":"Delete question","description":"Delete a question by numeric question id. By default the delete is rejected if other questions' logic rules skip to it; pass cleanup_referencing_rules to drop those rules instead. Returns the deleted question.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric question id"},"cleanup_referencing_rules":{"description":"Also delete logic rules in other questions that skip to this one (default false)","type":"boolean"}},"required":["question_id"]}},{"name":"delete_survey_translations_for_language","title":"Delete all of a survey's translations for a language","description":"Remove every translation row (survey title/description, all question texts, all option labels) for one survey in one language. Source content and other languages are untouched. Returns { deleted: true }.","toolsets":["localization"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"language":{"type":"string","minLength":1,"description":"Language code, e.g. 'de' or 'fr-FR'"}},"required":["survey_id","language"]}},{"name":"delete_team","title":"Delete a team","description":"Permanently delete a team and all its memberships and invites, by numeric team id. Admin only. Cannot be undone.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"}},"required":["team_id"]}},{"name":"delete_trigger","title":"Delete trigger","description":"Delete a trigger by numeric trigger id. Also removes its variable conditions. Returns the deleted trigger.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trigger_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric trigger id"}},"required":["trigger_id"]}},{"name":"delete_variable","title":"Delete variable","description":"Delete a variable by numeric variable id. Also removes its trigger conditions and any triggers left with no conditions. Returns the deleted variable.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"variable_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric variable id"}},"required":["variable_id"]}},{"name":"detach_survey_question","title":"Detach a survey question from its KPI","description":"Sever a survey question's link to its KPI question version by numeric survey question id, copying the pinned version's type/value/options onto the question so it becomes a standalone (editable) question. Returns { ok: true }.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey question id"}},"required":["survey_question_id"]}},{"name":"discard_kpi_question_draft","title":"Discard KPI question draft","description":"Discard the pending draft of a KPI question by numeric kpi_question_id, reverting to the current published version. No-op if there is no draft.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question id"}},"required":["kpi_question_id"]}},{"name":"duplicate_survey","title":"Duplicate survey","description":"Duplicate a survey (its questions, options, triggers, and rewards) by numeric survey id. Returns the new survey.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"}},"required":["survey_id"]}},{"name":"explain_survey_eligibility","title":"Explain survey eligibility","description":"Read-only explanation of one survey's candidate eligibility for an exact player ID and supplied traits/events. Checks lifecycle, dates, targeting, repeat/dismissal cooldown, response limit and team quota/hold; returns all gates with reasons/recovery and paged condition details. automatic (default) uses the published targeting plan; manual uses check-survey trigger rules. Debug bypasses cooldown/limits/quota only. Previews lazy quota renewal without writing. Does not serve, choose a priority winner, infer stored traits, replay requests or contact reward providers. Overall eligibility covers every rule, regardless of detail page.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"player_id":{"type":"string","minLength":1,"maxLength":256,"description":"Exact SDK player userId; response history is scoped to this survey"},"mode":{"default":"automatic","description":"automatic: published targeting plan used by serve-survey; manual: check-survey trigger rules","type":"string","enum":["automatic","manual"]},"debug":{"default":false,"description":"SDK debug bypasses cooldown, survey response limit and team quota; lifecycle and targeting still apply","type":"boolean"},"context":{"type":"object","properties":{"traits":{"maxItems":256,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":256},"value":{"type":"string","maxLength":4096}},"required":["name","value"],"additionalProperties":false}},"events":{"maxItems":256,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":256},"occurred_at":{"type":"string","format":"date-time","pattern":"^(?:(?:\\d\\d[2468][048]|\\d\\d[13579][26]|\\d\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\d{4}-(?:(?:0[13578]|1[02])-(?:0[1-9]|[12]\\d|3[01])|(?:0[469]|11)-(?:0[1-9]|[12]\\d|30)|(?:02)-(?:0[1-9]|1\\d|2[0-8])))T(?:(?:[01]\\d|2[0-3]):[0-5]\\d(?::[0-5]\\d(?:\\.\\d+)?)?(?:Z|([+-](?:[01]\\d|2[0-3]):[0-5]\\d)))$"}},"required":["name"],"additionalProperties":false}}},"required":["traits","events"],"additionalProperties":false,"description":"Explicit context for this request, not inferred from stored player traits. Event matching checks presence, not event age."},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"description":"Page of condition/event explanations; overall eligibility always evaluates every rule","type":"integer","minimum":1,"maximum":100}},"required":["survey_id","player_id","context"],"additionalProperties":false}},{"name":"get_external_reward_config","title":"Get provider reward config","description":"Get the full current provider reward configuration and budget, with a SQL-paged integration list. Follow pagination.next_page. The configured integration is eligible even when disconnected. funding_status distinguishes an available funding snapshot from an unavailable provider; funding never includes credentials.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}},"required":["survey_id"]}},{"name":"get_game","title":"Get game","description":"Read one game's settings and bounded pages of variable, event and survey summaries. Use pagination totals to continue; get_survey reads a survey's questions. SDK keys are omitted.","toolsets":["analysis","authoring","localization","administration"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}},"required":["game_id"]}},{"name":"get_kpi_analytics","title":"Get KPI analytics","description":"Get full-history KPI headline metrics, plus an optional paged section: responses (individual answers), surveys (linked survey questions), versions (history and compatibility breaks), distribution, words, or time_series. Defaults to summary only. All aggregates cover the full filter selection; rows/total/next_page describe only the selected section. Choice time_series rows are period/value pairs; use group_by_survey for per-question distributions. Choose value filters OR version_only/version_up_to, never both. Filters apply to the exact response session. No raw corpus is returned in summary.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question id"},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100},"section":{"default":"summary","type":"string","enum":["summary","responses","surveys","versions","distribution","words","time_series"]},"group_by_survey":{"description":"For distribution only: group values by survey question rather than across the whole KPI","type":"boolean"},"app_versions":{"description":"Restrict to these app versions (value-filter mode)","type":"array","items":{"type":"string"}},"trait_filters":{"description":"Restrict to players matching these traits (value-filter mode)","maxItems":32,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":256,"description":"Trait/variable name"},"values":{"type":"array","items":{"type":"string"},"description":"Match any of these values for the trait"}},"required":["name","values"]}},"version_only":{"description":"Only this KPI version number (version-scoping mode)","type":"integer","minimum":0,"maximum":9007199254740991},"version_up_to":{"description":"All KPI versions up to and including this number (version-scoping mode)","type":"integer","minimum":0,"maximum":9007199254740991}},"required":["kpi_question_id"]}},{"name":"get_kpi_filter_options","title":"Get KPI filter options","description":"Discover one page of distinct app versions and trait name/value pairs for KPI filters. A trait's values can span pages; merge them by name. pagination has separate appVersions and traitValues totals/next_page. Optionally narrow trait_name; this does not filter app versions.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question id"},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100},"trait_name":{"type":"string","minLength":1,"maxLength":256}},"required":["kpi_question_id"]}},{"name":"get_kpi_question_translation","title":"Page KPI translations","description":"Page individual source/language records (including untranslated sources), not nested question trees. Returns rows/total/page/pageSize/has_more/next_page. Each row has kind, numeric entity_id for the matching upsert tool, source, language and translation (null when absent). Optional language selects that locale while retaining sources missing it. KPI records use current published versions only; unpublished KPIs produce no rows. Follow next_page until null.","toolsets":["localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100},"language":{"type":"string","minLength":1,"maxLength":100}},"required":["kpi_question_id"]}},{"name":"get_player","title":"Get player profile","description":"Read one player profile with global headline counts and one page of answered sessions grouped by survey. Variables/events are independently paged with the same page parameters. Follow pagination.responses/variables/events; a survey group can continue on another page.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100},"player_profile_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric player profile id (the `id` field from list_players)"}},"required":["game_id","player_profile_id"]}},{"name":"get_question_rewards","title":"Get question rewards","description":"Page question reward definitions for a survey, including questions with no rewards. Each row has question_id, complete=true and the full reward list (maximum 100 entries per question). Never combine a partial reward list into a replacement. Optionally select one question_id; follow next_page for the other questions.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}},"required":["survey_id"]}},{"name":"get_subscription","title":"Get a team's subscription + response quota","description":"Return a team's subscription and response quota by numeric team id: plan, status, monthly responses remaining/total, period end, permanent extra credits, and total available. Requires membership.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"}},"required":["team_id"]}},{"name":"get_survey","title":"Get survey","description":"Read one survey's settings, headline stats, and bounded pages of questions and triggers. Includes question options and logic. Follow pagination for all definitions before editing; get_survey_analytics aggregates full populations; get_survey_responses returns answer pages.","toolsets":["analysis","authoring","localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}},"required":["survey_id"]}},{"name":"get_survey_analytics","title":"Analyze survey responses","description":"Aggregate a survey's full filtered response population without downloading raw answers. Summary reports served, answered, recorded completed/dismissed/unmarked sessions and rates. Questions pages show answer coverage and valid scale statistics; distribution requires question_id and pages option/scale counts, grouping Other/unknown and free text without exposing text. Uses current question definitions; completion is never inferred. Optional compare_filters defines an independent cohort (defaults exclude debug). Filters match get_survey_responses. Page size 1–100; follow each cohort's next_page. Requires survey read access.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"section":{"default":"summary","type":"string","enum":["summary","questions","distribution"]},"question_id":{"description":"Required only for distribution; must belong to this survey","type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"filters":{"default":{"include_debug":"false"},"type":"object","properties":{"user_id":{"description":"Case-insensitive player ID substring","type":"string","maxLength":256},"app_version":{"description":"Case-insensitive app-version substring","type":"string","maxLength":256},"include_debug":{"default":"false","type":"string","enum":["false","true","all"]},"date_from":{"description":"Inclusive response-date lower bound","type":"string","maxLength":64},"date_to":{"description":"Response-date upper bound plus one UTC day, exclusive","type":"string","maxLength":64},"event":{"type":"string","maxLength":256},"trait_filters":{"description":"Numeric variables support > < >= <= != =; other variables use substring matching","maxItems":32,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":256},"expr":{"type":"string","maxLength":256}},"required":["name","expr"],"additionalProperties":false}}},"additionalProperties":false},"compare_filters":{"description":"Independent comparison cohort; omitted fields use defaults, never inherit primary filters. Cohorts may overlap.","type":"object","properties":{"user_id":{"description":"Case-insensitive player ID substring","type":"string","maxLength":256},"app_version":{"description":"Case-insensitive app-version substring","type":"string","maxLength":256},"include_debug":{"default":"false","type":"string","enum":["false","true","all"]},"date_from":{"description":"Inclusive response-date lower bound","type":"string","maxLength":64},"date_to":{"description":"Response-date upper bound plus one UTC day, exclusive","type":"string","maxLength":64},"event":{"type":"string","maxLength":256},"trait_filters":{"description":"Numeric variables support > < >= <= != =; other variables use substring matching","maxItems":32,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":256},"expr":{"type":"string","maxLength":256}},"required":["name","expr"],"additionalProperties":false}}},"additionalProperties":false},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}},"required":["survey_id"],"additionalProperties":false}},{"name":"get_survey_question_translation","title":"Page survey translations","description":"Page individual source/language records (including untranslated sources), not nested question trees. Returns rows/total/page/pageSize/has_more/next_page. Each row has kind, numeric entity_id for the matching upsert tool, source, language and translation (null when absent). Optional language selects that locale while retaining sources missing it. KPI records use current published versions only; unpublished KPIs produce no rows. Follow next_page until null.","toolsets":["localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100},"language":{"type":"string","minLength":1,"maxLength":100}},"required":["question_id"]}},{"name":"get_survey_response_export","title":"Get response export status","description":"Read your originating connection's export state, final counts/checksum and authenticated download path. Requires mcp:read and continuing original read/write grant plus survey access. Poll at most every five seconds. Open the link in your authenticated dashboard browser if the MCP host cannot authenticate HTTP downloads. Verify compressed size/SHA-256; never assume a partial file is complete. Snapshot loss is terminal: request a new key for a new capture. Receipt under 8 KiB.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"export_id":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"}},"required":["export_id"],"additionalProperties":false}},{"name":"get_survey_responses","title":"Get survey responses","description":"Fetch bounded raw answers for inspection; prefer get_survey_analytics for aggregate analysis. One card per response: the user's traits attached once plus their per-question answers (keyed by question_id). Returns responses ONLY; call get_survey first for question text/options and headline stats, then map answers by question_id. Supports the responses-tab filters (userId, app version, debug, date range, event, and per-trait predicates like XpLevel > 5) and database pagination. Defaults to 25 cards, maximum 100; use next_page for more. There is no unbounded export through MCP.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"user_id":{"description":"Substring match on respondent userId","type":"string"},"app_version":{"description":"Substring match on app version","type":"string"},"include_debug":{"description":"Debug responses: \"false\" (default, exclude), \"true\" (only), \"all\"","type":"string","enum":["true","false","all"]},"date_from":{"description":"ISO date lower bound (inclusive)","type":"string"},"date_to":{"description":"ISO date upper bound (inclusive of the day, UTC)","type":"string"},"event":{"description":"Only responses whose user triggered this event trait","type":"string"},"trait_filters":{"description":"Per-trait filters (mirrors the responses-tab variable filters)","maxItems":32,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":256,"description":"Trait/variable name, e.g. XpLevel"},"expr":{"type":"string","maxLength":256,"description":"Predicate: numeric vars support > < >= <= != = (e.g. \"> 5\"); others substring-match"}},"required":["name","expr"]}},"page":{"description":"1-based page (default 1)","type":"integer","minimum":1,"maximum":100000},"items_per_page":{"default":25,"description":"Page size, 1–100 (default 25). Follow next_page for additional results.","type":"integer","minimum":1,"maximum":100}},"required":["survey_id"]}},{"name":"get_survey_rewards","title":"Get survey rewards","description":"Get a complete survey reward definition (rewardType + currency amounts). Maximum 100 reward entries; larger definitions return definition_too_large rather than partial replacement input. Use the dashboard for larger definitions.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"}},"required":["survey_id"]}},{"name":"get_team","title":"Get a team's details and members","description":"Read a team's name/logo and one page of members plus pending invites. Active members come first, then invitations; each group uses descending ID order. Follow pagination.next_page. Requires membership; account API keys are omitted.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}},"required":["team_id"]}},{"name":"get_translation_job","title":"Get an auto-translation job's status","description":"Fetch a translation job by numeric id to check its status (queued/running/done/failed), error, and timing. Returned by start_survey_translation / start_kpi_translation. Returns null if no such job.","toolsets":["localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"job_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric translation job id"}},"required":["job_id"]}},{"name":"leave_team","title":"Leave a team","description":"Remove the calling user from a team by numeric team id; they're given a fresh personal team. Fails if they are the team's only member.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"}},"required":["team_id"]}},{"name":"list_currencies","title":"List currencies","description":"Page a game's reward currencies by ID, with complete translations for each returned currency. query matches title/code literally, ignoring case. Follow next_page; the page is not the full currency catalog.","toolsets":["analysis","authoring","localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100},"query":{"type":"string","minLength":1,"maxLength":200}},"required":["game_id"]}},{"name":"list_external_reward_catalog","title":"List provider reward catalog","description":"Page SDK-openable rewards for a survey's connected integration. Filters: search (name contains), country (alpha-2), currency (alpha-3). Follow next_cursor as cursor even after empty rows; keep resource/filters unchanged. Cursors expire in one hour. One adapter page is loaded per call; adapters such as Tremendous fetch a full upstream catalog, then MCP windows it. Maximum 10,000 upstream items per adapter page; larger pages fail explicitly. Provider failures are errors, not empty catalogs. Item configuration revalidates availability.","toolsets":["analysis","authoring"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100},"cursor":{"type":"string","minLength":1,"maxLength":4096},"search":{"type":"string","minLength":1,"maxLength":200},"country":{"type":"string","pattern":"^[A-Za-z]{2}$"},"currency":{"type":"string","pattern":"^[A-Za-z]{3}$"},"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"integration_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991}},"required":["survey_id","integration_id"]}},{"name":"list_external_reward_grants","title":"List provider reward grants","description":"Get survey-wide provider grant counts and a SQL-paged recent list, newest grant ID first. debug selects detail rows only; counts/debugCounts remain separate and money/claimant/time summaries exclude debug. Follow pagination.next_page. has_link means a stored artifact exists; redemption artifacts are never loaded or returned.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100},"debug":{"default":false,"type":"boolean"}},"required":["survey_id"]}},{"name":"list_games","title":"List games","description":"Browse one page of accessible game summaries. Prefer search_games to filter by name. Returns rows/total/page/pageSize; no nested survey data.","toolsets":["analysis","authoring","localization","administration"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}}}},{"name":"list_kpi_question_translations","title":"Page KPI translations","description":"Page individual source/language records (including untranslated sources), not nested question trees. Returns rows/total/page/pageSize/has_more/next_page. Each row has kind, numeric entity_id for the matching upsert tool, source, language and translation (null when absent). Optional language selects that locale while retaining sources missing it. KPI records use current published versions only; unpublished KPIs produce no rows. Follow next_page until null.","toolsets":["localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100},"language":{"type":"string","minLength":1,"maxLength":100}},"required":["game_id"]}},{"name":"list_kpi_questions","title":"List KPI questions (authoring shape)","description":"Page a game's KPI authoring definitions, including current published version, pending draft and currentPublishedVersionId. Returns rows/total/page/pageSize/has_more/next_page; list_kpis provides metrics instead.","toolsets":["analysis","authoring","localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}},"required":["game_id"]}},{"name":"list_kpis","title":"List KPIs for a game","description":"Page a game's KPI summaries with headline metrics computed across each KPI's full response history. Returns rows/total/page/pageSize/has_more/next_page. Use get_kpi_analytics for a single KPI breakdown.","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}},"required":["game_id"]}},{"name":"list_my_invites","title":"List the caller's pending team invites","description":"Page pending invitations addressed to the caller's email, newest ID first. Returns rows/total/page/pageSize/has_more/next_page. Use invite_id with accept_invite or decline_invite.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}}}},{"name":"list_players","title":"List players for a game","description":"List a game's players (the per-player rollup behind the Players tab): userId, last seen, last app version, surveys/responses answered, responses served, plus the latest value of each requested trait column. Supports the Players-tab filters (userId substring, exact app version, last-seen date range, per-trait predicates) plus sort and pagination. Returns { rows, total, page, pageSize } — page through using total (items_per_page is capped; there is no fetch-all).","toolsets":["analysis","authoring"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"user_id":{"description":"Substring match on the player's userId","type":"string"},"app_version":{"description":"Exact match on the player's last-seen app version","type":"string"},"last_seen_from":{"description":"ISO date lower bound on last seen (inclusive)","type":"string"},"last_seen_to":{"description":"ISO date upper bound on last seen (inclusive of the day)","type":"string"},"trait_filters":{"description":"Per-trait filters, AND-ed together","maxItems":32,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","maxLength":256,"description":"Trait/variable name, e.g. XpLevel"},"op":{"type":"string","enum":["eq","neq","contains","gt","gte","lt","lte"],"description":"Predicate operator. gt/gte/lt/lte compare the trait's numeric value (non-numeric traits never match); eq/neq/contains are text."},"value":{"type":"string","description":"Value to compare against"}},"required":["name","op","value"]}},"cols":{"description":"Trait names to surface as columns (the latest value per player is returned under `traits`). Display only — not a filter.","type":"array","items":{"type":"string"}},"sort_field":{"description":"Sort field: \"lastSeen\" (default), \"userId\", \"surveysAnswered\", \"responseRate\", or \"trait.<name>\" for a numeric trait. Unknown fields fall back to lastSeen.","type":"string"},"sort_dir":{"description":"Sort direction (default desc)","type":"string","enum":["asc","desc"]},"page":{"description":"1-based page (default 1)","type":"integer","minimum":1,"maximum":100000},"items_per_page":{"description":"Page size, 1–500 (default 50)","type":"integer","minimum":1,"maximum":500}},"required":["game_id"]}},{"name":"list_questions","title":"List survey questions","description":"List a survey's questions in order by numeric survey id — the canonical authoring shape including each question's options, scale bounds, allow_other/randomize flags, and branching logic rules. Returns one page as rows/total/page/pageSize/has_more. Use this before editing and continue until has_more is false.","toolsets":["analysis","authoring","localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}},"required":["survey_id"]}},{"name":"list_subscription_plans","title":"List subscription plans or response-credit packs","description":"Page Stripe offers using kind=recurring (default) or response_credits. Both return {billing_configured, rows, page_size, has_more, next_cursor}; pass next_cursor as cursor even after empty filtered pages. Each call scans one provider page (25 default, 100 maximum). Recurring adds at most three team_plans for assigned/previous/current offers and team_context_complete; current archived plans are context with available_for_checkout=false. Team context repeats per page; deduplicate by priceId. team_id requires membership. Private offers are visible only in their authorized team context; cursors expire in one hour. No global total or price sort is claimed. Use priceId with subscribe or buy_response_credits; checkout revalidates and requires a team admin. Amounts exclude final checkout taxes/adjustments.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kind":{"default":"recurring","type":"string","enum":["recurring","response_credits"]},"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page_size":{"type":"integer","minimum":1,"maximum":100},"cursor":{"type":"string","minLength":1,"maxLength":4096}}}},{"name":"list_survey_translations","title":"Page survey translations","description":"Page individual source/language records (including untranslated sources), not nested question trees. Returns rows/total/page/pageSize/has_more/next_page. Each row has kind, numeric entity_id for the matching upsert tool, source, language and translation (null when absent). Optional language selects that locale while retaining sources missing it. KPI records use current published versions only; unpublished KPIs produce no rows. Follow next_page until null.","toolsets":["localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100},"language":{"type":"string","minLength":1,"maxLength":100}},"required":["survey_id"]}},{"name":"list_surveys","title":"List surveys","description":"Browse one page of survey summaries and completion stats in a game. Prefer search_surveys for title/status filters. Use get_survey for questions, triggers and settings.","toolsets":["analysis","authoring","localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}},"required":["game_id"]}},{"name":"open_billing_portal","title":"Open the Stripe billing portal","description":"Create a Stripe billing portal URL (change plan / update card / cancel) for a team that has already subscribed, by numeric team id. Admin only. Returns { url }.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"}},"required":["team_id"]}},{"name":"preview_kpi_translation_conflicts","title":"Preview a KPI auto-translation's conflicts","description":"Count how many translatable strings in a KPI question version already have a translation in the target language (conflicts) vs the total. Use before start_kpi_translation.","toolsets":["localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_version_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question version id"},"target_language":{"type":"string","minLength":1,"description":"Language code to translate into"}},"required":["kpi_question_version_id","target_language"]}},{"name":"preview_survey_translation_conflicts","title":"Preview a survey auto-translation's conflicts","description":"Count how many translatable strings in a survey already have a translation in the target language (conflicts) vs the total to translate. Use before start_survey_translation to decide whether to overwrite.","toolsets":["localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"target_language":{"type":"string","minLength":1,"description":"Language code to translate into"}},"required":["survey_id","target_language"]}},{"name":"publish_kpi_question","title":"Publish KPI question draft","description":"Publish the pending draft of a KPI question (from update_kpi_question) as a new version by numeric kpi_question_id. Surveys pinned to this KPI can then be moved to the new version via upgrade_survey_question_version / bulk_upgrade_surveys_for_kpi. Requires a pending draft. Returns the KPI question.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question id"}},"required":["kpi_question_id"]}},{"name":"remove_team_member","title":"Remove a member from a team","description":"Remove a member from a team by numeric team id + the member's numeric user id (from get_team's members[].user_id). Admin only. The removed user is given a fresh personal team.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"},"member_user_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric user id of the member to remove"}},"required":["team_id","member_user_id"]}},{"name":"reorder_questions","title":"Reorder questions","description":"Set the order of a survey's questions by numeric survey id. Pass the question ids in the desired order (must be the survey's questions). Returns the questions in the new order.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"ordered_question_ids":{"minItems":1,"type":"array","items":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"description":"All of the survey's question ids, in the desired order"}},"required":["survey_id","ordered_question_ids"]}},{"name":"resend_invite","title":"Resend a team invite email","description":"Re-send the invitation email for a pending invite by numeric invite id. Admin of the invite's team only.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"invite_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric invite id"}},"required":["invite_id"]}},{"name":"search_games","title":"Search / paginate the caller's games","description":"Find accessible games by name. Returns rows/total/page/pageSize with survey, variable and event counts; SDK keys are omitted. Use get_game for settings and bounded definitions. list_games is the unfiltered browse alternative.","toolsets":["analysis","authoring","localization","administration"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"query":{"description":"Filter by game name (space-separated tokens, all must match)","type":"string"},"sort_dir":{"description":"Sort by name ascending (default) or descending","type":"string","enum":["asc","desc"]},"page":{"description":"1-based page number (default 1)","type":"integer","exclusiveMinimum":0,"maximum":100000},"page_size":{"description":"Rows per page, maximum 100 (default 20)","type":"integer","exclusiveMinimum":0,"maximum":100}}}},{"name":"search_surveys","title":"Search / paginate a game's surveys","description":"List a game's surveys as a paginated table with per-survey completion stats (unique_users answered, unique_displayed shown, conversion_rate_completion, totals) and logic_valid, by numeric game id. Filter by title/status, then use get_survey for questions and settings. list_surveys is the unfiltered browse alternative.","toolsets":["analysis","authoring","localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"query":{"description":"Filter by survey title (space-separated tokens, all must match)","type":"string"},"status":{"description":"Restrict to these survey statuses","type":"array","items":{"type":"string","enum":["draft","active","not_active","archived"],"description":"Survey lifecycle status: \"draft\", \"active\", \"not_active\", or \"archived\""}},"system_status":{"description":"Filter the read-only system hold independently of the user status","type":"array","items":{"type":"string","enum":["on_hold","none"]}},"sort_field":{"description":"Sort column (default status)","type":"string","enum":["title","status","start_date"]},"sort_dir":{"description":"Sort direction (default asc)","type":"string","enum":["asc","desc"]},"page":{"description":"1-based page number (default 1)","type":"integer","exclusiveMinimum":0,"maximum":100000},"page_size":{"description":"Rows per page, maximum 100 (default 10)","type":"integer","exclusiveMinimum":0,"maximum":100}},"required":["game_id"]}},{"name":"set_external_reward_config","title":"Set provider reward config","description":"Create or replace a survey's provider reward using a connected reward integration and one item from that integration's catalog.","toolsets":["authoring"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"enabled":{"type":"boolean","description":"Whether the reward is offered"},"integration_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric reward integration id"},"provider_item_id":{"type":"string","minLength":1,"description":"Item id returned by list_external_reward_catalog"},"value_cents":{"type":"integer","minimum":100,"maximum":100000,"description":"Reward value in the currency's minor units"},"currency_code":{"type":"string","minLength":3,"maxLength":3,"description":"ISO 4217 currency code supported by the catalog item"},"budget_cents":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Survey spend cap in minor units (>= value_cents)"},"claim_window_days":{"default":14,"description":"Days after serving that a player can claim","type":"integer","minimum":1,"maximum":90}},"required":["survey_id","enabled","integration_id","provider_item_id","value_cents","currency_code","budget_cents"]}},{"name":"set_game_languages","title":"Set a game's default + available languages","description":"Configure the translation languages for a game. default_language is the source language authored text is written in; available_languages is the full set translations may target. The default is always forced into the available set. Edit the default and/or available languages. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["localization"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"default_language":{"type":"string","minLength":1,"description":"Source language code authored content is written in"},"available_languages":{"type":"array","items":{"type":"string","minLength":1},"description":"All language codes this game supports (the default is added automatically if missing)"},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["game_id"],"additionalProperties":false}},{"name":"start_kpi_translation","title":"Start auto-translating a KPI question","description":"Enqueue a background DeepL job that translates a KPI question version's strings from the game's default language into target_language. Same preconditions as start_survey_translation (target in available_languages, ≠ default, no concurrent job for this version+language). Returns the job (poll get_translation_job).","toolsets":["localization"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_version_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question version id"},"target_language":{"type":"string","minLength":1,"description":"Language code to translate into"},"overwrite":{"type":"boolean","description":"Replace existing translations (true) or only fill in missing ones (false)"}},"required":["kpi_question_version_id","target_language","overwrite"]}},{"name":"start_survey_response_export","title":"Export survey responses","description":"Create a private single-survey JSONL gzip snapshot for offline analysis. Requires BOTH mcp:read and mcp:write because it retains player data and consumes resources. Use a new UUID idempotency_key for each intended export; identical retries deduplicate for seven days. Snapshot begins at worker capture. Default excludes debug and unanswered sessions. Maximum 100,000 sessions, 500,000 answers, 256 MiB uncompressed / 128 MiB download, 1 MiB record, five-minute capture; one active job and ten admissions/day per creator. Returns a receipt under 8 KiB; poll no faster than every five seconds. No file bytes in MCP. Ready artifact expires after 24 hours; current access/erasure checks apply. Requires an operational worker/private store.","toolsets":["authoring"],"scope":"mcp:read mcp:write","requiredScopes":["mcp:read","mcp:write"],"requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"idempotency_key":{"type":"string","format":"uuid","pattern":"^([0-9a-fA-F]{8}-[0-9a-fA-F]{4}-[1-8][0-9a-fA-F]{3}-[89abAB][0-9a-fA-F]{3}-[0-9a-fA-F]{12}|00000000-0000-0000-0000-000000000000|ffffffff-ffff-ffff-ffff-ffffffffffff)$"},"filters":{"default":{},"type":"object","properties":{"user_id":{"type":"string","maxLength":256},"app_version":{"type":"string","maxLength":256},"include_debug":{"default":"false","type":"string","enum":["false","true","all"]},"date_from":{"type":"string","maxLength":256},"date_to":{"type":"string","maxLength":256},"event":{"type":"string","maxLength":256},"trait_filters":{"default":[],"maxItems":32,"type":"array","items":{"type":"object","properties":{"name":{"type":"string","minLength":1,"maxLength":256},"expr":{"type":"string","maxLength":256}},"required":["name","expr"],"additionalProperties":false}}},"additionalProperties":false},"include_unanswered":{"default":false,"type":"boolean"}},"required":["survey_id","idempotency_key"],"additionalProperties":false}},{"name":"start_survey_translation","title":"Start auto-translating a survey","description":"Enqueue a background DeepL job that translates every translatable string in a survey from the game's default language into target_language. Preconditions: target_language must be in the game's available_languages and differ from the default, and no other job may already be running for the same survey+language. overwrite=false skips strings that already have a translation; overwrite=true replaces them. Returns the job (poll get_translation_job for status).","toolsets":["localization"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"target_language":{"type":"string","minLength":1,"description":"Language code to translate into"},"overwrite":{"type":"boolean","description":"Replace existing translations (true) or only fill in missing ones (false)"}},"required":["survey_id","target_language","overwrite"]}},{"name":"subscribe","title":"Start a subscription checkout","description":"Create a Stripe Checkout URL to subscribe a team to a recurring plan (price_id from list_subscription_plans), by numeric team id. Admin only. Returns { url } for the user to complete payment; the subscription activates via webhook.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":false,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"},"price_id":{"type":"string","minLength":1,"description":"Stripe recurring price id"}},"required":["team_id","price_id"]}},{"name":"update_currency","title":"Update currency","description":"Edit a reward currency by numeric currency id. Returns the updated currency. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"currency_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric currency id"},"title":{"type":"string","minLength":1,"description":"Display name, e.g. Gold"},"code":{"type":"string","minLength":1,"maxLength":256,"description":"Short code/symbol, e.g. GLD"},"icon":{"description":"Icon URL or data URI; null clears it","anyOf":[{"type":"string"},{"type":"null"}]},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["currency_id"],"additionalProperties":false}},{"name":"update_event","title":"Update event","description":"Edit an event by numeric event id. Returns the updated event. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"event_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric event id"},"title":{"type":"string","minLength":1,"description":"Display name, e.g. Level Complete"},"value":{"type":"string","minLength":1,"description":"SDK key the game reports this event under, e.g. level_complete"},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["event_id"],"additionalProperties":false}},{"name":"update_game","title":"Update game","description":"Update a game by numeric game id. Partial update — only the fields you pass are changed. Returns the updated game. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"game_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric game id"},"name":{"description":"Game name","type":"string","minLength":1},"description":{"description":"Short description","anyOf":[{"type":"string"},{"type":"null"}]},"icon":{"description":"Icon URL","anyOf":[{"type":"string"},{"type":"null"}]},"status":{"description":"Lifecycle status (e.g. draft)","type":"string","minLength":1},"sdk_version":{"type":"string","enum":["3.1.0","4.0.0","4.1.0","4.2.0","4.3.0"],"description":"SDK version (one of 3.1.0, 4.0.0, 4.1.0, 4.2.0, 4.3.0)"},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["game_id"],"additionalProperties":false}},{"name":"update_kpi_question","title":"Update KPI question (draft)","description":"Edit a KPI question by numeric kpi_question_id. Edits accumulate in a single pending DRAFT — this does NOT change what surveys serve. Call publish_kpi_question to release the draft as a new version, or discard_kpi_question_draft to drop it. Returns the KPI question with its draft. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question id"},"type":{"type":"string","enum":["text","choice","multipleChoice","scale"],"description":"Question type: text, choice, multipleChoice, or scale"},"value":{"type":"string","minLength":1,"description":"Question text"},"options":{"description":"Choices (choice/multipleChoice only)","type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"Stable option key (referenced by choice logic rules' condition_value)"},"value":{"type":"string","description":"Option display text"}},"required":["id","value"]}},"allow_other":{"description":"Allow a free-text \"Other\" answer (choice types)","type":"boolean"},"randomize_options":{"description":"Shuffle option order when shown (choice types)","type":"boolean"},"scale_from":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"scale_to":{"anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"scale_from_label":{"anyOf":[{"type":"string"},{"type":"null"}]},"scale_to_label":{"anyOf":[{"type":"string"},{"type":"null"}]},"tracked_words":{"description":"Words to track frequency of (text KPIs)","type":"array","items":{"type":"string"}},"target_value":{"description":"Numeric target the KPI is measured against","anyOf":[{"type":"number"},{"type":"null"}]},"target_direction":{"anyOf":[{"type":"string","enum":["above","below","equal"],"description":"Target comparison: above (≥), below (≤), or equal (=) the target_value"},{"type":"null"}]},"target_option_id":{"description":"For choice KPIs: the option id that counts toward the target","anyOf":[{"type":"string"},{"type":"null"}]},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["kpi_question_id"],"additionalProperties":false}},{"name":"update_member_role","title":"Change a team member's role","description":"Set a member's role on a team by numeric team id + member user id. Admin only. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"},"member_user_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric user id of the member"},"role":{"type":"string","enum":["admin","editor","member"],"description":"Membership role (admin can manage the team)"},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["team_id","member_user_id"],"additionalProperties":false}},{"name":"update_profile","title":"Update the caller's account profile","description":"Update the calling user's own profile fields (name, company, country, job role/title, company size). Partial: omitted fields keep their current value (read current values from whoami). Does NOT change the password or any team membership. Returns the updated profile. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"first_name":{"description":"First name","type":"string"},"last_name":{"description":"Last name","type":"string"},"country":{"description":"Country","type":"string"},"company":{"description":"Company name","type":"string"},"role":{"description":"Job role/title (free text — not the team role)","type":"string"},"number_of_employees":{"description":"Number of employees as a non-negative integer string, e.g. '50'","type":"string","pattern":"^\\d+$"},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"additionalProperties":false}},{"name":"update_question","title":"Update question","description":"Update a question by numeric question id. Edit question content, options, logic rules or rewards. KPI-pinned content must be edited through the KPI workflow or detached first. Returns the updated question. Changing type re-shapes the question (options cleared for non-choice types). Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric question id"},"type":{"type":"string","enum":["text","choice","multipleChoice","scale"],"description":"Question type: text, choice, multipleChoice, or scale"},"value":{"type":"string","minLength":1,"description":"Question text"},"options":{"description":"Choices (choice/multipleChoice only)","type":"array","items":{"type":"object","properties":{"id":{"type":"string","minLength":1,"description":"Stable option key (referenced by choice logic rules' condition_value)"},"value":{"type":"string","description":"Option display text"}},"required":["id","value"]}},"allow_other":{"description":"Allow a free-text \"Other\" answer (choice types)","type":"boolean"},"randomize_options":{"description":"Shuffle option order when shown (choice types)","type":"boolean"},"scale_from":{"description":"Scale lower bound (scale only)","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"scale_to":{"description":"Scale upper bound (scale only)","anyOf":[{"type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},{"type":"null"}]},"scale_from_label":{"description":"Label for the lower bound (scale only)","anyOf":[{"type":"string"},{"type":"null"}]},"scale_to_label":{"description":"Label for the upper bound (scale only)","anyOf":[{"type":"string"},{"type":"null"}]},"logic_rules":{"description":"Branching rules, first-match-wins (persisted in priority order). The full set — replaces existing on update; omit to leave logic rules unchanged on update.","type":"array","items":{"type":"object","properties":{"condition_operator":{"type":"string","enum":["always","equals","not_equals","contains","not_contains","less_than","greater_than","less_than_or_equal","greater_than_or_equal"],"description":"Condition operator. Valid set depends on the question type (e.g. choice: always/equals/not_equals; scale adds the numeric comparisons); the server rejects invalid combinations."},"condition_value":{"description":"Value the operator compares against (option id for choice equals; number for scale; substring for text). Omit for the \"always\" operator.","anyOf":[{"type":"string"},{"type":"null"}]},"action_type":{"type":"string","enum":["skip_to","end_survey"],"description":"What the rule does: \"skip_to\" a question or \"end_survey\""},"skip_to_question_id":{"description":"Target question id when action_type is \"skip_to\"","anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]}},"required":["condition_operator","action_type"]}},"rewards":{"description":"Per-question currency rewards. Replaces the set; omit to preserve existing, pass [] to clear.","type":"array","items":{"type":"object","properties":{"currency_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric currency id (from list_currencies)"},"amount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Whole units of the currency to award"}},"required":["currency_id","amount"]}},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["question_id"],"additionalProperties":false}},{"name":"update_question_rewards","title":"Update question rewards","description":"Replace one question's currency rewards by numeric question id. Returns success. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric question id"},"rewards":{"type":"array","items":{"type":"object","properties":{"currency_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric currency id (from list_currencies)"},"amount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Whole units of the currency to award"}},"required":["currency_id","amount"]},"description":"Currency rewards; replaces the existing set"},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["question_id"],"additionalProperties":false}},{"name":"update_survey","title":"Update survey","description":"Update a survey's settings by numeric survey id. Partial update — only the fields you pass change; questions are managed separately (create_question/update_question/delete_question/reorder_questions). Returns the updated survey. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"title":{"description":"Survey title","type":"string","minLength":1},"description":{"description":"Survey description","anyOf":[{"type":"string"},{"type":"null"}]},"type":{"type":"string","enum":["dynamic","static"],"description":"Survey type: \"dynamic\" or \"static\""},"status":{"type":"string","enum":["draft","active","not_active","archived"],"description":"Survey lifecycle status: \"draft\", \"active\", \"not_active\", or \"archived\""},"start_date":{"description":"ISO start date; null clears it","anyOf":[{"type":"string"},{"type":"null"}]},"end_date":{"description":"ISO end date; null clears it","anyOf":[{"type":"string"},{"type":"null"}]},"response_limit":{"description":"Max responses to collect; 0 = unlimited","type":"integer","minimum":0,"maximum":9007199254740991},"priority":{"description":"Ordering priority among the game's surveys","type":"integer","minimum":-9007199254740991,"maximum":9007199254740991},"repeat_interval_days":{"description":"Days after completion before the survey is eligible again; null = once per player","anyOf":[{"type":"integer","minimum":1,"maximum":3650},{"type":"null"}]},"dismissal_retry_hours":{"description":"Hours before an incomplete or dismissed attempt may be offered again","type":"integer","minimum":1,"maximum":720},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["survey_id"],"additionalProperties":false}},{"name":"update_survey_rewards","title":"Update survey rewards","description":"Edit a survey's reward configuration by numeric survey id. Returns success. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"reward_type":{"description":"How rewards are granted: \"per_survey\", \"per_question\", or \"custom_per_question\". null clears the reward type; [] clears rewards.","anyOf":[{"type":"string","enum":["per_survey","per_question","custom_per_question"]},{"type":"null"}]},"rewards":{"type":"array","items":{"type":"object","properties":{"currency_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric currency id (from list_currencies)"},"amount":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Whole units of the currency to award"}},"required":["currency_id","amount"]},"description":"Currency rewards; replaces the existing set"},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["survey_id"],"additionalProperties":false}},{"name":"update_team","title":"Update a team's name/logo","description":"Update a team's name and/or logo by numeric team id. Admin only. Partial: omitted fields keep their current value. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["administration"],"scope":"mcp:admin","requiresAllGames":true,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"team_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric team id"},"name":{"description":"New team name","type":"string","minLength":1},"logo":{"description":"New team logo URL/path; null removes it","anyOf":[{"type":"string"},{"type":"null"}]},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["team_id"],"additionalProperties":false}},{"name":"update_trigger","title":"Update trigger","description":"Edit a trigger by numeric trigger id. Title, variable conditions and event can be changed independently. Use variable_conditions=[] to remove conditions and event_condition_id=null to remove the event. Returns the updated trigger. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"trigger_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric trigger id"},"title":{"type":"string","minLength":1,"description":"Trigger name"},"variable_conditions":{"description":"Variable conditions, AND-ed together. On creation omit for none; on update omit to preserve, supply [] to clear, or an array to replace.","type":"array","items":{"type":"object","properties":{"variable_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric variable id (from get_game's variables)"},"operator":{"type":"string","enum":["greaterThan","lessThan","equalTo","notEqualTo","greaterThanOrEqualTo","lessThanOrEqualTo","contains"],"description":"Comparison operator: greaterThan, lessThan, equalTo, notEqualTo, greaterThanOrEqualTo, lessThanOrEqualTo, or contains"},"value":{"type":"string","maxLength":4096,"description":"Value to compare against (numbers passed as strings)"}},"required":["variable_id","operator","value"]}},"event_condition_id":{"description":"Numeric event id to require; null removes the event","anyOf":[{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},{"type":"null"}]},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["trigger_id"],"additionalProperties":false}},{"name":"update_variable","title":"Update variable","description":"Edit a variable by numeric variable id. Returns the updated variable. Omitted fields are preserved; null clears nullable fields; supplied arrays replace the collection ([] clears it when valid). Set dry_run=true to preview without saving.","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"variable_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric variable id"},"title":{"type":"string","minLength":1,"description":"Display name, e.g. Xp Level"},"value":{"type":"string","minLength":1,"maxLength":256,"description":"SDK key the game reports this variable under, e.g. XpLevel"},"type":{"type":"string","enum":["number","text"],"description":"Variable value type: \"number\" or \"text\""},"dry_run":{"description":"Show proposed changes without saving. Same write/admin permission required. Apply runs final business checks against current data.","type":"boolean"}},"required":["variable_id"],"additionalProperties":false}},{"name":"upgrade_survey_question_version","title":"Upgrade a pinned survey question's KPI version","description":"Re-pin one survey question to a specific (published) KPI question version, by numeric survey question id + target version id (from list_kpi_questions' currentPublishedVersionId). Returns an outcome: 'upgraded'; 'no_op' (already on target); or 'blocked' with a reason (type/scale/option change incompatible with existing responses, or logic references a removed option).","toolsets":["authoring"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey question id"},"to_version_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Target KPI question version id (currentPublishedVersionId from list_kpi_questions)"}},"required":["survey_question_id","to_version_id"]}},{"name":"upsert_currency_translation","title":"Set a currency title translation","description":"Create or replace the translated title of a game currency for one language. For bulk writes, supply only entries:[{...same fields...}] (1–100, at most 128 KiB UTF-8 JSON; language at most 35 characters; survey fields at most 500, other text at most 16384). Each entry needs translated text; duplicate entity/language targets and unknown fields are rejected. The entire batch commits or rolls back. Existing row IDs, source hashes and omitted fields survive; null does not clear fields. Bulk result: {applied,count,results:[{index,entity_id,language,translation_id}]}.","toolsets":["localization"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"currency_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric currency id"},"language":{"type":"string","minLength":1,"description":"Language code, e.g. 'de' or 'fr-FR'"},"title":{"type":"string","description":"Translated currency title"},"entries":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"currency_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"language":{"type":"string","minLength":1,"maxLength":35},"title":{"type":"string","maxLength":16384}},"required":["currency_id","language","title"],"additionalProperties":false}}},"additionalProperties":{}}},{"name":"upsert_kpi_question_option_translation","title":"Set a KPI choice option's label translation","description":"Create or replace the translated label of one KPI question option for a language. kpi_question_option_version_id is entity_id on a kpi_option row from list_kpi_question_translations. For bulk writes, supply only entries:[{...same fields...}] (1–100, at most 128 KiB UTF-8 JSON; language at most 35 characters; survey fields at most 500, other text at most 16384). Each entry needs translated text; duplicate entity/language targets and unknown fields are rejected. The entire batch commits or rolls back. Existing row IDs, source hashes and omitted fields survive; null does not clear fields. Bulk result: {applied,count,results:[{index,entity_id,language,translation_id}]}.","toolsets":["localization"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_option_version_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question option version id"},"language":{"type":"string","minLength":1,"description":"Language code, e.g. 'de' or 'fr-FR'"},"value":{"type":"string","description":"Translated option label"},"entries":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"kpi_question_option_version_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"language":{"type":"string","minLength":1,"maxLength":35},"value":{"type":"string","maxLength":16384}},"required":["kpi_question_option_version_id","language","value"],"additionalProperties":false}}},"additionalProperties":{}}},{"name":"upsert_kpi_question_translation","title":"Set a KPI question's text translation","description":"Create or update the translation of a KPI question version's text and, for scale questions, its from/to labels, for one language. kpi_question_version_id is entity_id on a kpi_question row from list_kpi_question_translations. Omitted fields are left unchanged. Translations bind to the version, so historical versions keep their own text. For bulk writes, supply only entries:[{...same fields...}] (1–100, at most 128 KiB UTF-8 JSON; language at most 35 characters; survey fields at most 500, other text at most 16384). Each entry needs translated text; duplicate entity/language targets and unknown fields are rejected. The entire batch commits or rolls back. Existing row IDs, source hashes and omitted fields survive; null does not clear fields. Bulk result: {applied,count,results:[{index,entity_id,language,translation_id}]}.","toolsets":["localization"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"kpi_question_version_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric KPI question version id (currentPublishedVersionId)"},"language":{"type":"string","minLength":1,"description":"Language code, e.g. 'de' or 'fr-FR'"},"value":{"description":"Translated KPI question text","type":"string"},"scale_from_label":{"description":"Translated low-end scale label","type":"string"},"scale_to_label":{"description":"Translated high-end scale label","type":"string"},"entries":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"kpi_question_version_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"language":{"type":"string","minLength":1,"maxLength":35},"value":{"type":"string","maxLength":16384},"scale_from_label":{"type":"string","maxLength":16384},"scale_to_label":{"type":"string","maxLength":16384}},"required":["kpi_question_version_id","language"],"additionalProperties":false}}},"additionalProperties":{}}},{"name":"upsert_question_option_translation","title":"Set a choice option's label translation","description":"Create or replace the translated label of one choice/multipleChoice option for a language. option_id is the numeric entity_id on a question_option row from list_survey_translations, not its SDK option key. For bulk writes, supply only entries:[{...same fields...}] (1–100, at most 128 KiB UTF-8 JSON; language at most 35 characters; survey fields at most 500, other text at most 16384). Each entry needs translated text; duplicate entity/language targets and unknown fields are rejected. The entire batch commits or rolls back. Existing row IDs, source hashes and omitted fields survive; null does not clear fields. Bulk result: {applied,count,results:[{index,entity_id,language,translation_id}]}.","toolsets":["localization"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"option_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric option row id"},"language":{"type":"string","minLength":1,"description":"Language code, e.g. 'de' or 'fr-FR'"},"value":{"type":"string","description":"Translated option label"},"entries":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"option_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"language":{"type":"string","minLength":1,"maxLength":35},"value":{"type":"string","maxLength":16384}},"required":["option_id","language","value"],"additionalProperties":false}}},"additionalProperties":{}}},{"name":"upsert_question_translation","title":"Set a survey question's text translation","description":"Create or update the translation of a survey question's text (value) and, for scale questions, its from/to labels, for one language. Omitted fields are left unchanged. Option labels are translated separately via upsert_question_option_translation. For bulk writes, supply only entries:[{...same fields...}] (1–100, at most 128 KiB UTF-8 JSON; language at most 35 characters; survey fields at most 500, other text at most 16384). Each entry needs translated text; duplicate entity/language targets and unknown fields are rejected. The entire batch commits or rolls back. Existing row IDs, source hashes and omitted fields survive; null does not clear fields. Bulk result: {applied,count,results:[{index,entity_id,language,translation_id}]}.","toolsets":["localization"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric question id"},"language":{"type":"string","minLength":1,"description":"Language code, e.g. 'de' or 'fr-FR'"},"value":{"description":"Translated question text","type":"string"},"scale_from_label":{"description":"Translated low-end scale label","type":"string"},"scale_to_label":{"description":"Translated high-end scale label","type":"string"},"entries":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"question_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"language":{"type":"string","minLength":1,"maxLength":35},"value":{"type":"string","maxLength":16384},"scale_from_label":{"type":"string","maxLength":16384},"scale_to_label":{"type":"string","maxLength":16384}},"required":["question_id","language"],"additionalProperties":false}}},"additionalProperties":{}}},{"name":"upsert_survey_translation","title":"Set a survey's title/description translation","description":"Create or update the translation of a survey's title and/or description for one language. Omitted fields are left unchanged. For bulk writes, supply only entries:[{...same fields...}] (1–100, at most 128 KiB UTF-8 JSON; language at most 35 characters; survey fields at most 500, other text at most 16384). Each entry needs translated text; duplicate entity/language targets and unknown fields are rejected. The entire batch commits or rolls back. Existing row IDs, source hashes and omitted fields survive; null does not clear fields. Bulk result: {applied,count,results:[{index,entity_id,language,translation_id}]}.","toolsets":["localization"],"scope":"mcp:write","requiresAllGames":false,"annotations":{"readOnlyHint":false,"destructiveHint":true,"idempotentHint":false,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991,"description":"Numeric survey id"},"language":{"type":"string","minLength":1,"description":"Language code, e.g. 'de' or 'fr-FR'"},"title":{"description":"Translated survey title","type":"string"},"description":{"description":"Translated survey description","type":"string"},"entries":{"minItems":1,"maxItems":100,"type":"array","items":{"type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"language":{"type":"string","minLength":1,"maxLength":35},"title":{"type":"string","maxLength":500},"description":{"type":"string","maxLength":500}},"required":["survey_id","language"],"additionalProperties":false}}},"additionalProperties":{}}},{"name":"validate_survey","title":"Validate survey readiness","description":"Read-only report over stored survey definitions: question content, authoring logic/graph rules, targeting references/operators and prospective active-game capacity, localization and delivery caveats. Returns stable error/warning issues with entity IDs and recovery; all checks determine totals/readiness even when issues are paged. Localization uses configured non-default languages, exact pinned KPI fallback and source hashes; optionally focus one language. Missing translations are warnings, unknown hashes do not prove staleness. Does not fix, publish, refresh billing or contact providers. ready_for_activation means no diagnostic errors, not write permission or guaranteed delivery. Review warnings, then explicitly update_survey status=active.","toolsets":["analysis","authoring","localization"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"survey_id":{"type":"integer","exclusiveMinimum":0,"maximum":9007199254740991},"language":{"description":"Check localization for one configured non-default language; omit for every configured non-default language","type":"string","minLength":1,"maxLength":35},"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"description":"Issue page size. Summary and readiness cover all checks, not just this page.","type":"integer","minimum":1,"maximum":100}},"required":["survey_id"],"additionalProperties":false}},{"name":"whoami","title":"Who am I","description":"Start here: return your profile, caller ID and effective MCP scopes/game restrictions. With mcp:admin and all-games access, also list your own team memberships (team_id, name, membership_role), including accounts with no games. Otherwise teams.available is false with recovery guidance, not an empty list. page/page_size page memberships, ordered by team and membership IDs. user_info.role is your job title, not a team role. Scopes do not override resource or team-role checks; follow teams.next_page for more memberships.","toolsets":["analysis","authoring","localization","administration"],"scope":"mcp:read","requiresAllGames":false,"annotations":{"readOnlyHint":true,"openWorldHint":false},"inputSchema":{"$schema":"https://json-schema.org/draft/2020-12/schema","type":"object","properties":{"page":{"default":1,"type":"integer","minimum":1,"maximum":100000},"page_size":{"default":25,"type":"integer","minimum":1,"maximum":100}}}}]}