🎬 Notion Movies Skill
This skill transforms a Notion movie database into an intelligent, searchable, and self-enriching system.
It combines:
- Notion (data storage)
- TMDB (movie metadata)
- Ollama (embeddings)
- Qdrant (semantic search)
🧠 Why this skill exists
This is not just about saving and searching movies.
It turns Notion into a semantic knowledge system for movies, allowing agents to:
- understand meaning (not just keywords)
- enrich data automatically
- avoid duplicates
- recommend content intelligently
🔥 What you can actually do with it
🎬 1. Smart movie ingestion
Instead of manually filling fields:
"add Interstellar"The agent will:
- create the page
- fetch poster
- fetch plot
- fetch director
- fetch genres
- fetch actors, runtime, year
- format everything properly
🧬 2. Automatic duplicate detection
Prevents:
- Interstellar
- Interstellar (2014)
- Interestellar ❌
Agent behavior:
"This movie already exists. Enriching instead of duplicating."Detection uses:
- fuzzy matching (typos)
- normalized titles (removes year)
- semantic similarity (vector-based)
🔎 3. Human-like search (semantic + explainable)
Instead of exact filters, you can ask:
"movies about time travel"
"romantic movies in Europe"
"movies like Nolan"
"movies that make you think"The system understands intent, not just words.
🧠 Explainable results
Each result includes:
- similarity score
- reasoning
Example:
{
"title": "Interstellar",
"score": 0.92,
"explanation": "Similar because: genre similarity, plot similarity"
}This makes results transparent and debuggable.
🤖 4. Personal recommendation engine
Example:
"recommend something like Fight Club"→ returns semantically similar movies
🧠 5. Turn Notion into a knowledge system
From:
Static databaseTo:
Living, searchable, intelligent system⚡ 6. Agent workflows (OpenClaw)
Example flow:
User → "I want something like Interstellar"
→ searchMovies
→ rank results
→ explain results
→ suggest options
→ user selects one
→ addMovie
→ enrichMovie
→ index vector⚙️ Environment Variables
Required:
NOTION_KEYTMDB_API_KEY
Optional:
QDRANT_URL(default: http://localhost:6333)OLLAMA_URL(default: http://localhost:11434)
🧩 Actions
➕ addMovie
Creates a movie page (basic structure)
{
"title": "Interstellar",
"databaseQuery": "Movies"
}Behavior:
- checks duplicates before creating
- prevents near-identical entries
🎬 enrichMovie
Enriches a movie with:
- Poster (property + cover)
- Plot (Notion blocks)
- Director
- Genres
- Actors (top 5)
- Year
- Runtime
- Emoji 🎬
- Embedding (vector index)
{
"title": "Interstellar",
"databaseQuery": "Movies"
}🔎 searchMovies
Semantic search with explainability
{
"query": "movies about space exploration"
}Returns:
- top matches
- similarity score
- explanation
🧬 detectDuplicate
Detects duplicates using:
- embeddings similarity
- fuzzy matching
- normalized titles
{
"title": "Interstellar",
"databaseQuery": "Movies"
}🔁 syncDatabase
Sync Notion → Qdrant (vector DB)
{
"databaseQuery": "Movies"
}🧠 Embedding Strategy
Embeddings are built from enriched semantic content:
Title
Genres
Director
Plot
Themes (inferred)✨ Example embedding input
Title: Interstellar
Genres: Science Fiction, Drama
Director: Christopher Nolan
Plot: A team travels through a wormhole in space...
Themes: space, time, futuristic⚡ Optimization
- important fields are repeated (weighting)
- themes inferred automatically from plot
- improves semantic recall and ranking
🧠 Data Enrichment Logic
🎥 Director
- Source: TMDB
/credits - Stored in:
Director/es
🏷️ Genres
- Source: TMDB
/movie/{id} - Stored in:
Género
🧠 Plot
- Source: TMDB overview
- Stored as Notion blocks:
- Callout - Quote
🖼️ Poster
- Source: TMDB
- Stored as:
- Portada - Notion cover
🎭 Actors
- Source: TMDB
/credits - Top 5 stored in
Actores
📅 Year
- Source: release date
- Stored in
Año
⏱️ Runtime
- Source: TMDB details
- Stored in
Duración
🔐 Edge Case Handling
❌ Movie not found
{
"error": "Movie not found in TMDB"
}⚠️ Ambiguous results
{
"error": "Multiple matches found",
"options": [
{ "title": "Dune", "year": "2021" },
{ "title": "Dune", "year": "1984" }
]
}🧠 Embedding fallback
If embedding fails:
- returns zero vector
- prevents system crashes
- keeps pipeline running
🧬 Duplicate handling
System prevents:
- typos
- alternate titles
- same movie with year variations
⚠️ Notion Schema Requirements
| Property | Type |
|---|---|
| Nombre | title |
| Director/es | rich_text |
| Género | multi_select |
| Portada | files |
| Rating | select |
| Estado | status |
🧩 Extended Schema (Recommended)
| Property | Type | Description |
|---|---|---|
| Año | number | Release year |
| Actores | rich_text | Main cast |
| Duración | number | Runtime |
🤖 Agent Guidelines
Agents should:
- ALWAYS use
databaseQuery - ALWAYS check duplicates before adding
- prefer semantic search over filters
- explain recommendations when possible
- enrich instead of duplicating
- only fill missing data
- handle ambiguity before proceeding
- gracefully handle API failures
⚡ Performance Notes
- embeddings generated via Ollama (
nomic-embed-text:v1.5) - vectors stored in Qdrant
- each movie indexed as semantic document
- payload includes metadata for explainability
🚀 Advanced Capabilities
- Semantic search (embedding-based)
- Explainable recommendations
- Hybrid duplicate detection (semantic + fuzzy)
- Automatic enrichment pipeline
- Robust error handling
- Agent-ready design (OpenClaw compatible)