Tool tree
gradeNot graded
page: Every page
list_buildsAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/webmcp"
}open_buildAction
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.
View tool JSON
{
"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"
]
},
"page": "/webmcp"
}get_setup_statusAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/webmcp"
}open_key_panelAction
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.
View tool JSON
{
"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": {}
},
"page": "/webmcp"
}page: Taskboard
taskboard_get_stateAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/taskboard"
}taskboard_set_goalAction
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.
View tool JSON
{
"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"
]
},
"page": "/taskboard"
}taskboard_add_taskAction
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.
View tool JSON
{
"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"
]
},
"page": "/taskboard"
}taskboard_move_taskAction
Move a task to another column. Moving resets its idle clock. Use taskboard_get_state first to get the id.
View tool JSON
{
"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.",
"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"
]
},
"page": "/taskboard"
}taskboard_remove_taskAction
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The task id exactly as returned by taskboard_get_state (looks like t_abc123)."
}
},
"required": [
"id"
]
},
"page": "/taskboard"
}taskboard_triageAction
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.
View tool JSON
{
"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": {}
},
"page": "/taskboard"
}taskboard_age_boardAction
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.
View tool JSON
{
"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": {}
},
"page": "/taskboard"
}taskboard_resetAction
Clear the board and go back to the goal screen. Destructive: waits for the user to press Confirm on the page.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/taskboard"
}page: This or that
thisorthat_get_stateAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/this-or-that"
}thisorthat_setupAction
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.
View tool JSON
{
"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"
]
},
"page": "/this-or-that"
}thisorthat_next_voterAction
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.
View tool JSON
{
"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": {}
},
"page": "/this-or-that"
}thisorthat_voteAction
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.
View tool JSON
{
"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"
]
},
"page": "/this-or-that"
}thisorthat_get_resultAction
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/this-or-that"
}thisorthat_resetAction
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/this-or-that"
}page: Policy diff
policydiff_get_stateAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/policy-diff"
}policydiff_set_documentsAction
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.
View tool JSON
{
"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."
}
}
},
"page": "/policy-diff"
}policydiff_load_sampleAction
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.
View tool JSON
{
"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."
}
}
},
"page": "/policy-diff"
}policydiff_runAction
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.
View tool JSON
{
"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": {}
},
"page": "/policy-diff"
}policydiff_get_resultAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/policy-diff"
}policydiff_resetAction
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.
View tool JSON
{
"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": {}
},
"page": "/policy-diff"
}page: Skill gap
skillgap_get_stateAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/skill-gap"
}skillgap_set_inputsAction
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.
View tool JSON
{
"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."
}
}
},
"page": "/skill-gap"
}skillgap_load_sampleAction
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.
View tool JSON
{
"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."
}
}
},
"page": "/skill-gap"
}skillgap_analyzeAction
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.
View tool JSON
{
"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": {}
},
"page": "/skill-gap"
}skillgap_get_resultAnswer
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.
View tool JSON
{
"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.",
"inputSchema": {
"type": "object",
"properties": {}
},
"page": "/skill-gap"
}skillgap_resetAction
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.
View tool JSON
{
"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": {}
},
"page": "/skill-gap"
}