Skip to main content
Glama

Election Index

Upcoming elections

upcoming_elections
Read-only

List elections by date range and/or country, soonest first, with each race's expected count stage right now. Answers "Which elections are in Europe this autumn?", "Which elections are this month?" or "What elections does Germany have coming up?". Without dates it starts today; with a country and no end date it covers every future election of that country, otherwise the next 365 days. Covers 390 elections in 100 countries, 2021–2030, including 23 of the 27 EU member states, the 2026 US midterms in all 50 states and the certified 2024 US presidential result, with vote counts, in all 50 states and DC.

Input Schema

NameRequiredDescriptionDefault
toNoEnd date YYYY-MM-DD; default +365 days, or no end when a country is given
fromNoStart date YYYY-MM-DD; default today
levelNonational: the country votes; regional: a state, region or autonomous community elects its own parliament or head (German Länder, Spanish autonomous communities, Italian regions). Default all
limitNoMost elections to return, soonest first; default 25, max 200. Narrow with from/to or country for more.
countryNoCountry name or ISO 3166-1 alpha-2 code, e.g. "Austria" or "AT", "United States" or "US"
include_discoveredNoAlso list elections found on Wikidata but not yet verified by Global Election Index

Output Schema

NameRequiredDescriptionDefault
metaYesWhat this answer was built from; cite dataset_version
resultYes

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • addedOutput schema / properties / meta / properties / doi
      Added value: +{
      +  "description": "Zenodo concept DOI: the latest archived release",
      +  "type": "string"
      +}
  2. Changed1 schema field changed
    • addedOutput schema / properties / meta / properties / copyright
      Added value: +{
      +  "description": "Rights holder",
      +  "type": "string"
      +}
  3. Changed1 schema field changed
    • addedOutput schema / properties / result / properties / elections / items / properties / races / items / properties / results / items / properties / rows / items / properties / ballot_name
      Added value: +{
      +  "description": "Name on the ballot, as the authority's file writes it",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  4. Changed1 schema field changed
    • addedOutput schema / properties / result / properties / elections / items / properties / exit_poll
      Added value: +{
      +  "description": "When is the exit poll? An exit poll is a survey of voters leaving polling stations, never an official result",
      +  "properties": {
      +    "at": {
      +      "description": "The one time to show: when it was published, else when it is due (UTC ISO)",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "ban_ends": {
      +      "description": "While a verified ban is in force: at (UTC, polls close), local, citation, scope (publication: all polls; exit-polls: exit-poll results only)",
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "basis": {
      +      "description": "What the expectation, or the finding that none is published, rests on",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "by": {
      +      "description": "Latest expected publication (UTC ISO)",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "checked_at": {
      +      "description": "For none: when that was checked (YYYY-MM-DD)",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "confidence": {
      +      "description": "announced, precedent or estimate",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "from": {
      +      "description": "Earliest expected publication (UTC ISO)",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "observed_at": {
      +      "description": "When it was published, once observed",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "observed_source": {
      +      "description": "Page that shows the publication, once observed",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "official_result": {
      +      "description": "Always false",
      +      "type": "boolean"
      +    },
      +    "publisher": {
      +      "description": "Who publishes it, e.g. a broadcaster and its pollster",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "race": {
      +      "description": "The race the answer is recorded on",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "source": {
      +      "description": "Where it is published",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "status": {
      +      "description": "expected (due), past (due time has passed, publication not observed), published (observed), none (checked: no exit poll is published), or unknown (not yet recorded)",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  5. Changed1 schema field changed
    • addedOutput schema / properties / result / properties / elections / items / properties / poll_blackout
      Added value: +{
      +  "description": "Whether opinion polls for this election should be shown only behind a warning right now, checked at request time. reason \"ban\": a poll-publication ban applies under the cited law. reason \"unverified\": we hold no verified rule for this country, so we cannot say publishing is allowed; it is not a finding that polls are banned. Show polls behind a warning (mode warn) or not at all (mode withhold)",
      +  "properties": {
      +    "active": {
      +      "description": "Show polls only behind a warning now (see reason)",
      +      "type": "boolean"
      +    },
      +    "citation": {
      +      "description": "The law and provision behind an active or upcoming ban",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "date_tentative": {
      +      "description": "Polling day is not declared yet, so these times may move",
      +      "type": "boolean"
      +    },
      +    "ends_at": {
      +      "description": "When the ban or warning ends: the last polls close (UTC ISO)",
      +      "type": "string"
      +    },
      +    "ends_at_local": {
      +      "description": "The same moment in local time, with offset",
      +      "type": "string"
      +    },
      +    "mode": {
      +      "description": "warn: polls may be shown behind a warning; withhold: do not show them",
      +      "type": "string"
      +    },
      +    "reason": {
      +      "description": "ban (a verified ban applies), unverified (no verified rule; warning until polls close), or null",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "rule": {
      +      "description": "The rule as recorded",
      +      "properties": {
      +        "citation": {
      +          "description": "The provision",
      +          "type": "string"
      +        },
      +        "id": {
      +          "description": "Rule id",
      +          "type": "string"
      +        },
      +        "law": {
      +          "description": "The law, by its own title",
      +          "type": "string"
      +        },
      +        "legal": {
      +          "description": "Quote, English gloss, what it covers, whether it covers online publication, exemptions, penalty, enforcer",
      +          "type": [
      +            "object",
      +            "null"
      +          ]
      +        },
      +        "note": {
      +          "description": "Reading notes",
      +          "type": [
      +            "string",
      +            "null"
      +          ]
      +        },
      +        "scope": {
      +          "description": "What is banned: publication, exit-polls",
      +          "items": {
      +            "type": "string"
      +          },
      +          "type": "array"
      +        },
      +        "source": {
      +          "description": "Official text the rule was read in",
      +          "type": "string"
      +        },
      +        "verified_at": {
      +          "description": "When the rule was last read against the source (YYYY-MM-DD)",
      +          "type": "string"
      +        }
      +      },
      +      "type": [
      +        "object",
      +        "null"
      +      ]
      +    },
      +    "starts_at": {
      +      "description": "When the ban starts (UTC ISO); null if the law sets none or no rule is known",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "timezone": {
      +      "description": "IANA time zone of ends_at_local",
      +      "type": "string"
      +    },
      +    "verified": {
      +      "description": "We hold a rule for this country read against the law",
      +      "type": "boolean"
      +    }
      +  },
      +  "type": "object"
      +}
  6. Changed2 schema fields changed
    • addedOutput schema / properties / result / properties / elections / items / properties / races / items / properties / sources / items / properties / figures_in_html
      Added value: +{
      +  "description": "For a results page: whether its own HTML shows a count (false: figures load by script or the page only links on; null: not read)",
      +  "type": [
      +    "boolean",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / result / properties / elections / items / properties / races / items / properties / sources / items / properties / oracle_reads
      Added value: +{
      +  "description": "Settlement-oracle lab reads of this URL: right, wrong, unread, lab, at",
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  7. Changed3 schema fields changed
    • changedOutput schema / properties / result / properties / elections / items / properties / date / description
      Previous value: -"Polling day (YYYY-MM-DD)"New value: +"Polling day (YYYY-MM-DD); for an expected date, the last day of date_window"
    • changedOutput schema / properties / result / properties / elections / items / properties / date_status / description
      Previous value: -"declared, scheduled or tentative"New value: +"declared, tentative, or expected (no day set yet: see date_window)"
    • addedOutput schema / properties / result / properties / elections / items / properties / date_window
      Added value: +{
      +  "description": "Only for date_status \"expected\": the period polling day is expected in",
      +  "properties": {
      +    "from": {
      +      "description": "First possible day (YYYY-MM-DD)",
      +      "type": "string"
      +    },
      +    "label": {
      +      "description": "How we name the period, e.g. \"Q2 2029\"",
      +      "type": [
      +        "string",
      +        "null"
      +      ]
      +    },
      +    "to": {
      +      "description": "Last possible day (YYYY-MM-DD)",
      +      "type": "string"
      +    }
      +  },
      +  "type": [
      +    "object",
      +    "null"
      +  ]
      +}
  8. Changed1 schema field changed
    • changedInput schema / properties / include_discovered / description
      Previous value: -"Also list elections found on Wikidata but not yet verified by Election Index"New value: +"Also list elections found on Wikidata but not yet verified by Global Election Index"
  9. Changed4 schema fields changed
    • addedOutput schema / properties / result / properties / elections / items / properties / races / items / properties / results / items / properties / electorate
      Added value: +{
      +  "description": "Registered voters",
      +  "type": [
      +    "integer",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / result / properties / elections / items / properties / races / items / properties / results / items / properties / rows / items / properties / colour
      Added value: +{
      +  "description": "Party colour (#RRGGBB, from Wikidata)",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / result / properties / elections / items / properties / races / items / properties / results / items / properties / rows / items / properties / party_id
      Added value: +{
      +  "description": "Wikidata QID of the party",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / result / properties / elections / items / properties / races / items / properties / results / items / properties / turnout
      Added value: +{
      +  "description": "Percent of registered voters who cast a ballot",
      +  "type": [
      +    "number",
      +    "null"
      +  ]
      +}
  10. Changed4 schema fields changed
    • addedInput schema / properties / level
      Added value: +{
      +  "description": "national: the country votes; regional: a state, region or autonomous community elects its own parliament or head (German Länder, Spanish autonomous communities, Italian regions). Default all",
      +  "enum": [
      +    "national",
      +    "regional",
      +    "all"
      +  ],
      +  "type": "string"
      +}
    • addedOutput schema / properties / result / properties / elections / items / properties / level
      Added value: +{
      +  "description": "national or regional",
      +  "type": "string"
      +}
    • addedOutput schema / properties / result / properties / elections / items / properties / subdivision
      Added value: +{
      +  "description": "ISO 3166-2 code of the state or region, if the election belongs to one",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
    • addedOutput schema / properties / result / properties / elections / items / properties / subdivision_name
      Added value: +{
      +  "description": "Name of that state or region",
      +  "type": [
      +    "string",
      +    "null"
      +  ]
      +}
  11. Changed1 schema field changed
    • addedOutput schema / properties / result / properties / elections / items / properties / races / items / properties / results
      Added value: +{
      +  "description": "Published counts we hold, oldest first (empty until a count is recorded)",
      +  "items": {
      +    "properties": {
      +      "licence": {
      +        "description": "Licence of the numbers",
      +        "type": "string"
      +      },
      +      "published_at": {
      +        "description": "When the publisher released it",
      +        "type": [
      +          "string",
      +          "null"
      +        ]
      +      },
      +      "publisher": {
      +        "description": "Who published the count",
      +        "type": "string"
      +      },
      +      "rows": {
      +        "items": {
      +          "properties": {
      +            "candidate": {
      +              "description": "Candidate or list",
      +              "type": "string"
      +            },
      +            "party": {
      +              "description": "Party, where recorded",
      +              "type": [
      +                "string",
      +                "null"
      +              ]
      +            },
      +            "seats": {
      +              "description": "Seats or electoral votes won",
      +              "type": [
      +                "integer",
      +                "null"
      +              ]
      +            },
      +            "share": {
      +              "description": "Percent of total votes",
      +              "type": [
      +                "number",
      +                "null"
      +              ]
      +            },
      +            "votes": {
      +              "description": "Votes",
      +              "type": "integer"
      +            },
      +            "winner": {
      +              "description": "Most votes in this count",
      +              "type": "boolean"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        "type": "array"
      +      },
      +      "source": {
      +        "description": "File or page the numbers were copied from",
      +        "type": "string"
      +      },
      +      "stage": {
      +        "description": "Count stage of this version, e.g. final-result",
      +        "type": "string"
      +      },
      +      "total_votes": {
      +        "description": "Total votes cast in the race",
      +        "type": "integer"
      +      }
      +    },
      +    "type": "object"
      +  },
      +  "type": "array"
      +}
  12. Changed3 schema fields changed
    • changedInput schema / properties / country / description
      Previous value: -"ISO 3166-1 alpha-2, e.g. \"LV\""New value: +"Country name or ISO 3166-1 alpha-2 code, e.g. \"Austria\" or \"AT\", \"United States\" or \"US\""
    • changedInput schema / properties / from / description
      Previous value: -"YYYY-MM-DD"New value: +"Start date YYYY-MM-DD; default today"
    • changedInput schema / properties / to / description
      Previous value: -"YYYY-MM-DD"New value: +"End date YYYY-MM-DD; default +365 days, or no end when a country is given"
  13. Changed3 schema fields changed
    • addedInput schema / properties / limit
      Added value: +{
      +  "description": "Most elections to return, soonest first; default 25, max 200. Narrow with from/to or country for more.",
      +  "maximum": 200,
      +  "minimum": 1,
      +  "type": "integer"
      +}
    • addedOutput schema / properties / result / properties / returned
      Added value: +{
      +  "description": "Elections in this answer (see limit)",
      +  "type": "integer"
      +}
    • addedOutput schema / properties / result / properties / total
      Added value: +{
      +  "description": "Elections matching the filters",
      +  "type": "integer"
      +}
  14. First observed

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds useful scoping behavior (default date windows, ordering) and hints at verification status through include_discovered. Remaining gaps are minor: pagination behavior and the vague "expected count stage right now" phrase that is never explained.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the verb, scope, and ordering, then examples, then defaults, which is good structure with no wasted sentences. The closing coverage sentence (390 elections, 23 of 27 EU states, US midterms and certified 2024 result) reads more like marketing than invocation guidance, so it is slightly overlong.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists and parameter coverage is complete, so the description does not need to explain return values. It covers defaults, scope, and dataset breadth adequately, but leaves the include_discovered trust distinction and the "expected count stage" concept underspecified.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so baselines at 3. The description restates the from/to defaults already documented in the schema and repeats the "narrow with from/to or country" advice that also appears in the limit description, adding little new meaning. It never explains include_discovered's trust implications or the level enum beyond what the schema already says.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Opens with a specific verb and resource plus ordering ("List elections by date range and/or country, soonest first"), and the example questions pin down that this returns sets of races rather than one election. It does not name a sibling such as next_election or election_status to draw the boundary explicitly, so it stops short of the top band.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives concrete when-to-use cues via three example questions and spells out the default windows (today when no dates, all future elections for a country with no end date, otherwise 365 days). There is no explicit when-not guidance or pointer to the sibling tools an agent should prefer for single-race or status queries.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources