The full upstream README, mirrored here for reference. Install config, tool schemas, adoption signals, and an original overview live on the Keep MCP listing page.
MCP server for Google Keep
See CONTRIBUTING.md for contribution guidelines and required visual evidence.
Or with uvx:
GOOGLE_EMAIL: Your Google account email addressGOOGLE_MASTER_TOKEN: Your Google account master tokenkeep-mcp uses gkeepapi, which connects to Google Keep through an unofficial private API. A Google master token has full access to your account. Treat it like a password and never commit or share it.
Use the browser-assisted token exchange documented by gpsoauth. Choose how you want to run the exchange:
gpsoauth's alternative flow.Both options require the browser oauth_token described in the gpsoauth documentation.
Older instructions may ask for your Google password or an app password and call perform_master_login(). That flow is unreliable and can return BadAuthentication. Use the browser-assisted flow above instead.
find: Search notes (case-insensitive by default) with optional filters for labels, colors, pinned, archived, trashed, creation/update date ranges (ISO 8601, UTC), and a result limitget_note: Get a single note by IDcreate_note: Create a new note with title and text (automatically adds keep-mcp label)create_list: Create a checklist noteupdate_note: Update a note's title and textadd_list_item: Add an item to a checklist noteupdate_list_item: Update checklist item text and checked statedelete_list_item: Delete a checklist itemset_note_color: Set a note color (valid values: DEFAULT, RED, ORANGE, YELLOW, GREEN, TEAL, BLUE, CERULEAN, PURPLE, PINK, BROWN, GRAY)pin_note: Pin or unpin a notearchive_note: Archive or unarchive a notetrash_note: Move a note to trashrestore_note: Restore a trashed/deleted notedelete_note: Mark a note for deletionlist_labels: List labelscreate_label: Create a labeldelete_label: Delete a labeladd_label_to_note: Add a label to a noteremove_label_from_note: Remove a label from a notelist_note_collaborators: List collaborator emails for a noteadd_note_collaborator: Add a collaborator email to a noteremove_note_collaborator: Remove a collaborator email from a notelist_note_media: List media blobs for a note (with media links)download_media: Download a note's media (images, drawings, audio) to a local directory through the authenticated session (the raw media links answer 403 to plain HTTP clients)By default, all destructive and modification operations are restricted to notes that have were created by the MCP server (i.e. have the keep-mcp label). Set UNSAFE_MODE to true to bypass this restriction.
If you prefer a JS-style workflow (npm i, npm start), use the included Makefile:
Run the real-account smoke test with credentials:
Equivalent direct uv commands (without make):
The project includes a lightweight unit test suite under tests/.
It validates:
keep-mcp label requirement and UNSAFE_MODE=true override)src/server/cli.py using mocked Keep client objects (tool happy paths and key error paths)Run locally:
For additional confidence, run a basic lifecycle smoke test against a dedicated test account:
What it does:
This script is intended for manual verification and is not run in CI.
GitHub Actions runs on every pull request and executes:
ruff check .)pytest -q --cov=src/server --cov-report=term-missing --cov-fail-under=70)python -m compileall src)main (GitHub Actions)This repo includes a release workflow at .github/workflows/release.yml that runs on every push to main (including merged PRs).
It will:
vX.Y.Z)dist/*v<computed-version> with generated notesVersion bump rules:
! (example: feat!: or fix(api)!:) or commit body containing BREAKING CHANGEfeat:fix:, perf:, revert:docs:, chore:, ci:, test:, refactor: (unless the commit is marked as breaking)Required repository secret:
PYPI_API_TOKEN: a PyPI API token (recommended scope: this project only)To publish manually to PyPI:
pyproject.tomlThis is useful when you want a client to run this server from your local checkout instead of PyPI.
config.toml clients (Codex, Goose, etc.)mcpServers clients (Claude Desktop, Cursor, Cline, etc.)Alternative (without make):
Notes:
make install once before starting from an MCP client./.venv/bin/python path).make and uv are in your PATH.UNSAFE_MODE is optional; keep it "false" unless you explicitly want to modify non-keep-mcp notes.