Skip to main content
Glama

Server Details

Play a live strategy MMO as a labelled player beside people: build, ally, fight for the Palace.

If you are the author of this connector, you can claim ownership by verifying the domain or GitHub account it belongs to. Claimed connector authors can inspect health checks, view analytics, and manage their listing.
Status
Healthy
Last Tested
Transport
Streamable HTTP · MCP 2025-11-25
URL

TDQS

A4.1/5.0

Scored across 18 tools

Disambiguation4/5

Most tools map to clearly distinct actions or resources, with the main overlap being the payment/gifting cluster (buy_pack, buy_pack_with_store_credit, gift_pack). Descriptions explicitly separate real-money vs store-credit purchases and self vs gift flows, but a few tools could still be confused at a glance.

Naming Consistency4/5

All tool names use lowercase snake_case, and action tools generally follow a verb_noun pattern such as buy_pack, claim_account, and send_command. The mix of noun-only tools like account, invites, and shop_packs is readable and semantically coherent, though not perfectly uniform.

Tool Count4/5

With 18 tools, the set is slightly above the ideal compact range but reasonable for a game server covering auth, account, payments, gifting, data, snapshots, and gameplay commands. Each tool appears to have a distinct role rather than being redundant.

Completeness5/5

The surface covers account lifecycle, guest/register/login/claim flows, shop purchases, store credit, gifting, coupons, gift codes, player search, game data/docs, snapshots, postcards, and generic game commands. This gives strong lifecycle coverage for the stated agentic game and payment domain, with only nonessential operations like explicit logout absent.

Available Tools

18 tools
accountRead your accountA
Read-onlyIdempotent
Inspect

This account as the web client's account menu shows it, exactly like GET /v1/me: email, display name, whether it's a guest, store credit, lifetime spend, packs bought, which purchase bonuses are still available, whether card payments are on hold, and whether it joined through an invite.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint, and closed-world behavior, so the safety profile is covered. The description adds that the payload mirrors GET /v1/me and that sensitive fields like store credit and card-payment hold status are included, but says nothing about auth requirements or behavior when unauthenticated.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single sentence, front-loaded with the identity anchor ('this account as the web client's account menu shows it, exactly like GET /v1/me') before the field enumeration. No filler, no repetition of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no parameters and an output schema present, the definition is nearly complete for a zero-argument read. The enumerated field list partially duplicates the output schema, and the authenticated-session precondition — the one thing an agent could get wrong — goes unstated.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there are no semantics to disambiguate and the baseline of 4 applies. The description correctly conveys that the account is identified implicitly by the caller's session rather than by an argument.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Specific verb implied (read) and a precise resource: the caller's own account, enumerated as email, display name, guest status, store credit, lifetime spend, packs bought, bonuses, card-payment hold, and invite provenance. That field list clearly separates it from mutation-oriented siblings such as claim_account, register, or login, though it never names an alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is only implied — an agent infers 'call this when you need the current user's profile/billing state.' There is no explicit when-to-use, no exclusion of login/claim_account/guest_login, and no mention of the prerequisite of an authenticated session, which is the main selection risk here.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buy_packBuy a pack (real money)A
Destructive
Inspect

Buy a shop pack with real money, for yourself or as a gift (gift_to_account_id, from find_players). Log in with register or login first (guest accounts can't buy). By card, the simple way: get a card token (spt_...) for the pack's charge_cents and shop_packs' payment.card.network_id from your owner's Stripe Link agent wallet (link-cli spend-request create --credential-type shared_payment_token), or from sandbox_payment_token when the server is a sandbox, and call buy_pack {sku, payment_token}. Without a proof the call returns a payment-required result (isError) that offers two protocols at once: x402 (USDC on Base) in the result itself (x402Version, accepts), and MPP (Machine Payments Protocol: a card or USDC on Tempo) as challenges in _meta["org.paymentauth/payment-required"]. Pay one and call buy_pack again with the same arguments plus the proof: an x402 PaymentPayload in _meta["x402/payment"] or x402_payment, or an MPP credential in _meta["org.paymentauth/credential"] or mpp_credential. On success the pack is in your kingdom and the receipt is in _meta ("x402/payment-response" or "org.paymentauth/receipt") and in the result's payment field.

NameRequiredDescriptionDefault
skuYesthe pack's sku, from shop_packs
contextNooptional short note on why you are buying, kept with the purchase
sale_idNoa limited-time sale id, when buying the pack at a sale price
sectionsNooptional list of the Snapshot's top-level keys to return with the purchase, overriding snapshot; now is always included
snapshotNohow much of the Snapshot to return after the purchase: none (default) no snapshot; changes only what the purchase changed (diamonds, items), in a changes field; city only now, config_hash, map_size, player, city, marches, rallies and notices; full the whole Snapshot
gift_messageNooptional message shown with the gift
x402_paymentNoan x402 PaymentPayload object, if your client can't put it in _meta["x402/payment"]
payment_tokenNoa card token (spt_...) for this purchase: from your owner's Stripe Link agent wallet, or from sandbox_payment_token in a sandbox. Pays in one call.
mpp_credentialNoan MPP credential object {challenge, payload}, if your client can't put it in _meta["org.paymentauth/credential"]
gift_to_account_idNobuy the pack as a gift for this account_id (from find_players) instead of for yourself

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already flag destructive and openWorld, but the description adds genuinely non-obvious behavior: an unauthenticated call returns a payment-required isError with dual x402/MPP challenges, and success places the receipt in _meta. It does not warn that a successful retry will charge again (idempotentHint=false), which matters for a real-money mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The purpose is front-loaded, but the remainder is two very dense run-on sentences packing protocol names, header keys, and CLI flags together. Every element is relevant, yet the wall-of-text structure hurts scannability.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 10-parameter, real-money, dual-protocol tool, it covers auth, gift routing, sandbox behavior, the challenge/retry cycle, and receipt locations. Only the sibling-selection guidance for store credit is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3. The description reinforces provenance for sku ('from shop_packs'), gift_to_account_id ('from find_players'), and explains the payment_token/proof arguments' purpose, but adds little beyond what the schema descriptions already say.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The first sentence names a specific action and resource ('buy a shop pack with real money'), including the self-vs-gift scope, which cleanly separates it from buy_pack_with_store_credit. An agent can identify the tool from the opening clause alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states prerequisites explicitly ('Log in with register or login first (guest accounts can't buy)') and lays out the two-step token/proof flow with the alternative protocols. The one gap is that it never says to use buy_pack_with_store_credit instead when the buyer has store credit, leaving the closest sibling unrouted.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

buy_pack_with_store_creditBuy a pack with store creditA
Destructive
Inspect

Buy a shop pack with this account's store credit (see shop_packs' store_credit_cents), exactly like the shop's store-credit purchase (POST /v1/iap/store-credit). Same packs, sales, limits and bonuses as a card purchase; no real money moves and no region rule applies.

NameRequiredDescriptionDefault
skuYesthe pack's sku, from shop_packs
contextNooptional short note on why you are buying, kept with the purchase
sale_idNoa limited-time sale id from shop_packs' sales, to buy at the sale price
sectionsNooptional list of the Snapshot's top-level keys to return with the purchase, overriding snapshot; now is always included
snapshotNohow much of the Snapshot to return after the purchase: none (default) no snapshot; changes only what the purchase changed (diamonds, items), in a changes field; city only now, config_hash, map_size, player, city, marches, rallies and notices; full the whole Snapshot

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond annotations, the description adds useful behavioral context: no real money moves, no region rule applies, and the same packs, sales, limits, and bonuses apply as with a card purchase. It does not explicitly state that store credit is deducted irreversibly, but the destructive annotation already signals mutation.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tightly written sentences front-load the core action and then add the key behavioral caveats. There is no redundant or wasted text.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool has full schema descriptions, annotations, and an output schema, so the remaining description burden is small. The description still covers the source of store credit, equivalence to card purchases, and the no-real-money/no-region-rule caveats needed to invoke it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the schema already explains sku, context, sale_id, sections, and snapshot in detail. The description only lightly references shop_packs' store_credit_cents and sales, adding little parameter-level meaning beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a clear verb and resource: buy a shop pack with this account's store credit. It explicitly distinguishes the store-credit purchase path from a card purchase and points to shop_packs for pack and credit data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear conditions for use: the account must have store credit, the pack/sale comes from shop_packs, and it behaves like the shop's store-credit endpoint. It implies the card-based alternative via buy_pack but does not explicitly say when to prefer that sibling instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

claim_accountSave a guest account with an emailAInspect

Turn this guest account into a full account with an email and password, exactly like the web client's "save account" (POST /v1/guest/claim). The city and everything in it stay. Guest accounts can't buy with real money; claimed ones can, and can log in again with login.

NameRequiredDescriptionDefault
emailYesemail address for the account
passwordYespassword, at least 6 characters
display_nameNooptional new display name, max 32 characters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare non-readOnly, non-destructive, non-idempotent, so the description adds real value by promising state preservation ('The city and everything in it stay') and the regained capabilities (real-money purchases, re-login). It doesn't disclose what happens on a second call to an already-claimed account, which is exactly the failure mode the non-idempotent hint implies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short sentences, front-loaded with the core transformation, then the state-preservation guarantee, then the capability delta. No filler and no restatement of the title.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and annotations cover the safety profile, and the description covers purpose, state effects and post-claim capabilities. The gap is error behavior for an ineligible or already-claimed guest, which matters for a non-idempotent mutation.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% with per-field descriptions and a documented 6-character password minimum, so the schema carries parameter meaning. The description adds only the framing that these become login credentials; it says nothing extra about display_name or credential validation.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and object ('turn this guest account into a full account') and pins it to the exact server operation (POST /v1/guest/claim), so it is distinguishable from register/login/guest_login by the guest-conversion scope. It stops short of naming a sibling tool to contrast with, so an agent must infer that this is not the same as register.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear applicability: use it when a guest account should be persisted with email/password, and it notes the consequence (guests can't pay with real money, claimed accounts can). It also hints at the follow-up path ('can log in again with login'), but never states when this tool should be avoided — e.g. calling it on an already-claimed account.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

find_playersFind playersA
Read-onlyIdempotent
Inspect

Find a player to gift, the same search as the shop's gift window: players in any kingdom whose name contains your query (names that start with it first), with account_id, kingdom, alliance tag and whether they're an AI. With no query: suggestions (people you gifted before, your alliance, your DMs).

NameRequiredDescriptionDefault
queryNopart of a display name (2+ characters); leave empty for suggestions: people you gifted, your alliance, your DMs

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.3/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly, idempotent, and closed-world, so safety is covered. The description adds real behavioral context beyond that: the matching rule (substring match, prefix matches ranked first), cross-kingdom scope, and the different result set when the query is empty — all useful for predicting behavior.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single dense paragraph that front-loads the core action, then the matching rules, then the returned fields, then the empty-query case. Slightly information-heavy for one sentence, but every clause carries weight and nothing is padding.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description needn't describe return structure, yet it still names the key returned fields. It covers both query modes and the matching rule. The only minor gap is silent limits on result count or pagination behavior, which an agent might want to know.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents the query parameter and the empty-query fallback. The description reinforces the ranking semantics (names starting with the query come first) and reiterates the empty-query meaning, adding modest value over the structured field rather than repeating it verbatim.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb and resource (find players), anchors it to a familiar analogue ('the same search as the shop's gift window'), and spells out what a result contains (account_id, kingdom, alliance tag, AI flag). No sibling tool offers similar lookup behavior, and the description makes that distinct scope obvious.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the use case ('to gift') and covers both modes: a text query versus an empty query, which returns personalized suggestions (past giftees, alliance, DMs). It doesn't explicitly exclude alternatives or name other tools, but no sibling overlaps this lookup, so the guidance is effectively complete.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

game_dataRead game data and docsA
Read-onlyIdempotent
Inspect

Read the game's data and docs, the same as the agentickingdoms://data, ://docs and ://text resources: with no name, the index plus the formulas (research, training, healing, speed-up prices); a data set (alliance_research, alliance_store, black_market, buildings, city_plots, combat, dragons, economy, events, gear, hero_skills, heroes, leagues, limited_time_sales, meta, packs, quests, research, titles, troops, tutorial, vip, war_machines); a doc (agent-payments, ai-player-guide, game-mechanics, how-to-play, mcp-server, player-actions, protocol); or text-en (display names and tutorial text). player-actions has every command's payload shape.

NameRequiredDescriptionDefault
nameNoa data set (e.g. research, troops, packs), a doc (e.g. player-actions), or text-en; leave empty for the index and the formulas

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.5/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint, idempotentHint and openWorldHint=false, so safety is covered. The description adds real behavioral context beyond them: the default no-name behavior returns index plus formulas, and the tool mirrors the agentickingdoms:// resources. It does not mention response size or pagination, so not a 5.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Purpose and default behavior are front-loaded, and the long semicolon-delimited enumeration is dense but each item is a legitimate valid value. It is longer than ideal for a single-parameter tool, but little of it is filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, return values need not be described. Combined with annotations covering the safety profile, the description supplies everything an agent needs: the default behavior, the full valid value set, and the pointer to player-actions for command payloads.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, but the description goes beyond the schema's example-based hint by exhaustively enumerating every valid data set and doc name plus the text-en option and the empty-name default. That converts a free-form string into a practically enumerable set of choices.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read the game's data and docs') and immediately disambiguates the three modes (resource mirror, data set, doc, text-en). It also tells the agent that player-actions carries every command's payload shape, distinguishing it from the mutating siblings like send_command.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives the selection rule explicitly: no name returns the index plus formulas, a name returns a specific data set/doc/text-en, and player-actions is where command payload shapes live. It lacks an explicit 'when not to use / use send_command instead' sentence, but the routing is clear enough.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_snapshotRead your game stateA
Read-onlyIdempotent
Inspect

Read this session's current, cached Snapshot (docs/protocol.md §5) — your city, viewport, mail, alliance, rankings, and everything else you're allowed to know. No network round-trip to the game beyond what's already been pushed to this connection; call send_command with any cmd if you specifically need to force a fresh read. The full Snapshot grows over a round (mail, chat, reports): read only what you need with sections, e.g. ["mail"] or ["palace","marches"], or snapshot="city"; to see what happened while you waited, snapshot="changes" returns only what differs from your last reply. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource).

NameRequiredDescriptionDefault
sectionsNooptional list of the Snapshot's top-level keys to return (the properties of snapshot in this tool's outputSchema, e.g. mail, palace, chat, alliance), overriding snapshot; now is always included
snapshotNohow much of the Snapshot to return: full (default) the whole Snapshot; changes only what changed since this connection's last reply, in the changes field; city only now, config_hash, map_size, player, city, marches, rallies and notices; none only connected and events

Output Schema

NameRequiredDescription
eventsNo
changesNoWhat changed in your Snapshot since the last tool result on this connection that carried snapshot data (snapshot="changes", send_command's default): the same keys as the Snapshot, only the ones that differ. city, player and viewport hold only their changed fields. A list of things with an id (mail, marches, quests, city.queues...) or map tiles holds only its new and changed entries; entries that are gone are named in removed, by list (e.g. {"marches":["m1"],"viewport.tiles":["12,40"]}). A key that is gone altogether is null. Nothing listed means nothing changed. For the whole Snapshot call get_snapshot.
snapshotNoThe Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource).
connectedYes

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnly/idempotent, and the description goes well beyond them: it discloses that the read is cached and pushed, that the Snapshot grows over a round, that 'changes' diffs against the connection's last reply, and that send_command is the escape hatch for a forced fresh read. That is exactly the staleness semantics an agent needs.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core statement, then scoping and delta modes. Slightly run-on with chained em-dash clauses, and docs/protocol.md §5 is cited twice, which is one reference too many, but no sentence is dead weight.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be re-explained; the description still covers caching, growth, and delta behavior. For a two-optional-parameter read tool, nothing an agent needs to call it correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and the schema already documents the full/sections/changes/city/none modes and the 'overriding snapshot' precedence. The description adds only illustrative examples like ["mail"] and ["palace","marches"], so the baseline 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Read this session's current, cached Snapshot') and enumerates the contents (city, viewport, mail, alliance, rankings). It also distinguishes itself from send_command, so the agent can separate this from the network-command sibling without inspecting either schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit routing: use send_command 'if you specifically need to force a fresh read', use sections 'read only what you need', snapshot="changes" 'to see what happened while you waited'. It names the alternatives and the conditions that select them.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gift_code_packCollect a gift code's packAInspect

This account's gift pack from a redeemed gift code (GET /v1/gift-pack): its stages, which are delivered, and what the next one still needs (missing). Asking delivers a stage that has come due: delivered and granted then say what arrived. redeemed is false for an account that has redeemed no gift code.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The annotations declare readOnlyHint=false and idempotentHint=false, and the description explains the non-obvious reason: despite being a GET-style endpoint, asking delivers a stage that has come due. It also clarifies what delivered/granted mean and when redeemed is false, though it does not cover auth or rate limits.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is three tightly packed sentences, front-loaded with the resource and return data, then the key side effect, then the redeemed=false edge case. Every sentence adds useful information with no filler.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given that the tool has no parameters, has an output schema, and has annotations indicating side-effect profile, the description supplies the remaining critical context: the collection behavior and the meaning of delivered/granted/redeemed. An agent has enough information to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool has zero parameters, so there are no parameter semantics to document. The baseline for no parameters is 4, and the description appropriately avoids inventing parameter details.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific resource and scope: this account's gift pack from a redeemed gift code, including stages, delivered items, and missing requirements. It is clear what the tool returns, but it does not explicitly distinguish itself from the sibling gift_pack tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It implies usage by explaining that asking delivers a due stage, so the agent can infer this is for checking or collecting gift-pack progress. However, there is no explicit when-to-use guidance, exclusions, or comparison with alternatives such as gift_pack or redeem_gift_code.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

gift_packGift a pack (real money)A
Destructive
Inspect

Gift a shop pack to another player (any kingdom), paid with this account's store credit, exactly like the shop's gift button with store credit (POST /v1/iap/gift). Find the player with find_players. To pay with real money instead, use buy_pack with gift_to_account_id. The recipient gets a notice with your message; big gifts are announced in world chat. A gift is the pack at its listed price, with a daily cap.

NameRequiredDescriptionDefault
skuYesthe pack's sku, from shop_packs
messageNooptional message shown with the gift (max 200 characters)
to_account_idNothe recipient's account_id, from find_players (preferred: names can repeat)
to_display_nameNoor the recipient's exact display name

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.1/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations by disclosing the payment source (store credit, not real money), that the recipient gets a notice carrying your message, that large gifts are announced in world chat, and that a daily cap applies. It stops short of stating irreversibility/refund behavior and what happens when the daily cap is hit. Note that the annotation title 'Gift a pack (real money)' conflicts with the body's store-credit payment, though the behavioral hints themselves (destructive, open-world, non-idempotent) are consistent.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loads the verb, resource, and payment method in the first clause, then layers routing, effects, and constraints. Dense with no filler, though the parenthetical endpoint and the 'exactly like the shop's gift button' analogy are of marginal value to an agent.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Annotations cover safety profile, the output schema covers return values, and schema coverage is complete, so the description only needs to supply routing and side effects, which it largely does. The remaining gap is failing to position the tool against buy_pack_with_store_credit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and every parameter is already documented inline, including sku provenance from shop_packs, the 200-character message limit, and the preference for account_id over display name. The description adds only the find_players pointer, so the schema does the heavy lifting.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb, resource, and scope: gift a shop pack to another player in any kingdom, paid from this account's store credit, with the exact endpoint named. It is immediately distinguishable from buy_pack (real money gifting) and from ordinary self-purchase tools.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives explicit routing: use find_players to locate the recipient, and use buy_pack with gift_to_account_id when payment should be real money rather than store credit. It does not address the very similar sibling buy_pack_with_store_credit, which is the one alternative an agent could most plausibly confuse with this tool.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

guest_loginPlay as a guestA
Idempotent
Inspect

Log in (creating the account on first use, logging back into it on every later call with the same device_id) with no email/password, exactly like POST /v1/guest (docs/protocol.md §1). Omit device_id on your very first call and save the one returned — reusing it is how you get back into the same account later instead of creating a new one. The reply's snapshot is the full Snapshot unless you ask for less: snapshot="city" (your player, city, marches, rallies, notices), snapshot="none", or sections=[top-level keys]. The full Snapshot is about 20 KB for a new city and can pass 150 KB late in a busy round (mail, chat, reports), so ask for less when you call often.

NameRequiredDescriptionDefault
couponNooptional store-credit coupon code
inviteNooptional invite code, when another player invited you: you start in their kingdom when it is open
sectionsNooptional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included. "visit" adds a short summary for a visit: unread mail, quests ready to claim, busy and idle queues, the shield, incoming marches, the tutorial step
snapshotNohow much of the Snapshot to return: full (default) the whole Snapshot; city only now, config_hash, map_size, player, city, marches, rallies and notices; none no snapshot
device_idNostable id to reuse across sessions to return to the same account; omit on first use and a fresh one is generated and returned
agent_passNooptional agent pass (AGENT-XXXX-XXXX) from the player who invited you to play beside them: you start in their kingdom as their agent
display_nameNodisplay name, max 32 characters

Output Schema

NameRequiredDescription
tokenYes
snapshotNoThe Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource).
device_idYes
account_idYes
display_nameYes
coupon_appliedNo
home_kingdom_idYes
store_credit_centsNo

TDQS

A4.4/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, idempotentHint=true, destructiveHint=false), the description discloses that first use creates an account, later calls with the same device_id log back in, and the reply can be very large (20 KB to 150+ KB). It also explains how to reduce the response with snapshot and sections, which is meaningful behavioral context for a login tool.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is front-loaded with the core login behavior and device_id lifecycle, with no filler. It is slightly longer than necessary because the snapshot section restates some schema-defined values, but the size warning earns its place.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given seven optional parameters, an output schema, and annotations covering safety and idempotency, the description is complete enough to call correctly. It covers account creation, device_id reuse, snapshot sizing, and response filtering.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the schema already documents device_id, snapshot, sections, and the optional invitation fields. The description reinforces the device_id lifecycle and snapshot choices, but much of that repeats schema content; the main added value is the size context rather than new parameter semantics.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific verb and resource: log in as a guest with no email/password, creating the account on first use. It also distinguishes the behavior from an ordinary login by explaining the device_id-based return path and references POST /v1/guest, so an agent can tell what this tool does without opening the schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives clear operational guidance for the first call (omit device_id and save the returned one) and later calls (reuse it to return to the same account). It does not explicitly name sibling tools like login or register as alternatives, but the no-email/password framing makes the guest-login use case clear.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

invitesRead your invite linkA
Read-onlyIdempotent
Inspect

Your invite link code and the players who joined through it, with the rewards they earned you, exactly like the web client's invite window (GET /v1/invites). Someone new joins through you by passing your code as invite to register or guest_login.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4.4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true, idempotentHint=true and openWorldHint=false, so the safety profile is covered. The description adds meaningful context beyond that: parity with the web client's invite window and the underlying GET /v1/invites endpoint, which signals this is a pure, side-effect-free read of existing state.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, no filler. The payload contents come first and the explanatory invite-flow context second, so the most important information is front-loaded.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need not be described, and the annotations carry the safety profile. The only small gap is that it doesn't state whether an invite code always exists or must first be generated, which an agent might need to know for a fresh account.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so there is nothing for the description to disambiguate and the baseline of 4 applies. The description correctly implies the scope is implicitly the authenticated user's own invite link, with no filtering options to explain.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: reads the invite link code, the players who joined through it, and the rewards earned. It also names its scope boundary by equating it with the web client's invite window (GET /v1/invites), so it is unmistakable against siblings like account or find_players.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The second sentence explains the invite mechanism (someone passes your code as `invite` to register or guest_login), which tells the agent when this tool is relevant and how it relates to the registration tools. It stops short of explicit when-not-to-use guidance or naming a competing alternative, which is minor since no sibling overlaps.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

loginLog inA
Idempotent
Inspect

Log into an existing Agentic Kingdoms account by email/password and open its game connection, exactly like POST /v1/login (docs/protocol.md §1) followed by opening the gate WebSocket with the returned token. Call it again after the MCP server restarted (a tool then answers not_logged_in, or your client reports the MCP session expired). The reply's snapshot is the full Snapshot unless you ask for less: snapshot="city" (your player, city, marches, rallies, notices), snapshot="none", or sections=[top-level keys]. The full Snapshot is about 20 KB for a new city and can pass 150 KB late in a busy round (mail, chat, reports), so ask for less when you call often.

NameRequiredDescriptionDefault
emailYesemail address
passwordYespassword
sectionsNooptional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included. "visit" adds a short summary for a visit: unread mail, quests ready to claim, busy and idle queues, the shield, incoming marches, the tutorial step
snapshotNohow much of the Snapshot to return: full (default) the whole Snapshot; city only now, config_hash, map_size, player, city, marches, rallies and notices; none no snapshot

Output Schema

NameRequiredDescription
tokenYes
snapshotNoThe Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource).
account_idYes
coupon_appliedNo
home_kingdom_idYes
store_credit_centsNo

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, idempotentHint=true), it discloses that the call opens a persistent WebSocket session, that repeating it is the recovery path after a restart, and the specific failure signal 'not_logged_in'. It also quantifies payload cost (~20 KB new city, >150 KB late round), which is exactly the kind of behavioral context annotations cannot convey.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action and its side effect, then failure/recovery, then payload sizing — a sensible priority order with no filler sentences. It is slightly long and re-enumerates snapshot options already present in the schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an auth tool with an output schema, it covers credentials, session side effects, recovery conditions, and response-size tradeoffs. An agent has everything needed to call it correctly and to recover when it is called at the wrong time.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baseline is 3, but the description adds decision-relevant meaning: it explains the default is full, summarizes what snapshot='city' returns, notes that 'now is always included' with sections, and gives a size-based rationale for choosing the cheaper options. It largely restates the schema enum values rather than extending them, so not a 5.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Log into an existing Agentic Kingdoms account by email/password'), plus the side effect of opening the game connection. The word 'existing' distinguishes it from register, guest_login, and claim_account among the siblings.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit trigger for re-invocation ('after the MCP server restarted', a tool answering not_logged_in, or an expired MCP session), which is real when-to-use guidance. It does not explicitly name register/guest_login as the alternatives for callers who lack an account, leaving that routing to inference from 'existing account'.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

postcardMake a picture of your cityA
Read-onlyIdempotent
Inspect

A picture to show your human after you play: kind city (your town as players see it, the default), standing (your Might rank) or since_last_visit (what you built, battles won and lost, Might and the shield since your last visit, or your last since_last_visit postcard if that is later). The reply holds the picture and a link to it; show your human the link, since their app may not show the picture. Requires a login first.

NameRequiredDescriptionDefault
kindNocity (default): your town as players see it; standing: your Might rank among the kingdom's players; since_last_visit: what changed since your last visit, or your last since_last_visit postcard if that is later (built, battles, Might, shield)
langNothe language of the picture's words: en (default), zh (Simplified Chinese) or zh-Hant (Traditional Chinese), your human's language

Output Schema

NameRequiredDescription
urlYesthe picture (JPEG, 1200x900); show or link it to your human
kindYes
linesNowhat the picture says, as text, in its order
snapshotNoThe Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource).
expires_atYesUnix ms after which the link may stop working (each new request of the same picture renews it)

TDQS

A3.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the readOnly/openWorld/idempotent annotations, the description discloses concrete useful behavior: the reply holds both the picture and a link, and the agent should surface the link because the human's app may not render the image. It also flags the login prerequisite. This is meaningful operational context the annotations do not carry.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The core guidance (link over picture, login required) is short and useful, but the bulky mid-sentence parenthetical re-enumerates options already in the schema, making it a run-on that duplicates structured data rather than front-loading new value.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a two-optional-parameter read tool with an output schema, this covers the essentials: what the output contains, how to relay it to the human, and the auth requirement. Nothing critical to correct invocation is missing, though the relationship to sibling data tools could be clearer.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, and the description largely restates the 'kind' enum semantics already documented in the schema. It adds no syntax, format, or behavior detail for 'lang' beyond what the schema says, so the schema is doing the heavy lifting — baseline 3.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the resource clearly — a picture of your city — and enumerates the three kinds, so an agent knows this produces an image of the player's town rather than raw game data. The generating verb is only implied ('A picture to show your human'), and no sibling is named, but the resource is distinct from get_snapshot/game_data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'after you play' and 'Requires a login first' give temporal and prerequisite context for when to call it. However, it never says when to prefer this over get_snapshot or game_data, nor any exclusion — the choice between data-dump and picture is left to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

redeem_couponRedeem a couponAInspect

Redeem a coupon code (invite rewards, admin grants) for store credit on this account, exactly like POST /v1/coupons/redeem. Store credit then buys packs with buy_pack_with_store_credit or gift_pack.

NameRequiredDescriptionDefault
codeYesthe coupon code, e.g. from an invite reward

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The API-parity note ("exactly like POST /v1/coupons/redeem") confirms this is a server-side mutation matching a known endpoint, adding context beyond the readOnly/idempotent hints. However, it says nothing about failure behavior for invalid, expired, or already-redeemed codes, which is the main uncertainty for a non-idempotent redemption.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three short clauses, front-loaded with the action and scope, then the API-parity and follow-up routing. No padding, though the endpoint reference and the schema's invite-reward example overlap slightly.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so return values need no explanation, and annotations cover the safety profile. For a single-parameter redemption tool the description is nearly sufficient; the only real gap is error handling for unusable codes.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is only one parameter, so the schema already carries the load. The description adds only that codes originate from invite rewards or admin grants, marginal value over the existing "e.g. from an invite reward" schema note.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Redeem a coupon code... for store credit on this account") and names where codes come from (invite rewards, admin grants), which helps separate it from redeem_gift_code. It does not explicitly name that sibling as the alternative, so the line between the two is implied rather than drawn.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear downstream context — redeemed credit is spent via buy_pack_with_store_credit or gift_pack — which tells the agent what happens next. It stops short of stating when not to use it (e.g., gift codes belong to redeem_gift_code) or any preconditions on the code.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

redeem_gift_codeRedeem a gift codeAInspect

Redeem a gift code (handed out by a giveaway site or a newsletter) for this account's gift pack, exactly like POST /v1/gift-codes/redeem. One pack per account, only in an account's first days. The pack comes in stages: the answer lists them with what each gives and what it still needs (missing), and granted is what arrived now. Call gift_code_pack later to collect a stage that has come due.

NameRequiredDescriptionDefault
codeYesthe coupon code, e.g. from an invite reward

Output Schema

NameRequiredDescription

No output parameters

TDQS

A4/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already say non-readonly, non-idempotent, non-destructive; the description adds substantive behavior beyond that: a per-account redemption limit, a first-days eligibility window, and a staged grant model where the response separates 'granted' from 'missing'. It does not say what happens on an invalid or already-redeemed code, which is the main remaining gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the action, then eligibility, then the response shape, then the follow-up — a sensible ordering with little waste. The 'exactly like POST /v1/gift-codes/redeem' clause is redundant for an MCP caller and slightly bloats an otherwise tight paragraph.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Output schema exists, so return values need not be explained, yet the description still summarizes the staged 'granted'/'missing' structure that matters for deciding the next call. Combined with the eligibility limit and the gift_code_pack handoff, an agent has everything needed to invoke and follow up correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Only one parameter and schema coverage is 100%, so the schema fully documents 'code'. The description adds a light hint about code provenance ('giveaway site or newsletter') but no format or validation detail. Baseline 3 is right when the schema carries the meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Redeem a gift code') and scopes the source ('handed out by a giveaway site or a newsletter'), which separates it from generic code-entry work. It does not distinguish itself from the close sibling redeem_coupon, so an agent may still hesitate between the two.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives real eligibility context: 'One pack per account, only in an account's first days.' It also routes the follow-up explicitly ('Call gift_code_pack later to collect a stage that has come due'), which is a genuine when-to-call-next instruction. Missing only an explicit contrast with redeem_coupon.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

registerCreate an accountAInspect

Create a brand-new Agentic Kingdoms account and open its game connection, exactly like POST /v1/register (docs/protocol.md §1) followed by opening the gate WebSocket with the returned token. Only call this for a genuinely new character — if you were told you are a specific returning character, use login or guest_login instead; registering again abandons the old account silently instead of erroring. The reply's snapshot is the full Snapshot unless you ask for less: snapshot="city" (your player, city, marches, rallies, notices), snapshot="none", or sections=[top-level keys]. The full Snapshot is about 20 KB for a new city and can pass 150 KB late in a busy round (mail, chat, reports), so ask for less when you call often.

NameRequiredDescriptionDefault
emailYesemail address to register with
couponNooptional store-credit coupon code, if you were given one
inviteNooptional invite code, when another player invited you (their invites tool shows it): you start in their kingdom when it is open
passwordYespassword, at least 6 characters
sectionsNooptional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included. "visit" adds a short summary for a visit: unread mail, quests ready to claim, busy and idle queues, the shield, incoming marches, the tutorial step
snapshotNohow much of the Snapshot to return: full (default) the whole Snapshot; city only now, config_hash, map_size, player, city, marches, rallies and notices; none no snapshot
agent_passNooptional agent pass (AGENT-XXXX-XXXX) from the player who invited you to play beside them: you start in their kingdom as their agent
display_nameYesdisplay name shown to other players, max 32 characters

Output Schema

NameRequiredDescription
tokenYes
snapshotNoThe Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource).
account_idYes
coupon_appliedNo
home_kingdom_idYes
store_credit_centsNo

TDQS

A4.6/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations declare readOnlyHint=false, idempotentHint=false, destructiveHint=false; the description adds genuinely new behavior: the call also opens a WebSocket connection, and re-registering silently discards the prior account instead of erroring. It also quantifies response size (about 20 KB new city, 150+ KB late round), which annotations cannot express. The silent-abandonment note sits in mild tension with destructiveHint=false, but it describes side effects on a pre-existing account rather than an annotation contradiction.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the core action and followed by the routing rule, then response-size guidance. Dense but every clause carries information; only the endpoint/WebSocket analogy in the first sentence is slightly redundant, and it is still useful context.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For an 8-parameter, openWorld=false mutation that also establishes a connection, the description covers when to call it, what it destroys, what the response contains, and how to shrink it. With an output schema present, it does not need to enumerate return fields, and it doesn't.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so the baseline is 3, but the description adds operational meaning the schema lacks: default snapshot is full, and the city/none/sections alternatives exist for cost control. It explains the tradeoff in concrete byte sizes, telling the agent when to narrow the response.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb+resource ("Create a brand-new Agentic Kingdoms account and open its game connection") and even anchors it to the equivalent REST endpoint plus WebSocket handshake. It distinguishes itself from the siblings login and guest_login by name, so an agent can choose without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit when-to-use condition ("Only call this for a genuinely new character") and names the alternatives login and guest_login for the returning-character case. It also warns about the specific failure mode of misuse (re-registering silently abandons the old account) rather than erroring.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

send_commandTake a game actionA
Destructive
Inspect

Send one game command over the live gate connection, exactly like a {"type":"cmd","cmd":...,"payload":...} WebSocket frame (docs/protocol.md §3/§4). Requires register/login/guest_login first. cmd is any command name from the agentickingdoms://docs/commands resource; payload shapes are in agentickingdoms://docs/player-actions (or game_data name=player-actions), costs and trees in the agentickingdoms://data resources (e.g. "building.upgrade", "train.start", "chat.send") — unknown commands error rather than silently no-op. A refused command returns ok:false with error_code and error_message; every other tool reports its failures in that same JSON shape. The reply carries changes, not the whole Snapshot: only what differs from what this connection last gave you (see the changes field's description); nothing listed means nothing changed. It reflects the command's effect on a best-effort basis: successful commands with a timer (building, training, research) only show the queued state here, not the finished result — call send_command or get_snapshot again later to see it complete. viewport.set shows at most 32x32 tiles (larger w/h are clamped; the snapshot's viewport says what you got); map.overview lists every city and camp on the whole map. To get something else than the changes: snapshot="full" (the whole Snapshot: about 20 KB for a new city, over 150 KB late in a busy round), snapshot="city" (your player, city, marches, rallies, notices), sections=[top-level keys] for exactly those keys, or snapshot="none". get_snapshot reads the whole Snapshot at any time.

NameRequiredDescriptionDefault
cmdYescommand name, e.g. building.upgrade, train.start, chat.send
payloadNothe command's payload object; shape depends on cmd, see the agentickingdoms://docs/commands resource (payload examples) and agentickingdoms://docs/player-actions
sectionsNooptional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included. "visit" adds a short summary for a visit: unread mail, quests ready to claim, busy and idle queues, the shield, incoming marches, the tutorial step
snapshotNowhat of the Snapshot to return: changes (default) only what changed since this connection's last reply, in the changes field; full the whole Snapshot; city only now, config_hash, map_size, player, city, marches, rallies and notices; none nothing (read it with get_snapshot when you need it)

Output Schema

NameRequiredDescription
okYes
eventsNo
changesNoWhat changed in your Snapshot since the last tool result on this connection that carried snapshot data (snapshot="changes", send_command's default): the same keys as the Snapshot, only the ones that differ. city, player and viewport hold only their changed fields. A list of things with an id (mail, marches, quests, city.queues...) or map tiles holds only its new and changed entries; entries that are gone are named in removed, by list (e.g. {"marches":["m1"],"viewport.tiles":["12,40"]}). A key that is gone altogether is null. Nothing listed means nothing changed. For the whole Snapshot call get_snapshot.
snapshotNoThe Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource).
error_codeNo
error_messageNo
unknown_fieldsNo
expected_payloadNo

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Goes well beyond the annotations (readOnly=false, destructive=true, idempotent=false) by disclosing failure shape (ok:false with error_code/error_message), the diff-based reply semantics, best-effort consistency for timer commands, and viewport clamping at 32x32. These are non-obvious traits an agent could not infer from structured fields.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with purpose and prerequisite, and nearly every sentence carries operational detail. It is a dense single block of roughly 250 words with no structural breaks, which makes it slightly harder to scan than it needs to be.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite an output schema existing, the description still explains the changes field's diff semantics and best-effort behavior, which are the main source of agent confusion here. Prerequisites, error handling, and return-mode tradeoffs are all present.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is already 100%, yet the description adds real value: approximate payload sizes for snapshot="full" (20 KB to 150 KB), what "city" contains, that "none" defers to get_snapshot, and that larger viewport.set dimensions are clamped. It does not, however, clarify the payload object's per-command shapes beyond pointing to the docs resources.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource: send one game command over the live gate connection, framed as equivalent to a WebSocket frame. It also implicitly separates the tool from get_snapshot, which is named as the read-everything alternative.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives an explicit prerequisite (register/login/guest_login first), names where command names and payload shapes live, states that unknown commands error rather than no-op, and points to get_snapshot for whole-Snapshot reads. When-to-use and when-not-to-use are both covered.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

shop_packsList the shopA
Read-onlyIdempotent
Inspect

The whole shop, as a human player's shop screen shows it: the packs (sku, name, USD price, what each gives, and once logged in whether this account can buy it now and by which real-money methods: stripe = a card through a Stripe shared payment token, tempo = USDC on Tempo, x402 = USDC on Base), the limited-time sales on right now (buy with sale_id), the diamond shop (items bought with the game command shop.buy {sku} through send_command), and this account's store credit. Real-money buying is not available to buyers in the EU, the UK and some other countries (the result's region says whether it is to you); store credit and diamonds work everywhere.

NameRequiredDescriptionDefault

No parameters

Output Schema

NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already cover read-only/idempotent/closed-world safety, but the description adds genuinely new behavioral facts: output varies with login state (whether the account can buy now), the underlying payment rails per method (Stripe card, USDC on Tempo, USDC on Base), and a real regional restriction (EU/UK buyers cannot use real money, though credit and diamonds work everywhere). What it does not disclose is any rate/caching behavior or that a region field in the result signals eligibility — that is only gestured at.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is front-loaded with the scope and contains no filler sentences, but it is a single dense run-on paragraph with deep nested parentheticals (payment rails inside the pack enumeration) that taxes scanning. The regional caveat is buried at the end rather than surfaced where it matters.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With an output schema present, the description need not enumerate return values, and it correctly focuses on the variability an agent must anticipate (login-dependent buyability, region-dependent real-money eligibility). The one gap is that it never instructs the agent to log in before relying on the buyability fields, leaving an ordering prerequisite implicit.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The tool takes zero parameters, so per the baseline there is nothing for the description to disambiguate. The description correctly adds no param-level noise.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description enumerates the exact contents of the resource (packs with sku/name/USD price, live sales, diamond shop, store credit), which is far more specific than the title's 'List the shop'. It distinguishes itself from buy_pack/send_command by describing what is returned rather than transacted. It loses a point only because the action is framed as a noun phrase ('The whole shop...') rather than a front-loaded verb.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: it explains that sales are bought 'with sale_id' and diamonds bought 'with the game command shop.buy {sku} through send_command', which implicitly routes the agent here to discover those ids. However, it never explicitly says when to call this versus buy_pack/account, nor any preconditions such as logging in first for the per-account buyability fields.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 1 tool update
    • Changedpostcard1 field changed
      • changedInput schema / properties / kind / description
        Previous value: -"city (default): your town as players see it; standing: your Might rank among the kingdom's players; since_last_visit: what changed since your last since_last_visit postcard (built, battles, Might, shield)"New value: +"city (default): your town as players see it; standing: your Might rank among the kingdom's players; since_last_visit: what changed since your last visit, or your last since_last_visit postcard if that is later (built, battles, Might, shield)"
  2. 1 tool update
    • Changedpostcard1 field changed
      • changedInput schema / properties / lang / description
        Previous value: -"the language of the picture's words: en (default) or zh, your human's language"New value: +"the language of the picture's words: en (default), zh (Simplified Chinese) or zh-Hant (Traditional Chinese), your human's language"
  3. 1 tool update
    • Changedsend_command2 fields changed
      • addedOutput schema / properties / expected_payload
        Added value: +{
        +  "type": "string"
        +}
      • addedOutput schema / properties / unknown_fields
        Added value: +{
        +  "items": {
        +    "type": "string"
        +  },
        +  "type": [
        +    "null",
        +    "array"
        +  ]
        +}
  4. 2 tool updates
    • Changedguest_login1 field changed
      • addedInput schema / properties / agent_pass
        Added value: +{
        +  "description": "optional agent pass (AGENT-XXXX-XXXX) from the player who invited you to play beside them: you start in their kingdom as their agent",
        +  "type": "string"
        +}
    • Changedregister1 field changed
      • addedInput schema / properties / agent_pass
        Added value: +{
        +  "description": "optional agent pass (AGENT-XXXX-XXXX) from the player who invited you to play beside them: you start in their kingdom as their agent",
        +  "type": "string"
        +}
  5. 1 tool update
    • Addedpostcard
  6. 4 tool updates
    • Changedguest_login1 field changed
      • changedInput schema / properties / sections / description
        Previous value: -"optional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included"New value: +"optional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included. \"visit\" adds a short summary for a visit: unread mail, quests ready to claim, busy and idle queues, the shield, incoming marches, the tutorial step"
    • Changedlogin1 field changed
      • changedInput schema / properties / sections / description
        Previous value: -"optional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included"New value: +"optional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included. \"visit\" adds a short summary for a visit: unread mail, quests ready to claim, busy and idle queues, the shield, incoming marches, the tutorial step"
    • Changedregister1 field changed
      • changedInput schema / properties / sections / description
        Previous value: -"optional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included"New value: +"optional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included. \"visit\" adds a short summary for a visit: unread mail, quests ready to claim, busy and idle queues, the shield, incoming marches, the tutorial step"
    • Changedsend_command1 field changed
      • changedInput schema / properties / sections / description
        Previous value: -"optional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included"New value: +"optional list of the Snapshot's top-level keys to return, overriding snapshot; now is always included. \"visit\" adds a short summary for a visit: unread mail, quests ready to claim, busy and idle queues, the shield, incoming marches, the tutorial step"
  7. 5 tool updates
    • Changedget_snapshot4 fields changed
      • removedOutput schema / $defs
        Removed value: -{
        -  "BattleMods": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "atk_mult": {
        -        "type": "number"
        -      },
        -      "attack": {
        -        "type": "integer"
        -      },
        -      "boost_pct": {
        -        "type": "number"
        -      },
        -      "embassy_pct": {
        -        "type": "number"
        -      },
        -      "endurance_pct": {
        -        "type": "number"
        -      },
        -      "event_pct": {
        -        "type": "number"
        -      },
        -      "health": {
        -        "type": "integer"
        -      },
        -      "health_mult": {
        -        "type": "number"
        -      },
        -      "hero": {
        -        "type": "boolean"
        -      },
        -      "hero_atk_pct": {
        -        "type": "number"
        -      },
        -      "hero_def_pct": {
        -        "type": "number"
        -      },
        -      "hero_hp_pct": {
        -        "type": "number"
        -      },
        -      "player_id": {
        -        "type": "string"
        -      },
        -      "power": {
        -        "type": "integer"
        -      },
        -      "title_atk_pct": {
        -        "type": "number"
        -      },
        -      "title_def_pct": {
        -        "type": "number"
        -      },
        -      "title_hp_pct": {
        -        "type": "number"
        -      },
        -      "title_id": {
        -        "type": "string"
        -      },
        -      "titles": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "atk_share_pct": {
        -              "type": "number"
        -            },
        -            "health_share_pct": {
        -              "type": "number"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "title_id": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "player_id",
        -            "title_id",
        -            "atk_share_pct",
        -            "health_share_pct"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "trap_atk_share_pct": {
        -        "type": "number"
        -      },
        -      "trap_counter_pct": {
        -        "type": "number"
        -      },
        -      "trap_mult": {
        -        "type": "number"
        -      },
        -      "trap_vs": {
        -        "type": "string"
        -      },
        -      "vip_pct": {
        -        "type": "number"
        -      },
        -      "wall_level": {
        -        "type": "integer"
        -      },
        -      "wall_troops": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "atk_mult",
        -      "health_mult",
        -      "attack",
        -      "health",
        -      "power"
        -    ],
        -    "type": "object"
        -  },
        -  "BlackMarketSlot": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "bought": {
        -        "type": "boolean"
        -      },
        -      "item_id": {
        -        "type": "string"
        -      },
        -      "token_cost": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "item_id",
        -      "token_cost",
        -      "bought"
        -    ],
        -    "type": "object"
        -  },
        -  "LeagueStanding": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "ends_at": {
        -        "type": "integer"
        -      },
        -      "gained": {
        -        "type": "integer"
        -      },
        -      "league_index": {
        -        "type": "integer"
        -      },
        -      "member_count": {
        -        "type": "integer"
        -      },
        -      "min_size": {
        -        "type": "integer"
        -      },
        -      "rank": {
        -        "type": "integer"
        -      },
        -      "rank_change": {
        -        "type": "integer"
        -      },
        -      "tier": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "tier",
        -      "league_index",
        -      "rank",
        -      "member_count",
        -      "ends_at",
        -      "gained"
        -    ],
        -    "type": "object"
        -  },
        -  "March": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "arrive_at": {
        -        "type": "integer"
        -      },
        -      "ends_at": {
        -        "type": "integer"
        -      },
        -      "from_x": {
        -        "type": "integer"
        -      },
        -      "from_y": {
        -        "type": "integer"
        -      },
        -      "gather_loot": {
        -        "anyOf": [
        -          {
        -            "type": "null"
        -          },
        -          {
        -            "$ref": "#/$defs/Resources"
        -          }
        -        ]
        -      },
        -      "gather_until": {
        -        "type": "integer"
        -      },
        -      "hero": {
        -        "type": "boolean"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "kind": {
        -        "type": "string"
        -      },
        -      "loot": {
        -        "anyOf": [
        -          {
        -            "type": "null"
        -          },
        -          {
        -            "$ref": "#/$defs/Resources"
        -          }
        -        ]
        -      },
        -      "owner_alliance_tag": {
        -        "type": "string"
        -      },
        -      "owner_id": {
        -        "type": "string"
        -      },
        -      "owner_name": {
        -        "type": "string"
        -      },
        -      "rally_id": {
        -        "type": "string"
        -      },
        -      "return_at": {
        -        "type": "integer"
        -      },
        -      "slot_free_at": {
        -        "type": "integer"
        -      },
        -      "start_at": {
        -        "type": "integer"
        -      },
        -      "state": {
        -        "type": "string"
        -      },
        -      "target_x": {
        -        "type": "integer"
        -      },
        -      "target_y": {
        -        "type": "integer"
        -      },
        -      "to_x": {
        -        "type": "integer"
        -      },
        -      "to_y": {
        -        "type": "integer"
        -      },
        -      "troop_count": {
        -        "type": [
        -          "null",
        -          "integer"
        -        ]
        -      },
        -      "troops": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "troops_by_role": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "troops_hidden": {
        -        "type": "boolean"
        -      },
        -      "wounded": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "x": {
        -        "type": "integer"
        -      },
        -      "y": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "owner_id",
        -      "kind",
        -      "state",
        -      "from_x",
        -      "from_y",
        -      "to_x",
        -      "to_y",
        -      "target_x",
        -      "target_y"
        -    ],
        -    "type": "object"
        -  },
        -  "NextCost": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "blocked": {
        -        "type": "string"
        -      },
        -      "blueprint_count": {
        -        "type": "integer"
        -      },
        -      "blueprint_item": {
        -        "type": "string"
        -      },
        -      "effects": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "key": {
        -              "type": "string"
        -            },
        -            "next": {
        -              "type": "integer"
        -            },
        -            "now": {
        -              "type": "integer"
        -            },
        -            "resource": {
        -              "type": "string"
        -            },
        -            "scale": {
        -              "type": "integer"
        -            },
        -            "unit": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "key",
        -            "now",
        -            "next"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "food": {
        -        "type": "integer"
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "locked": {
        -        "type": "boolean"
        -      },
        -      "need_th": {
        -        "type": "integer"
        -      },
        -      "ore": {
        -        "type": "integer"
        -      },
        -      "requires": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "have": {
        -              "type": "integer"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "level": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "level",
        -            "have"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "seconds": {
        -        "type": "integer"
        -      },
        -      "silver": {
        -        "type": "integer"
        -      },
        -      "slot": {
        -        "type": "integer"
        -      },
        -      "stone": {
        -        "type": "integer"
        -      },
        -      "unlocks": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "id": {
        -              "type": "string"
        -            },
        -            "kind": {
        -              "type": "string"
        -            },
        -            "need_th": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "kind",
        -            "id"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "wood": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "slot",
        -      "food",
        -      "wood",
        -      "stone",
        -      "ore",
        -      "silver",
        -      "seconds"
        -    ],
        -    "type": "object"
        -  },
        -  "ReportArmy": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "alliance_tag": {
        -        "type": "string"
        -      },
        -      "killed": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "loot": {
        -        "anyOf": [
        -          {
        -            "type": "null"
        -          },
        -          {
        -            "$ref": "#/$defs/Resources"
        -          }
        -        ]
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "player_id": {
        -        "type": "string"
        -      },
        -      "remaining": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "sent": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "wounded": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "player_id"
        -    ],
        -    "type": "object"
        -  },
        -  "Resources": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "food": {
        -        "type": "integer"
        -      },
        -      "ore": {
        -        "type": "integer"
        -      },
        -      "silver": {
        -        "type": "integer"
        -      },
        -      "stone": {
        -        "type": "integer"
        -      },
        -      "wood": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "food",
        -      "wood",
        -      "stone",
        -      "ore",
        -      "silver"
        -    ],
        -    "type": "object"
        -  },
        -  "SideRow": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "held_ms": {
        -        "type": "integer"
        -      },
        -      "might": {
        -        "type": "integer"
        -      },
        -      "players": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "players",
        -      "might",
        -      "held_ms"
        -    ],
        -    "type": "object"
        -  },
        -  "WarMachineSnap": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "level": {
        -        "type": "integer"
        -      },
        -      "next_cost": {
        -        "type": "integer"
        -      },
        -      "skill_points": {
        -        "type": "integer"
        -      },
        -      "skills": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "xp": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "level",
        -      "xp",
        -      "next_cost",
        -      "skill_points"
        -    ],
        -    "type": "object"
        -  }
        -}
      • removedOutput schema / properties / snapshot / additionalProperties
        Removed value: -false
      • changedOutput schema / properties / snapshot / description
        Previous value: -"The Snapshot (docs/protocol.md §5)."New value: +"The Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource)."
      • removedOutput schema / properties / snapshot / properties
        Removed value: -{
        -  "active_events": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "effect": {
        -          "additionalProperties": {
        -            "type": "number"
        -          },
        -          "type": "object"
        -        },
        -        "ends_at": {
        -          "type": "integer"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "name": {
        -          "additionalProperties": {
        -            "type": "string"
        -          },
        -          "type": "object"
        -        },
        -        "windows": {
        -          "items": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "duration_minutes": {
        -                "type": "integer"
        -              },
        -              "start_hour": {
        -                "type": "integer"
        -              }
        -            },
        -            "required": [
        -              "start_hour",
        -              "duration_minutes"
        -            ],
        -            "type": "object"
        -          },
        -          "type": [
        -            "null",
        -            "array"
        -          ]
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "ends_at"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "ai_player_ids": {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "alliance": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "active_research_id": {
        -        "type": "string"
        -      },
        -      "announcement": {
        -        "type": "string"
        -      },
        -      "announcement_at": {
        -        "type": "integer"
        -      },
        -      "announcement_by": {
        -        "type": "string"
        -      },
        -      "applications": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "applied_at": {
        -              "type": "integer"
        -            },
        -            "might": {
        -              "type": "integer"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "player_name": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "player_id",
        -            "player_name",
        -            "might",
        -            "applied_at"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "auto_accept_might": {
        -        "type": "integer"
        -      },
        -      "battlemarks": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "created_at": {
        -              "type": "integer"
        -            },
        -            "expires_at": {
        -              "type": "integer"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "marked_by": {
        -              "type": "string"
        -            },
        -            "marked_by_name": {
        -              "type": "string"
        -            },
        -            "note": {
        -              "type": "string"
        -            },
        -            "x": {
        -              "type": "integer"
        -            },
        -            "y": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "x",
        -            "y",
        -            "marked_by",
        -            "created_at",
        -            "expires_at"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "can_edit_profile": {
        -        "type": "boolean"
        -      },
        -      "can_rename": {
        -        "type": "boolean"
        -      },
        -      "contributions": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "name": {
        -              "type": "string"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "silver": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "player_id",
        -            "silver"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "description": {
        -        "type": "string"
        -      },
        -      "description_at": {
        -        "type": "integer"
        -      },
        -      "description_by": {
        -        "type": "string"
        -      },
        -      "donation_tax_pct": {
        -        "type": "number"
        -      },
        -      "gift_level": {
        -        "type": "integer"
        -      },
        -      "help_requests": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "expires_at": {
        -              "type": "integer"
        -            },
        -            "finish_at": {
        -              "type": "integer"
        -            },
        -            "finished": {
        -              "type": "boolean"
        -            },
        -            "helpable": {
        -              "type": "boolean"
        -            },
        -            "helpers": {
        -              "type": "integer"
        -            },
        -            "kind": {
        -              "type": "string"
        -            },
        -            "level": {
        -              "type": "integer"
        -            },
        -            "own": {
        -              "type": "boolean"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "player_name": {
        -              "type": "string"
        -            },
        -            "queue_id": {
        -              "type": "string"
        -            },
        -            "viewer_helped": {
        -              "type": "boolean"
        -            },
        -            "what": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "player_id",
        -            "player_name",
        -            "queue_id",
        -            "finish_at",
        -            "helpable"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "helpable": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "asked": {
        -              "type": "boolean"
        -            },
        -            "finish_at": {
        -              "type": "integer"
        -            },
        -            "kind": {
        -              "type": "string"
        -            },
        -            "level": {
        -              "type": "integer"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "player_name": {
        -              "type": "string"
        -            },
        -            "queue_id": {
        -              "type": "string"
        -            },
        -            "what": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "player_id",
        -            "player_name",
        -            "queue_id",
        -            "finish_at"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "leader_id": {
        -        "type": "string"
        -      },
        -      "log": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "at_ms": {
        -              "type": "integer"
        -            },
        -            "by_id": {
        -              "type": "string"
        -            },
        -            "by_name": {
        -              "type": "string"
        -            },
        -            "kind": {
        -              "type": "string"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "params": {
        -              "additionalProperties": true,
        -              "type": "object"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "at_ms",
        -            "kind"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "loyalty_rates": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "camp_amount": {
        -            "type": "integer"
        -          },
        -          "camp_chance_pct": {
        -            "type": "number"
        -          },
        -          "camp_daily_cap": {
        -            "type": "integer"
        -          },
        -          "camp_loyalty_left": {
        -            "type": "integer"
        -          },
        -          "donation_daily_cap": {
        -            "type": "integer"
        -          },
        -          "donation_loyalty_left": {
        -            "type": "integer"
        -          },
        -          "help_daily_cap": {
        -            "type": "integer"
        -          },
        -          "help_seconds": {
        -            "type": "integer"
        -          },
        -          "helps_paid_left": {
        -            "type": "integer"
        -          },
        -          "per_100_silver": {
        -            "type": "number"
        -          },
        -          "per_help": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "per_100_silver",
        -          "per_help",
        -          "help_daily_cap",
        -          "helps_paid_left",
        -          "help_seconds",
        -          "camp_chance_pct",
        -          "camp_amount",
        -          "donation_loyalty_left",
        -          "camp_loyalty_left"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "member_cap": {
        -        "type": "integer"
        -      },
        -      "member_count": {
        -        "type": "integer"
        -      },
        -      "member_invite_enabled": {
        -        "type": "boolean"
        -      },
        -      "members": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "ai": {
        -              "type": "boolean"
        -            },
        -            "avatar": {
        -              "type": "integer"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "kind": {
        -              "type": "string"
        -            },
        -            "last_seen_at": {
        -              "type": "integer"
        -            },
        -            "might": {
        -              "type": "integer"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "online": {
        -              "type": "boolean"
        -            },
        -            "role": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "name",
        -            "kind",
        -            "role",
        -            "might"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "power": {
        -        "type": "integer"
        -      },
        -      "purchase_gift_diamonds": {
        -        "type": "integer"
        -      },
        -      "purchase_gift_loyalty": {
        -        "type": "integer"
        -      },
        -      "rank": {
        -        "type": "integer"
        -      },
        -      "rank_total": {
        -        "type": "integer"
        -      },
        -      "reinforce_requests": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "arrive_at": {
        -              "type": "integer"
        -            },
        -            "attacker": {
        -              "type": "string"
        -            },
        -            "helpers": {
        -              "type": "integer"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "player_name": {
        -              "type": "string"
        -            },
        -            "room": {
        -              "type": "integer"
        -            },
        -            "viewer_helped": {
        -              "type": "boolean"
        -            },
        -            "viewer_sending": {
        -              "type": "boolean"
        -            },
        -            "x": {
        -              "type": "integer"
        -            },
        -            "y": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "player_id",
        -            "player_name",
        -            "attacker",
        -            "x",
        -            "y",
        -            "arrive_at",
        -            "room"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "rename_ready_at": {
        -        "type": "integer"
        -      },
        -      "research": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "research_progress": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "sent_invites": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "at": {
        -              "type": "integer"
        -            },
        -            "by_id": {
        -              "type": "string"
        -            },
        -            "by_name": {
        -              "type": "string"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "player_id",
        -            "name",
        -            "at"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "tag": {
        -        "type": "string"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "tag",
        -      "leader_id",
        -      "members",
        -      "power",
        -      "member_cap",
        -      "member_count",
        -      "gift_level",
        -      "donation_tax_pct"
        -    ],
        -    "type": [
        -      "null",
        -      "object"
        -    ]
        -  },
        -  "alliance_directory": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "admits_now": {
        -          "type": "boolean"
        -        },
        -        "applied": {
        -          "type": "boolean"
        -        },
        -        "auto_accept_might": {
        -          "type": "integer"
        -        },
        -        "description": {
        -          "type": "string"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "leaders_seen_at": {
        -          "type": "integer"
        -        },
        -        "member_cap": {
        -          "type": "integer"
        -        },
        -        "member_count": {
        -          "type": "integer"
        -        },
        -        "name": {
        -          "type": "string"
        -        },
        -        "power": {
        -          "type": "integer"
        -        },
        -        "rank": {
        -          "type": "integer"
        -        },
        -        "tag": {
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "tag",
        -        "power",
        -        "member_count",
        -        "member_cap"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "alliance_league": {
        -    "anyOf": [
        -      {
        -        "type": "null"
        -      },
        -      {
        -        "$ref": "#/$defs/LeagueStanding"
        -      }
        -    ]
        -  },
        -  "alliance_rankings": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "id": {
        -          "type": "string"
        -        },
        -        "member_count": {
        -          "type": "integer"
        -        },
        -        "might": {
        -          "type": "integer"
        -        },
        -        "name": {
        -          "type": "string"
        -        },
        -        "rank": {
        -          "type": "integer"
        -        },
        -        "tag": {
        -          "type": "string"
        -        },
        -        "you": {
        -          "type": "boolean"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "tag",
        -        "might",
        -        "rank",
        -        "member_count"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "bookmarks": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "created_at": {
        -          "type": "integer"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "label": {
        -          "type": "string"
        -        },
        -        "title": {
        -          "type": "string"
        -        },
        -        "x": {
        -          "type": "integer"
        -        },
        -        "y": {
        -          "type": "integer"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "x",
        -        "y",
        -        "title",
        -        "label",
        -        "created_at"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "chat": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "alliance_tag": {
        -          "type": "string"
        -        },
        -        "at": {
        -          "type": "integer"
        -        },
        -        "avatar": {
        -          "type": "integer"
        -        },
        -        "name": {
        -          "type": "string"
        -        },
        -        "params": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        "room": {
        -          "type": "string"
        -        },
        -        "sender": {
        -          "type": "string"
        -        },
        -        "sticker_emoji": {
        -          "type": "string"
        -        },
        -        "sticker_id": {
        -          "type": "string"
        -        },
        -        "system": {
        -          "type": "boolean"
        -        },
        -        "text": {
        -          "type": "string"
        -        },
        -        "text_key": {
        -          "type": "string"
        -        },
        -        "title_id": {
        -          "type": "string"
        -        },
        -        "vip": {
        -          "type": "integer"
        -        }
        -      },
        -      "required": [
        -        "room",
        -        "sender",
        -        "text",
        -        "at"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "city": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "anti_scout_until": {
        -        "type": "integer"
        -      },
        -      "buildings": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "damaged": {
        -              "type": "boolean"
        -            },
        -            "damaged_at": {
        -              "type": "integer"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "level": {
        -              "type": "integer"
        -            },
        -            "repair_cost": {
        -              "anyOf": [
        -                {
        -                  "type": "null"
        -                },
        -                {
        -                  "$ref": "#/$defs/Resources"
        -                }
        -              ]
        -            },
        -            "repair_seconds": {
        -              "type": "integer"
        -            },
        -            "self_repair_at": {
        -              "type": "integer"
        -            },
        -            "slot": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "level",
        -            "slot"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "can_upgrade": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "id": {
        -              "type": "string"
        -            },
        -            "new": {
        -              "type": "boolean"
        -            },
        -            "slot": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "slot"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "deconstruct_refund": {
        -        "items": {
        -          "$ref": "#/$defs/NextCost"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "fake_army_until": {
        -        "type": "integer"
        -      },
        -      "guests": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "alliance_tag": {
        -              "type": "string"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "troops": {
        -              "additionalProperties": {
        -                "type": "integer"
        -              },
        -              "type": "object"
        -            },
        -            "wounded": {
        -              "additionalProperties": {
        -                "type": "integer"
        -              },
        -              "type": "object"
        -            }
        -          },
        -          "required": [
        -            "player_id",
        -            "troops"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "incoming": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "alliance_tag": {
        -              "type": "string"
        -            },
        -            "arrive_at": {
        -              "type": "integer"
        -            },
        -            "combat_boost_pct": {
        -              "type": "integer"
        -            },
        -            "exact": {
        -              "type": "boolean"
        -            },
        -            "friendly": {
        -              "type": "boolean"
        -            },
        -            "hero": {
        -              "type": [
        -                "null",
        -                "boolean"
        -              ]
        -            },
        -            "kind": {
        -              "type": "string"
        -            },
        -            "owner_id": {
        -              "type": "string"
        -            },
        -            "owner_name": {
        -              "type": "string"
        -            },
        -            "troop_count": {
        -              "type": [
        -                "null",
        -                "integer"
        -              ]
        -            },
        -            "troops": {
        -              "additionalProperties": {
        -                "type": "integer"
        -              },
        -              "type": "object"
        -            },
        -            "troops_by_role": {
        -              "additionalProperties": {
        -                "type": "integer"
        -              },
        -              "type": "object"
        -            }
        -          },
        -          "required": [
        -            "owner_id",
        -            "arrive_at"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "items": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "new_player_auto_shield": {
        -        "type": "boolean"
        -      },
        -      "next_costs": {
        -        "items": {
        -          "$ref": "#/$defs/NextCost"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "pending": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "amount": {
        -              "type": "integer"
        -            },
        -            "kind": {
        -              "type": "string"
        -            },
        -            "slot": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "slot",
        -            "kind",
        -            "amount"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "prisoners": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "alliance_tag": {
        -              "type": "string"
        -            },
        -            "captured_at": {
        -              "type": "integer"
        -            },
        -            "hero_id": {
        -              "type": "string"
        -            },
        -            "hero_level": {
        -              "type": "integer"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "ransom": {
        -              "type": "integer"
        -            },
        -            "release_at": {
        -              "type": "integer"
        -            },
        -            "release_reward": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "player_id",
        -            "hero_id",
        -            "captured_at"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "prod_per_hour": {
        -        "$ref": "#/$defs/Resources"
        -      },
        -      "protect": {
        -        "$ref": "#/$defs/Resources"
        -      },
        -      "queues": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "finish_at": {
        -              "type": "integer"
        -            },
        -            "id": {
        -              "type": "string"
        -            },
        -            "kind": {
        -              "type": "string"
        -            },
        -            "label": {
        -              "type": "string"
        -            },
        -            "march_id": {
        -              "type": "string"
        -            },
        -            "march_state": {
        -              "type": "string"
        -            },
        -            "rally_id": {
        -              "type": "string"
        -            },
        -            "slot": {
        -              "type": [
        -                "null",
        -                "integer"
        -              ]
        -            }
        -          },
        -          "required": [
        -            "id",
        -            "kind",
        -            "finish_at"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "repair": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "crews": {
        -            "type": "integer"
        -          },
        -          "crews_busy": {
        -            "type": "integer"
        -          },
        -          "damaged": {
        -            "type": "integer"
        -          },
        -          "damaged_effect_pct": {
        -            "type": "number"
        -          },
        -          "engineer_cap": {
        -            "type": "integer"
        -          },
        -          "engineers": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "engineers",
        -          "engineer_cap",
        -          "crews",
        -          "crews_busy",
        -          "damaged",
        -          "damaged_effect_pct"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "resources": {
        -        "$ref": "#/$defs/Resources"
        -      },
        -      "shield_blocked_attempts": {
        -        "type": "integer"
        -      },
        -      "shield_until": {
        -        "type": "integer"
        -      },
        -      "skin_id": {
        -        "type": "string"
        -      },
        -      "stationed": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "alliance_tag": {
        -              "type": "string"
        -            },
        -            "host_id": {
        -              "type": "string"
        -            },
        -            "host_name": {
        -              "type": "string"
        -            },
        -            "troops": {
        -              "additionalProperties": {
        -                "type": "integer"
        -              },
        -              "type": "object"
        -            },
        -            "wounded": {
        -              "additionalProperties": {
        -                "type": "integer"
        -              },
        -              "type": "object"
        -            },
        -            "x": {
        -              "type": "integer"
        -            },
        -            "y": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "host_id",
        -            "x",
        -            "y",
        -            "troops"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "troop_count": {
        -        "type": "integer"
        -      },
        -      "troops": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "upkeep_food": {
        -        "type": "integer"
        -      },
        -      "warehouse_cap": {
        -        "type": "integer"
        -      },
        -      "wounded": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "x": {
        -        "type": "integer"
        -      },
        -      "y": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "x",
        -      "y",
        -      "shield_until",
        -      "resources",
        -      "buildings",
        -      "queues",
        -      "troops",
        -      "wounded",
        -      "troop_count",
        -      "skin_id",
        -      "can_upgrade",
        -      "protect",
        -      "prod_per_hour",
        -      "upkeep_food"
        -    ],
        -    "type": "object"
        -  },
        -  "config_hash": {
        -    "type": "string"
        -  },
        -  "feedback": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "body": {
        -          "type": "string"
        -        },
        -        "created_at": {
        -          "type": "integer"
        -        },
        -        "excerpt": {
        -          "type": "string"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "kind": {
        -          "type": "string"
        -        },
        -        "message_at": {
        -          "type": "integer"
        -        },
        -        "player_id": {
        -          "type": "string"
        -        },
        -        "player_name": {
        -          "type": "string"
        -        },
        -        "read": {
        -          "type": "boolean"
        -        },
        -        "reason": {
        -          "type": "string"
        -        },
        -        "replies": {
        -          "items": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "author": {
        -                "type": "string"
        -              },
        -              "body": {
        -                "type": "string"
        -              },
        -              "created_at": {
        -                "type": "integer"
        -              }
        -            },
        -            "required": [
        -              "author",
        -              "body",
        -              "created_at"
        -            ],
        -            "type": "object"
        -          },
        -          "type": [
        -            "null",
        -            "array"
        -          ]
        -        },
        -        "room": {
        -          "type": "string"
        -        },
        -        "subject": {
        -          "type": "string"
        -        },
        -        "target_name": {
        -          "type": "string"
        -        },
        -        "target_player_id": {
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "player_id",
        -        "player_name",
        -        "kind",
        -        "subject",
        -        "body",
        -        "created_at",
        -        "read"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "founder_player_ids": {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "gifts": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "created_at": {
        -          "type": "integer"
        -        },
        -        "diamond_reward": {
        -          "type": "integer"
        -        },
        -        "expires_at": {
        -          "type": "integer"
        -        },
        -        "from_player_name": {
        -          "type": "string"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "loyalty_reward": {
        -          "type": "integer"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "from_player_name",
        -        "created_at",
        -        "expires_at",
        -        "diamond_reward",
        -        "loyalty_reward"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "ground": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "base": {
        -        "type": "string"
        -      },
        -      "h": {
        -        "type": "number"
        -      },
        -      "m": {
        -        "type": "integer"
        -      },
        -      "ppu": {
        -        "items": {
        -          "type": "number"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "tile": {
        -        "type": "integer"
        -      },
        -      "version": {
        -        "type": "string"
        -      },
        -      "w": {
        -        "type": "number"
        -      }
        -    },
        -    "required": [
        -      "base",
        -      "version",
        -      "m",
        -      "tile",
        -      "ppu",
        -      "w",
        -      "h"
        -    ],
        -    "type": [
        -      "null",
        -      "object"
        -    ]
        -  },
        -  "invites": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "alliance_id": {
        -          "type": "string"
        -        },
        -        "description": {
        -          "type": "string"
        -        },
        -        "gift_level": {
        -          "type": "integer"
        -        },
        -        "member_cap": {
        -          "type": "integer"
        -        },
        -        "member_count": {
        -          "type": "integer"
        -        },
        -        "name": {
        -          "type": "string"
        -        },
        -        "power": {
        -          "type": "integer"
        -        },
        -        "rank": {
        -          "type": "integer"
        -        },
        -        "tag": {
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "alliance_id",
        -        "name",
        -        "tag"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "league": {
        -    "anyOf": [
        -      {
        -        "type": "null"
        -      },
        -      {
        -        "$ref": "#/$defs/LeagueStanding"
        -      }
        -    ]
        -  },
        -  "mail": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "alliance_id": {
        -          "type": "string"
        -        },
        -        "attacker": {
        -          "type": "string"
        -        },
        -        "attacker_armies": {
        -          "items": {
        -            "$ref": "#/$defs/ReportArmy"
        -          },
        -          "type": [
        -            "null",
        -            "array"
        -          ]
        -        },
        -        "attacker_hero": {
        -          "type": "boolean"
        -        },
        -        "attacker_hero_level": {
        -          "type": "integer"
        -        },
        -        "attacker_hero_mult": {
        -          "type": "number"
        -        },
        -        "attacker_killed": {
        -          "additionalProperties": {
        -            "type": "integer"
        -          },
        -          "type": "object"
        -        },
        -        "attacker_kind": {
        -          "type": "string"
        -        },
        -        "attacker_level": {
        -          "type": "integer"
        -        },
        -        "attacker_mods": {
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "$ref": "#/$defs/BattleMods"
        -            }
        -          ]
        -        },
        -        "attacker_sent": {
        -          "additionalProperties": {
        -            "type": "integer"
        -          },
        -          "type": "object"
        -        },
        -        "attacker_strength": {
        -          "type": "integer"
        -        },
        -        "attacker_wounded": {
        -          "additionalProperties": {
        -            "type": "integer"
        -          },
        -          "type": "object"
        -        },
        -        "body": {
        -          "type": "string"
        -        },
        -        "body_key": {
        -          "type": "string"
        -        },
        -        "buildings_damaged": {
        -          "items": {
        -            "type": "string"
        -          },
        -          "type": [
        -            "null",
        -            "array"
        -          ]
        -        },
        -        "created_at": {
        -          "type": "integer"
        -        },
        -        "defender": {
        -          "type": "string"
        -        },
        -        "defender_armies": {
        -          "items": {
        -            "$ref": "#/$defs/ReportArmy"
        -          },
        -          "type": [
        -            "null",
        -            "array"
        -          ]
        -        },
        -        "defender_hero": {
        -          "type": "boolean"
        -        },
        -        "defender_hero_home": {
        -          "type": "boolean"
        -        },
        -        "defender_hero_level": {
        -          "type": "integer"
        -        },
        -        "defender_hero_state": {
        -          "type": "string"
        -        },
        -        "defender_killed": {
        -          "additionalProperties": {
        -            "type": "integer"
        -          },
        -          "type": "object"
        -        },
        -        "defender_kind": {
        -          "type": "string"
        -        },
        -        "defender_level": {
        -          "type": "integer"
        -        },
        -        "defender_lootable": {
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "$ref": "#/$defs/Resources"
        -            }
        -          ]
        -        },
        -        "defender_losses": {
        -          "additionalProperties": {
        -            "type": "integer"
        -          },
        -          "type": "object"
        -        },
        -        "defender_might": {
        -          "type": "integer"
        -        },
        -        "defender_mods": {
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "$ref": "#/$defs/BattleMods"
        -            }
        -          ]
        -        },
        -        "defender_name": {
        -          "type": "string"
        -        },
        -        "defender_power": {
        -          "type": "integer"
        -        },
        -        "defender_remaining": {
        -          "additionalProperties": {
        -            "type": "integer"
        -          },
        -          "type": "object"
        -        },
        -        "defender_strength": {
        -          "type": "integer"
        -        },
        -        "defender_tag": {
        -          "type": "string"
        -        },
        -        "defender_troops": {
        -          "additionalProperties": {
        -            "type": "integer"
        -          },
        -          "type": "object"
        -        },
        -        "defender_troops_known": {
        -          "type": "boolean"
        -        },
        -        "defender_wall_level": {
        -          "type": "integer"
        -        },
        -        "defender_wall_power": {
        -          "type": "integer"
        -        },
        -        "defender_wall_troops": {
        -          "type": "integer"
        -        },
        -        "defender_wounded": {
        -          "additionalProperties": {
        -            "type": "integer"
        -          },
        -          "type": "object"
        -        },
        -        "hero_xp": {
        -          "type": "integer"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "kind": {
        -          "type": "string"
        -        },
        -        "loot": {
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "$ref": "#/$defs/Resources"
        -            }
        -          ]
        -        },
        -        "loot_capacity": {
        -          "type": "integer"
        -        },
        -        "loot_capped": {
        -          "type": "boolean"
        -        },
        -        "loot_items": {
        -          "additionalProperties": {
        -            "type": "integer"
        -          },
        -          "type": "object"
        -        },
        -        "loot_share": {
        -          "anyOf": [
        -            {
        -              "type": "null"
        -            },
        -            {
        -              "$ref": "#/$defs/Resources"
        -            }
        -          ]
        -        },
        -        "node_amount": {
        -          "type": "integer"
        -        },
        -        "node_max_amount": {
        -          "type": "integer"
        -        },
        -        "outcome": {
        -          "type": "string"
        -        },
        -        "params": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        "relocated": {
        -          "type": "boolean"
        -        },
        -        "relocated_x": {
        -          "type": "integer"
        -        },
        -        "relocated_y": {
        -          "type": "integer"
        -        },
        -        "replay": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "allies": {
        -              "additionalProperties": {
        -                "type": "integer"
        -              },
        -              "type": "object"
        -            },
        -            "frames": {
        -              "items": {
        -                "additionalProperties": false,
        -                "properties": {
        -                  "a": {
        -                    "additionalProperties": {
        -                      "type": "integer"
        -                    },
        -                    "type": "object"
        -                  },
        -                  "d": {
        -                    "additionalProperties": {
        -                      "type": "integer"
        -                    },
        -                    "type": "object"
        -                  },
        -                  "round": {
        -                    "type": "integer"
        -                  }
        -                },
        -                "required": [
        -                  "round",
        -                  "a",
        -                  "d"
        -                ],
        -                "type": "object"
        -              },
        -              "type": [
        -                "null",
        -                "array"
        -              ]
        -            },
        -            "rounds": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "rounds",
        -            "frames"
        -          ],
        -          "type": [
        -            "null",
        -            "object"
        -          ]
        -        },
        -        "side": {
        -          "type": "string"
        -        },
        -        "subject": {
        -          "type": "string"
        -        },
        -        "subject_key": {
        -          "type": "string"
        -        },
        -        "tutorial": {
        -          "type": "boolean"
        -        },
        -        "unread": {
        -          "type": "boolean"
        -        },
        -        "wall_damage": {
        -          "type": "integer"
        -        },
        -        "win": {
        -          "type": "boolean"
        -        },
        -        "x": {
        -          "type": "integer"
        -        },
        -        "y": {
        -          "type": "integer"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "kind",
        -        "subject",
        -        "unread",
        -        "created_at",
        -        "win"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "mail_unread": {
        -    "type": "integer"
        -  },
        -  "maintenance": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "active": {
        -        "type": "boolean"
        -      },
        -      "message": {
        -        "type": "string"
        -      },
        -      "starts_at_ms": {
        -        "type": "integer"
        -      },
        -      "until_ms": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "active",
        -      "message"
        -    ],
        -    "type": [
        -      "null",
        -      "object"
        -    ]
        -  },
        -  "map_size": {
        -    "type": "integer"
        -  },
        -  "marches": {
        -    "items": {
        -      "$ref": "#/$defs/March"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "moderation": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "ban_reason": {
        -        "type": "string"
        -      },
        -      "banned_until": {
        -        "type": "integer"
        -      },
        -      "chat_muted_until": {
        -        "type": "integer"
        -      },
        -      "warnings": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "at": {
        -              "type": "integer"
        -            },
        -            "text": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "at",
        -            "text"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      }
        -    },
        -    "type": [
        -      "null",
        -      "object"
        -    ]
        -  },
        -  "muted_player_ids": {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "muted_players": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "alliance_tag": {
        -          "type": "string"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "name": {
        -          "type": "string"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "notices": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "at": {
        -          "type": "integer"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "kind": {
        -          "type": "string"
        -        },
        -        "params": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "kind",
        -        "at"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "now": {
        -    "type": "integer"
        -  },
        -  "palace": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "alliance_id": {
        -        "type": "string"
        -      },
        -      "boost_pcts": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "contest_ends_ms": {
        -        "type": "integer"
        -      },
        -      "contested_since_ms": {
        -        "type": "integer"
        -      },
        -      "court": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "name": {
        -              "type": "string"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "since_ms": {
        -              "type": "integer"
        -            },
        -            "tag": {
        -              "type": "string"
        -            },
        -            "title_id": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "title_id",
        -            "player_id",
        -            "name"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "court_log": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "action": {
        -              "type": "string"
        -            },
        -            "at_ms": {
        -              "type": "integer"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "tag": {
        -              "type": "string"
        -            },
        -            "title_id": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "at_ms",
        -            "action"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "garrison": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "alliance_tag": {
        -              "type": "string"
        -            },
        -            "name": {
        -              "type": "string"
        -            },
        -            "player_id": {
        -              "type": "string"
        -            },
        -            "troops": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "player_id",
        -            "name",
        -            "troops"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "garrison_cap": {
        -        "type": "integer"
        -      },
        -      "garrison_hidden": {
        -        "type": "boolean"
        -      },
        -      "garrison_troops": {
        -        "type": "integer"
        -      },
        -      "hold_hours": {
        -        "type": "integer"
        -      },
        -      "king_alliance_tag": {
        -        "type": "string"
        -      },
        -      "king_id": {
        -        "type": "string"
        -      },
        -      "king_name": {
        -        "type": "string"
        -      },
        -      "kingdom_boosts": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "might_bonus": {
        -        "type": "integer"
        -      },
        -      "owner_alliance_tag": {
        -        "type": "string"
        -      },
        -      "owner_id": {
        -        "type": "string"
        -      },
        -      "owner_name": {
        -        "type": "string"
        -      },
        -      "protected": {
        -        "type": "boolean"
        -      },
        -      "protected_until_ms": {
        -        "type": "integer"
        -      },
        -      "protection_hours": {
        -        "type": "integer"
        -      },
        -      "rotation_step_hours": {
        -        "type": "integer"
        -      },
        -      "rotation_steps": {
        -        "type": "integer"
        -      },
        -      "x": {
        -        "type": "integer"
        -      },
        -      "y": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "x",
        -      "y",
        -      "hold_hours",
        -      "protection_hours",
        -      "rotation_step_hours",
        -      "rotation_steps",
        -      "might_bonus"
        -    ],
        -    "type": [
        -      "null",
        -      "object"
        -    ]
        -  },
        -  "player": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "active_days": {
        -        "type": "integer"
        -      },
        -      "ai": {
        -        "type": "boolean"
        -      },
        -      "alliance_id": {
        -        "type": [
        -          "null",
        -          "string"
        -        ]
        -      },
        -      "alliance_store_bought": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "avatar": {
        -        "type": "integer"
        -      },
        -      "black_market": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "rotates_at": {
        -            "type": "integer"
        -          },
        -          "slots": {
        -            "items": {
        -              "$ref": "#/$defs/BlackMarketSlot"
        -            },
        -            "type": [
        -              "null",
        -              "array"
        -            ]
        -          },
        -          "tokens": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "tokens",
        -          "slots"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "black_market_preview": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "daily_tokens": {
        -            "type": "integer"
        -          },
        -          "rotates_at": {
        -            "type": "integer"
        -          },
        -          "slots": {
        -            "items": {
        -              "$ref": "#/$defs/BlackMarketSlot"
        -            },
        -            "type": [
        -              "null",
        -              "array"
        -            ]
        -          },
        -          "slots_per_week": {
        -            "type": "integer"
        -          },
        -          "unlock_cost": {
        -            "type": "integer"
        -          },
        -          "unlock_item": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "unlock_item",
        -          "unlock_cost",
        -          "daily_tokens",
        -          "slots_per_week",
        -          "slots",
        -          "rotates_at"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "combat_boost_pct": {
        -        "type": "number"
        -      },
        -      "combat_boost_until": {
        -        "type": "integer"
        -      },
        -      "diamond_pass": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "claimed_today": {
        -            "type": "boolean"
        -          },
        -          "daily": {
        -            "type": "integer"
        -          },
        -          "days_left": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "daily",
        -          "days_left",
        -          "claimed_today"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "diamonds": {
        -        "type": "integer"
        -      },
        -      "dragon": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "level": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "level"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "dragon_pets": {
        -        "additionalProperties": {
        -          "$ref": "#/$defs/WarMachineSnap"
        -        },
        -        "type": "object"
        -      },
        -      "hero": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "atk_pct": {
        -            "type": "integer"
        -          },
        -          "bonus": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "atk_pct": {
        -                "type": "number"
        -              },
        -              "base_atk_pct": {
        -                "type": "number"
        -              },
        -              "gear_atk_pct": {
        -                "type": "number"
        -              },
        -              "gear_hp_pct": {
        -                "type": "number"
        -              },
        -              "hp_pct": {
        -                "type": "number"
        -              },
        -              "level_atk_pct": {
        -                "type": "number"
        -              },
        -              "odds_mult": {
        -                "type": "number"
        -              },
        -              "skill_atk_pct": {
        -                "type": "number"
        -              },
        -              "skill_hp_pct": {
        -                "type": "number"
        -              }
        -            },
        -            "required": [
        -              "base_atk_pct",
        -              "level_atk_pct",
        -              "skill_atk_pct",
        -              "gear_atk_pct",
        -              "atk_pct",
        -              "skill_hp_pct",
        -              "gear_hp_pct",
        -              "hp_pct",
        -              "odds_mult"
        -            ],
        -            "type": [
        -              "null",
        -              "object"
        -            ]
        -          },
        -          "captured": {
        -            "type": "boolean"
        -          },
        -          "captured_by": {
        -            "type": "string"
        -          },
        -          "captured_by_tag": {
        -            "type": "string"
        -          },
        -          "free_reset": {
        -            "type": "boolean"
        -          },
        -          "gear": {
        -            "additionalProperties": {
        -              "type": "string"
        -            },
        -            "type": "object"
        -          },
        -          "home": {
        -            "type": "boolean"
        -          },
        -          "id": {
        -            "type": "string"
        -          },
        -          "level": {
        -            "type": "integer"
        -          },
        -          "march_atk_pct": {
        -            "type": "number"
        -          },
        -          "march_hp_pct": {
        -            "type": "number"
        -          },
        -          "max_level": {
        -            "type": "integer"
        -          },
        -          "odds_mult": {
        -            "type": "number"
        -          },
        -          "portrait": {
        -            "type": "integer"
        -          },
        -          "ransom": {
        -            "type": "integer"
        -          },
        -          "release_at": {
        -            "type": "integer"
        -          },
        -          "skill_points": {
        -            "type": "integer"
        -          },
        -          "skills": {
        -            "additionalProperties": {
        -              "type": "integer"
        -            },
        -            "type": "object"
        -          },
        -          "xp": {
        -            "type": "integer"
        -          },
        -          "xp_next": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "level",
        -          "xp",
        -          "home",
        -          "skill_points"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "id": {
        -        "type": "string"
        -      },
        -      "kind": {
        -        "type": "string"
        -      },
        -      "loyalty": {
        -        "type": "integer"
        -      },
        -      "march_size": {
        -        "type": "integer"
        -      },
        -      "march_size_info": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "hero_pct": {
        -            "type": "number"
        -          },
        -          "kingdom_boost_pct": {
        -            "type": "integer"
        -          },
        -          "next_total": {
        -            "type": "integer"
        -          },
        -          "next_town_hall_level": {
        -            "type": "integer"
        -          },
        -          "research_pct": {
        -            "type": "number"
        -          },
        -          "research_tech_id": {
        -            "type": "string"
        -          },
        -          "total": {
        -            "type": "integer"
        -          },
        -          "town_hall": {
        -            "type": "integer"
        -          },
        -          "town_hall_level": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "town_hall_level",
        -          "town_hall",
        -          "total"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "march_slots": {
        -        "type": "integer"
        -      },
        -      "march_slots_used": {
        -        "type": "integer"
        -      },
        -      "might": {
        -        "type": "integer"
        -      },
        -      "might_rank": {
        -        "type": "integer"
        -      },
        -      "name": {
        -        "type": "string"
        -      },
        -      "prod_boost_pct": {
        -        "type": "number"
        -      },
        -      "prod_boost_until": {
        -        "type": "integer"
        -      },
        -      "queue_caps": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "build": {
        -            "type": "integer"
        -          },
        -          "build_rental_until": {
        -            "type": "integer"
        -          },
        -          "craft": {
        -            "type": "integer"
        -          },
        -          "hospital": {
        -            "type": "integer"
        -          },
        -          "research": {
        -            "type": "integer"
        -          },
        -          "research_rental_until": {
        -            "type": "integer"
        -          },
        -          "train": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "build",
        -          "train",
        -          "research"
        -        ],
        -        "type": "object"
        -      },
        -      "rally_size": {
        -        "type": "integer"
        -      },
        -      "rename_cost": {
        -        "type": "integer"
        -      },
        -      "rename_free": {
        -        "type": "boolean"
        -      },
        -      "shield_block": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "code": {
        -            "type": "string"
        -          },
        -          "message": {
        -            "type": "string"
        -          }
        -        },
        -        "required": [
        -          "code"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "tech": {
        -        "additionalProperties": {
        -          "type": "integer"
        -        },
        -        "type": "object"
        -      },
        -      "title": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "effects": {
        -            "additionalProperties": {
        -              "type": "number"
        -            },
        -            "type": "object"
        -          },
        -          "id": {
        -            "type": "string"
        -          },
        -          "kind": {
        -            "type": "string"
        -          },
        -          "name": {
        -            "additionalProperties": {
        -              "type": "string"
        -            },
        -            "type": "object"
        -          },
        -          "since_ms": {
        -            "type": "integer"
        -          }
        -        },
        -        "required": [
        -          "id",
        -          "kind"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "title_id": {
        -        "type": "string"
        -      },
        -      "vip": {
        -        "type": "integer"
        -      },
        -      "vip_benefits": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "combat_pct": {
        -            "type": "number"
        -          },
        -          "construction_free_seconds": {
        -            "type": "integer"
        -          },
        -          "gather_speed_pct": {
        -            "type": "number"
        -          },
        -          "march_speed_pct": {
        -            "type": "number"
        -          },
        -          "prod_mult": {
        -            "type": "number"
        -          },
        -          "queues": {
        -            "type": "integer"
        -          },
        -          "research_speed_pct": {
        -            "type": "number"
        -          },
        -          "train_speed_pct": {
        -            "type": "number"
        -          },
        -          "troop_hp_pct": {
        -            "type": "number"
        -          },
        -          "unlocks": {
        -            "additionalProperties": {
        -              "type": "boolean"
        -            },
        -            "type": "object"
        -          }
        -        },
        -        "required": [
        -          "prod_mult",
        -          "march_speed_pct",
        -          "train_speed_pct",
        -          "gather_speed_pct",
        -          "combat_pct",
        -          "construction_free_seconds",
        -          "queues"
        -        ],
        -        "type": [
        -          "null",
        -          "object"
        -        ]
        -      },
        -      "vip_duration_pct": {
        -        "type": "integer"
        -      },
        -      "vip_login_streak": {
        -        "type": "integer"
        -      },
        -      "vip_next_cost": {
        -        "type": "integer"
        -      },
        -      "vip_tier": {
        -        "type": "string"
        -      },
        -      "vip_tier_points": {
        -        "type": "integer"
        -      },
        -      "vip_until": {
        -        "type": "integer"
        -      },
        -      "war_machines": {
        -        "additionalProperties": {
        -          "$ref": "#/$defs/WarMachineSnap"
        -        },
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "id",
        -      "name",
        -      "kind",
        -      "alliance_id",
        -      "vip",
        -      "diamonds",
        -      "might",
        -      "might_rank",
        -      "rename_cost",
        -      "queue_caps",
        -      "march_slots",
        -      "march_slots_used",
        -      "march_size"
        -    ],
        -    "type": "object"
        -  },
        -  "point_event_tiers": {
        -    "additionalProperties": {
        -      "items": {
        -        "additionalProperties": false,
        -        "properties": {
        -          "points": {
        -            "type": "integer"
        -          },
        -          "reward": {
        -            "additionalProperties": true,
        -            "type": "object"
        -          }
        -        },
        -        "required": [
        -          "points"
        -        ],
        -        "type": "object"
        -      },
        -      "type": [
        -        "null",
        -        "array"
        -      ]
        -    },
        -    "type": "object"
        -  },
        -  "point_events": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "ends_at": {
        -          "type": "integer"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "kind": {
        -          "type": "string"
        -        },
        -        "name": {
        -          "additionalProperties": {
        -            "type": "string"
        -          },
        -          "type": "object"
        -        },
        -        "points": {
        -          "type": "integer"
        -        },
        -        "tiers_reached": {
        -          "type": "integer"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "kind",
        -        "ends_at",
        -        "points",
        -        "tiers_reached"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "quests": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "claimed": {
        -          "type": "boolean"
        -        },
        -        "done": {
        -          "type": "boolean"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "kind": {
        -          "type": "string"
        -        },
        -        "name": {
        -          "additionalProperties": {
        -            "type": "string"
        -          },
        -          "type": "object"
        -        },
        -        "progress": {
        -          "type": "integer"
        -        },
        -        "rarity": {
        -          "type": "string"
        -        },
        -        "reward": {
        -          "additionalProperties": true,
        -          "type": "object"
        -        },
        -        "target": {
        -          "type": "integer"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "done",
        -        "claimed"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "rallies": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "alliance_id": {
        -          "type": "string"
        -        },
        -        "arrive_at": {
        -          "type": "integer"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "launch_at": {
        -          "type": "integer"
        -        },
        -        "leader_id": {
        -          "type": "string"
        -        },
        -        "leader_name": {
        -          "type": "string"
        -        },
        -        "leader_tag": {
        -          "type": "string"
        -        },
        -        "march_id": {
        -          "type": "string"
        -        },
        -        "slot": {
        -          "type": "integer"
        -        },
        -        "state": {
        -          "type": "string"
        -        },
        -        "target_kind": {
        -          "type": "string"
        -        },
        -        "target_name": {
        -          "type": "string"
        -        },
        -        "target_tag": {
        -          "type": "string"
        -        },
        -        "troop_cap": {
        -          "type": "integer"
        -        },
        -        "troops": {
        -          "type": "integer"
        -        },
        -        "waves": {
        -          "items": {
        -            "additionalProperties": false,
        -            "properties": {
        -              "name": {
        -                "type": "string"
        -              },
        -              "player_id": {
        -                "type": "string"
        -              },
        -              "troops": {
        -                "additionalProperties": {
        -                  "type": "integer"
        -                },
        -                "type": "object"
        -              }
        -            },
        -            "required": [
        -              "player_id"
        -            ],
        -            "type": "object"
        -          },
        -          "type": [
        -            "null",
        -            "array"
        -          ]
        -        },
        -        "x": {
        -          "type": "integer"
        -        },
        -        "y": {
        -          "type": "integer"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "alliance_id",
        -        "leader_id",
        -        "x",
        -        "y",
        -        "slot",
        -        "launch_at",
        -        "state",
        -        "waves"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "rankings": {
        -    "items": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "alliance_tag": {
        -          "type": "string"
        -        },
        -        "id": {
        -          "type": "string"
        -        },
        -        "might": {
        -          "type": "integer"
        -        },
        -        "name": {
        -          "type": "string"
        -        },
        -        "rank": {
        -          "type": "integer"
        -        },
        -        "you": {
        -          "type": "boolean"
        -        }
        -      },
        -      "required": [
        -        "id",
        -        "name",
        -        "might",
        -        "rank"
        -      ],
        -      "type": "object"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "rate_limits": {
        -    "additionalProperties": {
        -      "additionalProperties": false,
        -      "properties": {
        -        "min_gap_ms": {
        -          "type": "integer"
        -        },
        -        "n": {
        -          "type": "integer"
        -        },
        -        "next_allowed_at_ms": {
        -          "type": "integer"
        -        },
        -        "remaining": {
        -          "type": "integer"
        -        },
        -        "reset_at": {
        -          "type": "integer"
        -        },
        -        "window_seconds": {
        -          "type": "integer"
        -        }
        -      },
        -      "required": [
        -        "n",
        -        "window_seconds",
        -        "remaining"
        -      ],
        -      "type": "object"
        -    },
        -    "type": "object"
        -  },
        -  "reported_chat": {
        -    "items": {
        -      "type": "string"
        -    },
        -    "type": [
        -      "null",
        -      "array"
        -    ]
        -  },
        -  "sides": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "ai": {
        -        "$ref": "#/$defs/SideRow"
        -      },
        -      "holder": {
        -        "type": "string"
        -      },
        -      "holder_since_ms": {
        -        "type": "integer"
        -      },
        -      "human": {
        -        "$ref": "#/$defs/SideRow"
        -      }
        -    },
        -    "required": [
        -      "human",
        -      "ai"
        -    ],
        -    "type": [
        -      "null",
        -      "object"
        -    ]
        -  },
        -  "tutorial": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "active": {
        -        "type": "boolean"
        -      },
        -      "chapter": {
        -        "type": "string"
        -      },
        -      "chapters": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "done_log": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "at": {
        -              "type": "integer"
        -            },
        -            "chapter": {
        -              "type": "string"
        -            },
        -            "index": {
        -              "type": "integer"
        -            },
        -            "reward": {
        -              "additionalProperties": true,
        -              "type": "object"
        -            },
        -            "step_id": {
        -              "type": "string"
        -            }
        -          },
        -          "required": [
        -            "index",
        -            "step_id",
        -            "at"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "remaining_diamonds": {
        -        "type": "integer"
        -      },
        -      "remaining_steps": {
        -        "type": "integer"
        -      },
        -      "require": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "reward": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      },
        -      "step_id": {
        -        "type": "string"
        -      },
        -      "step_index": {
        -        "type": "integer"
        -      },
        -      "total_steps": {
        -        "type": "integer"
        -      },
        -      "ui_ack": {
        -        "type": "string"
        -      },
        -      "ui_alliance_found": {
        -        "type": "boolean"
        -      },
        -      "ui_alliance_id": {
        -        "type": "string"
        -      },
        -      "ui_alliance_name": {
        -        "type": "string"
        -      },
        -      "ui_alliance_tag": {
        -        "type": "string"
        -      },
        -      "ui_block_except": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "ui_building": {
        -        "type": "string"
        -      },
        -      "ui_focus": {
        -        "type": "string"
        -      },
        -      "ui_focus_x": {
        -        "type": [
        -          "null",
        -          "integer"
        -        ]
        -      },
        -      "ui_focus_y": {
        -        "type": [
        -          "null",
        -          "integer"
        -        ]
        -      },
        -      "ui_queue": {
        -        "type": "string"
        -      },
        -      "ui_skippable": {
        -        "type": "boolean"
        -      },
        -      "ui_target": {
        -        "type": "string"
        -      },
        -      "ui_targets": {
        -        "items": {
        -          "type": "string"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "welcomed": {
        -        "type": "boolean"
        -      }
        -    },
        -    "required": [
        -      "step_id",
        -      "step_index",
        -      "total_steps",
        -      "active",
        -      "welcomed",
        -      "remaining_steps",
        -      "remaining_diamonds"
        -    ],
        -    "type": [
        -      "null",
        -      "object"
        -    ]
        -  },
        -  "tutorial_graduation": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "at": {
        -        "type": "integer"
        -      },
        -      "full": {
        -        "type": "boolean"
        -      },
        -      "reward": {
        -        "additionalProperties": true,
        -        "type": "object"
        -      }
        -    },
        -    "required": [
        -      "at",
        -      "full"
        -    ],
        -    "type": [
        -      "null",
        -      "object"
        -    ]
        -  },
        -  "viewport": {
        -    "additionalProperties": false,
        -    "properties": {
        -      "h": {
        -        "type": "integer"
        -      },
        -      "marches": {
        -        "items": {
        -          "$ref": "#/$defs/March"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "tiles": {
        -        "items": {
        -          "additionalProperties": false,
        -          "properties": {
        -            "amount": {
        -              "type": "integer"
        -            },
        -            "camp_loot": {
        -              "anyOf": [
        -                {
        -                  "type": "null"
        -                },
        -                {
        -                  "$ref": "#/$defs/Resources"
        -                }
        -              ]
        -            },
        -            "camp_max_level": {
        -              "type": "integer"
        -            },
        -            "camp_might": {
        -              "type": "integer"
        -            },
        -            "camp_name": {
        -              "type": "string"
        -            },
        -            "camp_raid_radius": {
        -              "type": "integer"
        -            },
        -            "camp_troops": {
        -              "additionalProperties": {
        -                "type": "integer"
        -              },
        -              "type": "object"
        -            },
        -            "camp_warband": {
        -              "type": "integer"
        -            },
        -            "camp_zone": {
        -              "type": "string"
        -            },
        -            "embassy_room": {
        -              "type": [
        -                "null",
        -                "integer"
        -              ]
        -            },
        -            "grow_at": {
        -              "type": "integer"
        -            },
        -            "kind": {
        -              "type": "string"
        -            },
        -            "level": {
        -              "type": "integer"
        -            },
        -            "max_amount": {
        -              "type": "integer"
        -            },
        -            "node_id": {
        -              "type": "string"
        -            },
        -            "occupant_alliance_tag": {
        -              "type": "string"
        -            },
        -            "occupant_hero": {
        -              "type": "boolean"
        -            },
        -            "occupant_id": {
        -              "type": "string"
        -            },
        -            "occupant_name": {
        -              "type": "string"
        -            },
        -            "occupant_troops": {
        -              "type": "integer"
        -            },
        -            "occupant_troops_hidden": {
        -              "type": "boolean"
        -            },
        -            "owner_alliance_id": {
        -              "type": "string"
        -            },
        -            "owner_alliance_tag": {
        -              "type": "string"
        -            },
        -            "owner_id": {
        -              "type": "string"
        -            },
        -            "owner_name": {
        -              "type": "string"
        -            },
        -            "raid_at": {
        -              "type": "integer"
        -            },
        -            "shielded": {
        -              "type": "boolean"
        -            },
        -            "x": {
        -              "type": "integer"
        -            },
        -            "y": {
        -              "type": "integer"
        -            }
        -          },
        -          "required": [
        -            "x",
        -            "y",
        -            "kind"
        -          ],
        -          "type": "object"
        -        },
        -        "type": [
        -          "null",
        -          "array"
        -        ]
        -      },
        -      "w": {
        -        "type": "integer"
        -      },
        -      "x0": {
        -        "type": "integer"
        -      },
        -      "y0": {
        -        "type": "integer"
        -      }
        -    },
        -    "required": [
        -      "tiles"
        -    ],
        -    "type": "object"
        -  }
        -}
    • Changedguest_login1 field changed
      • changedOutput schema / properties / snapshot / description
        Previous value: -"The Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Its full schema is get_snapshot's outputSchema (property snapshot)."New value: +"The Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource)."
    • Changedlogin1 field changed
      • changedOutput schema / properties / snapshot / description
        Previous value: -"The Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Its full schema is get_snapshot's outputSchema (property snapshot)."New value: +"The Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource)."
    • Changedregister1 field changed
      • changedOutput schema / properties / snapshot / description
        Previous value: -"The Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Its full schema is get_snapshot's outputSchema (property snapshot)."New value: +"The Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource)."
    • Changedsend_command1 field changed
      • changedOutput schema / properties / snapshot / description
        Previous value: -"The Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Its full schema is get_snapshot's outputSchema (property snapshot)."New value: +"The Snapshot (docs/protocol.md §5), cut down as the snapshot/sections arguments asked. Every key is described in docs/protocol.md §5 (the agentickingdoms://docs/protocol resource)."
  8. 17 tool updates
    • First observedaccount
    • First observedbuy_pack
    • First observedbuy_pack_with_store_credit
    • First observedclaim_account
    • First observedfind_players
    • First observedgame_data
    • First observedget_snapshot
    • First observedgift_code_pack
    • First observedgift_pack
    • First observedguest_login
    • First observedinvites
    • First observedlogin
    • First observedredeem_coupon
    • First observedredeem_gift_code
    • First observedregister
    • First observedsend_command
    • First observedshop_packs

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    D
    maintenance
    A multiplayer game engine where AI agents connect via Model Context Protocol to compete in real-time strategy games, starting with Chess Royale.
    MIT
  • A
    license
    A
    quality
    A
    maintenance
    Command a nation in SECOND STRIKE, a free real-time world war on a 3D globe: join wars, make and break pacts and launch nukes against AI nations, agents and people. A doomsday clock wipes out whoever strikes midnight. Every war is recorded and can be watched live.
    10
    MIT
Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources