MCP server for Google Keep 1. Add the MCP server to your MCP servers: 2. Add your credentials: GOOGLEEMAIL: Your Google account email address GOOGLEMASTERTOKEN: Your Google account master token Check https://gkeepapi.readthedocs.io/en/latest/obtaining-a-master-token and https://github.com/simon-weber/gpsoauth?tab=readme-ov-filealternative-flow for more information. find: Search notes with optional
Add this skill
npx mdskills install feuerdev/keep-mcpComprehensive Google Keep integration with extensive tool coverage and excellent safety model
1# keep-mcp23MCP server for Google Keep4567## How to use891. Add the MCP server to your MCP servers:1011```json12 "mcpServers": {13 "keep-mcp-pipx": {14 "command": "pipx",15 "args": [16 "run",17 "keep-mcp"18 ],19 "env": {20 "GOOGLE_EMAIL": "Your Google Email",21 "GOOGLE_MASTER_TOKEN": "Your Google Master Token - see README.md"22 }23 }24 }25```26272. Add your credentials:28* `GOOGLE_EMAIL`: Your Google account email address29* `GOOGLE_MASTER_TOKEN`: Your Google account master token3031Check 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.3233## Features3435### Query and read tools36* `find`: Search notes with optional filters for labels, colors, pinned, archived, and trashed37* `get_note`: Get a single note by ID3839### Creation and update tools40* `create_note`: Create a new note with title and text (automatically adds keep-mcp label)41* `create_list`: Create a checklist note42* `update_note`: Update a note's title and text43* `add_list_item`: Add an item to a checklist note44* `update_list_item`: Update checklist item text and checked state45* `delete_list_item`: Delete a checklist item4647### Note state tools48* `set_note_color`: Set a note color (valid values: DEFAULT, RED, ORANGE, YELLOW, GREEN, TEAL, BLUE, CERULEAN, PURPLE, PINK, BROWN, GRAY)49* `pin_note`: Pin or unpin a note50* `archive_note`: Archive or unarchive a note51* `trash_note`: Move a note to trash52* `restore_note`: Restore a trashed/deleted note53* `delete_note`: Mark a note for deletion5455### Labels, collaborators, and media tools56* `list_labels`: List labels57* `create_label`: Create a label58* `delete_label`: Delete a label59* `add_label_to_note`: Add a label to a note60* `remove_label_from_note`: Remove a label from a note61* `list_note_collaborators`: List collaborator emails for a note62* `add_note_collaborator`: Add a collaborator email to a note63* `remove_note_collaborator`: Remove a collaborator email from a note64* `list_note_media`: List media blobs for a note (with media links)6566By 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.6768```69"env": {70 ...71 "UNSAFE_MODE": "true"72}73```7475## Local development (uv + make)7677If you prefer a JS-style workflow (`npm i`, `npm start`), use the included `Makefile`:7879```bash80make install # like npm i81make start # like npm start82make test83make lint84```8586Run the real-account smoke test with credentials:8788```bash89GOOGLE_EMAIL="you@example.com" \90GOOGLE_MASTER_TOKEN="..." \91make smoke92```9394Equivalent direct `uv` commands (without `make`):9596```bash97UV_CACHE_DIR=/tmp/uv-cache uv venv --python 3.11 .venv98UV_CACHE_DIR=/tmp/uv-cache uv pip install --python .venv/bin/python -e .99UV_CACHE_DIR=/tmp/uv-cache uv run --no-sync --python .venv/bin/python -m server100```101102## Testing103104### Unit tests (default)105The project includes a lightweight unit test suite under `tests/`.106107It validates:108* note serialization shape for note and list objects (including labels, collaborators, media, and list items)109* modification safety behavior (`keep-mcp` label requirement and `UNSAFE_MODE=true` override)110* MCP tool behavior in `src/server/cli.py` using mocked Keep client objects (tool happy paths and key error paths)111112Run locally:113114```bash115make test116```117118### Smoke test against a real Keep account119For additional confidence, run a basic lifecycle smoke test against a dedicated test account:120121```bash122GOOGLE_EMAIL="you@example.com" \123GOOGLE_MASTER_TOKEN="..." \124make smoke125```126127What it does:128* create note129* update note130* pin/unpin131* archive/unarchive132* trash/restore133* delete134135This script is intended for manual verification and is not run in CI.136137### CI checks138GitHub Actions runs on every pull request and executes:139* lint (`ruff check .`)140* unit tests with coverage (`pytest -q --cov=src/server --cov-report=term-missing --cov-fail-under=70`)141* bytecode sanity (`python -m compileall src`)142143## Publishing144145### Automatic publish on merge to `main` (GitHub Actions)146147This repo includes a release workflow at `.github/workflows/release.yml` that runs on every push to `main` (including merged PRs).148149It will:150* inspect commits since the last release tag (`vX.Y.Z`)151* compute the next semantic version from Conventional Commit types152* skip publishing when there are no releasable commit types153* run lint and unit tests154* build `dist/*`155* publish to PyPI156* create a GitHub release/tag `v<computed-version>` with generated notes157158Version bump rules:159* major: commit subject with `!` (example: `feat!:` or `fix(api)!:`) or commit body containing `BREAKING CHANGE`160* minor: `feat:`161* patch: `fix:`, `perf:`, `revert:`162* no release: `docs:`, `chore:`, `ci:`, `test:`, `refactor:` (unless the commit is marked as breaking)163164Required repository secret:165* `PYPI_API_TOKEN`: a PyPI API token (recommended scope: this project only)166167### Manual publish168169To publish manually to PyPI:1701711. Update the version in `pyproject.toml`1722. Build the package:173 ```bash174 pipx run build175 ```1763. Upload to PyPI:177 ```bash178 pipx run twine upload --repository pypi dist/*179 ```180181## Run locally with MCP clients182183This is useful when you want a client to run this server from your local checkout instead of PyPI.1841851. Create a local virtualenv and install in editable mode:186187```bash188cd /ABSOLUTE/PATH/TO/keep-mcp189make install190```1911922. Add the server to your MCP client config.193194### `config.toml` clients (Codex, Goose, etc.)195196```toml197[mcp_servers.keep_mcp]198command = "make"199args = ["-C", "/ABSOLUTE/PATH/TO/keep-mcp", "start"]200201[mcp_servers.keep_mcp.env]202GOOGLE_EMAIL = "you@example.com"203GOOGLE_MASTER_TOKEN = "your-master-token"204UNSAFE_MODE = "false"205```206207### JSON `mcpServers` clients (Claude Desktop, Cursor, Cline, etc.)208209```json210{211 "mcpServers": {212 "keep-mcp-local": {213 "command": "make",214 "args": ["-C", "/ABSOLUTE/PATH/TO/keep-mcp", "start"],215 "env": {216 "GOOGLE_EMAIL": "you@example.com",217 "GOOGLE_MASTER_TOKEN": "your-master-token",218 "UNSAFE_MODE": "false"219 }220 }221 }222}223```224225Alternative (without `make`):226227```toml228[mcp_servers.keep_mcp]229command = "uv"230args = [231 "--directory", "/ABSOLUTE/PATH/TO/keep-mcp",232 "run", "--no-sync", "--python", ".venv/bin/python",233 "-m", "server"234]235```236237Notes:238* Run `make install` once before starting from an MCP client.239* Only the repo root path is required (no absolute `/.venv/bin/python` path).240* Ensure `make` and `uv` are in your `PATH`.241* Restart your MCP client after updating config files.242* `UNSAFE_MODE` is optional; keep it `"false"` unless you explicitly want to modify non-`keep-mcp` notes.243244## Troubleshooting245246* If you get "DeviceManagementRequiredOrSyncDisabled" check https://admin.google.com/ac/devices/settings/general and turn "Turn off mobile management (Unmanaged)"247
Full transparency — inspect the skill content before installing.