ideavault-mcp
Allows fetching documentation pages from docs.rs for Rust crates via a scoped web-fetch tool.
Allows searching public GitHub code repositories for reference implementations.
Turns project folders into an Obsidian-compatible vault of ideas, providing tools to create, update, search, and list notes with structured metadata.
Allows looking up Python package metadata from PyPI by exact package name, and fetching documentation pages from pypi.org.
Provides tools to query Solana blockchain data, including on-chain mint information (supply, decimals, authorities) and token prices via Jupiter.
Enables retrieving public information about a Telegram bot using its token, with the token never leaving the server.
Click on "Install 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., "@ideavault-mcpShow me all my in-progress ideas"
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.
ideavault-mcp
A personal MCP server that turns this machine's project folders into an Obsidian vault of ideas, with a few scoped external-research tools and a structural code-graph alongside it. One Express endpoint, no upstream LLM calls from the server itself — Claude (via Claude Code, Claude.ai, or the Claude mobile app) reads and writes the vault and calls these external services directly through the tools.
Vault lives at ~/ideavault/Projects/*.md — open that folder directly in Obsidian.
Architecture note: the code-graph tools aren't implemented here — they're
codebase-memory (a Python/SQLite/tree-sitter engine, its
own repo history preserved via git subtree when it was folded in here)
spawned as a persistent child process at startup and proxied in over
MCP's stdio client transport (src/codebaseMemory.ts). One external MCP
surface, one systemd service, one auth boundary — but two independent engines
behind it, so neither codebase had to be rewritten in the other's language to
merge them. If the child process connection drops, the whole server exits
(process.exit(1)) rather than silently running vault-only, so systemd's
Restart=on-failure brings both back up together instead of masking a real
crash. Don't also run codebase-memory as its own separate stdio MCP server
(e.g. via claude mcp add) alongside this — both would open the same SQLite
DB file concurrently, which risks lock contention.
Tools
Vault (repos + notes)
Tool | What it does |
| Scans |
| Lists files/folders inside a repo so Claude can decide what to read before writing a note. Skips node_modules/.git/etc and secret-looking files |
| Reads a text file's contents (README, source, config) from inside a repo. Refuses binaries and anything matching a secret/key-file pattern. Capped at 200KB |
| Creates/overwrites a file inside a repo. If the repo has no |
| Precise search-replace on an existing file — |
| Reads one repo's note (frontmatter + body) |
| Creates/updates a note — status, tags, blockers, next_steps, body. Omitted fields keep their old value |
| Appends a dated line to a note's |
| Lists all notes, filterable by |
| Full-text search across the vault |
Note frontmatter: repo, status (idea/in-progress/blocked/done/abandoned), tags[], blockers[], next_steps[], created, updated.
External research (scoped, not a general web-fetch tool)
Tool | What it does | Needs |
| On-chain mint info (supply, decimals, authorities) via public RPC | nothing |
| Price/liquidity via Jupiter's price API (v3) | nothing |
| crates.io fuzzy search, or PyPI exact-name lookup (no public PyPI search API exists) | nothing |
| Search public GitHub code for reference implementations |
|
| A bot's public info via Telegram's |
|
| Fetches page text, restricted to an allowlist: docs.rs, pypi.org, solana.com, jup.ag, github.com, raw.githubusercontent.com, telegram.org | nothing |
Code graph (proxied from codebase-memory, read the architecture note above)
Tool | What it does |
| Index (or re-index) a local repo into the graph via tree-sitter — call once per project before the others |
| List every indexed project with file/symbol counts |
| Find functions/methods/classes by name substring |
| One call for "show me this function and what touches it" — source + callers + callees |
| Just one function's source by qualified name, without reading the whole file |
| Walk the call graph around a symbol (callers/callees/both, 1-10 hops) |
| Language breakdown, symbol counts, top folders, hotspot files — orient in an unfamiliar repo |
| Map uncommitted git changes to the symbols they touched, plus a rough blast-radius (caller count) |
6 languages: C#, Python, JS, TS/TSX, Rust, Go. project is optional on every
query tool except index_repository — omit it and the last project named
anywhere on this server is reused. Note this "last project" state now lives
in the one shared codebase-memory child process behind this HTTP server
rather than a stdio process per Claude Code session (its original design) —
fine for one person using one project at a time, but a second concurrent
caller working on a different repo will get the first caller's active
project if it omits project too. Pass project explicitly to avoid
relying on this. See codebase-memory's own docstring (server.py) for the
full scope/limitations (name-based call resolution, no type inference, no
cross-repo graph).
Related MCP server: Vault MCP Server
Graph UI
A small visual dashboard for the code graph, served by this same process —
open https://ideavault.app-me.online/ (or http://127.0.0.1:3007/ locally)
in a browser instead of going through chat. Source in web/ (Vite + React +
TypeScript + Tailwind + Cytoscape.js), built to static files and served via
express.static.
Dashboard —
get_architectureas language/symbol-kind charts, top folders, hotspot files.Search —
search_symbols, click a result to open it in Graph view.Graph —
trace_callsrendered as an actual node/edge graph (callers, callees, or both; depth 1-4), with the selected symbol's source (get_code_snippet) alongside it.Changes —
detect_changes: uncommitted edits mapped to the symbols they touched, with the existing caller-count risk heuristic.
It talks to a handful of new read-only JSON routes under /api/graph/*
(src/graphApi.ts) that wrap the same proxied codebase-memory tool calls the
MCP surface uses — no second engine, no direct SQLite access from the UI.
Those routes sit behind the same rateLimit → validateOrigin →
requireToken chain as /mcp. The static page itself is unauthenticated
(it's just HTML/JS/CSS); on first load it prompts for AUTH_TOKEN and stores
it in localStorage, sending it as Authorization: Bearer on every API
call — same token as everywhere else, no second credential.
Local dev
npm install
cp .env.example .env # edit AUTH_TOKEN at minimum
npm run build && npm start
# or: npm run dev (tsx watch, no build step — but the UI needs its own build below)npm run build builds both the server and the web UI (build:web runs
npm --prefix web run build, needs cd web && npm install once first). For
UI-only iteration with hot reload: cd web && npm install && npm run dev —
its dev server proxies /api to 127.0.0.1:3007, so run the main server
(npm run dev at the repo root) alongside it.
Smoke test:
curl http://127.0.0.1:3007/health
curl -X POST http://127.0.0.1:3007/mcp \
-H "Content-Type: application/json" -H "Accept: application/json, text/event-stream" \
-H "Authorization: Bearer $AUTH_TOKEN" \
-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Deploy (this machine, following the existing app-me.online pattern)
Port 3007 is used here since 3000-3003/3005/3006 are already taken by
app1-4/sift/muse (see ../NGINX.md).
npm run buildFill in
.env(realAUTH_TOKEN— generate withopenssl rand -hex 32)Install the systemd unit:
sudo cp deploy/ideavault-mcp.service /etc/systemd/system/ sudo systemctl daemon-reload sudo systemctl enable --now ideavault-mcpAdd the nginx server block (
deploy/nginx-ideavault.conf) next to your otherapp-me.onlineblocks, thencertbot --nginx -d ideavault.app-me.online.
Status: already deployed. Live at https://ideavault.app-me.online, systemd
service running, DNS auto-synced by the existing namecheap-ddns timer (it
discovers hosts straight from nginx server_name directives — no config
changes needed there), cert auto-renews via certbot's timer.
Connect Claude to it
Claude Code (this machine or any other):
claude mcp add --transport http ideavault https://ideavault.app-me.online/mcp \
--header "Authorization: Bearer <your AUTH_TOKEN>"Claude Desktop / Claude.ai / Claude mobile app: custom connector URL entry (Settings → Connectors → Add custom connector) only showed up on claude.ai in a browser, not in the native mobile app UI — add it there and it syncs to mobile since connectors are account-level. The connector UI has no field for a static bearer header, so the token goes in the URL instead:
https://ideavault.app-me.online/mcp?token=<your AUTH_TOKEN>The server checks Authorization: Bearer, X-Vault-Token, and ?token= —
whichever the client can send. Once added, it still needs to be toggled on
per-conversation from the tools/connectors icon in the chat composer.
Security notes (personal-use tradeoffs, read before exposing to the internet)
Auth is a single static shared secret, not OAuth. Fine for a personal tool used by one person, but anyone who gets the token gets full read/write on your vault and every repo's code (write_repo_file/edit_repo_file are not read-only). Treat the token like a password — this is the highest-stakes tool on the connector.
write_repo_file/edit_repo_filenever rungit commit/git pushfor the actual change — only a one-time snapshot commit if a repo had no.gitat all, to guarantee an undo path. Everything after that is a plain working-tree edit: review withgit diff/git statusand commit yourself. Repos that already had uncommitted changes before an edit get flagged (hadPriorChanges) rather than silently folded in.POST /mcpis rate-limited to 60 req/min per client IP (src/rateLimit.ts, in-memory fixed window). Express is set totrust proxy: loopbackso this keys on the real client IP from nginx'sX-Forwarded-For, not nginx's own loopback address for every request.The nginx site (
deploy/nginx-ideavault.conf) hasaccess_log off— the token travels as?token=...for clients with no header field, and nginx's default log format would otherwise write that in plaintext to/var/log/nginx/access.logon every request.The systemd unit (
deploy/ideavault-mcp.service) drops all Linux capabilities and blocks kernel/namespace/cgroup access (NoNewPrivileges,ProtectKernelTunables,RestrictNamespaces, etc.) — standard hardening for a plain Node HTTP server, shrinks what a hypothetical RCE (e.g. a compromised npm dependency) could reach. Filesystem sandboxing (ProtectHome/ProtectSystem) is deliberately not used since the app's whole job is read/write across the home directory.If you want more isolation than "public subdomain + secret token," put this behind Tailscale instead of the public nginx route and skip the token entirely — probably the better long-term answer for a homelab tool like this.
Originheader is checked againstALLOWED_ORIGINS(defaulthttps://claude.ai) only when the header is present — non-browser clients (curl, Claude Code) don't send one, so they're unaffected.Rotate
AUTH_TOKEN(openssl rand -hex 32, update.env,sudo systemctl restart ideavault-mcp) any time it's been displayed somewhere it shouldn't live long-term — e.g. pasted into a chat transcript.read_repo_file/list_repo_filesrefuse dotfiles,.env*,*.pem/*.key,id_rsa/id_ed25519, and filenames that look like secrets/credentials/wallet keypairs (several of these repos hold Solana keypairs as plain JSON). It's a filename-pattern blocklist, not content scanning — good enough for a personal tool, not a substitute for actually keeping keys out of these directories.The Graph UI stores
AUTH_TOKENin the browser'slocalStorageafter you enter it once — same token as everywhere else, so anyone with it still has full read/write, not just graph-read access./api/graph/*is read-only, but the token itself isn't scoped down for the browser. Fine on a device you trust; don't paste the token into that prompt on a shared machine.
Roadmap ideas (not built yet)
Bulk-seed notes for every repo in
list_reposthat hashasNote: falseA
build-mcp-appwidget for browsing/filtering ideas visually in chatSwap the static token for OAuth (CIMD) if this ever needs to support more than one person
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- Flicense-qualityDmaintenanceA local MCP server that wraps the Obsidian CLI to give AI assistants direct access to read, edit, and manage notes within an Obsidian vault. It enables advanced operations such as frontmatter property management, context-aware searching, and the execution of internal Obsidian commands.2
- Flicense-qualityCmaintenanceBuilt on Obsidian Vault, this MCP server integrates with Claude Code to provide personal knowledge management including note saving, full-text search, code graph extraction, and context resumption.1
- Alicense-qualityBmaintenanceAn MCP server that provides controlled read/write tools for managing local-first research memory in an Obsidian vault, enabling AI agents to maintain project context across sessions.71MIT
- Alicense-qualityDmaintenanceA lightweight MCP server that enables AI assistants to securely read, create, and modify notes in an Obsidian vault, with support for semantic search and web scraping.6,104MIT
Related MCP Connectors
An MCP server that gives your AI access to the source code and docs of all public github repos
Person-owned, portable AI memory as a remote MCP server, readable and writable by any MCP client.
User-owned memory for AI agents, Copilot, Claude, IDEs, CLIs, and chat apps over remote MCP.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/Mephistopheles9631/ideavault-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server