Export research sources from Zotero to NotebookLM with a simple right-click.
This plugin allows you to quickly send URLs from your Zotero library to NotebookLM for AI-powered analysis and research assistance.
- One-Click Export: Right-click on Zotero items and select "Add to NotebookLM"
- Notebook Selection: Choose which NotebookLM notebook to export to
- Batch Export: Export multiple items at once
- Browser Authentication: Secure login via browser-based OAuth flow
- Free NotebookLM Support: Works with consumer/free NotebookLM accounts
The plugin uses a hybrid architecture:
- Zotero Plugin (TypeScript): Provides UI and context menu integration
- Python Backend (FastAPI): Handles NotebookLM API communication via notebooklm-py
This design leverages the mature Python ecosystem for NotebookLM integration while maintaining a seamless Zotero user experience.
- Zotero 8 or higher
- Python 3.10+
- Node.js 18+ (for development only)
- NotebookLM account (free at notebooklm.google.com)
cd python
uv sync
uv run playwright install chromiumThe server must be running for the plugin to work:
cd python
python -m uvicorn server:app --host 127.0.0.1 --port 5847Or use the npm script:
npm run start-serverTip: Keep the server running in a terminal tab while using Zotero.
npm install
npm run buildThis compiles TypeScript and creates the plugin files in the build/ directory.
- Open Zotero
- Go to Tools → Plugins
- Click the gear icon → Install Plugin From File
- Navigate to the repository and select the built
.xpifile (or install from theaddon/directory directly) - Restart Zotero
- Authentication: On first use, the plugin will prompt you to login to NotebookLM
- A browser window will open for you to authenticate with your Google account
- After authentication, credentials are stored locally for future use
- Select one or more items in your Zotero library that have URLs
- Right-click and select "Add to NotebookLM"
- Choose which notebook to export to from the list
- Wait for the export to complete
The plugin will:
- Extract URLs from the selected items
- Display a notebook selection dialog
- Add each URL to the selected NotebookLM notebook
- Show progress and completion status
- Items must have a URL field populated
- Only valid HTTP/HTTPS URLs will be exported
- Invalid URLs will be skipped with a warning
The default server port is 5847. To change it:
- Edit
python/server.pyand change the port in theuvicorn.run()call - Update
src/modules/notebookmlService.tsto match the new port - Rebuild the plugin
The plugin attempts to auto-start the Python server when Zotero launches. If this fails:
- Start the server manually (see Installation step 2)
- The plugin will detect the running server automatically
zotero-notebooklm-plugin/
├── src/ # TypeScript plugin source
│ ├── index.ts # Main entry point
│ ├── hooks.ts # Lifecycle management
│ ├── modules/
│ │ ├── contextMenu.ts # Context menu logic
│ │ ├── notebookmlService.ts # HTTP client
│ │ └── dialogs.ts # UI dialogs
│ └── types/
│ └── notebooklm.ts # TypeScript interfaces
├── python/ # Python backend
│ ├── server.py # FastAPI server
│ ├── notebooklm_handler.py # NotebookLM API wrapper
│ └── auth_manager.py # Authentication
├── addon/ # Zotero plugin files
│ ├── manifest.json # Plugin manifest
│ └── locale/ # Localization
└── build/ # Compiled output
# Development build with watch
npm run dev
# Production build
npm run build
# Package as XPI
npm run package# Test Python server
cd python
python -m pytest
# Test server is running
curl http://127.0.0.1:5847/api/healthSolution: Start the Python server manually:
cd python
python -m uvicorn server:app --port 5847Solution: Install required packages:
cd python
uv sync
uv run playwright install chromiumSolutions:
- Check your internet connection
- Ensure you have a NotebookLM account
- Try logging out and back in
- Check the Python server logs for errors
Solution: Ensure your Zotero items have URLs in the URL field:
- Select an item in Zotero
- In the right panel, find the URL field
- Add the webpage URL for the source
Solutions:
- Check Python is installed:
python3 --version - Verify uvicorn is installed:
python3 -m uvicorn --version - Check port 5847 isn't already in use:
lsof -i :5847(macOS/Linux) - Review server logs for specific errors
The Python server provides these endpoints:
GET /api/health- Health checkGET /api/auth/status- Check authentication statusPOST /api/auth/login- Trigger login flowGET /api/notebooks- List all notebooksPOST /api/notebooks/{id}/urls- Add URL to notebookPOST /api/shutdown- Graceful shutdown
Contributions are welcome! Please:
- Fork the repository
- Create a feature branch
- Make your changes
- Submit a pull request
MIT License - see LICENSE for details
Built with:
For issues and feature requests, please use the GitHub issue tracker.