Skip to main content
Glama

Why AtlasPI exists

AI agents working with historical geography today face a fragmented landscape: raw shapefiles in Natural Earth, unstructured text in Wikipedia, scattered coordinates in Wikidata, and academic datasets locked behind incompatible formats. None of these were designed for machine consumption.

AtlasPI bridges this gap. It provides a single, structured REST API where an AI agent can ask "What territories existed in the Balkans in 1400?" or "Show me the boundary changes of the Ottoman Empire" and get back clean JSON with GeoJSON boundaries, confidence scores, academic citations, and honest metadata about what is certain and what is disputed.

Historical data is never neutral. Borders were drawn through conquest, names were imposed through colonization, populations were erased through genocide. AtlasPI does not sanitize this complexity -- it structures it, documents it, and makes it queryable.


Related MCP server: Seshat MCP Server

Screenshot

AtlasPI Web UI — the world in 1000 CE, 146 historical entities rendered from primary-source boundaries

The web UI supports keyboard shortcuts, deep linking (/app?year=1000), continent filtering, time playback animation, dark/light mode, and full i18n (English/Italian). Try it live at atlaspi.it.


Quick Start

# Clone the repository
git clone https://github.com/Soil911/AtlasPI.git
cd AtlasPI

# Install dependencies
pip install -r requirements.txt

# Run the server (auto-seeds the database on first launch)
python run.py

The API is now live at http://localhost:10100 and the interactive docs at http://localhost:10100/docs.

Docker

docker compose up --build

API Documentation

AtlasPI exposes 23 REST endpoints under /v1/. Full interactive documentation is available at /docs (Swagger UI) and /redoc when the server is running.

Core Endpoints

Method

Endpoint

Description

GET

/v1/entity

Query entities with filters (name, year, status, type)

GET

/v1/entities

Paginated list of all entities

GET

/v1/entities/{id}

Full detail for a single entity

GET

/v1/search?q=

Autocomplete search

GET

/v1/types

List available entity types

GET

/v1/stats

Dataset statistics

GET

/v1/continents

Available continent/region filters

GET

/v1/random

Random entity (with optional type/year/status/continent filters)

GET

/v1/aggregation

Aggregate stats by century, type, continent, status

GET

/v1/nearby?lat=&lon=

Find entities near coordinates (with distance)

GET

/v1/snapshot/{year}

World state at a given year (summary + entities)

GET

/v1/compare/{id1}/{id2}

Structured comparison of two entities

GET

/v1/compare?ids=1,2,3

Multi-entity comparison (2-4) with events, chains, overlap

GET

/v1/entities/{id}/contemporaries

Entities with overlapping time periods

GET

/v1/entities/{id}/related

Related entities by type or region

GET

/v1/entities/{id}/evolution

Full chronological evolution of an entity

GET

/v1/export/geojson

Export as GeoJSON FeatureCollection

GET

/v1/export/csv

Export as CSV

GET

/v1/export/timeline

Export timeline data

GET

/health

Service health check

GET

/embed

Embeddable map view for iframes

GET

/compare

Interactive entity comparison page

Examples

Search for empires active in 1500 CE:

curl "http://localhost:10100/v1/entity?type=empire&year=1500"

Get full details for entity #12:

curl "http://localhost:10100/v1/entities/12"

Find entities contemporary to the Roman Empire:

curl "http://localhost:10100/v1/entities/1/contemporaries"

Export all entities as GeoJSON:

curl "http://localhost:10100/v1/export/geojson" -o atlas.geojson

Find entities near Rome active in 100 CE:

curl "http://localhost:10100/v1/nearby?lat=41.9&lon=12.5&year=100&radius=500"

Snapshot of the world in 1500 CE:

curl "http://localhost:10100/v1/snapshot/1500" | jq '.summary'

Compare two entities side by side:

curl "http://localhost:10100/v1/compare/1/5"

Response Example

{
  "id": 1,
  "name": "Imperium Romanum",
  "name_variants": [
    {"name": "Roman Empire", "language": "en"},
    {"name": "Imperio Romano", "language": "es"}
  ],
  "entity_type": "empire",
  "year_start": -753,
  "year_end": 476,
  "status": "confirmed",
  "confidence_score": 0.95,
  "capital": {"name": "Roma", "lat": 41.9028, "lon": 12.4964},
  "territory_changes": [...],
  "sources": [
    {"citation": "...", "source_type": "academic"}
  ]
}

Dataset Overview

How this data is curated — disclosure and correction (2026-07-23)

Curation of non-boundary records (entities, events, cities, rulers, routes, sites) is AI-assisted: LLM research agents propose metadata and candidate citations, an adversarial verification step rejects citations that do not exist or do not support the claim, and the maintainer supervises the pipeline. Records are not systematically reviewed by professional historians. Until the human citation audit (protocol) is published, treat citations as machine-verified, not human-audited. Earlier versions of this documentation said the dataset was "hand-curated" — that wording was inaccurate and has been retired. Full details: METHODOLOGY §2.4 · ETHICS-028 (EN).

1,006 historical entities + 643 historical events spanning 6,500 years of human civilization, backed by 5,000+ academic sources and documenting 2,000+ territory changes. Plus 1,249 archaeological sites, 105 historical rulers, 29 historical languages, 104 dynasty chains, 41 trade routes, 252 historical cities, and 55 historical periods. Events include battles, treaties, epidemics, genocides, colonial violence, massacres, deportations and natural disasters — with ETHICS-007 (no euphemisms) and ETHICS-008 (known_silence flag for erased/suppressed records).

Coverage by Region

Region

Entities

Examples

Asia

195

Mongol Empire, Qin/Han/Tang/Song/Ming, Tokugawa, Mughal, Khmer, Three Kingdoms

Europe

104

Roman Empire, Byzantine, Kyivan Rus', Hanseatic League, Crusader states, Prussia

Americas

85

Tawantinsuyu (Inca), Aztec, Maya, Haudenosaunee, Empire of Brazil, Taino

Africa

78

Mali, Songhai, Kingdom of Kongo, Great Zimbabwe, Aksum, Zulu, Buganda

Middle East

70

Achaemenid, Ottoman, Abbasid Caliphate, Rashidun, Kingdom of Jerusalem

Oceania & Pacific

8

Aboriginal nations, Maori iwi, Kingdom of Tonga, Hawaiian Kingdom

Entity Types

15 categories: empire | kingdom | republic | confederation | city-state | dynasty | colony | disputed_territory | sultanate | khanate | principality | duchy | caliphate | federation | city

Time Coverage

  • Earliest entity: 4500 BCE (ancient Mesopotamian civilizations)

  • Latest entity: 2024 (modern states and disputed territories)

  • Negative years represent BCE dates (e.g., -753 = 753 BCE)


📖 Citation

If you use AtlasPI in research, teaching, or derivative datasets, please cite the project using the Zenodo concept DOI below. The concept DOI always resolves to the latest release — individual versions get their own per-release DOIs on top.

BibTeX

@software{atlaspi_2026,
  author       = {{AtlasPI Project}},
  title        = {AtlasPI: A structured historical geographic database for AI agents},
  version      = {6.13.0},
  year         = {2026},
  doi          = {10.5281/zenodo.19581784},
  url          = {https://doi.org/10.5281/zenodo.19581784}
}

Plain-text citation

AtlasPI Project (2026). AtlasPI: A structured historical geographic database for AI agents, version 6.14.0. Zenodo. https://doi.org/10.5281/zenodo.19581784


Ethical Framework

Historical data carries the weight of conquest, displacement, and erasure. AtlasPI is built on four principles that govern every data decision:

1. Truth Before Comfort

Historical records include conquest, genocide, forced deportation, and cultural erasure. These facts are represented with precision, never sanitized. If a territory was seized by force, the acquisition_method field says so. If a population was decimated, the data shows it with sources. If a geographic name was imposed by erasing the original, both names are present.

2. No Single Version of History

Contested borders show all known versions, with dates and sources. Place names include the original local form alongside names in other relevant languages. Academic disputes are made explicit, not resolved by fiat. The database does not arbitrate history -- it documents it.

3. Transparency of Uncertainty

Every record carries a confidence_score from 0.0 to 1.0. Every data point includes sources[] with primary source citations. Records scoring below 0.5 are marked as status: "uncertain" (enforced at the data layer — see ETHICS-013; the distinct status: "disputed" is reserved for contested territories, ETHICS-003). An uncertain datum honestly labeled is more valuable than a fabricated certainty.

4. No Geographic or Cultural Bias

Place names use the local-language form as the primary name. Sources include non-Western historiography where available. Colonial conquests are documented from the perspective of the colonized, not only the colonizers.

These principles are enforced through automated ethical tests, documented decisions in docs/ethics/, and # ETHICS: comments throughout the codebase. See CLAUDE.md for the full governance framework.


Architecture

Tech Stack

Component

Technology

API

FastAPI (Python 3.11+)

Database (dev)

SQLite

Database (prod)

PostgreSQL + PostGIS

Validation

Pydantic v2

Rate Limiting

SlowAPI

Frontend

Vanilla JS + Leaflet.js

Containerization

Docker (multi-stage build)

CI

GitHub Actions (lint + test + build)

Project Structure

atlaspi/
  src/
    api/            # FastAPI routes, schemas, error handling
    db/             # SQLAlchemy models, database setup, seed data
    ingestion/      # Data import pipelines, boundary extraction
    validation/     # Confidence scoring engine
  static/           # Web UI (HTML, CSS, JS)
  data/
    entities/       # Source entity data (JSON)
    raw/            # Original unmodified source data
    processed/      # Normalized data
  tests/            # 260 tests: technical, ethical, security, performance, data quality
  docs/
    adr/            # Architecture Decision Records
    ethics/         # Documented ethical decisions (ETHICS-001, 002, 003...)

Key Design Decisions

  • Dual database support: SQLite for zero-config local development, PostgreSQL + PostGIS for production spatial queries.

  • Auto-seeding: The database populates itself on first launch from JSON entity files -- no manual migration needed.

  • GZip compression, CORS, rate limiting (60 req/min), and security headers enabled by default.

  • Structured logging: JSON format in production, human-readable in development.


Testing

The test suite covers five dimensions:

# Run all tests
pytest

# Run with verbose output
pytest -v

Category

What it verifies

Technical

API responses, pagination, input validation, edge cases

Ethical

ETHICS-001/002/003 compliance, disputed territory handling, confidence thresholds

Security

CORS, security headers, structured error responses, rate limiting

Performance

All endpoints respond in < 500ms

Data Quality

Source completeness, regional diversity, entity type coverage


Contributing

Contributions are welcome. Before you start:

  1. Read CLAUDE.md -- it contains the project's core values and development conventions.

  2. Check docs/ethics/ -- understand the ethical decisions already made.

  3. Check docs/adr/ -- understand the architectural decisions already made.

Guidelines

  • Code is written in English; documentation in Italian (except this README).

  • Every function touching sensitive historical data must include an # ETHICS: comment explaining the design choice.

  • Tests must cover ethical edge cases, not only technical ones.

  • New entity data must include sources[] with verifiable academic citations.

  • Disputed territories must have confidence_score <= 0.7 and status: "disputed".

Adding Historical Entities

Entity data lives in data/entities/ as JSON files. Each entity requires:

  • Primary name in the original/local language

  • At least one academic source

  • A confidence score reflecting source reliability

  • Territory changes with dated boundaries where available

Development Setup

# Install with dev dependencies
pip install -e ".[dev]"

# Lint
ruff check src/ tests/

# Test
pytest -v

Roadmap

See ROADMAP.md for the full development plan. Key upcoming milestones:

  • PostgreSQL + PostGIS spatial queries in production

  • Full GeoJSON boundary coverage for all entities

  • Wikidata/OpenStreetMap ingestion pipelines

  • Premium API tier with higher rate limits

  • Hosted instance with public access


How to Cite

If you use AtlasPI in academic work, teaching, or derivative datasets, please cite it. A machine-readable CITATION.cff is provided in the repository root and is recognized by GitHub, Zenodo, Zotero, and most reference managers.

Suggested citation (software)

Ramadani, C. (2026). AtlasPI: A structured historical geographic database for AI agents (Version 6.1.2) [Software]. CRA. https://doi.org/10.5281/zenodo.19581784

BibTeX

@software{ramadani_atlaspi_2026,
  author       = {Ramadani, Clirim},
  title        = {AtlasPI: A structured historical geographic database for AI agents},
  version      = {6.1.2},
  year         = {2026},
  publisher    = {CRA},
  doi          = {10.5281/zenodo.19581784},
  url          = {https://doi.org/10.5281/zenodo.19581784},
  note         = {Live instance: https://atlaspi.it. Concept DOI (all versions): 10.5281/zenodo.19581784. Version v6.1.2 DOI: 10.5281/zenodo.19581785.}
}

Citing the underlying boundary sources

AtlasPI derives its geographic boundaries from two upstream datasets. If your work depends on spatial precision, please also cite them directly:

For full methodology on how boundaries are assigned, matched, and confidence-scored, see docs/METHODOLOGY.md.

The dataset has a permanent DOI minted by Zenodo: 10.5281/zenodo.19581784 (concept DOI, always resolves to the latest version). Every tagged release mints a new version DOI; see the Zenodo record for v6.1.2 specifically. Deposition metadata is in .zenodo.json.


License

AtlasPI follows an open core model.

The core project -- API, data models, ethical framework, and documentation -- is released under the Apache License 2.0.

Imported datasets retain their original licenses. Every source is tracked and attributed. Premium components (hosted services, curated datasets, enterprise features) are maintained separately from the open source core.

See LICENSE for the full Apache License 2.0 text and NOTICE for third-party attributions.


Acknowledgments

AtlasPI builds on the work of:

And the countless historians, cartographers, and researchers whose work makes structured historical geography possible.


Available Tools

32 tools
compare_entitiesA

Confronta due entita' storiche dato il loro id numerico. Ritorna un report strutturato con sovrapposizione temporale, differenze di estensione territoriale, diversita' di status, capitali e fonti. Utile per domande comparative tipo 'paragona Roma Repubblicana e Impero Bizantino' o 'che differenze ci sono tra il Sacro Romano Impero e l'Impero Carolingio?'.

Inputs: id1 (required), id2 (required).

dataset_statsA

Restituisce statistiche aggregate del dataset AtlasPI: numero totale di entita', breakdown per tipo, distribuzione per status (confirmed / uncertain / disputed), distribuzione per continente, intervallo temporale coperto (year_range), confidence_score medio, numero totale di fonti citate e di cambi territoriali. Utile come tool di scoperta iniziale per capire la copertura del dataset prima di formulare query specifiche.

Inputs: no named parameters.

entity_predecessorsA

Restituisce le catene in cui l'entità data ha un predecessore (sequence_order > 0), insieme al predecessore immediato, transition_year, transition_type, is_violent e ethical_notes della transizione CHE HA PORTATO A questa entità. Usa per domande tipo 'che entità ha preceduto la Repubblica di Turchia?' (→ Ottoman Empire, transition 1923 REVOLUTION).

Inputs: entity_id (required).

entity_successorsA

Restituisce le catene in cui l'entità data ha un successore, insieme al successore immediato, transition_year, transition_type, is_violent e ethical_notes della transizione CHE HA PORTATO DA questa entità all'entità successiva. Usa per domande tipo 'cosa è venuto dopo Tawantinsuyu?' (→ Viceroyalty of Peru, transition 1542 CONQUEST).

Inputs: entity_id (required).

event_periodsB

Ritorna le epoche storiche in cui è avvenuto un evento specifico. Es. event_id=123 (Battle of Tours, 732) → [Early Middle Ages (europe), Islamic Golden Age (near_east)].

Inputs: event_id (required), region.

events_date_coverageA

Restituisce le date (MM-DD) che hanno almeno un evento nel dataset. Usa PRIMA di on_this_day per sapere se una data restituirà risultati, oppure per suggerire date 'interessanti' all'utente (es. 'In quali giorni dell'anno ci sono più eventi storici?'). La risposta include unique_dates (quante date uniche), coverage_pct (% dell'anno coperta), e la lista completa dates con mm_dd + event_count. Non richiede parametri — è un metadato del dataset.

Inputs: no named parameters.

events_for_entityA

Restituisce tutti gli eventi storici in cui una data entità compare (fondazione, conquiste, eventi subiti, dissoluzione). Filtro opzionale su role (MAIN_ACTOR, VICTIM, ecc.). Usa questo tool dopo get_entity/search_entities per ricostruire la storia eventuale di una specifica entità (es. 'quali eventi ha subito l'Impero Ottomano?'). Distingue tra ruoli attivi (conquiste operate) e subiti (conquiste ricevute, genocidi, colonizzazioni).

Inputs: entity_id (required), role.

events_for_mapA

Recupera gli eventi storici geolocalizzati attorno a un dato anno, ottimizzato per la visualizzazione su mappa. Restituisce un payload leggero (10 campi per evento) con solo eventi che hanno coordinate. La finestra temporale si auto-espande per epoche antiche: ±50 anni per anni < -1000 a.C., ±25 per il periodo classico, ±10 per l'età moderna. Usa questo tool quando l'utente chiede 'cosa è successo vicino a [luogo] nel [anno]?' o per popolare una visualizzazione mappa con eventi. Non include description/sources — usa get_event per i dettagli di un singolo evento.

Inputs: year (required), limit, window.

feedback_statsA

Counters aggregati sul feedback: totale, by_status, by_category, by_submitter_type, last_24h, last_7d. Utile per capire l'attivita' della community e identificare le categorie piu' calde.

Inputs: no named parameters.

find_similar_entitiesA

Trova entita' storiche simili a quella specificata, ordinate per punteggio di similarita' (0.0-1.0). Il punteggio considera: tipo di entita' (35%), sovrapposizione temporale (30%), durata simile (15%), confidence simile (10%), stesso status (10%). Usa questo tool quando l'utente chiede 'quali imperi erano simili a Roma?' o 'trova stati paragonabili al Sacro Romano Impero' o 'suggerisci paralleli storici per l'Impero Mongolo'. Il risultato include id, nome, tipo, periodo e punteggio per ogni entita' simile.

Inputs: entity_id (required), limit, min_score.

full_timeline_for_entityA

Restituisce la timeline unificata di un'entità: eventi storici (via EventEntityLink), cambi territoriali e transizioni di catene successorie (predecessori + successori) in un unico stream ordinato cronologicamente. Ogni voce ha un campo discriminatore 'kind' fra 'event', 'territory_change' e 'chain_transition'. Usa questo tool invece di chiamare get_evolution + events_for_entity + entity_predecessors + entity_successors separatamente quando l'utente chiede la storia completa di un'entità (es. 'raccontami tutta la storia dell'Impero Romano d'Oriente'). Ritorna counts per ogni kind piu' lo stream unificato.

Inputs: entity_id (required), include_entity_links.

get_chainA

Dettaglio di una catena successoria con tutti i link in ordine cronologico. Ogni link ha sequence_order, entità di riferimento, transition_year, transition_type (ETHICS-002: esplicito, no eufemismi), is_violent, description e ethical_notes specifiche per la singola transizione. Usa dopo search_chains.

Inputs: chain_id (required).

get_cityA

Dettaglio di una città storica: nome originale, varianti linguistiche e storiche (ETHICS-009: rename coloniali/imperiali documentati — es. Konstantinoupolis → Istanbul, Königsberg → Kaliningrad, Tenochtitlan → Ciudad de México, Calcutta → Kolkata), coordinate, tipo, population_peak, fonti, entità politica corrente. Usa dopo search_cities per approfondire.

Inputs: city_id (required).

get_eventA

Dettaglio completo di un evento storico dato il suo id: tipo, anno, descrizione, entità coinvolte con ruolo esplicito (MAIN_ACTOR, VICTIM, PARTICIPANT, AFFECTED, WITNESS, FOUNDED, DISSOLVED), fonti con page/confidence, ethical_notes. ETHICS-007: il main_actor è sempre presente — la voce attiva ('chi ha fatto cosa a chi') è obbligatoria per eventi di violenza.

Inputs: event_id (required).

get_evolutionA

Restituisce la timeline dei cambi territoriali di una entita': annessioni, perdite di territorio, cambi di capitale, transizioni di regime, eventi di scissione o unificazione. Ogni evento ha anno, descrizione, fonte e (quando disponibile) acquisition_method per documentare se un territorio fu acquisito per conquista, matrimonio dinastico, trattato, ecc. Importante per ricostruire l'arco storico di un'entita' nel tempo.

Inputs: entity_id (required).

get_historical_periodA

Dettaglio completo di un periodo storico dato il suo ID numerico. Include description, historiographic_note (controversie accademiche), alternative_names (es. 'Dark Ages' per 'Early Middle Ages') e sources bibliografiche.

Inputs: period_id (required).

get_historical_period_by_slugA

Dettaglio di un periodo dato lo slug URL-friendly (es. 'bronze-age', 'edo-period', 'islamic-golden-age'). Più leggibile di get_historical_period quando l'ID non è noto.

Inputs: slug (required).

get_routeC

Dettaglio di una rotta commerciale: nome originale, tipo geografico, intervallo temporale, waypoints (città attraversate in ordine) con coordinate, commodities principali, flag involves_slavery, geometry_geojson per visualizzazione, ethical_notes dettagliate. ETHICS-010: le rotte della tratta atlantica documentano le stime di Middle Passage (~1.8M morti su 12.5M embarcati).

Inputs: route_id (required).

list_feedbackA

Lista i feedback gia' sottomessi da altri agenti/umani. Utile per cross-validation: prima di sottomettere un nuovo feedback, controlla se qualcuno ha gia' segnalato lo stesso problema.

Filtra per status (pending, accepted, rejected, ...), category, entity_id, o submitter_type. Trasparenza pubblica.

Inputs: limit, offset, status, category, +2 more.

list_historical_periodsA

Lista epoche storiche strutturate (Bronze Age, Classical Antiquity, Edo Period, Cold War, ecc.). Ogni periodo ha scope regionale esplicito (es. 'Middle Ages' è europeo, non globale) e confidence_score. Filtrabile per region, period_type (age/era/period/dynasty/epoch), anno (ritorna periodi che includono quell'anno), status. USA per: inquadrare un anno o entità nel contesto storico, rispondere a domande tipo 'In che epoca era il 1200 in Europa?', 'Quali periodi esistono in Giappone?'. ETHICS: le periodizzazioni sono costrutti storiografici; il campo historiographic_note documenta controversie accademiche.

Inputs: year, limit, offset, region, +2 more.

nearest_historical_cityA

Trova le città storiche più vicine a una coppia di coordinate (latitudine, longitudine), opzionalmente filtrate per anno di attività e tipo (CAPITAL, TRADE_HUB, ecc.). Calcola la distanza haversine client-side e ordina per distanza crescente. Usa per domande tipo 'che città c'erano vicino a 41.9, 12.5 nel 100 d.C.?' (città vicino Roma) o 'qual è il trade hub più vicino a Venezia nel 1400?'. Nota: questo tool trova CITTÀ storiche (dataset separato da GeoEntity) — per capitali di imperi/regni usa nearby_entities.

Inputs: lat (required), lon (required), year, limit, +2 more.

on_this_dayA

Restituisce gli eventi storici avvenuti in una specifica data del calendario (mese e giorno), attraverso tutti gli anni nel dataset. Formato: MM-DD (es. '07-04' per il 4 luglio, '10-12' per il 12 ottobre). Utile per curiosità storiche, efemeridi, quiz, contenuti 'accadde oggi'. Esempio: on_this_day('10-12') potrebbe restituire lo sbarco di Colombo (1492) e il giorno della scoperta del Nuovo Mondo.

Inputs: mm_dd (required).

random_entityA

Restituisce una entita' storica casuale, opzionalmente filtrata per tipo, anno, continente o status. Pensato per esplorazione, suggerimenti, generazione di curiosita' storiche o per permettere all'agente di proporre 'lo sapevi che...' contestuali. Esempio: random_entity(type='khanate', continent='Asia') ritorna un khanato asiatico a caso.

Inputs: type, year, status, continent.

search_chainsC

Cerca catene successorie/dinastiche/coloniali con filtri su chain_type (DYNASTY / SUCCESSION / RESTORATION / COLONIAL / IDEOLOGICAL / OTHER), region, year (almeno un'entità della catena attiva in quell'anno), status. ETHICS-002: ogni link ha transition_type esplicito (CONQUEST / REVOLUTION / REFORM / SUCCESSION / DECOLONIZATION / PARTITION / UNIFICATION / DISSOLUTION / ANNEXATION) — non esiste 'succession' generico che maschera violenze. ETHICS-003: chain_type=IDEOLOGICAL (es. Sacrum Imperium Romanum → Deutsches Kaiserreich → Deutsches Reich) porta avvertimento che la continuità self-proclaimed non implica legittimità.

Inputs: year, limit, offset, region, +2 more.

search_citiesB

Cerca città storiche con filtri su anno di attività, tipo funzionale (CAPITAL, TRADE_HUB, RELIGIOUS_CENTER, FORTRESS, PORT, ACADEMIC_CENTER, INDUSTRIAL_CENTER, MULTI_PURPOSE), entità politica di appartenenza, bbox geografica. Una città è separata dalla capital_* di GeoEntity perché può sopravvivere più entità politiche (es. Costantinopoli/Istanbul attraversa Bizantino → Ottomano → Repubblica di Turchia).

Inputs: bbox, year, limit, offset, +3 more.

search_eventsA

Cerca eventi storici con filtri su anno, tipo, status e silenzio documentato. ETHICS-007: i tipi usano termini espliciti — GENOCIDE, COLONIAL_VIOLENCE, ETHNIC_CLEANSING, MASSACRE, DEPORTATION — senza eufemismi. Per domande tipo 'quali genocidi sono registrati nel XX secolo?' (event_type='GENOCIDE', year_min=1900, year_max=2000). ETHICS-008: known_silence=true filtra eventi storicamente insabbiati (es. genocidio armeno nella storiografia turca).

Inputs: limit, offset, status, year_max, +3 more.

search_routesA

Cerca rotte commerciali storiche con filtri su anno di attività, tipo geografico (LAND, SEA, RIVER, CARAVAN, MIXED) e involves_slavery. ETHICS-010: involves_slavery=true restituisce le rotte che trafficavano esseri umani schiavizzati come merce primaria (Trans-Atlantic, Trans-Saharan Slave, Indian Ocean Slave Route). Il flag è esplicito perché la distinzione è eticamente rilevante. Nota: 'Silk Road' è attribuzione 1877 di Richthofen, non un'auto-designazione delle carovane storiche.

Inputs: year, limit, offset, status, +2 more.

snapshot_at_yearA

Restituisce uno snapshot del mondo in un dato anno: tutte le entita' geopolitiche attive in quell'anno (year_start <= anno <= year_end), con possibilita' di filtrare per tipo o continente. Usa questo tool per domande del tipo 'che mappa politica c'era nel 300 a.C.?' o 'quali regni esistevano in Africa nel 1500?'. Ricorda: gli anni negativi sono a.C.

Inputs: year (required), type, continent.

submit_feedbackA

Sottometti un feedback strutturato sul database AtlasPI: correzioni di dati, citazioni mancanti, polygon imprecisi, bias report, ecc. Usa questo tool quando hai informazioni VERIFICATE che contraddicono i dati attuali, oppure quando vuoi suggerire una fonte accademica non ancora presente.

Il feedback non modifica direttamente i dati: va in stato 'pending' e richiede review umana per contenuti storici (vedi ETHICS).

Quando usarlo:

  • Trovi una data sbagliata supportata da una fonte (es. year_end di una dinastia)

  • Vuoi aggiungere una citation accademica a un'entita'

  • Noti un bias di rappresentazione (es. nome coloniale come primario)

  • Identifichi un'entita' storica mancante dal database

Best practice: fornisci sempre 'citation' (la fonte) e 'reasoning' (1-3 frasi che spiegano perche').

Inputs: category (required), submitter_type (required), city_id, citation, +8 more.

what_changed_betweenA

Diff macro-storico del mondo tra due anni: ritorna le entità apparse fra year1 e year2, quelle scomparse, e gli id di quelle persistenti. Opzionalmente filtra per tipo o continente. Usa per domande tipo 'cosa è cambiato nel Mediterraneo tra il 300 a.C. e il 100 d.C.?' o 'quali imperi sono apparsi tra il 1800 e il 1900 in Africa?'. È composizione client-side di due snapshot — più economico di due chiamate separate se servono solo id+nomi.

Inputs: year1 (required), year2 (required), type, continent.

where_wasA

v6.34: reverse-geocoding temporale. Dato un punto geografico (lat, lon) e un anno, restituisce tutte le entita' storiche il cui boundary_geojson contiene quel punto in quell'anno. Primary use case: GENEALOGIA / DIASPORA ("Il mio bisnonno da Leopoli nel 1905 — sotto che stato era?"). Due modalita': (1) year-specific: entita' che controllavano il punto in un anno; (2) include_history=true: timeline completa di TUTTI gli imperi/ regni che hanno mai controllato quel punto, ordinati cronologicamente. Se il punto e' in territorio contestato (ETHICS-003), ritorna tutte le entita' che lo rivendicano con status='disputed', senza arbitrare la sovranita'. Usa per domande tipo 'chi comandava a Istanbul nel 1500?', 'che impero controllava Berlino nel 1945?', 'storia di Gerusalemme dal 1000 a.C. a oggi' (include_history=true).

Inputs: lat (required), lon (required), year, include_history.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

Loading tool schema changelog…

    TDQS

    A4/5.0

    Scored across 32 tools

    Disambiguation5/5

    Every tool has a clearly distinct purpose. Tools covering similar domains (e.g., events) are split into search, detail, entity-specific, map-optimized, date-specific, and coverage metadata, each with unique functionality and inputs. No two tools serve the same role.

    Naming Consistency5/5

    All 32 tools follow a consistent verb_noun pattern in snake_case, such as get_route, search_events, list_feedback. Naming is predictable and descriptive, making it easy to infer a tool's function from its name without ambiguity.

    Tool Count4/5

    32 tools is slightly high but well justified by the comprehensive and multi-faceted domain (entities, events, cities, routes, chains, feedback). Each tool serves a specific need, and the set covers exploration, search, detail, comparison, and metadata operations without unnecessary redundancy.

    Completeness5/5

    The tool surface is remarkably complete for a historical atlas: CRUD-like operations for entities, events, cities, routes, and chains are present, along with specialized tools for timeline, comparison, fuzzy search, feedback, and dataset statistics. No obvious gaps for standard historical queries.

    Maintenance

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      B
      maintenance
      Provides structured access to a temporal knowledge platform for searching historical events and browsing a causal graph of over 2,000 years of history. It enables users to generate rich historical scenes, interact with period-appropriate characters, and run complex temporal simulations.
      -
    • F
      license
      Not graded
      quality
      D
      maintenance
      Enables querying 10,000 years of historical social-complexity data from the Seshat Global History Databank through 9 tools, allowing counterfactual analysis and comparison of polities in natural language.
      1
      -
    • A
      license
      B
      quality
      C
      maintenance
      Enables AI agents to become geospatially intelligent assistants with tools for location search, smart routing, round trip planning, reverse geocoding, isochrone analysis, route visualization, geofence management, and interactive map display.
      8
      17 npm
      8
      Apache 2.0
    • A
      license
      Not graded
      quality
      B
      maintenance
      Provides complete world location data (countries, states, cities) as an MCP server for AI assistants, enabling search and retrieval of geographic information through 11 tools and 5 resources.
      1,399 npm
      1
      MIT