eno-mcp — MCP stdio server exposing the vault's read tools to coding agents
Project description
eno-mcp
MCP stdio server exposing eno's read + write tools to coding agents and autonomous agents (Claude Code, Cursor, anything that speaks MCP). It gives an MCP client a structural view of an Obsidian vault; the intelligence is the calling agent — no model setup of eno's own required.
Install
pip install eno-mcp
Requires Python 3.12+. Pulls in the enowiki core (which imports as eno).
The server exposes the tools over stdio; you wire it into your agent's MCP
config (below).
Tools
Read:
eno_search— find notes by title or tageno_note— frontmatter + headings + ~400-char excerpt for one noteeno_neighbors— backlinks + outbound for one noteeno_orphans— notes with no inbound links (resurfacing)eno_stubs— short notes with no outbound linkseno_stale— notes past a recency thresholdeno_frontier— pages actively reaching outward (high out-degree, low in-degree, recent)eno_hot— session-start "what's hot" bundle (frontier + recent + concepts + your recent notes)eno_broken_links— raw broken wikilinks (use eno_concepts / eno_drift instead for classified output)eno_concepts— incipient wikilinks (groundwork for not-yet-written notes)eno_drift— drift candidates (almost-matches, real bugs)eno_tiling— body-content semantic dedup (needs the core'senowiki[llm]extra)eno_hygiene— frontmatter contract violationseno_health— diagnostic
Write:
eno_create_note— create a note; frontmatter auto-populated withorigin: llm+author: '[[X]]'eno_append_to_note— append content, optionally under a specific heading
Wiring it into an MCP agent
Many autonomous agents load MCP servers natively. Two pieces:
1. Onboarding skill. Drop the agent brief into a place the agent
loads from at startup (skill directory, system prompt path, etc.). The
brief ships in this repo at
skills/agent-onboarding.md.
# Whichever of these matches your agent's setup:
cp skills/agent-onboarding.md \
~/.config/my-agent/skills/
# or, if you sync skills via the vault:
cp skills/agent-onboarding.md \
/path/to/vault/.eno/skills/
The onboarding brief covers the postures (resurfacing > collecting, incipient links are intentional, two-phase reads), the tool inventory, and common patterns. Self-contained. Read it yourself before deploying — it's the contract the agent will operate under.
2. MCP config. Add eno-mcp to the agent's MCP config — typically
~/.config/my-agent/mcp.json or whatever your install expects. If you
installed with pip install eno-mcp, the command is simply eno-mcp
(with "args": []); the examples below use uv run --directory for
running against a source checkout.
{
"mcpServers": {
"eno": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/eno",
"eno-mcp"
],
"env": {
"ENO_VAULT_DIR": "/path/to/vault",
"ENO_AGENT_NAME": "Weaver"
}
}
}
}
Or, if you prefer the agent to talk to a long-running eno-serve daemon
on a shared host (so multiple agents share one index):
{
"mcpServers": {
"eno": {
"command": "uv",
"args": ["run", "--directory", "/path/to/eno", "eno-mcp"],
"env": {
"ENO_SERVICE_URL": "http://your-host:7891",
"ENO_AGENT_NAME": "Weaver"
}
}
}
}
ENO_AGENT_NAME=Weaver is what makes new notes get
author: '[[Weaver]]' automatically — the AGENTS.md convention that
keeps provenance legible without per-call ceremony.
Wiring it into other agents
Claude Code (project-level): the repo's own .mcp.json already wires
this for sessions opened inside /eno. To get it in every Claude Code
session, copy that snippet into ~/.claude/.mcp.json.
Other MCP-compatible agents (Cursor, openclaw, custom): same shape —
spawn eno-mcp over stdio with the env vars above.
Backend choice
The server picks a backend at runtime:
$ENO_SERVICE_URLset → ServiceBackend (HTTP to a runningeno-serve)- otherwise → LocalBackend (direct sqlite at
$ENO_VAULT_DIR/.eno/index.db)
Single-host work: omit ENO_SERVICE_URL, set ENO_VAULT_DIR. Multi-host
fleet: run eno-serve on a shared host and point all workstation agents at
it via ENO_SERVICE_URL.
Two postures encoded in the tool docstrings
Every tool's docstring is the description an agent sees. Two postures are deliberately repeated across tools and worth keeping in mind when extending:
- Resurfacing > collecting. Orphans, stale notes, and concept candidates are framed as opportunities, not errors. Tools never tell the agent to "fix" or "clean up" these.
- Incipient links are intentional.
eno_broken_linksreturns raw data;eno_conceptsseparates intentional groundwork from drift. Agents must never describe concepts as broken-link bugs.
If you add a tool that touches link integrity or vault structure, match this framing.
License
MIT — see LICENSE.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file eno_mcp-0.2.0.tar.gz.
File metadata
- Download URL: eno_mcp-0.2.0.tar.gz
- Upload date:
- Size: 17.1 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5265429f5a2b7e9f877f3f636b36457269f10cfe78edf297dd36b2f326922c71
|
|
| MD5 |
0d47410e47081e6374a0907e53a93167
|
|
| BLAKE2b-256 |
37802600d94ed7759c793a8f2c66467716120dbb663be44c2e9d9b353af73ba7
|
Provenance
The following attestation bundles were made for eno_mcp-0.2.0.tar.gz:
Publisher:
publish.yml on lavallee/eno
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eno_mcp-0.2.0.tar.gz -
Subject digest:
5265429f5a2b7e9f877f3f636b36457269f10cfe78edf297dd36b2f326922c71 - Sigstore transparency entry: 2188252608
- Sigstore integration time:
-
Permalink:
lavallee/eno@420b6c01ec988fd1874e6a3155ac4467a138b2f7 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/lavallee
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@420b6c01ec988fd1874e6a3155ac4467a138b2f7 -
Trigger Event:
release
-
Statement type:
File details
Details for the file eno_mcp-0.2.0-py3-none-any.whl.
File metadata
- Download URL: eno_mcp-0.2.0-py3-none-any.whl
- Upload date:
- Size: 12.2 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.13
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
4d380a79a7723b715718c0a5c48a3cde63982820d03f5931bf84dbea2d588c74
|
|
| MD5 |
e33af8ab01af75a0033e682974e0916b
|
|
| BLAKE2b-256 |
f044aefe3811e59d4f0b24da42634fd6cdc3ed03bafcd3288e7b34a1a1928a6d
|
Provenance
The following attestation bundles were made for eno_mcp-0.2.0-py3-none-any.whl:
Publisher:
publish.yml on lavallee/eno
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
eno_mcp-0.2.0-py3-none-any.whl -
Subject digest:
4d380a79a7723b715718c0a5c48a3cde63982820d03f5931bf84dbea2d588c74 - Sigstore transparency entry: 2188252616
- Sigstore integration time:
-
Permalink:
lavallee/eno@420b6c01ec988fd1874e6a3155ac4467a138b2f7 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/lavallee
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@420b6c01ec988fd1874e6a3155ac4467a138b2f7 -
Trigger Event:
release
-
Statement type: