loading…
Search for a command to run...
loading…
Read, create, update and delete Google Keep notes.
Read, create, update and delete Google Keep notes.
MCP server for Google Keep
"mcpServers": {
"keep-mcp-pipx": {
"command": "pipx",
"args": [
"run",
"keep-mcp"
],
"env": {
"GOOGLE_EMAIL": "Your Google Email",
"GOOGLE_MASTER_TOKEN": "Your Google Master Token - see README.md"
}
}
}
GOOGLE_EMAIL: Your Google account email addressGOOGLE_MASTER_TOKEN: Your Google account master tokenCheck https://gkeepapi.readthedocs.io/en/latest/#obtaining-a-master-token and https://github.com/simon-weber/gpsoauth?tab=readme-ov-file#alternative-flow for more information.
find: Search notes with optional filters for labels, colors, pinned, archived, and trashedget_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)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.
"env": {
...
"UNSAFE_MODE": "true"
}
If you prefer a JS-style workflow (npm i, npm start), use the included Makefile:
make install # like npm i
make start # like npm start
make test
make lint
Run the real-account smoke test with credentials:
GOOGLE_EMAIL="[email protected]" \
GOOGLE_MASTER_TOKEN="..." \
make smoke
Equivalent direct uv commands (without make):
UV_CACHE_DIR=/tmp/uv-cache uv venv --python 3.11 .venv
UV_CACHE_DIR=/tmp/uv-cache uv pip install --python .venv/bin/python -e .
UV_CACHE_DIR=/tmp/uv-cache uv run --no-sync --python .venv/bin/python -m server
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:
make test
For additional confidence, run a basic lifecycle smoke test against a dedicated test account:
GOOGLE_EMAIL="[email protected]" \
GOOGLE_MASTER_TOKEN="..." \
make smoke
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.tomlpipx run build
pipx run twine upload --repository pypi dist/*
This is useful when you want a client to run this server from your local checkout instead of PyPI.
cd /ABSOLUTE/PATH/TO/keep-mcp
make install
config.toml clients (Codex, Goose, etc.)[mcp_servers.keep_mcp]
command = "make"
args = ["-C", "/ABSOLUTE/PATH/TO/keep-mcp", "start"]
[mcp_servers.keep_mcp.env]
GOOGLE_EMAIL = "[email protected]"
GOOGLE_MASTER_TOKEN = "your-master-token"
UNSAFE_MODE = "false"
mcpServers clients (Claude Desktop, Cursor, Cline, etc.){
"mcpServers": {
"keep-mcp-local": {
"command": "make",
"args": ["-C", "/ABSOLUTE/PATH/TO/keep-mcp", "start"],
"env": {
"GOOGLE_EMAIL": "[email protected]",
"GOOGLE_MASTER_TOKEN": "your-master-token",
"UNSAFE_MODE": "false"
}
}
}
}
Alternative (without make):
[mcp_servers.keep_mcp]
command = "uv"
args = [
"--directory", "/ABSOLUTE/PATH/TO/keep-mcp",
"run", "--no-sync", "--python", ".venv/bin/python",
"-m", "server"
]
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.Добавь это в claude_desktop_config.json и перезапусти Claude Desktop.
{
"mcpServers": {
"feuerdev-keep-mcp": {
"command": "npx",
"args": []
}
}
}