Snackbar MCP Server
A 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.
README
Snackbar
A personal note store with an MCP front door, so any assistant you're talking to can capture an idea wherever you happen to be.
The problem it solves is narrow and specific: ideas arrive on the couch, on a walk, at a desk that isn't yours — and by the time you're back at the machine where your notes live, they're gone. Snackbar puts the notes somewhere both you and your assistants can reach, and lets whichever assistant is already in the conversation write them down.
It is not a Claude accessory. MCP is cross-vendor, so anything that speaks the protocol can post to it. The store is yours; the assistants are interchangeable front ends.
How it works
Phone / laptop / wherever this app Supabase
┌──────────────────────┐ ┌──────────────────┐ ┌──────────┐
│ any MCP-speaking │─────▶│ /api/mcp │─────▶│ notes │
│ assistant │ HTTP │ bearer token │ │ │
└──────────────────────┘ │ → author │ └──────────┘
└──────────────────┘
One Next.js route handler, four tools, one table. That's the whole thing.
Per-client bearer tokens double as the author field. Each client — phone, laptop, work machine — gets its own token, so the server knows who wrote a note rather than trusting a self-reported value, and a leaked token revokes one client instead of the whole store.
Notes carry two orthogonal qualifiers. category is the subject (music,
code, video…) and is a free-form string the server never rejects — new ones just
start appearing in list_categories. type is what the entry is, and is one
of idea, memory, or todo. The distinction is load-bearing: category says
which shelf, type says what eventually happens to it. A memory stays a note
forever; a todo becomes work immediately; an idea waits until it's ripe.
Tools
| Tool | What it does |
|---|---|
create_note |
Save a note. Author comes from the token, never from the caller. |
list_notes |
Newest first; filter by type, category, or unreviewed-only. |
search_notes |
Substring match over note text. |
list_categories |
Which categories exist, with counts — check before inventing one. |
Listings return one compact line per note rather than JSON, so reading the whole store costs very little context.
Setup
1. Database. Create a Supabase project, then:
supabase link --project-ref <your-project-ref>
supabase db push
2. Tokens. Generate one per client:
node -e "console.log('snk_phone_'+require('crypto').randomBytes(24).toString('base64url'))"
3. Environment. Copy .env.example to .env.local and fill in:
SUPABASE_URL—https://<project-ref>.supabase.coSUPABASE_SERVICE_ROLE_KEY— the secret key, not the publishable oneSNACKBAR_TOKENS— JSON object mapping token to author, e.g.{"snk_phone_...":"phone","snk_home_...":"home"}
Adding a client is an env var edit. There is no token table and no admin UI — at this scale that would be more moving parts than the problem deserves.
4. Run it.
npm install
npm run dev
Deploy anywhere that runs Next.js; set the same three variables there.
Connecting a client
The token can travel three ways, and the server accepts all of them:
| Channel | Use when |
|---|---|
Authorization: Bearer <token> |
the client lets you set headers |
/api/mcp?token=<token> |
it doesn't |
/api/mcp/<token> |
it also drops query strings |
Claude Code — headers work, so use them:
claude mcp add --transport http snackbar https://<your-deployment>/api/mcp \
--header "Authorization: Bearer <token>"
claude.ai (managed on desktop web, then usable on mobile) — Settings → Connectors → Add custom connector. The dialog offers a URL and optional OAuth fields, with no way to set a header, and it drops the query string — so the token has to be a path segment:
https://<your-deployment>/api/mcp/<token>
Leave both OAuth fields empty; there is no separate authentication step, because the URL is the credential.
Any other MCP client that speaks Streamable HTTP works with whichever form it can express.
A note on security
Authorization is a bearer token and nothing else — there are no users, no roles, and no sharing. Row Level Security is enabled on the table with zero policies, so the anon key can read nothing; the server holds the service role key and does its own authorization. That means the deployment is exactly as private as its tokens, and a token in a client's config is a token someone with that device can read. Rotate by editing the env var.
This is built for one person's notes. If you fork it for anything with more than one human in it, the auth model is the first thing to replace.
Status
Working, but young. Built with Claude Code as part of an ongoing experiment in working with AI as a development partner — see ai-workshop for the wider setup.
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。