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.
Metadata
Release files for eno-mcp 0.3.0
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| eno_mcp-0.3.0.tar.gz | 17.8 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| eno_mcp-0.3.0-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 30.2 kB
Release files / eno_mcp-0.3.0.tar.gz
| Download URL | eno_mcp-0.3.0.tar.gz |
|---|---|
| Size | 17.8 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
802f0fbb323218c7864382a5b868de4391940e7ca869b65a0f7eb4a245f6c2e1
|
|
BLAKE2b-256 checksum How to use checksums |
85ad935acbfefd50454a6011a8f2b3bbe342b8b663da83e9804e0034c40b5bc9
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.
Transparency logRelease files / eno_mcp-0.3.0-py3-none-any.whl
| Download URL | eno_mcp-0.3.0-py3-none-any.whl |
|---|---|
| Size | 12.4 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
4f1056d064c49228470b709323dbbe74893c32913521b3bb31b184ec954faeec
|
|
BLAKE2b-256 checksum How to use checksums |
c040a9fe7ab3353ab84ae77e7712c81976bdbba51c4833ab183dcece4c164838
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
Yes |
| Uploaded via |
twine/6.1.0 CPython/3.13.13
|
Provenance
Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.
PyPI Publish Attestation
PyPI verified that this artifact, at this checksum, originated from the publisher listed below.
Signed by GitHub Actions, verified by PyPI on Jul 28, 2026.
Transparency log