@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.
- package/README.md +55 -37
- package/deployment/docs/03-API.md +12 -3
- package/deployment/docs/12-BATCH-1000.md +165 -0
- package/deployment/docs/13-COMPARE.md +12 -0
- package/deployment/docs/14-RTFM-INTEGRATION.md +323 -0
- package/deployment/docs/openapi.yaml +492 -0
- package/dist/http-wrapper.js +48 -0
- package/dist/http-wrapper.js.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/tools/index.d.ts +16 -0
- package/dist/tools/index.d.ts.map +1 -1
- package/dist/tools/index.js +92 -0
- package/dist/tools/index.js.map +1 -1
- package/dist/utils/vault-writer.d.ts +107 -0
- package/dist/utils/vault-writer.d.ts.map +1 -0
- package/dist/utils/vault-writer.js +214 -0
- package/dist/utils/vault-writer.js.map +1 -0
- package/docs/MCP_DIRECTORIES.md +84 -0
- package/package.json +1 -1
|
@@ -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.
|
|
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",
|