Create, edit and publish animated historical maps in your Moving Polygons account.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Create a new private draft map from an import JSON of up to about 1 MB.
The map in the Moving Polygons import format, as a JSON object or a JSON string
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Tool list last changed Oct 23, 2026.
Create a new private draft map from an import JSON of up to about 1 MB.
| Argument | Type | Description |
|---|---|---|
| map* | any | The map in the Moving Polygons import format, as a JSON object or a JSON string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"map"
],
"properties": {
"map": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "string"
}
],
"description": "The map in the Moving Polygons import format, as a JSON object or a JSON string"
}
}
}A one-off link (valid 15 minutes) for uploading a map JSON file of up to 40 MB with curl. It creates a new draft map, or with mode replace overwrites an existing map's content. The curl output reports the result.
| Argument | Type | Description |
|---|---|---|
| mode | string | create (default): a new map. replace: overwrite mapId's content |
| mapId | string | Required for mode replace |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"mode": {
"enum": [
"create",
"replace"
],
"type": "string",
"description": "create (default): a new map. replace: overwrite mapId's content"
},
"mapId": {
"type": "string",
"description": "Required for mode replace"
}
}
}Joins parts 1 to the given count of a chunked upload, validates the map and creates the draft map (or replaces the map's content, keeping a backup). Reports missing parts or where the JSON breaks.
| Argument | Type | Description |
|---|---|---|
| parts* | integer | How many parts were sent |
| uploadId* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"uploadId",
"parts"
],
"properties": {
"parts": {
"type": "integer",
"maximum": 400,
"minimum": 1,
"description": "How many parts were sent"
},
"uploadId": {
"type": "string"
}
}
}The signed-in user's public handle, plan and how many maps they can still create.
No arguments.
{
"type": "object",
"properties": {}
}The JSON format for maps: layers with timed polygon keyframes, point markers and a style.
No arguments.
{
"type": "object",
"properties": {}
}A summary of one of the user's maps (layers, keyframe dates, markers) and a 15-minute download link for its full import JSON, which can be several MB.
| Argument | Type | Description |
|---|---|---|
| mapId* | string | The map id |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"mapId"
],
"properties": {
"mapId": {
"type": "string",
"description": "The map id"
}
}
}One published map as Markdown: description and sources, the timeline of keyframes (date and caption), layers, events, and the iframe code to embed the interactive map. Pass its URL, or the handle and slug.
| Argument | Type | Description |
|---|---|---|
| url | string | e.g. https://www.movingpolygons.com/map/Chris/the-ottoman-empire-12991923 |
| slug | string | |
| username | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"url": {
"type": "string",
"description": "e.g. https://www.movingpolygons.com/map/Chris/the-ottoman-empire-12991923"
},
"slug": {
"type": "string"
},
"username": {
"type": "string"
}
}
}The user's maps, most recently changed first, with their ids and links.
| Argument | Type | Description |
|---|---|---|
| limit | integer | Default 50 |
| search | string | Only maps whose name contains this text |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "Default 50"
},
"search": {
"type": "string",
"description": "Only maps whose name contains this text"
}
}
}Make one of the user's maps public at its /map/<handle>/<slug> link, where anyone can view it.
| Argument | Type | Description |
|---|---|---|
| mapId* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"mapId"
],
"properties": {
"mapId": {
"type": "string"
}
}
}Overwrite an existing map's layers, markers, name, description and casualty bar (and style, if given) with an import JSON of up to about 1 MB. The link and publish state stay; the old content is backed up.
| Argument | Type | Description |
|---|---|---|
| map* | any | The map in the Moving Polygons import format, as a JSON object or a JSON string |
| mapId* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"mapId",
"map"
],
"properties": {
"map": {
"anyOf": [
{
"type": "object",
"propertyNames": {
"type": "string"
},
"additionalProperties": {}
},
{
"type": "string"
}
],
"description": "The map in the Moving Polygons import format, as a JSON object or a JSON string"
},
"mapId": {
"type": "string"
}
}
}Find published animated maps on Moving Polygons (history, wars, empires, borders, epidemics, sea ice…) by words in their title or description and/or a year they cover. Returns links to the interactive map, its text version and its article.
| Argument | Type | Description |
|---|---|---|
| year | integer | Only maps whose timeline includes this year; negative for BC (-44 = 44 BC) |
| limit | integer | Default 10 |
| query | string | Words to match, e.g. 'Ottoman', 'Holy Roman Empire', 'Ukraine war' |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"year": {
"type": "integer",
"maximum": 9007199254740991,
"minimum": -9007199254740991,
"description": "Only maps whose timeline includes this year; negative for BC (-44 = 44 BC)"
},
"limit": {
"type": "integer",
"maximum": 50,
"minimum": 1,
"description": "Default 10"
},
"query": {
"type": "string",
"description": "Words to match, e.g. 'Ottoman', 'Holy Roman Empire', 'Ukraine war'"
}
}
}Opens an upload (valid 2 hours) for a map JSON text that is sent in numbered parts through tool calls rather than over the network. It creates a new draft map, or with mode replace overwrites an existing map's content.
| Argument | Type | Description |
|---|---|---|
| mode | string | create (default): a new map. replace: overwrite mapId's content |
| mapId | string | Required for mode replace |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"properties": {
"mode": {
"enum": [
"create",
"replace"
],
"type": "string",
"description": "create (default): a new map. replace: overwrite mapId's content"
},
"mapId": {
"type": "string",
"description": "Required for mode replace"
}
}
}Make one of the user's maps private again (its public link stops working).
| Argument | Type | Description |
|---|---|---|
| mapId* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"mapId"
],
"properties": {
"mapId": {
"type": "string"
}
}
}Stores one numbered piece of a chunked map upload. The pieces are joined in part order with nothing in between; sending a part number again replaces that part. Returns the piece's length and SHA-256.
| Argument | Type | Description |
|---|---|---|
| part* | integer | 1 for the first piece |
| text* | string | This piece of the map JSON text, verbatim |
| uploadId* | string |
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"uploadId",
"part",
"text"
],
"properties": {
"part": {
"type": "integer",
"maximum": 400,
"minimum": 1,
"description": "1 for the first piece"
},
"text": {
"type": "string",
"maxLength": 250000,
"description": "This piece of the map JSON text, verbatim"
},
"uploadId": {
"type": "string"
}
}
}