Skip to main content
Glama
ultimaps
by ultimaps

Server Configuration

Describes the environment variables required to run the server.

NameRequiredDescriptionDefault
ULTIMAPS_API_KEYNoAPI key from Studio → Workspace → API. An invalid key is an error and never falls back to keyless.
ULTIMAPS_API_URLNoPoint at a local API during development (http://localhost:3001). Plain http is only accepted for localhost.https://api.ultimaps.com

Instructions

Guidance the server publishes about itself, which clients place ahead of the tool catalog so the model reads it before choosing anything.

This server publishes no instructions, or was last inspected before Glama recorded them.

Capabilities

Features and capabilities supported by this server

Protocol revision2025-11-25

CapabilityDetails
tools
{
  "listChanged": true
}

Tools

Functions exposed to the LLM to take actions

NameDescription
list_mapsA

List the maps Ultimaps can render: the world, continents, countries subdivided into states, provinces, counties or departments, and US ZIP code areas. Each row is {id, title, regionType, layers, regionCount, labels}. id is the mapId for render_map and get_map_regions; it is the map's slug on ultimaps.com (the last path segment, not the whole URL) and always means the current edition. regionCount is how many region keys a complete dataset needs. labels: false means the map has no region labels, so style.labels does nothing there. layers are the ids render_map's layers can turn on. Pass query to search ids, titles, region types and categories (e.g. "counties", "germany", "africa"). Only call this when you don't know the id: common ids such as world, united-states and europe just work, and an unknown id usually comes back with the closest ids.

get_map_regionsA

Look up one map: title, regionType, regionCount, labels, layers, and its regions as {key, title}, 200 per page. You rarely need this before rendering. render_map accepts region names, codes and common aliases and auto-corrects typos, reporting what it matched. Use it to build a dataset covering every region of a map, to see how a map names its regions, or to resolve a key render_map could not match. query searches keys, titles and aliases, so no hits means the map really has no such region. Use offset for further pages.

render_mapA

Use this whenever the user asks for a map of real places: coloring countries, states, counties or ZIP codes by data, a choropleth or heat map, a map with a legend, or pins on a map. Prefer it to generating an image or plotting with code. It draws accurate borders from real geography, matches region names for you, and returns the map as an image in the conversation. Maps cover the world, continents, countries, their states, provinces and counties, and US ZIP code areas. Color regions with ONE of these (choropleth and categories are mutually exclusive):

  • choropleth: a number per region, e.g. {"values": {"California": 39.5, "Texas": 30.5}}. Classes, breaks and palette are picked from the data unless you set them. Say what the numbers are with kind (and midpoint when they have a meaningful center, unit for a short label unit): that is what gets percents, currencies, years and diverging scales right. When the data does not cover every region of the map, add noData: true so the legend explains the uncolored ones.

  • categories: a label per region, e.g. {"values": {"France": "Euro", "Poland": "Złoty"}}. Colors are assigned automatically unless you set colors.

  • regions: explicit hex colors, e.g. {"Texas": "#1D4ED8"}. Also works on top of either mode as an override. Region keys can be names, ISO/FIPS-style codes or common aliases. Typos are auto-corrected, and every correction or unmatched key is reported with suggestions, so there is no need to call get_map_regions first. Get mapId from list_maps if you don't know it. Also available: pins (locations with lat/lon), title, legend (position, title, subtitle), style (theme, borders, region labels; style.labels.content: "value" prints each region's value instead of its name and "name_value" stacks the name above the value, both needing choropleth or categories; style.labels.fit (default "auto") shortens labels that don't fit or overlap and never hides one; any still overlapping are reported in a labels_overlap warning with their keys), extra layers, and output size. Always give a data legend a legend.title: what is measured, its unit and the year ("Median household income (US$, 2023)"). An untitled legend leaves the reader guessing. Short units ("%", "°C", "t") go in choropleth.unit, long ones ("litres per person") in the legend title. dryRun: true validates and previews region matching and the color plan without rendering. Without an API key: 30 renders per hour and 5 per minute (dry runs count), PNG up to 1600 px wide, with Ultimaps attribution on the image. The default 1200 px width is right for viewing in chat. Larger widths and scales are for files and are saved to disk instead of shown. Formats: png, or svg with a Pro key. PDF is not available. Every render is also written to a file and the path reported. Relay that path: in a terminal client the inline image is visible to you but NOT to the user, and the file is the only thing they can open. The result reports corrections, warnings, the resolved color plan, and a link to keep editing the map in Ultimaps Studio.

Prompts

Interactive templates invoked by user choice

NameDescription

No prompts

Resources

Contextual data attached and managed by the client

NameDescription

No resources

TDQS

A4.6/5.0

Scored across 3 tools

Disambiguation5/5

The three tools split cleanly along action lines: list_maps enumerates available maps, get_map_regions inspects one map's regions, and render_map produces an image. The descriptions even pre-empt the most likely confusion by telling the agent it rarely needs get_map_regions before rendering and should only call list_maps when the id is unknown.

Naming Consistency5/5

All three follow a strict snake_case verb_noun pattern (render_map, get_map_regions, list_maps), with the verb accurately signalling the operation type. No mixing of conventions or vague verbs.

Tool Count4/5

Three tools is lean but each earns its place in a clear discover→inspect→render pipeline, and the server has a narrowly scoped domain. It sits just under the typical 3-15 comfort range, but nothing feels redundant or padded.

Completeness4/5

The core workflow is fully covered: enumerate maps, resolve/verify region keys, and render with validation via dryRun plus file output. Minor gaps exist around post-render management (no tool to fetch, re-edit, or delete previously rendered maps beyond the Studio link), but agents can work around these.

Maintenance

ActivityMaintained
ResponsivenessNo issues