MCP server · za AI asistente i programere
Izborna mapa za AI asistente
Rezultati izbora u Bosni i Hercegovini od 2016. do 2026. u Claudeu, ChatGPT-u, Cursoru i svakom drugom klijentu koji govori MCP (Model Context Protocol, otvoreni standard za spajanje AI asistenata s izvorima podataka). Asistent preko servera pita istu bazu iz koje radi mapa, pa su brojevi isti kao na ekranu, a uz odgovor stiže i link na isti prikaz na mapi.
- Adresa
https://izbori.podaci.org/mcp- Prijava
- Nije potrebna: nema naloga, ključa ni OAuth-a
- Pristup
- Samo čitanje, 11 alata
- Protokol
- MCP preko HTTP-a (Streamable HTTP), bez sesija
- Podaci
- CIK BiH: 6 izbora, 143 općine, 32.110 biračkih mjesta
- Ograničenje
- 100 zahtjeva u 10 sekundi s jedne IP adrese, zajedno sa stranicama sajta
Gdje je SDA 2022. za Parlament FBiH bila najjača?
Alatresults_by_municipalityelection 2022 · race 4 · party SDA
U četiri manje općine, više nego dvostruko iznad svog prosjeka od 25,5 %:
- Trnovo (FBiH)65,61 %
- Pale-Prača58,87 %
- Olovo58,29 %
- Bužim58,18 %
Šta se može pitati#
Pitanja se postavljaju običnim jezikom, na bosanskom ili bilo kojem drugom. Model sam bira alate i često ih zove nekoliko za redom: pretragom pretvori ime u oznaku, pa pozove alat koji daje brojeve. Ovo su pitanja na koja server daje sve što treba za odgovor:
- „Gdje je SDA 2022. za Parlament FBiH bila najjača, a gdje najslabija u odnosu na svoj prosjek?”
results_by_municipality - „Gdje je SDA 2026. rasla, a gdje pala u odnosu na 2022?”
compare - „Kako je Bakir Izetbegović prošao 2026. u odnosu na 2022, i gdje je izgubio najviše?”
person_historycompare - „Gdje je Bećirović 2022. bio jači od Izetbegovića, a gdje slabiji?”
compare - „Koliko bi mandata u Predstavničkom domu PS BiH SNSD dobio po preliminarnim rezultatima 2026, i koliko mu fali za još jedan?”
mandates - „Ko od kandidata SDA ulazi u Parlament FBiH po preliminarnim rezultatima 2026, i ko je sljedeći?”
mandates - „Ko je 2022. pobijedio na biračkom mjestu u OŠ Alija Nametak?”
searchpolling_station - „Kako je SDP prolazio u Tuzli od 2018. do 2026?”
party_history - „U kojim općinama je SNSD za NSRS najviše pao od 2022. do 2026?”
party_history - „Ko se sve kandidovao za srpskog člana Predsjedništva i s kojim rezultatom?”
position_history - „Na kojim biračkim mjestima u Mostaru je HDZ BiH 2024. bio najslabiji?”
polling_stations - „Ko je 2024. pobijedio za načelnika Bijeljine i s kolikom prednošću?”
race_results
Spajanje#
Svakom klijentu treba samo adresa https://izbori.podaci.org/mcp. Server ne traži prijavu, pa se polja za OAuth, ključ ili token ostavljaju prazna. Nakon spajanja je dobra provjera pitanje „Koji su izbori u bazi?”: model tada zove list_elections i nabraja sve izbore u bazi.
Claude: web, Desktop i mobilna aplikacija
Server se dodaje kao vlastiti konektor, jednom za cijeli nalog: dodan na webu, radi i u Claude Desktopu i u aplikaciji za iOS i Android.
- Otvorite claude.ai/customize/connectors (Customize→Connectors; u starijem izgledu Settings→Connectors).
- Kliknite Add custom connector.
- Upišite naziv, na primjer Izborna mapa BiH, i adresu
https://izbori.podaci.org/mcp. - Za autentifikaciju izaberite No sign-in i kliknite Add.
https://izbori.podaci.org/mcpPlanovi: Free, Pro, Max, Team i Enterprise; Free dozvoljava jedan vlastiti konektor. U Team i Enterprise organizaciji konektor dodaje vlasnik (Organization settings→Connectors→Add→Custom→Web), a članovi ga uključe sa Connect.
Claude se spaja s Anthropicovih servera, a ne s uređaja korisnika, pa adresa mora biti javna.
ChatGPT
ChatGPT vlastite MCP servere zove pluginovima (ranije apps i connectors). Radi samo na webu, ne i u mobilnoj aplikaciji.
- Otvorite chatgpt.com/plugins, kliknite +, pa Add custom MCP server. U starijem izgledu: Settings→Apps→Advanced settings→Developer mode, pa Create.
- Upišite naziv i opis, a za adresu
https://izbori.podaci.org/mcp. - Za Authentication izaberite No authentication.
- Potvrdite upozorenje (I understand and want to continue) i kliknite Create as a plugin. ChatGPT tada nabroji alate koje je našao.
- U razgovoru se server bira sa
@u polju za pisanje.
https://izbori.podaci.org/mcpPlanovi: potpuna MCP podrška je u planovima Business, Enterprise i Edu, gdje developer mode uključuje administrator. Pro u developer modu spaja servere koji samo čitaju, a ovaj server samo čita. Za Plus i Free OpenAI u ovom trenutku ne kaže ništa jasno.
Claude Code
Jedna komanda. Bez --scope server važi samo za projekat u kojem je dodan, sa --scope user za sve projekte.
claude mcp add --transport http izbori https://izbori.podaci.org/mcpZa projekat i sve koji ga kloniraju, u .mcp.json u korijenu projekta:
{
"mcpServers": {
"izbori": {
"type": "http",
"url": "https://izbori.podaci.org/mcp"
}
}
}Konektor dodan na claude.ai vidi se i u Claude Codeu kad je prijavljen claude.ai pretplatom. U samom Claude Codeu server se provjerava komandom /mcp.
Cursor
Ili ručno, u ~/.cursor/mcp.json za sve projekte ili u .cursor/mcp.json za jedan:
{
"mcpServers": {
"izbori": {
"url": "https://izbori.podaci.org/mcp"
}
}
}VS Code (GitHub Copilot)
Ili komandom:
code --add-mcp '{"name":"izbori","type":"http","url":"https://izbori.podaci.org/mcp"}'Ili u .vscode/mcp.json projekta (za sve projekte: MCP: Open User Configuration):
{
"servers": {
"izbori": {
"type": "http",
"url": "https://izbori.podaci.org/mcp"
}
}
}U Copilot Business i Enterprise organizaciji politika MCP servers in Copilot je zadano isključena i uključuje je administrator.
OpenAI Codex
codex mcp add izbori --url https://izbori.podaci.org/mcpIli u ~/.codex/config.toml (za jedan projekat .codex/config.toml); isti fajl čitaju i komandna linija i ekstenzija za editor:
[mcp_servers.izbori]
url = "https://izbori.podaci.org/mcp"Gemini CLI
--transport http je obavezan: bez njega Gemini CLI adresu shvati kao lokalnu komandu. Sa -s user server važi za sve projekte.
gemini mcp add --transport http izbori https://izbori.podaci.org/mcpIli u ~/.gemini/settings.json. Ključ je httpUrl, a ne url, koji u Gemini CLI-ju znači stari SSE prijenos, a njega ovaj server nema:
{
"mcpServers": {
"izbori": {
"httpUrl": "https://izbori.podaci.org/mcp"
}
}
}Windsurf (od juna 2026. Devin Desktop)
U panelu Cascade: …→Open MCP config file, pa dodajte:
{
"mcpServers": {
"izbori": {
"serverUrl": "https://izbori.podaci.org/mcp"
}
}
}Kod enterprise korisnika MCP je zadano isključen, a kad administrator odobri ijedan server, svi ostali su blokirani dok ih ne odobri.
Ostali klijenti
Svaki klijent koji zna udaljene MCP servere traži isto: adresu https://izbori.podaci.org/mcp, prijenos HTTP (Streamable HTTP) i bez autentifikacije.
- Zed: Settings→AI→MCP Servers→Add Remote Server, ili u
settings.json:{"context_servers":{"izbori":{"url":"https://izbori.podaci.org/mcp"}}}. - LM Studio (od verzije 0.3.17): u
mcp.json{"mcpServers":{"izbori":{"url":"https://izbori.podaci.org/mcp"}}}. - Le Chat (Mistral): Connectors→Add Connector→Custom MCP Connector; naziv bez razmaka (
izbori), a autentifikaciju Le Chat prepozna sam. - Microsoft Copilot Studio: u agentu Tools→Add a tool→New tool→Model Context Protocol, adresa i None za autentifikaciju.
Klijent koji zna samo lokalne servere (na primjer Claude Desktop preko claude_desktop_config.json) spaja se preko mosta mcp-remote, za koji treba Node.js:
{
"mcpServers": {
"izbori": {
"command": "npx",
"args": [
"-y",
"mcp-remote",
"https://izbori.podaci.org/mcp"
]
}
}
}Alati#
Server ima 11 alata, svi samo za čitanje. Opis koji model dobija je na engleskom, jer ga modeli tako najpouzdanije prate; ovdje je isto na bosanskom, uz parametre, pravi poziv i početak pravog odgovora. Odgovori su JSON s engleskim ključevima, a nazivi stranaka, osoba i mjesta su kako ih piše CIK.
list_electionsIzbori u bazisearchPretragarace_resultsRezultati utrkeresults_by_municipalityGdje je jak, a gdje slabcomparePoređenjemandatesMandatiparty_historyStranka kroz izboreperson_historyKandidat kroz izboreposition_historySvi kandidati za jednu pozicijupolling_stationJedno biračko mjestopolling_stationsBiračka mjesta općine
list_elections#
Izbori u bazi
Svi izbori u bazi s utrkama koje imaju, vrstom (opći ili lokalni), datumom i stanjem brojanja: jesu li rezultati konačni ili preliminarni, i od kada je stanje.
Kad iz pitanja nije jasno o kojim je izborima ili utrci riječ. Model ga obično zove prvog, da zna koje oznake primaju ostali alati.
Parametri
Alat ne prima parametre.
Opis koji model dobija
Every election in the database with its races, and whether its count is still preliminary (and as of when). Start here when it is unclear which election or race a question is about.
{
"name": "list_elections",
"arguments": {}
}{
"elections": [
…
{
"election": "opci-2026",
"preliminary": true,
"count_as_of": "5. 10. 2026. u 22:30",
"name": "Opći izbori 2026",
"kind": "general",
"date": "2026-10-04",
"races": [
{ "race": 1, "race_name": "Predsjedništvo BiH" },
{ "race": 2, "race_name": "Predstavnički dom PS BiH" },
…search#
Pretraga
Kandidati, stranke i biračka mjesta po nazivu; dijakritici i redoslijed riječi nisu bitni. Bez izbora traži osobe i stranke kroz sve izbore i svaku pokazuje u zadnjim izborima na kojima je bila. Uz izbore traži samo u njima, i tada nalazi i biračka mjesta po nazivu, adresi, šifri ili općini.
Da se ime pretvori u oznaku koju primaju ostali alati: oznaku osobe (bakir-izetbegovic), kratki naziv stranke (SDA) ili šifru biračkog mjesta (093A077).
Parametri
querystringobavezan- Naziv ili dio naziva:
izetbegovic,SDA,OŠ Kovačići. electionstring- Traži samo u tim izborima (oznaka ili godina), zajedno s njihovim biračkim mjestima. Bez njega: osobe i stranke iz svih izbora.
Opis koji model dobija
Find candidates, parties and polling stations by name; diacritics and word order do not matter. With "election" it searches that election only, and also finds its polling stations by name, address, code or municipality. Without it, it finds people and parties in every election, each in the latest one they ran in. The person slugs, party short names and station codes it returns are what the other tools take.
{
"name": "search",
"arguments": {
"query": "izetbegovic"
}
}{
"people": [
{
"person": "bakir-izetbegovic",
"name": "Bakir Izetbegović",
"election": "opci-2026",
"race": 1,
"race_name": "Predsjedništvo BiH",
"ran_for": "Predsjedništvo BiH: bošnjački i hrvatski član",
"party": "SDA",
"votes": 189089,
"elected": null
},
{
"person": "sebija-izetbegovic",
"name": "Sebija Izetbegović",
…race_results#
Rezultati utrke
Rezultati jedne utrke na jednim izborima, na tri načina. Uz unit: ta izborna jedinica, kanton ili, kod načelnika i vijeća, općina, sa svakom listom i njenim najjačim kandidatima ili sa svakim pojedinačnim kandidatom. Uz municipality: kako je ta općina glasala na listićima te utrke. Bez oba: utrka u cjelini, sa strankama sabranim preko svih jedinica.
Za pitanja ko je pobijedio, ko je dobio mandate i kako je glasala jedna općina. Udio je postotak glasova svih lista (ili kandidata) na listiću. Dok su rezultati preliminarni, mandates je null, a projected_mandates daje mandate po CIK-ovom računu, koji ponavlja svaki mandat iz 2018. i 2022; model tada treba reći da je to projekcija, a ne CIK-ova raspodjela.
Parametri
electionstring- Izbori po oznaci (
opci-2022,lokalni-2024) ili po godini. Bez njega: najnoviji izbori. raceintegerobavezan- Utrka po CIK-ovom broju (tabela „Utrke” ispod).
12456789 unitstring- Izborna jedinica po šifri ili nazivu: „401”, „Izborna jedinica 3”, „Kanton Sarajevo”; kod načelnika i vijeća općina.
municipalitystring- Općina po nazivu (Tuzla, Centar Sarajevo, Brčko distrikt) ili CIK šifri (050). Daje kako je glasala ta općina.
candidatesinteger 0–100- Koliko kandidata uz svaku listu, po preferencijalnim glasovima (zadano 5; 0 za nijednog).
Opis koji model dobija
Results of one race in one election. With "unit": that electoral unit, canton or municipality (for mayors and councils) with every list and its strongest candidates, or every single candidate. With "municipality": what that municipality voted on the race's ballots there. With neither: the race as a whole, parties summed over every unit (for single-candidate races, every candidate). Shares are percent of the votes of every list (or candidate) on the ballot. While a count is preliminary, mandates are null and projected_mandates gives the seats by the arithmetic CIK uses (Sainte-Laguë, 3 % threshold, compensatory seats per entity), which reproduces every seat CIK gave in 2018 and 2022: say that it is a projection, not CIK's allocation.
{
"name": "race_results",
"arguments": {
"election": "2022",
"race": 2,
"unit": "511",
"candidates": 2
}
}{
"election": "opci-2022",
"preliminary": false,
"count_as_of": "1. 11. 2022. u 10:28",
"race": 2,
"race_name": "Predstavnički dom PS BiH",
"units": [
{
"unit": { "code": "511", "name": "Izborna jedinica 1A" },
"registered": 325439,
"ballots_cast": 126917,
"turnout": 39,
"valid": 109556,
"stations_counted": 488,
"stations": 488,
"invalid": 17361,
"lists": [
{
"party": "SDA",
"list_name": "SDA - STRANKA DEMOKRATSKE AKCIJE",
"votes": 28288,
"share": 25.82,
"mandates": 1,
"candidates": [
{
"person": "semsudin-dedic",
"name": "Šemsudin Dedić",
"position": 1,
"preference_votes": 15316,
"share_of_list": 54.14,
"elected": true
},
…results_by_municipality#
Gdje je jak, a gdje slab
Stranka ili kandidat u svakoj općini jedne utrke: glasovi, udio u važećim glasovima općine, izlaznost i koliko je općina iznad ili ispod prosjeka samog subjekta (vs_average, u postotnim poenima). To je mapa aplikacije u brojevima. Kod kandidata s liste glasovi su preferencijalni, a share_of_list je njihov udio u glasovima vlastite liste u toj općini. Kandidat bez liste (Predsjedništvo, predsjednik RS, načelnik) se poredi i s listom svoje stranke na listiću koji su isti birači popunili isti dan (PS BiH, odnosno vijeće; kod kandidata koalicije liste njenih stranaka): party_lists je zbir, a vs_party_list u svakoj općini glasovi kandidata kao postotak glasova liste. Kandidat i stranka imaju i thanks, link kojim zahvaljuju biračima: otvara njihovu mapu, a uz njega mreže prikažu karticu zahvale (thanks_image; glasovi, rang na listi ili u utrci, kod stranke mandati, i porast od prethodnih izbora), koja je i slika za objavu.
Za pitanja gdje je stranka ili kandidat najjači, gdje je podbacio i gdje treba pojačati rad, i gdje kandidata nisu zaokružili ni birači njegove stranke (tada map_vs_party_list otvara mapu tog poređenja). Traži tačno jedno od party i person. Za poređenje s ranijim izborima ili s protivnikom je compare.
Parametri
electionstring- Izbori po oznaci (
opci-2022,lokalni-2024) ili po godini. Bez njega: najnoviji izbori. raceinteger- Utrka po CIK-ovom broju (tabela „Utrke” ispod). Kod kandidata ne treba: osoba se na jednim izborima kandiduje jednom.
12456789 partystring- Stranka po kratkom nazivu (SDA, SNSD, HDZ BiH, SDP), kako ga daje pretraga. Koalicije s istim kratkim nazivom računaju se kao ta stranka.
personstring- Kandidat po oznaci iz pretrage (
denis-becirovic). Puno ime prolazi ako ga ima samo jedna osoba. sortstring- Redoslijed općina, od najveće vrijednosti:
share(udio, zadano),votes(glasovi) ilivs_average(odstupanje od prosjeka).sharevotesvs_average
Opis koji model dobija
A party or a candidate in every municipality of one race: votes, share of the valid votes there, turnout, and how far each municipality is above or below the subject's own average. This is the map of the app as numbers: where the subject is strong and where it fell short. For a candidate on a list the votes are preference votes, also given as a share of the own list's votes there. A candidate without a list (Presidency, RS president, mayor) is also measured against the lists of their party on the ballot the same voters filled in the same day (the state parliament, or the council; for a coalition's candidate the lists of its parties): vs_party_list is the candidate's votes as a percentage of those lists' votes. Below 100 not even all of the party's voters chose the candidate; a big party's candidate usually gets more than the list, as there are fewer names on the ballot. thanks is the link the candidate or the party can share to thank their voters: it opens their map, and its preview (thanks_image, also as a picture to post) is a card with their votes, their place on the list or in the race (a party: its seats), and the gain since the previous election.
{
"name": "results_by_municipality",
"arguments": {
"election": "2022",
"race": 4,
"party": "SDA",
"sort": "vs_average"
}
}{
"election": "opci-2022",
"preliminary": false,
"count_as_of": "1. 11. 2022. u 10:28",
"race": 4,
"race_name": "Predstavnički dom Parlamenta FBiH",
"party": "SDA",
"name": "SDA",
"votes": 229103,
"average_share": 25.46,
"municipalities": [
{
"code": "141",
"municipality": "Trnovo (FBiH)",
"entity": "FBiH",
"votes": 1202,
"valid": 1832,
"share": 65.61,
"vs_average": 40.15,
"turnout": 77.59
},
…compare#
Poređenje
Poređenje s mape („Uporedi s”) u brojevima, općinu po općinu, u jednoj utrci: stranka ili kandidat prema sebi na ranijim izborima iste vrste (zadano prethodnim), ili prema drugoj stranci ili kandidatu iste utrke i istih izbora. Za svaku općinu u kojoj su obje strane bile na listiću: oba udjela u važećim glasovima, odstupanje svake strane od vlastitog prosjeka (vs_average, other_vs_average) i diff, razlika udjela u postotnim poenima; prema ranijim izborima to je promjena od tada. Uz to zbir preko zajedničkih općina i šest općina s najvećim padom i rastom (prema protivniku: zaostatkom i prednošću), među onima s najmanje 1.000 važećih glasova.
Za pitanja kako se stranka ili kandidat promijenio od prošlih izbora i gdje, i kako stoji prema protivniku. Link map otvara mapu samog poređenja (prema=prethodni ili prema=<protivnik>), a trends istu stranku ili kandidata na stranici „Kroz godine”. Sa ranijim izborima koji nisu prethodni mapa poređenja ne postoji, pa odgovor daje dvije mape (map, map_versus). Kod ranijih izbora kasniji su uvijek „subjekt”, pa je diff promjena od ranijih. Stranka se poredi sa strankom, kandidat s kandidatom; kandidat prema listi svoje stranke je u results_by_municipality.
Parametri
electionstring- Izbori subjekta (oznaka ili godina). Bez njega: najnoviji izbori. Prema drugim izborima uzimaju se kasniji od dva.
raceinteger- Utrka po CIK-ovom broju (tabela „Utrke” ispod). Kod kandidata ne treba: osoba se na jednim izborima kandiduje jednom.
12456789 partystring- Stranka po kratkom nazivu (SDA, SNSD, HDZ BiH, SDP), kako ga daje pretraga. Koalicije s istim kratkim nazivom računaju se kao ta stranka.
personstring- Kandidat po oznaci iz pretrage (
denis-becirovic). Puno ime prolazi ako ga ima samo jedna osoba. versus_electionstring- Drugi izbori iste vrste (oznaka ili godina). Bez njega i bez protivnika: prethodni izbori iste vrste s tom utrkom.
versus_partystring- Druga stranka iste utrke i istih izbora, po kratkom nazivu.
versus_personstring- Drugi kandidat iste utrke i istih izbora, po oznaci.
sortstring- Redoslijed općina, od najveće vrijednosti:
diff(razlika, zadano),share,votesilivs_average.diffsharevotesvs_average
Opis koji model dobija
The comparison of the app's map ("Uporedi s") as numbers, municipality by municipality, in one race: a party or a candidate against itself in an earlier election of the same kind (the one before, unless versus_election names another), or against another party or candidate of the same race and election (versus_party, versus_person). For every municipality both sides were on the ballot in: both shares of the valid votes, each side's distance from its own average (vs_average, other_vs_average) and diff, the subject's share minus the other side's in percentage points; against an earlier election that is the change since it. largest_falls and largest_rises (against a rival largest_deficits and largest_leads) are the municipalities with at least 1,000 valid votes where diff is lowest and highest: the first are where to work. "map" opens the map of the comparison itself, which is the view to give for a question comparing two elections or two rivals. For a party through every election use party_history; for a candidate against the list of their own party, results_by_municipality.
{
"name": "compare",
"arguments": {
"election": "2026",
"race": 4,
"party": "SDA"
}
}{
"race": 4,
"race_name": "Predstavnički dom Parlamenta FBiH",
"subject": {
"election": "opci-2026",
"preliminary": true,
"count_as_of": "5. 10. 2026. u 22:30",
"party": "SDA",
"name": "SDA",
"votes": 230927,
"average_share": 31.81,
"municipalities": 75
},
"versus": {
"election": "opci-2022",
"preliminary": false,
"count_as_of": "1. 11. 2022. u 10:28",
"party": "SDA",
"name": "SDA",
"votes": 229103,
"average_share": 25.46,
"municipalities": 76
},
"compared": {
"municipalities": 75,
"share": 31.81,
"other_share": 25.45,
"diff": 6.36,
"municipalities_higher": 56,
"municipalities_lower": 19
},
"largest_falls": [
{
"code": "005",
"municipality": "Bužim",
"share": 45.42,
"other_share": 58.18,
"diff": -12.76,
"votes_diff": -1372
},
…mandates#
Mandati
Mandati utrke s listama, kao na stranici „Mandati”: svaka stranka s glasovima, udjelom i mandatima (kod PS BiH, Parlamenta FBiH i NSRS kompenzacijski posebno), koliko joj je glasova falilo do još jednog mandata i od koje bi ga liste preuzela; kod ta tri doma i direktni mandati svake izborne jedinice; i kandidati s najviše preferencijalnih glasova, uz to jesu li ispred redoslijeda liste (20 % glasova liste, u vijeću 10 %) i jesu li izabrani. Dok su rezultati preliminarni, mandati i izabrani su projekcija CIK-ovim računom, a ključevi tada počinju sa projected_.
Za pitanja ko je dobio koliko mandata, koliko je stranci falilo za još jedan, od koga bi ga uzela i ko ulazi na preferencijalne glasove. Kantoni i vijeća su zasebni domovi: uz unit se dobija jedan, a bez njega kod kantona svih deset (samo stranke s mandatom i dvije najbliže mandatu), kod vijeća zbir vijećnika svake stranke kroz sva vijeća. Uz party odgovor je samo ta stranka: njeni mandati i svaka njena lista s kandidatima koji uzimaju direktne mandate liste i trojicom sljedećih. Redoslijed je zakonski (prvo kandidati s dovoljno preferencijalnih glasova, po glasovima, pa redoslijed liste) i na konačnim izborima daje CIK-ove izabrane u 3.404 od 3.408 lista s mandatom. Ko uzima kompenzacijske mandate nije u bazi. Link page vodi na stranicu „Mandati”.
Parametri
electionstring- Izbori po oznaci (
opci-2022,lokalni-2024) ili po godini. Bez njega: najnoviji izbori. raceintegerobavezan- Utrka s listama: 2, 4, 6, 7 ili 9.
24679 unitstring- Kanton (utrka 7) ili općina (utrka 9) po nazivu ili šifri, za njenu skupštinu ili vijeće; kod utrka 2, 4 i 6 izborna jedinica, za njene direktne mandate.
partystring- Stranka po kratkom nazivu (SDA, SNSD, HDZ BiH, SDP), kako ga daje pretraga. Koalicije s istim kratkim nazivom računaju se kao ta stranka. Daje samo tu stranku: mandate i kandidate koji ulaze sa svake njene liste. Kod vijeća samo uz
unit.
Opis koji model dobija
The seats of a race with lists, as the app's page of mandates (/mandati) has them: every party with its votes, share and seats (compensatory seats apart in the parliaments of BiH, FBiH and RS), how many votes it was short of one more seat and from which list it would have taken it; for those three parliaments the direct seats of every electoral unit; and the candidates with the most preference votes, whether their votes put them ahead of the order of their list (20 % of the list's votes, in a council 10 %) and whether they are elected. While a count is preliminary the seats and who is elected are a projection by the arithmetic CIK uses (Sainte-Laguë, 3 % threshold, compensatory seats per entity), which gives every seat CIK gave in 2018 and 2022: the keys then begin with projected_, and the answer must say it is a projection. The ten cantonal assemblies and the councils are chambers of their own: "unit" picks one.
{
"name": "mandates",
"arguments": {
"election": "2022",
"race": 7,
"unit": "Kanton Sarajevo"
}
}{
"election": "opci-2022",
"preliminary": false,
"count_as_of": "1. 11. 2022. u 10:28",
"race": 7,
"race_name": "Skupštine kantona",
"chamber": { "code": "209", "name": "Kanton Sarajevo" },
"seats": 35,
"list_votes": 214771,
"parties": [
{
"party": "SDA",
"votes": 39208,
"share": 18.26,
"seats": 7,
"short_of_next_seat": { "votes": 2553, "taken_from": "DF" }
},
{
"party": "NiP",
"votes": 39146,
"share": 18.23,
"seats": 7,
"short_of_next_seat": { "votes": 2615, "taken_from": "DF" }
},
{
"party": "SDP",
"votes": 33816,
"share": 15.75,
"seats": 6,
"short_of_next_seat": { "votes": 2377, "taken_from": "DF" }
},
…party_history#
Stranka kroz izbore
Stranka na svim izborima i u svim utrkama od 2016: glasovi, udio i mandati, u cijeloj zemlji ili u jednom području (entitet ili općina). Uz utrku i taj nivo u svakoj općini područja kroz godine, promjenu između zadnja dva izbora i općine s najvećim padom i rastom, kao na stranici „Kroz godine”. Uz to kandidati stranke bez liste (Predsjedništvo, predsjednik RS, načelnici) prema njenim listama na drugom listiću istog dana (candidates_vs_lists).
Za pitanja o rastu i padu stranke od izbora do izbora, u cijeloj zemlji, entitetu ili jednoj općini. Udio se računa samo u općinama u kojima je stranka bila na listiću, pa se od izbora do izbora može odnositi na različit broj općina (municipalities). Link trends otvara stranicu „Kroz godine” s istim izborom vrste, područja i nivoa.
Parametri
partystringobavezan- Stranka po kratkom nazivu (SDA, SNSD, HDZ BiH, SDP), kako ga daje pretraga. Koalicije s istim kratkim nazivom računaju se kao ta stranka. Prolazi i puni naziv neke njene liste.
areastringFBiH,RSili općina po nazivu ili šifri: glasovi i udio stranke u tom području na svakim izborima (in_area).kindstring- Samo opći (
general) ili samo lokalni (local) izbori.generallocal raceinteger- Utrka po CIK-ovom broju (tabela „Utrke” ispod). Dodaje taj nivo po općinama kroz godine (
by_municipality).12456789
Opis koji model dobija
A party in every election and race it ran in since 2016: votes, share and seats, in the whole country or within an area (an entity or a municipality). With "race": that level in every municipality of the area election by election, the change between the last two elections it ran in, and the municipalities where it fell and rose the most, as the app's page "Kroz godine" has them. Also the party's candidates without a list (Presidency, president of RS, mayors) against its lists on the other ballot of the same day: vs_party_list is their votes as a percentage of the lists'. For two elections in depth, or a party against a rival, use compare.
{
"name": "party_history",
"arguments": {
"party": "SDA",
"area": "Tuzla",
"kind": "general"
}
}{
"party": "SDA",
"list_names": ["SDA - STRANKA DEMOKRATSKE AKCIJE", "SDA - SBIH", …],
"area": { "code": "050", "name": "Tuzla" },
"runs": [
{
"election": "opci-2018",
"year": 2018,
"kind": "general",
"preliminary": false,
"race": 2,
"race_name": "Predstavnički dom PS BiH",
"votes": 281731,
"mandates": 9,
"share": 16.89,
"municipalities": 143,
"in_area": { "votes": 5677, "valid": 48680, "share": 11.66, "municipalities": 1 }
},
…person_history#
Kandidat kroz izbore
Svaka kandidatura jedne osobe od 2016: utrka, jedinica, stranka, glasovi, udio, mjesto na listi i je li izabrana, s linkom na mapu svake kandidature.
Za pitanja o jednom kandidatu kroz cikluse. Kod kandidata s liste glasovi su preferencijalni, a share_of_list je njihov udio u glasovima liste.
Parametri
personstringobavezan- Kandidat po oznaci iz pretrage (
denis-becirovic). Puno ime prolazi ako ga ima samo jedna osoba.
Opis koji model dobija
Every candidacy of one person since 2016: race, unit, party, votes, share, place on the list and whether elected.
{
"name": "person_history",
"arguments": {
"person": "bakir-izetbegovic"
}
}{
"person": "bakir-izetbegovic",
"name": "Bakir Izetbegović",
"candidacies": [
{
"election": "opci-2022",
"year": 2022,
"preliminary": false,
"race": 1,
"race_name": "Predsjedništvo BiH",
"unit": { "code": "701702", "name": "Predsjedništvo BiH: bošnjački i hrvatski član" },
"seat": "bosniak",
"party": "SDA",
"votes": 214412,
"share": 37.25,
"elected": false,
"map": "https://izbori.podaci.org/?izbori=opci-2022&utrka=1&kandidat=bakir-izetbegovic"
},
…position_history#
Svi kandidati za jednu poziciju
Svi koji su se kroz izbore kandidovali za istu poziciju, od najjačeg: član Predsjedništva, predsjednik RS, načelnik općine, ili mandati jedne izborne jedinice, kantona ili vijeća (tu po preferencijalnim glasovima).
Za poređenje kandidata na istoj poziciji kroz godine: ko je bio prvi, s koliko glasova i s kojim udjelom. Link trends otvara grafikon te pozicije na stranici „Kroz godine”: prvi sa zadnjih izbora i trojica iza njega.
Parametri
raceintegerobavezan- Utrka po CIK-ovom broju (tabela „Utrke” ispod).
12456789 unitstring- Jedinica po šifri ili nazivu, kao u
race_results; kod načelnika i vijeća općina. Ne treba za Predsjedništvo kad je datseat, ni za predsjednika RS. seatstring- Član Predsjedništva:
bosniak(bošnjački),croat(hrvatski) iliserb(srpski).bosniakcroatserb per_electioninteger 1–50- Koliko kandidata sa svakih izbora, od najjačeg (zadano 10).
Opis koji model dobija
Everyone who ran for the same position through the elections, strongest first: a member of the Presidency, the president of RS, the mayor of a municipality, or the seats of one electoral unit, canton or council (there by preference votes).
{
"name": "position_history",
"arguments": {
"race": 1,
"seat": "serb",
"per_election": 3
}
}{
"race": 1,
"race_name": "Predsjedništvo BiH",
"unit": { "code": "703", "name": "Predsjedništvo BiH: srpski član" },
"seat": "serb",
"elections": [
{
"election": "opci-2018",
"year": 2018,
"candidates": [
{ "person": "milorad-dodik", "name": "Milorad Dodik", "party": "SNSD", "votes": 368210, "share": 53.88, "elected": true },
{ "person": "mladen-ivanic", "name": "Mladen Ivanić", "party": "Savez za pobjedu", "votes": 292065, "share": 42.74, "elected": false },
{ "person": "mirjana-popovic", "name": "Mirjana Popović", "party": "SNS", "votes": 12731, "share": 1.86, "elected": false }
]
},
…polling_station#
Jedno biračko mjesto
Jedno biračko mjesto jednih izbora i svaki listić koji se na njemu brojao: izlaznost uz izlaznost općine, važeći i nevažeći listići i glasovi svake liste ili kandidata, uz približan položaj mjesta.
Za pitanja o jednom mjestu, kao „ko je pobijedio u mojoj školi”. Liste su bez preferencijalnih glasova, koji se po mjestu ne čuvaju.
Parametri
electionstring- Izbori po oznaci (
opci-2022,lokalni-2024) ili po godini. Bez njega: najnoviji izbori. stationstringobavezan- Šifra mjesta (
136A001), ili naziv ili adresa koju ima samo jedno mjesto tih izbora; pretraga ih nalazi.
Opis koji model dobija
One polling station of an election and every ballot counted there: turnout next to the municipality's, valid and invalid ballots, and the votes of every list or candidate. Lists come without preference votes, which are not kept by polling station.
{
"name": "polling_station",
"arguments": {
"election": "2022",
"station": "136A001"
}
}{
"election": "opci-2022",
"preliminary": false,
"count_as_of": "1. 11. 2022. u 10:28",
"station": {
"code": "136A001",
"name": "BARDAKČIJE 1",
"address": "OŠ ALIJA NAMETAK, Z.ŠARCA 15",
"municipality": "Centar Sarajevo",
"municipality_code": "136",
"position": { "lon": 18.42195, "lat": 43.8653, "of": "building", "place": "OŠ Alija Nametak" }
},
"ballots": [
{
"race": 1,
"race_name": "Predsjedništvo BiH",
"unit": { "code": "701702", "name": "Predsjedništvo BiH: bošnjački i hrvatski član" },
"registered": 618,
"ballots_cast": 354,
"turnout": 57.28,
"municipality_turnout": 53.07,
"valid": 336,
"invalid_blank": 3,
"invalid_other": 15,
"results": [
{ "person": "denis-becirovic", "name": "Denis Bećirović", "party": "Ujedinjeni za slobodnu BiH", "votes": 173, "share": 51.49 },
…polling_stations#
Biračka mjesta općine
Svako biračko mjesto jedne općine u jednoj utrci, s izlaznošću i glasovima stranke ili pojedinačnog kandidata; bez njih, s onim ko je na svakom mjestu bio prvi. Pojedinačni kandidat (Predsjedništvo, predsjednik RS, načelnik) dolazi i s glasovima liste svoje stranke na istom mjestu (party_list_votes, vs_party_list).
Za pitanja gdje je unutar jedne općine stranka ili kandidat jak, a gdje slab, i na kojim mjestima kandidata nisu zaokružili ni birači njegove stranke. Ne radi za kandidate s lista, jer se preferencijalni glasovi po mjestu ne čuvaju: za njih je results_by_municipality.
Parametri
electionstring- Izbori po oznaci (
opci-2022,lokalni-2024) ili po godini. Bez njega: najnoviji izbori. raceinteger- Utrka po CIK-ovom broju (tabela „Utrke” ispod). Kod kandidata ne treba.
12456789 municipalitystringobavezan- Općina po nazivu (Tuzla, Centar Sarajevo, Brčko distrikt) ili CIK šifri (050).
partystring- Stranka po kratkom nazivu (SDA, SNSD, HDZ BiH, SDP), kako ga daje pretraga. Koalicije s istim kratkim nazivom računaju se kao ta stranka.
personstring- Kandidat po oznaci iz pretrage (
denis-becirovic). Puno ime prolazi ako ga ima samo jedna osoba. Samo pojedinačni kandidati: Predsjedništvo, predsjednik RS, načelnici.
Opis koji model dobija
Every polling station of one municipality on one race, with turnout and either the votes of a party or single candidate, or who came first at each. Shows where within a municipality a party or candidate is strong and weak. A single candidate (Presidency, president of RS, mayor) also comes with the lists of their party at each station (vs_party_list), as in results_by_municipality. Not for candidates on lists: preference votes are not kept by polling station.
{
"name": "polling_stations",
"arguments": {
"election": "2022",
"race": 4,
"municipality": "Centar Sarajevo",
"party": "SDA"
}
}{
"election": "opci-2022",
"preliminary": false,
"count_as_of": "1. 11. 2022. u 10:28",
"race": 4,
"race_name": "Predstavnički dom Parlamenta FBiH",
"municipality": { "code": "136", "name": "Centar Sarajevo" },
"party": "SDA",
"ballots": [
{
"unit": { "code": "411", "name": "Izborna jedinica 11" },
"stations": [
{
"code": "136A001",
"name": "BARDAKČIJE 1",
"address": "OŠ ALIJA NAMETAK, Z.ŠARCA 15",
"registered": 618,
"turnout": 57.28,
"valid": 336,
"votes": 45,
"share": 13.39
},
…Pojmovi#
Izbori
Alati primaju oznaku izbora ili samo godinu, jer je svake godine jedni izbori. Bez izbora uzimaju se najnoviji.
| Oznaka | Izbori | Datum | Utrke | Stanje |
|---|---|---|---|---|
opci-2026 | Opći izbori 2026 | 4. 10. 2026. | 1, 2, 4, 7, 5, 6 | Preliminarno stanje 7. 10. 2026. u 03:45 |
lokalni-2024 | Lokalni izbori 2024 | 6. 10. 2024. | 9, 8 | konačni rezultati |
opci-2022 | Opći izbori 2022 | 2. 10. 2022. | 1, 2, 4, 7, 5, 6 | konačni rezultati |
lokalni-2020 | Lokalni izbori 2020 | 15. 11. 2020. | 9, 8 | konačni rezultati |
opci-2018 | Opći izbori 2018 | 7. 10. 2018. | 1, 2, 4, 7, 5, 6 | konačni rezultati |
lokalni-2016 | Lokalni izbori 2016 | 2. 10. 2016. | 9, 8 | konačni rezultati |
Utrke
Utrka je ono što se bira, a broj je CIK-ov (utrke 3 u bazi nema). Utrke s listama dijele mandate po izbornim jedinicama; na lokalnim izborima jedinica je općina.
| Broj | Utrka | Izbori | Na listiću | Izborne jedinice (unit) |
|---|---|---|---|---|
1 | Predsjedništvo BiH | opći | kandidati | 701702 bošnjački i hrvatski član (FBiH), 703 srpski član (RS) |
2 | Predstavnički dom PS BiH | opći | liste | 511–515 (1A–5A) u FBiH, 521–523 (1B–3B) u RS |
4 | Predstavnički dom Parlamenta FBiH | opći | liste | 401–412 |
7 | Skupštine kantona | opći | liste | 201–210, po jedan kanton |
5 | Predsjednik RS | opći | kandidati | 600 |
6 | Narodna skupština RS | opći | liste | 301–309 |
8 | Načelnici i gradonačelnici | lokalni | kandidati | općina, po CIK šifri |
9 | Općinska vijeća i skupštine | lokalni | liste | općina, po CIK šifri |
Oznake i brojevi u odgovorima
- Općina
- CIK-ova šifra od tri cifre (
code,municipality_code) i naziv latinicom. Baza ima 143 općine: 79 u FBiH, 63 u RS i Brčko distrikt, koji je jedna općina sa šifrom200, iako ga CIK vodi kao dvije jedinice. Alati primaju naziv ili šifru: „Tuzla”, „Centar Sarajevo”, „050”. - Stranka
- Kratki naziv (
party): SDA, SNSD, HDZ BiH. Koalicije dobijaju novu CIK šifru u svakoj jedinici, pa se liste s istim kratkim nazivom računaju kao jedna stranka, a puni naziv liste je ulist_name. Lista bez kratkog naziva nosi puni CIK-ov naziv. Ako naziv odgovara za više stranaka („HDZ”), alat ih nabroji. - Osoba
- Stalna oznaka osobe kroz sve izbore (
person):bakir-izetbegovic; imenjaci dobijaju broj (mirko-sarovic-2). Kandidatura se kroz cikluse veže za istu osobu samo kad se uz ime slaže i stranka, utrka ili područje. - Biračko mjesto
- CIK-ova šifra unutar jednih izbora (
136A001). Šifre se od izbora do izbora prenumerišu, pa ista šifra ne znači uvijek isto mjesto. - Udio
- Postotak na dvije decimale (
share). Urace_resultsimandatesje to udio u glasovima svih lista ili kandidata na listiću, uresults_by_municipality,compareiparty_historyudio u važećim glasovima općine.vs_average(odstupanje od vlastitog prosjeka),diff(razlika dviju strana poređenja) ichange(promjena između dvoje izbora) su u postotnim poenima. - Preferencijalni glasovi
- Glasovi kandidatu s liste (
preference_votes,share_of_list). Kandidat s najmanje 20 % glasova svoje liste, u vijeću 10 %, ide ispred redoslijeda liste. - Stanje brojanja
- Svaki odgovor kaže jesu li rezultati preliminarni (
preliminary) i od kada je stanje (count_as_of). Dok su preliminarni,mandatesielectedsunull, aprojected_mandatesje projekcija; u alatumandatestada svaki ključ koji je projekcija počinje saprojected_(projected_seats,projected_elected). - Linkovi
map,trendsipagevode na isti prikaz u aplikaciji: na mapu, na stranicu „Kroz godine” i na stranicu „Mandati”. Kod poređenjamapotvara mapu samog poređenja (prema=prethodni,prema=listaili protivnik), a gdje takve mape nema, uz nju je imap_versus. Server uputama traži od modela da ih da korisniku, a kod poređenja mapu poređenja umjesto dvije mape. Uz glavni link jeimage, slika istog prikaza (PNG 1200 × 630, kao pod „Linkovi i slike”). Klijenti koji crtaju MCP Apps (Claude na webu, desktopu i telefonu, ChatGPT, VS Code, Cursor) tu sliku prikazuju ispod odgovora alata, s dugmadi za otvaranje prikaza i preuzimanje slike; Claude prije prvog prikaza pita za dozvolu. U tekstu odgovora slike s drugih domena ne prikazuju, pa je model tamo daje kao link.
Šta treba znati o brojevima#
- Opći izbori 2026 su preliminarni.U bazi je CIK-ovo stanje od 7. 10. 2026. u 03:45, a novije stiže s novim uvozom. Server uputama traži od modela da to kaže.
- Općina broji redovna biračka mjesta.Na općim izborima su glasovi poštom, u odsustvu i mobilnih timova samo u zbiru izborne jedinice, pa zbir općina nije zbir jedinice. Na lokalnim izborima jedinica je sama općina, pa su u njoj svi.
- Preferencijalni glasovi po biračkom mjestu nisu u bazi.Po općini i po jedinici jesu; zato
polling_stationsne radi za kandidate s lista. - Položaj biračkog mjesta je približan.CIK ne objavljuje koordinate, pa mjesto stoji na naselju ili zgradi istog naziva iz OpenStreetMapa, a gdje ni to ne uspije, na sjedištu općine;
ofkaže koje je (settlement,building,town). - Projekcija mandata je račun, a ne CIK-ova odluka.Sainte-Laguë među listama s više od 3 % glasova i kompenzacijski mandati po entitetu ponavljaju svaki mandat 2018. i 2022. i svako vijeće 2016–2024, a projicira se samo utrka u kojoj se račun slagao na svim ranijim izborima iste vrste.
- Ponovljeni izbori su uz svoj ciklus.Stolac 2017. je u lokalnim izborima 2016, a Mostar (decembar 2020), Doboj i Srebrenica (februar 2021) u lokalnim izborima 2020. Mostar 2016. nije glasao.
- Čega u bazi nema.Prijevremenih izbora, kandidata nacionalnih manjina za vijeća, šest gradskih područja Mostara (grad je jedna općina) ni Grada Istočno Sarajevo.
- Dugi popisi su skraćeni.Utrka u cjelini daje najviše 25 stranaka, a ostale zbirno (
other_parties);mandatesbez jedinice kod kantona daje samo stranke s mandatom i dvije najbliže mandatu, a kod vijeća zbir vijećnika po stranci; greška koja nabraja moguće izbore daje najviše 30.
Za programere#
Server je javan i bez prijave, pa ga može zvati svaki program, ne samo AI klijent: poruke su JSON-RPC 2.0, a prijenos je Streamable HTTP iz MCP specifikacije, u najjednostavnijem obliku.
- Zahtjev
POST https://izbori.podaci.org/mcpsContent-Type: application/json; tijelo je jedna JSON-RPC poruka ili niz do 20 poruka.- Odgovor
- Uvijek
application/json, komprimovan ako klijent to prihvata. Server ne otvara SSE tok i ne izdajeMcp-Session-Id: svaki zahtjev stoji sam za sebe. - Verzije
2025-11-25,2025-06-18,2025-03-26,2024-11-05: revizije koje počinju sainitialize. Klijent koji traži drugu dobija2025-11-25. Najnoviju reviziju,2026-07-28, kojainitializeukida, server još ne govori; klijent koji zna obje to prepozna (server/discoverdobija-32601) i spoji se starijom.- Metode
initialize,ping,tools/list,tools/call,resources/list,resources/read.initializenije obavezan, a obavještenja (notifications/…) dobijaju 202 bez tijela.- MCP App
- Proširenje MCP Apps, revizija
2026-01-26. Alati s prikazom u_meta.ui.resourceUrinavode stranicuui://izbori/prikaz-1(text/html;profile=mcp-app), a odgovor u_metanosi sliku i link za nju (org.podaci.izbori/view), koje model ne vidi. Stranica ne učitava skripte s drugih adresa, samo slike sahttps://izbori.podaci.org. - Mogućnosti
- Samo
tools, bez resursa, promptova i poziva prema klijentu. Svaki alat nosireadOnlyHint: true. - Rezultat alata
result.content[0].textje JSON zapisan kao tekst.- Greške
- Pogrešan argument, nepoznat naziv ili naziv koji odgovara za više stvari je rezultat alata s
isError: truei porukom koja kaže šta postoji, da model ili program pita ponovo. Greške protokola su JSON-RPC:-32700neispravan JSON,-32600neispravna poruka,-32601nepoznata metoda,-32602nepoznat alat,-32603greška servera. - Ograničenja
- Tijelo do 64 KB (inače 413). Najviše 100 zahtjeva u 10 sekundi s jedne IP adrese, računajući i stranice sajta (inače 429, a nakon 10 sekundi opet prolazi).
- CORS
- Otvoren (
Access-Control-Allow-Origin: *), pa server mogu zvati i stranice iz preglednika. - GET
- MCP klijent dobija 405, jer server ništa ne šalje sam; preglednik se preusmjerava na ovu stranicu.
Primjeri poziva
Poziv alata iz komandne linije, iz JavaScripta i Pythona, i zvaničnim klijentom za provjeru servera.
curl -s https://izbori.podaci.org/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'curl -s https://izbori.podaci.org/mcp \
-H 'Content-Type: application/json' \
-H 'Accept: application/json, text/event-stream' \
-d '{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"results_by_municipality","arguments":{"election":"2022","race":4,"party":"SDA"}}}'async function call(name, args) {
const response = await fetch('https://izbori.podaci.org/mcp', {
method: 'POST',
headers: { 'Content-Type': 'application/json', Accept: 'application/json, text/event-stream' },
body: JSON.stringify({ jsonrpc: '2.0', id: 1, method: 'tools/call', params: { name, arguments: args } }),
});
const { result } = await response.json();
const text = result.content[0].text;
if (result.isError) throw new Error(text);
return JSON.parse(text);
}
const answer = await call('results_by_municipality', { election: '2022', race: 4, party: 'SDA' });
console.log(answer.municipalities.slice(0, 5));Bez dodatnih paketa. Cloudflare odbija zadani User-Agent Pythonovog urlliba (403), pa ga primjer postavlja sam; httpx i requests prolaze i bez toga.
import json
import urllib.request
URL = "https://izbori.podaci.org/mcp"
def call(tool, **arguments):
message = {"jsonrpc": "2.0", "id": 1, "method": "tools/call",
"params": {"name": tool, "arguments": arguments}}
request = urllib.request.Request(
URL, data=json.dumps(message).encode(), method="POST",
headers={"Content-Type": "application/json", "User-Agent": "moj-program/1.0",
"Accept": "application/json, text/event-stream"})
with urllib.request.urlopen(request) as response:
result = json.load(response)["result"]
text = result["content"][0]["text"]
if result.get("isError"):
raise ValueError(text)
return json.loads(text)
answer = call("results_by_municipality", election="2022", race=4, party="SDA")
for row in answer["municipalities"][:5]:
print(f'{row["municipality"]:<22} {row["share"]:>6.2f} %')Zvanični klijent za provjeru servera, iz komandne linije:
npx @modelcontextprotocol/inspector --cli https://izbori.podaci.org/mcp --transport http --method tools/list
npx @modelcontextprotocol/inspector --cli https://izbori.podaci.org/mcp --transport http \
--method tools/call --tool-name search --tool-arg query=izetbegovicGreška alata
Greška alata stiže kao rezultat, s porukom koja nabraja šta postoji, da model ili program pita ponovo:
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"content": [{ "type": "text", "text": "\"Sarajevo\" fits several municipalities: 136 Centar Sarajevo; 137 Stari Grad Sarajevo; 139 Novo Sarajevo; 140 Istočno Novo Sarajevo; 133 Novi Grad Sarajevo." }],
"isError": true
}
}Linkovi i slike ekrana#
Za ugradnju rezultata u tekst, objavu ili vlastitu stranicu ne treba kod: svaki ekran aplikacije ima adresu koja ga otvara takvog kakav je, i sliku koju crta server. Adresa se dobija i dugmetom „Podijeli” na samom ekranu.
Adrese ekrana
| Parametar | Značenje |
|---|---|
Mapa: / | |
izbori | Oznaka izbora (opci-2022); bez nje najnoviji. |
utrka | Broj utrke (tabela „Utrke”). |
stranka | Kratki naziv stranke; ili kandidat, oznaka osobe. Bez njih vodeća stranka ili kandidat. |
prikaz | glasovi ili prosjek (odstupanje od prosjeka); bez njega udio. |
nivo | mjesta: biračka mjesta umjesto općina. |
prema | Poređenje: prethodni (isti subjekt na prethodnim izborima iste vrste) ili druga stranka ili kandidat iz iste utrke. |
opcina | CIK šifra općine čiji je panel otvoren; ili mjesto, šifra biračkog mjesta. |
Mandati: /mandati | |
izbori, utrka | Kao na mapi; utrke s listama (2, 4, 6, 7, 9). |
Kroz godine: /analiza | |
stranka | Kratki naziv; uz nju vrsta (opci, lokalni), podrucje (FBiH, RS ili šifra općine) i utrka. |
kandidat | Oznaka osobe; uz nju pozicija (utrka, jedinica, kod Predsjedništva i clan) i uz: do tri osobe za poređenje, odvojene zarezom. |
https://izbori.podaci.org/?izbori=opci-2022&utrka=4&stranka=SDA&opcina=136Slike
Slika ekrana je PNG koji crta server za istu adresu: /api/card za mapu, /api/card/mandati i /api/card/analiza za druge dvije stranice, uz isti upit. Društvene mreže je same prikažu uz link na ekran.
| Parametar | Značenje |
|---|---|
oblik=uspravno | 1080 × 1350, za objavu; bez njega 1200 × 630, za pregled linka. |
tema=tamna | Tamna tema. |
paleta=zastava | Boje zastave; bez nje Papir. |
preuzmi=1 | Fajl za spremanje umjesto slike u pregledniku. |
/api/card?izbori=opci-2022&utrka=4&stranka=SDA<a href="https://izbori.podaci.org/?izbori=opci-2022&utrka=4&stranka=SDA">
<img src="https://izbori.podaci.org/api/card?izbori=opci-2022&utrka=4&stranka=SDA"
alt="SDA po općinama, Parlament FBiH 2022." width="1200" height="630">
</a>Ostale rute pod /api/ služe samo ekranu: van stranice ih Cloudflare odbija (403), a mijenjaju se bez najave. Za podatke je MCP server: njegovi alati i parametri se ne mijenjaju bez zapisa pod „Promjene”.
Izvori i privatnost#
- Rezultati
- Centralna izborna komisija BiH (izbori.ba i rezultati.izbori.ba). Svaki CIK-ov odgovor se prvo arhivira tačno kako je stigao, a baza se gradi iz te arhive.
- Položaji i naselja
- © OpenStreetMap contributors, pod licencom ODbL, koja traži navođenje izvora.
- Granice općina
- geoBoundaries (BIH ADM3, stanje 2013) sa CIK-ovim šiframa.
- Navođenje
- Uz brojeve je dovoljno: „Izvor: CIK BiH, obrada Izborna mapa BiH (izbori.podaci.org)”, a uz položaje mjesta i „© OpenStreetMap contributors”.
- Privatnost
- Server ne traži prijavu i ne bilježi pitanja ni odgovore; kad alat padne, bilježi se samo njegov naziv i greška. Zahtjevi prolaze kroz Cloudflare. Razgovor s AI asistentom vidi i čuva njegov pružalac, po vlastitim uslovima.
Promjene#
Verzija servera je ona koju daje initialize (serverInfo.version).
0.3.3Sadašnjathanksithanks_imageuresults_by_municipalityima i stranka: kartica zahvale s njenim glasovima, udjelom, mandatima (ili projekcijom dok brojanje traje) i porastom od prethodnih izbora.
0.3.2results_by_municipalityza kandidata daje ithanks, link kojim kandidat zahvaljuje biračima, ithanks_image, njegovu karticu zahvale (glasovi, rang na listi ili u utrci i porast od prethodnih izbora;&oblik=uspravnoje uspravna, za objavu).
0.3.1- Link na mapu bez stranke i kandidata (
race_results,polling_station) i njegova slika (image) pokazuju „Ko vodi gdje”: svaka općina, odnosno biračko mjesto, u boji stranke ili kandidata koji je tu prvi. Do sada su pokazivali vodeću stranku ili kandidata utrke.
- Link na mapu bez stranke i kandidata (
0.3.0- MCP App: klijenti koji crtaju MCP Apps (Claude na webu, desktopu i telefonu, ChatGPT, VS Code, Cursor) ispod odgovora alata prikazuju sliku istog prikaza, s dugmadi „Otvori u Izbornoj mapi” i „Preuzmi sliku”, u svijetloj ili tamnoj temi klijenta. Model čita isti odgovor kao i do sada.
- Server ima resurse:
resources/listiresources/readdaju stranicu tog prikaza (ui://izbori/prikaz-1), a alati s prikazom je navode u_meta.ui.resourceUri.
0.2.1- Uz glavni link (
map,trendsilipage) svaki odgovor ima iimage: sliku istog prikaza koju crta server (PNG 1200 × 630, ista kao u pregledu podijeljenog linka). Svi alati osimlist_electionsisearch.
- Uz glavni link (
0.2.0- Novi alat
compare: poređenje s mape („Uporedi s”) u brojevima, prema ranijim izborima ili protivniku, s linkom na mapu samog poređenja. Do sada je model za pitanje „kako je to 2026. prema 2022.” zvao dva putaresults_by_municipalityi davao dvije mape. - Novi alat
mandates: stranica „Mandati” u brojevima, s kompenzacijskim mandatima, manjkom glasova do još jednog mandata, mandatima po izbornoj jedinici i kandidatima koji ulaze na preferencijalne glasove; uzpartysvaka lista stranke s kandidatima koji uzimaju njene mandate i onima koji su sljedeći. - Alat
party_history: parametarmunicipalityje zamijenjen parametromarea, koji prima i entitet (odgovorin_municipalityje sadain_area). Novi parametarracedaje taj nivo po općinama kroz godine, s najvećim padom i rastom, a odgovor ima i kandidate stranke prema njenim listama (candidates_vs_lists). Linktrendsnosi vrstu izbora, područje i nivo. - Alat
polling_stations: pojedinačni kandidat dolazi i s glasovima liste svoje stranke na svakom mjestu (vs_party_list) i linkom na mapu tog poređenja. - Alati
results_by_municipality(map_vs_party_list) iposition_history(trends) daju linkove na prikaze koje do sada nisu imali.
- Novi alat
0.1.1- Dokumentacija na ovoj stranici. Adresa servera otvorena u pregledniku vodi ovamo, a MCP klijenti dobijaju isto što i ranije.
- Alat
search: opis parametraelectionsada kaže modelu da se bez njega traži kroz sve izbore, a ne samo kroz najnovije. - Alat
race_results: kod lokalnih izbora link na mapu uz jedinicu otvara i njenu općinu.
0.1.0- Prvo izdanje: devet alata nad rezultatima općih izbora 2018, 2022. i 2026. i lokalnih izbora 2016, 2020. i 2024.