A comprehensive Model Context Protocol (MCP) server for personal location tracking with intelligent place recognition, automatic clustering, and Google Places integration.
- Real-time GPS Tracking: Store location points from iOS app with high accuracy
- Intelligent Place Detection: Automatic clustering to identify where you spend time
- Place Recognition: Google Places API integration for automatic place naming
- Manual Labeling: Name your frequent places (Home, Work, Gym, etc.)
- Visit Tracking: Automatic detection of arrival/departure times
- Travel Statistics: Distance traveled, average speed, time spent moving
- 13 MCP Tools: Comprehensive AI-accessible location queries
- PostGIS Support: Advanced geospatial queries and radius searches
iOS App → location-history-mcp-server → PostgreSQL (PostGIS)
↓
ChatGPT / Claude
(13 MCP tools)
get_current_location- Your most recent GPS positionget_location_history- GPS points for date rangeget_location_at_time- Where were you at [specific time]?search_locations_near- Find visits near coordinates/addressget_travel_stats- Distance, speed, time traveled
get_frequent_places- Most visited places (sorted by visit count)list_all_places- All identified places (labeled & unlabeled)label_place- Name a place (e.g., "Home", "Equinox Gym")get_unlabeled_frequent_places- Suggest places to label
get_place_visits- All visits to a specific placeget_time_at_place- Total time spent at a placeenrich_place_with_google- Get business name from Google Places APIprocess_recent_locations- Trigger place detection/clustering
-
PostgreSQL Database with PostGIS
- Cloud SQL instance or local PostgreSQL
- PostGIS extension enabled
- Same database as health-data-storage recommended
-
Google Places API Key (Optional but recommended)
- Enable Places API in Google Cloud Console
- For automatic place name resolution
- Cost: ~$0.005 per API call
-
iOS Location Tracker App
- See:
location-tracker-ios(companion app)
- See:
npm installCreate .env file:
# Database (use your health-data-storage Cloud SQL connection)
DATABASE_URL=postgresql://user:pass@/health_data?host=/cloudsql/PROJECT:REGION:INSTANCE
# Google Places API (optional)
GOOGLE_PLACES_API_KEY=your_api_key_here
# User ID (your email)
[email protected]The server automatically creates tables on first run:
location_points- GPS coordinates with timestampsplaces- Identified significant placesplace_visits- Visit records with arrival/departure times
npm run devGOOGLE_CLOUD_PROJECT=your-project-id ./deploy.shUpdate location-tracker-ios/LocationTracker/APIClient.swift:
private let baseURL = "https://location-history-mcp-server-xxxxx.run.app"Update location-tracker-ios/LocationTracker/Config.swift:
static let userId = "[email protected]"- Go to ChatGPT Settings → GPT Connectors
- Add server URL:
https://your-server.run.app/sse - Start asking questions:
"Where was I last Tuesday at 3pm?"
"How much did I travel this week?"
"How many times did I visit the gym this month?"
"Show me my most frequent places"
"Label place #5 as 'Home'"
Add to claude_desktop_config.json:
{
"mcpServers": {
"location-history": {
"url": "https://your-server.run.app/sse"
}
}
}- Upload: iOS app uploads GPS points in batches of 10
- Storage: Points stored in
location_pointstable - Clustering: Background process identifies "stops" (stayed >5 min within 50m)
- Place Creation: New place created or matched to existing place
- Visit Recording: Arrival/departure times tracked in
place_visits - Google Enrichment (optional): Reverse geocode to get business names
- Manual Labeling: You name important places
- id, user_id, latitude, longitude
- accuracy, altitude, speed, course
- timestamp, device_model, device_os
- place_id (FK to places)
- geom (PostGIS geography point)- id, user_id, name, category
- center_lat, center_lng, radius
- address, google_place_id, google_place_name
- visit_count, created_at, updated_at
- geom (PostGIS geography point)- id, user_id, place_id (FK)
- arrival_time, departure_time, duration_minutesPOST /upload- iOS app uploads location batchesGET /health- Health checkGET /sse- MCP SSE transportPOST /message- MCP message handlerGET /tools- List available MCP tools
Tool: get_location_at_time
Args: { timestamp: "2025-10-26T14:00:00Z" }
Returns: Lat/lng coordinates
Tool: get_time_at_place
Args: {
place_name: "Work",
start_date: "2025-10-20T00:00:00Z",
end_date: "2025-10-27T00:00:00Z"
}
Returns: Total hours, visit count, average visit duration
Tool: get_frequent_places
Returns: Sorted list with visit counts, coordinates, names
- Your Data: All location data stays in your Cloud SQL database
- No Third-party Storage: MCP server doesn't store data, only queries it
- Optional Google API: Use only when you explicitly enrich a place
- User Control: You decide which places to label and share with AI
# Local development
npm run dev
# Build TypeScript
npm run build
# Run production
npm start- Cloud Run: Free tier covers typical personal use
- Cloud SQL: Shared with health-data-storage, no additional cost
- Google Places API: ~$0.005/call, only used for enrichment
- Total: Typically $0-3/month for personal use
- Check iOS app is uploading: look for "✅ Successfully uploaded" logs
- Verify DATABASE_URL in Cloud Run environment variables
- Run health check:
curl https://your-server.run.app/health
- Ensure you're staying in one location for 5+ minutes
- Manually trigger: use
process_recent_locationstool - Check clustering settings in
PlacesAnalyzerconstructor
- Verify GOOGLE_PLACES_API_KEY is set in Cloud Run
- Enable Places API in Google Cloud Console
- Check API quotas and billing
For issues:
- Check Cloud Run logs:
gcloud run services logs read location-history-mcp-server - Verify database connectivity
- Check iOS app logs
MIT License
Built with Model Context Protocol and deployed on Google Cloud Run