@roomi-fields/notebooklm-mcp 1.5.9 → 1.7.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.
@@ -0,0 +1,214 @@
1
+ /**
2
+ * Vault writer — formats NotebookLM answers as RTFM-ingestable markdown files
3
+ *
4
+ * Each answer is written as two artifacts:
5
+ * - {slug}.md — markdown with YAML frontmatter (human + RTFM markdown parser)
6
+ * - {slug}.json — structured payload conforming to nblm-answer-v1 schema
7
+ *
8
+ * Schema URL: https://schemas.roomi-fields.com/nblm-answer-v1.json
9
+ */
10
+ import { promises as fs } from 'fs';
11
+ import path from 'path';
12
+ export const NBLM_ANSWER_SCHEMA_URL = 'https://schemas.roomi-fields.com/nblm-answer-v1.json';
13
+ /**
14
+ * Slugify a question into a filesystem-safe filename component.
15
+ * Truncates to ~80 chars and prefixes with a zero-padded index.
16
+ */
17
+ export function makeSlug(question, prefix, index) {
18
+ const base = question
19
+ .toLowerCase()
20
+ .normalize('NFD')
21
+ .replace(/[̀-ͯ]/g, '')
22
+ .replace(/[^a-z0-9\s-]/g, '')
23
+ .replace(/\s+/g, '-')
24
+ .replace(/-+/g, '-')
25
+ .substring(0, 80)
26
+ .replace(/-+$/, '')
27
+ .replace(/^-+/, '');
28
+ const idx = String(index + 1).padStart(3, '0');
29
+ const cleanBase = base || 'question';
30
+ return prefix ? `${prefix}-${idx}-${cleanBase}` : `${idx}-${cleanBase}`;
31
+ }
32
+ /**
33
+ * Escape a string for safe use as a YAML scalar value.
34
+ * Wraps in double quotes and escapes backslashes + double quotes.
35
+ */
36
+ function yamlString(s) {
37
+ return `"${s.replace(/\\/g, '\\\\').replace(/"/g, '\\"')}"`;
38
+ }
39
+ /**
40
+ * Format a NotebookLM answer as a vault-ready markdown document
41
+ * with YAML frontmatter compatible with RTFM's markdown parser.
42
+ */
43
+ export function formatAnswerMarkdown(data, notebookMeta, askedAt) {
44
+ const citations = data.sources?.citations ?? [];
45
+ const sourceNames = Array.from(new Set(citations.map((c) => c.sourceName).filter((s) => Boolean(s))));
46
+ const frontmatterLines = ['---'];
47
+ frontmatterLines.push(`title: ${yamlString(data.question)}`);
48
+ frontmatterLines.push(`type: nblm-answer`);
49
+ frontmatterLines.push(`asked_at: ${askedAt}`);
50
+ if (notebookMeta.id)
51
+ frontmatterLines.push(`notebook_id: ${yamlString(notebookMeta.id)}`);
52
+ if (notebookMeta.name)
53
+ frontmatterLines.push(`notebook_name: ${yamlString(notebookMeta.name)}`);
54
+ if (notebookMeta.url || data.notebook_url) {
55
+ frontmatterLines.push(`notebook_url: ${yamlString(notebookMeta.url ?? data.notebook_url)}`);
56
+ }
57
+ if (data.session_id)
58
+ frontmatterLines.push(`session_id: ${yamlString(data.session_id)}`);
59
+ frontmatterLines.push(`citations_count: ${citations.length}`);
60
+ if (sourceNames.length > 0) {
61
+ frontmatterLines.push('sources:');
62
+ for (const name of sourceNames) {
63
+ frontmatterLines.push(` - ${yamlString(name)}`);
64
+ }
65
+ }
66
+ frontmatterLines.push('---');
67
+ const sourcesBlock = citations.length > 0
68
+ ? '\n\n## Sources\n\n' +
69
+ citations
70
+ .map((c) => {
71
+ const name = c.sourceName ?? 'Unknown source';
72
+ const text = (c.sourceText ?? '').trim();
73
+ const quoted = text ? text.replace(/\r?\n/g, '\n> ') : '_(no excerpt)_';
74
+ return `### [${c.number}] ${name}\n\n> ${quoted}`;
75
+ })
76
+ .join('\n\n')
77
+ : '';
78
+ const notebookLink = notebookMeta.url || data.notebook_url
79
+ ? `\n\n> Asked on ${askedAt} against [${notebookMeta.name ?? 'NotebookLM notebook'}](${notebookMeta.url ?? data.notebook_url})`
80
+ : '';
81
+ return `${frontmatterLines.join('\n')}
82
+
83
+ # ${data.question}${notebookLink}
84
+
85
+ ## Answer
86
+
87
+ ${data.answer}${sourcesBlock}
88
+ `;
89
+ }
90
+ /**
91
+ * Build the structured JSON payload (sidecar) for a NotebookLM answer.
92
+ * Conforms to nblm-answer-v1 schema.
93
+ */
94
+ export function formatAnswerJson(data, notebookMeta, askedAt) {
95
+ const citations = data.sources?.citations ?? [];
96
+ const sourceNames = Array.from(new Set(citations.map((c) => c.sourceName).filter((s) => Boolean(s))));
97
+ return {
98
+ $schema: NBLM_ANSWER_SCHEMA_URL,
99
+ type: 'nblm-answer',
100
+ version: '1.0',
101
+ asked_at: askedAt,
102
+ session_id: data.session_id ?? null,
103
+ notebook: {
104
+ id: notebookMeta.id ?? null,
105
+ name: notebookMeta.name ?? null,
106
+ url: notebookMeta.url ?? data.notebook_url ?? null,
107
+ },
108
+ question: data.question,
109
+ answer: {
110
+ text: data.answer,
111
+ format: 'markdown',
112
+ },
113
+ citations: citations.map((c) => ({
114
+ marker: c.marker,
115
+ number: c.number,
116
+ source_name: c.sourceName ?? null,
117
+ source_text: c.sourceText ?? null,
118
+ })),
119
+ metadata: {
120
+ tags: [],
121
+ extraction_success: data.sources?.extraction_success ?? null,
122
+ citations_count: citations.length,
123
+ source_names: sourceNames,
124
+ },
125
+ };
126
+ }
127
+ /**
128
+ * Run a batch of questions and persist each answer as `{slug}.md` + `{slug}.json`
129
+ * in `vault_dir`. Shared between the HTTP `/batch-to-vault` endpoint and the
130
+ * `batch_to_vault` MCP tool — the only difference between callers is the
131
+ * `askQuestion` function passed in (both wrap `ToolHandlers.handleAskQuestion`).
132
+ */
133
+ export async function runBatchToVault(args, askQuestion, logger) {
134
+ const { questions, vault_dir, notebook_id, notebook_url, slug_prefix = '', source_format = 'json', sleep_between_ms = 0, session_id, } = args;
135
+ const absVaultDir = path.resolve(vault_dir);
136
+ await fs.mkdir(absVaultDir, { recursive: true });
137
+ const results = [];
138
+ let currentSession = session_id;
139
+ const notebookMeta = {};
140
+ for (let i = 0; i < questions.length; i++) {
141
+ const q = questions[i];
142
+ logger?.info?.(`[${i + 1}/${questions.length}] ${String(q).substring(0, 80)}`);
143
+ try {
144
+ const askResult = await askQuestion({
145
+ question: q,
146
+ session_id: currentSession,
147
+ notebook_id,
148
+ notebook_url,
149
+ source_format,
150
+ });
151
+ if (!askResult?.success || !askResult.data || askResult.data.status !== 'success') {
152
+ const errMsg = askResult?.error ||
153
+ (askResult?.data && 'error' in askResult.data ? askResult.data.error : 'Unknown error');
154
+ results.push({
155
+ question: q,
156
+ md_path: '',
157
+ json_path: '',
158
+ success: false,
159
+ citations_count: 0,
160
+ error: errMsg,
161
+ });
162
+ continue;
163
+ }
164
+ const data = askResult.data;
165
+ if (data.session_id)
166
+ currentSession = data.session_id;
167
+ if (!notebookMeta.url && data.notebook_url)
168
+ notebookMeta.url = data.notebook_url;
169
+ if (!notebookMeta.id && notebook_id)
170
+ notebookMeta.id = notebook_id;
171
+ const askedAt = new Date().toISOString();
172
+ const slug = makeSlug(q, slug_prefix, i);
173
+ const mdPath = path.join(absVaultDir, `${slug}.md`);
174
+ const jsonPath = path.join(absVaultDir, `${slug}.json`);
175
+ const markdown = formatAnswerMarkdown(data, notebookMeta, askedAt);
176
+ const jsonPayload = formatAnswerJson(data, notebookMeta, askedAt);
177
+ await fs.writeFile(mdPath, markdown, 'utf-8');
178
+ await fs.writeFile(jsonPath, JSON.stringify(jsonPayload, null, 2), 'utf-8');
179
+ results.push({
180
+ question: q,
181
+ md_path: mdPath,
182
+ json_path: jsonPath,
183
+ success: true,
184
+ citations_count: data.sources?.citations.length ?? 0,
185
+ });
186
+ }
187
+ catch (err) {
188
+ const msg = err instanceof Error ? err.message : String(err);
189
+ logger?.error?.(`[${i + 1}] failed: ${msg}`);
190
+ results.push({
191
+ question: q,
192
+ md_path: '',
193
+ json_path: '',
194
+ success: false,
195
+ citations_count: 0,
196
+ error: msg,
197
+ });
198
+ }
199
+ if (sleep_between_ms > 0 && i < questions.length - 1) {
200
+ await new Promise((r) => setTimeout(r, sleep_between_ms));
201
+ }
202
+ }
203
+ const succeeded = results.filter((r) => r.success).length;
204
+ return {
205
+ vault_dir: absVaultDir,
206
+ total: questions.length,
207
+ succeeded,
208
+ failed: questions.length - succeeded,
209
+ session_id: currentSession,
210
+ notebook: notebookMeta,
211
+ files: results,
212
+ };
213
+ }
214
+ //# sourceMappingURL=vault-writer.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"vault-writer.js","sourceRoot":"","sources":["../../src/utils/vault-writer.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,84 @@
1
+ # MCP Directories & Registries
2
+
3
+ Tracking of all directories where `@roomi-fields/notebooklm-mcp` is listed or submitted.
4
+
5
+ ## Currently Listed
6
+
7
+ | Directory | URL | Notes |
8
+ | ------------------------- | ---------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------- |
9
+ | **Glama.ai** | [glama.ai/mcp/servers/@roomi-fields/notebooklm-mcp](https://glama.ai/mcp/servers/@roomi-fields/notebooklm-mcp) | Security A, Quality A, License A. Auto-indexed. |
10
+ | **PulseMCP** | [pulsemcp.com/servers/pleaseprompto-notebooklm](https://www.pulsemcp.com/servers/pleaseprompto-notebooklm) | #163 global, ~177k visitors. Auto-aggregated. |
11
+ | **mcpservers.org** | [mcpservers.org/servers/roomi-fields/notebooklm-mcp](https://mcpservers.org/servers/roomi-fields/notebooklm-mcp) | Full listing. Auto-indexed. |
12
+ | **MCPMarket.com** | [mcpmarket.com/server/notebooklm](https://mcpmarket.com/server/notebooklm) | Has Top 100 leaderboard. |
13
+ | **LobeHub** | [lobehub.com/mcp/roomi-fields-notebooklm-mcp](https://lobehub.com/mcp/roomi-fields-notebooklm-mcp) | Auto-indexed. |
14
+ | **npm** | [npmjs.com/package/@roomi-fields/notebooklm-mcp](https://www.npmjs.com/package/@roomi-fields/notebooklm-mcp) | v1.5.7 published with `mcpName` field. |
15
+ | **Official MCP Registry** | [registry.modelcontextprotocol.io](https://registry.modelcontextprotocol.io/) | `io.github.roomi-fields/notebooklm-mcp` v1.5.7, status active. |
16
+ | **Cursor Directory** | [cursor.directory/mcp/notebooklm-mcp](https://cursor.directory/mcp/notebooklm-mcp) | Submitted via web form. Live. |
17
+ | **awesome-mcp-servers** | [github.com/punkpeye/awesome-mcp-servers](https://github.com/punkpeye/awesome-mcp-servers) | 79.6k stars. Merged via [PR #2467](https://github.com/punkpeye/awesome-mcp-servers/pull/2467). |
18
+
19
+ ## Pending Review
20
+
21
+ | Directory | Submission | Date | Link |
22
+ | --------------------- | ------------------- | ---------- | ---------------------------------------------------------------------------- |
23
+ | **Cline Marketplace** | Issue | 2026-02-27 | [Issue #703](https://github.com/cline/mcp-marketplace/issues/703) |
24
+ | **mcp.so** | Comment on Issue #1 | 2026-02-27 | [Comment](https://github.com/chatmcp/mcpso/issues/1#issuecomment-3971662494) |
25
+
26
+ ## Not Yet Submitted (Tier 2)
27
+
28
+ | Directory | How to Submit | Priority |
29
+ | -------------------------------------------- | --------------------------------------------------------- | -------- |
30
+ | **FindMCP.dev** | Web form at findmcp.dev (~2 min) | Medium |
31
+ | **wong2/awesome-mcp-servers** (3.6k stars) | GitHub PR | Medium |
32
+ | **appcypher/awesome-mcp-servers** (5k stars) | GitHub PR | Medium |
33
+ | **MCPIndex.net** | Contact form at mcpindex.net/en/contact | Medium |
34
+ | **MCPList.ai** | Web form | Medium |
35
+ | **Docker MCP Catalog** | PR on github.com/docker/mcp-registry (needs Docker image) | Medium |
36
+ | **Windsurf Directory** | windsurf.run/mcp | Low |
37
+
38
+ ## Not Yet Submitted (Tier 3)
39
+
40
+ | Directory | How to Submit |
41
+ | ----------------------------------------------- | ---------------------------------------- |
42
+ | **MCPServerFinder.com** | Web form |
43
+ | **MCPServer.dev** | Web form |
44
+ | **MCPServe.com** | Web form at mcpserve.com/submit |
45
+ | **MCP-Server-Directory.com** | Web form |
46
+ | **MCPServers.com** | Web form |
47
+ | **MCPDir.dev** | Web form (open source, 8k+ servers) |
48
+ | **MCPServerHub.net** | Web form |
49
+ | **MCPServerHub.com** | Web form |
50
+ | **MCP-Servers-Hub.net** | Web form at mcp-servers-hub.net/submit |
51
+ | **AIAgentsList.com** | Web form at aiagentslist.com/mcp-servers |
52
+ | **APITracker.io** | Web form at apitracker.io/mcp-servers |
53
+ | **ClaudeMCP.org** | Web form |
54
+ | **ClaudeMCP.com** | Web form |
55
+ | **UBOS.tech** | GitHub PR |
56
+ | **TensorBlock/awesome-mcp-servers** (471 stars) | GitHub PR |
57
+
58
+ ## Other Actions
59
+
60
+ | Action | Status | Notes |
61
+ | -------------------------- | ------------------------------------------------------- | --------------------------------------------------------------------------- |
62
+ | **GitHub fork detachment** | Requested via GitHub Support Virtual Agent (2026-02-27) | Detach from PleasePrompto/notebooklm-mcp. Will enable Contributors sidebar. |
63
+ | **GitHub notifications** | Enabled on all 13 public repos | Watch → All Activity |
64
+ | **Cline logo** | Not yet created | 400x400 PNG needed for Cline Marketplace submission |
65
+
66
+ ## How to Complete Official MCP Registry
67
+
68
+ ```bash
69
+ cd /mnt/d/path/to/notebooklm-mcp
70
+
71
+ # 1. Login (opens browser for GitHub device flow)
72
+ ./mcp-publisher login github
73
+
74
+ # 2. Publish
75
+ ./mcp-publisher publish
76
+
77
+ # 3. Verify
78
+ curl "https://registry.modelcontextprotocol.io/v0.1/servers?search=io.github.roomi-fields/notebooklm-mcp"
79
+ ```
80
+
81
+ ## Files Related to Registry
82
+
83
+ - `server.json` — Official MCP Registry metadata
84
+ - `package.json` — Contains `mcpName: "io.github.roomi-fields/notebooklm-mcp"`
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@roomi-fields/notebooklm-mcp",
3
- "version": "1.5.9",
3
+ "version": "1.7.0",
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",