Agent skill

Nlm

by tmc in tmc/nlm

Manages Google NotebookLM notebooks via the nlm CLI. An agent skill from tmc/nlm.

MITAuto-check: notesKnowledge Management

Install Nlm

skills CLI
$ npx skills add tmc/nlm --skill nlm -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install tmc/nlm nlm --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/tmc/nlm.git skills-src && mkdir -p .claude/skills && cp -r skills-src/skills/nlm .claude/skills/nlm && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
nlm
GitHub stars
391
Token cost
~2.2k tokens
SKILL.md length
700 words
Files
2
Skills in repo
1
Repo updated
First seen
Licence
MIT

At a glance

Manages Google NotebookLM notebooks via the nlm CLI. An agent skill from tmc/nlm.

  • Creating notebooks
  • SKILL.md covers Command Discovery, Interpreting $ARGUMENTS, Critical Practices and Common Workflows, plus 2 more sections
  • Calls pdftotext
  • Listing and syncing sources

What it does

Nlm is an agent skill from tmc/nlm. Manages Google NotebookLM notebooks via the nlm CLI. Use for creating notebooks, listing and syncing sources, uploading files/URLs/text, chatting with sources, generating reports/audio/video/slides, running research, managing labels, editing notebook metadata (title/emoji/description/cover), and managing notebook content.

Its SKILL.md is about 2.2k tokens, which your agent loads only when the skill is triggered. The skill folder holds 2 other files (for example `reference/commands.md`).

It sits in Knowledge Management, covering Source-grounded notebooks and Slides and decks. It works with NotebookLM. The repository describes itself as: a command line interface to NotebookLM. The licence is MIT.

When your agent uses it

  • Creating notebooks
  • Listing and syncing sources
  • Uploading files/URLs/text
  • Chatting with sources

Example prompts

  • “Use the nlm skill to manage Google NotebookLM notebooks via the nlm CLI. An agent skill from tmc/nlm”
  • “/nlm”

Requirements

  • Pre-approved tools (allowed-tools): Bash(*), Read, Glob, Grep, Write

What it can do on your machine

Read from SKILL.md and the folder at commit 7a173b4. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves these tools, so the agent can use them without asking each time:

    • Bash(*)
    • Read
    • Glob
    • Grep
    • Write

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • pdftotext

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Nlm loads about 2.2k tokens when it runs. Until then it costs about 82 tokens; SKILL.md has 700 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~82
When it runs · the whole SKILL.md, loaded when a task matches
~2.2k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check: notes

The automated check noted patterns worth knowing about, such as sudo or a known installer.

  • NotePre-approves every shell command (allowed-tools: Bash)SKILL.md
    allowed-tools: Bash(*), Read, Glob, Grep, Write

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from tmc/nlm at commit 7a173b4, republished under its MIT licence (© tmc). 700 words, ~2,173 tokens.

Download SKILL.mdSave it as .claude/skills/nlm/SKILL.md (or your agent's skills folder). This skill also uses 1 other file; get the full folder from GitHub.
name
nlm
description
Manages Google NotebookLM notebooks via the nlm CLI. Use for creating notebooks, listing and syncing sources, uploading files/URLs/text, chatting with sources, generating reports/audio/video/slides, running research, managing labels, editing notebook metadata (title/emoji/description/cover), and managing notebook content.
allowed-tools
Bash(*), Read, Glob, Grep, Write
when_to_use
User mentions NotebookLM, nlm, notebook IDs, source upload/sync, chat with sources, report/audio/video/slides generation, research, labels/autolabel clusters…
argument-hint
[action] [args...]

nlm — NotebookLM CLI

Command Discovery

Run nlm --help for the canonical command tree. Run nlm <command> --help for command-local flags. The stable surface is noun-first: notebook, source, note, artifact, and chat groups.

For a compact command map, read reference/commands.md only when needed. Always prefer live help output when it disagrees with the reference.

Interpreting $ARGUMENTS

ArgumentAction
(empty)Run nlm notebook list, then ask what to do
create or newCreate a notebook with nlm notebook create
upload or addAdd one-off sources with nlm source add
syncSync a directory as a managed source with nlm source sync
chatStart, resume, or run one-shot chat
researchRun nlm research and choose fast/deep mode if needed
audio / video / slides / reportUse the corresponding create or generation command
statusShow notebook, sources, artifacts, and recent chats
a notebook IDShow details for that notebook
a file path or globUpload that file/pattern to a notebook

Critical Practices

  • Surface full UUIDs for notebooks, sources, conversations, notes, and artifacts in responses. Follow-up commands need them.
  • Use -y for destructive operations in non-interactive contexts, for example nlm -y notebook delete <id>.
  • Use nlm auth --authuser N or NLM_AUTHUSER=N for non-default Google accounts.
  • Use --direct-rpc for audio download; if the direct fetch is unavailable, it prints the NotebookLM browser URL. video download enables the required direct-RPC path itself and uses the same browser fallback.
  • Prefer canonical grouped commands in all new guidance.

Common Workflows

List notebooks

bash
nlm notebook list
nlm notebook list --limit 25
nlm notebook list --all

Add one-off sources — use source add for files, URLs, and direct text. Pass - to read newline-delimited source references from stdin.

bash
nlm source add <notebook-id> https://example.com/article
nlm source add <notebook-id> ./paper.pdf
nlm source add --name "API notes" <notebook-id> ./notes.txt
printf '%s\n' ./a.pdf https://example.com/b | nlm source add <notebook-id> -

Sync a directory as one source — source sync packs files into txtar, quotes nested txtar markers, chunks large payloads, and skips unchanged chunks using a content-hash cache. Use it whenever the same tree will be re-uploaded. Use source add for one-shot single-file/URL uploads.

bash
nlm source sync <notebook-id> src/
nlm source sync --name "project: src/" <notebook-id> src/
nlm source sync --dry-run <notebook-id> .
nlm source sync --force <notebook-id> ./docs ./notes
nlm source sync --json <notebook-id> .

Preview what sync will upload — source pack writes the exact txtar bytes sync would upload, no network. Pipe through txtar --list or txtar -x to inspect:

bash
nlm source pack src/ | txtar --list
nlm source pack src/ > preview.txtar
nlm source pack --chunk 2 src/ > pt2.txtar

Focus on specific sources — --source-ids and --source-match scope chat, generate-chat, generate-report, source-guide, and content transforms. --source-match is a Go regex matched against titles and UUIDs.

bash
nlm chat --source-match 'internal/sync' <notebook-id> "What changed?"
nlm generate-chat --source-ids a,b,c <notebook-id> "Summarize these"
nlm summarize --source-match '^spec/' <notebook-id>
nlm source list <notebook-id> | grep Q3 | nlm chat --source-ids - <notebook-id> "Risks?"

Chat and continuation

bash
nlm chat <notebook-id>
nlm chat <notebook-id> "What are the main conclusions?"
nlm generate-chat --conversation <conversation-id> <notebook-id> "Follow up"
nlm chat show --citations tail <notebook-id> <conversation-id>

Research

bash
nlm research <notebook-id> "What changed in the source set?"
nlm research --mode fast <notebook-id> "Which docs should I read first?"
nlm research --md <notebook-id> "Write a concise brief" > report.md
nlm research --import <notebook-id> "Find source material"

Content creation — creation may take time. Poll with artifact list, audio list, or video list.

bash
nlm create-audio <notebook-id> "Conversational, focus on key decisions"
nlm create-video <notebook-id> "Whiteboard walkthrough"
nlm create-slides <notebook-id> "Presentation summary"
nlm generate-report --sections 3 <notebook-id>
nlm artifact list <notebook-id>
nlm --direct-rpc audio download <notebook-id> output.wav
nlm --direct-rpc video download <notebook-id> output.mp4

Rename after stdin upload — stdin text defaults to "Pasted Text"; use --name during upload or rename after:

bash
nlm source rename <source-id> "descriptive name"

Notebook metadata — title, emoji, description, and cover are separate commands. cover takes a built-in preset ID; cover-image uploads a custom image. unrecent only hides from the recents list, it does not delete.

Show full SKILL.md (277 more words)Show less
bash
nlm notebook rename <notebook-id> "New Title"
nlm notebook emoji <notebook-id> "📓"
nlm notebook description <notebook-id> "One-line summary"
echo "long description" | nlm notebook description <notebook-id>
nlm notebook cover <notebook-id> 4
nlm notebook cover-image <notebook-id> ./cover.png
nlm notebook unrecent <notebook-id>

Labels (autolabel clusters) — labels are server-side clusters over sources. generate and relabel-all are heavy server jobs (relabel-all can exceed the 60s deadline on large notebooks); unlabeled only touches sources without a label. attach takes one source per call.

bash
nlm label list <notebook-id>
nlm label generate <notebook-id>
nlm label create <notebook-id> "Important" "⭐"
nlm label rename <notebook-id> <label-id> "New Name"
nlm label emoji <notebook-id> <label-id> "🐛"
nlm label delete <notebook-id> <label-id> [<label-id>...]
nlm label unlabeled <notebook-id>
nlm label relabel-all <notebook-id>
nlm label attach <notebook-id> <label-id|name> <source-id|name>

Discover sources vs chat — discover-sources calls a server-driven source-discovery RPC (Es3dTe) that returns ranked source IDs for a query. If the server rejects it (error or transient code-13), the CLI falls back to a regular chat call asking the model to list relevant sources. Use it to pick --source-ids for a follow-up; use nlm chat when you want a narrative answer rather than just IDs.

bash
nlm discover-sources <notebook-id> "Q3 revenue assumptions"

Source Freshness Strategy

Pick the lightest tool that does the job:

  • nlm source check <source-id> [notebook-id] — Drive-only. Asks Google whether the indexed copy is still current. No re-index, no upload. Use to decide whether anything else is needed.
  • nlm source refresh <notebook-id> <source-id> — Drive-only. Re-indexes the existing source in place. Use when check reports stale and the source is still a Google Drive document.
  • Re-upload — for non-Drive sources (files, URLs, pasted text) check and refresh do not apply. Use nlm source delete then nlm source add, or for a synced tree run nlm source sync (it auto-detects changed chunks; --force to re-upload unchanged content).

Binary upload workarounds — if a binary upload fails, convert to text:

bash
pdftotext paper.pdf - | nlm source add --name "paper text" <notebook-id> -
plutil -convert xml1 -o - file.plist | nlm source add --name "plist text" <notebook-id> -

Error Recovery

ErrorFix
"Authentication required"Run nlm auth
"Service unavailable" on uploadRetry after a few seconds (rate limit)
"source limit reached" or "Failed precondition" on addRemove unused sources or use a smaller target notebook
"upload init failed (status 500)"Try text extraction workaround
--source-match matched no sourcesRe-run nlm source list <notebook-id> and adjust the regex

© tmc, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

SKILL.md and 1 other file in skills/nlm of tmc/nlm.

  • SKILL.md
  • reference/commands.md

Open the folder on GitHubat commit 7a173b4

Compare with similar skills

Nlm next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Nlm compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Nlm this skilltmc/nlm391—~2.2kAutomated safety check: NotesMIT
Notebooklmrobonuggets/notebooklm-skill139—~2.5kAutomated safety check: PassNone
Notebooklm Slide StylesYamilAyma/notebooklm-prompt-styles104—~744Automated safety check: PassNone
Notebooklm CLIItamarZand88/CLI-Anything-WEB231—~1.4kAutomated safety check: PassMIT
Nlm Skilliusztinpaul/ai-research-os-workshop1791 repos~6.9kAutomated safety check: PassMIT
Notebooklmalirezarezvani/claude-skills28k—~4kAutomated safety check: PassMIT

Similar skills

  • Notebooklm

    robonuggets/notebooklm-skill

    Query, manage, and automate Google NotebookLM from your AI agent.

    139 GitHub stars~2.5k tokensUpdated 6 mo ago
    Knowledge ManagementAuto-check passed
  • Notebooklm Slide Styles

    YamilAyma/notebooklm-prompt-styles

    Translates visual identity and design documents into standardized YAML for NotebookLM slide generation.

    104 GitHub stars~744 tokensUpdated 5 mo ago
    Knowledge ManagementAuto-check passed
  • Notebooklm CLI

    ItamarZand88/CLI-Anything-WEB

    Use cli-web-notebooklm to interact with Google NotebookLM — create notebooks, add sources, ask questions, generate artifacts (audio, video, slides, mindmap, study guide, quiz, briefing, infographic…

    231 GitHub stars~1.4k tokensUpdated 6 days ago
    Knowledge ManagementAuto-check passed
  • Nlm Skill

    iusztinpaul/ai-research-os-workshop

    Expert guide for the NotebookLM CLI (nlm) and MCP server - interfaces for Google NotebookLM.

    179 GitHub starsUsed in 1 repo~6.9k tokens
    Knowledge ManagementAuto-check passed
  • Notebooklm

    alirezarezvani/claude-skills

    Browser automation skill for controlling Google's NotebookLM.

    28k GitHub stars~4k tokensUpdated 1 mo ago
    Knowledge ManagementAuto-check passed
  • Notebooklm CLI

    ItamarZand88/CLI-Anything-WEB

    Drives Google NotebookLM via the cli-web-notebooklm command-line tool — create and manage notebooks, add URL/text sources, ask questions grounded in the sources, and generate/download artifacts…

    231 GitHub stars~997 tokensUpdated 6 days ago
    Knowledge ManagementAuto-check passed

Works with

Questions about Nlm

What does Nlm do?

Manages Google NotebookLM notebooks via the nlm CLI. An agent skill from tmc/nlm. Nlm is an agent skill from tmc/nlm. Manages Google NotebookLM notebooks via the nlm CLI.

When should I use Nlm?

Nlm fits situations like: creating notebooks; listing and syncing sources; uploading files/URLs/text; chatting with sources.

How do I install Nlm in Claude Code?

Run `npx skills add tmc/nlm --skill nlm -a claude-code`. Or copy the skill folder (skills/nlm in tmc/nlm) into .claude/skills/nlm in your project. Claude Code loads it when a task matches its description.

How do I install Nlm in Codex?

Run `npx skills add tmc/nlm --skill nlm -a codex`. Or copy the skill folder (skills/nlm in tmc/nlm) into .agents/skills/nlm in your project. Codex loads it when a task matches its description.

Can I use Nlm in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add tmc/nlm --skill nlm -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/nlm, .gemini/skills/nlm, .github/skills/nlm and .opencode/skills/nlm in your project.

What does Nlm need to run?

Going by SKILL.md and its folder, Nlm needs the command-line tools its instructions call (pdftotext). Its frontmatter pre-approves these tools: Bash(*), Read, Glob, Grep, Write.

Does Nlm access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Nlm safe to install?

Our automated static check of SKILL.md found notes only (pre-approves every shell command (allowed-tools: bash)), nothing it rates as a warning. It is not a guarantee. Review the folder before installing.

What licence does Nlm use?

Nlm is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Nlm use?

About 2.2k tokens (SKILL.md is roughly 8.7k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Nlm?

Skills that share tags, products or a category with Nlm: Notebooklm (robonuggets/notebooklm-skill, 139 stars), Notebooklm Slide Styles (YamilAyma/notebooklm-prompt-styles, 104 stars), Notebooklm CLI (ItamarZand88/CLI-Anything-WEB, 231 stars) and Nlm Skill (iusztinpaul/ai-research-os-workshop, 179 stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Nlm?

tmc (a GitHub user) maintains it in tmc/nlm, which has 391 GitHub stars. The repository was last updated on September 23, 2026.

Source: tmc/nlm on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.