tlhano◐five words, one place

Tlhano for AI agents

Tlhano speaks MCP (Model Context Protocol) over Streamable HTTP. Point any MCP client at the endpoint below and it gets five tools: encode, decode, parse, suggest and about. No key is required today.

1 Connect

Endpointhttps://mcp.tlhano.com/mcp
ProtocolMCP Streamable HTTP — JSON-RPC 2.0 over HTTP POST
Sessionsstateless: every request stands alone, no session id, no SSE stream required
Authnone (open). If keys are ever enabled, send Authorization: Bearer <key>
Contentsend Accept: application/json, text/event-stream; responses are plain JSON

In an MCP client's configuration, the server is a remote HTTP entry:

{
  "mcpServers": {
    "tlhano": { "url": "https://mcp.tlhano.com/mcp" }
  }
}

2 Handshake

A stateless server still answers initialize. Tell it who you are; it answers with its capabilities. Then list the tools.

# initialize
curl -s https://mcp.tlhano.com/mcp \
  -H 'Content-Type: application/json' \
  -H 'Accept: application/json, text/event-stream' \
  -d '{"jsonrpc":"2.0","id":1,"method":"initialize",
       "params":{"protocolVersion":"2025-03-26","capabilities":{},
                 "clientInfo":{"name":"my-agent","version":"0.1"}}}'

# the real response
{"jsonrpc":"2.0","id":1,"result":{
  "protocolVersion":"2025-03-26",
  "capabilities":{"tools":{}},
  "serverInfo":{"name":"tlhano","version":"0.1.0",
                "title":"Tlhano — five words, one place"}}}

# tools/list (send {"jsonrpc":"2.0","id":2,"method":"tools/list"})

Because the server is stateless you may skip the handshake and call a tool directly — but sending initialize first keeps generic MCP clients happy, and it is the polite thing to do.

3 The five tools

ToolArgumentsReturns
tlhano_encodelat, lng numbers — or q, any free-form input (decimal, DMS, GPS, Maps URL)the five-word address, cell token, ordinal, centre
tlhano_decodeaddress — five wordslatitude/longitude of the cell centre
tlhano_parseq — free-form coordinate textthe parsed latitude/longitude and the recognised format
tlhano_suggestaddress, optional limitranked valid repairs of a near-miss address
tlhano_about—scheme metadata: constants, vocabulary hash, spec pointer

Calling a tool — coordinates in, five words out:

# request
{"jsonrpc":"2.0","id":3,"method":"tools/call",
 "params":{"name":"tlhano_encode",
           "arguments":{"lat":-24.64492,"lng":25.90733}}}

# the real response
{"jsonrpc":"2.0","id":3,"result":{"content":[{"type":"text","text":{
  "address": "common.circuit.shipped.assist.talking",
  "center": {"lat": -24.64492931, "lng": 25.90733512},
  "cell": {"token": "1ebb5b0458a3",
           "id": "2214463716007804928",
           "level": 22,
           "ordinal": 16895017364561},
  "precision": {"avg_area_m2": 4.83}
}}],"isError":false}}

Tool results arrive as text content — parse the inner JSON from content[0].text. isError is the honest signal: check it before trusting the payload.

4 When an address is wrong

A mis-heard or mistyped word is not a crash — it is a structured answer with a repair path. The decode tool answers isError: true with a Tlhano error code; feed the address to tlhano_suggest and you get ranked valid candidates.

# tlhano_decode("common.circuit.shipped.assist.talkin")  — last word mis-heard
{"result":{"content":[{"type":"text","text":{
  "error": {"code": "E_WORD_UNKNOWN",
            "message": "not in the tlhano vocabulary: talkin",
            "details": {"unknown": ["talkin"], "vocabulary": "en-4096"}}
}}],"isError":true}}

# tlhano_suggest on the same input returns the repair:
#   common.circuit.shipped.assist.talking  -24.644929, 25.907335

5 Error codes

CodeMeaningWhat an agent should do
E_FORMATnot five words / wrong shapeif it looked like coordinates, use tlhano_encode with q instead
E_WORD_UNKNOWNa word is not in the vocabularycall tlhano_suggest with the input
E_CHECKSUMall words known, check word failscall tlhano_suggest — a one-word slip is repairable
E_OUT_OF_RANGEvalid shape, no such cellthe address is forged or from another vocabulary; ask for the source
E_PARAMbad argumentsfix the parameters against the tool schema
E_RATE_LIMITEDHTTP 429back off for the Retry-After seconds, then resume

6 No MCP? Use the REST API

Every tool has a plain-HTTPS equivalent at https://api.tlhano.com/v1/ — for scripts, cron jobs and agents that never leave HTTP:

EndpointSame as
GET /v1/encode?lat=&lng= · GET /v1/encode?q=tlhano_encode
POST /v1/encode (JSON array, ≤ 100 points)batch encode
GET /v1/decode?address=tlhano_decode
GET /v1/parse?q=tlhano_parse
GET /v1/suggest?address=tlhano_suggest
GET /v1/abouttlhano_about
curl -s "https://api.tlhano.com/v1/encode?lat=-24.64492&lng=25.90733"

Full parameter reference, schemas and every response example: doc.tlhano.com.

7 Limits and etiquette

240 requests per minute per client at the application layer, and a 20 request/second burst ceiling at the edge. Exceeding either returns HTTP 429 with Retry-After: 60 — honour it rather than retrying blind. If you are geocoding a fleet of devices, use the batch endpoint: one POST per 100 points is always kinder than 100 POSTs. All three services are read-only; there is nothing an agent can break.