location-platform
Integrates with Google Maps Timeline and Location Sharing to provide tools for querying historical visits, trips, activities, distance traveled, and live location data, including place names and dwell times.
Provides optional integration with OpenAI Secure MCP Tunnel services to connect ChatGPT to the MCP servers via an outbound-only connection without exposing services to the internet.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@location-platformWhere was I last Tuesday around 3pm?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
π location-platform
Ask your AI assistant where you've been β and where you are right now.
Self-hosted MCP servers that turn your Google Maps Timeline and live location into tools for Claude, ChatGPT, or any MCP client.
Why
Google stopped offering Timeline on the web, and your location history now lives only on your phone (plus an encrypted cloud backup). This project pulls that history back out, keeps it on your own server, and lets an LLM answer questions about it β alongside a separate live feed for "where am I right now?".
Related MCP server: Google Workspace MCP Server
What you can ask
"Where was I last Tuesday around 3pm?" β
where_was_ifinds the visit or trip covering that moment.
"How much time did I spend at the gym in September?" β
search_places+time_at_placetotals every visit.
"Summarize my week." β
summarize_weekreturns days, top places, distance, and how you got around.
"When was the last time I went to that taco place downtown?" β
visit_historylists every visit, newest first.
"How far did I drive this month vs. walk?" β
distance_traveledbreaks it down by activity.
"Where am I right now, and have I moved since noon?" β
where_am_i+movement_sincefrom the live feed, with data age shown.
How it works
flowchart LR
subgraph google["Google"]
TB[(Timeline<br/>cloud backup)]
LS[(Maps Location<br/>Sharing)]
end
subgraph server["Your server (Docker)"]
TS[timeline-sync<br/><sub>Python Β· every 6 h</sub>]
TJ[/Timeline.json/]
TM[timeline-mcp<br/><sub>13 tools</sub>]
LP[live poller<br/><sub>every 60 s</sub>]
LD[(live.sqlite)]
LM[live-location-mcp<br/><sub>5 tools</sub>]
AUTH{{OAuth 2.1}}
end
TB --> TS --> TJ --> TM
LS --> LP --> LD --> LM
TM & LM --- AUTH
AUTH --> C[Claude]
AUTH --> G[ChatGPT]History and live are deliberately two separate systems. Timeline is Google's semantic reconstruction (visits, trips, activities, Place IDs) and arrives hours late. Live Location Sharing is raw point observations, seconds old. They live in separate databases behind separate MCP servers and are never merged. The model picks the right tool, and every answer says how old its data is.
Features
πΊοΈ Full Timeline history | Syncs straight from Google's encrypted Timeline backup (no phone export, no Takeout) and follows every backup corpus, so nothing is cut off. |
π·οΈ Real place names | Resolves Place IDs to names automatically after each sync. |
π‘ Live location | Polls Google Maps Location Sharing through a dedicated recipient account. The session refreshes itself with cookie rotation and a persistent browser profile. |
π Hands-off re-auth | When Google revokes the Timeline token, a persistent browser signs back in. The password is sealed by the host's TPM 2.0 ( |
π Two auth layers | Google credentials never leave the server. MCP clients get only short-lived, audience-bound OAuth 2.1 tokens (RFC 9728 discovery, PKCE, JWKS verification). |
ποΈ Precision controls | Three levels with a per-server cap on what an LLM may see: |
π§Ύ Logs that can't leak | Structured logs with automatic redaction of tokens, cookies, keys, and anything that looks like a coordinate. |
π§ͺ Synthetic by default | Every test and fixture uses invented coordinates. A leak scanner checks the repo for secrets and real locations. |
π³ One | OAuth server, both MCP servers, the poller, the sync scheduler, and noVNC browser views. Ports bind to |
π¬ ChatGPT without exposure | Optional OpenAI Secure MCP Tunnel services: an outbound-only connection, with nothing published to the internet. |
Tools
Tool | |
| A point in time |
| A day or range |
| Digests |
| Find a place |
| Total dwell time |
| Radius search |
| Movement |
| Distance by mode |
| Data freshness |
Tool | |
| Latest fix |
| Points in a window |
| Nearest fix to a time |
| Distance and moves |
| Poller health |
Every tool is read-only and annotated as such. There is no SQL, file access, or bulk-export tool.
Quick start
Try it with synthetic data. No Google account needed.
git clone --recurse-submodules https://github.com/blakepennel/location-platform.git
cd location-platform
npm install
cd timeline-sync && python -m venv .venv && .venv/bin/pip install -e ".[dev]" && cd ..
cp .env.example .env
npm run seed # invented Timeline + live observations
npm run dev # OAuth :8700 Β· timeline-mcp :8701 Β· live-location-mcp :8702Point an MCP client at http://localhost:8701/mcp or http://localhost:8702/mcp. It discovers
the OAuth server and opens a sign-in page. For Claude Code, the stdio transport skips OAuth
entirely; see DEVELOPMENT.md.
Running it for real (a home server, your own Google data):
docker compose up -d --buildDOCKER.md walks through the one-time Google steps, the noVNC browser logins, TPM setup for automatic re-auth, and connecting Claude and ChatGPT.
Project layout
location-platform/
βββ timeline-sync/ Python Β· syncs + decrypts the Timeline backup (wraps arkenoi/timeline-export)
βββ timeline-mcp/ TypeScript Β· historical MCP server over its own SQLite index
βββ live-location-mcp/ TypeScript Β· live poller + MCP server
βββ mcp-auth/ OAuth 2.1 resource-server verifier + local dev authorization server
βββ shared/ logging/redaction, time/geo, sqlite, HTTP host
βββ schemas/ export contract + status JSON schemas
βββ tools/ dev runner, e2e harness, seed data, leak scanner, re-auth driver
βββ docker/ container entrypoints (noVNC, sync loop, Google browser)Testing
npm test # 246 Node + ~125 Python tests
npm run test:e2e # full stack: OAuth + both servers + a real MCP client
npm run leak-scan # secrets and real-coordinate scanDocs
Diagrams and data flow | |
Deploying on a server | |
Local setup and real Google onboarding | |
The two authentication layers | |
What's protected, and from whom | |
Per-project READMEs |
Disclaimer
This is a personal project that reads your own data through undocumented Google endpoints: the Timeline cloud backup via arkenoi/timeline-export (a pinned submodule under its own MIT license), and Maps Location Sharing. Google can change or block them at any time, and using them may conflict with Google's Terms of Service. It is not affiliated with or endorsed by Google. Use it only with accounts you own, at your own risk.
License
This server cannot be deployed
Maintenance
Related MCP Connectors
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Geolocate Me turns your phone into location context for any AI assistant. Install the iOS or Android app, connect once with OAuth, and your GPS is queryable in natural language. Ask where you are, where you parked, where you were yesterday at 3pm, or how long you were at the office β the assistant calls the tool and answers with a real street address. https://geolocateme.app
Multi-tenant hosted MCP server for Oura Ring β 21 read-only tools, OAuth per user.
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
Related MCP Servers
- AlicenseBqualityAmaintenanceA local-first MCP server that enables AI agents to read user-authorized Google Health API v4 data from Fitbit, Pixel Watch, and partners via OAuth, with tokens never leaving the machine.26604 npm64MIT
- AlicenseNot gradedqualityDmaintenanceA self-hosted MCP server providing Claude with authenticated access to Google Calendar, Gmail, Drive, Docs, Sheets, and Slides via 43 tools and secure OAuth2.1,573 npmMIT
- AlicenseAqualityBmaintenanceA local-first, privacy-first MCP server that passively indexes personal digital activity (screenshots, clipboard, notes, downloads, links) into a local database, enabling LLMs like Claude to access your context without cloud storage.4MIT
- AlicenseNot gradedqualityBmaintenanceAn MCP server that gives Claude Code write access to a personal Google account β Gmail, Drive, Calendar, Sheets, and YouTube β backed by a self-owned Google Cloud OAuth client.1,573 npmMIT