A side-by-side look at the Notebooklm MCP Secure and TGGET Niche Research MCP servers: transport, auth, tools, quality signals, and the config to install either one in Claude, Cursor, Windsurf or VS Code.
Verdict: choose Notebooklm MCP Secure for research work as a local process; choose TGGET Niche Research for research. You can also run both side by side in one mcpServers block.
ask_question, add_notebook, list_notebooks.TGGET_TOKEN.start_research, get_research, get_report.Rows where the two servers differ are marked.
| Spec | T TGGET Niche Research | |
|---|---|---|
| Category | Research | Research |
| Quality signal | 61/100 · Good | 53/100 · Good |
| Install command | Confirmed | Not confirmed yet |
| Transport | Local subprocess (stdio) | — |
| Auth | other | API key required |
| Pricing | Free | Not declared |
| Required env vars | None listed | TGGET_TOKEN |
| Verified owner | Community listing | Community listing |
| GitHub stars | 85 | 0 |
| Directory activity | 3 views 0 installs 0 upvotes | 0 views 0 installs 0 upvotes |
| Tools | 25 | 10 |
| Full listing | View Notebooklm MCP Secure | View TGGET Niche Research |
ask_questionNotebookLM notebook Q&A via browser automation.
No active notebook is selected.
Use list_notebooks and select_notebook to choose one, or pass notebook_url.
No Gemini API key is required, but browser authentication must be valid.
If login is required, use the setup_auth tool and verify with get_health (or ask the user to run the notebooklm.auth-setup prompt for a guided walkthrough).add_notebookAdd a NotebookLM notebook to the local library after explicit user confirmation. Provide the NotebookLM URL plus concise metadata: name, description, topics, and optional use cases/tags. Do not infer missing metadata; ask the user first.list_notebooksList all library notebooks with metadata (name, topics, use cases, URL). Use this to present options, then ask which notebook to use for the task.get_notebookGet detailed information about a specific notebook by IDselect_notebookSet a notebook as the active default (used when ask_question has no notebook_id).
## When To Use
- User switches context: "Let's work on React now"
- User asks explicitly to activate a notebook
- Obvious task change requires another notebook
## Auto-Switching
- Safe to auto-switch if the context is clear and you announce it:
"Switching to React notebook for this task..."
- If ambiguous, ask: "Switch to [notebook] for this task?"
## Example
User: "Now let's build the React frontend"
You: "Switching to React notebook..." (call select_notebook)update_notebookUpdate notebook metadata based on user intent.
## Pattern
1) Identify target notebook and fields (topics, description, use_cases, tags, url)
2) Propose the exact change back to the user
3) After explicit confirmation, call this tool
## Examples
- User: "React notebook also covers Next.js 14"
You: "Add 'Next.js 14' to topics for React?"
User: "Yes" → call update_notebook
- User: "Include error handling in n8n description"
You: "Update the n8n description to mention error handling?"
User: "Yes" → call update_notebook
Tip: You may update multiple fields at once if requested.remove_notebookDangerous — requires explicit user confirmation.
## Confirmation Workflow
1) User requests removal ("Remove the React notebook")
2) Look up full name to confirm
3) Ask: "Remove '[notebook_name]' from your library? (Does not delete the actual NotebookLM notebook)"
4) Only on explicit "Yes" → call remove_notebook
Never remove without permission or based on assumptions.
Example:
User: "Delete the old React notebook"
You: "Remove 'React Best Practices' from your library?"
User: "Yes" → call remove_notebooksearch_notebooksSearch library by query (name, description, topics, tags). Use to propose relevant notebooks for the task and then ask which to use.create_notebookCreate a new NotebookLM notebook with sources programmatically.
## What This Tool Does
- Creates a NEW notebook in your NotebookLM account
- Uploads sources (URLs, text, files) to the notebook
- Returns the notebook URL for immediate use
- Optionally adds to your local library
## Supported Source Types
- **url**: Web page URL (documentation, articles, etc.)
- **text**: Raw text content (code, notes, etc.)
- **file**: Local file path (PDF, DOCX, TXT)
## Example Usage
Create a notebook from API documentation:
```json
{
"name": "React Docs",
"sources": [
{ "type": "url", "value": "https://react.dev/reference/react" }
]
}
```
Create a notebook with multiple sources:
```json
{
"name": "Security Research",
"sources": [
{ "type": "url", "value": "https://owasp.org/Top10" },
{ "type": "file", "value": "/path/to/security-report.pdf" },
{ "type": "text", "value": "Custom notes...", "title": "My Notes" }
],
"description": "Security best practices and research",
"topics": ["security", "owasp", "best-practices"]
}
```
## NotebookLM Limits (Free Tier)
- 100 notebooks maximum
- 50 sources per notebook
- 500k words per source
- 50 queries per day
## Notes
- Requires authentication (run setup_auth first)
- Creates notebook with sharing set to private by default
- Large files may take longer to processsync_librarySync your local library with actual NotebookLM notebooks.
## What This Tool Does
- Navigates to NotebookLM and extracts all your notebooks
- Compares with local library entries
- Detects stale entries (notebooks deleted or URLs changed)
- Identifies notebooks not in your library
- Optionally auto-removes stale entries
## When To Use
- Library seems out of sync with NotebookLM
- After deleting notebooks in NotebookLM
- To discover new notebooks to add
- Before setting up automation workflows
## Output
Returns a sync report with:
- **matched**: Library entries that match actual notebooks
- **staleEntries**: Library entries with no matching notebook (candidates for removal)
- **missingNotebooks**: NotebookLM notebooks not in library (candidates for adding)
- **suggestions**: Recommended actions
## Example Usage
```json
{ "auto_fix": false }
```
With auto-fix to remove stale entries:
```json
{ "auto_fix": true }
```list_sourcesList sources in a notebook. Provide notebook_id or notebook_url; if neither is provided, the active notebook from the local library is used. Returns source id, title, type, and status.add_sourceAdd a source to an existing NotebookLM notebook.
If neither `notebook_id` nor `notebook_url` is provided, this tool uses the currently active notebook from the local library.
## Source Types
- **url**: Web page URL
- **text**: Text content (paste)
- **file**: Local file path (PDF, DOCX, TXT)
## Example
```json
{
"notebook_id": "my-notebook",
"source": {
"type": "url",
"value": "https://docs.example.com/api"
}
}
```start_researchStarts a niche research from a short search phrase or a plain-language description of an app or service idea. A phrase is scanned directly (demand, sub-topics, competitors, signals); a description is first turned into real search queries, the best one is then scanned automatically. Demand is measured in one country and one language: `country` and `language` when given, otherwise the country and the language of the phrase (English: United States, Spanish: Spain, Portuguese: Brazil); write the phrase in the language people search in there. `country` and `language` of the answer tell how the numbers were measured. Returns the research id to poll with get_research. Counts as one research of the plan allowance, whether the data comes from the sources or from the shared cache.get_researchReturns the current state and findings of a research by id: status, `country` and `language` the demand was measured in (null where a source does not measure by country), headline numbers, ranked candidate phrases, competitor overview, child researches (sub-topics, competitor checks, signals) with their ids, and skipped stages. Call repeatedly until status is completed and pending is 0.get_reportReturns the final niche report of a finished scan (or the report research itself) as Markdown: verdict, what product to build (customer pains with evidence and severity, positioning, MVP with the pain each feature relieves, platform, monetization, competitor matrix), napkin economics (price hypothesis, acquisition cost from the cost per click in paid search, revenue per customer, whether it adds up, assumptions), SEO plan for the site (clusters, pages with title/H1/description, content plan, FAQ), ASO for App Store and Google Play, name options with domain and App Store availability, landing page draft, distribution channels by type with a first step, effort and priority, validation steps and risks. Pass format "json" for structured data (keys: verdict, product, economics, seo, aso, names, landing, channels, validation, risks).list_researchLists the researches the account started itself, newest first: niche scans of a phrase and descriptions of an idea, without the checks they spawned. Use it to find the id of an earlier research before get_research, get_report, compare_research or follow_niche, or to see what is still running. Each item has `id`, `kind`, `phrase`, `status` (queued, running, completed, failed), `mode`, `country` and `language` the demand was measured in, `created_at`, `url` of its page and `total_count`: monthly searches of the phrase, null for a description. `quota` tells how many researches the plan has left. Reads only; spends nothing.Paste either block (or both) into your client config, e.g. claude_desktop_config.json or ~/.cursor/mcp.json. We only show a config when the install command is confirmed.
{
"mcpServers": {
"pantheon-security-notebooklm-mcp-secure": {
"command": "npx",
"args": [
"-y",
"@pan-sec/notebooklm-mcp@latest"
]
}
}
}
No confirmed install command for TGGET Niche Research yet — follow the setup steps linked from its listing page rather than a guessed package name.
run_signalAdds one check to a finished research and returns the id of the new child research. Use it when the scan skipped a stage, when a person asks about one phrase in particular, or to rebuild the report after new checks. A niche scan already runs the usual checks by itself, so this tool is for what is missing. Checks added this way are free: they do not spend researches of the plan.
Checks of a demand research (`kind`):
- `competitors`: who holds the search results for a phrase of the research; pass the phrase in `phrase`.
- `dynamics`: two years of demand history.
- `appstore`: App Store apps for the phrase with ratings and freshness.
- `wiki`, `radar`, `youtube`: public interest and community signals.
- `paid`: paid search for the phrase and its strongest candidates: volume, advertiser competition, cost per click.
- `insight`: a summary of the findings written by the language model.
- `report`: the final niche report, written anew from the current data; needs a finished niche scan.
Checks of a child research:
- `fingerprint`: product sites found by a competitors check, with pricing and app links; the parent is that competitors check.
- `reviews`: recent App Store reviews of the leaders; the parent is an App Store research.
- `insight` also accepts a competitors check as the parent.
The parent must be completed and belong to the account. The check runs in the background: poll get_research with the returned `id` every 20-30 seconds until `status` is `completed`. `insight` and `report` are rebuilt at most once an hour.compare_researchPuts two to five finished niche scans side by side to help choose between ideas. `items` are the niches with their numbers, the report's positioning and napkin economics, and `wins`: in how many rows the niche holds the better value. `rows` are the ranked measures (verdict, demand, trend, cost per click, weak search results, competitor sites, App Store apps, fresh community signals) with the value of every niche and `best`, the indexes of the items that hold the better value; `better` says which way is better (max or min), null when the row is shown but not ranked. Every item names the `country` and the `language` its demand was measured in; demand and cost per click are not ranked across different markets, countries or languages (`mixed_markets`). The marks are computed from numbers, not written by a language model. Every scan needs a finished report. `share_url` is a read-only link to this comparison that works without signing in: give it to the person only when they want to share the comparison, it shows the numbers and the conclusions of their researches to whoever holds it.list_projectsLists the niches the account follows. A followed niche (a project) is scanned anew once a month and compared with its previous check. For each project: status, whether the plan serves it, the date of the next check, the latest numbers (verdict, demand, cost per click, competitor sites, App Store, community signals) and what changed at the latest monthly check, as structured `changes` and as `digest` lines of text. Also returns how many niches the plan follows.get_projectReturns a followed niche with the history of its checks, newest first: the first measurement (`baseline`) and the monthly checks, each with its numbers, what changed since the previous check and the id of the research it came from. Pass that `research_id` to get_report to read the fresh report of a check. Changes are computed from numbers and lists, not written by a language model.follow_nicheStarts following the niche of a finished scan that has a report: the scan becomes the first measurement and the niche is scanned anew every month, with a digest of what changed sent to the account. Monthly checks do not spend researches; the plan limits how many niches are followed (FREE 1, Starter 2, Pro 10). Following a niche that is already followed returns its project. The niche is followed in the country and the language its scan was measured in (`country` and `language` of the project), so every monthly check measures the same audience.update_projectPauses a followed niche (`paused`: no monthly checks, its place in the plan is freed), follows it again (`active`, needs a free place in the plan) or stops following it (`deleted`: the project with its checks and digests is removed for good, the researches stay in the history). Ask the person before deleting.