mcpscraper-memory 1.17.1 → 1.18.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/CHANGELOG.md ADDED
@@ -0,0 +1,189 @@
1
+ # Changelog
2
+
3
+ All notable changes to MCP Memory are documented here. The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.1.0/), and this project follows semantic versioning for published packages.
4
+
5
+ ## [Unreleased]
6
+
7
+ ## [1.18.0] - 2026-08-13
8
+
9
+ ### Added
10
+
11
+ - Exposed Personal Authority V2 and Blog Article through the hosted and stdio Memory template catalog.
12
+
13
+ ### Changed
14
+
15
+ - Updated the scheduled-results resource and pinned shared packages so all five registered renderer families persist, validate, and list consistently.
16
+
17
+ ## [1.17.2] - 2026-08-11
18
+
19
+ ### Changed
20
+
21
+ - Published the README and changelog with the npm artifact, added canonical repository links, and pinned the release-history repair in `mcpscraper-memory-tools` 1.14.2 without changing the 114-tool MCP contract.
22
+
23
+ ### Fixed
24
+
25
+ - Restored comparison links for every published release since 1.9.2, including the RAG-first 1.17.1 server contract.
26
+
27
+ ## [1.17.1] - 2026-08-10
28
+
29
+ ### Changed
30
+
31
+ - Standalone Memory server instructions now require hybrid Smart RAG before vault, note, or title inventories for ordinary discovery, while preserving explicit inventory, exact-note, title-only, and export exceptions.
32
+
33
+ ### Fixed
34
+
35
+ - Removed the replaceable reranking vendor name from public server instructions.
36
+ - Made MCP Scraper schema generation create its output directory, skip multi-tool modules owned by dedicated registries, and fail closed instead of writing a partial contract after extraction errors.
37
+
38
+ ## [1.17.0] - 2026-08-05
39
+
40
+ ### Added
41
+
42
+ - Exposed the registered Personal Authority preset and renderer-specific template configuration through hosted and stdio Memory clients.
43
+
44
+ ### Changed
45
+
46
+ - Generalized the scheduled-results resource around multiple registered template families and pinned `mcpscraper-memory-db@1.13.1` plus `mcpscraper-memory-tools@1.14.0`.
47
+
48
+ ## [1.16.2] - 2026-08-03
49
+
50
+ ### Fixed
51
+
52
+ - Pinned `mcpscraper-memory-tools@1.13.3` so tiny valid images receive embeddable sanitized previews instead of failing after a successful save.
53
+
54
+ ## [1.16.1] - 2026-08-03
55
+
56
+ ### Added
57
+
58
+ - Added a secret-authenticated, once-per-minute Vercel Cron invocation for the image embedding and asset-reconciliation worker.
59
+
60
+ ### Changed
61
+
62
+ - Pinned `mcpscraper-memory-db@1.12.1` and `mcpscraper-memory-tools@1.13.2` so the hosted server uses its dedicated private Vercel Blob store.
63
+
64
+ ## [1.16.0] - 2026-08-03
65
+
66
+ ### Added
67
+
68
+ - Registered governed private image projects, folders, asset lifecycle tools, and text/image/fused semantic search for hosted and stdio Memory clients.
69
+ - Added a secret-gated image worker endpoint that processes multimodal embeddings and repairs expired reservations, stale leases, quota accounting, and orphaned object-store files.
70
+
71
+ ### Changed
72
+
73
+ - Server instructions distinguish hosted Memory image organization from local filesystem delivery and make durable image preservation explicitly opt in.
74
+ - Pinned `mcpscraper-memory-db@1.12.0` and `mcpscraper-memory-tools@1.13.0` so hosted builds use the released image contracts.
75
+
76
+ ### Security
77
+
78
+ - Production image assets require a configured private object store; the service no longer falls back to ephemeral local storage in hosted environments.
79
+
80
+ ## [1.15.1] - 2026-08-03
81
+
82
+ ### Fixed
83
+
84
+ - Hosted and stdio MCP clients can list schedules created before artifact templates existed; those legacy actions now return the canonical no-artifact selection instead of failing output validation.
85
+
86
+ ## [1.15.0] - 2026-07-30
87
+
88
+ ### Added
89
+
90
+ - Registered the unified scheduled-results inbox and versioned artifact-template tools for hosted MCP clients, including stable run IDs, opened/archive state, immutable Editorial Reading Room template versions, and exact artifact selections on scheduled-action edits.
91
+ - Exposed `memory://scheduled-results-contract` so clients can discover the resource split, no-artifact semantics, embedding boundary, and view-link safety contract without parsing tool prose.
92
+
93
+ ### Changed
94
+
95
+ - The legacy per-action run-history tool now reads durable scheduled-run results first, includes their opaque `runId`, and falls back to operational receipts only for pre-rollout schedules with no result records.
96
+ - Pinned `mcpscraper-memory-db@1.11.0` and `mcpscraper-memory-tools@1.12.0` with registry-backed integrity so clean hosted builds execute the same canonical contracts.
97
+
98
+ ## [1.14.0] - 2026-07-28
99
+
100
+ ### Added
101
+
102
+ - Registered `answer-inbox-item` and `auto-optimization` so the agent inbox can be answered and the scheduled optimizer controlled from any MCP client.
103
+
104
+ ## [1.13.1] - 2026-07-28
105
+
106
+ ### Fixed
107
+
108
+ - Ships memory-tools 1.10.1 / memory-db 1.9.1 so `merge-memory-tags` no longer fails with a unique-index violation.
109
+
110
+ ## [1.13.0] - 2026-07-28
111
+
112
+ ### Added
113
+
114
+ - Registered `merge-memory-tags` on the MCP server, and exposed the tag policy once as the `memory://tag-policy` resource (previously `listResources` returned nothing) instead of repeating tag rules across every tag-writing tool description.
115
+ - New `updateScheduledActionTool` (`update-scheduled-action`): edit an existing scheduled action's description, target vault, cadence, timeOfDay, and timezone in place, preserving its id, status, and run history; cadence/time/timezone changes recompute `nextRunAt` exactly like create, vault changes require write access to the new vault, and system-managed actions are refused.
116
+ - New `listScheduledActionRunsTool` (`list-scheduled-action-runs`): per-action run history, newest first, read from the scheduler's `mem_scheduled_agent_runs` and `mem_connection_sync_runs` receipt tables in the shared memory Postgres, with per-connection failure detail for sync runs and a single last-run fallback entry when no receipts exist yet.
117
+
118
+ ## [1.12.2] - 2026-07-22
119
+
120
+ ### Fixed
121
+
122
+ - Updated the hosted and stdio services to `mcpscraper-memory-tools` 1.9.1 so scheduling-access calls normalize surrounding whitespace in the shared internal billing secret.
123
+ - Documented the canonical cross-service billing-secret contract used by MCP Memory, MCP Scraper Scheduler, and MCP Scraper.
124
+
125
+ ## [1.11.3] - 2026-07-20
126
+
127
+ ### Fixed
128
+
129
+ - Kept the runtime MCP version in sync with the published package so deployed clients can identify the People contact-card release accurately.
130
+
131
+ ## [1.11.2] - 2026-07-20
132
+
133
+ ### Added
134
+
135
+ - Published the shared People contact-card contract to hosted and stdio MCP clients, including verified Gmail/Google Calendar activity linkage to existing People hubs.
136
+
137
+ ## [1.11.1] - 2026-07-20
138
+
139
+ ### Fixed
140
+
141
+ - Corrected hosted and stdio MCP instructions so Tasks are independent Inbox todos by default and use a Project relationship only when it is known. Agents now avoid inferring a project from task wording.
142
+
143
+ ## [1.11.0] - 2026-07-20
144
+
145
+ ### Changed
146
+
147
+ - Updated the hosted and local MCP instructions to route People, Deals, Projects, Tasks, and Communications by their relationship contract, including project-required tasks and pending human approval for email drafts.
148
+ - Upgraded the shared memory database and tools dependencies to the governed 15-vault contract without moving legacy records.
149
+
150
+ ## [1.10.1] - 2026-07-20
151
+
152
+ ### Fixed
153
+
154
+ - Updated the Vault App link issuer dependency so standalone MCP Memory returns the canonical mcpscraper.dev/vault path instead of a separate subdomain.
155
+
156
+ ## [1.10.0] - 2026-07-20
157
+
158
+ ### Added
159
+
160
+ - Added the separate `get-vault-app-link` and `revoke-vault-app-link` MCP tools for the mobile-first People, Projects, and Tasks Vault App. These tools issue and revoke an independently stored bearer link without changing Omni-Chat.
161
+
162
+ ## [1.9.2] - 2026-07-17
163
+
164
+ ### Changed
165
+
166
+ - The hosted service now consumes `mcpscraper-memory-db` 1.5 and `mcpscraper-memory-tools` 1.6, aligning direct OAuth and stdio clients with the current 14-vault Smart RAG contract, including bounded multi-query retrieval, graph expansion, and Jina reranking metadata.
167
+ - Server guidance now documents the Skills vault and the exact hybrid retrieval workflow exposed by `memory-search`.
168
+
169
+ [Unreleased]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.18.0...HEAD
170
+ [1.18.0]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.17.2...v1.18.0
171
+ [1.17.2]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.17.1...v1.17.2
172
+ [1.17.1]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.17.0...v1.17.1
173
+ [1.17.0]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.16.2...v1.17.0
174
+ [1.16.2]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.16.1...v1.16.2
175
+ [1.16.1]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.16.0...v1.16.1
176
+ [1.16.0]: https://github.com/VilovietaSEO/mcp-memory/releases/tag/v1.16.0
177
+ [1.15.1]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.15.0...v1.15.1
178
+ [1.15.0]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.14.0...v1.15.0
179
+ [1.14.0]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.13.1...v1.14.0
180
+ [1.13.1]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.13.0...v1.13.1
181
+ [1.13.0]: https://github.com/VilovietaSEO/mcp-memory/compare/v1.12.2...v1.13.0
182
+ [1.12.2]: https://github.com/VilovietaSEO/mcp-memory/releases/tag/v1.12.2
183
+ [1.11.3]: https://github.com/VilovietaSEO/mcp-memory/releases/tag/v1.11.3
184
+ [1.11.2]: https://github.com/VilovietaSEO/mcp-memory/releases/tag/v1.11.2
185
+ [1.11.1]: https://github.com/VilovietaSEO/mcp-memory/releases/tag/v1.11.1
186
+ [1.11.0]: https://github.com/VilovietaSEO/mcp-memory/releases/tag/v1.11.0
187
+ [1.10.1]: https://github.com/VilovietaSEO/mcp-memory/releases/tag/v1.10.1
188
+ [1.10.0]: https://github.com/VilovietaSEO/mcp-memory/releases/tag/v1.10.0
189
+ [1.9.2]: https://github.com/VilovietaSEO/mcp-memory/releases/tag/v1.9.2
package/package.json CHANGED
@@ -1,14 +1,22 @@
1
1
  {
2
2
  "name": "mcpscraper-memory",
3
- "version": "1.17.1",
3
+ "version": "1.18.0",
4
4
  "description": "mcp-memory — a hosted, multi-tenant, access-controlled per-user Obsidian/Neon memory exposed AS an MCP server, with a scheduled optimization layer. Its own standalone MCP product.",
5
5
  "type": "module",
6
6
  "bin": {
7
7
  "mcpscraper-memory": "dist/bin/mcp-stdio-server.js"
8
8
  },
9
9
  "files": [
10
- "dist"
10
+ "dist",
11
+ "README.md",
12
+ "CHANGELOG.md"
11
13
  ],
14
+ "repository": {
15
+ "type": "git",
16
+ "url": "https://github.com/VilovietaSEO/mcp-memory.git"
17
+ },
18
+ "homepage": "https://github.com/VilovietaSEO/mcp-memory#readme",
19
+ "bugs": "https://github.com/VilovietaSEO/mcp-memory/issues",
12
20
  "engines": {
13
21
  "node": ">=22.13.0"
14
22
  },
@@ -25,8 +33,8 @@
25
33
  "@mastra/mcp": "latest",
26
34
  "@mastra/pg": "latest",
27
35
  "@modelcontextprotocol/sdk": "^1.29.0",
28
- "mcpscraper-memory-db": "1.13.1",
29
- "mcpscraper-memory-tools": "1.14.1",
36
+ "mcpscraper-memory-db": "1.14.0",
37
+ "mcpscraper-memory-tools": "1.15.0",
30
38
  "zod": "^3.25.0"
31
39
  },
32
40
  "devDependencies": {
@@ -1,123 +0,0 @@
1
- #!/usr/bin/env node
2
-
3
- // bin/mcp-stdio-server.ts
4
- import { readFileSync } from "fs";
5
- import { homedir } from "os";
6
- import { join } from "path";
7
- import { Server } from "@modelcontextprotocol/sdk/server/index.js";
8
- import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
9
- import { ListToolsRequestSchema, CallToolRequestSchema } from "@modelcontextprotocol/sdk/types.js";
10
-
11
- // src/version.ts
12
- var PACKAGE_VERSION = "1.17.1";
13
-
14
- // bin/mcp-stdio-server.ts
15
- var wantsHelp = process.argv.includes("--help") || process.argv.includes("-h");
16
- var forceStdio = process.argv.includes("--stdio") || process.env.MCP_MEMORY_FORCE_STDIO === "1";
17
- var interactiveTerminal = Boolean(process.stdin.isTTY && process.stdout.isTTY);
18
- function readApiKeyFile() {
19
- const explicitPath = process.env.MCP_MEMORY_KEY_PATH?.trim();
20
- const paths = [explicitPath, join(homedir(), ".mcp-memory-key")].filter(Boolean);
21
- for (const path of paths) {
22
- try {
23
- const value = readFileSync(path, "utf8").trim();
24
- if (value) return value;
25
- } catch {
26
- }
27
- }
28
- return void 0;
29
- }
30
- var apiKey = (process.env.MCP_MEMORY_API_KEY ?? process.env.MCP_MEMORY_KEY ?? readApiKeyFile())?.trim();
31
- function renderHelp() {
32
- const status = apiKey ? "configured" : "NOT configured";
33
- return [
34
- `mcp-memory v${PACKAGE_VERSION} \u2014 local stdio bridge to memory.mcpscraper.dev`,
35
- "",
36
- `API key: ${status}`,
37
- "",
38
- "This package is a thin proxy: every tool call is forwarded over HTTPS to",
39
- "your hosted mcp-memory account, the same one used by the OAuth remote",
40
- "connector. Nothing runs or is stored locally.",
41
- "",
42
- "Setup:",
43
- " 1. Get your key from memory.mcpscraper.dev (or the mobile automations link).",
44
- " 2. Set it: export MCP_MEMORY_API_KEY=mk_...",
45
- " (or write it to ~/.mcp-memory-key)",
46
- " 3. Add to your MCP client config:",
47
- ' { "command": "npx", "args": ["-y", "mcpscraper-memory"],',
48
- ' "env": { "MCP_MEMORY_API_KEY": "mk_..." } }',
49
- "",
50
- "Flags: --stdio (skip this screen and run directly), --help",
51
- ""
52
- ].join("\n");
53
- }
54
- if (!forceStdio && (interactiveTerminal || wantsHelp)) {
55
- process.stdout.write(renderHelp());
56
- process.exit(0);
57
- }
58
- if (!apiKey) {
59
- process.stderr.write("MCP_MEMORY_API_KEY env var or ~/.mcp-memory-key is required\n");
60
- process.exit(1);
61
- }
62
- var baseUrl = (process.env.MCP_MEMORY_BASE_URL?.trim() || "https://memory.mcpscraper.dev").replace(/\/$/, "");
63
- var remoteUrl = `${baseUrl}/mcp`;
64
- var rpcId = 0;
65
- function parseRpcBody(text) {
66
- const dataLine = text.split("\n").find((line) => line.startsWith("data:"));
67
- const payload = dataLine ? dataLine.slice(5).trim() : text;
68
- return JSON.parse(payload);
69
- }
70
- async function rpc(method, params) {
71
- const res = await fetch(remoteUrl, {
72
- method: "POST",
73
- headers: {
74
- "Content-Type": "application/json",
75
- Accept: "application/json, text/event-stream",
76
- Authorization: `Bearer ${apiKey}`
77
- },
78
- body: JSON.stringify({ jsonrpc: "2.0", id: ++rpcId, method, params })
79
- });
80
- const text = await res.text();
81
- if (!res.ok) {
82
- throw new Error(`mcp-memory HTTP ${res.status}: ${text.slice(0, 500)}`);
83
- }
84
- const body = parseRpcBody(text);
85
- if (body.error) throw new Error(body.error.message ?? "remote mcp-memory error");
86
- return body.result;
87
- }
88
- async function main() {
89
- let remoteInfo = {};
90
- try {
91
- remoteInfo = await rpc("initialize", {
92
- protocolVersion: "2025-06-18",
93
- capabilities: {},
94
- clientInfo: { name: "mcp-memory-stdio-proxy", version: PACKAGE_VERSION }
95
- });
96
- } catch (err) {
97
- process.stderr.write(`Failed to reach ${remoteUrl}: ${err instanceof Error ? err.message : String(err)}
98
- `);
99
- process.exit(1);
100
- }
101
- const server = new Server(
102
- { name: "mcp-memory", version: PACKAGE_VERSION },
103
- { capabilities: { tools: {} }, instructions: remoteInfo.instructions }
104
- );
105
- server.setRequestHandler(ListToolsRequestSchema, async () => {
106
- const result = await rpc("tools/list");
107
- return { tools: result.tools };
108
- });
109
- server.setRequestHandler(CallToolRequestSchema, async (request) => {
110
- return await rpc("tools/call", {
111
- name: request.params.name,
112
- arguments: request.params.arguments
113
- });
114
- });
115
- const transport = new StdioServerTransport();
116
- await server.connect(transport);
117
- }
118
- main().catch((err) => {
119
- process.stderr.write(`${err instanceof Error ? err.message : String(err)}
120
- `);
121
- process.exit(1);
122
- });
123
- //# sourceMappingURL=mcp-stdio-server.js.map
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../bin/mcp-stdio-server.ts","../../src/version.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { readFileSync } from 'node:fs'\nimport { homedir } from 'node:os'\nimport { join } from 'node:path'\nimport { Server } from '@modelcontextprotocol/sdk/server/index.js'\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js'\nimport { ListToolsRequestSchema, CallToolRequestSchema } from '@modelcontextprotocol/sdk/types.js'\nimport { PACKAGE_VERSION } from '../src/version.js'\n\nconst wantsHelp = process.argv.includes('--help') || process.argv.includes('-h')\nconst forceStdio = process.argv.includes('--stdio') || process.env.MCP_MEMORY_FORCE_STDIO === '1'\nconst interactiveTerminal = Boolean(process.stdin.isTTY && process.stdout.isTTY)\n\nfunction readApiKeyFile(): string | undefined {\n const explicitPath = process.env.MCP_MEMORY_KEY_PATH?.trim()\n const paths = [explicitPath, join(homedir(), '.mcp-memory-key')].filter(Boolean) as string[]\n for (const path of paths) {\n try {\n const value = readFileSync(path, 'utf8').trim()\n if (value) return value\n } catch {\n void 0\n }\n }\n return undefined\n}\n\nconst apiKey = (\n process.env.MCP_MEMORY_API_KEY ??\n process.env.MCP_MEMORY_KEY ??\n readApiKeyFile()\n)?.trim()\n\nfunction renderHelp(): string {\n const status = apiKey ? 'configured' : 'NOT configured'\n return [\n `mcp-memory v${PACKAGE_VERSION} — local stdio bridge to memory.mcpscraper.dev`,\n '',\n `API key: ${status}`,\n '',\n 'This package is a thin proxy: every tool call is forwarded over HTTPS to',\n 'your hosted mcp-memory account, the same one used by the OAuth remote',\n 'connector. Nothing runs or is stored locally.',\n '',\n 'Setup:',\n ' 1. Get your key from memory.mcpscraper.dev (or the mobile automations link).',\n ' 2. Set it: export MCP_MEMORY_API_KEY=mk_...',\n ' (or write it to ~/.mcp-memory-key)',\n ' 3. Add to your MCP client config:',\n ' { \"command\": \"npx\", \"args\": [\"-y\", \"mcpscraper-memory\"],',\n ' \"env\": { \"MCP_MEMORY_API_KEY\": \"mk_...\" } }',\n '',\n 'Flags: --stdio (skip this screen and run directly), --help',\n '',\n ].join('\\n')\n}\n\nif (!forceStdio && (interactiveTerminal || wantsHelp)) {\n process.stdout.write(renderHelp())\n process.exit(0)\n}\n\nif (!apiKey) {\n process.stderr.write('MCP_MEMORY_API_KEY env var or ~/.mcp-memory-key is required\\n')\n process.exit(1)\n}\n\nconst baseUrl = (process.env.MCP_MEMORY_BASE_URL?.trim() || 'https://memory.mcpscraper.dev').replace(/\\/$/, '')\nconst remoteUrl = `${baseUrl}/mcp`\n\nlet rpcId = 0\n\nfunction parseRpcBody(text: string): { result?: unknown; error?: { message?: string } } {\n const dataLine = text.split('\\n').find((line) => line.startsWith('data:'))\n const payload = dataLine ? dataLine.slice(5).trim() : text\n return JSON.parse(payload)\n}\n\nasync function rpc(method: string, params?: Record<string, unknown>): Promise<unknown> {\n const res = await fetch(remoteUrl, {\n method: 'POST',\n headers: {\n 'Content-Type': 'application/json',\n Accept: 'application/json, text/event-stream',\n Authorization: `Bearer ${apiKey}`,\n },\n body: JSON.stringify({ jsonrpc: '2.0', id: ++rpcId, method, params }),\n })\n const text = await res.text()\n if (!res.ok) {\n throw new Error(`mcp-memory HTTP ${res.status}: ${text.slice(0, 500)}`)\n }\n const body = parseRpcBody(text)\n if (body.error) throw new Error(body.error.message ?? 'remote mcp-memory error')\n return body.result\n}\n\nasync function main(): Promise<void> {\n let remoteInfo: { serverInfo?: { name?: string; version?: string }; instructions?: string } = {}\n try {\n remoteInfo = (await rpc('initialize', {\n protocolVersion: '2025-06-18',\n capabilities: {},\n clientInfo: { name: 'mcp-memory-stdio-proxy', version: PACKAGE_VERSION },\n })) as typeof remoteInfo\n } catch (err) {\n process.stderr.write(`Failed to reach ${remoteUrl}: ${err instanceof Error ? err.message : String(err)}\\n`)\n process.exit(1)\n }\n\n const server = new Server(\n { name: 'mcp-memory', version: PACKAGE_VERSION },\n { capabilities: { tools: {} }, instructions: remoteInfo.instructions },\n )\n\n server.setRequestHandler(ListToolsRequestSchema, async () => {\n const result = (await rpc('tools/list')) as { tools: unknown[] }\n return { tools: result.tools }\n })\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n return (await rpc('tools/call', {\n name: request.params.name,\n arguments: request.params.arguments,\n })) as Record<string, unknown>\n })\n\n const transport = new StdioServerTransport()\n await server.connect(transport)\n}\n\nmain().catch((err) => {\n process.stderr.write(`${err instanceof Error ? err.message : String(err)}\\n`)\n process.exit(1)\n})\n","export const PACKAGE_VERSION = '1.17.1'\n"],"mappings":"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","names":[]}