Private Journal
FreeNot checkedStores journal entries locally with semantic search using multilingual embeddings, and optionally syncs to a Git remote.
About
Stores journal entries locally with semantic search using multilingual embeddings, and optionally syncs to a Git remote.
README
An MCP server that stores journal entries in local files and searches them semantically with multilingual embeddings. Search and embedding inference run locally; the embedding model is downloaded and cached once on first use. Optionally, entries can be auto-synced to a Git remote.
Tools
write_journal- Stores an entry from
content. - Optional arg:
section(reflections,observations,project_notes,user_context,technical_insights,world_knowledge) sectiondefaults toobservations.
- Stores an entry from
search_journal- Performs semantic search over stored entries.
- Required arg:
query - Optional args:
limit,section
read_journal- Reads a full individual Markdown entry by
path.
- Reads a full individual Markdown entry by
list_journal- Lists recent entries.
- Optional args:
limit,days
Storage Locations
Journal data
Priority order:
PRIVATE_JOURNAL_PATH$XDG_DATA_HOME/private-journal~/.local/share/private-journal
Model cache
Priority order:
$XDG_CACHE_HOME/private-journal/models~/.cache/private-journal/models
The default embedding model is Xenova/multilingual-e5-small.
Install / Build
npm install
npm run build
Run locally:
node dist/index.js
The sync subcommand exits as a no-op when no Git remote is configured.
node dist/index.js sync
Install as a Plugin (recommended)
This repo is a plugin for both Claude Code (.claude-plugin/plugin.json) and Codex
(.codex-plugin/plugin.json). Installing it registers the MCP server and the
SessionStart sync hook in one step — no manual settings.json/config.toml edits.
The MCP server is declared inline in each manifest's mcpServers field (not a root
.mcp.json, which would auto-load as a project-scope server). It resolves the plugin's
own install path via ${CLAUDE_PLUGIN_ROOT} (Claude Code) / a ./bin relative path
with cwd (Codex). The bundled hooks/hooks.json resolves paths the same way.
Build first so dist/ exists, then install:
npm install && npm run build
Claude Code:
/plugin install /absolute/path/to/private-journal-mcp
Codex:
codex plugin install /absolute/path/to/private-journal-mcp
Manual MCP registration (without the plugin)
claude mcp add private-journal -- node /absolute/path/to/private-journal-mcp/dist/index.js
Git Sync (optional)
Git sync is enabled only when PRIVATE_JOURNAL_GIT_REMOTE is set.
export PRIVATE_JOURNAL_GIT_REMOTE="[email protected]:youruser/my-journal.git"
Recommended prerequisites:
- You must already be authenticated for that remote via
gh auth loginor equivalent Git credentials.
Behavior:
- Right after a
write_journalsave, it attemptscommit + pull --rebase + pushon a best-effort basis. node dist/index.js synchandlespulland pushing any pending commits before a session starts.
SessionStart sync hook
When installed as a plugin, the SessionStart sync hook is registered automatically
(see hooks/hooks.json) — nothing to configure. It exits as a no-op unless
PRIVATE_JOURNAL_GIT_REMOTE is set.
To wire it up manually instead, add to ~/.claude/settings.json:
{
"hooks": {
"SessionStart": [
{
"hooks": [
{
"type": "command",
"command": "node /absolute/path/to/private-journal-mcp/dist/index.js sync"
}
]
}
]
}
}
Conflict Handling
- Distinct entries mostly coexist automatically because filenames include a microsecond suffix.
- When two entries share a filename, the one with the larger frontmatter
timestampwins. - If the
timestampis identical, the local version takes precedence. - The
.embeddingfile may be regenerated based on the adopted Markdown.
Installing Private Journal
This server has no published package — it is built from source. Open the repository and follow its README.
▸ github.com/baleen37/private-journal-mcpFAQ
Is Private Journal MCP free?
Yes, Private Journal MCP is free — one-click install via Unyly at no cost.
Does Private Journal need an API key?
No, Private Journal runs without API keys or environment variables.
Is Private Journal hosted or self-hosted?
Self-hosted: the server runs locally on your machine via the install command above.
How do I install Private Journal in Claude Desktop, Claude Code or Cursor?
Open Private Journal on unyly.org, pick your client tab (Claude Desktop, Claude Code, Cursor) and press Install — the config is generated automatically, no JSON editing.
Related MCPs
GitHub
PRs, issues, code search, CI status
by GitHubFilesystem
Secure file operations with configurable access controls.
Memory
Knowledge graph-based persistent memory system.
Template MCP Server
A CLI tool to create a new Model Context Protocol server project with TypeScript support, dual transport options, and an extensible structure
by mcpdotdirectCompare Private Journal with
Not sure what to pick?
Find your stack in 60 seconds
Author?
Embed badge for your README
Browse similar
All development MCPs
