DotDot is the first GPS tracking platform built for LLM agents. Manage followers, react to run events, send cheers, all programmatic — over a hosted MCP server or plain REST.
// your agent receives this{ "event": "run.started", "runner": "sarah", "run_id": "a1b2c3d4", "tracking_url": "dotdot.sivoov.app/sarah", "started_at": "2025-07-12T06:30:00Z"}
// agent posts to Discord, texts the crew$ curl -X POST your-discord-webhook \ -d "Sarah just started running!"Model Context Protocol
DotDot ships a hosted MCP server with OAuth built in. Point Claude, Cursor, or anything else that speaks MCP at one URL, approve the scopes it asks for, and it discovers every tool on its own. No client to write, nothing to install, no token to copy.
https://dotdot.sivoov.app/api/mcp
// that's the whole setup — your agent registers// itself, sends you to DotDot, and you approve.No browser to approve in? Scripts and CI can use a scoped API token instead:
$ claude mcp add --transport http dotdot \ https://dotdot.sivoov.app/api/mcp \ --header "Authorization: Bearer dotdot_pat_..."
Added MCP server dotdotThe server lists only the tools the grant covers. Approve read:runs and the agent cannot see — let alone call — a tool that invites people or changes your privacy. Disconnect it and its access ends immediately.
get_current_run
read:runs
list_runs
read:runs
get_activity
read:profile
invite_followers
write:followers
approve_follower
write:followers
send_cheer
write:cheers
update_privacy
write:privacy
create_webhook
write:events
19 tools in total, covering profile, runs, followers, privacy, cheers, and webhooks.
What that looks like
“I’m running Chamonix on Saturday. Invite my crew, only notify people that day, and message me when someone new asks to follow.”
Your agent works out which tools to call. You didn’t write any of them.
Real use cases, real endpoints. Your agent handles the logistics. You handle the elevation.
Before a 100-miler, your agent bulk-invites your crew, sets privacy to friends-only, and schedules notification days. During the race, it relays cheers to your Discord.
POST /api/me/followers/bulk-inviteAuthorization: Bearer dotdot_pat_k8x...
{ "invites": [ { "email": "[email protected]" }, { "email": "[email protected]" }, { "email": "[email protected]" } ]}Your agent watches for run events and posts updates to Slack, Discord, Strava clubs, or your blog. Real-time, zero manual effort.
// webhook: run.finished{ "event": "run.finished", "runner": "arthur", "distance_meters": 80467, "duration_seconds": 51840, "moving_seconds": 48120, "paused_seconds": 3720, "spectator_count": 247}
// "Arthur finished 50mi in 14:24"Auto-approve anyone from your running club's email domain. Deny the rest. Get a Telegram ping for edge cases.
// webhook: follower.requested{ "event": "follower.requested", "follower_id": "f9e8d7c6", "email": "[email protected]", "nickname": "Jamie"}
// agent checks domain → approvePOST /api/me/followers/f9e8d7c6/approveYour agent sends personalized cheers based on progress. It knows when you've been climbing for an hour and sends the right words.
// agent reads live positionGET /api/runners/sarah/current
// detects big climb, sends cheerPOST /api/runs/a1b2c3d4/cheers{ "nickname": "Coach Bot", "message": "8hrs in, summit done."}Getting started
That is genuinely it for MCP — OAuth handles the rest. For scripts and CI, create a scoped API token in the dashboard instead.
read:runs · write:followers · write:events
Paste one URL into your agent and approve the scopes it asks for. It discovers the tools it is allowed to use, and nothing else.
https://dotdot.sivoov.app/api/mcp
Optional, and how you stop polling. Events arrive as signed POSTs; your agent calls back through MCP or REST.
run.started · run.finished · follower.approved
Reference
Standard REST. Authorization: Bearer dotdot_pat_...
Full OpenAPI 3.1 spec at /api/openapi.json
Real-time
Register a webhook URL. We POST signed JSON payloads when things happen. HMAC-SHA256 on every request. Retry with exponential backoff. Your agent reacts in real time.
Runner begins a GPS-tracked run
Run completed with summary stats
Someone cheered during a run
New follow request incoming
Follow request was approved
3, 5, 10, 25, 50, 100 watchers
New GPS data (configurable)
1POST https://your-agent.dev/webhook2X-DotDot-Signature: sha256=a8f5f1...3Content-Type: application/json4
5{6 "event": "spectator.milestone",7 "timestamp": "2025-07-12T09:45:00Z",8 "data": {9 "run_id": "a1b2c3d4",10 "runner": "sarah",11 "threshold": 50,12 "count": 53,13 "top_followers": [14 "Coach Mike",15 "Alex",16 "Sam"17 ]18 }19}Verify the signature. Parse the JSON. Do your thing.
1GET /.well-known/agent.json2
3{4 "name": "DotDot",5 "description": "Live GPS run tracking for ultra runners, with a programmable API for agents",6 "url": "https://dotdot.sivoov.app",7 "openapi": "https://dotdot.sivoov.app/api/openapi.json",8 "auth": {9 "type": "bearer",10 "instructions": "Create a Personal Access Token at /dashboard?tab=integrations"11 },12 "mcp": {13 "url": "https://dotdot.sivoov.app/api/mcp",14 "transport": "streamable-http"15 },16 "webhook_events": [17 "run.started",18 "run.finished",19 "cheer.received",20 "follower.requested",21 "follower.approved",22 "spectator.milestone",23 "trackpoints.batch"24 ]25}Standards-first
DotDot publishes a standard discovery file at /.well-known/agent.json. It points at both the MCP endpoint and the OpenAPI spec, so an agent can pick whichever it speaks. No SDK to install. No vendor lock-in. Just HTTPS and JSON.
The one human step
Your Garmin watch starts LiveTrack, which emails DotDot. The only manual setup is adding [email protected] as a LiveTrack recipient in Garmin Connect, a one-time step. After that, every run is automatically tracked, broadcast, and available via the API.
Working on full automation. Community recipes for agent-driven setup coming soon.
Create an account. Generate a token. Let your agent handle the rest.