{
  "markdown": "<!-- mcp-name: io.github.WenyuChiou/research-hub -->\n\n# research-hub\n\n> **Turn your research stack into an AI-operable workspace.**\n> Use Zotero, Obsidian, and NotebookLM together, or start with any two. research-hub gives your AI assistant a real CLI, MCP server, REST API, and dashboard for repeatable literature workflows.\n\n[![How research-hub MCP works: after validation and routing, ordinary research tools can read or mutate truth stores directly, while the workflow-managed path adds durable state, workflow-only policy and checkpoints, human decisions, prepared actions, result recording, and an explicit reconcile-required blocker](docs/images/research-hub-cover.png)](#quick-start)\n\n![research-hub dashboard demo, real screen recording](docs/images/dashboard-walkthrough.gif)\n\n[![PyPI](https://img.shields.io/pypi/v/research-hub-pipeline.svg)](https://pypi.org/project/research-hub-pipeline/)\n[![Python](https://img.shields.io/badge/python-3.10%2B-blue.svg)](pyproject.toml)\n[![License: MIT](https://img.shields.io/badge/license-MIT-green.svg)](LICENSE)\n[![Mentioned in Awesome MCP Servers](https://img.shields.io/badge/Mentioned_in-Awesome_MCP_Servers-fc60a8)](https://github.com/punkpeye/awesome-mcp-servers)\n\n[![Zotero](https://img.shields.io/badge/Zotero-CC2936?logo=zotero&logoColor=white)](https://www.zotero.org/)\n[![Obsidian](https://img.shields.io/badge/Obsidian-7C3AED?logo=obsidian&logoColor=white)](https://obsidian.md/)\n[![NotebookLM](https://img.shields.io/badge/NotebookLM-4285F4?logo=google&logoColor=white)](https://notebooklm.google.com/)\n\nTraditional Chinese: [README.zh-TW.md](README.zh-TW.md) | [Watch the full-res mp4](docs/demo/dashboard-walkthrough.mp4)\n\n> 📚 Part of the [**agentic AI learning roadmap**](https://github.com/WenyuChiou/awesome-agentic-ai-zh) — a 7-stage curated path for building agentic AI, multilingual (zh-TW · zh-Hans · English). This workspace is referenced in §13 (research workflow skills).\n\n> 🧪 **Real-use signal:** in daily use by 1 PhD researcher (Lehigh CEE) tracking 7+ research clusters across Zotero + Obsidian + NotebookLM. Shipping since Apr 2026, docs updated for v0.95.0.\n\n---\n\n## Quick start\n\n```bash\npip install research-hub-pipeline\nresearch-hub dashboard --sample   # preview with sample data, no accounts needed\n```\n\nFor a real research-hub vault with Zotero / Obsidian / NotebookLM integration,\npick the install path matching your stack in [§ Start Here](#start-here).\n\n---\n\n## Contents\n\n1. [Quick start](#quick-start)\n2. [Real Screenshots](#real-screenshots)\n3. [Is this for me?](#is-this-for-me--vs-alternatives)\n4. [Start Here](#start-here)\n5. [First-Run Checklist](#first-run-checklist)\n6. [Credential Reference](#credential-reference)\n7. [Connect your AI host](#connect-your-ai-host)\n8. [Why this exists](#why-this-exists)\n9. [What it does](#what-it-does)\n10. [Operator Modes](#operator-modes)\n11. [Dashboard tour](#dashboard-tour)\n12. [Inside Zotero](#inside-zotero)\n13. [Feature matrix](#feature-matrix)\n14. [Troubleshooting](#troubleshooting)\n15. [Known limitations](#known-limitations)\n16. [Docs + Status + Dev](#docs--status--dev)\n17. [License](#license)\n\n---\n\n## Real Screenshots\n\nThese are generated by a real research-hub vault, not mockups.\n\n**Obsidian paper note**: Markdown note with title, authors, DOI, Zotero key,\ntags, cluster, status, and verification metadata.\n\n<img src=\"docs/images/obsidian-paper-note.png\" alt=\"Single paper note rendered with Properties view\" width=\"640\">\n\n**Obsidian Bases dashboard**: generated `.base` file with sortable paper\nmetadata and reading status.\n\n<img src=\"docs/images/obsidian-bases-dashboard.png\" alt=\"Obsidian Bases dashboard for a cluster\" width=\"640\">\n\n**Obsidian graph view**: managed topic folders and labels can be colored with\n`research-hub vault graph-colors --refresh`.\n\n<img src=\"docs/images/obsidian-graph.png\" alt=\"Obsidian graph view with research-hub color groups\" width=\"640\">\n\nGenerated crystals are also plain Markdown notes under\n`hub/<cluster>/crystals/*.md`, so they can be linked, searched, and read\nby MCP tools at low token cost.\n\n---\n\n## Is this for me? — vs alternatives\n\nresearch-hub does not replace Zotero, Obsidian, or NotebookLM. It connects them so an AI agent can operate the workflow.\n\n| What you can do | Zotero alone | NotebookLM alone | Generic RAG | Obsidian-Zotero plugin | research-hub |\n|---|---:|---:|---:|---:|---:|\n| Search arXiv + Semantic Scholar in one command | No | No | DIY | No | Yes |\n| Ingest into Zotero and Obsidian and NotebookLM | No | No | DIY | Partial | Yes |\n| AI brief from your collection | No | Manual | DIY | No | Yes |\n| Cached canonical answers | No | No | Re-fetches | No | Yes |\n| Structured memory layer | No | No | Usually chunks | No | Yes |\n| Direct AI-agent control via MCP | No | No | DIY | No | Yes |\n| Live dashboard with action buttons | No | No | No | No | Yes |\n| Per-cluster Obsidian Bases dashboard | No | No | No | No | Yes |\n| No OpenAI/Anthropic API key required | n/a | Yes | Usually no | n/a | Yes |\n| Local-first vault you own | Partial | No | Depends | Yes | Yes |\n\nThe practical fit: research-hub is most useful if you already use at least two of Zotero, Obsidian, and NotebookLM and want your AI assistant to run the repetitive steps.\n\n---\n\n## Start Here\n\nPick the path with the fewest moving parts. You can add Zotero,\nNotebookLM, MCP, or AI-host skills later.\n\n| Goal | Accounts needed | Commands |\n|---|---|---|\n| Preview the dashboard only | None | `pip install research-hub-pipeline` then `research-hub dashboard --sample` |\n| Try a demo vault | None | `pip install research-hub-pipeline` then `research-hub init --sample` |\n| Work from local PDFs/DOCX/Markdown | Obsidian optional | `pip install \"research-hub-pipeline[import,secrets]\"` then `research-hub setup --persona analyst` |\n| Zotero + Obsidian, no browser automation | Zotero | `pip install \"research-hub-pipeline[secrets]\"` then `research-hub setup --skip-login` |\n| Full Zotero + Obsidian + NotebookLM loop | Zotero + Google | `pip install \"research-hub-pipeline[playwright,secrets]\"` then `research-hub setup` |\n| Autonomous agent bootstrap | Existing vault or target folder | `python -m research_hub setup --autonomous --vault ./vault --persona agent` |\n\nAfter setup, run:\n\n```bash\nresearch-hub doctor\nresearch-hub serve --dashboard\n```\n\nFor the first real ingestion, keep NotebookLM out of the path until\nZotero and Obsidian are healthy:\n\n```bash\nresearch-hub auto \"agent-based modeling\" --max-papers 3 --no-nlm\n```\n\nThen enable NotebookLM after the browser login works:\n\n```bash\nresearch-hub notebooklm login --auto-detect\nresearch-hub notebooklm bundle --cluster <slug>\nresearch-hub notebooklm upload --cluster <slug>\nresearch-hub notebooklm generate --cluster <slug> --type brief\nresearch-hub notebooklm download --cluster <slug>\n```\n\n`research-hub setup` also prints these next steps when it finishes.\n\n## First-Run Checklist\n\n| Item | Needed when | How to handle it |\n|---|---|---|\n| Python 3.10+ | Always | Use the same Python that runs `pip install research-hub-pipeline` |\n| Zotero API key + library ID | Zotero-backed paper ingestion | Set `ZOTERO_API_KEY` and `ZOTERO_LIBRARY_ID`, then run `research-hub doctor` |\n| Obsidian vault | Markdown note workflow | Point `setup` at a folder you can open in Obsidian; it is still plain Markdown |\n| NotebookLM browser login | NotebookLM upload/generate/download | Run `research-hub notebooklm login --auto-detect`; Google OAuth still requires a visible human sign-in |\n| LLM CLI for relevance judging | `research-hub auto` default path | Install `claude`, `codex`, `gemini`, `opencode`, `aichat`, `cursor`, configure a custom adapter, or pass `--no-fit-check` |\n| AI-host integration | Claude/Codex/Cursor/Gemini/OpenClaw/etc. | Use MCP/REST for tool-calling hosts; use `research-hub install --platform ...` only for verified skill installer targets |\n\n## Credential Reference\n\nThese variables are required only for Zotero-backed workflows. Local\nfile import, sample dashboards, MCP server startup, and REST API\ninspection can run without them.\n\n<!-- env-vars-table-start -->\n\n| Name | Required | Purpose |\n|---|---|---|\n| `ZOTERO_API_KEY` | yes | Zotero web API auth, required for paper ingestion |\n| `ZOTERO_LIBRARY_ID` | yes | Zotero library identifier |\n| `SEMANTIC_SCHOLAR_API_KEY` | no | Uses an S2 API key and defaults to a conservative ~1 request/sec throttle |\n| `SEMANTIC_SCHOLAR_RPS` | no | Optional S2 request-rate override; leave unset unless your key has a different quota |\n| `TAVILY_API_KEY` | no | Web search backend (alternative to DDG) |\n| `BRAVE_API_KEY` | no | Web search backend (alternative to DDG) |\n\n<!-- env-vars-table-end -->\n\nSemantic Scholar searches are deliberately paced. Without\n`SEMANTIC_SCHOLAR_API_KEY`, research-hub uses a slower anonymous delay\nbecause public traffic shares capacity. With a key, the default is\napproximately one request per second and 429 responses are retried with\n`Retry-After` / exponential backoff. If Semantic Scholar grants your key\na different quota, set `SEMANTIC_SCHOLAR_RPS` instead of editing code.\n\n## Connect your AI host\n\nresearch-hub has two AI-facing integration layers:\n\n| Layer | Best for | Current status |\n|---|---|---|\n| MCP / REST | Claude Desktop, Claude Code, Cursor, Continue.dev, Cline, Roo Code, VS Code Copilot, OpenClaw, and other tool-calling hosts | Host-agnostic; configure the MCP server or call the REST API |\n| Installed `SKILL.md` files | Claude Code, Codex, Cursor, Gemini | Built-in installer targets via `research-hub install --platform ...` |\n| Manual `SKILL.md` loading | Hermes, OpenClaw, other agents with skill/rules directories | Copy or reference the bundled skill directories manually; not release-verified as installer targets |\n\nFor Claude Desktop, Cursor, Continue.dev, Cline, VS Code Copilot, OpenClaw, or another MCP host, configure the MCP server:\n\n```json\n{ \"mcpServers\": { \"research-hub\": { \"command\": \"research-hub\", \"args\": [\"serve\"] } } }\n```\n\nRestart the host. Then ask naturally:\n\n> Find me 5 papers on agent-based modeling and put them in a notebook.\n\nThe AI can call `auto_research_topic(topic=\"agent-based modeling\", max_papers=5)` and ingest papers, generate a NotebookLM brief, and update the vault.\n\nInstall host-specific skill files for the platforms with known default skill directories:\n\n```bash\nresearch-hub install --platform claude-code\nresearch-hub install --platform cursor\nresearch-hub install --platform codex\nresearch-hub install --platform gemini\n```\n\nOpenClaw, Hermes, and other agents can still use research-hub through MCP/REST. If the host supports `SKILL.md`-style directories or rules files, copy the bundled directories from `skills/` or inline the relevant `SKILL.md` into the host's instructions. `research-hub install --platform` does not currently verify those hosts.\n\nBrowser-only or HTTP-capable AIs can use the REST API after starting the local server with `research-hub serve --dashboard`:\n\n```bash\ncurl -X POST http://127.0.0.1:8765/api/v1/plan \\\n     -H \"Content-Type: application/json\" \\\n     -d \"{\\\"intent\\\":\\\"research harness engineering\\\"}\"\n```\n\nFull reference: [MCP tools](docs/mcp-tools.md), [AI integrations](docs/ai-integrations.md), [AI host support matrix](docs/ai-host-support.md), and [live smoke checklist](docs/live-smoke.md).\n\n---\n\n## Why this exists\n\nMost research tools are good at one part of the workflow:\n\n- Zotero stores citations, metadata, and PDFs.\n- Obsidian stores notes, links, and synthesis.\n- NotebookLM turns source bundles into AI-readable briefs.\n\nThe painful part is the handoff. research-hub connects those handoffs so an AI agent can search, ingest, tag, summarize, repair, brief, and inspect your workspace without turning your library into an opaque RAG box.\n\nYou do **not** need all three tools on day one.\n\n| Your current stack | What research-hub gives you first |\n|---|---|\n| Zotero + Obsidian | Paper search, Zotero metadata, Markdown notes, tags, Obsidian Bases dashboards |\n| Obsidian + NotebookLM | Local PDF/DOCX/MD/TXT ingest, cluster dashboards, NotebookLM bundles and briefs |\n| Zotero + NotebookLM | Zotero-backed paper selection, namespaced tags, NotebookLM upload/generate/download |\n| Zotero + Obsidian + NotebookLM | Full loop: discover -> ingest -> organize -> brief -> answer -> maintain |\n| No accounts yet | Sample dashboard and local smoke tests before connecting anything |\n\n---\n\n## What it does\n\nresearch-hub is a local-first orchestration layer for research workflows:\n\n- **CLI:** `research-hub auto`, `import-folder`, `ask`, `doctor`, `tidy`, `clusters`, `zotero`, `notebooklm`, `crystal`, and more.\n- **MCP server:** lets Claude Desktop, Claude Code, Cursor, Continue.dev, Cline, Roo Code, OpenClaw, and other MCP hosts operate the same workflow.\n- **REST API:** exposes `/api/v1/*` for browser-only or HTTP-capable assistants.\n- **12-skill portable pack:** `SKILL.md` workflows install directly for Claude Code, Codex, Cursor, and Gemini. The new resumable orchestrator automates low-risk stages and pauses at explicit human gates before external writes, costly experiments, semantic revisions, and release.\n- **Dashboard:** gives humans a live view of clusters, papers, diagnostics, briefs, writing support, and management actions.\n- **Vault format:** writes normal Markdown, frontmatter, `.base` dashboards, cache files, and logs that you can inspect directly.\n- **Authenticity gate (v0.95+):** every discovered paper must resolve to a real identifier (DOI / arXiv / PMID), pass integrity and relevance checks, or it is **quarantined with a recorded reason** and never written to the vault. No fabricated references — inspect rejects with `research-hub quarantine list`.\n\nThe core loop:\n\n```text\ntopic or source folder\n  -> discover or import sources\n  -> verify authenticity (resolve + integrity + relevance) or quarantine\n  -> enrich metadata\n  -> write Zotero tags/notes when enabled\n  -> write Obsidian Markdown notes and cluster dashboards\n  -> bundle/upload/generate with NotebookLM when enabled\n  -> cache answers as crystals and structured memory\n```\n\n---\n\n## Operator Modes\n\nresearch-hub supports both human-first and agent-first setup.\n\nFor a human researcher, `research-hub setup` runs the onboarding wizard,\ninstalls host-specific skills when it can detect the host, optionally\nlaunches NotebookLM login, and offers a small sample run.\n\nFor an autonomous agent or Cowork-style host:\n\n```bash\npip install research-hub-pipeline\npython -m research_hub describe > capabilities.json\npython -m research_hub setup --autonomous --vault ./vault --persona agent\n# emits BootstrapReport JSON; exit code 0 if ready, 1 otherwise\n```\n\nThen drive operations via CLI `--json` mode or the bundled MCP server\n(`research-hub-mcp`). All report-shaped commands accept `--json`;\ncapability introspection lives in `research-hub describe`.\n\n**NotebookLM boundary.** NotebookLM upload still requires one-time\nhuman-driven browser-based Google OAuth. Headless agents can prepare\nbundles and read downloaded briefs, but they cannot complete Google's\nfirst sign-in or phone challenge by themselves.\n\n**Relevance judge boundary.** `auto_research_topic` and `research-hub\nauto` run a fail-closed relevance check by default. With no supported\nLLM CLI and no `--no-fit-check`, `auto` stops before search and prints\nthe fix instead of silently producing an empty vault.\n\n| Persona | Best for | Install extra |\n|---|---|---|\n| Researcher | STEM papers, DOI/arXiv, Zotero-first workflows | `[playwright,secrets]` |\n| Humanities | books, quotes, URL-only sources, Zotero + Obsidian | `[playwright,secrets]` |\n| Analyst | industry research, local PDFs/reports, no Zotero required | `[import,secrets]` |\n| Internal KM | lab/company knowledge bases, mixed file types | `[import,secrets]` |\n\nField presets for `discover new`, `search`, and related planning flows\nare `cs`, `bio`, `med`, `physics`, `math`, `social`, `econ`, `chem`,\n`astro`, `edu`, and `general`. There is no `hydrology` preset; use\n`general` intentionally.\n\n---\n\n## Dashboard tour\n\n`research-hub serve --dashboard` opens `http://127.0.0.1:8765/`.\n\n**Overview**: treemap over clusters, storage map, and health summary.\n\n![Overview](docs/images/hero/dashboard-overview.png)\n\n**Library**: per-cluster drill-down with papers, sub-topics, and per-paper actions.\n\n![Library](docs/images/hero/dashboard-library-subtopic.png)\n\n**Diagnostics**: grouped drift alerts and readiness checks.\n\n![Diagnostics](docs/images/hero/dashboard-diagnostics.png)\n\n**Manage**: CLI actions as buttons, inline result drawer, confirmation modal, and per-paper row actions.\n\n![Manage](docs/images/hero/dashboard-manage-live.png)\n\nBriefings and Writing tabs are also available. See the [dashboard walkthrough](docs/dashboard-walkthrough.md) and [persona variants](docs/personas.md).\n\n---\n\n## Inside Zotero\n\nEvery ingested paper gets a namespaced tag set so you can filter your library by research-hub context:\n\n| Tag | Meaning |\n|---|---|\n| `research-hub` | Ingested through this pipeline |\n| `cluster/<slug>` | Which research cluster the paper belongs to |\n| `category/<arxiv-code>` | arXiv category like `cs.AI` or `econ.GN` |\n| `type/<publication-type>` | `Review`, `JournalArticle`, etc. from Semantic Scholar |\n| `src/<backend>` | Search backend that discovered it: `arxiv`, `semantic_scholar`, `crossref`, `zotero` |\n\nEvery paper can also get a child note with `Summary / Key Findings / Methodology / Relevance`, derived from the Obsidian frontmatter. Papers that were in Zotero before research-hub existed can be backfilled with:\n\n```bash\nresearch-hub zotero backfill --tags --notes --apply\n```\n\n---\n\n## Feature matrix\n\n| Capability | Command or MCP tool | Notes |\n|---|---|---|\n| One-shot setup | `research-hub setup` | init + install + optional NotebookLM login + guided sample run |\n| Lazy research pipeline | `research-hub auto \"topic\"` / `auto_research_topic` | Search, ingest, bundle, upload, generate, download |\n| Authenticity quarantine review | `research-hub quarantine list` / `show <id>` / `restore <id>` | Inspect and optionally restore papers the authenticity gate rejected (with the failing layer + reason) |\n| Plan before running | `research-hub plan \"intent\"` / `plan_research_workflow` | Suggests field, cluster slug, and max papers |\n| Resumable HITL workflow | `research-hub workflow init|status|validate|decide|resume|migrate` / `workflow_*` MCP tools | Durable schema 1.1 state, scoped decisions, recovery, and optional public policy checkpoints |\n| Zotero hygiene | `research-hub zotero backfill --tags --notes [--apply]` | Fills missing tags and notes on legacy items |\n| Cluster cascade delete | `research-hub clusters delete <slug> [--apply --force]` | Preview impact on Obsidian, Zotero, dedup, memory, and crystals |\n| No-NotebookLM smoke test | `research-hub auto \"topic\" --no-nlm` | Validates search and vault ingest without browser automation |\n| Local file ingest | `research-hub import-folder <folder> --cluster <slug>` | PDF, DOCX, MD, TXT, URL |\n| Ad-hoc cluster Q&A | `research-hub ask <cluster> \"question\"` / `ask_cluster_notebooklm` | Top-level CLI takes cluster first, then question |\n| NotebookLM operations | `research-hub notebooklm upload --cluster <slug>` | Browser automation with persistent Chrome |\n| Pre-computed crystals | `research-hub crystal emit --cluster <slug>` | Canonical answers cached as Markdown |\n| Structured memory | `research-hub memory emit --cluster <slug>` | Entities, claims, methods |\n| Live dashboard | `research-hub serve --dashboard` | HTTP dashboard with action buttons |\n| Sample preview | `research-hub dashboard --sample` | Temporary bundled vault, no accounts |\n| Lazy maintenance | `research-hub tidy` | Doctor, dedup, bases refresh, cleanup preview |\n| Garbage collection | `research-hub cleanup --all --apply` | Bundles, debug logs, stale artifacts |\n| Cluster repair | `research-hub clusters rebind --emit` then `--apply` | Rebinds orphaned notes |\n| Obsidian Bases | `research-hub bases emit --cluster <slug>` | Generated `.base` dashboard |\n| Web search | `research-hub websearch \"query\"` / `web_search` | Tavily, Brave, Google CSE, DDG fallback |\n\n---\n\n## Troubleshooting\n\n| Symptom | Cause | Fix |\n|---|---|---|\n| `research-hub init` reports Chrome warnings | Chrome is missing or patchright cannot find it | Install Chrome, then run `research-hub doctor` |\n| `research-hub notebooklm login` opens a browser but Google blocks login | New-device or bot challenge | Complete the visible browser sign-in and phone challenge |\n| `research-hub auto` finds 0 papers / empty vault | Topic too narrow OR papers were quarantined by the authenticity gate (unresolved DOI, failed integrity, or relevance-unjudged) | Re-run with `--max-papers 20` / rephrase; run `research-hub quarantine list` to see rejected papers + reasons |\n| `research-hub auto` stops before searching: \"no relevance judge on PATH\" | Fail-closed relevance check and no supported LLM CLI found | Install a judge CLI, or re-run with `--no-fit-check` to skip relevance judging |\n| NotebookLM upload or generate fails | NotebookLM UI changed or login expired | Run `research-hub notebooklm login --auto-detect`; then resume with `research-hub notebooklm bundle/upload/generate/download --cluster <slug>` |\n| `notebooklm upload` worked yesterday and now fails on auth | Google's `__Secure-1PSIDTS` / `PSIDRTS` cookies expire roughly every 3.5h; `notebooklm keepalive` cannot refresh them server-side | Re-run `research-hub notebooklm login --auto-detect` — the browser opens, the cookies refresh on sign-in, the session saves automatically (no terminal interaction). Takes < 1 minute |\n| `auto --with-crystals` cannot find an LLM CLI | No supported LLM CLI is on PATH | Install one, configure a custom adapter, or use `crystal emit` and `crystal apply` manually |\n| Claude Desktop cannot see the MCP server | MCP config is in the wrong file or host was not restarted | Check the host config path and restart Claude Desktop |\n| `init` reports Zotero warnings but you do not use Zotero | Persona expects Zotero | Re-run `research-hub setup --persona analyst` or `--persona internal` |\n| `research-hub clusters delete` refuses to delete | Cluster has papers, notes, or Zotero items | Re-run with `--apply --force` after reviewing the cascade preview |\n| `research-hub auto` errors \"cluster already has N papers\" | Cluster is non-empty and you ran `auto --cluster <slug>` without a flag | Add `--append` to add more, or `--force` to overwrite |\n| Zotero items miss `research-hub` tags or notes | Items were created before v0.61 or pipeline failed mid-run | `research-hub zotero backfill --tags --notes --apply` |\n\nFor broader checks, run:\n\n```bash\nresearch-hub doctor --autofix\n```\n\n---\n\n## Known limitations\n\nThese are **platform or design boundaries**, not bugs — please do not file\nthem as issues. They are documented here so you know what to expect and\nwhich workaround to reach for.\n\n| Limitation | What's actually happening | What to do |\n|---|---|---|\n| **IEEE Xplore PDFs / URLs are blocked** by anti-bot | IEEE returns an *\"Unable to Load Page\"* HTML stub to direct fetches. `paper attach-pdfs` can now route configured publisher PDF URLs through your institution's EZproxy and fall back to the direct URL if the proxy fails. | Configure `ezproxy_host_suffix` (hostname-rewrite mode, recommended for most institutions) or `ezproxy_url_template` (legacy), run `research-hub ezproxy login` once, then re-run `paper attach-pdfs`. See [EZproxy PDF access](docs/ezproxy.md). Without EZproxy, manually attach the PDF through institutional access or skip the source. |\n| **NotebookLM session expires ~every 3.5h** | Google's short-lived `__Secure-1PSIDTS` / `PSIDRTS` cookies are not refreshable by background polling. `notebooklm keepalive` exists but cannot rotate them server-side. | Re-run `research-hub notebooklm login --auto-detect` when a run reports an auth failure — < 1 minute, no terminal interaction. |\n| **`--no-llm-fit-check` can't filter \"wrong sub-topic, right field\"** | The no-LLM BM25 gate is designed to catch *blatant cross-field contamination* (e.g. pure hydrology with zero AI in an LLM cluster). It cannot tell \"AI-agents-in-general\" from \"AI-agents-in-water-resources\" — both score similarly on a lexical-only metric, so the gate is recall-biased and keeps both. | For topic-specific subset filtering, use the **default** LLM-judge path (drop `--no-llm-fit-check`). The LLM-judge layer is what's designed to make semantic relevance calls. |\n| **Cluster-overview LLM auto-fill writes English headings even when the scaffold is Chinese** | `topic.py` writes Chinese section headings (`## 核心問題`, `## 範圍定義`, …) for the empty scaffold, but `apply_overview` re-renders the file with English headings (`## Core Question`, `## Scope`, …) when the LLM fills it in. | Cosmetic — content is correct. If you prefer Chinese headings on the filled overview, hand-curate the section names after the first auto-fill (the markers ensure subsequent runs preserve your edits). |\n| **`auto_pipeline()` Python API stays opt-in for PDFs** (CLI is opt-out) | Programmatic callers — tests, library users — get `with_pdfs=False` by default so the PDF-attach network round-trips don't fire silently. The CLI hands in `True` from `BooleanOptionalAction`. | If you call `auto_pipeline()` directly and want PDFs attached, pass `with_pdfs=True` explicitly. CLI users get the default-on behaviour automatically; use `--no-with-pdfs` to opt out. |\n| **Slow / blocked publisher URLs sometimes poison the NotebookLM bundle** | Some publishers (Wiley paywalls, Frontiers oddly-routed PDFs, IEEE) return either a thin stub or an HTML error page that the bundle ladder admits because the URL pre-check passed. Downstream NotebookLM grounds on the stub instead of the paper. | Run `auto` and inspect the `[warn] N source(s) look like they did not ingest content` block. Replace the listed URLs with PDFs uploaded to the NotebookLM web UI for those papers. |\n\n---\n\n## Docs + Status + Dev\n\nDocs: [First 10 minutes](docs/first-10-minutes.md), [workflow runtime](docs/workflow-runtime.md), [evidence packet](docs/research-evidence-packet.md), [lazy mode](docs/lazy-mode.md), [dashboard walkthrough](docs/dashboard-walkthrough.md), [MCP tools](docs/mcp-tools.md), [AI host support matrix](docs/ai-host-support.md), [live smoke checklist](docs/live-smoke.md), [personas](docs/personas.md), [NotebookLM setup](docs/notebooklm.md), [EZproxy PDF access](docs/ezproxy.md), [import folder](docs/import-folder.md), [CLI reference](docs/cli-reference.md), [CHANGELOG](CHANGELOG.md).\n\nStatus:\n\n- Current docs target: v0.95.0; see [CHANGELOG](CHANGELOG.md) for package history, [docs/stable-api.md](docs/stable-api.md) for the supported API surface, and [docs/file-formats.md](docs/file-formats.md) for parseable state-file schemas.\n- MCP tools: inspect the live list with `python -m research_hub describe --filter mcp_tools`.\n- REST endpoints: 12 at `/api/v1/*`.\n- Bundled skills: inspect the live list with `python -m research_hub describe --filter skills`.\n\nDeveloper setup:\n\n```bash\ngit clone https://github.com/WenyuChiou/research-hub.git\ncd research-hub\npip install -e \".[dev,playwright]\"\npython -m pytest -q\n```\n\nContributing: [CONTRIBUTING.md](CONTRIBUTING.md). Package on PyPI: `research-hub-pipeline`. CLI entry point: `research-hub`.\n\n## License\n\nMIT. See [LICENSE](LICENSE).\n",
  "bytes": 27477,
  "sha": "f86439958cbe35aece7161be591d566212d02ceec20e029c945fa24646db815e",
  "repo_slug": "wenyuchiou/research-hub",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_wenyuchiou_research_hub_8b71dffe/readme"
}