Geocoder.ca Skills for AI Agents. October-23-2026:

AI coding agents are now writing a lot of geocoding code, and left to themselves they guess: they invent parameters, forget to ask for JSON, treat confidence scores as decoration and fall over on the first rate limit. So we published geolytica-skills, an open-source (MIT) set of agent skills that tells them how Geocoder.ca and Geocode.xyz actually work.

There are three skills:

The routing rule is built in: Canada or USA goes to Geocoder.ca, everything else to Geocode.xyz. Each skill also carries Python, Node.js, Perl, PHP and command-line references, which the agent loads only when it needs them, and a small wrapper script that reads your token from the environment, so it never appears in the commands the agent runs.

Install (Claude Code)

/plugin marketplace add geocode-xyz/geolytica-skills
/plugin install geolytica@geolytica-skills

Then put your keys in the environment the agent runs in (for example in ~/.zshrc):

export GEOCODER_CA_AUTH=your_geocoder_ca_token
export GEOCODE_XYZ_AUTH=your_geocode_xyz_key

Without a key, requests go to the free throttled port: fine for a quick look, but often busy. Using Gemini CLI, Codex or another agent? The skills are plain Markdown; see install.md. Agents that discover APIs on their own can also find us through the API catalog, the OpenAPI spec and llms.txt.

One session, twelve tests

I installed the plugin and typed plain English, or sometimes just pasted an address. Nobody told the agent which service to use.

#InputServiceResultConf.
1350 5th Ave, New YorkGeocoder.caEmpire State Building, NY 10118-06911.0
2751 FAIR OKS AVENUE PASADNA CAGeocoder.ca751 N Fair Oaks Ave, Pasadena, CA 91103-30691.0
3Metcalfe & Wellington, OttawaGeocoder.caIntersection in front of Parliament Hill0.9
41 Random St, TorontoGeocoder.ca1 Random St, Toronto, ON M9B 2J31.0
5Avenue FR DE LA JOSNIERE 13 LE DORATGeocode.xyz13 Avenue de la Josnière, 87210 Le Dorat, France1.0
65 Adne Edle Street, LondonGeocode.xyz5 Threadneedle Street, London EC3V 3NG1.0
720 Bökenbusch 27777Geocode.xyzBökenbusch 20, 27777 Ganderkesee, Germany0.7
84 日本橋三丁目, 中央区 JP 103-0027Geocode.xyzNihonbashi 3-chōme, Chūō-ku, Tokyo0.6
9415 C'WEALTH AVE WEST SingaporeGeocode.xyz415 Commonwealth Avenue West, Singapore 1204150.8
1055.68028,12.59005 (reverse)Geocode.xyzNyhavn 29, 1051 Copenhagen, Denmark1.0
11A paragraph about Vienna (geoparse)Geocode.xyz1 Albertinaplatz, Vienna1.0
121435 prince (autocomplete)Geocoder.caSix matching Canadian addressesn/a

USA: messy input, clean output

The Empire State Building came back exactly: 40.748369, -73.984853, ZIP+4, time zone and area codes. The Pasadena address had two typos, no direction and no ZIP:

InputReturned
FAIR OKS AVENUEN Fair Oaks Ave
PASADNAPasadena
(no ZIP)91103-3069

The added N is the important part: Pasadena has both North and South Fair Oaks, and 751 is on the north side. Because the skill tells the agent to ask for standard=1, the cleaned components come back as separate fields, ready to store.

Canada: intersections and census areas

For “Metcalfe & Wellington, Ottawa” the agent added ON on its own (there is more than one Ottawa) and got the corner in front of Parliament Hill, 45.423477, -75.697944. Intersections come back as street1/street2 rather than stnumber/staddress, and the street names carry trailing spaces, so trim them before storing. The postal code returned, K1A 0A3, is the nearest building's (the Parliament buildings), not the intersection's.

“1 Random St, Toronto” sounded made up and came back at confidence 1. The agent was suspicious, reran it with strictmode=1, got the same answer (there really is a Random St, in Etobicoke) and still suggested checking it on a map: confidence measures how well the input matched the data, not whether the data is right. The response also carried Dissemination_Area.dauid, the Statistics Canada census area, which you can use for a censusdatafromdauid= lookup.

The rest of the world

Reverse geocoding and geoparsing

55.68028,12.59005 with moreinfo=1 came back as Nyhavn 29, 1051 Copenhagen at distance 0.000 km, plus elevation, time zone, the nearest intersection 45 m away and the municipality from OpenStreetMap. The geocode/geonumber fields identify the 10 m × 10 m cell the point is in, which makes a compact location ID.

Given a paragraph from a Vienna travel guide, the agent used scantext= with region=AT and found Albertinaplatz in the 1st district, with MentionIndices pointing back to the right spot in the text. Vague mentions (“train stations”, the unnamed airport) were correctly left out.

This test also caught a bug in the skill's own wrapper scripts: geoparsing failed on every stock Mac, because macOS still ships bash 3.2, which treats an empty array as unset under set -u. The agent traced it, fixed both scripts, tested under bash 3.2 and opened a pull request, merged the same day.

Autocomplete

“1435 prince” returned six full addresses with postal codes across six provinces, including Rue Prince-Philip in Brossard. Then I asked for a working demo page. The agent loaded the autocomplete skill, downloaded our JavaScript widget, read its source and built a form that suggests addresses as you type, then geocodes the chosen one into separate fields:

The autocomplete form with 330 metcalfe typed and four suggestions: 330 Metcalfe St in Ottawa, Guelph and Pembroke, and 330 Metcalfe St #401 in Ottawa

The form after choosing 330 Metcalfe St, Ottawa: number 330, street Metcalfe St, city Ottawa, province ON, postal code K2P1S4, confidence 1, latitude 45.414399, longitude -75.690474

Reading the widget's source also turned up several bugs: the search text was rebuilt from key codes (so pasting didn't work) and wasn't URL-encoded, the widget replaced your <input> with one that had a random ID, Enter didn't pick a suggestion, and the styling assumed Bootstrap. The agent worked around all of them in the demo, and kept the token out of the page files by serving it from the environment.

We have since fixed all of them in v1.0.0 of the widget. The search text now comes straight from the field, so paste, browser autofill and mobile keyboards work, and it is URL-encoded. Your <input> keeps its id, name, classes and listeners. Enter picks the highlighted suggestion and Escape closes the list. The widget ships its own small stylesheet, with a dark mode, so Bootstrap is no longer needed. While we were in there we also fixed a few things the agent hadn't hit: addresses are now HTML-escaped before being shown, a single result is no longer split into one suggestion per character, and a slow response can no longer overwrite a newer one. It is a drop-in replacement; existing new autocomplete({...}) calls keep working.

Try it yourself in our autocomplete demo, which is the form the agent built: suggestions as you type, then the chosen address geocoded into separate fields.

What the agent learns from the skill

In one session the agent geocoded addresses in seven countries, in Latin script and kanji, reverse geocoded Copenhagen, pulled a street out of a paragraph about Vienna, built a working autocomplete form, found and fixed a bug in the skill's own tooling, and flagged four bugs in our widget that are now fixed.

Get it at github.com/geocode-xyz/geolytica-skills, and get a token at geocoder.ca (free non-commercial tier; plans at geocoder.ca/pricing) or a key at geocode.xyz. Pull requests and feedback welcome.

Enjoy!