Projects the vote share between two people for one local elected seat before anyone declares.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Returns the user's fovub account: the email, the balance in dollars, the price of a projection and of a full report, and where to add to the balance. Needs the user's fovub sign-in.
This tool takes no arguments.
Pick your client. Values in capitals, like YOUR_TOKEN, are yours to fill in.
Run in a terminal
claude mcp add --transport http fovub https://fovub.com/mcp
Returns the user's fovub account: the email, the balance in dollars, the price of a projection and of a full report, and where to add to the balance. Needs the user's fovub sign-in.
No arguments.
{
"type": "object",
"properties": {},
"additionalProperties": false
}Starts a purchase of a fovub pack, which adds dollars to the user's fovub balance, and returns a link to Stripe's payment page, where the user pays in a browser. The balance rises when Stripe confirms the payment. With several packs for sale and no price_id, it lists the packs. Needs the user's fovub sign-in.
| Argument | Type | Description |
|---|---|---|
| price_id | string | The pack's price_id, from the packs add_balance listed. |
{
"type": "object",
"properties": {
"price_id": {
"type": "string",
"maxLength": 120,
"description": "The pack's price_id, from the packs add_balance listed."
}
},
"additionalProperties": false
}Sends the user's answer to the projection's open question. Ask the user the question exactly as check_projection gave it, with its choices, and send the choice the user picked. Do not answer for the user. Needs the user's fovub sign-in.
| Argument | Type | Description |
|---|---|---|
| seq* | integer | The question's seq from check_projection. |
| answer | string | The user's choice, one of the question's choices. |
| run_id* | string | The run_id that start_projection returned. |
| answers | object | Only for a question with several parts: each part's text mapped to the user's choice. |
{
"type": "object",
"required": [
"run_id",
"seq"
],
"properties": {
"seq": {
"type": "integer",
"description": "The question's seq from check_projection."
},
"answer": {
"type": "string",
"maxLength": 200,
"description": "The user's choice, one of the question's choices."
},
"run_id": {
"type": "string",
"maxLength": 64,
"description": "The run_id that start_projection returned."
},
"answers": {
"type": "object",
"description": "Only for a question with several parts: each part's text mapped to the user's choice.",
"additionalProperties": {
"type": "string"
}
}
},
"additionalProperties": false
}Returns the projection's state: working; waiting, with the question the user must answer; done, with each person's projected share of the vote in whole percents and fovub's warning; or failed, with the reason. With wait_seconds, it waits up to that many seconds for the projection to ask a question or finish. Needs the user's fovub sign-in.
| Argument | Type | Description |
|---|---|---|
| run_id* | string | The run_id that start_projection returned. |
| wait_seconds | integer | Wait up to this many seconds, at most 50, for a question or the result. Use 45 while it works. |
{
"type": "object",
"required": [
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"maxLength": 64,
"description": "The run_id that start_projection returned."
},
"wait_seconds": {
"type": "integer",
"maximum": 50,
"minimum": 0,
"description": "Wait up to this many seconds, at most 50, for a question or the result. Use 45 while it works."
}
},
"additionalProperties": false
}Finds the elected seat for a projection from plain words, such as "Palo Alto school board" or "San Jose City Council District 5", and tells whether fovub covers that seat. Whether fovub covers a seat is known only from fovub's own seat search, which this tool runs, so call it when the user asks about coverage. It is also the first call when the user compares two candidates or possible candidates for one local elected seat: who would win a head-to-head race, the share of the vote each would get, or the user's own chances against someone, as in "Pat Lee versus Sam Roe for the Palo Alto school board". A projection starts from the seat this tool finds. Speech-to-text often writes fovub as "for Bob", "four Bob", "full boob", or "fob". Each trustee area or district is its own seat, so name it when you know it. Returns up to eight seats, each with its name and the seat_id that start_projection takes. A seat search costs nothing and needs no sign-in.
| Argument | Type | Description |
|---|---|---|
| seat* | string | The seat in plain words, with the place. |
| state | string | The state's two-letter postal code, such as CA. |
| county | string | The county, such as Santa Clara. |
{
"type": "object",
"required": [
"seat"
],
"properties": {
"seat": {
"type": "string",
"maxLength": 256,
"description": "The seat in plain words, with the place."
},
"state": {
"type": "string",
"maxLength": 2,
"description": "The state's two-letter postal code, such as CA."
},
"county": {
"type": "string",
"maxLength": 80,
"description": "The county, such as Santa Clara."
}
},
"additionalProperties": false
}Starts fovub's projection of the share of the vote between two people for one seat. It takes $1 from the user's fovub balance, and the money comes back if the projection fails. A projection runs for minutes and asks the user questions as it works; follow it with check_projection. Needs the user's fovub sign-in.
| Argument | Type | Description |
|---|---|---|
| seat_id* | string | The seat_id that find_seat returned. |
| person_a* | string | The first person's full name. |
| person_b* | string | The second person's full name. |
{
"type": "object",
"required": [
"seat_id",
"person_a",
"person_b"
],
"properties": {
"seat_id": {
"type": "string",
"maxLength": 300,
"description": "The seat_id that find_seat returned."
},
"person_a": {
"type": "string",
"maxLength": 120,
"description": "The first person's full name."
},
"person_b": {
"type": "string",
"maxLength": 120,
"description": "The second person's full name."
}
},
"additionalProperties": false
}We read every tool's name, description and inputs the way the model will, looking for instructions hidden from you. A clean result means no warning signs, not a guarantee. Scanned Nov 11, 2026.