Local-first email and calendar inbox for AI agents
Project description
Chronos — agent-inbox
Local-first email and calendar inbox for AI agents. Syncs Gmail and Google Calendar into a single queryable SQLite database and exposes all data through an MCP server.
Features
- Sync multiple Gmail and Google Calendar accounts into one SQLite database
- Full-text search via FTS5 with BM25 relevance ranking (messages, events, attachment names)
- MCP server via
chronos --mcp-stdio(stdio transport, no port required) - HTTP REST API at
localhost:7070for direct queries - Read-only SQL interface via
POST /v1/query - Optimistic event writes with provider-wins conflict resolution
- Incremental sync with historyId (Gmail) and syncToken (Calendar)
- ULID primary keys, WAL mode, no cloud dependencies at query time
Installation
pipx install chronos-mcp
Or from source:
git clone https://github.com/CourtimusPrime/chronos.git
cd chronos
pip install -e .
Setup
Run the interactive walkthrough for detailed step-by-step instructions:
chronos --walkthrough
This prints the full guide in the terminal and saves it to ~/.chronos/WALKTHROUGH.md for future reference.
Quick start
1. Google Cloud Console
- Create a project at console.cloud.google.com
- Enable Gmail API and Google Calendar API
- Configure OAuth consent screen (External, Testing mode) — add your Google account as a Test User
- Add scopes:
https://mail.google.com/andhttps://www.googleapis.com/auth/calendar - Create an OAuth client ID — Application type: Web application
- Add authorized redirect URI:
http://localhost:9004/callback - Download the credentials JSON
Desktop App credentials (
"installed"JSON shape) are not supported — Chronos uses thehttps://mail.google.com/restricted scope, which requires a Web Application OAuth client in Testing mode.
2. Register accounts
# Stage your credentials file
chronos --use /path/to/credentials.json
# Add accounts (opens browser for OAuth consent)
chronos --add personal
chronos --add work
3. Start syncing
chronos --start
Chronos downloads all your emails and calendar events into a local SQLite database. Your AI agents query this database — no live Google API calls at read time.
4. Add the MCP server
chronos --mcp
Writes the stdio entry into .mcp.json and appends instructions to ~/.claude/CLAUDE.md.
5. Test it
claude "What's the most recent email I received?"
CLI Reference
chronos --use CREDENTIALS_PATH # Stage a credentials JSON for --add
chronos --add ALIAS # Register a new account (requires prior --use)
chronos --remove ALIAS # Remove an account and its data
chronos --list # List all registered accounts
chronos --test ALIAS # Test account tokens
chronos --start [--http-port N] # Start daemon (HTTP API + background sync)
chronos --stop # Stop the running daemon (preserves synced data)
chronos --status # Show sync status
chronos --sync [ALIAS] [--type full|incremental] # Trigger sync
chronos --mcp # Add Chronos to .mcp.json (prompts for scope)
chronos --mcp-stdio # Start embedded MCP server on stdio
chronos --walkthrough # Print full setup guide
Ctrl+C vs --stop: Pressing Ctrl+C while
chronos --startis running wipes synced data (emails, threads, events, calendars) but preserves accounts. Usechronos --stopfrom another terminal for a clean shutdown that preserves data.
Environment Variables
| Variable | Default | Description |
|---|---|---|
CHRONOS_HOME |
~/.chronos |
Credentials and database directory |
CHRONOS_DB_PATH |
$CHRONOS_HOME/chronos.db |
SQLite database file |
CHRONOS_HTTP_PORT |
7070 |
HTTP API port |
CHRONOS_LOG_LEVEL |
INFO |
Log level |
Configuration
config.yml is auto-created at ~/.chronos/config.yml on first run. The OAuth
callback port is the most commonly customized setting:
settings:
oauth:
callback_port: 9004 # local server bind during `chronos --add`
callback_path: /callback # appended to the redirect URI
If you change callback_port, update the Authorized redirect URI in Google Cloud Console to match.
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file chronos_mcp-0.1.18.tar.gz.
File metadata
- Download URL: chronos_mcp-0.1.18.tar.gz
- Upload date:
- Size: 61.7 kB
- Tags: Source
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
c71fe5c61ac8d74f34e6fb85729a982a958ccd6c2e709e4257ab738cd8c27a99
|
|
| MD5 |
12ee7a6d9874e744f3379b870e852c31
|
|
| BLAKE2b-256 |
02291a66b0ebbd3fa9750f9d4253038a3f4ebe2196684062bcee317cf1274002
|
File details
Details for the file chronos_mcp-0.1.18-py3-none-any.whl.
File metadata
- Download URL: chronos_mcp-0.1.18-py3-none-any.whl
- Upload date:
- Size: 59.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? No
- Uploaded via: uv/0.11.8 {"installer":{"name":"uv","version":"0.11.8","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":{"name":"Ubuntu","version":"24.04","id":"noble","libc":null},"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4dcdcf521e80231ec96cdfb1bf9a11540753d79a83d5196788b4e932d20a578f
|
|
| MD5 |
9d2a82cfd111a3a698335855865d370b
|
|
| BLAKE2b-256 |
71d1d37a705354734c633d222acaf4ab9092eb62680ff53f507fd704226e3391
|