@engramprotocol/mcp-server 0.9.0 → 0.10.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.
Files changed (83) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +98 -48
  3. package/dist/cli.js +53 -10
  4. package/dist/cli.js.map +1 -1
  5. package/dist/http-client.d.ts +7 -7
  6. package/dist/http-client.js +7 -7
  7. package/dist/server.d.ts +6 -6
  8. package/dist/setup/_helpers.d.ts +71 -0
  9. package/dist/setup/_helpers.d.ts.map +1 -0
  10. package/dist/setup/_helpers.js +275 -0
  11. package/dist/setup/_helpers.js.map +1 -0
  12. package/dist/setup/index.d.ts +2 -0
  13. package/dist/setup/index.d.ts.map +1 -0
  14. package/dist/setup/index.js +83 -0
  15. package/dist/setup/index.js.map +1 -0
  16. package/dist/setup/install.d.ts +2 -0
  17. package/dist/setup/install.d.ts.map +1 -0
  18. package/dist/setup/install.js +241 -0
  19. package/dist/setup/install.js.map +1 -0
  20. package/dist/setup/uninstall.d.ts +2 -0
  21. package/dist/setup/uninstall.d.ts.map +1 -0
  22. package/dist/setup/uninstall.js +120 -0
  23. package/dist/setup/uninstall.js.map +1 -0
  24. package/dist/setup/update.d.ts +2 -0
  25. package/dist/setup/update.d.ts.map +1 -0
  26. package/dist/setup/update.js +130 -0
  27. package/dist/setup/update.js.map +1 -0
  28. package/dist/tools/_helpers.d.ts +6 -6
  29. package/dist/tools/_helpers.js +6 -6
  30. package/dist/tools/boot.d.ts.map +1 -1
  31. package/dist/tools/boot.js +4 -9
  32. package/dist/tools/boot.js.map +1 -1
  33. package/dist/tools/decide.d.ts +13 -0
  34. package/dist/tools/decide.d.ts.map +1 -0
  35. package/dist/tools/decide.js +59 -0
  36. package/dist/tools/decide.js.map +1 -0
  37. package/dist/tools/entity.d.ts +6 -2
  38. package/dist/tools/entity.d.ts.map +1 -1
  39. package/dist/tools/entity.js +23 -25
  40. package/dist/tools/entity.js.map +1 -1
  41. package/dist/tools/get.d.ts.map +1 -1
  42. package/dist/tools/get.js +3 -9
  43. package/dist/tools/get.js.map +1 -1
  44. package/dist/tools/index.d.ts +19 -4
  45. package/dist/tools/index.d.ts.map +1 -1
  46. package/dist/tools/index.js +41 -17
  47. package/dist/tools/index.js.map +1 -1
  48. package/dist/tools/list.d.ts.map +1 -1
  49. package/dist/tools/list.js +6 -10
  50. package/dist/tools/list.js.map +1 -1
  51. package/dist/tools/note.d.ts +15 -0
  52. package/dist/tools/note.d.ts.map +1 -0
  53. package/dist/tools/note.js +50 -0
  54. package/dist/tools/note.js.map +1 -0
  55. package/dist/tools/projects.d.ts +9 -0
  56. package/dist/tools/projects.d.ts.map +1 -0
  57. package/dist/tools/projects.js +65 -0
  58. package/dist/tools/projects.js.map +1 -0
  59. package/dist/tools/recall.d.ts.map +1 -1
  60. package/dist/tools/recall.js +4 -6
  61. package/dist/tools/recall.js.map +1 -1
  62. package/dist/tools/set-status.d.ts +13 -0
  63. package/dist/tools/set-status.d.ts.map +1 -0
  64. package/dist/tools/set-status.js +48 -0
  65. package/dist/tools/set-status.js.map +1 -0
  66. package/dist/tools/show.d.ts +11 -0
  67. package/dist/tools/show.d.ts.map +1 -0
  68. package/dist/tools/show.js +25 -0
  69. package/dist/tools/show.js.map +1 -0
  70. package/dist/tools/stats.d.ts +11 -0
  71. package/dist/tools/stats.d.ts.map +1 -0
  72. package/dist/tools/stats.js +21 -0
  73. package/dist/tools/stats.js.map +1 -0
  74. package/dist/tools/track-task.d.ts +10 -0
  75. package/dist/tools/track-task.d.ts.map +1 -0
  76. package/dist/tools/track-task.js +56 -0
  77. package/dist/tools/track-task.js.map +1 -0
  78. package/dist/tools/update.d.ts.map +1 -1
  79. package/dist/tools/update.js +4 -5
  80. package/dist/tools/update.js.map +1 -1
  81. package/package.json +15 -12
  82. package/templates/hooks/session_start_boot.sh +63 -0
  83. package/templates/hooks/user_prompt_submit_reminder.sh +78 -0
@@ -6,9 +6,9 @@ const _helpers_1 = require("./_helpers");
6
6
  function registerUpdateTool(server, http) {
7
7
  server.registerTool('eml_update', {
8
8
  title: 'Update Engram',
9
- description: 'Patch einen Engram (status, significance, properties, content). ' +
10
- 'Typischer Use-Case: status="resolved" + outcome in properties bei Predictions, ' +
11
- 'oder status="superseded" wenn ein Engram nicht mehr gilt.',
9
+ description: 'Patch an engram (status, significance, properties, content). Typical: ' +
10
+ 'status="resolved" when a task is done, or status="superseded" to retire ' +
11
+ 'a stale decision when a new one replaces it.',
12
12
  inputSchema: {
13
13
  id: zod_1.z.string(),
14
14
  patch: zod_1.z.object({
@@ -18,8 +18,7 @@ function registerUpdateTool(server, http) {
18
18
  subject: zod_1.z.string().optional(),
19
19
  scope: zod_1.z.string().optional(),
20
20
  properties: zod_1.z.record(zod_1.z.string(), zod_1.z.unknown()).optional(),
21
- }).describe('Nur die Felder die geändert werden sollen.'),
22
- caller: zod_1.z.string().optional(),
21
+ }).describe('Only the fields to be modified.'),
23
22
  },
24
23
  }, async (args) => (0, _helpers_1.callTool)(() => http.post('/update', args)));
25
24
  }
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/tools/update.ts"],"names":[],"mappings":";;AAKA,gDAwBC;AA7BD,6BAAuB;AAGvB,yCAAqC;AAErC,SAAgB,kBAAkB,CAAC,MAAiB,EAAE,IAAgB;IACpE,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,kEAAkE;YAClE,iFAAiF;YACjF,2DAA2D;QAC7D,WAAW,EAAE;YACX,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;YACd,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC;gBACd,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC9B,MAAM,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACpG,YAAY,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACjF,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC9B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC5B,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;aACzD,CAAC,CAAC,QAAQ,CAAC,4CAA4C,CAAC;YACzD,MAAM,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;SAC9B;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAA,mBAAQ,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAC3D,CAAA;AACH,CAAC"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../src/tools/update.ts"],"names":[],"mappings":";;AAKA,gDAuBC;AA5BD,6BAAuB;AAGvB,yCAAqC;AAErC,SAAgB,kBAAkB,CAAC,MAAiB,EAAE,IAAgB;IACpE,MAAM,CAAC,YAAY,CACjB,YAAY,EACZ;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,wEAAwE;YACxE,0EAA0E;YAC1E,8CAA8C;QAChD,WAAW,EAAE;YACX,EAAE,EAAE,OAAC,CAAC,MAAM,EAAE;YACd,KAAK,EAAE,OAAC,CAAC,MAAM,CAAC;gBACd,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC9B,MAAM,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,SAAS,EAAE,QAAQ,EAAE,YAAY,EAAE,aAAa,EAAE,SAAS,EAAE,UAAU,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACpG,YAAY,EAAE,OAAC,CAAC,IAAI,CAAC,CAAC,UAAU,EAAE,MAAM,EAAE,QAAQ,EAAE,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,QAAQ,EAAE;gBACjF,OAAO,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC9B,KAAK,EAAE,OAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE;gBAC5B,UAAU,EAAE,OAAC,CAAC,MAAM,CAAC,OAAC,CAAC,MAAM,EAAE,EAAE,OAAC,CAAC,OAAO,EAAE,CAAC,CAAC,QAAQ,EAAE;aACzD,CAAC,CAAC,QAAQ,CAAC,iCAAiC,CAAC;SAC/C;KACF,EACD,KAAK,EAAE,IAAI,EAAE,EAAE,CAAC,IAAA,mBAAQ,EAAC,GAAG,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,IAAI,CAAC,CAAC,CAC3D,CAAA;AACH,CAAC"}
package/package.json CHANGED
@@ -1,20 +1,28 @@
1
1
  {
2
2
  "name": "@engramprotocol/mcp-server",
3
- "version": "0.9.0",
4
- "description": "MCP-Wrapper für die EML HTTP-API — exposes EML als MCP-Tools für Claude Code und andere MCP-Clients",
5
- "license": "UNLICENSED",
3
+ "version": "0.10.0",
4
+ "description": "MCP wrapper for the EML HTTP API — exposes the Engram Protocol as MCP tools for Claude Code and other MCP clients. Includes setup-mode for one-shot install/update/uninstall.",
5
+ "license": "MIT",
6
6
  "main": "dist/server.js",
7
7
  "types": "dist/server.d.ts",
8
8
  "bin": {
9
- "eml-mcp-server": "./dist/cli.js"
9
+ "eml-mcp-server": "./dist/cli.js",
10
+ "mcp-server": "./dist/cli.js"
10
11
  },
11
12
  "files": [
12
13
  "dist",
13
- "README.md"
14
+ "templates",
15
+ "README.md",
16
+ "LICENSE"
14
17
  ],
15
18
  "publishConfig": {
16
19
  "access": "public"
17
20
  },
21
+ "scripts": {
22
+ "build": "tsc -b",
23
+ "test": "vitest run --passWithNoTests",
24
+ "test:watch": "vitest"
25
+ },
18
26
  "dependencies": {
19
27
  "@modelcontextprotocol/sdk": "^1.29.0",
20
28
  "zod": "^4.4.3"
@@ -23,11 +31,6 @@
23
31
  "node": ">=20"
24
32
  },
25
33
  "devDependencies": {
26
- "@engramprotocol/core": "0.0.0"
27
- },
28
- "scripts": {
29
- "build": "tsc -b",
30
- "test": "vitest run --passWithNoTests",
31
- "test:watch": "vitest"
34
+ "@engramprotocol/core": "workspace:*"
32
35
  }
33
- }
36
+ }
@@ -0,0 +1,63 @@
1
+ #!/usr/bin/env bash
2
+ # managed-by: engramprotocol-setup
3
+ #
4
+ # SessionStart-Hook: loads the EML brain into Claude Code's session context.
5
+ # Output is invisible-in-chat but reaches the model's context (verified empirically
6
+ # via spike 2026-05-15 — see brain decision dc5a9ad5).
7
+ #
8
+ # Layout: 7 sections — safety+constants, log+stdin, config check, sanity, /boot
9
+ # call, update-banner check, emit markdown.
10
+
11
+ set -eu
12
+
13
+ # --- 1. Safety + Constants -------------------------------------------------
14
+ CONFIG="$HOME/.eml/config"
15
+ LOG_DIR="$HOME/.eml/logs"
16
+
17
+ # --- 2. Log setup + stdin capture ------------------------------------------
18
+ mkdir -p "$LOG_DIR"
19
+ LOG_FILE="$LOG_DIR/session-start-$(date -u +%Y-%m-%d).log"
20
+ TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
21
+ STDIN=$(cat || true)
22
+ echo "[$TS] fired (pid=$$) stdin=$STDIN" >> "$LOG_FILE"
23
+
24
+ # --- 3. Config check + source ----------------------------------------------
25
+ if [ ! -f "$CONFIG" ]; then
26
+ echo "⚠️ EML config missing at $CONFIG — run 'npx @engramprotocol/mcp-server setup'"
27
+ echo "[$TS] FAIL config missing" >> "$LOG_FILE"
28
+ exit 0
29
+ fi
30
+ . "$CONFIG"
31
+
32
+ # --- 4. Sanity: required vars ----------------------------------------------
33
+ if [ -z "${EML_URL:-}" ] || [ -z "${EML_API_TOKEN:-}" ]; then
34
+ echo "⚠️ EML config incomplete — EML_URL or EML_API_TOKEN missing in $CONFIG"
35
+ echo "[$TS] FAIL incomplete config" >> "$LOG_FILE"
36
+ exit 0
37
+ fi
38
+
39
+ # --- 5. Call /boot ---------------------------------------------------------
40
+ RESPONSE=$(curl -fsS -m 8 \
41
+ -H "Authorization: Bearer $EML_API_TOKEN" \
42
+ -H "Content-Type: application/json" \
43
+ -X POST -d '{}' \
44
+ "$EML_URL/boot" 2>>"$LOG_FILE") || {
45
+ echo "⚠️ EML Boot failed — server unreachable or auth error. See $LOG_FILE"
46
+ echo "[$TS] FAIL curl non-zero" >> "$LOG_FILE"
47
+ exit 0
48
+ }
49
+
50
+ # --- 6. Update-banner check ------------------------------------------------
51
+ SERVER_VER=$(echo "$RESPONSE" | jq -r '.version // empty')
52
+ if [ -n "${EML_CLIENT_VERSION:-}" ] && [ -n "$SERVER_VER" ] && [ "$EML_CLIENT_VERSION" != "$SERVER_VER" ]; then
53
+ cat <<EOF
54
+ ## ⚠️ Update Available
55
+ - @engramprotocol/mcp-server: $EML_CLIENT_VERSION → $SERVER_VER available
56
+ - **Run** \`npx @engramprotocol/mcp-server setup update\`, **or ask me to update for you** — I'll run it on your behalf.
57
+
58
+ EOF
59
+ fi
60
+
61
+ # --- 7. Emit boot markdown + log success -----------------------------------
62
+ echo "$RESPONSE" | jq -r '.markdown'
63
+ echo "[$TS] OK ver=$SERVER_VER bytes=$(echo "$RESPONSE" | wc -c)" >> "$LOG_FILE"
@@ -0,0 +1,78 @@
1
+ #!/usr/bin/env bash
2
+ # managed-by: engramprotocol-setup
3
+ #
4
+ # UserPromptSubmit-Hook: Mid-session reminder to keep the model anchored in EML
5
+ # patterns. Claude Code fires this hook on every user message. The hook decides
6
+ # whether to print the reminder (when a trigger condition matches) or stay silent.
7
+ #
8
+ # Triggers (any one suffices):
9
+ # - turn == 1 (initial reminder at session start; SessionStart-Hook already
10
+ # loaded SYSTEM_RULES + brain state, so one reinforcement is enough)
11
+ # - turn % 5 == 0 (every 5th turn — anti-drift cadence)
12
+ # - counter file mtime > 1h ago (session resumed after pause)
13
+ #
14
+ # State files (per v0.10.0-PROPOSAL B.4.1):
15
+ # /tmp/eml-turns/<session_id> turn counter
16
+ # ~/.eml/logs/user-prompt-submit-*.log debug log (self-rotating per day)
17
+ #
18
+ # Local-only, no HTTP. Reminder content lives inline as heredoc — single source of
19
+ # truth, evolves with the npm-package via `setup update`.
20
+
21
+ set -eu
22
+
23
+ LOG_DIR="$HOME/.eml/logs"
24
+ TURNS_DIR="/tmp/eml-turns"
25
+
26
+ mkdir -p "$LOG_DIR" "$TURNS_DIR"
27
+ LOG_FILE="$LOG_DIR/user-prompt-submit-$(date -u +%Y-%m-%d).log"
28
+ TS=$(date -u +%Y-%m-%dT%H:%M:%SZ)
29
+
30
+ # --- 1. Parse stdin for session_id -----------------------------------------
31
+ STDIN=$(cat || true)
32
+ SESSION_ID=$(echo "$STDIN" | jq -r '.session_id // empty' 2>/dev/null || true)
33
+
34
+ if [ -z "$SESSION_ID" ]; then
35
+ echo "[$TS] no session_id in stdin, silent" >> "$LOG_FILE"
36
+ exit 0
37
+ fi
38
+
39
+ COUNTER_FILE="$TURNS_DIR/$SESSION_ID"
40
+
41
+ # --- 2. Read counter + detect long pause -----------------------------------
42
+ RESUMED_AFTER_PAUSE=0
43
+ if [ -f "$COUNTER_FILE" ]; then
44
+ TURN=$(cat "$COUNTER_FILE" 2>/dev/null || echo 0)
45
+ # mtime — macOS uses `stat -f %m`, Linux uses `stat -c %Y`
46
+ MTIME=$(stat -f %m "$COUNTER_FILE" 2>/dev/null || stat -c %Y "$COUNTER_FILE" 2>/dev/null || echo 0)
47
+ NOW=$(date +%s)
48
+ ELAPSED=$((NOW - MTIME))
49
+ if [ "$ELAPSED" -gt 3600 ]; then RESUMED_AFTER_PAUSE=1; fi
50
+ else
51
+ TURN=0
52
+ fi
53
+
54
+ TURN=$((TURN + 1))
55
+ echo "$TURN" > "$COUNTER_FILE"
56
+
57
+ # --- 3. Trigger decision ---------------------------------------------------
58
+ SHOULD_REMIND=0
59
+ if [ "$TURN" -eq 1 ]; then SHOULD_REMIND=1; fi
60
+ if [ "$((TURN % 5))" -eq 0 ]; then SHOULD_REMIND=1; fi
61
+ if [ "$RESUMED_AFTER_PAUSE" -eq 1 ]; then SHOULD_REMIND=1; fi
62
+
63
+ if [ "$SHOULD_REMIND" -eq 0 ]; then
64
+ echo "[$TS] silent turn=$TURN sid=$SESSION_ID" >> "$LOG_FILE"
65
+ exit 0
66
+ fi
67
+
68
+ # --- 4. Emit reminder (invisible-in-chat, in-model-context per Spike-2) ----
69
+ cat <<'EOF'
70
+ [EML Reminder]
71
+ - Store-worthy moments (decisions, status changes, tasks, events, feedback rules) → use the matching typed tool (eml_decide / eml_set_status / eml_track_task / eml_note).
72
+ - Question about customer / project / topic? eml_recall or eml_show first — don't guess from conversation memory.
73
+ - Before write: matching active engram exists? skip, or supersede via eml_update (don't duplicate).
74
+ - Routine updates: act + inform in 1-2 lines, no permission-asking.
75
+ - EML brain is the canonical knowledge base — check it before falling back to conversation memory.
76
+ EOF
77
+
78
+ echo "[$TS] OK turn=$TURN sid=$SESSION_ID reminded (pause=$RESUMED_AFTER_PAUSE)" >> "$LOG_FILE"