memory-journal-mcp 7.0.0 → 7.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -10,7 +10,7 @@
10
10
  [![MCP Registry](https://img.shields.io/badge/MCP_Registry-Published-green)](https://registry.modelcontextprotocol.io/v0/servers?search=io.github.neverinfamous/memory-journal-mcp)
11
11
  [![Security](https://img.shields.io/badge/Security-Enhanced-green.svg)](SECURITY.md)
12
12
  [![TypeScript](https://img.shields.io/badge/TypeScript-Strict-blue.svg)](https://github.com/neverinfamous/memory-journal-mcp)
13
- ![Coverage](https://img.shields.io/badge/Coverage-97.52%25-brightgreen.svg)
13
+ ![Coverage](https://img.shields.io/badge/Coverage-97.12%25-brightgreen.svg)
14
14
  ![Tests](https://img.shields.io/badge/Tests-1782_passed-brightgreen.svg)
15
15
  ![E2E Tests](https://img.shields.io/badge/E2E_Tests-391_passed-brightgreen.svg)
16
16
  [![CI](https://github.com/neverinfamous/memory-journal-mcp/actions/workflows/gatekeeper.yml/badge.svg)](https://github.com/neverinfamous/memory-journal-mcp/actions/workflows/gatekeeper.yml)
@@ -28,7 +28,7 @@
28
28
 
29
29
  ### What Sets Us Apart
30
30
 
31
- **61 MCP Tools** · **17 Workflow Prompts** · **38 Resources** · **10 Tool Groups** · **Code Mode** · **GitHub Commander** (Issue Triage, PR Review, Milestone Sprints, Security/Quality/Perf Audits) · **GitHub Integration** (Issues, PRs, Actions, Kanban, Milestones, Insights) · **Team Collaboration** (Shared DB, Vector Search, Cross-Project Insights)
31
+ **65 MCP Tools** · **17 Workflow Prompts** · **38 Resources** · **10 Tool Groups** · **Code Mode** · **GitHub Commander** (Issue Triage, PR Review, Milestone Sprints, Security/Quality/Perf Audits) · **GitHub Integration** (Issues, PRs, Actions, Kanban, Milestones, Insights) · **Team Collaboration** (Shared DB, Vector Search, Cross-Project Insights)
32
32
 
33
33
  | Feature | Description |
34
34
  | ----------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- |
@@ -40,7 +40,8 @@
40
40
  | **Code Mode** | Execute multi-step operations in a secure sandbox — up to 90% token savings via `mj.*` API |
41
41
  | **Configurable Briefing** | 12 env vars / CLI flags control `memory://briefing` content — entries, team, GitHub detail, skills awareness |
42
42
  | **Reports & Analytics** | Standups, retrospectives, PR summaries, digests, period analyses, and milestone tracking |
43
- | **Team Collaboration** | 20 tools with full parity — CRUD, vector search, relationship graphs, cross-project insights, author attribution |
43
+ | **Team Collaboration** | 22 tools with full parity — CRUD, vector search, relationship graphs, cross-project insights, author attribution |
44
+ | **Data Interoperability** | Bidirectional Markdown roundtripping, unified IO namespace, and schema-safe JSON exports with hard bounds-checked path traversal defenses |
44
45
  | **Backup & Restore** | One-command backup/restore with automated scheduling, retention policies, and safety-net auto-backups |
45
46
  | **Security & Transport** | OAuth 2.1 (RFC 9728/8414, JWT/JWKS, scopes), Streamable HTTP + SSE, rate limiting, CORS, SQL injection prevention, non-root Docker |
46
47
  | **Structured Error Handling** | Every tool returns `{success, error, code, category, suggestion, recoverable}` — agents get classification, remediation hints, and recoverability signals |
@@ -149,18 +150,18 @@ Control which tools are exposed via `MEMORY_JOURNAL_MCP_TOOL_FILTER` (or CLI: `-
149
150
 
150
151
  | Filter | Tools | Use Case |
151
152
  | -------------------- | ----- | ------------------------ |
152
- | `full` | 61 | All tools (default) |
153
+ | `full` | 65 | All tools (default) |
153
154
  | `starter` | ~11 | Core + search + codemode |
154
155
  | `essential` | ~7 | Minimal footprint |
155
156
  | `readonly` | ~15 | Disable all mutations |
156
- | `-github` | 45 | Exclude a group |
157
- | `-github,-analytics` | 43 | Exclude multiple groups |
157
+ | `-github` | 49 | Exclude a group |
158
+ | `-github,-analytics` | 47 | Exclude multiple groups |
158
159
 
159
160
  **Filter Syntax:** `shortcut` or `group` or `tool_name` (whitelist mode) · `-group` (disable group) · `-tool` (disable tool) · `+tool` (re-enable after group disable)
160
161
 
161
162
  **Custom Selection:** List individual tool names to create your own whitelist: `--tool-filter "create_entry,search_entries,semantic_search"`
162
163
 
163
- **Groups:** `core`, `search`, `analytics`, `relationships`, `export`, `admin`, `github`, `backup`, `team`, `codemode`
164
+ **Groups:** `core`, `search`, `analytics`, `relationships`, `io`, `admin`, `github`, `backup`, `team`, `codemode`
164
165
 
165
166
  **[Complete tool filtering guide →](https://github.com/neverinfamous/memory-journal-mcp/wiki/Tool-Filtering)**
166
167
 
@@ -168,20 +169,20 @@ Control which tools are exposed via `MEMORY_JOURNAL_MCP_TOOL_FILTER` (or CLI: `-
168
169
 
169
170
  ## 📋 Core Capabilities
170
171
 
171
- ### 🛠️ **61 MCP Tools** (10 Groups)
172
-
173
- | Group | Tools | Description |
174
- | --------------- | ----- | ------------------------------------------------------------------------------------------------------------------- |
175
- | `codemode` | 1 | Code Mode (sandboxed code execution) 🌟 **Recommended** |
176
- | `core` | 6 | Entry CRUD, tags, test |
177
- | `search` | 4 | Text search, date range, semantic, vector stats |
178
- | `analytics` | 2 | Statistics, cross-project insights |
179
- | `relationships` | 2 | Link entries, visualize graphs |
180
- | `export` | 1 | JSON/Markdown export |
181
- | `admin` | 5 | Update, delete, rebuild/add to vector index, merge tags |
182
- | `github` | 16 | Issues, PRs, context, Kanban, **Milestones**, **Insights**, **issue lifecycle**, **Copilot Reviews** |
183
- | `backup` | 4 | Backup, list, restore, cleanup |
184
- | `team` | 20 | CRUD, search, stats, relationships, export, backup, vector search, cross-project insights (requires `TEAM_DB_PATH`) |
172
+ ### 🛠️ **65 MCP Tools** (10 Groups)
173
+
174
+ | Group | Tools | Description |
175
+ | --------------- | ----- | ---------------------------------------------------------------------------------------------------------------------------------------- |
176
+ | `codemode` | 1 | Code Mode (sandboxed code execution) 🌟 **Recommended** |
177
+ | `core` | 6 | Entry CRUD, tags, test |
178
+ | `search` | 4 | Text search, date range, semantic, vector stats |
179
+ | `analytics` | 2 | Statistics, cross-project insights |
180
+ | `relationships` | 2 | Link entries, visualize graphs |
181
+ | `io` | 3 | JSON/Markdown export and File-level Markdown Data Integration Interoperability (Import/Export) |
182
+ | `admin` | 5 | Update, delete, rebuild/add to vector index, merge tags |
183
+ | `github` | 16 | Issues, PRs, context, Kanban, **Milestones**, **Insights**, **issue lifecycle**, **Copilot Reviews** |
184
+ | `backup` | 4 | Backup, list, restore, cleanup |
185
+ | `team` | 22 | CRUD, search, stats, relationships, IO (Markdown import/export), backup, vector search, cross-project insights (requires `TEAM_DB_PATH`) |
185
186
 
186
187
  **[Complete tools reference →](https://github.com/neverinfamous/memory-journal-mcp/wiki/Tools)**
187
188
 
@@ -268,7 +269,7 @@ Code executes in a **sandboxed VM context** with multiple layers of security. Al
268
269
 
269
270
  ### ⚡ Code Mode Only (Maximum Token Savings)
270
271
 
271
- Run with **only Code Mode enabled** — a single tool that provides access to all 61 tools' worth of capability through the `mj.*` API:
272
+ Run with **only Code Mode enabled** — a single tool that provides access to all 65 tools' worth of capability through the `mj.*` API:
272
273
 
273
274
  ```json
274
275
  {
@@ -473,54 +474,52 @@ Each job is error-isolated — a failure in one job won't affect the others. Sch
473
474
 
474
475
  The GitHub tools (`get_github_issues`, `get_github_prs`, etc.) auto-detect the repository from your git context when `PROJECT_REGISTRY` is configured or the MCP server is run inside a git repository.
475
476
 
476
- | Environment Variable | Description |
477
- | -------------------- | ----------------------------------------------------------------------- |
478
- | `DB_PATH` | Database file location (CLI: `--db`; default: `./memory_journal.db`) |
479
- | `TEAM_DB_PATH` | Team database file location (CLI: `--team-db`) |
480
- | `TEAM_AUTHOR` | Override author name for team entries (default: `git config user.name`) |
481
- | `GITHUB_TOKEN` | GitHub personal access token for API access |
482
-
483
- | `DEFAULT_PROJECT_NUMBER` | Default GitHub Project number for auto-assignment when creating issues |
484
- | `GITHUB_REPO_PATH` | Path to a git repository for auto-detecting owner/repo |
485
- | `PROJECT_REGISTRY` | JSON map of repos to `{ path, project_number }` for multi-project auto-detection and routing |
486
- | `AUTO_REBUILD_INDEX` | Set to `true` to rebuild vector index on server startup |
487
- | `MCP_HOST` | Server bind host (`0.0.0.0` for containers, default: `localhost`) |
488
- | `MCP_AUTH_TOKEN` | Bearer token for HTTP transport authentication (CLI: `--auth-token`) |
489
- | `MCP_CORS_ORIGIN` | Allowed CORS origins for HTTP transport, comma-separated (default: `*`) |
490
- | `MCP_RATE_LIMIT_MAX` | Max requests per minute per client IP, HTTP only (default: `100`) |
491
- | `LOG_LEVEL` | Log verbosity: `error`, `warn`, `info`, `debug` (default: `info`; CLI: `--log-level`) |
492
- | `MCP_ENABLE_HSTS` | Enable HSTS security header on HTTP responses (CLI: `--enable-hsts`; default: `false`) |
493
- | `OAUTH_ENABLED` | Set to `true` to enable OAuth 2.1 authentication (HTTP only) |
494
- | `OAUTH_ISSUER` | OAuth issuer URL (e.g., `https://auth.example.com/realms/mcp`) |
495
- | `OAUTH_AUDIENCE` | Expected JWT audience claim |
496
- | `OAUTH_JWKS_URI` | JWKS endpoint for token signature verification |
497
- | `BRIEFING_ENTRY_COUNT` | Journal entries in briefing (CLI: `--briefing-entries`; default: `3`) |
498
- | `BRIEFING_INCLUDE_TEAM` | Include team DB entries in briefing (`true`/`false`; default: `false`) |
499
- | `BRIEFING_ISSUE_COUNT` | Issues to list in briefing; `0` = count only (default: `0`) |
500
- | `BRIEFING_PR_COUNT` | PRs to list in briefing; `0` = count only (default: `0`) |
501
- | `BRIEFING_PR_STATUS` | Show PR status breakdown (open/merged/closed; default: `false`) |
502
- | `BRIEFING_WORKFLOW_COUNT` | Workflow runs to list in briefing; `0` = status only (default: `0`) |
503
- | `BRIEFING_WORKFLOW_STATUS` | Show workflow status breakdown in briefing (default: `false`) |
504
- | `BRIEFING_COPILOT_REVIEWS` | Aggregate Copilot review state in briefing (default: `false`) |
505
- | `RULES_FILE_PATH` | Path to user rules file for agent awareness (CLI: `--rules-file`) |
506
- | `SKILLS_DIR_PATH` | Path to skills directory for agent awareness (CLI: `--skills-dir`) |
507
- | `MEMORY_JOURNAL_WORKFLOW_SUMMARY` | Free-text workflow summary for `memory://workflows` (CLI: `--workflow-summary`) |
508
- | `INSTRUCTION_LEVEL` | Briefing depth: `essential`, `standard`, `full` (CLI: `--instruction-level`; default: `standard`) |
509
- | `PROJECT_LINT_CMD` | Project lint command for GitHub Commander validation gates (default: `npm run lint`) |
510
- | `PROJECT_TYPECHECK_CMD` | Project typecheck command (default: `npm run typecheck`; empty = skip) |
511
- | `PROJECT_BUILD_CMD` | Project build command (default: `npm run build`; empty = skip) |
512
- | `PROJECT_TEST_CMD` | Project test command (default: `npm run test`) |
513
- | `PROJECT_E2E_CMD` | Project E2E test command (default: empty = skip) |
514
- | `PROJECT_PACKAGE_MANAGER` | Package manager override: `npm`, `yarn`, `pnpm`, `bun` (default: auto-detect from lockfile) |
515
- | `PROJECT_HAS_DOCKERFILE` | Enable Docker audit steps (default: auto-detect) |
516
- | `COMMANDER_HITL_FILE_THRESHOLD` | Human-in-the-loop checkpoint if changes touch > N files (default: `10`) |
517
- | `COMMANDER_SECURITY_TOOLS` | Override security tool auto-detection (comma-separated; default: auto-detect) |
518
- | `COMMANDER_BRANCH_PREFIX` | Branch naming prefix for PRs (default: `fix`) |
519
- | `AUDIT_LOG_PATH` | Path for the JSONL audit log of write/admin tool calls. Rotates at 10 MB (keeps 5 archives). Omit to disable audit logging. |
520
- | `AUDIT_REDACT` | Set to `true` to omit tool arguments from audit log entries for privacy (default: `false`) |
521
- | `AUDIT_READS` | Log read-scoped tool calls in addition to write/admin (CLI: `--audit-reads`; default: `false`) |
522
- | `AUDIT_LOG_MAX_SIZE` | Maximum audit log file size in bytes before rotation (CLI: `--audit-log-max-size`; default: `10485760`) |
523
- | `MCP_METRICS_ENABLED` | Set to `false` to disable in-memory tool call metrics accumulation (default: `true`) |
477
+ | Environment Variable | Description |
478
+ | --------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
479
+ | `DB_PATH` | Database file location (CLI: `--db`; default: `./memory_journal.db`) |
480
+ | `TEAM_DB_PATH` | Team database file location (CLI: `--team-db`) |
481
+ | `TEAM_AUTHOR` | Override author name for team entries (default: `git config user.name`) |
482
+ | `GITHUB_TOKEN` | GitHub personal access token for API access |
483
+ | `DEFAULT_PROJECT_NUMBER` | Default GitHub Project number for auto-assignment when creating issues |
484
+ | `PROJECT_REGISTRY` | JSON map of repos to `{ path, project_number }` for multi-project auto-detection and routing |
485
+ | `AUTO_REBUILD_INDEX` | Set to `true` to rebuild vector index on server startup |
486
+ | `MCP_HOST` | Server bind host (`0.0.0.0` for containers, default: `localhost`) |
487
+ | `MCP_AUTH_TOKEN` | Bearer token for HTTP transport authentication (CLI: `--auth-token`) |
488
+ | `MCP_CORS_ORIGIN` | Allowed CORS origins for HTTP transport, comma-separated (default: `*`) |
489
+ | `MCP_RATE_LIMIT_MAX` | Max requests per minute per client IP, HTTP only (default: `100`) |
490
+ | `LOG_LEVEL` | Log verbosity: `error`, `warn`, `info`, `debug` (default: `info`; CLI: `--log-level`) |
491
+ | `MCP_ENABLE_HSTS` | Enable HSTS security header on HTTP responses (CLI: `--enable-hsts`; default: `false`) |
492
+ | `OAUTH_ENABLED` | Set to `true` to enable OAuth 2.1 authentication (HTTP only) |
493
+ | `OAUTH_ISSUER` | OAuth issuer URL (e.g., `https://auth.example.com/realms/mcp`) |
494
+ | `OAUTH_AUDIENCE` | Expected JWT audience claim |
495
+ | `OAUTH_JWKS_URI` | JWKS endpoint for token signature verification |
496
+ | `BRIEFING_ENTRY_COUNT` | Journal entries in briefing (CLI: `--briefing-entries`; default: `3`) |
497
+ | `BRIEFING_INCLUDE_TEAM` | Include team DB entries in briefing (`true`/`false`; default: `false`) |
498
+ | `BRIEFING_ISSUE_COUNT` | Issues to list in briefing; `0` = count only (default: `0`) |
499
+ | `BRIEFING_PR_COUNT` | PRs to list in briefing; `0` = count only (default: `0`) |
500
+ | `BRIEFING_PR_STATUS` | Show PR status breakdown (open/merged/closed; default: `false`) |
501
+ | `BRIEFING_WORKFLOW_COUNT` | Workflow runs to list in briefing; `0` = status only (default: `0`) |
502
+ | `BRIEFING_WORKFLOW_STATUS` | Show workflow status breakdown in briefing (default: `false`) |
503
+ | `BRIEFING_COPILOT_REVIEWS` | Aggregate Copilot review state in briefing (default: `false`) |
504
+ | `RULES_FILE_PATH` | Path to user rules file for agent awareness (CLI: `--rules-file`) |
505
+ | `SKILLS_DIR_PATH` | Path to skills directory for agent awareness (CLI: `--skills-dir`) |
506
+ | `MEMORY_JOURNAL_WORKFLOW_SUMMARY` | Free-text workflow summary for `memory://workflows` (CLI: `--workflow-summary`) |
507
+ | `INSTRUCTION_LEVEL` | Briefing depth: `essential`, `standard`, `full` (CLI: `--instruction-level`; default: `standard`) |
508
+ | `PROJECT_LINT_CMD` | Project lint command for GitHub Commander validation gates (default: `npm run lint`) |
509
+ | `PROJECT_TYPECHECK_CMD` | Project typecheck command (default: `npm run typecheck`; empty = skip) |
510
+ | `PROJECT_BUILD_CMD` | Project build command (default: `npm run build`; empty = skip) |
511
+ | `PROJECT_TEST_CMD` | Project test command (default: `npm run test`) |
512
+ | `PROJECT_E2E_CMD` | Project E2E test command (default: empty = skip) |
513
+ | `PROJECT_PACKAGE_MANAGER` | Package manager override: `npm`, `yarn`, `pnpm`, `bun` (default: auto-detect from lockfile) |
514
+ | `PROJECT_HAS_DOCKERFILE` | Enable Docker audit steps (default: auto-detect) |
515
+ | `COMMANDER_HITL_FILE_THRESHOLD` | Human-in-the-loop checkpoint if changes touch > N files (default: `10`) |
516
+ | `COMMANDER_SECURITY_TOOLS` | Override security tool auto-detection (comma-separated; default: auto-detect) |
517
+ | `COMMANDER_BRANCH_PREFIX` | Branch naming prefix for PRs (default: `fix`) |
518
+ | `AUDIT_LOG_PATH` | Path for the JSONL audit log of write/admin tool calls. Rotates at 10 MB (keeps 5 archives). Omit to disable audit logging. |
519
+ | `AUDIT_REDACT` | Set to `true` to omit tool arguments from audit log entries for privacy (default: `false`) |
520
+ | `AUDIT_READS` | Log read-scoped tool calls in addition to write/admin (CLI: `--audit-reads`; default: `false`) |
521
+ | `AUDIT_LOG_MAX_SIZE` | Maximum audit log file size in bytes before rotation (CLI: `--audit-log-max-size`; default: `10485760`) |
522
+ | `MCP_METRICS_ENABLED` | Set to `false` to disable in-memory tool call metrics accumulation (default: `true`) |
524
523
 
525
524
  **Multi-Project Workflows**: For agents to seamlessly support multiple projects, provide **`PROJECT_REGISTRY`**.
526
525
 
@@ -556,7 +555,7 @@ For production deployments, enable OAuth 2.1 authentication on the HTTP transpor
556
555
 
557
556
  | Scope | Tool Groups |
558
557
  | ------- | ------------------------------------------------- |
559
- | `read` | core, search, analytics, relationships, export |
558
+ | `read` | core, search, analytics, relationships, io |
560
559
  | `write` | github, team (+ all read groups) |
561
560
  | `admin` | admin, backup, codemode (+ all write/read groups) |
562
561
 
@@ -630,8 +629,8 @@ flowchart TB
630
629
  AI["🤖 AI Agent<br/>(Cursor, Windsurf, Claude)"]
631
630
 
632
631
  subgraph MCP["Memory Journal MCP Server"]
633
- Tools["🛠️ 61 Tools"]
634
- Resources["📡 33 Resources"]
632
+ Tools["🛠️ 65 Tools"]
633
+ Resources["📡 38 Resources"]
635
634
  Prompts["💬 17 Prompts"]
636
635
  end
637
636
 
@@ -659,7 +658,7 @@ flowchart TB
659
658
  ┌─────────────────────────────────────────────────────────────┐
660
659
  │ MCP Server Layer (TypeScript) │
661
660
  │ ┌─────────────────┐ ┌─────────────────┐ ┌─────────────┐ │
662
- │ │ Tools (61) │ │ Resources (38) │ │ Prompts (17)│ │
661
+ │ │ Tools (65) │ │ Resources (38) │ │ Prompts (17)│ │
663
662
  │ │ with Annotations│ │ with Annotations│ │ │ │
664
663
  │ └─────────────────┘ └─────────────────┘ └─────────────┘ │
665
664
  ├─────────────────────────────────────────────────────────────┤
@@ -222,6 +222,13 @@ function assertNoPathTraversal(filename) {
222
222
  throw new PathTraversalError(filename);
223
223
  }
224
224
  }
225
+ function assertSafeDirectoryPath(dirPath) {
226
+ const normalized = dirPath.replace(/\\/g, "/");
227
+ const segments = normalized.split("/");
228
+ if (segments.some((s) => s === "..")) {
229
+ throw new PathTraversalError(dirPath);
230
+ }
231
+ }
225
232
  var TOKEN_PATTERNS = [
226
233
  // GitHub personal access tokens (classic and fine-grained)
227
234
  /ghp_[A-Za-z0-9_]{36,}/g,
@@ -1656,4 +1663,4 @@ var GitHubIntegration = class {
1656
1663
  }
1657
1664
  };
1658
1665
 
1659
- export { ConfigurationError, ConnectionError, GitHubIntegration, MemoryJournalMcpError, QueryError, ResourceNotFoundError, ValidationError, assertNoPathTraversal, logger, matchSuggestion, resolveAuthor, validateDateFormatPattern };
1666
+ export { ConfigurationError, ConnectionError, GitHubIntegration, MemoryJournalMcpError, QueryError, ResourceNotFoundError, ValidationError, assertNoPathTraversal, assertSafeDirectoryPath, logger, matchSuggestion, resolveAuthor, validateDateFormatPattern };
@@ -1,5 +1,5 @@
1
- import { withSessionInit, withPriority, ASSISTANT_FOCUSED, TOOL_GROUPS, HIGH_PRIORITY, LOW_PRIORITY, MEDIUM_PRIORITY, setDefaultSandboxMode, initializeAuditLogger, parseToolFilter, getFilterSummary, getToolFilterFromEnv, getTools, getEnabledGroups, callTool, getGlobalAuditLogger, sendProgress, SUPPORTED_SCOPES, getRequiredScope, hasScope, getAuditResourceDef, execQuery, transformEntryRow, resolveGitHubRepo, isResourceError, milestoneCompletionPct, parseScopes, BASE_SCOPES, getAllToolNames, globalMetrics, DEFAULT_BRIEFING_CONFIG } from './chunk-2BJHLTYP.js';
2
- import { logger, GitHubIntegration, ConfigurationError, ResourceNotFoundError, ConnectionError, QueryError, assertNoPathTraversal, ValidationError, MemoryJournalMcpError, validateDateFormatPattern } from './chunk-ARLH46WS.js';
1
+ import { withSessionInit, withPriority, ASSISTANT_FOCUSED, TOOL_GROUPS, HIGH_PRIORITY, LOW_PRIORITY, MEDIUM_PRIORITY, setDefaultSandboxMode, initializeAuditLogger, parseToolFilter, getFilterSummary, getToolFilterFromEnv, getTools, getEnabledGroups, callTool, getGlobalAuditLogger, sendProgress, SUPPORTED_SCOPES, getRequiredScope, hasScope, getAuditResourceDef, execQuery, transformEntryRow, resolveGitHubRepo, isResourceError, milestoneCompletionPct, parseScopes, BASE_SCOPES, getAllToolNames, globalMetrics, DEFAULT_BRIEFING_CONFIG } from './chunk-JEGRDY6W.js';
2
+ import { logger, GitHubIntegration, ConfigurationError, ResourceNotFoundError, ConnectionError, QueryError, assertNoPathTraversal, ValidationError, MemoryJournalMcpError, validateDateFormatPattern } from './chunk-37BQOJDZ.js';
3
3
  import { createRequire } from 'module';
4
4
  import { McpServer, ResourceTemplate } from '@modelcontextprotocol/sdk/server/mcp.js';
5
5
  import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
@@ -2445,10 +2445,10 @@ var CODE_MODE_NAMESPACE_ROWS = [
2445
2445
  example: '`mj.relationships.linkEntries(1, 2, "implements")`'
2446
2446
  },
2447
2447
  {
2448
- group: "export",
2449
- label: "Export",
2450
- namespace: "`mj.export.*`",
2451
- example: '`mj.export.exportEntries("json")`'
2448
+ group: "io",
2449
+ label: "IO",
2450
+ namespace: "`mj.io.*`",
2451
+ example: '`mj.io.exportEntries("json")`'
2452
2452
  },
2453
2453
  {
2454
2454
  group: "admin",
@@ -2502,7 +2502,7 @@ This executes JavaScript in a sandboxed environment with all tools available as
2502
2502
  | Search | \`mj.search.*\` | \`mj.search.searchEntries("performance")\` |
2503
2503
  | Analytics | \`mj.analytics.*\` | \`mj.analytics.getStatistics()\` |
2504
2504
  | Relationships | \`mj.relationships.*\` | \`mj.relationships.linkEntries(1, 2, "implements")\` |
2505
- | Export | \`mj.export.*\` | \`mj.export.exportEntries("json")\` |
2505
+ | IO | \`mj.io.*\` | \`mj.io.exportEntries("json")\` |
2506
2506
  | Admin | \`mj.admin.*\` | \`mj.admin.rebuildVectorIndex()\` |
2507
2507
  | GitHub | \`mj.github.*\` | \`mj.github.getGithubIssues({ state: "open" })\` |
2508
2508
  | Backup | \`mj.backup.*\` | \`mj.backup.backupJournal()\` |
@@ -2626,7 +2626,7 @@ var GOTCHAS_CONTENT = `# memory-journal-mcp \u2014 Field Notes & Gotchas
2626
2626
 
2627
2627
  - **Team cross-database search**: \`search_entries\` and \`search_by_date_range\` automatically merge team DB results when \`TEAM_DB_PATH\` is configured. Results include a \`source\` field ("personal" or "team").
2628
2628
  - **Team vector search**: Team has its own isolated vector index. Use \`team_rebuild_vector_index\` if the team index drifts. \`team_semantic_search\` works identically to personal \`semantic_search\`.
2629
- - **Team tools without \`TEAM_DB_PATH\`**: All 20 team tools return \`{ success: false, error: "Team collaboration is not configured..." }\` \u2014 no crash, no partial results.
2629
+ - **Team tools without \`TEAM_DB_PATH\`**: All 22 team tools return \`{ success: false, error: "Team collaboration is not configured..." }\` \u2014 no crash, no partial results.
2630
2630
  `;
2631
2631
  function generateInstructions(enabledTools, prompts, latestEntry, level = "standard", enabledGroups) {
2632
2632
  const groups = enabledGroups ?? getEnabledGroups(enabledTools);
@@ -4553,13 +4553,13 @@ function getTemplateResourceDefinitions() {
4553
4553
  return { error: "Invalid project number" };
4554
4554
  }
4555
4555
  if (!context.github) {
4556
- return 'graph LR\n NoGitHub["GitHub integration not available \u2014 set GITHUB_TOKEN and GITHUB_REPO_PATH"]';
4556
+ return 'graph LR\n NoGitHub["GitHub integration not available \u2014 set GITHUB_TOKEN or enable GitHub integration"]';
4557
4557
  }
4558
4558
  const repoInfo = await context.github.getRepoInfo();
4559
4559
  const owner = repoInfo.owner;
4560
4560
  const repo = repoInfo.repo ?? void 0;
4561
4561
  if (!owner) {
4562
- return 'graph LR\n NoOwner["Repository owner not detected \u2014 set GITHUB_REPO_PATH"]';
4562
+ return 'graph LR\n NoOwner["Repository owner not detected \u2014 configure PROJECT_REGISTRY or run the server from within a valid git repository"]';
4563
4563
  }
4564
4564
  const board = await context.github.getProjectKanban(owner, projectNumber, repo);
4565
4565
  if (!board) {
@@ -4692,7 +4692,7 @@ var GROUP_DESCRIPTIONS = {
4692
4692
  search: "Full-text search, semantic search, date range queries, and vector index stats",
4693
4693
  analytics: "Entry analytics, importance scoring, and productivity trends",
4694
4694
  relationships: "Link and visualize relationships between journal entries",
4695
- export: "Export journal data in various formats (JSON, Markdown, CSV)",
4695
+ io: "Import and export journal data \u2014 JSON export, Markdown round-trip (export/import)",
4696
4696
  admin: "Update entries, rebuild indexes, and manage the vector search index",
4697
4697
  github: "GitHub integration \u2014 issues, PRs, milestones, workflow runs, Kanban boards",
4698
4698
  backup: "Create and restore database backups",
@@ -4894,7 +4894,7 @@ function getHelpResourceDefinitions() {
4894
4894
  var toolIndexModule = null;
4895
4895
  async function getAllToolDefinitionsAsync(context) {
4896
4896
  try {
4897
- toolIndexModule ??= await import('./tools-FFFGXIKN.js');
4897
+ toolIndexModule ??= await import('./tools-O44Q52RD.js');
4898
4898
  if (toolIndexModule === null) return [];
4899
4899
  const tools = toolIndexModule.getTools(context.db, null);
4900
4900
  return tools.map((t) => ({
@@ -4935,8 +4935,10 @@ function inferGroupFromName(name) {
4935
4935
  // relationships (2)
4936
4936
  link_entries: "relationships",
4937
4937
  visualize_relationships: "relationships",
4938
- // export (1)
4939
- export_entries: "export",
4938
+ // io (3)
4939
+ export_entries: "io",
4940
+ export_markdown: "io",
4941
+ import_markdown: "io",
4940
4942
  // admin (5)
4941
4943
  update_entry: "admin",
4942
4944
  delete_entry: "admin",