{"schemaVersion":"0.1.0","game":{"id":"sitrep","name":"Sitrep","version":"0.1.0"},"transports":[{"id":"local-http-v0","kind":"http","description":"Opt-in local/dev HTTP transport exposed by the authoritative Sitrep FPS server when SITREP_MOCHI_V0=1.","endpointId":"mochi-v0-local"},{"id":"local-stdio-mcp","kind":"mcp","description":"Local stdio MCP wrapper owned by the authoritative Sitrep match server.","endpointId":"sitrep-mcp-local"},{"id":"official-mcp","kind":"mcp","description":"Live authenticated Muse-facing network and match-control MCP, hosted by Mochi. The local soldier observation/comms tools remain on local-stdio-mcp.","endpointId":"sitrep-mcp"}],"endpoints":[{"id":"mochi-v0-local","transportId":"local-http-v0","url":"http://127.0.0.1:3000/mochi/v0/","auth":"bearer","purpose":"Live-local V0 HTTP surface for authoritative Sitrep state, command, deploy, and comms routes. Hosted/public ingress is not part of this contract."},{"id":"sitrep-mcp-local","transportId":"local-stdio-mcp","url":"stdio://sitrep-mcp","auth":"bearer","purpose":"Local stdio MCP wrapper exposing sitrep_observe and sitrep_comms over the authority-bound V0 command seam."},{"id":"sitrep-mcp","transportId":"official-mcp","url":"https://connect-staging.mochi.prom13us.com/mcp","auth":"bearer","purpose":"Active V1 hosted friend codes, mutual invitations, match start/status/orders/debrief and free match energy. Authenticate through Mochi; each player retains their own account. Discover current schemas with MCP tools/list."}],"mcpTools":[{"name":"sitrep_observe","transportId":"local-stdio-mcp","description":"Read the side-redacted visible match state for the paired commander.","inputSchema":{"type":"object","required":["unitRef"],"additionalProperties":false,"properties":{"unitRef":{"type":"string","minLength":1,"maxLength":80}}},"redacts":["enemyHp","enemyLoadout","unsensedEnemies","commanderMemoryMarks","enemyCameraPositions"]},{"name":"sitrep_comms","transportId":"local-stdio-mcp","description":"Publish a side-private soldier line labeled for the commander or squad from an explicitly selected unit.","inputSchema":{"type":"object","required":["unitRef","text","to"],"additionalProperties":false,"properties":{"unitRef":{"type":"string","minLength":1,"maxLength":80},"text":{"type":"string","minLength":1,"maxLength":240},"to":{"type":"string","enum":["commander","squad"]}}},"redacts":["privateComms"]},{"name":"start_coop_match","transportId":"official-mcp","description":"Starts a co-op match where the player plays alongside an AI squad that Mochi runs. Returns a join link the player opens to play. Call this once when the player asks to play. If a match is already running, it returns that match's link instead of starting another. Pass general_voice when the player has told you how the in-game General should act.","inputSchema":{"type":"object","properties":{"general_voice":{"type":"string","description":"Optional. How the player wants the in-game General to act, as a sentence or two about personality and tone (for example: \"a calm veteran partner with dry humour\"). Never orders or rules.","maxLength":300},"player_notes":{"type":"string","description":"Optional. Short notes from your mochi-learning.md that help the game understand how this player commands: their words, corrections and named plays. Knowledge only, never orders.","maxLength":1500}},"additionalProperties":false},"redacts":[]},{"name":"send_order","transportId":"official-mcp","description":"Passes the player's order to their AI squad during a match, such as 'hold B' or 'push with me'. Put the player's exact words in player_words without rewording them, and your own one-line reading of it in agent_summary. Returns quickly with a state: done, answered, proposed, failed, or accepted (the squad is on it; check get_match_status for the result). The squad plays on its own between orders, so only send what the player asked for.","inputSchema":{"type":"object","properties":{"player_words":{"type":"string","description":"The player's order, word for word, exactly as they said or typed it.","maxLength":500},"agent_summary":{"type":"string","description":"Optional. Your one-line reading of what the player wants.","maxLength":300}},"required":["player_words"],"additionalProperties":false},"redacts":[]},{"name":"get_match_status","transportId":"official-mcp","description":"Reads the current match: score, how each squadmate is doing, whether Mochi is ready, and what happened since the last check. Pass the cursor from your previous call as since to get only new events.","inputSchema":{"type":"object","properties":{"since":{"type":"integer","minimum":0,"description":"The cursor returned by your previous get_match_status call. Omit on the first call."}},"additionalProperties":false},"redacts":[]},{"name":"get_debrief","transportId":"official-mcp","description":"Summarises the player's last match after it ends: the result and the moments that decided it.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"redacts":[]},{"name":"stop_match","transportId":"official-mcp","description":"Stops the running match and takes Mochi's squad out of it right away.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"redacts":[]},{"name":"start_friend_match","transportId":"official-mcp","description":"Continues your side of an independently accepted invitation. Each player must call through their own current Muse authorization. The server checks both players' energy and funding before starting; a pending response has no playable match or join link. Use the current invitation revision and only your own General voice and notes.","inputSchema":{"type":"object","properties":{"invite_id":{"type":"string","pattern":"^invite-[a-f0-9]{24}$"},"revision":{"type":"integer","minimum":1},"general_voice":{"type":"string","maxLength":300},"player_notes":{"type":"string","maxLength":1500}},"required":["invite_id","revision"],"additionalProperties":false},"redacts":[]},{"name":"create_friend_invite","transportId":"official-mcp","description":"Offers a private two-player friend match to an existing Mochi friend. The friend must accept independently from their own account. This records consent and sends no message. No Game starts or energy is spent by this tool.","inputSchema":{"type":"object","properties":{"friend_id":{"type":"string","pattern":"^nse_[a-f0-9]{64}$"}},"required":["friend_id"],"additionalProperties":false},"redacts":[]},{"name":"friend_invite_status","transportId":"official-mcp","description":"Reads an invitation belonging to the signed-in player. Acceptance records consent; match setup and start still require both players' current authorization and eligibility.","inputSchema":{"type":"object","properties":{"invite_id":{"type":"string","pattern":"^invite-[a-f0-9]{24}$"}},"required":["invite_id"],"additionalProperties":false},"redacts":[]},{"name":"accept_friend_invite","transportId":"official-mcp","description":"Accepts the current invitation as its invited player, using the revision returned by friend_invite_status. A host-reported chat reply cannot accept for the friend. Consent alone does not start a match.","inputSchema":{"type":"object","properties":{"invite_id":{"type":"string","pattern":"^invite-[a-f0-9]{24}$"},"revision":{"type":"integer","minimum":1}},"required":["invite_id","revision"],"additionalProperties":false},"redacts":[]},{"name":"cancel_friend_invite","transportId":"official-mcp","description":"Withdraws consent from the current invitation using its last read revision. This records cancellation; resource closure and any unstarted-match energy release are confirmed separately by the match lifecycle.","inputSchema":{"type":"object","properties":{"invite_id":{"type":"string","pattern":"^invite-[a-f0-9]{24}$"},"revision":{"type":"integer","minimum":1}},"required":["invite_id","revision"],"additionalProperties":false},"redacts":[]},{"name":"get_my_profile","transportId":"official-mcp","description":"Reads the player's Mochi gamertag and saved social privacy preferences. A saved digest preference does not mean daily email digests are being sent.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"redacts":[]},{"name":"get_friend_code","transportId":"official-mcp","description":"Returns the player's friend code, like 7KQM-X4RT, for them to share with a friend themselves. Pass rotate true only if the player asks for a new code; the old one stops working.","inputSchema":{"type":"object","properties":{"rotate":{"type":"boolean","description":"Issue a fresh code and retire the old one."}},"additionalProperties":false},"redacts":[]},{"name":"add_friend","transportId":"official-mcp","description":"Redeems a friend code the player got from a friend. This sends that friend a request they accept on their side; if they already asked the player, it completes right away. Only use a code the player gave you; never guess one.","inputSchema":{"type":"object","properties":{"code":{"type":"string","description":"The friend code exactly as the player gave it.","maxLength":32}},"required":["code"],"additionalProperties":false},"redacts":[]},{"name":"list_friends","transportId":"official-mcp","description":"Lists the player's Sitrep friends, requests waiting on the player, and requests the player sent. Each entry has a friend_id for the other friend tools.","inputSchema":{"type":"object","properties":{"incoming_cursor":{"type":"string","maxLength":512,"description":"Use incoming_next_cursor from the previous list to read more incoming requests."}},"additionalProperties":false},"redacts":[]},{"name":"accept_friend","transportId":"official-mcp","description":"Accepts a friend request waiting on the player. Only call this when the player says yes to that request.","inputSchema":{"type":"object","properties":{"friend_id":{"type":"string","description":"The friend_id from list_friends.","maxLength":128}},"required":["friend_id"],"additionalProperties":false},"redacts":[]},{"name":"remove_friend","transportId":"official-mcp","description":"Unfriends someone, declines their request, or cancels the player's own request. Confirm with the player first.","inputSchema":{"type":"object","properties":{"friend_id":{"type":"string","description":"The friend_id from list_friends.","maxLength":128}},"required":["friend_id"],"additionalProperties":false},"redacts":[]},{"name":"block_friend","transportId":"official-mcp","description":"Blocks someone in the player's friend list or requests: ends the friendship and stops them sending requests. Confirm with the player first.","inputSchema":{"type":"object","properties":{"friend_id":{"type":"string","description":"The friend_id from list_friends.","maxLength":128}},"required":["friend_id"],"additionalProperties":false},"redacts":[]},{"name":"set_social_privacy","transportId":"official-mcp","description":"Changes Mochi social privacy preferences. Invisible mode affects friend presence after the Mochi friend-graph cutover is active; it does not hide statistics from leaderboards. The daily digest is a saved opt-in preference only: no daily digest emails are currently sent. Pass only what the player asked to change.","inputSchema":{"type":"object","properties":{"invisible":{"type":"boolean"},"digest_enabled":{"type":"boolean"}},"additionalProperties":false},"redacts":[]},{"name":"get_match_energy","transportId":"official-mcp","description":"Read your free match energy and next recharge time; grants no funding and starts no match.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"redacts":[]}],"wakeReasons":[{"id":"contact-spotted","description":"A soldier reported a contact the general should route.","urgency":"high","requiresSignature":true},{"id":"under-fire","description":"A unit is taking fire and needs a decision.","urgency":"high","requiresSignature":true},{"id":"owner-decision-window","description":"A call the human commander should make.","urgency":"high","requiresSignature":true},{"id":"deadline-approaching","description":"An objective deadline is approaching.","urgency":"high","requiresSignature":true},{"id":"emergency-no-human-time","description":"Deadline does not allow human input; emergency policy.","urgency":"high","requiresSignature":true}],"affordances":[{"id":"observe-visible-state","kind":"observe","description":"Read the side-redacted visible match state for the paired commander.","tool":"sitrep_observe","requiresApproval":false,"serverValidated":true},{"id":"publish-soldier-comms","kind":"notify","description":"Publish a soldier-attributed line to the commander or squad.","tool":"sitrep_comms","wakeReason":"under-fire","requiresApproval":false,"serverValidated":true}],"redaction":{"hiddenState":["enemyPlan","fogTiles","enemyStrategyMd","privateComms"],"pii":["commanderId","voiceUserId"],"publicTelemetry":["ownUnits","visibleContacts","contactAgeMs","contactConfidence","capturedPosts","deadlineAt","legalCommands","lifePoolRemaining"]},"rules":{"serverValidation":{"required":true,"authority":"game_server"},"contractEditsRequireApproval":true,"memoryIsNotCanon":true,"prohibited":["screen_scraping","input_injection","hidden_state_exfiltration","unsupported_gameplay_automation"]}}