{"apiVersion":"v1","directorySlug":"caputchin-mcp-ebed3701e1","title":"Caputchin","description":"Caputchin replaces the surveillance circus with games. No cookies, no fingerprinting, no fire hydrants. Just a small challenge bots fail and humans enjoy.","pageUrl":"https://www.mcpbundles.com/skills/caputchin-mcp-ebed3701e1","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://api.caputchin.com/mcp","hostedMcpUrl":null,"toolCount":81,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"com.caputchin/caputchin-mcp-ebed3701e1","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"caputchin_ping","description":"Health check. Proves the management token + API are reachable. Returns the (possibly empty) site list.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"caputchin_ping","displayName":"caputchin_ping","title":"caputchin_ping","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_list_sites","description":"List all site keys owned by the authed account.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"caputchin_list_sites","displayName":"caputchin_list_sites","title":"caputchin_list_sites","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_create_site","description":"Create a new site key inside a troop. The site secret is returned ONCE. Origin allowlist is managed separately via caputchin_update_site_cap_config (cors_origins). Tier is inherited from the owning troop (there is no per-site tier). `troop_id` is required for troop-PAT callers (no implicit default); session and account-PAT callers default to the personal troop when omitted.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_create_site","displayName":"caputchin_create_site","title":"caputchin_create_site","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_site","description":"Fetch one site by id.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_get_site","displayName":"caputchin_get_site","title":"caputchin_get_site","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_update_site","description":"Update fields on a site. Only supplied fields change. Origin allowlist is managed separately via caputchin_update_site_cap_config (cors_origins). Tier is owned by the troop (there is no per-site tier). `troop_id` is immutable post-creation (ADR-0022).","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"name":{"type":"string"},"disabled":{"type":"boolean"}},"additionalProperties":false},"logicalName":"caputchin_update_site","displayName":"caputchin_update_site","title":"caputchin_update_site","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_delete_site","description":"Delete a site. Permanent.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_delete_site","displayName":"caputchin_delete_site","title":"caputchin_delete_site","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_rotate_site_secret","description":"Issue a new site secret. Returned ONCE; the old secret stops verifying immediately.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_rotate_site_secret","displayName":"caputchin_rotate_site_secret","title":"caputchin_rotate_site_secret","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_site_stats","description":"Aggregate counts (sessions_started / sessions_client_completed / sessions_server_verified).","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_site_stats","displayName":"caputchin_site_stats","title":"caputchin_site_stats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_list_site_sessions","description":"Paginated per-session diagnostic read for a site key. Cursor-based, newest-first by `started_at`. Alpha feature (Solo tier returns `feature-not-on-plan`); requires `read` perm. Aggregate counters live at caputchin_site_stats; this surface is for per-row triage. Privacy stance preserved: no IP / UA / payload data.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"game":{"type":"array","items":{"type":"string"}},"limit":{"type":"integer","maximum":100,"minimum":1},"since":{"type":"integer"},"until":{"type":"integer"},"cursor":{"type":"string"},"outcome":{"type":"array","items":{"enum":["verified","verify_rejected","redeem_rejected","pending","expired"],"type":"string"}},"nickname_search":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_list_site_sessions","displayName":"caputchin_list_site_sessions","title":"caputchin_list_site_sessions","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_site_cap_config","description":"Read the Cap-side config for a site (PoW difficulty/count, instrumentation obfuscation level, security filters, per-site rate limit, CORS).","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_get_site_cap_config","displayName":"caputchin_get_site_cap_config","title":"caputchin_get_site_cap_config","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_update_site_cap_config","description":"Update Cap-side config for a site. Partial update; only supplied fields change. `name` and `ratelimit_duration_ms` are platform-locked. `instrumentation` is tunable (ADR-0078): minted ON; set false to drop the JS instrumentation challenge so the embedding page no longer needs `'unsafe-eval'` in its CSP, at the cost of automated-browser detection (`obfuscation_level` and `block_automated_browsers` apply only while it is on).","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"difficulty":{"type":"integer","maximum":8,"minimum":1},"cors_origins":{"type":["array","null"],"items":{"type":"string"}},"ratelimit_max":{"type":["integer","null"],"maximum":10000,"minimum":1},"challenge_count":{"type":"integer","maximum":500,"minimum":1},"instrumentation":{"type":"boolean"},"required_headers":{"type":["array","null"],"items":{"type":"string"}},"obfuscation_level":{"type":"integer","maximum":10,"minimum":1},"block_automated_browsers":{"type":"boolean"}},"additionalProperties":false},"logicalName":"caputchin_update_site_cap_config","displayName":"caputchin_update_site_cap_config","title":"caputchin_update_site_cap_config","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_site_security","description":"Read the per-site security settings. `require_game=true` means verification on this site key must be gated by a game (server-replayed); false means it is proof-of-work only. `preview_mode` is this key's own preview setting (null = inherit the troop default); when effectively true the site key still serves its normal experience but the backend auto-approves every verification regardless of the solve (game replay and cap not enforced), a development aid that disables bot protection. `reuse` grants","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_get_site_security","displayName":"caputchin_get_site_security","title":"caputchin_get_site_security","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_update_site_security","description":"Update the per-site security settings. Provide at least one of `require_game` / `preview_mode` / `reuse` / `reuse_window_ms` / `reuse_persist` / `proxy_gate` / `proxy_ttl_seconds` / `proxy_fail_mode` / `proxy_path_scope` / `proxy_challenge_mode` / `proxy_locale` / `proxy_skin` / `proxy_cookie_name` / `proxy_callback_path`. `require_game=true` requires at least one installed marketplace game with a replayable artifact (its own or inherited from the troop), else the call is rejected. `preview_mode","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"reuse":{"type":["boolean","null"]},"proxy_gate":{"type":"boolean"},"proxy_skin":{"type":["string","null"]},"preview_mode":{"type":["boolean","null"]},"proxy_locale":{"type":["string","null"]},"require_game":{"type":"boolean"},"reuse_persist":{"type":["boolean","null"]},"proxy_fail_mode":{"type":["string","null"]},"reuse_window_ms":{"type":["integer","null"]},"proxy_path_scope":{"type":["object","null"],"properties":{"exclude":{"type":"array","items":{"type":"string"}},"include":{"type":"array","items":{"type":"string"}}},"additionalProperties":false},"proxy_cookie_name":{"type":["string","null"]},"proxy_ttl_seconds":{"type":["integer","null"]},"proxy_callback_path":{"type":["string","null"]},"proxy_challenge_mode":{"enum":["game","widget",null],"type":["string","null"]}},"additionalProperties":false},"logicalName":"caputchin_update_site_security","displayName":"caputchin_update_site_security","title":"caputchin_update_site_security","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_troop_security","description":"Read the troop-wide security settings. `force_game=true` means every site key in the troop is gated regardless of its own setting. `preview_mode` is the troop-wide preview default a site key inherits when it sets no own value (null = no default / false). `reuse` / `reuse_window_ms` / `reuse_persist` are the troop-wide verification-reuse defaults a site key inherits when it sets no own value (null = no default).","inputSchema":{"type":"object","required":["troop_id"],"properties":{"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_get_troop_security","displayName":"caputchin_get_troop_security","title":"caputchin_get_troop_security","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_update_troop_security","description":"Update the troop-wide security settings. Provide at least one of `force_game` / `preview_mode` / `reuse` / `reuse_window_ms` / `reuse_persist`. `force_game=true` gates every site key in the troop and requires at least one installed troop-level marketplace game with a replayable artifact, else the call is rejected. `preview_mode` sets the troop-wide preview default inherited by site keys with no own value (true auto-approves every verification regardless of the solve, with the real widget/game st","inputSchema":{"type":"object","required":["troop_id"],"properties":{"reuse":{"type":["boolean","null"]},"troop_id":{"type":"string"},"force_game":{"type":"boolean"},"preview_mode":{"type":["boolean","null"]},"reuse_persist":{"type":["boolean","null"]},"reuse_window_ms":{"type":["integer","null"]}},"additionalProperties":false},"logicalName":"caputchin_update_troop_security","displayName":"caputchin_update_troop_security","title":"caputchin_update_troop_security","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_list_tokens","description":"List active management tokens (metadata only).","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"caputchin_list_tokens","displayName":"caputchin_list_tokens","title":"caputchin_list_tokens","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_create_token","description":"Mint a new PAT. Full value returned ONCE. `type='troop'` (default) consumes one PAT seat and is later attached to troops via caputchin_attach_troop_pat; `type='account'` is master, free, capped at 1 active per account (409 if one exists). Troop-PATs cannot mint any PAT.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"},"type":{"enum":["troop","account"],"type":"string","default":"troop"}},"additionalProperties":false},"logicalName":"caputchin_create_token","displayName":"caputchin_create_token","title":"caputchin_create_token","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_revoke_token","description":"Revoke a management token by id.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_revoke_token","displayName":"caputchin_revoke_token","title":"caputchin_revoke_token","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_rotate_token","description":"Rotate a management token's credential in place. Returns the replacement value ONCE; the old token stops verifying immediately. The token row's id and name are unchanged across rotation; the leading 16-char prefix rotates together with the secret half. Audit-log correlation across rotation is by row id (machine) or name (human), not by prefix. Refused 403 if the calling token is the rotation target, or if the caller is a troop-PAT.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_rotate_token","displayName":"caputchin_rotate_token","title":"caputchin_rotate_token","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_hosted_verification","description":"Fetch the hosted-verification configuration for a site.","inputSchema":{"type":"object","required":["site_id"],"properties":{"site_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_get_hosted_verification","displayName":"caputchin_get_hosted_verification","title":"caputchin_get_hosted_verification","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_set_hosted_verification","description":"Set hosted-verification config (paid tier required).","inputSchema":{"type":"object","required":["site_id","enabled"],"properties":{"enabled":{"type":"boolean"},"site_id":{"type":"string"},"email_to":{"type":["string","null"],"format":"email"},"webhook_url":{"type":["string","null"],"format":"uri"}},"additionalProperties":false},"logicalName":"caputchin_set_hosted_verification","displayName":"caputchin_set_hosted_verification","title":"caputchin_set_hosted_verification","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_test_hosted_verification","description":"Fire a synthetic verified-submission payload at the configured destinations for a site (paid tier required). Returns the test session id and per-destination delivery status; does not call cap or write to replay-tracking.","inputSchema":{"type":"object","required":["site_id"],"properties":{"site_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_test_hosted_verification","displayName":"caputchin_test_hosted_verification","title":"caputchin_test_hosted_verification","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_account","description":"Fetch the authed account's metadata (id, email, created_at, support_access). Use this before proposing an email change so the new address differs from the current one.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"caputchin_get_account","displayName":"caputchin_get_account","title":"caputchin_get_account","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_list_troops","description":"List troops visible to the caller: own-account troops plus troops where the caller has a membership.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"caputchin_list_troops","displayName":"caputchin_list_troops","title":"caputchin_list_troops","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_create_troop","description":"Create a new shared troop on the caller's account. Requires the account's plan to grant the troops feature (Troop or Apex per ADR-0031). Troop-PATs cannot create troops.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_create_troop","displayName":"caputchin_create_troop","title":"caputchin_create_troop","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_troop","description":"Fetch a troop's metadata. Requires read OR manage permission in the troop.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_get_troop","displayName":"caputchin_get_troop","title":"caputchin_get_troop","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_rename_troop","description":"Rename a troop. Requires manage-troop permission.","inputSchema":{"type":"object","required":["troop_id","name"],"properties":{"name":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_rename_troop","displayName":"caputchin_rename_troop","title":"caputchin_rename_troop","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_delete_troop","description":"Delete a shared troop. Owner-only (session caller's account must own the troop, OR caller is the account-PAT on that account). Personal troops are not deletable. Cascades site keys + memberships; returns `cap_orphans` for any Cap-side failures.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_delete_troop","displayName":"caputchin_delete_troop","title":"caputchin_delete_troop","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_list_troop_members","description":"List user memberships in a troop. Requires read OR manage permission. Includes email, perms, and partial-scope site ids per row.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_list_troop_members","displayName":"caputchin_list_troop_members","title":"caputchin_list_troop_members","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_add_troop_member","description":"Invite a user to a troop by email. Creates the invitee's account if needed. Requires manage-troop permission. Consumes one user seat if the invitee is not already a member of any troop in this account (sharing across troops is free). Refused with 409 if no user seat is available.","inputSchema":{"type":"object","required":["troop_id","email","perms","scope"],"properties":{"email":{"type":"string"},"perms":{"type":"object","required":["create","edit","read","manage"],"properties":{"edit":{"type":"boolean"},"read":{"type":"boolean"},"create":{"type":"boolean"},"manage":{"type":"boolean"}},"additionalProperties":false},"scope":{"oneOf":[{"type":"object","required":["kind"],"properties":{"kind":{"const":"full"}},"additionalProperties":false},{"type":"object","required":["kind","site_ids"],"properties":{"kind":{"const":"partial"},"site_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false}]},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_add_troop_member","displayName":"caputchin_add_troop_member","title":"caputchin_add_troop_member","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_update_troop_member","description":"Update a member's perms and scope. Requires manage-troop permission. Stripping every perm is refused (`no-perms-granted`); call caputchin_remove_troop_member to remove the member.","inputSchema":{"type":"object","required":["troop_id","membership_id","perms","scope"],"properties":{"perms":{"type":"object","required":["create","edit","read","manage"],"properties":{"edit":{"type":"boolean"},"read":{"type":"boolean"},"create":{"type":"boolean"},"manage":{"type":"boolean"}},"additionalProperties":false},"scope":{"oneOf":[{"type":"object","required":["kind"],"properties":{"kind":{"const":"full"}},"additionalProperties":false},{"type":"object","required":["kind","site_ids"],"properties":{"kind":{"const":"partial"},"site_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false}]},"troop_id":{"type":"string"},"membership_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_update_troop_member","displayName":"caputchin_update_troop_member","title":"caputchin_update_troop_member","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_remove_troop_member","description":"Remove a member from a troop. Requires manage-troop. If this is the member's last troop in this account, the user seat is freed.","inputSchema":{"type":"object","required":["troop_id","membership_id"],"properties":{"troop_id":{"type":"string"},"membership_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_remove_troop_member","displayName":"caputchin_remove_troop_member","title":"caputchin_remove_troop_member","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_list_troop_pats","description":"List troop-PAT memberships in a troop. Requires read OR manage permission. Includes PAT name/prefix, perms, and partial-scope site ids per row.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_list_troop_pats","displayName":"caputchin_list_troop_pats","title":"caputchin_list_troop_pats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_attach_troop_pat","description":"Attach an existing troop-PAT (minted via caputchin_create_token type='troop') to a troop with the given perms and scope. Requires manage-troop. No seat is consumed; the troop-PAT seat was claimed at mint time and sharing across troops is free.","inputSchema":{"type":"object","required":["troop_id","pat_id","perms","scope"],"properties":{"perms":{"type":"object","required":["create","edit","read","manage"],"properties":{"edit":{"type":"boolean"},"read":{"type":"boolean"},"create":{"type":"boolean"},"manage":{"type":"boolean"}},"additionalProperties":false},"scope":{"oneOf":[{"type":"object","required":["kind"],"properties":{"kind":{"const":"full"}},"additionalProperties":false},{"type":"object","required":["kind","site_ids"],"properties":{"kind":{"const":"partial"},"site_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false}]},"pat_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_attach_troop_pat","displayName":"caputchin_attach_troop_pat","title":"caputchin_attach_troop_pat","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_update_troop_pat","description":"Update a troop-PAT membership's perms and scope. Requires manage-troop. Stripping every perm is refused; call caputchin_detach_troop_pat.","inputSchema":{"type":"object","required":["troop_id","membership_id","perms","scope"],"properties":{"perms":{"type":"object","required":["create","edit","read","manage"],"properties":{"edit":{"type":"boolean"},"read":{"type":"boolean"},"create":{"type":"boolean"},"manage":{"type":"boolean"}},"additionalProperties":false},"scope":{"oneOf":[{"type":"object","required":["kind"],"properties":{"kind":{"const":"full"}},"additionalProperties":false},{"type":"object","required":["kind","site_ids"],"properties":{"kind":{"const":"partial"},"site_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false}]},"troop_id":{"type":"string"},"membership_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_update_troop_pat","displayName":"caputchin_update_troop_pat","title":"caputchin_update_troop_pat","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_detach_troop_pat","description":"Detach a troop-PAT from a troop. Requires manage-troop. The PAT itself stays (its seat is not freed; revoke it via caputchin_revoke_token if no longer needed).","inputSchema":{"type":"object","required":["troop_id","membership_id"],"properties":{"troop_id":{"type":"string"},"membership_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_detach_troop_pat","displayName":"caputchin_detach_troop_pat","title":"caputchin_detach_troop_pat","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_seats","description":"Account-level seat summary. `user_used + pat_used <= total`, where `user_used` is distinct cross-account members across the account's troops and `pat_used` is the MAX non-revoked troop-PAT attachment count across the account's troops (the busiest troop's count; token rows themselves are free, what costs a seat is pushing a troop above the binding max). Account-PAT or session-cookie callers only; troop-PATs are refused.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"caputchin_get_seats","displayName":"caputchin_get_seats","title":"caputchin_get_seats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_invite_seat_user","description":"Invite a user (by email) to one or more troops in a single action. One user seat consumed regardless of how many troops they land in (sharing is free per ADR-0023). Multi-troop requires full scope. Account-PAT or session-cookie callers only; troop-PATs are refused.","inputSchema":{"type":"object","required":["email","troop_ids","perms","scope"],"properties":{"email":{"type":"string"},"perms":{"type":"object","required":["create","edit","read","manage"],"properties":{"edit":{"type":"boolean"},"read":{"type":"boolean"},"create":{"type":"boolean"},"manage":{"type":"boolean"}},"additionalProperties":false},"scope":{"oneOf":[{"type":"object","required":["kind"],"properties":{"kind":{"const":"full"}},"additionalProperties":false},{"type":"object","required":["kind","site_ids"],"properties":{"kind":{"const":"partial"},"site_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false}]},"troop_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false},"logicalName":"caputchin_invite_seat_user","displayName":"caputchin_invite_seat_user","title":"caputchin_invite_seat_user","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_remove_seat_user","description":"Remove a user from every troop they hold a membership in within this account. Emits one `troop.member.remove` audit row per affected troop. Account-PAT or session-cookie callers only; troop-PATs are refused.","inputSchema":{"type":"object","required":["member_account_id"],"properties":{"member_account_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_remove_seat_user","displayName":"caputchin_remove_seat_user","title":"caputchin_remove_seat_user","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_mint_seat_pat","description":"Mint a new troop-PAT and attach it to one or more troops in one action. One PAT seat consumed regardless of attachment count. Multi-troop attach enforces full scope. Account-PAT or session-cookie callers only; troop-PATs are refused.","inputSchema":{"type":"object","required":["name","troop_ids","perms","scope"],"properties":{"name":{"type":"string"},"perms":{"type":"object","required":["create","edit","read","manage"],"properties":{"edit":{"type":"boolean"},"read":{"type":"boolean"},"create":{"type":"boolean"},"manage":{"type":"boolean"}},"additionalProperties":false},"scope":{"oneOf":[{"type":"object","required":["kind"],"properties":{"kind":{"const":"full"}},"additionalProperties":false},{"type":"object","required":["kind","site_ids"],"properties":{"kind":{"const":"partial"},"site_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false}]},"troop_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false},"logicalName":"caputchin_mint_seat_pat","displayName":"caputchin_mint_seat_pat","title":"caputchin_mint_seat_pat","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_revoke_seat_pat","description":"Revoke a troop-PAT and hard-detach it from every troop it was a member of. Emits `account.pat.revoke` plus one `troop.pat.global-revoke` per affected troop. Account-PAT or session-cookie callers only; troop-PATs are refused.","inputSchema":{"type":"object","required":["pat_id"],"properties":{"pat_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_revoke_seat_pat","displayName":"caputchin_revoke_seat_pat","title":"caputchin_revoke_seat_pat","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_attach_seat_pat","description":"Attach an existing troop-PAT to additional troops. No seat consumed (the seat was claimed at mint time). Multi-troop attach enforces full scope. Account-PAT or session-cookie callers only; troop-PATs are refused.","inputSchema":{"type":"object","required":["pat_id","troop_ids","perms","scope"],"properties":{"perms":{"type":"object","required":["create","edit","read","manage"],"properties":{"edit":{"type":"boolean"},"read":{"type":"boolean"},"create":{"type":"boolean"},"manage":{"type":"boolean"}},"additionalProperties":false},"scope":{"oneOf":[{"type":"object","required":["kind"],"properties":{"kind":{"const":"full"}},"additionalProperties":false},{"type":"object","required":["kind","site_ids"],"properties":{"kind":{"const":"partial"},"site_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false}]},"pat_id":{"type":"string"},"troop_ids":{"type":"array","items":{"type":"string"},"minItems":1}},"additionalProperties":false},"logicalName":"caputchin_attach_seat_pat","displayName":"caputchin_attach_seat_pat","title":"caputchin_attach_seat_pat","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_me_billing","description":"Read the authed account's billing snapshot (plan, seats totals, Stripe customer id, current period). Plan changes and seat purchases are NOT exposed via MCP; they run through the in-app billing surface only.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"caputchin_me_billing","displayName":"caputchin_me_billing","title":"caputchin_me_billing","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_quick_stats_sites","description":"Today's compact totals for each site key under a troop. Requires troop-read. Use for list-page card numbers; for full breakdowns use the per-site stats tools.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_quick_stats_sites","displayName":"caputchin_quick_stats_sites","title":"caputchin_quick_stats_sites","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_quick_stats_troops","description":"Today's compact totals for each troop visible to the caller. No filtering; same visibility set as caputchin_list_troops.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"caputchin_quick_stats_troops","displayName":"caputchin_quick_stats_troops","title":"caputchin_quick_stats_troops","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_account_audit_logs","description":"Account-level audit log (Apex-only). Troop-PATs are refused. Returns events on account-scoped operations (troop CRUD, account-PAT mint, plan changes, etc.). Cursor-paginated, newest-first.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","maximum":200,"minimum":1},"since":{"type":"integer"},"until":{"type":"integer"},"action":{"type":"array","items":{"type":"string"}},"cursor":{"type":"string"},"outcome":{"enum":["success","denied","all"],"type":"string"},"target_search":{"type":"string"},"principal_type":{"enum":["session","pat","all"],"type":"string"},"principal_search":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_account_audit_logs","displayName":"caputchin_account_audit_logs","title":"caputchin_account_audit_logs","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_site_audit_logs","description":"Site-key-level audit log (Apex-only). Requires troop-read reaching the site. Returns events scoped to that site key (config edits, secret rotations, hosted-verification changes). Cursor-paginated, newest-first.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"limit":{"type":"integer","maximum":200,"minimum":1},"since":{"type":"integer"},"until":{"type":"integer"},"action":{"type":"array","items":{"type":"string"}},"cursor":{"type":"string"},"outcome":{"enum":["success","denied","all"],"type":"string"},"target_search":{"type":"string"},"principal_type":{"enum":["session","pat","all"],"type":"string"},"principal_search":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_site_audit_logs","displayName":"caputchin_site_audit_logs","title":"caputchin_site_audit_logs","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_troop_audit_logs","description":"Troop-level audit log (Apex-only). Requires troop-read OR manage. Returns events scoped to the troop (membership, PAT attach/detach, troop-config changes). Cursor-paginated, newest-first.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"limit":{"type":"integer","maximum":200,"minimum":1},"since":{"type":"integer"},"until":{"type":"integer"},"action":{"type":"array","items":{"type":"string"}},"cursor":{"type":"string"},"outcome":{"enum":["success","denied","all"],"type":"string"},"troop_id":{"type":"string"},"target_search":{"type":"string"},"principal_type":{"enum":["session","pat","all"],"type":"string"},"principal_search":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_troop_audit_logs","displayName":"caputchin_troop_audit_logs","title":"caputchin_troop_audit_logs","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_site_delivery_dashboard","description":"Per-site hosted-verification delivery dashboard: lifetime totals + time-series counts of webhook / email outcomes. Requires troop-read on the owning troop.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"end":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_site_delivery_dashboard","displayName":"caputchin_site_delivery_dashboard","title":"caputchin_site_delivery_dashboard","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_troop_delivery_dashboard","description":"Per-troop hosted-verification delivery dashboard: aggregated across all the troop's sites. Requires troop-read.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"end":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_troop_delivery_dashboard","displayName":"caputchin_troop_delivery_dashboard","title":"caputchin_troop_delivery_dashboard","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_site_stats_activity","description":"Per-site activity timeseries (sessions over time). Requires troop-read on the owning troop.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"end":{"type":"string"},"game":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_site_stats_activity","displayName":"caputchin_site_stats_activity","title":"caputchin_site_stats_activity","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_site_stats_dashboard","description":"Per-site lifetime totals plus dashboard tiles. Requires troop-read.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"end":{"type":"string"},"game":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_site_stats_dashboard","displayName":"caputchin_site_stats_dashboard","title":"caputchin_site_stats_dashboard","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_site_stats_durations","description":"Per-site verification durations timeseries. Requires troop-read. `measure` picks the aggregate (default median).","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"end":{"type":"string"},"game":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"},"measure":{"enum":["median","p50","p75","p90","p95","p99","mean"],"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_site_stats_durations","displayName":"caputchin_site_stats_durations","title":"caputchin_site_stats_durations","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_site_stats_rejections","description":"Per-site rejection-reason breakdown timeseries. Requires troop-read.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"},"end":{"type":"string"},"game":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_site_stats_rejections","displayName":"caputchin_site_stats_rejections","title":"caputchin_site_stats_rejections","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_troop_stats","description":"Per-troop lifetime aggregate counts across all sites in the troop. Requires troop-read.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"end":{"type":"string"},"game":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_troop_stats","displayName":"caputchin_troop_stats","title":"caputchin_troop_stats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_troop_stats_activity","description":"Per-troop activity timeseries (aggregated across sites). Requires troop-read.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"end":{"type":"string"},"game":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_troop_stats_activity","displayName":"caputchin_troop_stats_activity","title":"caputchin_troop_stats_activity","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_troop_stats_dashboard","description":"Per-troop lifetime totals plus dashboard tiles. Requires troop-read.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"end":{"type":"string"},"game":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_troop_stats_dashboard","displayName":"caputchin_troop_stats_dashboard","title":"caputchin_troop_stats_dashboard","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_troop_stats_durations","description":"Per-troop verification durations timeseries. Requires troop-read.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"end":{"type":"string"},"game":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"},"measure":{"enum":["median","p50","p75","p90","p95","p99","mean"],"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_troop_stats_durations","displayName":"caputchin_troop_stats_durations","title":"caputchin_troop_stats_durations","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_troop_stats_rejections","description":"Per-troop rejection-reason breakdown timeseries. Requires troop-read.","inputSchema":{"type":"object","required":["troop_id"],"properties":{"end":{"type":"string"},"game":{"type":"string"},"range":{"enum":["today","yesterday","last7days","last28days","alltime","custom"],"type":"string"},"start":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_troop_stats_rejections","displayName":"caputchin_troop_stats_rejections","title":"caputchin_troop_stats_rejections","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_list_games","description":"List all indexed marketplace games. Returns the full catalog ordered by repo coordinate. Wrapper (collection) rows include a childCount field. No manifest enrichment; lightweight catalog snapshot only.","inputSchema":{"type":"object","properties":{},"additionalProperties":false},"logicalName":"caputchin_list_games","displayName":"caputchin_list_games","title":"caputchin_list_games","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_search_games","description":"List or search marketplace games (runnable, non-wrapper rows only), ordered alphabetically by id and paginated. Omit q (or pass empty) for the catalog start; pass a substring to filter. Returns up to 30 games plus next_cursor — pass it back as cursor to fetch the following page (null when exhausted).","inputSchema":{"type":"object","required":[],"properties":{"q":{"type":"string"},"cursor":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_search_games","displayName":"caputchin_search_games","title":"caputchin_search_games","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_game","description":"Fetch one marketplace game by id (a GitHub coordinate that may contain slashes, e.g. owner/repo). Returns manifest enrichment (name, description, categories, presetNames, shell) plus child rows for wrapper games.","inputSchema":{"type":"object","required":["id"],"properties":{"id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_get_game","displayName":"caputchin_get_game","title":"caputchin_get_game","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_list_white_label_presets","description":"List the widget-shell white-label presets for one axis (Apex tier). Provide troop_id or site_id.","inputSchema":{"type":"object","required":["axis"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_list_white_label_presets","displayName":"caputchin_list_white_label_presets","title":"caputchin_list_white_label_presets","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_set_white_label_preset","description":"Create or replace one widget-shell white-label preset (Apex tier). Empty leaf values are not persisted. Set previous_name to rename an existing preset.","inputSchema":{"type":"object","required":["axis","name","values"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"name":{"type":"string"},"values":{"type":"object","additionalProperties":true},"site_id":{"type":"string"},"troop_id":{"type":"string"},"previous_name":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_set_white_label_preset","displayName":"caputchin_set_white_label_preset","title":"caputchin_set_white_label_preset","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_delete_white_label_preset","description":"Delete one widget-shell white-label preset (Apex tier).","inputSchema":{"type":"object","required":["axis","name"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"name":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_delete_white_label_preset","displayName":"caputchin_delete_white_label_preset","title":"caputchin_delete_white_label_preset","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_set_white_label_default","description":"Make a widget-shell preset THE default for its group (one per language for locale, per mode for skin, single for configuration), atomically clearing the prior default (Apex tier). Re-points a bundled preset (or, for a site-key caller, a troop-inherited one) via a thin same-name override. Pass lang for locale / theme for skin so the default lands in the right group.","inputSchema":{"type":"object","required":["axis","name"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"lang":{"type":"string"},"name":{"type":"string"},"theme":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_set_white_label_default","displayName":"caputchin_set_white_label_default","title":"caputchin_set_white_label_default","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_list_game_presets","description":"List a game's presets for one axis (configuration = Solo+, skin / locale = Alpha+).","inputSchema":{"type":"object","required":["game","axis"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"game":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_list_game_presets","displayName":"caputchin_list_game_presets","title":"caputchin_list_game_presets","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_set_game_preset","description":"Create or replace one game-axis preset (configuration = Solo+, skin / locale = Alpha+). Registers the game. Set previous_name to rename.","inputSchema":{"type":"object","required":["game","axis","name","values"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"game":{"type":"string"},"name":{"type":"string"},"values":{"type":"object","additionalProperties":true},"site_id":{"type":"string"},"troop_id":{"type":"string"},"previous_name":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_set_game_preset","displayName":"caputchin_set_game_preset","title":"caputchin_set_game_preset","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_delete_game_preset","description":"Delete one game-axis preset.","inputSchema":{"type":"object","required":["game","axis","name"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"game":{"type":"string"},"name":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_delete_game_preset","displayName":"caputchin_delete_game_preset","title":"caputchin_delete_game_preset","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_set_game_default","description":"Make a game-axis preset THE default for its group, atomically clearing the prior default (configuration = Solo+, skin / locale = Alpha+). Registers the game. Re-points a bundled / inherited preset via a thin same-name override. Pass lang for locale / theme for skin so the default lands in the right group.","inputSchema":{"type":"object","required":["game","axis","name"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"game":{"type":"string"},"lang":{"type":"string"},"name":{"type":"string"},"theme":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_set_game_default","displayName":"caputchin_set_game_default","title":"caputchin_set_game_default","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_custom_game_schema","description":"Get a custom (non-marketplace) game's editable-field schema for one axis.","inputSchema":{"type":"object","required":["game","axis"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"game":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_get_custom_game_schema","displayName":"caputchin_get_custom_game_schema","title":"caputchin_get_custom_game_schema","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_set_custom_game_schema","description":"Declare a custom game's editable fields for one axis (no tier gate; metadata only).","inputSchema":{"type":"object","required":["game","axis","schema"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"game":{"type":"string"},"schema":{"type":"object","additionalProperties":true},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_set_custom_game_schema","displayName":"caputchin_set_custom_game_schema","title":"caputchin_set_custom_game_schema","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_delete_custom_game_schema","description":"Delete a custom game's schema for one axis.","inputSchema":{"type":"object","required":["game","axis"],"properties":{"axis":{"enum":["locale","skin","configuration"],"type":"string"},"game":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_delete_custom_game_schema","displayName":"caputchin_delete_custom_game_schema","title":"caputchin_delete_custom_game_schema","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_list_customized_games","description":"List the games this scope is customizing (registry rows) with their marketplace / custom source.","inputSchema":{"type":"object","properties":{"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_list_customized_games","displayName":"caputchin_list_customized_games","title":"caputchin_list_customized_games","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_register_customized_game","description":"Register a game in the customized list (Solo+ tier) before authoring presets (create-once). source auto-derives from the marketplace catalog when omitted. Returns 409 game-already-registered if the game is already registered for the scope; advance the pin with caputchin_repin_customized_game (marketplace) or by re-uploading a run artifact (custom).","inputSchema":{"type":"object","required":["game"],"properties":{"game":{"type":"string"},"source":{"enum":["marketplace","custom"],"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"},"auto_update":{"type":"boolean"}},"additionalProperties":false},"logicalName":"caputchin_register_customized_game","displayName":"caputchin_register_customized_game","title":"caputchin_register_customized_game","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_repin_customized_game","description":"Manual update (Solo+ tier): advance an already-registered MARKETPLACE game to the current version, non-destructively (preserves created_at + presets/schemas; only the pin advances, plus auto_update if set). Returns 404 if the game is not registered, 409 repin-not-supported for a custom game (re-pin those by uploading a new run artifact).","inputSchema":{"type":"object","required":["game"],"properties":{"game":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"},"auto_update":{"type":"boolean"}},"additionalProperties":false},"logicalName":"caputchin_repin_customized_game","displayName":"caputchin_repin_customized_game","title":"caputchin_repin_customized_game","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_update_customized_game","description":"Update an installed game's auto_update preference (Solo+ tier). Does NOT change the pinned version; use caputchin_repin_customized_game to advance the pin (the manual update).","inputSchema":{"type":"object","required":["game","auto_update"],"properties":{"game":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"},"auto_update":{"type":"boolean"}},"additionalProperties":false},"logicalName":"caputchin_update_customized_game","displayName":"caputchin_update_customized_game","title":"caputchin_update_customized_game","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_delete_customized_game","description":"Delete a whole game customization (Solo+ tier). CASCADE: removes every preset (all axes) and every custom schema for the game, not just the registry row.","inputSchema":{"type":"object","required":["game"],"properties":{"game":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_delete_customized_game","displayName":"caputchin_delete_customized_game","title":"caputchin_delete_customized_game","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_upload_custom_game_run","description":"Upload the headless replay artifact for a custom game so it can be used as a verification gate. The game must already be registered via caputchin_register_customized_game with source=custom. files must include exactly one entry whose filename is 'run.js'; up to 16 additional .wasm or .js modules are allowed (5 MB per file, 10 MB combined). Returns the content-hash version and the self-check verdict.","inputSchema":{"type":"object","required":["game","files"],"properties":{"game":{"type":"string"},"files":{"type":"array","items":{"type":"object","required":["filename","content_base64"],"properties":{"filename":{"type":"string"},"content_base64":{"type":"string"}},"additionalProperties":false},"minItems":1},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_upload_custom_game_run","displayName":"caputchin_upload_custom_game_run","title":"caputchin_upload_custom_game_run","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_get_custom_game_run","description":"Get metadata for the active uploaded replay artifact (custom games only): version hash, upload time, self-check verdict, and per-file SRI. Returns null when no artifact has been uploaded yet.","inputSchema":{"type":"object","required":["game"],"properties":{"game":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_get_custom_game_run","displayName":"caputchin_get_custom_game_run","title":"caputchin_get_custom_game_run","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"caputchin_delete_custom_game_run","description":"Remove the active replay artifact for a custom game. The install reverts to non-gate-eligible (a gated site key will refuse it until a new artifact is uploaded). Idempotent.","inputSchema":{"type":"object","required":["game"],"properties":{"game":{"type":"string"},"site_id":{"type":"string"},"troop_id":{"type":"string"}},"additionalProperties":false},"logicalName":"caputchin_delete_custom_game_run","displayName":"caputchin_delete_custom_game_run","title":"caputchin_delete_custom_game_run","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=Caputchin&config=eyJ1cmwiOiAiaHR0cHM6Ly9hcGkuY2FwdXRjaGluLmNvbS9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22Caputchin%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapi.caputchin.com%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22Caputchin%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fapi.caputchin.com%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=Caputchin&connectorUrl=https%3A%2F%2Fapi.caputchin.com%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"Caputchin\" --url \"https://api.caputchin.com/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/caputchin-mcp-ebed3701e1","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/caputchin-mcp-ebed3701e1/tools/{tool}","mcpServerUrl":"https://api.caputchin.com/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/caputchin-mcp-ebed3701e1?live=1"}