Skip to main content

A Model Context Protocol server for personal journaling with context awareness

Project description

๐Ÿ› ๏ธ Memory Journal MCP Server

  • Last Updated September 24, 2025 12:47 AM EST *

GitHub License Version Docker Pulls

A developer's project journal and context manager

๐Ÿš€ Docker Deployment:

  • Docker Hub - Alpine-based (225MB) with full semantic search

โšก Auto-Deployed: All versions automatically built and pushed on every commit - always up-to-date!

๐Ÿ“‹ Docker MCP Registry: Submitted to Docker's official MCP catalog for inclusion in Docker Desktop's MCP Toolkit

A MCP server built for developers enabling Git based project management with project and personal journaling. Think of it as a scrapbook for your projectsโ€” one that captures technical details, GitHub issues, code context, and the personal threads that shape a project's story.

Whether you're tracking a feature sprint, logging a bug hunt, planning strategy, or leaving behind breadcrumbs for future-you (or your team), this system gives you a structured but flexible way to journal your dev work.


๐Ÿ“‹ Table of Contents

Overview & Features

Getting Started

Technical Documentation

Project Information



โœจ Features

Why Memory Journal? (The Benefits)

  • Project context on tap โ†’ Git, GitHub issues, branch, commit, and working directory are auto-captured.
  • Journaling tuned for dev work โ†’ Specialized entry types like technical_achievement, milestone, and development_note.
  • Productivity & organization โ†’ Powerful search, tags, significance markers, and relationship mapping.
  • Performance reviews & retros โ†’ Chart your progress and revisit major breakthroughs with ease.
  • Scrapbook of the process โ†’ Capture not only what you built but how it felt building it.
  • Team continuity โ†’ Leave clear breadcrumbs for future-you and your teammates.

Core Capabilities

  • 7 MCP Tools: Entry creation, search, semantic search, context bundle retrieval, and more.
  • Git & GitHub Integration: Automatically captures commits, branches, and recent issues.
  • Dual Search: High-performance full-text search (SQLite FTS5) with result highlighting, plus optional semantic/vector search (FAISS).
  • Relationship Mapping: Link related entries with typed relationships like implements, references, and clarifies.
  • Significance Classification: Flag breakthroughs, milestones, and project completions for easy retrieval.
  • Context Bundles: On-demand capture of the complete project state.
  • Async Operations: Non-blocking Git operations with aggressive timeouts to ensure server responsiveness.

Developer-Friendly Design

  • Zero Friction: No authentication, API keys, or external rate limits to worry about.
  • Secure & Private: Local-first architecture where you own your data. Hardened with input validation, WAL mode, and non-root Docker containers.
  • Portable: Your entire journal, including tags and relationships, is a single SQLite .db file.
  • Context-Aware: The server automatically captures the project state without any manual input.
  • Extensible: Designed to support future capabilities like graph visualization and team-based features.
  • Performant & Resilient: Utilizes a thread pool for blocking operations, fail-fast timeouts, and comprehensive error handling.

โฌ†๏ธ Back to Table of Contents


๐Ÿš€ Installation & Deployment

Choose the option that best fits your workflow.

Option 1: PyPI Package (Simple)

The fastest way to get started. Install directly from PyPI and run locally.

1. Install the Package

pip install memory-journal-mcp

2. Configure Your MCP Client Add the server to your ~/.cursor/mcp.json file:

{
  "mcpServers": {
    "memory-journal": {
      "command": "memory-journal-mcp"
    }
  }
}

3. Restart Your Client Restart Cursor or your MCP client, and you're ready to start journaling!

Option 2: Docker (Recommended for Full Features)

The simplest way to run the full-featured server locally. This single, optimized image includes all dependencies for semantic search.

1. Pull the Image

docker pull writenotenow/memory-journal-mcp:latest

๐Ÿ›ก๏ธ Supply Chain Security

For enhanced security and reproducible builds, use SHA-pinned images:

Find available SHA tags at: https://hub.docker.com/r/writenotenow/memory-journal-mcp/tags Look for tags starting with "sha256-" for cryptographically verified builds

Option 1: Multi-arch manifest digest (recommended)

docker pull writenotenow/memory-journal-mcp:sha256-<manifest-digest>

Option 2: Direct manifest digest (maximum security)

docker pull writenotenow/memory-journal-mcp@sha256:<manifest-digest>

How to Find SHA Tags:

  1. Visit Docker Hub Tags
  2. For convenience: Use sha256-<hash> tags (manifest digests, multi-arch safe)
  3. For maximum security: Use @sha256:<hash> direct digest references

Understanding SHA Tags:

  • ๐Ÿ”’ sha256-<manifest-digest> - Multi-arch manifest digest (works on all architectures)
  • ๐ŸŽฏ @sha256:<manifest-digest> - Direct digest reference (immutable, cryptographically verified)
  • โš ๏ธ Architecture-specific digests - Only for debugging specific architectures

Security Features:

  • โœ… Build Provenance - Cryptographic proof of build process
  • โœ… SBOM Available - Complete software bill of materials
  • โœ… Supply Chain Attestations - Verifiable build integrity
  • โœ… Reproducible Builds - Exact image verification for compliance

2. Create a Data Directory This directory will persist your SQLite database on your host machine.

mkdir data

3. Configure Your MCP Client Add the server to your ~/.cursor/mcp.json file:

{
  "mcpServers": {
    "memory-journal": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "-v", "./data:/app/data", "writenotenow/memory-journal-mcp:latest", "python", "src/server.py"]
    }
  }
}

4. Restart Your Client Restart Cursor or your MCP client, and you're ready to start journaling!

Docker Image Details

Tag Size Features Best For
:latest 225MB Complete feature set: journaling, FTS5 search, semantic search, Git context, PyTorch ML All users - secure Alpine base with full capabilities
  • Security: Minimal attack surface with Alpine Linux.
  • Performance: Optimized 225MB image size with full ML capabilities.
  • Simplicity: One image covers all use cases.

Automated Deployment

Docker images are automatically built and deployed from main on every commit, ensuring you always have the latest version.

  • Always Fresh: Images are available on Docker Hub within 5-10 minutes of a code change.
  • Security Scanned: Every image is automatically scanned for vulnerabilities.
  • Quality Tested: Images are tested before deployment.

Option 3: Advanced Local Setup

Build from Source:

  1. Clone the repository:
git clone <repo-url>
  1. Navigate to directory:
cd memory-journal-mcp
  1. Build Docker image:
docker build -f Dockerfile -t memory-journal-mcp-local .
  1. Add to MCP config (use local image name):
{
  "mcpServers": {
    "memory-journal": {
      "command": "docker",
      "args": ["run", "--rm", "-i", "-v", "./data:/app/data", "memory-journal-mcp-local", "python", "src/server.py"]
    }
  }
}

Manual Installation:

  1. Clone the repository:
git clone <repo-url>
  1. Navigate to directory:
cd memory-journal-mcp
  1. Install dependencies (Python 3.10+):
pip install -r requirements.txt
  1. Optional: Install semantic search dependencies:
pip install sentence-transformers faiss-cpu
  1. Add to MCP config:
{
  "mcpServers": {
    "memory-journal": {
      "command": "python",
      "args": ["path/to/memory-journal-mcp/src/server.py"]
    }
  }
}

โฌ†๏ธ Back to Table of Contents


๐Ÿ“ Usage Examples

Creating Entries

Log a Technical Achievement:

create_entry({
  content: "Successfully implemented async Git operations with fail-fast timeouts, resolving the MCP server hanging issue.",
  entry_type: "technical_achievement",
  tags: ["git", "async", "performance", "debugging"],
  significance_type: "technical_breakthrough",
  auto_context: true // Captures Git repo, branch, commit info
})

Capture a Personal Reflection:

create_entry({
  content: "Today I reflected on new patterns in my thinking...",
  is_personal: true,
  entry_type: "personal_reflection",
  tags: ["consciousness", "growth", "reflection"]
})

Searching Entries

Full-Text Search with Highlighting:

search_entries({
  query: "async Git timeout",
  limit: 5
})
// Returns: "Testing **async** **Git** operations with aggressive timeouts..."

Semantic Search for Concepts:

semantic_search({
  query: "performance optimization challenges",
  limit: 3
})

Filter by Type or Recency:

search_entries({ is_personal: false, limit: 10 }) // Technical entries only
get_recent_entries({ limit: 5 }) // Most recent 5 entries

Tag Management

list_tags() // Shows all tags with usage counts

โฌ†๏ธ Back to Table of Contents


๐Ÿ—๏ธ Architecture

โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”
โ”‚ MCP Server Layer (Async/Await)                              โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚ Entry Creation  โ”‚  โ”‚ FTS5 Search     โ”‚  โ”‚ Resource    โ”‚  โ”‚
โ”‚  โ”‚ with Context    โ”‚  โ”‚ with Highlight  โ”‚  โ”‚ Management  โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ Thread Pool Execution Layer                                 โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”  โ”‚
โ”‚  โ”‚ Git Operations  โ”‚  โ”‚ Database Ops    โ”‚  โ”‚ Tag Creationโ”‚  โ”‚
โ”‚  โ”‚ (2s timeout)    โ”‚  โ”‚ with Commit     โ”‚  โ”‚ Auto-Mgmt   โ”‚  โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜  โ”‚
โ”œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”ค
โ”‚ SQLite Database with FTS5                                   โ”‚
โ”‚  โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”โ”‚
โ”‚  โ”‚ entries + tags + relationships + significance + FTS     โ”‚โ”‚
โ”‚  โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜โ”‚
โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜

โฌ†๏ธ Back to Table of Contents


๐Ÿ› ๏ธ Tools Available (Programmatic API)

Core Tools

create_entry - Create Journal Entries

Parameters:

  • content (required): The journal entry content.
  • entry_type (optional): personal_reflection, technical_achievement, etc.
  • is_personal (optional): Boolean to separate personal vs project entries.
  • significance_type (optional): Mark as significant (milestone, technical_breakthrough).
  • tags (optional): Array of string tags.

search_entries - Full-Text Search

Parameters:

  • query (required): Search terms.
  • limit (optional): Max results (default: 10).

semantic_search - Vector Similarity Search

Parameters:

  • query (required): Search query for semantic similarity.
  • limit (optional): Max results (default: 10).
  • similarity_threshold (optional): Minimum score 0.0-1.0 (default: 0.3).

get_recent_entries - Retrieve Recent Entries

Parameters:

  • limit (optional): Number of entries (default: 5).

list_tags - Show All Tags

Returns all tags with usage statistics.

Diagnostic Tools

  • test_simple: Basic connectivity test.
  • create_entry_minimal: Minimal entry creation for debugging.

โฌ†๏ธ Back to Table of Contents


๐ŸŽฏ MCP Prompts (User-Initiated)

The server provides interactive prompts accessible through your MCP client's prompt palette (e.g., / in Cursor).

get-context-bundle

Get the current project context as structured JSON.

Arguments:

  • include_git (optional, default: true): Include Git repository information.

Sample Output:

{
  "repo_name": "memory-journal-mcp",
  "repo_path": "C:\\Users\\chris\\Desktop\\memory-journal-mcp", 
  "branch": "main",
  "last_commit": { "hash": "5ee4651", "message": "Update memory journal readme" },
  "github_issues": {
    "count": 2,
    "recent_issues": [
      { "number": 15, "title": "Add GitHub issue context...", "state": "OPEN" }
    ]
  },
  "cwd": "C:\\Users\\chris\\Desktop\\memory-journal-mcp",
  "timestamp": "2025-09-13T15:41:28.080365"
}

get-recent-entries

Get the last X journal entries with formatted display.

Arguments:

  • count (optional, default: 5): Number of entries to retrieve.
  • personal_only (optional, default: false): Only show personal entries.

Sample Output:

Here are the 1 most recent journal entries:

**Entry #10** (milestone) - 2025-09-13 19:41:28
Personal: False
Content: Successfully implemented MCP prompts functionality...

Context: memory-journal-mcp (main branch)

๐Ÿ’ก Troubleshooting & Notes:

  • GitHub CLI Required: For issue data, install gh and authenticate with gh auth login. The tool falls back gracefully if gh is unavailable.
  • Prompts not appearing? Restart your MCP client after server changes.
  • Git operations timing out? Use include_git=false for faster context capture.

โฌ†๏ธ Back to Table of Contents


๐Ÿ—„๏ธ Data & Schema

Database Schema

  • entries: Main journal entries with content and metadata.
  • tags: Auto-managed tags with usage tracking.
  • entry_tags: Many-to-many relationship between entries and tags.
  • relationships: Typed connections between entries.
  • significant_entries: Classification of important entries.
  • memory_journal_fts: FTS5 full-text search index.

Context Bundle Example

Each entry automatically captures rich project context:

{
  "repo_name": "memory-journal-mcp",
  "repo_path": "C:\\Users\\chris\\Desktop\\memory-journal-mcp",
  "branch": "main",
  "last_commit": {
    "hash": "d4a0c69a",
    "message": "Implement async Git operations for context capture"
  },
  "cwd": "C:\\Users\\chris\\Desktop\\memory-journal-mcp",
  "timestamp": "2025-09-13T18:26:46.123456"
}

Entry, Relationship, and Significance Types

  • Entry Types: personal_reflection, technical_achievement, milestone, development_note, etc.
  • Relationship Types: evolves_from, references, implements, clarifies, response_to.
  • Significance Types: identity_development, technical_breakthrough, project_completion, major_breakthrough.

โฌ†๏ธ Back to Table of Contents


๐Ÿ”ง Technical Implementation Details

Performance & Security

  • Thread Pool Execution: All blocking I/O (database, Git) runs in background threads to keep the server responsive.
  • Aggressive Timeouts: Git operations timeout after 2 seconds per command.
  • WAL Mode: Write-Ahead Logging is enabled for better concurrency and crash recovery.
  • Database Optimization: 64MB cache, 256MB memory-mapped I/O, and NORMAL synchronous mode for a balance of speed and safety.
  • Input Validation: Length limits (50KB entries), character filtering, and parameterized queries to prevent SQL injection.
  • Docker Security: Non-root user execution and minimal container privileges.

Semantic Search

  • Dependencies: Requires pip install sentence-transformers faiss-cpu (optional).
  • Model: Uses all-MiniLM-L6-v2 (384-dimensional embeddings, ~100MB download).
  • Graceful Degradation: The system functions perfectly without these dependencies; the semantic_search tool will simply be unavailable.
  • Storage: Embeddings are stored as BLOB in SQLite, with a FAISS index for fast similarity search.

Resources Provided

The server provides two MCP resources for direct data access:

  • memory://recent: Returns the 5 most recent journal entries.
  • memory://significant: Returns all entries marked with a significance classification.

โฌ†๏ธ Back to Table of Contents


๐Ÿ”ฎ Future Roadmap

  • Graph visualization โ†’ See how your entries and projects connect.
  • Team features โ†’ Share context bundles and collaborate on project journals.
  • Import/export utilities โ†’ Backup/restore via markdown or JSON.
  • Minimal CLI client โ†’ Journal from the command line without a full MCP client.

โฌ†๏ธ Back to Table of Contents

๐Ÿ“„ License

MIT License โ€” do whatever you want, just don't blame us if it writes your autobiography.

โฌ†๏ธ Back to Table of Contents

๐Ÿค Contributing

Built by developers, for developers. PRs are welcome, especially for new entry types, better Git/GitHub integrations, and performance improvements.

โฌ†๏ธ Back to Table of Contents

๐Ÿ”— Additional Resources

โฌ†๏ธ Back to Table of Contents

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

memory_journal_mcp-1.0.1.tar.gz (42.7 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

memory_journal_mcp-1.0.1-py3-none-any.whl (22.2 kB view details)

Uploaded Python 3

File details

Details for the file memory_journal_mcp-1.0.1.tar.gz.

File metadata

  • Download URL: memory_journal_mcp-1.0.1.tar.gz
  • Upload date:
  • Size: 42.7 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.13.7

File hashes

Hashes for memory_journal_mcp-1.0.1.tar.gz
Algorithm Hash digest
SHA256 0e56c201a6bdfb2e5f7ed9a389ee9f6b5e439429c61fe50bc6964bf78f57de47
MD5 a74571fb105bb85db6a989465dd7ce0f
BLAKE2b-256 57826605253f3171cf57948d314d31fe6ca64f6ae511ffde266c83c4248d7fd5

See more details on using hashes here.

File details

Details for the file memory_journal_mcp-1.0.1-py3-none-any.whl.

File metadata

File hashes

Hashes for memory_journal_mcp-1.0.1-py3-none-any.whl
Algorithm Hash digest
SHA256 7f59f4efba5adac73b8ee3fd2a21af8fe83ce7c1c8d75cdf8eb5e0e54dad6dbc
MD5 261a2da18d563d4168645dbda0184dad
BLAKE2b-256 c713ec72ac88364dbcc4e6eda57fc4f1df92c103d9885d1a6c592fa7010d77d6

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page