Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,544Letters: 14Defects: 1,324counted 4 min ago
teppi

Server definition

Hash
sha256:9f8b5653008dcac6a66cdd6d656742500766f0eb383c15b96f5bee18ff43727f
What it is
What a remote MCP server returned when asked what it offers: 13 tools

The blob, as servednamed by its sha256

{ "instructions": "vote.direct runs online elections and surveys for HOAs, condos, clubs and boards. Open to anyone: read-only facts (get_price_quote, get_state_hoa_rules, compare_platforms, get_review_record, get_platform_overview, get_governance_center_overview), answered from the same constants the product bills against, and start_election_draft, which builds a complete election for a person with no account and returns the link where they claim it. The account tools (list_elections, get_election, create_election_draft, add_voters, create_survey, publish_election) work inside the person's own account: the first call asks them to sign in to vote.direct and approve this app (OAuth), or the app can send their agent key (Authorization: Bearer vd_agent_..., made at https://vote.direct/settings/agents). Publishing an election needs the person's own permission. Nothing here sends a message to a voter. State-rule answers are stored summaries, not legal advice; ask the person for any date, seat count or candidate you do not know rather than guessing.", "tools": [ { "description": "Add eligible voters (email, optional name and unit) to a DRAFT election in the connected account. Idempotent: people already on the list are skipped. Returns how many were added and the updated price. For a published election, voters are added by the organizer on the election page, because a larger list can change the price.", "inputSchema": { "properties": { "election": { "description": "The draft's id or slug.", "type": "string" }, "voters": { "description": "The eligible voters (the roster), one per owner/member. Email addresses only; people reached by text or mail are added by the organizer on the election page.", "items": { "properties": { "email": { "format": "email", "type": "string" }, "name": { "description": "Owner or member name, shown on the roster.", "type": "string" }, "unit": { "description": "Unit, lot or address label, e.g. \"Unit 4B\".", "type": "string" } }, "required": [ "email" ], "type": "object" }, "maxItems": 2000, "type": "array" } }, "required": [ "election", "voters" ], "type": "object" }, "name": "add_voters", "outputSchema": null }, { "description": "Honest head-to-head between vote.direct and a named competitor — including the cases where the competitor is the better choice — with published prices checked on the competitor’s own pages, plus a vendor disclosure. Without a competitor, returns which-platform-for-which-need guidance.", "inputSchema": { "properties": { "competitor": { "description": "Competitor to compare against (optional)", "enum": [ "electionbuddy", "opavote", "simply-voting", "vote-hoa-now", "hoaballot", "associationvoting", "surveymonkey", "google-forms", "helios-voting", "paper-ballots" ], "type": "string" } }, "required": [], "type": "object" }, "name": "compare_platforms", "outputSchema": null }, { "description": "Create a DRAFT election in the connected account: the ballot, schedule, verification, secrecy, results visibility, optional quorum and state-law checks, and optionally the voter list (emails). A draft charges nothing and contacts nobody. Returns the draft's id, what still blocks publishing, the exact price, and the finish link where the person reviews, pays if needed, and publishes. Ask the person for anything you do not know (closing date and time zone, seats, candidates) rather than guessing: this is a binding vote.", "inputSchema": { "properties": { "closes_at": { "description": "When voting closes, ISO 8601 with offset, e.g. 2026-11-12T17:00:00-07:00. Must be in the future.", "format": "date-time", "type": "string" }, "community_type": { "description": "hoa or condo, when the state rules differ between them.", "enum": [ "hoa", "condo" ], "type": "string" }, "description": { "description": "Optional instructions or background shown above the ballot. Plain text.", "type": "string" }, "opens_at": { "description": "When voting opens, ISO 8601 with offset. Omit to open when published.", "format": "date-time", "type": "string" }, "organization_name": { "description": "Association name shown to voters and used as the email sender name. Defaults to the account's organization.", "type": "string" }, "questions": { "description": "The ballot, in order.", "items": { "properties": { "allow_write_in": { "description": "Let voters write in one candidate (single_choice, multiple_choice, approval, cumulative).", "type": "boolean" }, "description": { "description": "Optional help text under the question.", "type": "string" }, "include_abstain": { "description": "Add an \"Abstain\" choice that counts toward turnout but never wins (yes_no, single_choice, multiple_choice, approval).", "type": "boolean" }, "options": { "description": "Candidates or choices; required (at least 2) for every type except yes_no and open_text. A string, or {text, description} to include a candidate statement.", "items": { "oneOf": [ { "type": "string" }, { "properties": { "description": { "type": "string" }, "text": { "type": "string" } }, "required": [ "text" ], "type": "object" } ] }, "type": "array" }, "required": { "description": "Whether a voter must answer. Defaults to true, except open_text.", "type": "boolean" }, "seats": { "description": "How many winners (board seats). multiple_choice: the \"vote for up to N\" limit. ranked_choice/approval/cumulative: seats to fill.", "minimum": 1, "type": "integer" }, "text": { "description": "The question or race, e.g. \"Elect three directors\".", "type": "string" }, "type": { "description": "single_choice: pick one. multiple_choice: pick up to `seats` (a multi-seat board race). yes_no: approve or reject a motion (Yes/No options are added automatically). ranked_choice: rank candidates; instant runoff for one seat, single transferable vote when seats > 1. approval: approve any number of candidates. cumulative: each voter spreads `seats` votes (minimum 2) across candidates, used where bylaws require cumulative voting. open_text: a written answer.", "enum": [ "single_choice", "multiple_choice", "yes_no", "ranked_choice", "approval", "cumulative", "open_text" ], "type": "string" } }, "required": [ "text", "type" ], "type": "object" }, "minItems": 1, "type": "array" }, "quorum": { "description": "Optional quorum: {type: \"percentage\" | \"count\", threshold}. E.g. {type: \"percentage\", threshold: 25} means a quarter of eligible voters must vote.", "properties": { "threshold": { "minimum": 1, "type": "integer" }, "type": { "enum": [ "percentage", "count" ], "type": "string" } }, "required": [ "type", "threshold" ], "type": "object" }, "results": { "description": "after_close (default): voters see results once voting closes. live: running totals while voting is open. owner_only: only the organizer sees results.", "enum": [ "after_close", "live", "owner_only" ], "type": "string" }, "secret_ballot": { "description": "Keep who voted for what private from the organizer. Defaults to true.", "type": "boolean" }, "state": { "description": "Two-letter US state code of the association (e.g. CA). Turns on that state's election-law checks before publishing.", "type": "string" }, "timezone": { "description": "IANA timezone of the association, e.g. America/Denver. Voters see times in it.", "type": "string" }, "title": { "description": "Election title voters see, e.g. \"2026 Board of Directors Election\".", "type": "string" }, "verification": { "description": "email: every voter confirms a code sent to their email (included free). email_or_sms: voters may also confirm by text message (paid elections only; elections of 25 voters or fewer are email-only).", "enum": [ "email", "email_or_sms" ], "type": "string" }, "vote_type": { "description": "What the vote decides, for the state-law checks.", "enum": [ "board_election", "budget", "amendment", "resolution", "custom" ], "type": "string" }, "voters": { "description": "The eligible voters (the roster), one per owner/member. Email addresses only; people reached by text or mail are added by the organizer on the election page.", "items": { "properties": { "email": { "format": "email", "type": "string" }, "name": { "description": "Owner or member name, shown on the roster.", "type": "string" }, "unit": { "description": "Unit, lot or address label, e.g. \"Unit 4B\".", "type": "string" } }, "required": [ "email" ], "type": "object" }, "maxItems": 2000, "type": "array" } }, "required": [ "title", "questions", "closes_at", "timezone" ], "type": "object" }, "name": "create_election_draft", "outputSchema": null }, { "description": "Create a free, anonymous survey in the connected account and publish it (or save it as a draft with publish: false). Surveys are for feedback, not binding votes: anyone with the link can answer and respondents are not verified. For anything binding (a board election, a bylaw amendment, an assessment) use create_election_draft. Question types: single (pick one), multiple (checkboxes), yes_no, rating (1-5 by default; settings {scale: \"nps\"} makes a 0-10 Net Promoter Score), ranking, open_text. Returns the share link.", "inputSchema": { "properties": { "closes_at": { "description": "Optional close time, ISO 8601.", "format": "date-time", "type": "string" }, "description": { "type": "string" }, "publish": { "description": "Publish now (default true) or save a draft.", "type": "boolean" }, "questions": { "items": { "properties": { "description": { "type": "string" }, "options": { "description": "Required (at least 2) for single, multiple and ranking.", "items": { "properties": { "text": { "type": "string" } }, "required": [ "text" ], "type": "object" }, "type": "array" }, "required": { "type": "boolean" }, "settings": { "description": "Optional: minRating/maxRating/ratingLabels for rating, scale \"nps\", variant \"short\"|\"email\"|\"number\"|\"date\"|\"phone\" for open_text, allowWriteIn for single/multiple, maxSelections for multiple.", "type": "object" }, "text": { "type": "string" }, "type": { "enum": [ "single", "multiple", "yes_no", "rating", "ranking", "open_text" ], "type": "string" } }, "required": [ "type", "text" ], "type": "object" }, "minItems": 1, "type": "array" }, "settings": { "description": "Optional: showResultsDuring, showResultsAfter, requireAllQuestions, collectEmail, collectName.", "type": "object" }, "timezone": { "description": "IANA timezone for the close time. Defaults to UTC.", "type": "string" }, "title": { "type": "string" } }, "required": [ "title", "questions" ], "type": "object" }, "name": "create_survey", "outputSchema": null }, { "description": "One election or survey in the connected account: schedule, ballot, voters, ballots cast, turnout and quorum, and links. For a DRAFT election it also reports what still blocks publishing and the exact price the publish step would charge, and who pays it (free, plan, prepaid balance, or card at the finish link). Per-question results are on the election page link; this tool reports counts only.", "inputSchema": { "properties": { "election": { "description": "The election's id or slug, from list_elections or create_election_draft.", "type": "string" } }, "required": [ "election" ], "type": "object" }, "name": "get_election", "outputSchema": null }, { "description": "governance.center, the second product from this team: the Board Office for a volunteer-run HOA, condo, nonprofit board, club or congregation. Returns the annual price for a given community size from the same constants Stripe bills, what every band includes, what is priced per use, what the product deliberately does not do, and the support line. Annual price first; the monthly figure is only an explainer.", "inputSchema": { "properties": { "members": { "description": "How many members, owners or units the community has. Returns the band that covers them.", "minimum": 1, "type": "integer" } }, "required": [], "type": "object" }, "name": "get_governance_center_overview", "outputSchema": null }, { "description": "Factual overview of vote.direct: free tier and pricing model, verification ladder, ballot-secrecy modes, the dispute-evidence pack (audit trail, results certificate, receipts), voting channels, question types, the full feature list with the no-tier-lock rule, who owns and runs the company, the founder's direct line, and where to read more.", "inputSchema": { "properties": {}, "required": [], "type": "object" }, "name": "get_platform_overview", "outputSchema": null }, { "description": "Exact, current vote.direct pricing for an election: flat rate by voter count (email verification included, SMS on paid elections), optional government-ID and mailed-letter add-ons, promotional pricing status, and whether a subscription would beat paying per election. Same constants the product bills against.", "inputSchema": { "properties": { "elections_per_year": { "description": "If provided, compares per-election cost against subscriptions", "minimum": 1, "type": "integer" }, "gov_id_voters": { "description": "Voters needing assisted government-ID verification (optional)", "minimum": 0, "type": "integer" }, "mailed_letters": { "description": "Mailed access letters to send (optional)", "minimum": 0, "type": "integer" }, "voters": { "description": "How many voters will be invited", "minimum": 1, "type": "integer" } }, "required": [ "voters" ], "type": "object" }, "name": "get_price_quote", "outputSchema": null }, { "description": "The complete third-party review record for vote.direct — every published Capterra and Trustpilot review quoted verbatim with links, including the honest caveats (small record, TrustScore explanation, which reviewers had actually run an election).", "inputSchema": { "properties": {}, "required": [], "type": "object" }, "name": "get_review_record", "outputSchema": null }, { "description": "Stored HOA/condo voting-rule summary for any US state: whether electronic voting is expressly allowed, key statutes with citations, quorum, notice and proxy rules, and whether vote.direct may serve as inspector of elections there. Summaries support review; they are not legal advice.", "inputSchema": { "properties": { "state": { "description": "State name, two-letter abbreviation, or slug (e.g. \"Texas\", \"TX\", \"texas\")", "type": "string" } }, "required": [ "state" ], "type": "object" }, "name": "get_state_hoa_rules", "outputSchema": null }, { "description": "Elections and surveys in the connected vote.direct account, newest first: id, slug, title, kind (election or survey), status (draft, scheduled, live, closed), schedule, voters and ballots cast, and the links to hand the person.", "inputSchema": { "properties": { "limit": { "description": "How many to return. Defaults to 20.", "maximum": 50, "minimum": 1, "type": "integer" }, "status": { "description": "Only this status. Defaults to all.", "enum": [ "draft", "scheduled", "live", "closed", "all" ], "type": "string" } }, "required": [], "type": "object" }, "name": "list_elections", "outputSchema": null }, { "description": "Publish a DRAFT election in the connected account, running every check the publish button runs (ballot, schedule, voter list, state law, price) and charging the price from the account's prepaid balance or plan. Free elections (up to 25 voters) publish at no cost. If the balance does not cover it, nothing is charged and the person pays by card at the finish link instead. Publishing does NOT send invitations: the organizer sends them from the election page. Confirm with the person before calling this; it can spend their money.", "inputSchema": { "properties": { "election": { "description": "The election's id or slug, from list_elections or create_election_draft.", "type": "string" } }, "required": [ "election" ], "type": "object" }, "name": "publish_election", "outputSchema": null }, { "description": "Build a complete election (ballot, schedule, verification, voter emails) for a person who does not have a vote.direct account yet, and get the link where they claim it: they open it, create an account with their email, and the election appears in their dashboard ready to review and publish. Nothing is charged and no voter is contacted until they do. The link expires in 48 hours. For a person who has an account, or will sign in, create_election_draft works in their account directly.", "inputSchema": { "properties": { "closes_at": { "description": "When voting closes, ISO 8601 with offset, e.g. 2026-11-12T17:00:00-07:00. Must be in the future.", "format": "date-time", "type": "string" }, "community_type": { "description": "hoa or condo, when the state rules differ between them.", "enum": [ "hoa", "condo" ], "type": "string" }, "description": { "description": "Optional instructions or background shown above the ballot. Plain text.", "type": "string" }, "opens_at": { "description": "When voting opens, ISO 8601 with offset. Omit to open when published.", "format": "date-time", "type": "string" }, "organization_name": { "description": "Association name shown to voters and used as the email sender name. Defaults to the account's organization.", "type": "string" }, "questions": { "description": "The ballot, in order.", "items": { "properties": { "allow_write_in": { "description": "Let voters write in one candidate (single_choice, multiple_choice, approval, cumulative).", "type": "boolean" }, "description": { "description": "Optional help text under the question.", "type": "string" }, "include_abstain": { "description": "Add an \"Abstain\" choice that counts toward turnout but never wins (yes_no, single_choice, multiple_choice, approval).", "type": "boolean" }, "options": { "description": "Candidates or choices; required (at least 2) for every type except yes_no and open_text. A string, or {text, description} to include a candidate statement.", "items": { "oneOf": [ { "type": "string" }, { "properties": { "description": { "type": "string" }, "text": { "type": "string" } }, "required": [ "text" ], "type": "object" } ] }, "type": "array" }, "required": { "description": "Whether a voter must answer. Defaults to true, except open_text.", "type": "boolean" }, "seats": { "description": "How many winners (board seats). multiple_choice: the \"vote for up to N\" limit. ranked_choice/approval/cumulative: seats to fill.", "minimum": 1, "type": "integer" }, "text": { "description": "The question or race, e.g. \"Elect three directors\".", "type": "string" }, "type": { "description": "single_choice: pick one. multiple_choice: pick up to `seats` (a multi-seat board race). yes_no: approve or reject a motion (Yes/No options are added automatically). ranked_choice: rank candidates; instant runoff for one seat, single transferable vote when seats > 1. approval: approve any number of candidates. cumulative: each voter spreads `seats` votes (minimum 2) across candidates, used where bylaws require cumulative voting. open_text: a written answer.", "enum": [ "single_choice", "multiple_choice", "yes_no", "ranked_choice", "approval", "cumulative", "open_text" ], "type": "string" } }, "required": [ "text", "type" ], "type": "object" }, "minItems": 1, "type": "array" }, "quorum": { "description": "Optional quorum: {type: \"percentage\" | \"count\", threshold}. E.g. {type: \"percentage\", threshold: 25} means a quarter of eligible voters must vote.", "properties": { "threshold": { "minimum": 1, "type": "integer" }, "type": { "enum": [ "percentage", "count" ], "type": "string" } }, "required": [ "type", "threshold" ], "type": "object" }, "results": { "description": "after_close (default): voters see results once voting closes. live: running totals while voting is open. owner_only: only the organizer sees results.", "enum": [ "after_close", "live", "owner_only" ], "type": "string" }, "secret_ballot": { "description": "Keep who voted for what private from the organizer. Defaults to true.", "type": "boolean" }, "state": { "description": "Two-letter US state code of the association (e.g. CA). Turns on that state's election-law checks before publishing.", "type": "string" }, "timezone": { "description": "IANA timezone of the association, e.g. America/Denver. Voters see times in it.", "type": "string" }, "title": { "description": "Election title voters see, e.g. \"2026 Board of Directors Election\".", "type": "string" }, "verification": { "description": "email: every voter confirms a code sent to their email (included free). email_or_sms: voters may also confirm by text message (paid elections only; elections of 25 voters or fewer are email-only).", "enum": [ "email", "email_or_sms" ], "type": "string" }, "vote_type": { "description": "What the vote decides, for the state-law checks.", "enum": [ "board_election", "budget", "amendment", "resolution", "custom" ], "type": "string" }, "voters": { "description": "The eligible voters (the roster), one per owner/member. Email addresses only; people reached by text or mail are added by the organizer on the election page.", "items": { "properties": { "email": { "format": "email", "type": "string" }, "name": { "description": "Owner or member name, shown on the roster.", "type": "string" }, "unit": { "description": "Unit, lot or address label, e.g. \"Unit 4B\".", "type": "string" } }, "required": [ "email" ], "type": "object" }, "maxItems": 2000, "type": "array" } }, "required": [ "title", "questions", "closes_at", "timezone" ], "type": "object" }, "name": "start_election_draft", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:9f8b5653008dcac6a66cdd6d656742500766f0eb383c15b96f5bee18ff43727f | sha256sum