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.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.