{"ok":true,"site":{"host":"teamrocket.website","url":"https://www.teamrocket.website/webmcp","type":"live","desc":"Every tool this site registers for AI agents through WebMCP, with its schema, rendered from the same definitions the pages register.","tools":[{"name":"list_builds","kind":"answer","impl":"imperative","description":"List every build on this site: slug, name, the problem it solves, its approach, tier and URL. Call this first to learn what the site can do, then open_build to reach one.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp","pages":["/webmcp","/","/taskboard","/this-or-that","/policy-diff","/skill-gap"]},{"name":"open_build","kind":"act","impl":"imperative","description":"Navigate to a build's page. Each build registers its own tools only while its page is open, so call this before trying to use them.","inputSchema":{"type":"object","properties":{"slug":{"type":"string","enum":["ambient","captured","taskboard","this-or-that","policy-diff","skill-gap"],"description":"The build's slug, from list_builds."}},"required":["slug"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp","pages":["/webmcp","/","/taskboard","/this-or-that","/policy-diff","/skill-gap"]},{"name":"get_setup_status","kind":"answer","impl":"imperative","description":"Check which API keys the user has stored in this browser, as booleans only. Every build needs a Gemini key; Places and Pixabay only improve imagery. Key values are never readable or settable through tools.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp","pages":["/webmcp","/","/taskboard","/this-or-that","/policy-diff","/skill-gap"]},{"name":"open_key_panel","kind":"act","impl":"imperative","description":"Open the key panel so the user can type an API key themselves. Use it when get_setup_status shows a missing key. Never ask the user to paste a key into the chat.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/webmcp","pages":["/webmcp","/","/taskboard","/this-or-that","/policy-diff","/skill-gap"]},{"name":"taskboard_get_state","kind":"answer","impl":"imperative","description":"Read the whole board: goal, timeframe, every task with its id, stage, weight, when it last moved and how many days it has sat idle, the effort-weighted progress percent, and the latest triage verdict. Call this before moving or removing anything so you have real ids.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/taskboard","pages":["/taskboard"]},{"name":"taskboard_set_goal","kind":"act","impl":"imperative","description":"Set the goal and rough timeframe, then build the board from it: a planner agent breaks the goal into 5 to 9 effort-weighted tasks, all starting in todo. Needs a Gemini key. Fails if a board already exists; reset first or add tasks to it instead.","inputSchema":{"type":"object","properties":{"goal":{"type":"string","description":"The outcome the user wants, in one or two sentences. Example: Ship the self-serve onboarding flow."},"horizon":{"type":"string","description":"Optional rough timeframe in words, like \"about six weeks\". Leave empty if the user gave none."}},"required":["goal"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/taskboard","pages":["/taskboard"]},{"name":"taskboard_add_task","kind":"act","impl":"imperative","description":"Add one card to the board. Use it for work the planner missed or that the user names later. Weight sizes the card's share of the progress bar.","inputSchema":{"type":"object","properties":{"title":{"type":"string","description":"Two to five words naming the deliverable."},"detail":{"type":"string","description":"Optional one sentence saying what done means for this task."},"stage":{"type":"string","enum":["todo","doing","done"],"description":"Column id. \"todo\" is Not started, \"doing\" is In progress, \"done\" is Done. Defaults to todo."},"weight":{"type":"integer","minimum":1,"maximum":5,"description":"Effort from 1 (under an hour) to 5 (several days). Defaults to 3."}},"required":["title"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/taskboard","pages":["/taskboard"]},{"name":"taskboard_move_task","kind":"act","impl":"imperative","description":"Move a task to another column. Moving resets its idle clock. Use taskboard_get_state first to get the id.","annotations":{"idempotentHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The task id exactly as returned by taskboard_get_state (looks like t_abc123)."},"stage":{"type":"string","enum":["todo","doing","done"],"description":"Column id. \"todo\" is Not started, \"doing\" is In progress, \"done\" is Done."}},"required":["id","stage"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/taskboard","pages":["/taskboard"]},{"name":"taskboard_remove_task","kind":"act","impl":"imperative","description":"Delete a task from the board. Destructive: the page shows a confirm bar and this call waits until the user presses Confirm. Tell the user to look for it.","annotations":{"destructiveHint":true,"consequentialHint":true},"inputSchema":{"type":"object","properties":{"id":{"type":"string","description":"The task id exactly as returned by taskboard_get_state (looks like t_abc123)."}},"required":["id"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/taskboard","pages":["/taskboard"]},{"name":"taskboard_triage","kind":"act","impl":"imperative","description":"Ask the triage agent what is being neglected. It weighs each task's effort against its idle days and returns a blunt headline, the one task to do next, and a per-task flag (neglected, watch or ok) that the board then shows on the cards. Needs a Gemini key and a non-empty board.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/taskboard","pages":["/taskboard"]},{"name":"taskboard_age_board","kind":"act","impl":"imperative","description":"Demo control: rewind every unfinished card's idle clock by 3 to 20 days so neglect is observable right now. Use it before taskboard_triage when the board was just built.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/taskboard","pages":["/taskboard"]},{"name":"taskboard_reset","kind":"act","impl":"imperative","description":"Clear the board and go back to the goal screen. Destructive: waits for the user to press Confirm on the page.","annotations":{"destructiveHint":true,"consequentialHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/taskboard","pages":["/taskboard"]},{"name":"thisorthat_get_state","kind":"answer","impl":"imperative","description":"Read where the table is: phase (setup, dealing, handoff, swipe or result), the setup answers, whose turn it is, the card on screen, how many cards that voter has left, every member's yes and no lists, and the result once counted. Call this before voting.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/this-or-that","pages":["/this-or-that"]},{"name":"thisorthat_setup","kind":"act","impl":"imperative","description":"Answer the whole setup at once and deal the deck: where the group is, how far they will go, any constraints, and who is eating. A deck agent then proposes 8 real restaurants (needs a Gemini key) and the first person's turn begins. Fails if a deck is already in play; reset first.","inputSchema":{"type":"object","properties":{"where":{"type":"string","description":"City, neighborhood or address, like \"Austin, TX\" or \"Adams Morgan, DC\"."},"mode":{"type":"string","enum":["walking","driving"],"description":"walking keeps it to about 15 minutes on foot; driving allows about 20 minutes by car. Defaults to driving."},"tags":{"type":"array","items":{"type":"string","enum":["cheap","quiet","veg","new","comfort","fast","drinks","outside"]},"description":"Preset constraints, any number: cheap (cheap eats), quiet (can hold a conversation), veg (vegetarian-friendly), new (somewhere new), comfort (comfort food), fast (in and out), drinks (a real bar), outside (outdoor seating)."},"craving":{"type":"string","description":"Anything else in the user's own words, like \"no cilantro\" or \"nothing too loud\". Optional."},"members":{"type":"array","items":{"type":"string"},"minItems":2,"maxItems":5,"description":"First names of everyone eating, 2 to 5 people. Each one swipes the deck in this order. If fewer than two are given, seats are filled with stand-in names."}},"required":["where","members"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/this-or-that","pages":["/this-or-that"]},{"name":"thisorthat_next_voter","kind":"act","impl":"imperative","description":"Start the current person's turn from the handoff screen, the same as pressing Start swiping. Returns who is up and their first card. Use it whenever get_state says the phase is handoff.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/this-or-that","pages":["/this-or-that"]},{"name":"thisorthat_vote","kind":"act","impl":"imperative","description":"Swipe the card on screen for the person whose turn it is: yes means they would eat there, no means pass. Returns the next card, or the handoff to the next person, or the counted result after the last swipe. Only ask the user for a preference when they have not already told you.","inputSchema":{"type":"object","properties":{"choice":{"type":"string","enum":["yes","no"],"description":"yes to swipe right (would eat here), no to pass."}},"required":["choice"]},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/this-or-that","pages":["/this-or-that"]},{"name":"thisorthat_get_result","kind":"act","impl":"imperative","description":"The table's pick once everyone has swiped: winner with a Maps link, runner-up, whether it was unanimous, the counted reasoning, and the full ranking with who said yes to what. Fails with whose turn it still is if the deck is not finished.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/this-or-that","pages":["/this-or-that"]},{"name":"thisorthat_reset","kind":"act","impl":"imperative","description":"Throw away the current deck and every vote and go back to setup. Destructive once a deck exists: waits for the user to press Confirm on the page.","annotations":{"destructiveHint":true,"consequentialHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/this-or-that","pages":["/this-or-that"]},{"name":"policydiff_get_state","kind":"answer","impl":"imperative","description":"Read what is loaded and how far the run got: character counts for the old and new versions, the current pipeline stage, the deterministic diff stats once computed, how many substantive changes were found, and whether a ranked result is ready.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/policy-diff","pages":["/policy-diff"]},{"name":"policydiff_set_documents","kind":"act","impl":"imperative","description":"Paste the two versions of a policy into the page. Pass the full text of each; the diff is paragraph-based, so keep paragraph breaks. Either field may be omitted to leave what is already in that box.","inputSchema":{"type":"object","properties":{"oldText":{"type":"string","description":"Full text of the earlier version."},"newText":{"type":"string","description":"Full text of the revised version."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/policy-diff","pages":["/policy-diff"]},{"name":"policydiff_load_sample","kind":"act","impl":"imperative","description":"Fill both boxes with a built-in sample pair: two versions of a cloud storage terms of service where an arbitration clause and a price rise are buried among renumbering. Use it to demo without documents in hand.","inputSchema":{"type":"object","properties":{"name":{"type":"string","enum":["nimbus-terms"],"description":"Which sample pair. Only nimbus-terms exists today; defaults to it."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/policy-diff","pages":["/policy-diff"]},{"name":"policydiff_run","kind":"act","impl":"imperative","description":"Run the pipeline on the loaded documents: a deterministic paragraph diff, then an extractor that drops renumbering noise and merges hunks into logical changes, then an explainer that translates each change into plain language and ranks it by real-world impact. Needs a Gemini key and both documents. Takes 20 to 60 seconds; the stages show on the page as they complete. Returns the stats, the changes with their exact before and after wording, and the ranked verdicts.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/policy-diff","pages":["/policy-diff"]},{"name":"policydiff_get_result","kind":"answer","impl":"imperative","description":"The last run's result: headline, who the revision favors, and every change ranked by impact with severity, plain-language explanation, who it lands on, what to do about it, and the verbatim wording. Fails if no run has finished.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/policy-diff","pages":["/policy-diff"]},{"name":"policydiff_reset","kind":"act","impl":"imperative","description":"Clear the result and go back to the two text boxes. The documents themselves stay loaded, so this is safe to call before a new run with edited text.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/policy-diff","pages":["/policy-diff"]},{"name":"skillgap_get_state","kind":"answer","impl":"imperative","description":"Read what is loaded and where the run is: character counts for the posting and the resume, the current stage, the detected role, the fit score, how many requirements are not yet covered, and whether the plan is ready.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/skill-gap","pages":["/skill-gap"]},{"name":"skillgap_set_inputs","kind":"act","impl":"imperative","description":"Paste the job posting and the resume into the page. Pass full text; either field may be omitted to keep what is already in that box.","inputSchema":{"type":"object","properties":{"job":{"type":"string","description":"Full text of the job posting."},"resume":{"type":"string","description":"Full text of the candidate's resume."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/skill-gap","pages":["/skill-gap"]},{"name":"skillgap_load_sample","kind":"act","impl":"imperative","description":"Fill both boxes with a built-in pair: a Frontend Engineer II posting at a health company and a resume that is close but not quite there. Use it to demo without documents in hand.","inputSchema":{"type":"object","properties":{"name":{"type":"string","enum":["meridian-frontend"],"description":"Which sample pair. Only meridian-frontend exists today; defaults to it."}}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/skill-gap","pages":["/skill-gap"]},{"name":"skillgap_analyze","kind":"act","impl":"imperative","description":"Run the analysis on the loaded posting and resume: readers extract the requirements and the candidate's claims, a judge marks each requirement have, partial or missing with the evidence, and a planner writes a fourteen-day plan that closes the gaps. Needs a Gemini key and both texts. Takes 30 to 90 seconds; stages show on the page. Returns the role, fit score, verdict, every gap (status other than have) and the plan.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/skill-gap","pages":["/skill-gap"]},{"name":"skillgap_get_result","kind":"answer","impl":"imperative","description":"The last analysis: role, fit score out of 100, verdict, every requirement with its status and evidence, and the day-by-day plan with time per day and suggested resources. Fails if no analysis has finished.","annotations":{"readOnlyHint":true},"inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/skill-gap","pages":["/skill-gap"]},{"name":"skillgap_reset","kind":"act","impl":"imperative","description":"Clear the result and go back to the two text boxes. The posting and resume stay loaded, so it is safe to call before re-running with edits.","inputSchema":{"type":"object","properties":{}},"hasHandler":true,"hasExecute":true,"__source":"spec","executable":true,"handlerField":"execute","page":"/skill-gap","pages":["/skill-gap"]}],"category":"Developer Tools","favicon":"/favicons/teamrocket.website.png","apiSurface":"spec","toolCount":30}}