No description
- JavaScript 80.3%
- TypeScript 19.7%
| examples | ||
| servers | ||
| skills | ||
| .gitignore | ||
| .gitmodules | ||
| README.md | ||
MCP Servers + Skills (Direct-Use)
Centrally maintained MCP server installations and a shared skills library. Clients (Cursor, OpenCode, Gemini-CLI) consume these directly via stdio — no proxy hub.
Layout
~/ai/mcp/
├── servers/ -- built MCP server installations
│ ├── filesystem/ (npm: @modelcontextprotocol/server-filesystem)
│ ├── obsidian-context-server/ (project context, ADRs, FSDs, tasks)
│ ├── obsidian-notes-server/ (note CRUD, plans)
│ ├── obsidian-portfolio-server/ (portfolio generation)
│ ├── obsidian-mcp-server/ (REST API based, cyanheads)
│ └── skills-server/ (exposes skills/ as MCP tools/prompts)
├── skills/ -- SKILL.md library
│ ├── shared/ (used by every profile)
│ ├── coding/ (coding profiles only)
│ ├── private/ (private profile only)
│ └── work/ (work profiles only)
└── examples/ -- copy-paste configs per (client × profile)
├── README.md
├── cursor-private.json
├── cursor-coding-home.json
├── opencode-private.json
├── opencode-coding-home.json
├── gemini-private.json
└── gemini-coding-home.json
How to use
- Need MCP support in a vault or repo? Pick the right
examples/<client>-<profile>.json. - Copy it to the location your client expects:
- Cursor →
<repo>/.cursor/mcp.json - OpenCode →
<repo>/opencode.json - Gemini-CLI →
<repo>/.gemini/settings.json
- Cursor →
- Restart the client. Done.
See examples/README.md for the full mapping table.
Profiles
- private — homevault context (personal vault, recipes, journaling, portfolio).
- coding-home — personal code projects with vault read-access for project notes.
(Pharma is intentionally not represented here — it has its own self-contained
.cursor/ setup in ~/pharma/pharma/.cursor/ and is not migrated.)
Why direct-use, no proxy hub?
Earlier this repo ran mcp-proxy-hub as a systemd service per profile.
Removed because:
- Upstream had a Node-incompat bug (
unix_dgramsocket type) innotifySystemdthat crashed wheneverWatchdogSectriggered. - A trailing comma in one profile JSON caused 5610 silent restart-loops with no observability.
- Single point of failure: one bug in the hub took down all profiles.
Direct stdio per client means more duplication across config files, but no daemon to manage, no proxy bug surface, and JSON errors surface immediately with a useful error in the client. The trade-off favors robustness over DRY.
Adding a new MCP server
- Install/build it under
servers/<server-name>/. - Add it to whichever
examples/*.jsonfiles should expose it. - Add it as a
--available-serverflag to those examples'skillsentries so capability-aware skill filtering works. - Validate the JSON:
python3 -c "import json; json.load(open('examples/<file>.json'))"
Adding a new skill
- Create
skills/<profile-dir>/<skill-name>/SKILL.md. - Set
tools_requiredin the frontmatter to list the MCP servers the skill needs. - The skill becomes available in any profile whose example has both
the matching
--skills-dirand the required--available-serverflags.