MCP server
Tuval hands a board to an agent as a brief. This is the other direction: the agent goes and looks.
Obsidian works as a second brain for agents because the notes are files an agent can open. Ours are rows in a database, so this is the door. It speaks MCP over stdin and stdout, which is what Claude Code and Cursor mount.
Setup
claude mcp add tuval -- node /path/to/tuval/scripts/mcp.mjs
It needs a key from Settings → API and webhooks, in the environment or in .env.local:
TUVAL_API_KEY=tuv_...
TUVAL_API_URL=https://<project>.supabase.co/functions/v1/api # optional
Without TUVAL_API_URL it is derived from VITE_SUPABASE_URL, so a checkout that already runs
the app needs one line.
The key carries the same limits as the HTTP API: team plan, or a self_hosted
install.
Tools
| Tool | What it does |
|---|---|
search |
Words in titles and bodies across pages, databases, issues and projects. Returns an excerpt and the id to read in full |
read_page |
One page or issue as Markdown, headings and lists intact |
list_records |
Records of one kind, filtered by status, assignee, project or cycle |
workspace |
What this key can reach |
Read-only on purpose. An agent that can read the workspace is useful on the first day; an agent that can rewrite it needs a conversation about undo first.
Checking it works
echo '{"jsonrpc":"2.0","id":1,"method":"tools/list"}' | node scripts/mcp.mjs
Four tools come back. If the key is missing or the plan has the API off, tools/call answers with
the reason as text rather than a transport error, so the model can read it and decide what to do.