# AI Game Portal > A portal for browser games made with AI assistants. Games are published > through MCP, not through an upload form. ## Publishing a game The connector address is https://games.bigbools.fi/mcp. It is the same for everyone and carries no secret, so it can be shared and an administrator can add it once for a whole organisation. It goes wherever you keep MCP servers or connectors — in your settings, not in a chat message. Which menu that is differs by application and moves between versions, so go by the requirement rather than by a path someone wrote down: a Streamable HTTP MCP server at this address, OAuth, nothing to paste but the address. You know your own settings better than this page can. It cannot be used by pasting it into a chat message or by fetching it over plain HTTP — a plain GET is not a valid session. Access is per person, by OAuth. An unauthenticated call answers 401 with a WWW-Authenticate header naming https://games.bigbools.fi/.well-known/oauth-protected-resource; from there the usual OAuth 2.1 flow applies — dynamic client registration is supported, PKCE with S256 is required, and the user signs in with Google and approves the client in a browser. The resulting token acts as that one person. There is also an older personal address, https://games.bigbools.fi/mcp/, which puts a secret in the URL. It still works, but it is one person's credential and is the wrong thing to hand to anyone else. Once connected, the flow is: 1. create_game { title, description?, tags? } -> returns the game id 2. put_file { id, file, content | contentBase64 } -> repeat per file, iteratively 3. publish_game { id } -> the game appears on the portal The rest of the tools: whoami, fork_game, get_file, list_files, delete_file, delete_game, upload_bundle, unpublish_game, update_game, list_games, get_game, import_from_repo, publish_plugin, list_plugins, get_plugin, configure_leaderboard, list_leaderboard, delete_leaderboard_entry, reset_leaderboard upload_bundle takes a whole build as a base64 zip, instead of a file at a time. ## What a game says about itself game.json at the root of the game, beside index.html, is where a game states its name, its tags and its description. create_game writes a first one from its arguments, and publish_game reads it onto the game's listing on the portal. { "title": "Space Taxi", "tags": ["arcade", "lander"], "description": { "fi": "Lentava taksi, laskeutumisalustoja ja bensa-asema.", "en": "A flying taxi, landing pads and a fuel station." } } description may equally be one plain string, and then reads the same in every language — a game that speaks one language never has to learn the object form. The portal shows Finnish and English; a visitor reading in one gets the other's text only when that is all there is. title and tags stay single-language: a name is a name, and tags are search words. It is at the root and not in config/, because config/ is what a game writes to while it runs and this is source you write by hand. It also comes along with import_from_repo without a repository being rearranged to suit the portal. Edit it in the same change that changes the game. A description that lives only on the portal is one nothing you edit can reach, so it goes on describing a game that has moved on — which is exactly what this file is for. update_game still writes the row directly, and is what a game with no game.json needs, but where the file exists the next publish writes over whatever update_game set. A game with no game.json is left alone: its listing keeps whatever it already had. A game.json that is not valid JSON, or that does not fit the format, does not hold up the publish — the game reaches players and publish_game answers with a warning saying what is wrong with the file. ## Two copies of every game Every tool that writes works on the game's working version. Players are served the published copy, so editing a published game does not disturb anyone. publish_game replaces the published copy with the working version as a whole — it does not merge. A file deleted from the working version therefore disappears from the published game at the next publish. The size allowance is measured on the working version only. Publishing also moves the game's address on. A published game is served from .../live-r/, where n counts publishes, and get_game's playUrl always names the current one. Nothing is stored per revision — the number is in the path so that publishing gives every file under it an address no browser has cached, which is the only way a relative