Command Palette

Search for a command to run...

UnylyUnyly
Browse all

Private Journal

FreeNot checked

Stores journal entries locally with semantic search using multilingual embeddings, and optionally syncs to a Git remote.

GitHubEmbed

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)
    • section defaults to observations.
  • 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.
  • list_journal
    • Lists recent entries.
    • Optional args: limit, days

Storage Locations

Journal data

Priority order:

  1. PRIVATE_JOURNAL_PATH
  2. $XDG_DATA_HOME/private-journal
  3. ~/.local/share/private-journal

Model cache

Priority order:

  1. $XDG_CACHE_HOME/private-journal/models
  2. ~/.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 login or equivalent Git credentials.

Behavior:

  • Right after a write_journal save, it attempts commit + pull --rebase + push on a best-effort basis.
  • node dist/index.js sync handles pull and 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 timestamp wins.
  • If the timestamp is identical, the local version takes precedence.
  • The .embedding file may be regenerated based on the adopted Markdown.

from github.com/baleen37/private-journal-mcp

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-mcp

FAQ

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

Compare 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