@roomi-fields/notebooklm-mcp 1.7.0 → 1.7.2

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
@@ -4,7 +4,7 @@
4
4
 
5
5
  **Automate Google NotebookLM at scale. 33-endpoint HTTP REST API for n8n / Zapier / Make / curl, plus an MCP server for Claude Code / Cursor / Codex. Citation-backed Q&A, full Studio generation (audio · video · infographic · report · presentation · data table), multi-account rotation with auto-reauth.**
6
6
 
7
- > v1.7.0 — production-grade, batch-tested on overnight runs of 1 000+ questions. New: `batch_to_vault` is now a first-class MCP tool (no HTTP server required) on top of the existing `POST /batch-to-vault` endpoint. See [RTFM integration](./deployment/docs/14-RTFM-INTEGRATION.md) for the full pattern. [Compare with `PleasePrompto/notebooklm-mcp` v2.0.0](https://roomi-fields.github.io/notebooklm-mcp/compare) to see when this project is the right pick (REST API, full Studio, auto-reauth) and when the MCP-only upstream is.
7
+ > v1.7.2 — production-grade, batch-tested on overnight runs of 1 000+ questions. New: `batch_to_vault` is now a first-class MCP tool (no HTTP server required) on top of the existing `POST /batch-to-vault` endpoint. See [RTFM integration](./deployment/docs/14-RTFM-INTEGRATION.md) for the full pattern. [Compare with `PleasePrompto/notebooklm-mcp` v2.0.0](https://roomi-fields.github.io/notebooklm-mcp/compare) to see when this project is the right pick (REST API, full Studio, auto-reauth) and when the MCP-only upstream is.
8
8
 
9
9
  <!-- Badges -->
10
10
 
@@ -72,6 +72,17 @@ Generate multiple content types from your notebook sources:
72
72
 
73
73
  ## Quick Start
74
74
 
75
+ ### Option 0 — Claude Code marketplace (one-liner, recommended for Claude Code users)
76
+
77
+ The fastest way to get NotebookLM into Claude Code. Distributed via the [`roomi-fields/claude-plugins`](https://github.com/roomi-fields/claude-plugins) marketplace alongside [RTFM](https://github.com/roomi-fields/rtfm) (the retrieval companion — see [RTFM integration guide](./deployment/docs/14-RTFM-INTEGRATION.md)):
78
+
79
+ ```text
80
+ /plugin marketplace add roomi-fields/claude-plugins
81
+ /plugin install notebooklm@roomi-fields
82
+ ```
83
+
84
+ That registers the MCP server, runs `npx -y @roomi-fields/notebooklm-mcp` automatically on first use (Node ≥ 18 required), and keeps you in sync with releases via `/plugin update`. Then run `npm run setup-auth` once to log into Google. To install RTFM at the same time: `/plugin install rtfm@roomi-fields`.
85
+
75
86
  ### Option 1 — HTTP REST API (n8n, Zapier, Make, curl, any HTTP client)
76
87
 
77
88
  ```bash
@@ -163,6 +174,7 @@ See [ROADMAP.md](./ROADMAP.md) for planned features and version history.
163
174
 
164
175
  **Latest releases:**
165
176
 
177
+ - **v1.7.2** — Claude Code plugin manifest (`.claude-plugin/plugin.json`) + cross-file version sync script enforced in CI; README "Install via Claude Code marketplace" one-liner
166
178
  - **v1.7.0** — `batch_to_vault` exposed as a first-class MCP tool (parity with the HTTP endpoint, no localhost server required); shared `runBatchToVault` helper deduplicates the loop across both transports
167
179
  - **v1.6.0** — `/batch-to-vault` endpoint + RTFM integration (`nblm-answer-v1` JSON Schema published at [schemas.roomi-fields.com/nblm-answer-v1.json](https://schemas.roomi-fields.com/nblm-answer-v1.json)) for caching NotebookLM answers as a searchable markdown vault
168
180
  - **v1.5.9** — Restore `mcpName` field for MCP Registry npm-package ownership verification
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roomi-fields/notebooklm-mcp",
3
- "version": "1.7.0",
3
+ "version": "1.7.2",
4
4
  "mcpName": "io.github.roomi-fields/notebooklm-mcp",
5
5
  "description": "MCP server for NotebookLM API with HTTP REST API - Zero hallucinations from your notebooks",
6
6
  "type": "module",
@@ -20,6 +20,8 @@
20
20
  "dev:http": "tsx watch src/http-wrapper.ts",
21
21
  "dev:proxy": "tsx watch src/stdio-http-proxy.ts",
22
22
  "build": "tsc && npm run build:i18n",
23
+ "version:sync": "node scripts/sync-version.mjs",
24
+ "version:check": "node scripts/sync-version.mjs --check",
23
25
  "build:i18n": "node -e \"require('fs').cpSync('src/i18n', 'dist/i18n', {recursive: true, filter: (s) => s.endsWith('.json') || require('fs').statSync(s).isDirectory()})\"",
24
26
  "watch": "tsc --watch",
25
27
  "dev": "tsx watch src/index.ts",
@@ -0,0 +1,95 @@
1
+ #!/usr/bin/env node
2
+ /**
3
+ * Sync the version from package.json to every other file that ships it:
4
+ * - .claude-plugin/plugin.json (Claude Code plugin manifest)
5
+ * - website/docusaurus.config.ts (schema.org softwareVersion)
6
+ * - README.md (hero "v1.x.x — ..." line)
7
+ *
8
+ * Usage:
9
+ * node scripts/sync-version.mjs # rewrite drifted files in place
10
+ * node scripts/sync-version.mjs --check # exit 1 if anything would change (CI guard)
11
+ *
12
+ * Run after bumping package.json. The CI release workflow runs --check so a
13
+ * release can never ship with a stale plugin manifest or website badge.
14
+ */
15
+
16
+ import { readFileSync, writeFileSync } from 'node:fs';
17
+ import { fileURLToPath } from 'node:url';
18
+ import { dirname, join } from 'node:path';
19
+
20
+ const ROOT = join(dirname(fileURLToPath(import.meta.url)), '..');
21
+ const checkOnly = process.argv.includes('--check');
22
+
23
+ const pkg = JSON.parse(readFileSync(join(ROOT, 'package.json'), 'utf-8'));
24
+ const VERSION = pkg.version;
25
+ if (!VERSION) {
26
+ console.error('package.json has no version field');
27
+ process.exit(2);
28
+ }
29
+
30
+ /** @type {Array<{path: string, label: string, transform: (s: string) => string}>} */
31
+ const targets = [
32
+ {
33
+ path: '.claude-plugin/plugin.json',
34
+ label: 'plugin manifest',
35
+ // Regex replace (not reparse+reserialize) so prettier-controlled
36
+ // formatting decisions (e.g. keywords array on one line vs many) are
37
+ // preserved between releases and don't trigger phantom drift.
38
+ transform: (s) =>
39
+ s.replace(
40
+ /^(\s*"version":\s*)"\d+\.\d+\.\d+"/m,
41
+ `$1"${VERSION}"`
42
+ ),
43
+ },
44
+ {
45
+ path: 'website/docusaurus.config.ts',
46
+ label: 'docusaurus softwareVersion',
47
+ transform: (s) =>
48
+ s.replace(
49
+ /softwareVersion:\s*'[^']+'/,
50
+ `softwareVersion: '${VERSION}'`
51
+ ),
52
+ },
53
+ {
54
+ path: 'README.md',
55
+ label: 'README hero version',
56
+ transform: (s) =>
57
+ s.replace(/(>\s*v)\d+\.\d+\.\d+(\s+—)/, `$1${VERSION}$2`),
58
+ },
59
+ ];
60
+
61
+ let drifted = 0;
62
+ for (const target of targets) {
63
+ const fullPath = join(ROOT, target.path);
64
+ const original = readFileSync(fullPath, 'utf-8');
65
+ const updated = target.transform(original);
66
+
67
+ if (original === updated) {
68
+ console.log(`✓ ${target.path} already at ${VERSION} (${target.label})`);
69
+ continue;
70
+ }
71
+
72
+ drifted++;
73
+ if (checkOnly) {
74
+ console.error(`✗ DRIFT in ${target.path} (${target.label})`);
75
+ } else {
76
+ writeFileSync(fullPath, updated, 'utf-8');
77
+ console.log(`→ ${target.path} synced to ${VERSION} (${target.label})`);
78
+ }
79
+ }
80
+
81
+ if (checkOnly && drifted > 0) {
82
+ console.error(
83
+ `\n${drifted} file(s) out of sync with package.json@${VERSION}. ` +
84
+ `Run "npm run version:sync" locally and commit.`
85
+ );
86
+ process.exit(1);
87
+ }
88
+
89
+ if (!checkOnly) {
90
+ console.log(
91
+ drifted === 0
92
+ ? `\nAll files already at ${VERSION}.`
93
+ : `\nSynced ${drifted} file(s) to ${VERSION}.`
94
+ );
95
+ }