Bundled Notes MCP
This server provides a local MCP interface to manage a Bundled Notes account, covering bundles, notes, tags, Kanban boards, templates, and file attachments. All mutating tools require confirm=true to execute; reads are read-only and authentication tokens are never returned.
Account & Status: Check server status (
bundled_status) and retrieve a safe account projection (bundled_current_user).Bundles: List, get, create (Notes, List, or Board), update details/layout/settings, archive/restore, and permanently delete bundles.
Notes/Entries: List, get, search (client‑side text matching), create Markdown entries, update content and state (pin/archive/complete), duplicate, move between bundles (with rollback), and permanently delete.
Tags & Tasks: List, create local or global tags with optional actions (completion, archive, swap), update, apply to entries, remove, and permanently delete (blocks dangling references by default).
Kanban Boards: Configure board columns from tags, move entries to a column or the backlog.
Templates: List custom templates, create from an existing bundle (optionally with entries), apply to create new bundles, and permanently delete.
Files & Attachments: List account files (metadata only), upload a local file and attach to an entry (max 400 MiB), detach from entries, and permanently delete account files.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Bundled Notes MCP search my notes for 'meeting'"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Este servidor local expõe bundles, notas Markdown, tags/tarefas, quadros Kanban, templates personalizados, busca e Files & Photos pelo mesmo modelo Firebase usado pelo aplicativo web.
Este projeto não é afiliado ao Bundled Notes. O aplicativo não publica uma API estável ou suportada; mudanças de schema ou regras Firebase podem quebrar a integração. Mantenha backup e revise toda escrita.
Este servidor é vinculado a uma única conta. Faça fork do repositório, publique seu próprio deployment no Prefect Horizon e configure somente os seus secrets. Não use nem compartilhe o deployment de outra pessoa: ele acessa a conta definida nos secrets daquele servidor.
Contrato de segurança
Toda ferramenta que altera estado retorna
confirmation_requiredsem chamar a API, a menos que recebaconfirm=true.Arquivamento e restauração são explícitos. Exclusões permanentes têm nomes claros e removem recursivamente as subcoleções Firestore conhecidas.
Atualizações usam update masks e preservam campos desconhecidos.
Tokens de autenticação, compra e download nunca são retornados pelas ferramentas.
Downloads autenticados retornam Base64 somente até 10 MiB e nunca expõem URLs assinadas ou tokens do Firebase Storage.
Movimentações criam e verificam o destino antes de remover a origem, com rollback compensatório da cópia quando necessário.
Exclusões de tag bloqueiam referências pendentes por padrão.
Uploads respeitam o limite observado de 400 MiB, validam tamanho/metadados no Storage, relêem o catálogo e compensam falhas parciais.
bundled_schema_statuscompara formas sanitizadas do Firestore com um contrato versionado sem retornar títulos, conteúdo, nomes de arquivo, IDs ou outros valores.
Consulte WRITES.md antes de habilitar mutações.
Related MCP server: Datacron
Início rápido
Requer Python 3.11+ e uv.
uv sync --locked --extra devO bootstrap descobre a configuração pública atual do site e obtém um refresh token sem imprimir a senha ou o token:
uv run bundled-notes-bootstrap-auth --output .envO helper solicita e-mail e senha interativamente. O .env é ignorado pelo Git e
deve ser tratado como uma senha. Se a descoberta automática deixar de funcionar,
informe a chave pública atual com --api-key.
Executar
Prefect Horizon (seu próprio deployment)
Faça fork deste repositório.
Entre no Prefect Horizon com GitHub e selecione o seu fork.
Use o entrypoint
src/bundled_notes_mcp/server.py:mcp.Use
pyproject.tomlcomo arquivo de dependências.Cadastre somente as credenciais da sua conta Bundled Notes como secrets.
Mantenha Authentication habilitada e faça o deploy.
O endpoint será semelhante a https://seu-servidor.fastmcp.app/mcp. Cada fork e
deployment deve representar uma única conta. Não conecte ao ChatGPT um deployment
publicado por outra pessoa. Mantenha os payloads MCP de requisição e resposta
desabilitados nos logs porque eles podem conter notas e metadados privados.
Local (stdio)
uv run bundled-notes-mcpExemplo de configuração no Codex; em ambientes compartilhados, use um gerenciador de secrets:
[mcp_servers.bundled-notes]
command = "uv"
args = ["--directory", "C:/Users/guipm/Desktop/MCPs/bundled-notes-mcp", "run", "bundled-notes-mcp"]
[mcp_servers.bundled-notes.env]
BUNDLED_FIREBASE_API_KEY = "..."
BUNDLED_FIREBASE_REFRESH_TOKEN = "..."
BUNDLED_FIREBASE_UID = "..."Comece com bundled_status e bundled_list_bundles. Para uma escrita, chame uma
vez sem confirmação, revise IDs e payload, depois repita com confirm=true.
Conectar ao ChatGPT
Depois de publicar o seu próprio fork, use estes metadados ao adicionar o MCP no ChatGPT:
Campo | Valor |
Nome |
|
Descrição |
|
URL |
|
Autenticação | OAuth |
Imagem |
|
Ative o modo de desenvolvedor em Configurações → Segurança e login, abra Plugins, selecione +, preencha os campos acima e conclua a autenticação. O passo a passo completo, incluindo validação e atualização do catálogo, está no guia de conexão com o ChatGPT.
Ferramentas
O catálogo da versão 0.3.0 expõe 43 ferramentas. A leitura de lembretes é suportada; criação e agendamento permanecem deliberadamente bloqueados até existir um contrato upstream validado end-to-end.
Grupo | Capacidades |
Conta | Status autenticado e projeção segura do usuário |
Compatibilidade | Auditoria sanitizada de schema e detecção de drift aditivo/quebrável |
Backup | Exportar a conta ou um bundle em JSON estruturado |
Bundles | Listar, consultar, criar, editar, reordenar, arquivar, restaurar e excluir |
Notas | Listar, buscar, criar, editar, reordenar, duplicar, mover, concluir e excluir |
Tags e tarefas | Gerenciar tags locais/globais, assinaturas, prioridade e ações |
Kanban | Configurar colunas ordenadas e mover notas para coluna/backlog |
Templates | Criar a partir de bundle, aplicar e excluir |
Files & Photos | Listar, baixar até 10 MiB, enviar, anexar, desanexar e excluir |
Rich links | Gerar ou atualizar previews pela callable function nativa |
Lembretes | Listar metadados de lembretes anexados às notas |
A busca filtra notas localmente porque o aplicativo também usa um índice/cache no cliente, não um endpoint Firestore de texto completo. Os limites são finitos por padrão; aumente-os deliberadamente em contas grandes.
Desenvolvimento
uv sync --locked --extra dev
uv run ruff format --check .
uv run ruff check .
uv run pytest
uv run fastmcp inspect src/bundled_notes_mcp/server.py:mcp
uv buildConsulte o índice de documentação, o mapa de arquitetura, o playbook para agentes, o guia de deploy, a manutenção de schema e os testes. O arquivo llms.txt contém o mapa compacto e o catálogo exato para agentes.
Limites conhecidos
Endpoints Firebase e caminhos Firestore são detalhes de implementação, não uma promessa de compatibilidade.
Escritas de lembretes continuam bloqueadas até que o contrato Android de agendamento/notificação possa ser validado end-to-end; persistir um documento Firestore sem garantir o disparo não é considerado suporte funcional.
Importação do Google Keep permanece fora do MCP enquanto o fluxo oficial ainda estiver em desenvolvimento.
Antes de excluir um arquivo da conta, desanexe-o das notas relevantes.
Contadores do documento de usuário podem atrasar; as listagens são a fonte operacional deste servidor.
Available Tools
33 toolsbundled_apply_tagApply TagBDestructiveIdempotent
Apply a tag; optionally execute its completion/archive/swap actions.
Inputs: tag_id (required), entry_id (required), bundle_id (required), confirm, +1 more.
bundled_apply_templateApply Bundle TemplateC
Create a new bundle from a custom template.
Inputs: template_id (required), name, confirm, default_bundle.
bundled_configure_kanbanConfigure KanbanCDestructiveIdempotent
Enable/configure a board using ordered tag IDs as columns.
Inputs: bundle_id (required), column_tag_ids (required), confirm, enabled, +3 more.
bundled_create_bundleCreate BundleB
Create a Notes, List, or Board bundle. Requires confirm=true.
Inputs: spec (required), confirm.
bundled_create_entryCreate EntryC
Create a Markdown entry in a bundle.
Inputs: spec (required), bundle_id (required), confirm.
bundled_create_tagCreate Tag or TaskB
Create a local/global tag, optionally with completion, archive, or tag-swap task actions.
Inputs: spec (required), bundle_id (required), confirm.
bundled_create_templateCreate Bundle TemplateB
Create a custom template from a bundle, copying local tags and optionally entries.
Inputs: name (required), bundle_id (required), confirm, description, +1 more.
bundled_current_userGet Bundled Notes AccountARead-onlyIdempotent
Return a safe account projection; purchase and authentication tokens are always omitted.
Inputs: no named parameters. Returns: object
bundled_delete_account_attachmentDelete Account FileADestructiveIdempotent
Permanently delete the account catalog record and storage object; detach references first.
Inputs: attachment_id (required), confirm.
bundled_delete_bundlePermanently Delete BundleADestructiveIdempotent
Permanently delete a bundle plus all entry and tag subdocuments.
Inputs: bundle_id (required), confirm.
bundled_delete_entryPermanently Delete EntryBDestructiveIdempotent
Permanently delete one entry. Account-storage files are not deleted.
Inputs: entry_id (required), bundle_id (required), confirm.
bundled_delete_tagPermanently Delete TagBDestructiveIdempotent
Delete a tag. By default refuses when entries or Kanban still reference it.
Inputs: tag_id (required), bundle_id (required), confirm, global_tag, +1 more.
bundled_delete_templatePermanently Delete TemplateBDestructiveIdempotent
Permanently delete a custom template and its copied tags/entries.
Inputs: template_id (required), confirm.
bundled_duplicate_entryDuplicate EntryA
Copy an entry. The copy gets a new document and numeric ID; destination tags are explicit.
Inputs: entry_id (required), source_bundle_id (required), target_bundle_id (required), confirm, +1 more.
bundled_get_bundleGet BundleARead-onlyIdempotent
Get one bundle and all known presentation/Kanban settings.
Inputs: bundle_id (required).
bundled_get_entryGet EntryBRead-onlyIdempotent
Get an entry with Markdown content, tag IDs, state, and attachment metadata.
Inputs: entry_id (required), bundle_id (required).
bundled_list_attachmentsList Account FilesARead-onlyIdempotent
List account-level Files & Photos metadata without download tokens.
Inputs: limit.
bundled_list_bundlesList BundlesARead-onlyIdempotent
List bundles, optionally including archived bundles.
Inputs: limit, include_archived.
bundled_list_entriesList Bundle EntriesBRead-onlyIdempotent
List notes/entries in one bundle.
Inputs: bundle_id (required), limit, include_archived.
bundled_list_tagsList Bundle TagsARead-onlyIdempotent
List bundle-local tags and subscribed global tags.
Inputs: bundle_id (required), include_global.
bundled_list_templatesList Custom TemplatesARead-onlyIdempotent
List user-created bundle templates.
Inputs: limit.
bundled_move_entryMove EntryADestructiveIdempotent
Copy to the destination, verify it, then delete the source; rolls back the copy if source deletion fails.
Inputs: entry_id (required), source_bundle_id (required), target_bundle_id (required), confirm, +1 more.
bundled_move_kanban_entryMove Entry Across KanbanCDestructiveIdempotent
Move an entry to one configured column, or to backlog with null.
Inputs: entry_id (required), bundle_id (required), target_column_tag_id (required), confirm.
bundled_remove_attachmentDetach File from EntryADestructiveIdempotent
Remove an attachment reference from an entry but keep the account-storage file.
Inputs: entry_id (required), bundle_id (required), attachment_id (required), confirm.
bundled_remove_tagRemove TagBDestructiveIdempotent
Remove one tag reference from an entry.
Inputs: tag_id (required), entry_id (required), bundle_id (required), confirm.
bundled_search_entriesSearch EntriesBRead-onlyIdempotent
Client-side text search matching the web app's local title/content search semantics.
Inputs: query (required), limit, tag_id, bundle_id, +1 more.
bundled_set_bundle_archivedArchive or Restore BundleBDestructiveIdempotent
Archive or restore a bundle without deleting its contents.
Inputs: archived (required), bundle_id (required), confirm.
bundled_set_entry_stateSet Entry StateADestructiveIdempotent
Set archived, markedAsComplete, or pinned explicitly; never toggles blindly.
Inputs: state (required), value (required), entry_id (required), bundle_id (required), +1 more.
bundled_statusBundled Notes MCP StatusARead-onlyIdempotent
Report configuration and validate the Firebase refresh token with a real read.
Inputs: no named parameters. Returns: object
bundled_update_bundleUpdate BundleBDestructiveIdempotent
Partially update bundle details, layout, sorting, or display settings.
Inputs: spec (required), bundle_id (required), confirm.
bundled_update_entryUpdate EntryBDestructiveIdempotent
Partially update entry text, tags, or pin state.
Inputs: spec (required), entry_id (required), bundle_id (required), confirm.
bundled_update_tagUpdate Tag or TaskCDestructiveIdempotent
Partially update a local or global tag definition.
Inputs: spec (required), tag_id (required), bundle_id (required), confirm, +1 more.
bundled_upload_attachmentUpload and Attach FileA
Upload a local file to account storage and attach it to an entry (400 MiB maximum).
Inputs: entry_id (required), bundle_id (required), file_path (required), confirm.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 33 tools
Each tool targets a specific resource and action combination, with only minor overlap between update_entry and set_entry_state around pin state. Descriptions clearly distinguish attachment reference removal from account storage deletion.
All tools share the bundled_ prefix and follow a consistent verb_noun structure, with the only exceptions being status and current_user which are intuitively named. No style mixing.
At 33 tools, the set is substantial, exceeding the 25-tool threshold for appropriate scope. While each tool has a clear purpose, the number may overwhelm agents.
The surface covers the full lifecycle for bundles, entries, tags, templates, attachments, and Kanban configuration, with no obvious dead ends. The only minor gap is lack of template update or attachment download, but these are not critical.
Related MCP Connectors
Google Keep-style notes app with an MCP server for AI agents to read/write notes.
Hosted MCP server for Obsidian Sync vaults: read, search, edit notes. Not affiliated with Obsidian.
Serve a folder of Markdown notes as an MCP server: hybrid search, reading, and sourced answers.
Official Todoist MCP server. Manage tasks and projects. Hosted, no API key needed.
Related MCP Servers
- AlicenseAqualityCmaintenanceMCP server for managing a local, domain-agnostic knowledge base using Markdown notes with frontmatter. Enables AI agents to capture, read, search, link, and maintain notes with atomic writes and privacy controls.13MIT
- AlicenseAqualityBmaintenanceLocal MCP server for querying and maintaining a Markdown vault. Provides full-text search, backlinks, note retrieval, and optional confined write tools, without sending the whole vault to the client context.2261 PyPI1Apache 2.0
- AlicenseNot gradedqualityDmaintenanceA personal note store exposed as an MCP server. Enables any MCP-speaking assistant to create, search, list, and categorize notes, with per-client bearer tokens for author attribution.635 npmMIT
- AlicenseNot gradedqualityCmaintenanceLets MCP clients search, read, create, append, replace, move, and batch-update local Markdown notes safely, with conflict detection via SHA-256 and optional managed update blocks, without requiring a vector database.MIT