@roomi-fields/notebooklm-mcp 1.5.7 → 1.5.9
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/LICENSE +22 -22
- package/README.md +219 -219
- package/deployment/INDEX.md +0 -0
- package/deployment/PACKAGE-FILES.txt +180 -180
- package/deployment/QUICK-START.md +0 -0
- package/deployment/docs/01-INSTALL.md +21 -1
- package/deployment/docs/02-CONFIGURATION.md +0 -0
- package/deployment/docs/03-API.md +16 -10
- package/deployment/docs/04-N8N-INTEGRATION.md +0 -0
- package/deployment/docs/05-TROUBLESHOOTING.md +19 -1
- package/deployment/docs/06-NOTEBOOK-LIBRARY.md +9 -9
- package/deployment/docs/07-AUTO-DISCOVERY.md +6 -15
- package/deployment/docs/08-DOCKER.md +0 -0
- package/deployment/docs/08-WSL-USAGE.md +7 -7
- package/deployment/docs/09-MULTI-INTERFACE.md +6 -6
- package/deployment/docs/10-CONTENT-MANAGEMENT.md +15 -19
- package/deployment/docs/11-MULTI-ACCOUNT.md +1 -1
- package/deployment/docs/README.md +4 -50
- package/deployment/scripts/README.md +0 -0
- package/deployment/scripts/install.ps1 +114 -114
- package/deployment/scripts/setup-auth.ps1 +217 -217
- package/deployment/scripts/start-server.ps1 +72 -72
- package/deployment/scripts/stop-server.ps1 +51 -51
- package/deployment/scripts/test-api.ps1 +651 -651
- package/deployment/scripts/test-auth.ps1 +0 -0
- package/deployment/scripts/test-auto-discovery.ps1 +295 -295
- package/deployment/scripts/test-cors.ps1 +398 -398
- package/deployment/scripts/test-errors.ps1 +581 -581
- package/deployment/scripts/test-server.ps1 +140 -140
- package/deployment/scripts/test-sessions.ps1 +426 -426
- package/deployment/scripts/test-validation.ps1 +299 -299
- package/dist/accounts/account-manager.d.ts +0 -0
- package/dist/accounts/account-manager.d.ts.map +0 -0
- package/dist/accounts/account-manager.js +0 -0
- package/dist/accounts/account-manager.js.map +0 -0
- package/dist/accounts/auto-login-manager.d.ts +0 -0
- package/dist/accounts/auto-login-manager.d.ts.map +0 -0
- package/dist/accounts/auto-login-manager.js +0 -0
- package/dist/accounts/auto-login-manager.js.map +0 -0
- package/dist/accounts/crypto.d.ts +0 -0
- package/dist/accounts/crypto.d.ts.map +0 -0
- package/dist/accounts/crypto.js +0 -0
- package/dist/accounts/crypto.js.map +0 -0
- package/dist/accounts/index.d.ts +0 -0
- package/dist/accounts/index.d.ts.map +0 -0
- package/dist/accounts/index.js +0 -0
- package/dist/accounts/index.js.map +0 -0
- package/dist/accounts/types.d.ts +0 -0
- package/dist/accounts/types.d.ts.map +0 -0
- package/dist/accounts/types.js +0 -0
- package/dist/accounts/types.js.map +0 -0
- package/dist/auth/auth-manager.d.ts +0 -0
- package/dist/auth/auth-manager.d.ts.map +0 -0
- package/dist/auth/auth-manager.js +0 -0
- package/dist/auth/auth-manager.js.map +0 -0
- package/dist/auto-discovery/auto-discovery.d.ts +0 -0
- package/dist/auto-discovery/auto-discovery.d.ts.map +0 -0
- package/dist/auto-discovery/auto-discovery.js +0 -0
- package/dist/auto-discovery/auto-discovery.js.map +0 -0
- package/dist/cli/accounts.d.ts +0 -0
- package/dist/cli/accounts.d.ts.map +0 -0
- package/dist/cli/accounts.js +0 -0
- package/dist/cli/accounts.js.map +0 -0
- package/dist/cli/de-auth.d.ts +0 -0
- package/dist/cli/de-auth.d.ts.map +0 -0
- package/dist/cli/de-auth.js +0 -0
- package/dist/cli/de-auth.js.map +0 -0
- package/dist/cli/help.d.ts +0 -0
- package/dist/cli/help.d.ts.map +0 -0
- package/dist/cli/help.js +5 -0
- package/dist/cli/help.js.map +1 -1
- package/dist/cli/setup-auth.d.ts +0 -0
- package/dist/cli/setup-auth.d.ts.map +0 -0
- package/dist/cli/setup-auth.js +0 -0
- package/dist/cli/setup-auth.js.map +0 -0
- package/dist/config.d.ts +0 -0
- package/dist/config.d.ts.map +0 -0
- package/dist/config.js +0 -0
- package/dist/config.js.map +0 -0
- package/dist/content/content-generator.d.ts +0 -0
- package/dist/content/content-generator.d.ts.map +0 -0
- package/dist/content/content-generator.js +0 -0
- package/dist/content/content-generator.js.map +0 -0
- package/dist/content/content-manager.d.ts +8 -0
- package/dist/content/content-manager.d.ts.map +1 -1
- package/dist/content/content-manager.js +411 -67
- package/dist/content/content-manager.js.map +1 -1
- package/dist/content/content-templates.d.ts +0 -0
- package/dist/content/content-templates.d.ts.map +0 -0
- package/dist/content/content-templates.js +0 -0
- package/dist/content/content-templates.js.map +0 -0
- package/dist/content/index.d.ts +0 -0
- package/dist/content/index.d.ts.map +0 -0
- package/dist/content/index.js +0 -0
- package/dist/content/index.js.map +0 -0
- package/dist/content/types.d.ts +0 -0
- package/dist/content/types.d.ts.map +0 -0
- package/dist/content/types.js +0 -0
- package/dist/content/types.js.map +0 -0
- package/dist/errors.d.ts +0 -0
- package/dist/errors.d.ts.map +0 -0
- package/dist/errors.js +0 -0
- package/dist/errors.js.map +0 -0
- package/dist/http-wrapper.d.ts +0 -0
- package/dist/http-wrapper.d.ts.map +0 -0
- package/dist/http-wrapper.js +0 -0
- package/dist/http-wrapper.js.map +0 -0
- package/dist/i18n/en.json +0 -0
- package/dist/i18n/fr.json +0 -0
- package/dist/i18n/index.d.ts +0 -0
- package/dist/i18n/index.d.ts.map +0 -0
- package/dist/i18n/index.js +0 -0
- package/dist/i18n/index.js.map +0 -0
- package/dist/index.d.ts +0 -0
- package/dist/index.d.ts.map +0 -0
- package/dist/index.js +8 -3
- package/dist/index.js.map +1 -1
- package/dist/library/notebook-library.d.ts +0 -0
- package/dist/library/notebook-library.d.ts.map +0 -0
- package/dist/library/notebook-library.js +0 -0
- package/dist/library/notebook-library.js.map +0 -0
- package/dist/library/types.d.ts +0 -0
- package/dist/library/types.d.ts.map +0 -0
- package/dist/library/types.js +0 -0
- package/dist/library/types.js.map +0 -0
- package/dist/session/browser-session.d.ts +12 -0
- package/dist/session/browser-session.d.ts.map +1 -1
- package/dist/session/browser-session.js +156 -32
- package/dist/session/browser-session.js.map +1 -1
- package/dist/session/session-manager.d.ts +0 -0
- package/dist/session/session-manager.d.ts.map +0 -0
- package/dist/session/session-manager.js +0 -0
- package/dist/session/session-manager.js.map +0 -0
- package/dist/session/shared-context-manager.d.ts +0 -0
- package/dist/session/shared-context-manager.d.ts.map +0 -0
- package/dist/session/shared-context-manager.js +0 -0
- package/dist/session/shared-context-manager.js.map +0 -0
- package/dist/startup/startup-manager.d.ts +0 -0
- package/dist/startup/startup-manager.d.ts.map +0 -0
- package/dist/startup/startup-manager.js +0 -0
- package/dist/startup/startup-manager.js.map +0 -0
- package/dist/stdio-http-proxy.d.ts +0 -0
- package/dist/stdio-http-proxy.d.ts.map +0 -0
- package/dist/stdio-http-proxy.js +7 -2
- package/dist/stdio-http-proxy.js.map +1 -1
- package/dist/tools/index.d.ts +0 -0
- package/dist/tools/index.d.ts.map +0 -0
- package/dist/tools/index.js +0 -0
- package/dist/tools/index.js.map +0 -0
- package/dist/types.d.ts +0 -0
- package/dist/types.d.ts.map +0 -0
- package/dist/types.js +0 -0
- package/dist/types.js.map +0 -0
- package/dist/utils/citation-extractor.d.ts +0 -0
- package/dist/utils/citation-extractor.d.ts.map +0 -0
- package/dist/utils/citation-extractor.js +67 -67
- package/dist/utils/citation-extractor.js.map +0 -0
- package/dist/utils/cleanup-manager.d.ts +0 -0
- package/dist/utils/cleanup-manager.d.ts.map +0 -0
- package/dist/utils/cleanup-manager.js +0 -0
- package/dist/utils/cleanup-manager.js.map +0 -0
- package/dist/utils/logger.d.ts +0 -0
- package/dist/utils/logger.d.ts.map +0 -0
- package/dist/utils/logger.js +0 -0
- package/dist/utils/logger.js.map +0 -0
- package/dist/utils/page-utils.d.ts +5 -0
- package/dist/utils/page-utils.d.ts.map +1 -1
- package/dist/utils/page-utils.js +73 -15
- package/dist/utils/page-utils.js.map +1 -1
- package/dist/utils/stealth-utils.d.ts +0 -0
- package/dist/utils/stealth-utils.d.ts.map +0 -0
- package/dist/utils/stealth-utils.js +0 -0
- package/dist/utils/stealth-utils.js.map +0 -0
- package/docs/ADDING_A_LANGUAGE.md +0 -0
- package/docs/ARCHITECTURE_MIGRATION_STUDY.md +0 -0
- package/docs/CHROME_PROFILE_LIMITATION.md +0 -0
- package/docs/MULTI_ACCOUNT_SYSTEM.md +0 -0
- package/package.json +5 -2
- package/scripts/archive/add-and-activate-notebook.ps1 +4 -4
- package/scripts/archive/add-new-notebook.ps1 +4 -4
- package/scripts/archive/add-rom1pey.ps1 +2 -2
- package/scripts/archive/add-rpmonster.ps1 +2 -2
- package/scripts/archive/add-source-debug.ps1 +1 -1
- package/scripts/archive/add-source-e2e.ps1 +1 -1
- package/scripts/archive/add-source-visible.ps1 +1 -1
- package/scripts/archive/add-test-notebook.ps1 +1 -1
- package/scripts/archive/add-test-source.ps1 +1 -1
- package/scripts/archive/capture-screen.ps1 +1 -1
- package/scripts/archive/change-language.mjs +4 -3
- package/scripts/archive/change-language.ts +5 -3
- package/scripts/archive/check-account.ps1 +0 -0
- package/scripts/archive/check-notebook-2.ps1 +0 -0
- package/scripts/archive/check-test-notebook.ps1 +0 -0
- package/scripts/archive/create-notebook-auto.ps1 +0 -0
- package/scripts/archive/create-notebook.ps1 +2 -2
- package/scripts/archive/create-rom1pey-notebook.ps1 +2 -2
- package/scripts/archive/create-rom1pey.ps1 +2 -2
- package/scripts/archive/create-test-notebook-fresh.ps1 +0 -0
- package/scripts/archive/create-test-notebook.ps1 +0 -0
- package/scripts/archive/debug-add-source-auto.ps1 +0 -0
- package/scripts/archive/debug-add-source.ps1 +0 -0
- package/scripts/archive/debug-add-text-source.ps1 +4 -4
- package/scripts/archive/debug-home.ps1 +0 -0
- package/scripts/archive/debug-selectors.ps1 +1 -1
- package/scripts/archive/debug-sources-panel.ps1 +0 -0
- package/scripts/archive/debug-ui.ps1 +0 -0
- package/scripts/archive/discover-home.ps1 +2 -2
- package/scripts/archive/kill-automation-chrome.ps1 +0 -0
- package/scripts/archive/list-my-notebooks.ps1 +0 -0
- package/scripts/archive/navigate-home-visible.ps1 +1 -1
- package/scripts/archive/navigate-home.ps1 +1 -1
- package/scripts/archive/run-e2e-english.ps1 +3 -3
- package/scripts/archive/run-e2e-rom1pey-v2.ps1 +4 -4
- package/scripts/archive/run-e2e-rom1pey.ps1 +4 -4
- package/scripts/archive/setup-english-test.ps1 +6 -6
- package/scripts/archive/setup-test-notebook.ps1 +1 -1
- package/scripts/archive/simple-add-source.ps1 +1 -1
- package/scripts/archive/t10.ps1 +1 -1
- package/scripts/archive/t20.ps1 +1 -1
- package/scripts/archive/t30.ps1 +1 -1
- package/scripts/archive/t31.ps1 +1 -1
- package/scripts/archive/t32.ps1 +1 -1
- package/scripts/archive/t39.ps1 +0 -0
- package/scripts/archive/t40.ps1 +0 -0
- package/scripts/archive/t53.ps1 +1 -1
- package/scripts/archive/t54.ps1 +0 -0
- package/scripts/archive/t55.ps1 +0 -0
- package/scripts/archive/t9.ps1 +0 -0
- package/scripts/archive/test-access.ps1 +1 -1
- package/scripts/archive/test-add-delete-source.ps1 +4 -4
- package/scripts/archive/test-add-source-visible.ps1 +1 -1
- package/scripts/archive/test-add-source.ps1 +1 -1
- package/scripts/archive/test-add-text-debug.ps1 +2 -2
- package/scripts/archive/test-add-text-source.ps1 +0 -0
- package/scripts/archive/test-add-url-source.ps1 +0 -0
- package/scripts/archive/test-ask-ascii.ps1 +0 -0
- package/scripts/archive/test-ask-cnv.ps1 +0 -0
- package/scripts/archive/test-ask-headed.ps1 +1 -1
- package/scripts/archive/test-ask-ifs.ps1 +0 -0
- package/scripts/archive/test-ask-now.ps1 +0 -0
- package/scripts/archive/test-ask-real.ps1 +0 -0
- package/scripts/archive/test-ask-visible.ps1 +0 -0
- package/scripts/archive/test-create-notebook.ps1 +0 -0
- package/scripts/archive/test-create-then-add.ps1 +0 -0
- package/scripts/archive/test-delete-source.ps1 +4 -4
- package/scripts/archive/test-e2e-notebook.ps1 +2 -2
- package/scripts/archive/test-english-notebook.ps1 +4 -4
- package/scripts/archive/test-english.ps1 +1 -1
- package/scripts/archive/test-full-custom-instructions.ps1 +1 -1
- package/scripts/archive/test-full-infographic.ps1 +1 -1
- package/scripts/archive/test-full-language.ps1 +1 -1
- package/scripts/archive/test-full-presentation.ps1 +1 -1
- package/scripts/archive/test-full-report.ps1 +1 -1
- package/scripts/archive/test-full-source-selection.ps1 +1 -1
- package/scripts/archive/test-full-video-brief.ps1 +1 -1
- package/scripts/archive/test-full-video-explainer.ps1 +1 -1
- package/scripts/archive/test-full-video-styles.ps1 +1 -1
- package/scripts/archive/test-generate-report.ps1 +0 -0
- package/scripts/archive/test-generate-study-guide.ps1 +0 -0
- package/scripts/archive/test-headed-ask.ps1 +1 -1
- package/scripts/archive/test-headed-now.ps1 +2 -2
- package/scripts/archive/test-headed.ps1 +2 -2
- package/scripts/archive/test-hello.ps1 +1 -1
- package/scripts/archive/test-i18n-studio.ps1 +0 -0
- package/scripts/archive/test-i18n.ps1 +0 -0
- package/scripts/archive/test-manual-headed.ps1 +1 -1
- package/scripts/archive/test-mathieu-quota.ps1 +1 -1
- package/scripts/archive/test-notebook-1.ps1 +0 -0
- package/scripts/archive/test-notebook-2-sources.ps1 +0 -0
- package/scripts/archive/test-notebook1.ps1 +0 -0
- package/scripts/archive/test-personal-notebook.ps1 +1 -1
- package/scripts/archive/test-rate-limit.ps1 +1 -1
- package/scripts/archive/test-real-ask.ps1 +1 -1
- package/scripts/archive/test-real-ask2.ps1 +1 -1
- package/scripts/archive/test-rom1pey.ps1 +1 -1
- package/scripts/archive/test-rotation-complete.ps1 +1 -1
- package/scripts/archive/test-rotation.ps1 +2 -2
- package/scripts/archive/test-show-browser.ps1 +1 -1
- package/scripts/archive/test-update-notebook.ps1 +1 -1
- package/scripts/archive/verify-language-slow.ps1 +1 -1
- package/scripts/archive/verify-language.ps1 +1 -1
- package/scripts/check-server.ps1 +0 -0
- package/scripts/docker-entrypoint.sh +25 -25
- package/scripts/doctor.mjs +257 -0
- package/scripts/mcp-proxy-hidden.ps1 +0 -0
- package/scripts/mcp-wsl-helper.sh +146 -146
- package/scripts/start-server-hidden.vbs +13 -10
- package/scripts/start-server.ps1 +1 -1
- package/scripts/start-vnc.sh +0 -0
- package/scripts/stop-server.bat +0 -0
- package/scripts/stop-server.ps1 +0 -0
- package/scripts/switch-account-language.sh +87 -128
- package/scripts/test-account.ps1 +0 -0
- package/docs/archive/auto-discovery-complet.md +0 -906
- package/scripts/add-totp.ts +0 -110
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Test FULL: Infographic Formats (2 tests)
|
|
2
|
-
$notebookUrl = "https://notebooklm.google.com/notebook/
|
|
2
|
+
$notebookUrl = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
3
3
|
$formats = @("horizontal", "vertical")
|
|
4
4
|
|
|
5
5
|
$passed = 0
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Test FULL: Language option (1 test)
|
|
2
|
-
$notebookUrl = "https://notebooklm.google.com/notebook/
|
|
2
|
+
$notebookUrl = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
3
3
|
|
|
4
4
|
Write-Host "`n=== Testing language = fr ===" -ForegroundColor Cyan
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Test FULL: Report Formats (2 tests)
|
|
2
|
-
$notebookUrl = "https://notebooklm.google.com/notebook/
|
|
2
|
+
$notebookUrl = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
3
3
|
$formats = @("summary", "detailed")
|
|
4
4
|
|
|
5
5
|
$passed = 0
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Test FULL: Source Selection (1 test)
|
|
2
2
|
Add-Type -AssemblyName System.Web
|
|
3
|
-
$notebookUrl = "https://notebooklm.google.com/notebook/
|
|
3
|
+
$notebookUrl = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
4
4
|
$encodedUrl = [System.Uri]::EscapeDataString($notebookUrl)
|
|
5
5
|
|
|
6
6
|
Write-Host "`n=== Testing source selection ===" -ForegroundColor Cyan
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Test FULL: Video format = brief
|
|
2
|
-
$notebookUrl = "https://notebooklm.google.com/notebook/
|
|
2
|
+
$notebookUrl = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
3
3
|
|
|
4
4
|
Write-Host "`n=== FULL TEST: Video Format = brief ===" -ForegroundColor Cyan
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Test FULL: Video format = explainer
|
|
2
|
-
$notebookUrl = "https://notebooklm.google.com/notebook/
|
|
2
|
+
$notebookUrl = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
3
3
|
|
|
4
4
|
Write-Host "`n=== FULL TEST: Video Format = explainer ===" -ForegroundColor Cyan
|
|
5
5
|
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
# Test FULL: All Video Styles (6 tests)
|
|
2
|
-
$notebookUrl = "https://notebooklm.google.com/notebook/
|
|
2
|
+
$notebookUrl = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
3
3
|
$styles = @("classroom", "documentary", "animated", "corporate", "cinematic", "minimalist")
|
|
4
4
|
|
|
5
5
|
$passed = 0
|
|
File without changes
|
|
File without changes
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
# Test /ask avec navigateur visible
|
|
2
2
|
$body = @{
|
|
3
3
|
question = "What is IFS therapy?"
|
|
4
|
-
notebook_url = "https://notebooklm.google.com/notebook/
|
|
4
|
+
notebook_url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
5
5
|
show_browser = $true
|
|
6
6
|
} | ConvertTo-Json
|
|
7
7
|
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
$body = @{
|
|
2
2
|
question = "Quel est le theme principal?"
|
|
3
|
-
notebook_url = "https://notebooklm.google.com/notebook/
|
|
3
|
+
notebook_url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
4
4
|
show_browser = $true
|
|
5
5
|
} | ConvertTo-Json
|
|
6
6
|
|
|
7
|
-
Write-Host "Lancement test HEADED avec
|
|
7
|
+
Write-Host "Lancement test HEADED avec agent-primary..."
|
|
8
8
|
$response = Invoke-RestMethod -Uri "http://localhost:3000/ask" -Method POST -ContentType "application/json" -Body $body -TimeoutSec 300
|
|
9
9
|
$response | ConvertTo-Json -Depth 3
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
$body = @{
|
|
2
2
|
question = "Quel est le theme principal?"
|
|
3
|
-
notebook_url = "https://notebooklm.google.com/notebook/
|
|
3
|
+
notebook_url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
4
4
|
headless = $false
|
|
5
5
|
} | ConvertTo-Json
|
|
6
6
|
|
|
7
|
-
Write-Host "Testing HEADED with
|
|
7
|
+
Write-Host "Testing HEADED with agent-primary..."
|
|
8
8
|
$response = Invoke-RestMethod -Uri "http://localhost:3000/ask" -Method POST -ContentType "application/json" -Body $body -TimeoutSec 180
|
|
9
9
|
$response | ConvertTo-Json -Depth 10
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
$body = @{
|
|
2
2
|
question = "Hello, what is this notebook about?"
|
|
3
|
-
notebook_url = "https://notebooklm.google.com/notebook/
|
|
3
|
+
notebook_url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000112"
|
|
4
4
|
} | ConvertTo-Json
|
|
5
5
|
|
|
6
6
|
$response = Invoke-RestMethod -Uri "http://localhost:3000/ask" -Method POST -ContentType "application/json" -Body $body -TimeoutSec 120
|
|
File without changes
|
|
File without changes
|
|
@@ -6,7 +6,7 @@ Start-Sleep -Seconds 2
|
|
|
6
6
|
# Set headed mode and start server
|
|
7
7
|
$env:HEADLESS = "false"
|
|
8
8
|
Write-Host "Starting server in HEADED mode (you'll see the browser)..."
|
|
9
|
-
Start-Process -FilePath "cmd.exe" -ArgumentList "/c cd /d D:\
|
|
9
|
+
Start-Process -FilePath "cmd.exe" -ArgumentList "/c cd /d D:\path\to\notebooklm-mcp && set HEADLESS=false && node dist/http-wrapper.js" -NoNewWindow
|
|
10
10
|
|
|
11
11
|
Write-Host "Waiting for server..."
|
|
12
12
|
Start-Sleep -Seconds 6
|
|
@@ -3,6 +3,6 @@ $body = @{
|
|
|
3
3
|
show_browser = $true
|
|
4
4
|
} | ConvertTo-Json
|
|
5
5
|
|
|
6
|
-
Write-Host "Testing with
|
|
6
|
+
Write-Host "Testing with agent-primary (should hit rate limit)..."
|
|
7
7
|
$response = Invoke-RestMethod -Uri "http://localhost:3000/ask" -Method POST -ContentType "application/json" -Body $body -TimeoutSec 120
|
|
8
8
|
$response | ConvertTo-Json -Depth 10
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
# Test access to personal notebook on port 3001
|
|
2
2
|
$body = @{
|
|
3
|
-
url = "https://notebooklm.google.com/notebook/
|
|
3
|
+
url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000113"
|
|
4
4
|
name = "Mon Notebook Perso"
|
|
5
5
|
description = "Test notebook personnel"
|
|
6
6
|
topics = @("test")
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
$body = @{
|
|
2
2
|
question = "What is IFS therapy?"
|
|
3
|
-
notebook_url = "https://notebooklm.google.com/notebook/
|
|
3
|
+
notebook_url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
4
4
|
show_browser = $true
|
|
5
5
|
} | ConvertTo-Json
|
|
6
6
|
|
|
@@ -6,7 +6,7 @@ Write-Host ""
|
|
|
6
6
|
|
|
7
7
|
# Add a test notebook
|
|
8
8
|
$notebook = @{
|
|
9
|
-
url = "https://notebooklm.google.com/notebook/
|
|
9
|
+
url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
10
10
|
name = "Test E2E"
|
|
11
11
|
description = "Notebook pour tests E2E"
|
|
12
12
|
topics = @("test", "e2e")
|
|
@@ -4,7 +4,7 @@ Write-Host ""
|
|
|
4
4
|
|
|
5
5
|
$body = @{
|
|
6
6
|
question = "What is this notebook about?"
|
|
7
|
-
notebook_url = "https://notebooklm.google.com/notebook/
|
|
7
|
+
notebook_url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
8
8
|
} | ConvertTo-Json
|
|
9
9
|
|
|
10
10
|
Write-Host "Asking question with direct notebook URL..."
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
$body = @{
|
|
2
2
|
question = "Hello"
|
|
3
|
-
notebook_url = "https://notebooklm.google.com/notebook/
|
|
3
|
+
notebook_url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000107"
|
|
4
4
|
} | ConvertTo-Json
|
|
5
5
|
|
|
6
6
|
$response = Invoke-RestMethod -Uri "http://localhost:3000/ask" -Method POST -ContentType "application/json" -Body $body -TimeoutSec 120
|
|
@@ -4,7 +4,7 @@ $body = @{
|
|
|
4
4
|
} | ConvertTo-Json
|
|
5
5
|
|
|
6
6
|
Write-Host "=== TEST ROTATION COMPLETE ===" -ForegroundColor Cyan
|
|
7
|
-
Write-Host "1. Demarrage avec
|
|
7
|
+
Write-Host "1. Demarrage avec agent-primary (quota 50/50)"
|
|
8
8
|
Write-Host "2. Attend erreur 'Le systeme n'a pas pu repondre'"
|
|
9
9
|
Write-Host "3. Detection rate limit -> switch compte"
|
|
10
10
|
Write-Host "4. Retry avec nouveau compte"
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
$body = @{
|
|
2
2
|
question = "Bonjour, quel est le sujet principal de ce notebook?"
|
|
3
|
-
notebook_url = "https://notebooklm.google.com/notebook/
|
|
3
|
+
notebook_url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000109"
|
|
4
4
|
} | ConvertTo-Json
|
|
5
5
|
|
|
6
|
-
Write-Host "Testing account rotation with rate-limited
|
|
6
|
+
Write-Host "Testing account rotation with rate-limited agent-primary..."
|
|
7
7
|
$response = Invoke-RestMethod -Uri "http://localhost:3000/ask" -Method POST -ContentType "application/json" -Body $body -TimeoutSec 120
|
|
8
8
|
$response | ConvertTo-Json -Depth 10
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# This tests whether show_browser=true makes the browser visible
|
|
3
3
|
|
|
4
4
|
$baseUrl = "http://localhost:3000"
|
|
5
|
-
$notebookUrl = "https://notebooklm.google.com/notebook/
|
|
5
|
+
$notebookUrl = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000108"
|
|
6
6
|
|
|
7
7
|
Write-Host "=== Testing show_browser parameter ===" -ForegroundColor Cyan
|
|
8
8
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
1
|
$body = @{
|
|
2
2
|
description = "Updated by E2E test at $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
|
|
3
3
|
} | ConvertTo-Json
|
|
4
|
-
Invoke-RestMethod -Uri "http://localhost:3000/notebooks/e2e-
|
|
4
|
+
Invoke-RestMethod -Uri "http://localhost:3000/notebooks/e2e-agent-tertiary-test" -Method PUT -ContentType "application/json" -Body $body
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# Opens browser and waits so you can check the UI language
|
|
3
3
|
|
|
4
4
|
$body = @{
|
|
5
|
-
notebook_url = "https://notebooklm.google.com/notebook/
|
|
5
|
+
notebook_url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000107"
|
|
6
6
|
question = "Hello, what language is the UI in?"
|
|
7
7
|
show_browser = $true
|
|
8
8
|
browser_options = @{
|
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
# Opens browser to check if UI is in English
|
|
3
3
|
|
|
4
4
|
$body = @{
|
|
5
|
-
notebook_url = "https://notebooklm.google.com/notebook/
|
|
5
|
+
notebook_url = "https://notebooklm.google.com/notebook/00000000-0000-0000-0000-000000000107"
|
|
6
6
|
question = "What is this notebook about?"
|
|
7
7
|
show_browser = $true
|
|
8
8
|
} | ConvertTo-Json
|
package/scripts/check-server.ps1
CHANGED
|
File without changes
|
|
@@ -1,25 +1,25 @@
|
|
|
1
|
-
#!/bin/bash
|
|
2
|
-
# Docker entrypoint for NotebookLM MCP Server
|
|
3
|
-
# Starts VNC services (for visual auth) and Node.js HTTP server
|
|
4
|
-
set -e
|
|
5
|
-
echo "==========================================="
|
|
6
|
-
echo " NotebookLM MCP Server - Docker"
|
|
7
|
-
echo "==========================================="
|
|
8
|
-
echo ""
|
|
9
|
-
# Check if VNC should be started (default: yes in Docker)
|
|
10
|
-
ENABLE_VNC="${ENABLE_VNC:-true}"
|
|
11
|
-
if [ "$ENABLE_VNC" = "true" ]; then
|
|
12
|
-
echo "[Entrypoint] Starting VNC services..."
|
|
13
|
-
source /app/scripts/start-vnc.sh
|
|
14
|
-
echo ""
|
|
15
|
-
echo "[Entrypoint] VNC ready at: http://<host>:${NOVNC_PORT:-6080}/vnc.html"
|
|
16
|
-
echo ""
|
|
17
|
-
else
|
|
18
|
-
echo "[Entrypoint] VNC disabled (ENABLE_VNC=false)"
|
|
19
|
-
fi
|
|
20
|
-
# Render injecte automatiquement PORT, on l'utilise en priorité
|
|
21
|
-
export HTTP_PORT=${PORT:-${HTTP_PORT:-3000}}
|
|
22
|
-
echo "[Entrypoint] Starting Node.js HTTP server on port ${HTTP_PORT}..."
|
|
23
|
-
echo ""
|
|
24
|
-
# Start the Node.js server (foreground)
|
|
25
|
-
exec node dist/http-wrapper.js
|
|
1
|
+
#!/bin/bash
|
|
2
|
+
# Docker entrypoint for NotebookLM MCP Server
|
|
3
|
+
# Starts VNC services (for visual auth) and Node.js HTTP server
|
|
4
|
+
set -e
|
|
5
|
+
echo "==========================================="
|
|
6
|
+
echo " NotebookLM MCP Server - Docker"
|
|
7
|
+
echo "==========================================="
|
|
8
|
+
echo ""
|
|
9
|
+
# Check if VNC should be started (default: yes in Docker)
|
|
10
|
+
ENABLE_VNC="${ENABLE_VNC:-true}"
|
|
11
|
+
if [ "$ENABLE_VNC" = "true" ]; then
|
|
12
|
+
echo "[Entrypoint] Starting VNC services..."
|
|
13
|
+
source /app/scripts/start-vnc.sh
|
|
14
|
+
echo ""
|
|
15
|
+
echo "[Entrypoint] VNC ready at: http://<host>:${NOVNC_PORT:-6080}/vnc.html"
|
|
16
|
+
echo ""
|
|
17
|
+
else
|
|
18
|
+
echo "[Entrypoint] VNC disabled (ENABLE_VNC=false)"
|
|
19
|
+
fi
|
|
20
|
+
# Render injecte automatiquement PORT, on l'utilise en priorité
|
|
21
|
+
export HTTP_PORT=${PORT:-${HTTP_PORT:-3000}}
|
|
22
|
+
echo "[Entrypoint] Starting Node.js HTTP server on port ${HTTP_PORT}..."
|
|
23
|
+
echo ""
|
|
24
|
+
# Start the Node.js server (foreground)
|
|
25
|
+
exec node dist/http-wrapper.js
|
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
|
|
3
|
+
import { existsSync, readFileSync } from 'fs';
|
|
4
|
+
import { dirname, join, resolve } from 'path';
|
|
5
|
+
import { fileURLToPath } from 'url';
|
|
6
|
+
|
|
7
|
+
const __dirname = dirname(fileURLToPath(import.meta.url));
|
|
8
|
+
const repoRoot = resolve(__dirname, '..');
|
|
9
|
+
|
|
10
|
+
function parseArgs(argv) {
|
|
11
|
+
const args = {
|
|
12
|
+
mode: 'basic',
|
|
13
|
+
baseUrl: process.env.NOTEBOOKLM_MCP_BASE_URL || 'http://127.0.0.1:3000',
|
|
14
|
+
notebookUrl: process.env.NOTEBOOK_URL || '',
|
|
15
|
+
timeoutMs: 15000,
|
|
16
|
+
question:
|
|
17
|
+
'What is the main topic covered by this notebook? Answer in one sentence.',
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
for (let i = 0; i < argv.length; i++) {
|
|
21
|
+
const arg = argv[i];
|
|
22
|
+
switch (arg) {
|
|
23
|
+
case '--basic':
|
|
24
|
+
args.mode = 'basic';
|
|
25
|
+
break;
|
|
26
|
+
case '--http':
|
|
27
|
+
args.mode = 'http';
|
|
28
|
+
break;
|
|
29
|
+
case '--base-url':
|
|
30
|
+
args.baseUrl = argv[++i] || args.baseUrl;
|
|
31
|
+
break;
|
|
32
|
+
case '--notebook-url':
|
|
33
|
+
args.notebookUrl = argv[++i] || '';
|
|
34
|
+
break;
|
|
35
|
+
case '--timeout-ms':
|
|
36
|
+
args.timeoutMs = Number(argv[++i] || args.timeoutMs);
|
|
37
|
+
break;
|
|
38
|
+
case '--question':
|
|
39
|
+
args.question = argv[++i] || args.question;
|
|
40
|
+
break;
|
|
41
|
+
case '--help':
|
|
42
|
+
case '-h':
|
|
43
|
+
printHelp();
|
|
44
|
+
process.exit(0);
|
|
45
|
+
default:
|
|
46
|
+
if (arg.startsWith('--base-url=')) {
|
|
47
|
+
args.baseUrl = arg.split('=', 2)[1];
|
|
48
|
+
} else if (arg.startsWith('--notebook-url=')) {
|
|
49
|
+
args.notebookUrl = arg.split('=', 2)[1];
|
|
50
|
+
} else if (arg.startsWith('--timeout-ms=')) {
|
|
51
|
+
args.timeoutMs = Number(arg.split('=', 2)[1]);
|
|
52
|
+
} else if (arg.startsWith('--question=')) {
|
|
53
|
+
args.question = arg.split('=', 2)[1];
|
|
54
|
+
} else {
|
|
55
|
+
throw new Error(`Unknown argument: ${arg}`);
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
return args;
|
|
61
|
+
}
|
|
62
|
+
|
|
63
|
+
function printHelp() {
|
|
64
|
+
console.log(`NotebookLM MCP doctor
|
|
65
|
+
|
|
66
|
+
Usage:
|
|
67
|
+
node scripts/doctor.mjs --basic
|
|
68
|
+
node scripts/doctor.mjs --http
|
|
69
|
+
node scripts/doctor.mjs --http --notebook-url "https://notebooklm.google.com/notebook/<your-notebook-id>"
|
|
70
|
+
|
|
71
|
+
Options:
|
|
72
|
+
--basic Run repo and build checks only.
|
|
73
|
+
--http Also verify the local HTTP server.
|
|
74
|
+
--base-url <url> Override HTTP base URL (default: http://127.0.0.1:3000).
|
|
75
|
+
--notebook-url <url> Optional NotebookLM URL for /content and /ask checks.
|
|
76
|
+
--timeout-ms <ms> Per-request timeout in milliseconds.
|
|
77
|
+
--question <text> Custom ask prompt for the /ask verification step.
|
|
78
|
+
`);
|
|
79
|
+
}
|
|
80
|
+
|
|
81
|
+
function pass(message) {
|
|
82
|
+
console.log(`[PASS] ${message}`);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
function warn(message) {
|
|
86
|
+
console.log(`[WARN] ${message}`);
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
function fail(message) {
|
|
90
|
+
console.error(`[FAIL] ${message}`);
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
function loadPackageJson() {
|
|
94
|
+
const packagePath = join(repoRoot, 'package.json');
|
|
95
|
+
if (!existsSync(packagePath)) {
|
|
96
|
+
throw new Error(`package.json not found at ${packagePath}`);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
return JSON.parse(readFileSync(packagePath, 'utf8'));
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
function getMinNodeMajor(range) {
|
|
103
|
+
const match = String(range || '').match(/(\d+)/);
|
|
104
|
+
return match ? Number(match[1]) : 18;
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
async function fetchJson(url, options = {}, timeoutMs = 15000) {
|
|
108
|
+
const controller = new AbortController();
|
|
109
|
+
const timeout = setTimeout(() => controller.abort(), timeoutMs);
|
|
110
|
+
|
|
111
|
+
try {
|
|
112
|
+
const response = await fetch(url, {
|
|
113
|
+
...options,
|
|
114
|
+
signal: controller.signal,
|
|
115
|
+
headers: {
|
|
116
|
+
'Content-Type': 'application/json',
|
|
117
|
+
...(options.headers || {}),
|
|
118
|
+
},
|
|
119
|
+
});
|
|
120
|
+
|
|
121
|
+
const text = await response.text();
|
|
122
|
+
let data;
|
|
123
|
+
try {
|
|
124
|
+
data = text ? JSON.parse(text) : {};
|
|
125
|
+
} catch {
|
|
126
|
+
data = { raw: text };
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
return { ok: response.ok, status: response.status, data };
|
|
130
|
+
} finally {
|
|
131
|
+
clearTimeout(timeout);
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
async function main() {
|
|
136
|
+
const args = parseArgs(process.argv.slice(2));
|
|
137
|
+
let hasFailure = false;
|
|
138
|
+
|
|
139
|
+
const packageJson = loadPackageJson();
|
|
140
|
+
const requiredNode = getMinNodeMajor(packageJson.engines?.node);
|
|
141
|
+
const currentNode = Number(process.versions.node.split('.')[0]);
|
|
142
|
+
|
|
143
|
+
if (currentNode < requiredNode) {
|
|
144
|
+
fail(`Node.js ${process.versions.node} is too old. Required: >=${requiredNode}`);
|
|
145
|
+
hasFailure = true;
|
|
146
|
+
} else {
|
|
147
|
+
pass(`Node.js ${process.versions.node} satisfies engines.node (${packageJson.engines?.node})`);
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const requiredPaths = [
|
|
151
|
+
['package.json', join(repoRoot, 'package.json')],
|
|
152
|
+
['README.md', join(repoRoot, 'README.md')],
|
|
153
|
+
['dist/index.js', join(repoRoot, 'dist', 'index.js')],
|
|
154
|
+
['dist/http-wrapper.js', join(repoRoot, 'dist', 'http-wrapper.js')],
|
|
155
|
+
];
|
|
156
|
+
|
|
157
|
+
for (const [label, filePath] of requiredPaths) {
|
|
158
|
+
if (existsSync(filePath)) {
|
|
159
|
+
pass(`Found ${label}`);
|
|
160
|
+
} else {
|
|
161
|
+
fail(`Missing ${label} at ${filePath}`);
|
|
162
|
+
hasFailure = true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
if (args.mode !== 'http') {
|
|
167
|
+
if (hasFailure) {
|
|
168
|
+
process.exit(1);
|
|
169
|
+
}
|
|
170
|
+
pass('Basic verification completed.');
|
|
171
|
+
return;
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
const health = await fetchJson(`${args.baseUrl}/health`, {}, args.timeoutMs).catch((error) => {
|
|
175
|
+
fail(`Could not reach ${args.baseUrl}/health: ${error.message}`);
|
|
176
|
+
hasFailure = true;
|
|
177
|
+
return null;
|
|
178
|
+
});
|
|
179
|
+
|
|
180
|
+
if (!health) {
|
|
181
|
+
process.exit(1);
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
if (!health.ok || !health.data?.success) {
|
|
185
|
+
fail(`/health failed with status ${health.status}`);
|
|
186
|
+
hasFailure = true;
|
|
187
|
+
} else {
|
|
188
|
+
pass(`/health succeeded (authenticated=${health.data?.data?.authenticated === true})`);
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
if (!args.notebookUrl) {
|
|
192
|
+
warn('No notebook URL provided. Skipping /content and /ask checks.');
|
|
193
|
+
process.exit(hasFailure ? 1 : 0);
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
const encodedNotebookUrl = encodeURIComponent(args.notebookUrl);
|
|
197
|
+
const content = await fetchJson(
|
|
198
|
+
`${args.baseUrl}/content?notebook_url=${encodedNotebookUrl}`,
|
|
199
|
+
{},
|
|
200
|
+
Math.max(args.timeoutMs, 30000)
|
|
201
|
+
).catch((error) => {
|
|
202
|
+
fail(`/content request failed: ${error.message}`);
|
|
203
|
+
hasFailure = true;
|
|
204
|
+
return null;
|
|
205
|
+
});
|
|
206
|
+
|
|
207
|
+
if (content) {
|
|
208
|
+
if (!content.ok || !content.data?.success) {
|
|
209
|
+
fail(`/content failed with status ${content.status}`);
|
|
210
|
+
hasFailure = true;
|
|
211
|
+
} else {
|
|
212
|
+
const sourceCount = content.data?.data?.sourceCount;
|
|
213
|
+
pass(`/content succeeded${typeof sourceCount === 'number' ? ` (sourceCount=${sourceCount})` : ''}`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
|
|
217
|
+
const askPayload = {
|
|
218
|
+
question: args.question,
|
|
219
|
+
notebook_url: args.notebookUrl,
|
|
220
|
+
session_id: `doctor-${Date.now()}`,
|
|
221
|
+
source_format: 'none',
|
|
222
|
+
};
|
|
223
|
+
|
|
224
|
+
const ask = await fetchJson(
|
|
225
|
+
`${args.baseUrl}/ask`,
|
|
226
|
+
{
|
|
227
|
+
method: 'POST',
|
|
228
|
+
body: JSON.stringify(askPayload),
|
|
229
|
+
},
|
|
230
|
+
Math.max(args.timeoutMs, 120000)
|
|
231
|
+
).catch((error) => {
|
|
232
|
+
fail(`/ask request failed: ${error.message}`);
|
|
233
|
+
hasFailure = true;
|
|
234
|
+
return null;
|
|
235
|
+
});
|
|
236
|
+
|
|
237
|
+
if (ask) {
|
|
238
|
+
if (!ask.ok || !ask.data?.success) {
|
|
239
|
+
fail(`/ask failed with status ${ask.status}`);
|
|
240
|
+
hasFailure = true;
|
|
241
|
+
} else {
|
|
242
|
+
const answer = ask.data?.data?.answer || '';
|
|
243
|
+
pass(`/ask succeeded (${answer.length} chars returned)`);
|
|
244
|
+
}
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
if (hasFailure) {
|
|
248
|
+
process.exit(1);
|
|
249
|
+
}
|
|
250
|
+
|
|
251
|
+
pass('HTTP verification completed.');
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
main().catch((error) => {
|
|
255
|
+
fail(error.message);
|
|
256
|
+
process.exit(1);
|
|
257
|
+
});
|
|
File without changes
|