curator-mcp
Provides zero-key Apple Podcasts search/discovery for finding shows and supporting podcast queue, listening log, and takeaway management.
Uses Google Cloud Firestore as the persistent database for books, media, quotes, podcasts, and recommendations, including batch imports and filtered queries.
Imports Goodreads library exports (CSV) to build a personal book library, to-read queue, and reading history.
Provides live book search and discovery via the Google Books API, with automatic fallback to Open Library on rate limits.
Imports IMDb ratings and watchlist CSV exports to track watched media and user preferences, with ratings taking precedence for overlapping items.
Provides movie and TV discovery, metadata such as posters and overviews, and similar-media recommendations via the TMDB API.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@curator-mcpRecommend a movie like Inception that I haven't watched yet"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Curator MCP (curator-mcp)
A production-grade Model Context Protocol (MCP) server and automated data ingestion pipeline that transforms Google Cloud Firestore into your private, intelligent entertainment memory, literature companion, knowledge vault, fine dining guide, and connoisseur taste curator.
Connects natively to Gemini, Claude Desktop, Antigravity IDE, and other MCP-compliant agents, enabling natural language tracking and exploration across:
Books: Library ingestion, to-read queue, currently-reading tracking, Google Books & Open Library live discovery.
Movies & TV: IMDb ratings and watchlist ingestion, TMDB discovery, and automated similar-media recommendations.
Memorable Quotes & Mental Models: Capturing principles, philosophies, and memorable dialogue with theme tagging and spaced retrieval.
Podcasts: Queue management, listening logs, guest tracking, key takeaways, and zero-key Apple Podcasts discovery.
Sensory Vault: Connoisseur tasting logs for Tea, Whiskey, Coffee, Gin, Wine, Chocolate, Perfume, and Watches with flavor wheel accords and domain specs.
Fine Dining & Restaurants: Gastronomy journal, city guides, Michelin distinctions, signature dishes, and reservation wishlists.
AI-Agent Empowered Recommendations: Supplies the calling LLM agent with deep personal Taste DNA, strict Negative Exclusion Catalogs, real-time web search directives, and candidate vetting for zero-collision discoveries.
Multimodal Sensory Pairings: Cross-domain aesthetic pairings bridging books and films with beverages, ambient fragrances, chocolates, and sonic atmospheres.
Persistent Long-Term Memory Vault: Autonomous cross-session retention of personal quirks, habits, dietary/sensory preferences, goals, and critical directives, with deduplication and ambient context injection.
Claude Desktop Native Prompts & Resources: Zero-click background context (
curator://context/...) and 1-click/slash commands (/daily-briefing,/tasting-session,/weekend-curation,/smart-recommendation-consultation).
šļø Clean Architecture & Design
curator-mcp is architected using Domain-Driven Design (DDD) and Clean Architecture principles. Rather than cramming business logic into a single file, the system is organized into modular, testable, and loosely-coupled components:
graph TD
Client["MCP Client (Gemini / Claude Desktop / IDE)"] -->|JSON-RPC / stdio| FastMCP["Presentation Layer (mcp_server.py)"]
subgraph "Domain Services Layer (services/)"
FastMCP --> BS["BookService"]
FastMCP --> MS["MediaService"]
FastMCP --> QS["QuoteService"]
FastMCP --> PS["PodcastService"]
FastMCP --> RS["RecommendationService"]
end
subgraph "Data Access Layer (services/base_repository.py & importers/)"
BS --> Repo["BaseFirestoreRepository"]
MS --> Repo
QS --> Repo
PS --> Repo
RS --> Repo
GI["GoodreadsImporter"] --> BI["BaseImporter"]
II["IMDbImporter"] --> BI
end
subgraph "External Clients (services/external/)"
RS --> BC["BookMetadataClient"]
RS --> TC["TMDBClient"]
FastMCP --> BC
FastMCP --> TC
FastMCP --> PC["ApplePodcastsClient"]
end
Repo -->|Batch / Filter Query| Firestore[("Google Cloud Firestore")]
BI -->|500-Doc Commits| Firestore
BC -->|HTTP| GB["Google Books API"]
BC -.->|Automatic 429 Fallback| OL["Open Library API"]
TC -->|v3/v4 API| TMDB["The Movie Database"]
PC -->|Public Search| AP["Apple Podcasts API"]Key Architectural Strengths:
Presentation Decoupling:
mcp_server.pyacts as a thin controller exposing FastMCP tool endpoints that delegate directly to domain services.Repository Pattern:
BaseFirestoreRepositoryencapsulates all Firestore CRUD andFieldFilterquery operations.Batch Processing:
BaseImporterimplements safe 500-document batching chunks and dry-run simulation for CSV ingestion.Resilient Fallbacks:
BookMetadataClientqueries Google Books and transparently falls back to Open Library when rate limits (HTTP 429) occur.
Related MCP server: MediaSage
š Repository Structure
curator-mcp/
āāā .env.example # Environment configuration template
āāā .gitignore # Strict protection for credentials, .env, and CSVs
āāā pyproject.toml # Python dependencies & build metadata
āāā README.md # Comprehensive documentation
āāā config.py # Firebase Admin SDK & lazy Firestore singleton
āāā models.py # Pydantic data schemas (Book, Media, Quote, Podcast)
āāā mcp_server.py # FastMCP presentation layer (25 tools)
ā
āāā services/ # Domain & Application Services
ā āāā __init__.py # Public domain service exports
ā āāā base_repository.py # Generic Firestore Repository with CRUD & filtering
ā āāā book_service.py # Book library, queues, and reading logs
ā āāā media_service.py # Movies/TV, watchlists, and rating logs
ā āāā quote_service.py # Memorable quotes, tags, and spaced retrieval
ā āāā podcast_service.py # Podcast queues, takeaways, and listening logs
ā āāā recommendation_service.py # Taste profiling & cross-collection deduplication
ā ā
ā āāā external/ # External Third-Party API Clients
ā āāā __init__.py
ā āāā books_client.py # Google Books + Open Library fallback client
ā āāā tmdb_client.py # The Movie Database (TMDB) API client
ā āāā podcasts_client.py # Apple Podcasts API client (zero-key)
ā
āāā importers/ # Ingestion Pipelines
ā āāā __init__.py
ā āāā base.py # Abstract BaseImporter with 500-doc chunking
ā āāā goodreads_importer.py # Goodreads CSV ingestion pipeline
ā āāā imdb_importer.py # IMDb ratings & watchlist CSV ingestion pipeline
ā
āāā sample_data/ # Safe, synthetic datasets for testing
ā āāā goodreads_sample.csv
ā āāā imdb_ratings_sample.csv
ā āāā imdb_watchlist_sample.csv
ā
āāā tests/ # Automated Test Suite (21 tests)
āāā test_models_and_importers.py # Schema validation & CSV parser tests
āāā test_domain_services.py # Domain services, OOP repositories, & client mocks
āāā test_quotes_and_podcasts.py # Quotes, podcasts, and metadata tests
āāā test_services.py # External API fallback and error handling testsš Getting Started
1. Prerequisites
Python:
3.10or newer.Google Cloud / Firebase Project: With Cloud Firestore enabled in Native mode.
Firebase Service Account: Downloaded JSON credentials key.
2. Installation
Clone the repository and set up a virtual environment:
git clone https://github.com/your-username/curator-mcp.git
cd curator-mcp
# Using python venv
python3 -m venv .venv
source .venv/bin/activate
# Install dependencies
pip install -e .3. Firebase Service Account Configuration
In the Firebase Console, go to Project Settings > Service accounts.
Click Generate new private key and save the JSON file.
Move the file into your project directory (e.g.
service-account.json).Copy
.env.exampleto.env:cp .env.example .envEdit
.env:FIREBASE_CREDENTIALS_PATH=./service-account.json # Optional: For movie & TV posters, overviews, and similar media recommendations TMDB_API_KEY=your_tmdb_api_key_here # Optional: For higher Google Books quota (basic search works without a key) GOOGLE_BOOKS_API_KEY=your_google_books_key_here
š„ Data Ingestion Pipelines
Import your existing personal libraries into Firestore using the batch importers.
Goodreads Library Import
Export your library from Goodreads (My Books > Import and Export > Export Library):
# Preview records without writing (Dry Run)
python -m importers.goodreads_importer path/to/goodreads_library_export.csv --dry-run
# Execute batch write into Firestore 'books' collection
python -m importers.goodreads_importer path/to/goodreads_library_export.csvIMDb Ratings & Watchlist Import
Export your data from IMDb (Your Activity > Ratings > Export & Your Watchlist > Export):
# Ingest both ratings and watchlist simultaneously
python -m importers.imdb_importer \
--ratings path/to/ratings.csv \
--watchlist path/to/watchlist.csv
# Or ingest either file individually
python -m importers.imdb_importer --ratings path/to/ratings.csv
python -m importers.imdb_importer --watchlist path/to/watchlist.csvNote: If an item exists in both files, imdb_importer automatically marks it as watched with the user's rating taking precedence.
š ļø Model Context Protocol (MCP) Tools
The server registers 49 specialized tools, 5 native context resources, and 4 interactive prompts categorized across ten domains:
0. Claude Desktop Context Resources & 1-Click Prompts
Feature Type | Identifier / URI | Description |
Resource |
| Live ambient memory context: critical directives, dietary/sensory constraints, active goals, and lifestyle habits. |
Resource |
| Machine-readable Taste DNA dossier (Cultural Archetype, top creators, sensory accords). |
Resource |
| Live background context: currently-reading books, movie watchlist, and podcast queue. |
Resource |
| Morning briefing: Quote of the Day, reading progress, and vault summary metrics. |
Resource |
| Live background context: user's top genres, directors, authors, flavor accords, and favorite cuisines. |
Prompt |
| 1-click morning briefing prompt synthesizing thoughts for the day and evening cultural picks. |
Prompt |
| Master Sommelier / Barista / Perfumer interactive tasting interview to evaluate and log items. |
Prompt |
| Complete curated weekend plan (film pick + wine/tea pairing + book reading + dinner). |
Prompt |
| AI agent workflow: loads user brief, runs web searches, vets candidates, and delivers zero-collision picks. |
1. AI-Agent Empowered Recommendations & Taste Intelligence
Tool Name | Parameters | Description |
|
| Call this FIRST for recommendations. Gives the AI agent the user's complete Taste DNA, Negative Exclusion Catalog, and high-signal web search directives to find fresh gems. |
|
| Call before presenting to user. Checks for library/wishlist collisions, calculates taste affinity score, and returns personalization hooks. |
| none | Aggregates favorite genres, top directors, authors, and 5ā /10ā items. |
| none | Macro metrics across books, media, quotes, podcasts, sensory vault, and restaurants. |
|
| Smart evening picker that filters watchlist by runtime, mood, and ratings with match reasons. |
|
| Comprehensive annual cultural retrospective with metrics and synthesized "Cultural Archetype". |
2. Books Management & Discovery (Goodreads Standard)
Tool Name | Parameters | Description |
|
| Search Firestore library by title or author keywords. |
|
| Retrieve finished books sorted chronologically by completion date. |
|
| Retrieve books from |
|
| Add a recommended book directly to the reading queue. |
|
| Log a finished book with Goodreads rating (0ā5ā ), written review, private notes, and date read. |
|
| Update reading status/shelf ( |
|
| Fetch complete document for a book by Goodreads ID. |
|
| Query Google Books & Open Library for synopses and covers. |
|
| Discover books similar in theme and author style. |
3. Media (Movies & TV) Management & Streaming (IMDb Standard)
Tool Name | Parameters | Description |
|
| Search movies and series by title or director. |
|
| Retrieve viewed movies/series sorted chronologically by rating date. |
|
| Retrieve watchlist items with optional genre filter. |
|
| Add a movie or show to the watchlist. |
|
| Log a viewed film/series with IMDb rating (1ā10), written review, personal notes, and date. |
|
| Update status ( |
|
| Fetch complete record by IMDb Const ID ( |
|
| Check where a title is streaming (Netflix, Max, Prime, Apple TV+) via TMDB / JustWatch. |
|
| Query TMDB for synopsis, posters, and vote average. |
|
| Query TMDB recommendation algorithm for similar titles. |
4. Memorable Quotes & Mental Models
Tool Name | Parameters | Description |
|
| Save a quote or mental model from a book or film. |
|
| Spaced retrieval of a random quote for inspiration or decision-making. |
|
| Search saved quotes by keyword, speaker, or theme. |
|
| Retrieve all quotes marked as all-time favorites. |
5. Podcasts
Tool Name | Parameters | Description |
|
| Add an episode to the listening queue. |
|
| Log a completed episode with takeaways and rating. |
|
| View upcoming podcast episodes. |
|
| Search podcast archive by show, guest, or topic. |
|
| Free online search via Apple Podcasts API for artwork and feeds. |
6. Sensory & Connoisseur Vault (Tea, Whiskey, Coffee, Gin, Wine, Chocolate, Perfume, Watches)
Tool Name | Parameters | Description |
|
| Log an artisanal item with tasting notes, olfactory accords, or horology specs. |
|
| Update tasting notes, ratings, or mark wishlist item as sampled/owned. |
|
| Search personal vault by keyword, category, status, rating, or flavor/scent tag. |
| none | Aggregated flavor profile, top accords, and favorite distillers, roasters, or perfumers. |
|
| Free search across Open Food Facts (wines, teas, coffee, chocolate) and Whisky Hunter. |
7. Fine Dining & Restaurant Journal
Tool Name | Parameters | Description |
|
| Log dining experiences or add to dining wishlist with dishes, vibes, and ratings. |
|
| Update food reviews, signature dishes, or convert wishlist to visited. |
|
| Query dining history and wishlists by city, cuisine, vibe tag, or rating. |
| none | Summary of places visited, cities explored, top cuisines, and Michelin star breakdown. |
8. Multimodal Sensory & Cultural Pairings
Tool Name | Parameters | Description |
|
| Cross-domain pairing matching books/films with beverages, fragrances, chocolates, and music. |
|
| Beverage and cellar pairing (fine wine, cocktail, tea) tailored to a culinary dish. |
9. Persistent Long-Term Memory & Ambient Directives
Tool Name | Parameters | Description |
|
| Autonomously store personal facts, preferences, quirks, habits, or critical directives. |
|
| Search and retrieve remembered user facts and directives matching topic or category. |
|
| Delete an obsolete or retracted personal memory by ID. |
| none | Breakdown of stored memories by category and high-importance directives count. |
š Connecting to MCP Clients
You can connect Curator MCP to your AI clients using either Docker Desktop (zero Python setup) or directly via Python Virtualenv.
Option A: š³ Docker Desktop MCP / Container (Recommended ā Zero Python Required)
Running via Docker isolates dependencies completely: no Python version conflicts or virtual environments to activate.
1. Build the Docker Image
# Clone and build image locally
git clone https://github.com/imadmoussa1/curator_mcp.git
cd curator_mcp
docker build -t curator-mcp:latest .2. Configure in Claude Desktop / Cursor / Antigravity via Docker
Add this to your claude_desktop_config.json (macOS: ~/Library/Application Support/Claude/claude_desktop_config.json):
{
"mcpServers": {
"curator-mcp": {
"command": "docker",
"args": [
"run",
"-i",
"--rm",
"-v",
"/absolute/path/to/service-account.json:/app/service-account.json:ro",
"-e",
"FIREBASE_CREDENTIALS_PATH=/app/service-account.json",
"-e",
"TMDB_API_KEY=YOUR_TMDB_KEY",
"-e",
"GOOGLE_BOOKS_API_KEY=YOUR_BOOKS_KEY",
"curator-mcp:latest"
]
}
}
}š” Zero-File Option (Environment Secret): If you don't want to mount any files, you can encode your
service-account.jsonto Base64 and pass it directly:-e FIREBASE_CREDENTIALS_BASE64="$(base64 -i service-account.json)"
3. Docker MCP Toolkit (Docker Desktop)
In Docker Desktop:
Open Docker Desktop Settings > Beta Features > enable Docker MCP Toolkit.
Run
curator-mcpas a managed container or register it directly into the local Docker MCP Gateway.Your AI desktop clients will automatically detect the server without manually starting Python.
Option B: ā” Run with Astral uv / uvx (Fastest Python Execution)
If you have uv installed, you don't even need to create or manage virtualenvs manually:
{
"mcpServers": {
"curator-mcp": {
"command": "uv",
"args": [
"run",
"--directory",
"/path/to/curator_mcp",
"mcp_server.py"
],
"env": {
"FIREBASE_CREDENTIALS_PATH": "/path/to/curator_mcp/service-account.json",
"TMDB_API_KEY": "YOUR_TMDB_API_KEY_HERE"
}
}
}
}Option C: š Direct Python Virtualenv
Add the following configuration to claude_desktop_config.json:
{
"mcpServers": {
"curator-mcp": {
"command": "/path/to/curator_mcp/.venv/bin/python",
"args": [
"/path/to/curator_mcp/mcp_server.py"
],
"env": {
"FIREBASE_CREDENTIALS_PATH": "/path/to/curator_mcp/service-account.json",
"TMDB_API_KEY": "YOUR_TMDB_API_KEY_HERE",
"CURATOR_SLIM_MODE": "true"
}
}
}
}Option D: šø Connect to Google Antigravity Agent
Curator MCP integrates natively with Google Antigravity (AGY).
Add curator-mcp to your Antigravity global MCP configuration at ~/.gemini/config/mcp_config.json:
{
"mcpServers": {
"curator-mcp": {
"command": "/path/to/curator_mcp/.venv/bin/python",
"args": [
"/path/to/curator_mcp/mcp_server.py"
],
"env": {
"PYTHONPATH": "/path/to/curator_mcp",
"FIREBASE_CREDENTIALS_PATH": "/path/to/curator_mcp/service-account.json",
"TMDB_API_KEY": "YOUR_TMDB_API_KEY_HERE",
"CURATOR_SLIM_MODE": "true"
}
}
}
}Once saved, Antigravity automatically detects the server and exposes its tools to the agent.
ā” Token Consumption Optimization Guide (Claude Desktop & Antigravity)
If you are using Claude Desktop Free Tier or need strict context window limits:
Enable Slim Mode (
CURATOR_SLIM_MODE=trueor pass--slim):Reduces the MCP tool schema from 13,180 tokens down to ~4,500 tokens per turn (-66%).
Exposes only the 19 core, high-leverage tools (Recommendations, Vetting, Search Vault, Reading/Watch Queues, Sensory Vault, Dining, and Memory).
Unified Search (
search_vault):Instead of calling separate tools for books, movies, sensory goods, and restaurants,
search_vaultsearches across all domains in a single tool call.
Compact Payloads:
get_agent_recommendation_briefno longer injects hundreds of library titles into prompt context, saving 2,000ā10,000 tokens per call.Default search limits are reduced to 5 items with compact 120-character review snippets.
š Making This MCP Public & Publishing to Registries
Curator MCP is fully architected for public open-source distribution without leaking user data or secrets. Here is the recommended roadmap to make it widely accessible to the global community:
1. š¦ Publish Pre-built Container to GitHub Container Registry (GHCR) & Docker Hub
Allow anyone to run Curator MCP with a single command without even cloning or building:
# Tag and push public image
docker tag curator-mcp:latest ghcr.io/imadmoussa1/curator-mcp:latest
docker push ghcr.io/imadmoussa1/curator-mcp:latestThen any user worldwide can run it immediately:
"curator-mcp": {
"command": "docker",
"args": ["run", "-i", "--rm", "-e", "FIREBASE_CREDENTIALS_JSON=...", "ghcr.io/imadmoussa1/curator-mcp:latest"]
}2. šļø Submit to Official MCP Registries & Catalogs
Smithery.ai Registry: Run
npx -y @smithery/cli initto add instant 1-click installation for Claude Desktop.Docker MCP Catalog: Submit
curator-mcpto the Docker MCP verified catalog so users can click "Install" right inside Docker Desktop.Glama.ai MCP Directory: Submit the repository to glama.ai/mcp/servers for global indexing and discovery.
Punkpeye Awesome-MCP-Servers: Open a PR to the curated awesome-mcp-servers repository under the Entertainment & Media category.
3. š Publish to PyPI
Users can install and run via uvx or pipx:
# Run without installing manually
uvx curator-mcpš¬ Example Prompts to Ask Claude (Feature-by-Feature Guide)
Once Curator MCP is connected to Claude Desktop, you can interact naturally using prompts like these:
1. š Annual Retrospective & Taste Analysis
"Analyze my entertainment taste profile based on my books and movies."
š Tool called:
get_user_taste_profile
"Generate my Curator Wrapped annual summary for 2026 and tell me what my Cultural Archetype is!"
š Tool called:
generate_cultural_wrapped(year=2026)
"Give me a high-level breakdown of my stats across books, movies, quotes, and podcasts."
š Tool called:
get_entertainment_stats
2. ā±ļø "Curate My Night" (Evening Movie Picker)
"I have 90 minutes tonight and want a great comedy or drama from my watchlist. Pick something for me."
š Tool called:
curate_for_tonight(max_runtime_mins=90, genre='Comedy')
"What's a high-rated thriller on my watchlist that I should watch tonight?"
š Tool called:
curate_for_tonight(genre='Thriller', min_imdb_rating=8.0)
3. šŗ "Where to Stream" (Streaming Availability)
"Where can I stream 'Inception' or 'The Philadelphia Story' right now in the US?"
š Tool called:
get_streaming_providers(title='Inception', country='US')
"Is 'Interstellar' streaming on Netflix, Prime, or Max in the UK?"
š Tool called:
get_streaming_providers(title='Interstellar', country='GB')
4. š§ AI-Agent Empowered Recommendations & Taste Vetting
"Give me bespoke recommendations based on my all-time favorite movies and books that I haven't seen or read yet."
š Step 1 (Taste Briefing): Agent calls
get_agent_recommendation_brief(domain='movies', mood_or_intent='atmospheric masterpiece')to receive your 10/10 anchors, negative exclusions, and web search directives.š Step 2 (Live Discovery): Agent executes live web searches targeting your proven affinities.
š”ļø Step 3 (Vetting): Agent calls
vet_recommendation_candidate(domain='movies', title_or_name='Children of Men', maker_or_creator='Alfonso Cuarón')to guarantee 0% collision with your collection and compute affinity match percentage.š¤ Step 4 (Delivery): Agent presents clean, personalized recommendations with direct reasoning tethered to your 10/10 and 5ā ratings.
"Find books similar in themes and style to 'Thinking, Fast and Slow'."
š Tool called:
find_similar_books_online(title='Thinking, Fast and Slow')
"Find movies similar to 'Blade Runner 2049'."
š Tool called:
find_similar_media_online(title='Blade Runner 2049')
5. š Viewing & Reading History (Chronological)
"What was the last thing I watched and rated?"
š Tool called:
get_recently_watched_media(limit=5)
"What was the last book I read and rated?"
š Tool called:
get_recently_read_books(limit=5)
"I just finished watching 'Dune: Part Two'. Log it as watched, rate it 9/10, review: 'Spectacular sound design and cinematography', user notes: 'Watched in IMAX'."
š Tool called:
log_watched_media(title='Dune: Part Two', user_rating=9, review='Spectacular sound design and cinematography', user_notes='Watched in IMAX')
"I just finished 'Atomic Habits' by James Clear. Log it as read with a 5/5 star Goodreads rating and review: 'Actionable frameworks for habit loops'."
š Tool called:
log_read_book(title='Atomic Habits', author='James Clear', user_rating=5, review='Actionable frameworks for habit loops')
6. š Active Queues, Status Updates & Reviews
"I just finished reading 'Thinking, Fast and Slow'. Change its status to read, give it 5 stars on Goodreads, and review it: 'Mind-opening breakdown of cognitive biases'."
š Tool called:
update_book_status(title='Thinking, Fast and Slow', shelf='read', user_rating=5, review='Mind-opening breakdown of cognitive biases')
"I am currently reading 'Deep Work' by Cal Newport. Move it to my currently-reading shelf."
š Tool called:
update_book_status(title='Deep Work', shelf='currently-reading')
"I just watched 'Inception' from my watchlist. Change its status to watched, rate it 10/10 IMDb, and add review: 'Nolan's best original screenplay'."
š Tool called:
update_media_status(title='Inception', status='watched', user_rating=10, review='Nolan's best original screenplay')
"What movies and series do I have on my watchlist?"
š Tool called:
get_watchlist(limit=10)
"What books do I have on my to-read shelf?"
š Tool called:
get_reading_list(shelf='to-read')
"Add 'Oppenheimer' to my movie watchlist."
š Tool called:
add_to_watchlist(title='Oppenheimer')
"Add 'Project Hail Mary' by Andy Weir to my reading list."
š Tool called:
add_to_reading_list(title='Project Hail Mary', author='Andy Weir')
7. š¬ Quotes & Mental Models
"Give me a random memorable quote from my database for inspiration today."
š Tool called:
get_random_quote
"Save this quote from Fight Club: 'The things you own end up owning you.' Tag it with #consumerism and #freedom."
š Tool called:
add_quote(quote_text='...', source_title='Fight Club', theme_tags=['consumerism', 'freedom'])
"Search my saved quotes for anything related to discipline or stoicism."
š Tool called:
search_quotes(query='discipline')
"Show me my all-time favorite quotes."
š Tool called:
list_favorite_quotes
8. šļø Podcast Tracking & Online Discovery
"Queue up the Huberman Lab episode on dopamine to listen to later."
š Tool called:
add_to_podcast_queue(podcast_name='Huberman Lab', episode_title='Dopamine')
"I just finished Lex Fridman #400 with Daniel Kahneman. Rate it 9/10 with key takeaway: 'System 1 vs System 2 thinking'."
š Tool called:
log_listened_podcast(podcast_name='Lex Fridman', ...)
"Search online for podcast shows about neuroscience."
š Tool called:
lookup_podcast_online(query='neuroscience')
"What episodes are currently in my podcast queue?"
š Tool called:
get_podcast_queue
9. š„ Sensory & Connoisseur Vault (Tea, Whiskey, Coffee, Gin, Wine, Chocolate, Perfume, Watches)
"Log a bottle of Lagavulin 16 in my whiskey cabinet. Rated 9.5/10 with flavor notes: peat, smoke, sea salt, sherry cask. Review: 'Quintessential Islay dram'."
š Tool called:
log_sensory_item(category='whiskey', name='16 Year Old', maker_or_brand='Lagavulin', origin_or_region='Islay, Scotland', user_rating=9.5, flavor_or_scent_notes=['peat', 'smoke', 'sea salt', 'sherry cask'], specs={'abv': '43%', 'cask': 'sherry and bourbon'})
"Log Tom Ford Oud Wood to my perfume collection. Rate it 9.0/10 with olfactory notes: oud, rosewood, cardamom, amber. Specs: concentration Eau de Parfum."
š Tool called:
log_sensory_item(category='perfume', name='Oud Wood', maker_or_brand='Tom Ford', user_rating=9.0, flavor_or_scent_notes=['oud', 'rosewood', 'cardamom', 'amber'], specs={'concentration': 'EDP'})
"I just got an Omega Speedmaster Professional Moonwatch. Log it to my watch collection with specs: caliber 3861, 42mm, manual wind."
š Tool called:
log_sensory_item(category='watch', name="Speedmaster Professional 'Moonwatch'", maker_or_brand='Omega', specs={'caliber': '3861', 'case_size_mm': 42})
"Add Uji Gyokuro green tea from Ippodo to my tea cabinet with brewing specs: 50C water and 90 second steep time."
š Tool called:
log_sensory_item(category='tea', name='Uji Gyokuro', maker_or_brand='Ippodo', specs={'brew_temp_c': 50, 'steep_time_secs': 90})
"Log Valrhona Guanaja 70% dark chocolate to my tasting vault. Rating: 8.8/10, notes: roasted cocoa, warm wood."
š Tool called:
log_sensory_item(category='chocolate', name='Guanaja 70%', maker_or_brand='Valrhona', user_rating=8.8, flavor_or_scent_notes=['roasted cocoa', 'warm wood'])
"What are my top sensory flavor accords and favorite distillers across my collection?"
š Tool called:
get_sensory_taste_profile
"Give me whiskey recommendations based on the peat and smoke flavor notes I love."
š Workflow: AI agent calls
get_agent_recommendation_brief(domain='whiskey', mood_or_intent='peat and smoke'), explores top independent distillers, and confirms each pick viavet_recommendation_candidate.
"Search open databases for artisanal chocolate from Valrhona."
š Tool called:
search_open_product_catalog(category='chocolate', query='Valrhona')
10. š½ļø Fine Dining & Restaurant Journal
"Log my dinner at Septime in Paris. Rated 9.5/10, 1 Michelin Star, standout dishes: 'Smoked egg yolk with mushrooms', vibe tags: natural wine, relaxed excellence."
š Tool called:
log_restaurant(name='Septime', city='Paris', cuisine='Neo-Bistro', user_rating=9.5, michelin_status='1-Star', standout_dishes=['Smoked egg yolk with mushrooms'], vibe_tags=['natural wine', 'relaxed excellence'])
"Add Sushi Sawada in Ginza, Tokyo to my dining wishlist. Cuisine: Omakase, 2 Michelin Stars."
š Tool called:
log_restaurant(name='Sushi Sawada', city='Tokyo', cuisine='Omakase', status='wishlist', michelin_status='2-Star')
"What restaurants have I visited in Paris or New York?"
š Tool called:
search_restaurants(city='Paris')
"Recommend great places to dine in Tokyo or London matching my love for counter seating and natural wine."
š Workflow: AI agent calls
get_agent_recommendation_brief(domain='restaurants', target_location='Tokyo', mood_or_intent='counter seating and natural wine'), searches recent restaurant openings, and screens against visited places.
"Give me a summary of my dining statistics: cities explored, top cuisines, and Michelin breakdown."
š Tool called:
get_dining_stats
11. š§ Persistent Long-Term Memory & Ambient Directives
"Remember that I get severe migraines from 3D movies and dislike jump-scare horror."
š Tool called:
store_memory(content='Gets severe migraines from 3D movies and dislikes jump-scare horror', category='dislike', tags=['cinema', 'health'], importance=5)
"Remember that I am traveling to Tokyo and Kyoto for two weeks in October 2026."
š Tool called:
store_memory(content='Traveling to Tokyo and Kyoto for two weeks in October 2026', category='context', tags=['travel', 'japan'], importance=4)
"Remember that I prefer light-roast washed Ethiopian coffees and clean natural wines."
š Tool called:
store_memory(content='Prefers light-roast washed Ethiopian coffees and clean natural wines', category='preference', tags=['coffee', 'wine'], importance=3)
"What personal preferences or travel contexts have you remembered about me?"
š Tool called:
recall_memories()(or attachcurator://context/personal_memoryvia paperclip /@menu)
"Forget the note about my travel to Kyoto since my trip got cancelled."
š Tool called:
forget_memory(memory_id='mem_contex_...')
š Security & Privacy Notice
This project is built for public open-source publication and adheres to strict security best practices:
Zero Secret Leakage:
The
.gitignorestrictly blocks all variations of credentials files (service-account*.json,*firebase*.json,*credentials*.json), environment files (.env), and personal user data (*.csv).Only synthetic samples inside
sample_data/are tracked by Git.
Safe Lazy Loading:
config.pyuses lazy proxy initialization so that running unit tests, building wheels, or executing--helpcommands will never throw missing-key crashes or expose environment data.
Audit Verification:
The Git commit history has been audited to confirm no secrets, API tokens, or real user CSV files exist in any commit.
š§Ŗ Testing & Quality Assurance
The codebase includes an automated unit test suite:
# Run all 36 unit tests with uv
uv run python -m unittest discover -s testsTests cover:
Data Models: Pydantic schema validation for Books, Media, Quotes, Podcasts, Sensory Items (tea, coffee, whiskey, gin, wine, chocolate, perfume, watch), and Restaurants.
Importers: Goodreads and IMDb CSV column mapping, Excel formatting cleanup, list field normalization.
Domain Services:
BookService,MediaService,QuoteService,PodcastService,SensoryService,RestaurantService,RecommendationService.Sensory & Dining Recommenders: Multi-signal flavor accord matching, distillery/producer preference, and vibe-oriented dining recommendations.
External Clients: Apple Podcasts API, Open Food Facts & Whisky Hunter catalog client, TMDB error resilience, and Google Books / Open Library HTTP fallbacks.
š License
Distributed under the MIT License. See LICENSE for details.
Available Tools
19 toolscurate_for_tonightCurate For TonightC
Filter watchlist by available time (minutes), genre, and IMDb rating.
| Name | Required | Description | Default |
|---|---|---|---|
| count | No | Number of curated options to present. Defaults to 3. | |
| genre | No | Preferred genre filter (e.g. 'Sci-Fi', 'Comedy', 'Drama'). | |
| media_type | No | 'movie' or 'tv'. Defaults to 'movie'. | movie |
| min_imdb_rating | No | Minimum IMDb score (e.g. 7.5). | |
| max_runtime_mins | No | Maximum runtime in minutes (e.g. 120 for 2 hours). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It implies a read-only filter but never confirms it, and says nothing about how results are selected or ranked, whether an empty result is possible, or what happens when filters are omitted (all defaults are null/optional).
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with no filler and the filtering criteria front-loaded. It is efficient but borders on under-specification for a five-parameter curation tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return-value explanation is not required. Still, for a 5-parameter, zero-required, annotation-free tool, the description does not convey the curation/selection behavior (how many picks, how they are chosen) that distinguishes it from a plain watchlist lookup.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all five parameters including defaults and examples. The description's mention of time, genre, and IMDb rating adds nothing beyond the schema and leaves media_type and count unmentioned; baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a clear verb (filter) and resource (watchlist) plus three filtering criteria, so an agent can tell it produces a narrowed list. However, it never differentiates itself from siblings like get_watchlist or search_media, and it omits two of its own parameters (media_type, count), leaving the 'curated subset' angle unexplained.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance on when to use this versus get_watchlist (unfiltered list) or get_agent_recommendation_brief / vet_recommendation_candidate. The 'tonight' intent in the name suggests a time-boxed personalized pick, but the description never states that condition or any exclusion.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_aesthetic_pairingGet Aesthetic PairingC
Generate aesthetic cross-domain pairing connecting books/movies with sensory beverages.
| Name | Required | Description | Default |
|---|---|---|---|
| mood | No | Atmospheric intention (e.g. 'melancholic rain', 'late-night focus'). | |
| anchor_type | Yes | 'book' or 'media'/'movie'. | |
| title_or_name | Yes | Title of the book or film. | |
| author_or_creator | No | Author or director (optional). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description carries the full behavioral burden, yet it only says a pairing is 'generated'. It does not disclose whether the operation is read-only or writes anything, whether it depends on stored taste/vault data, whether results are deterministic, or that the result is AI-generated rather than indexed. Significant behavioral gaps for a tool with zero annotation coverage.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the core purpose is stated immediately. It is arguably too terse for the amount of behavior it omits, but there is no wasted text.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and the schema fully documents inputs. However, with no annotations and no usage or behavioral detail, the definition is only minimally sufficient for a generative cross-domain tool that presumably relies on stored data from sibling logging tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters (mood, anchor_type, title_or_name, author_or_creator) are documented in the schema itself, including examples and allowed values. The description adds no parameter meaning beyond that, which matches the baseline of 3 when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Generate') and a concrete resource ('aesthetic cross-domain pairing connecting books/movies with sensory beverages'), which is enough for an agent to know what the tool produces. It does not need sibling differentiation since no other tool in the list performs cross-domain pairing, though it stops short of describing the shape of the pairing itself.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no mention of prerequisites (e.g. a logged sensory item or vault entry), and names no alternatives such as curate_for_tonight or get_agent_recommendation_brief. The agent must infer the trigger context entirely.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_agent_recommendation_briefGet Agent Recommendation BriefC
Retrieve Taste DNA, anchor favorites, avoidances, and web search queries for a domain.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | Target category ('books', 'movies', 'whiskey', 'wine', 'restaurants', etc.). | |
| mood_or_intent | No | Optional atmospheric vibe or craving (e.g. 'cozy rainy night noir'). | |
| target_location | No | Optional geographic context for dining and physical experiences. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full disclosure burden. 'Retrieve' weakly implies a read, but nothing states permissions, whether it triggers external web search, cost/latency, or caching behavior. The listed return contents overlap with the output schema rather than adding behavioral context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler. Slight redundancy in enumerating payload fields that the output schema already carries, but no wasted prose.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Because an output schema exists, return values need no explanation, and all three parameters are schema-documented. Still, for a tool sitting in a dense sibling cluster, the absence of any positioning or usage cue leaves the definition only minimally complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and each parameter is clearly documented, so the baseline is 3. The description only gestures at 'domain' and says nothing about how mood_or_intent or target_location shape the brief.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb 'Retrieve' plus an enumerated payload ('Taste DNA, anchor favorites, avoidances, and web search queries') makes the purpose concrete. It does not, however, distinguish itself from the closely related sibling get_user_taste_profile, so an agent must infer the split.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use, when-not-to-use, or alternative routing is given. With 19 siblings including get_user_taste_profile and vet_recommendation_candidate, the definition offers nothing to help pick between them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entertainment_statsGet Entertainment StatsA
Get macro statistics across books, movies, podcasts, quotes, sensory vault, and restaurants.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. 'Get ... statistics' implies a non-mutating read, and the enumeration of covered domains is useful context, but there is no disclosure of scope limits, refresh behavior, permissions, or whether the aggregation is global or user-scoped.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundant restatement of the title. Every clause (verb, resource, domain list) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
A zero-param read tool with an output schema needs little prose, and the description does state the full breadth of aggregated domains. The only gap is the absence of any guidance on when to prefer this over the per-domain sibling tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the 4 baseline applies. The schema is empty and fully consistent with the description's no-argument framing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Get') and resource ('macro statistics') and enumerates the six domains it aggregates, which separates it from the per-domain search/log siblings. It doesn't explicitly name an alternative such as get_user_taste_profile, so it falls short of full sibling differentiation.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: the word 'macro' plus the multi-domain scope signals a high-level summary view rather than per-item lookups. No when-to-use condition or named alternative is given, so the agent must infer the routing decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_reading_listGet Reading ListB
Get books from user's reading queue ('to-read' or 'currently-reading').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of books to return. Defaults to 8. | |
| shelf | No | Queue name ('to-read' or 'currently-reading'). Defaults to 'to-read'. | to-read |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not state that this is a read-only operation, whether authentication/account scoping is required, or how pagination/limit behaves beyond the default. Only the queue values are disclosed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with zero filler, and the resource plus valid queue values are front-loaded. Nothing needs trimming.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and both parameters are fully documented in the schema. However, with no annotations the description should still cover the read-only nature and scope, which it omits, leaving it only minimally viable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (limit, shelf) are already fully documented in the schema. The description merely repeats the shelf values with no added syntax, format, or behavioral meaning, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb (get) and resource (books from the user's reading queue) and enumerates the two valid queue values. It implicitly separates itself from search_books and get_watchlist, but never names a sibling to sharpen the distinction.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is for fetching the user's own queued books rather than searching. There is no guidance on when to prefer this over search_books, nor any exclusions or prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_user_taste_profileGet User Taste ProfileA
Retrieve user taste profile including top genres, directors, authors, and highest-rated favorites.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full disclosure burden, but 'Retrieve' does convey a read-only, non-mutating operation. It adds no information about permissions, data source, or freshness/scope, though the return-shape burden is partly lifted by the existing output schema.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the verb and resource come first and the content list follows economically.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with an output schema already documenting the return payload, the description is nearly sufficient. The only gap is sibling differentiation, which the description does not address.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the structural baseline of 4 applies. No parameter-level detail is expected or missing.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Retrieve') and resource ('user taste profile') and enumerates the contents (top genres, directors, authors, highest-rated favorites). It is clear on its own, but it does not distinguish itself from adjacent siblings like get_entertainment_stats or get_agent_recommendation_brief, leaving the agent to guess which profile-style tool to pick.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to call this versus the other profile/stats/recommendation siblings, and no prerequisites or exclusions are given. The agent must infer usage purely from the tool name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_watchlistGet WatchlistB
Get movie and TV watchlist with optional type and genre filter.
| Name | Required | Description | Default |
|---|---|---|---|
| genre | No | Optional genre filter (e.g. 'Sci-Fi', 'Thriller'). | |
| limit | No | Maximum results to return. Defaults to 8. | |
| media_type | No | Optional filter ('Movie', 'TV Series'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the behavioral burden. 'Get' implies a non-mutating read and the output schema covers return shape, but nothing is said about empty-watchlist behavior, ordering, or pagination, leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single efficient sentence with the core action front-loaded and the filter modifiers trailing. Nothing is wasted, though it is quite terse relative to the guidance it omits.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple read-only getter with an output schema covering return values and fully documented parameters, the description is adequate. The only real gap is the absence of routing guidance against the many sibling retrieval tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all three parameters are already documented in the schema. The description mentions the type and genre filters but adds no syntax or value guidance beyond that, and omits the limit parameter entirely. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Get) and resource (movie and TV watchlist), and notes the filter dimensions. It is clear on its own but does not distinguish itself from siblings like search_media or get_reading_list, so sibling routing is left to inference.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance and no named alternative. 'Optional type and genre filter' hints at usage but never states when an agent should pick this over search_media or curate_for_tonight.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_read_bookLog Read BookB
Log a completed book with rating (0-5 stars), optional review, and date read.
| Name | Required | Description | Default |
|---|---|---|---|
| notes | No | General legacy notes. | |
| title | Yes | Book title. | |
| author | Yes | Author name. | |
| review | No | Public review or literary analysis. | |
| book_id | No | Optional existing book ID. | |
| date_read | No | ISO date read (YYYY-MM-DD), defaults to today. | |
| user_rating | Yes | Star rating (0 to 5). | |
| private_notes | No | Private reflections or takeaways. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations provided, so the description carries full disclosure burden. It implies a write operation but does not state side effects, whether duplicates are created, auth requirements, or what happens when book_id is omitted vs provided. The presence of book_id and multiple optional note fields (notes, review, private_notes) raises behavioral questions the description doesn't address.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single efficient sentence that front-loads the action and key fields. No waste, appropriately sized for a straightforward logging tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists so return values need not be described. However, with 8 parameters, no annotations, and an overlapping trio of text fields (notes/review/private_notes), the description is incomplete for an agent to call this correctly ā it should clarify field intent and whether book_id resolution creates or links records.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all parameters are documented in the schema. The description adds meaning by clarifying rating scale (0-5 stars) and that review is optional, but doesn't explain the distinction between notes, review, and private_notes ā a real ambiguity given three overlapping text fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clear verb (Log) and resource (completed book) with key fields named (rating, review, date). Distinguishes from read-oriented siblings like search_books and get_reading_list by being a write/log tool. Lacks explicit sibling differentiation but the verb itself separates it well.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No when-to-use guidance, no mention of the sibling log_watched_media, log_restaurant, log_sensory_item which follow the same logging pattern. No exclusions or prerequisites stated. The agent must infer this is for finished books only.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_restaurantLog RestaurantC
Log a restaurant or dining experience in dining journal or wishlist.
| Name | Required | Description | Default |
|---|---|---|---|
| city | Yes | City where located (e.g. 'Tokyo', 'London', 'San Francisco'). | |
| name | Yes | Name of the restaurant or establishment. | |
| status | No | 'visited' or 'wishlist'. | wishlist |
| cuisine | Yes | Primary cuisine category (e.g. 'Japanese', 'Nordic', 'Italian'). | |
| vibe_tags | No | Atmosphere tags (e.g. ['omakase', 'intimate', 'speakeasy']). | |
| price_tier | No | Price bracket ('$', '$$', '$$$', '$$$$'). | |
| user_rating | No | Rating from 1.0 to 10.0 (if visited). | |
| date_visited | No | Date of dining experience (YYYY-MM-DD). | |
| neighborhood | No | Specific district or quarter (e.g. 'Ginza', 'Mayfair'). | |
| restaurant_id | No | Optional custom ID. | |
| michelin_stars | No | 1, 2, or 3 Michelin stars (optional). | |
| standout_dishes | No | Must-order menu items or tasting course highlights. | |
| notes_and_review | No | Dining notes, reservation tips, or food review. | |
| url_or_reservation | No | Website or reservation link (Resy/OpenTable). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, yet it says nothing beyond the purpose sentence. It does not disclose that this is a write/create operation, whether it is idempotent, how an existing entry is handled if 'name'/'restaurant_id' collides, or what happens when only the three required fields are supplied.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler or redundancy. It is efficient, though arguably too terse for a 14-parameter mutation tool, which is a completeness problem rather than a conciseness one.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter write tool with zero annotations, no usage routing, and no stated side effects, one sentence is thin. The presence of an output schema removes the need to describe return values, but the description still leaves the agent without enough to know when and how safely to call it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so each of the 14 parameters is already documented with examples and defaults; the baseline is 3. The description's 'dining journal or wishlist' phrasing loosely signals the visited/wishlist distinction but adds no format, default, or constraint detail beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description gives a specific verb ('Log') and resource ('restaurant or dining experience') and even names the two destination buckets (dining journal vs. wishlist), which maps onto the status parameter. It is clear enough to distinguish from read-side siblings like search_restaurants, though it never names them explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to choose this tool over search_restaurants, get_agent_recommendation_brief, or vet_recommendation_candidate, and no mention of prerequisites such as needing an existing recommendation. The journal-vs-wishlist phrasing implies usage but states no conditions or exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_sensory_itemLog Sensory ItemC
Log or update an item in the Sensory Vault (tea, whiskey, coffee, wine, gin, perfume, watch).
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Name of bottle, vintage, bean, blend, fragrance, or reference. | |
| specs | No | Domain-specific technical specifications (ABV, processing method, movement caliber). | |
| review | No | Detailed tasting appraisal. | |
| status | No | 'owned', 'wishlist', or 'experienced'. | owned |
| item_id | No | Optional existing item ID. | |
| category | Yes | Domain ('whiskey', 'wine', 'coffee', 'tea', 'gin', 'chocolate', 'perfume', 'watch'). | |
| price_tier | No | Pricing bracket ('$', '$$', '$$$', '$$$$'). | |
| user_rating | No | Rating from 1.0 to 10.0. | |
| maker_or_brand | Yes | Producer, distillery, roaster, estate, or maison. | |
| personal_notes | No | Private reflections or cellaring notes. | |
| vintage_or_year | No | Vintage year or production release. | |
| date_experienced | No | Date tasted or acquired (YYYY-MM-DD). | |
| origin_or_region | No | Terroir or country of origin (e.g. 'Islay, Scotland', 'Yirgacheffe, Ethiopia'). | |
| flavor_or_scent_notes | No | Flavor accords, nose aromas, or olfactory pyramid notes. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It says 'log or update' (a mutation) but never states whether an update overwrites prior fields, merges them, requires ownership, or is reversible. For a 14-parameter write tool with zero annotation coverage, this is a significant disclosure gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single sentence with the verb and resource front-loaded and the domain list appended for disambiguation. Nothing is wasted and nothing needs to be scanned past.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, but for a 14-parameter mutation tool with no annotations, the description omits create-vs-update semantics, overwrite behavior, and routing to search_sensory_vault. It is too thin for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all 14 parameters are already documented, making 3 the baseline. The description only repeats a subset of the category values ('tea, whiskey, coffee, wine, gin, perfume, watch') and actually omits 'chocolate', which the schema lists, so it adds no reliable meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb pair ('log or update') and resource ('item in the Sensory Vault'), and enumerates the domains it handles, which separates it from log_read_book, log_watched_media, and log_restaurant. It does not explicitly name search_sensory_vault as the read-side alternative, so sibling differentiation is implied rather than stated.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The phrase 'log or update' hints at two modes but never explains when to use which, nor when to reach for search_sensory_vault instead. No prerequisites, no mention that item_id selects update vs create. The agent must infer usage entirely from the schema.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
log_watched_mediaLog Watched MediaC
Log watched movie or episode with rating (1-10), review, and date.
| Name | Required | Description | Default |
|---|---|---|---|
| year | No | Release year. | |
| title | Yes | Title of the media item. | |
| review | No | Review notes or critical appraisal. | |
| imdb_id | No | IMDb ID (optional). | |
| tmdb_id | No | TMDB ID (optional). | |
| media_type | No | 'movie' or 'tv'. | movie |
| user_rating | Yes | Integer rating from 1 to 10. | |
| date_watched | No | ISO date string (YYYY-MM-DD), defaults to today. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing beyond the write intent. It does not say whether logging creates or updates an entry, how duplicates/IDs are resolved, what permissions are needed, or what happens when a title matches nothing in the library.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with zero filler ā the core action comes first. It is tight, though it omits useful detail rather than being over-long, so it is efficient without being exemplary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For an eight-parameter mutation tool with no annotations, the description is too thin: it ignores media_type (movie vs tv), the optional imdb_id/tmdb_id/year matching fields, and default behaviors like date_watched defaulting to today. An output schema exists, so return values needn't be explained, but input and side-effect behavior remain under-specified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all eight parameters, including the 1-10 rating range, media_type values, and ISO date format. The description merely restates rating/review/date, adding no syntax or format meaning beyond the schema, which makes the 3 baseline correct.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (log) plus the resource it applies to ('watched movie or episode'), and the media scope implicitly separates it from siblings like log_read_book or log_restaurant. It never names an alternative tool or explicitly contrasts with siblings, so it stops short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit when-to-use or when-not-to-use guidance, and no alternatives are named despite relevant siblings (search_media, get_watchlist, vet_recommendation_candidate). Usage is only inferable from the verb 'log watched'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
recall_memoriesRecall MemoriesC
Recall stored memories and directives matching a topic or category.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. Defaults to 5. | |
| query | No | Keyword or topic query (e.g. 'coffee', 'tokyo', 'reading'). | |
| category | No | Category filter ('preference', 'dislike', 'goal', 'habit', 'context', 'directive'). | |
| min_importance | No | Minimum importance threshold (1 to 5). Defaults to 1. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'Recall' implies a safe read, but the description never confirms read-only/non-destructive behavior, permissions, or any traits beyond the bare action.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler or redundancy. It is efficient, though its brevity borders on under-specification rather than tightness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be explained, and all four parameters are optional and fully documented in the schema. However, for a tool with zero annotations, the description leaves usage context and behavioral expectations unaddressed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The phrase 'topic or category' loosely maps to query and category, but adds no syntax, examples, or default behavior beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (recall) and resource (stored memories and directives) with the filtering dimension (topic or category). It is distinguishable from the obvious sibling store_memory by direction, but does not differentiate itself from other retrieval tools like search_vault.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites, and no mention of alternatives. An agent gets no signal about when recall is preferred over search_vault or the other retrieval siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_booksSearch BooksC
Search books in Firestore by query and optional shelf ('read', 'currently-reading', 'to-read').
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of matched records to return. Defaults to 5. | |
| query | No | Keyword string to match against title or author. | |
| shelf | No | Optional shelf filter ('read', 'currently-reading', 'to-read'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It notes the backing store (Firestore) but never states that this is a read-only operation, nor describes matching behavior, result ordering, or pagination. For an unannotated tool this is a notable disclosure gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence that names the resource, the primary matcher, and the optional filter with zero filler. It could earn a 5 only by adding a differentiating clause, but it is efficiently sized.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need not be explained, and all parameters are documented. What is missing is the usage context (when to pick this over sibling search/list tools), leaving the definition minimally viable rather than fully complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with each of the three parameters already documented (limit default, query match against title/author, shelf enum values). The description repeats the query and shelf semantics without adding format or edge-case detail, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (search) and resource (books) plus the matching mechanism (query) and the shelf filter. It is clear what the tool does, though it does not distinguish itself from siblings like get_reading_list or log_read_book, which an agent might confuse for book-related operations.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description only restates the optional shelf values with no when-to-use guidance, no mention of when to prefer search_books over get_reading_list or search_vault, and no prerequisites. An agent must infer the retrieval-vs-list distinction on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_mediaSearch MediaC
Search movies and series in library by title, director, or genre.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results to return. Defaults to 5. | |
| query | No | Search keywords. | |
| status | No | Optional watch status ('watched', 'watchlist'). | |
| media_type | No | Optional filter ('Movie', 'TV Series'). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden and it discloses almost nothing. It does not explain matching semantics (substring vs exact), what happens with the default empty query, sort order, or whether the search spans the user's whole library. It only repeats the read-style verb 'search'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
One front-loaded sentence with no filler. It is efficient, though arguably too terse for a 4-parameter search tool where routing and matching behavior matter.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need not be described, and the annotations are absent while all four parameters are documented in the schema. What is missing is behavioral and routing context: default-empty-query behavior and how it relates to sibling discovery tools.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does add value by clarifying what the vague 'Search keywords' query matches against (title, director, genre), but it ignores the status and media_type filters entirely.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Search') and resource ('movies and series in library') and names the searchable facets (title, director, genre). The media scope implicitly distinguishes it from search_books, search_restaurants and search_sensory_vault, but no sibling is named explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance. With several overlapping siblings (get_watchlist, vet_recommendation_candidate, curate_for_tonight), the description never explains when to run a raw library search instead of those alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_restaurantsSearch RestaurantsB
Search dining vault by keyword, city, cuisine, status, or vibe tag.
| Name | Required | Description | Default |
|---|---|---|---|
| city | No | City filter (e.g. 'Tokyo', 'London', 'Paris'). | |
| vibe | No | Atmospheric tag (e.g. 'omakase', 'romantic', 'casual'). | |
| limit | No | Max results. Defaults to 5. | |
| query | No | Keyword query matching name, neighborhood, or dishes. | |
| status | No | 'visited' or 'wishlist'. | |
| cuisine | No | Cuisine category (e.g. 'Japanese', 'French', 'Seafood'). | |
| min_rating | No | Minimum rating (1.0 to 10.0). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, yet it discloses nothing beyond the facets already in the schema. It does not state that the operation is read-only, how filters combine, how an empty query behaves, or what result ordering/limits apply.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence naming the action and the facet set, with no filler or redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With 7 optional parameters, full schema coverage, and an output schema that handles return values, the one-line description is minimally adequate. It still omits how the filters combine and confirms nothing about the default empty query, which an agent would benefit from knowing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so every parameter (city, vibe, limit, query, status, cuisine, min_rating) is already documented in the schema. The description only restates a subset of those facets and adds no format or interaction details, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (dining vault) and enumerates the filter facets (keyword, city, cuisine, status, vibe tag), so the agent knows exactly what it retrieves. It does not, however, differentiate itself from sibling search tools like search_vault or search_sensory_vault.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use or when-not-to-use guidance and no mention of alternatives, even though several sibling search_* tools exist. Usage is only implied by the resource name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_sensory_vaultSearch Sensory VaultC
Search sensory vault items by keyword, category, rating, or flavor tag.
| Name | Required | Description | Default |
|---|---|---|---|
| tag | No | Flavor or aroma accord tag (e.g. 'peat', 'bergamot', 'jasmine'). | |
| limit | No | Max results to return. Defaults to 5. | |
| query | No | Keyword matching name, brand, origin, or notes. | |
| status | No | Ownership filter ('owned', 'wishlist', 'experienced'). | |
| category | No | Domain filter ('whiskey', 'wine', 'coffee', 'tea', 'gin', 'chocolate', 'perfume', 'watch'). | |
| min_rating | No | Minimum rating threshold (1.0 to 10.0). |
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. 'Search' implies a read, but the description says nothing about result ordering, pagination behavior, empty-result handling, or whether filters are ANDed together ā all meaningful for a 6-parameter query tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the verb and resource front-loaded and no wasted words. It is perhaps too terse given the tool's complexity, but nothing is padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, and the schema covers all parameters. Still, for a six-parameter cross-category search with no annotations and an overlapping sibling (search_vault), the description leaves routing, filter combination, and result behavior unspecified.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all six parameters with examples. The description's facet list (keyword, category, rating, flavor tag) partially mirrors the schema but omits the status and limit filters, adding no syntax or semantics beyond it.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb ('Search') and resource ('sensory vault items') and enumerates the supported filter facets. However, it does not distinguish this tool from the sibling search_vault (or search_books/search_media/search_restaurants), leaving the agent to guess which vault to query.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The facet list hints at supported filters but gives no when-to-use guidance, no indication of when search_vault is the better pick, and no prerequisites or exclusions. The agent is left to infer routing on its own.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_vaultSearch VaultB
Unified search across all collections (books, media, sensory goods, restaurants, quotes).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum matches per domain. Defaults to 5. | |
| query | Yes | Search keywords matching titles, creators, tags, or tasting notes. | |
| domain | No | Optional domain filter ('books', 'media', 'movies', 'sensory', 'restaurants', 'quotes'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing: no mention of how results across domains are combined or ranked, no pagination behavior, and no read-only/reversibility framing beyond the implied meaning of 'search'. For a cross-domain aggregator with five underlying domains, this is a real gap.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the scope and covered domains are stated immediately. Every clause earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists and schema coverage is complete, so return values and parameters need not be re-explained. What is missing is the piece only prose can supply: guidance on choosing this unified search over the four overlapping domain-specific search siblings. Adequate but with a clear routing gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with all three parameters (query, limit, domain) documented in the schema itself. The description's parenthetical domain list loosely maps to the 'domain' values but adds no syntax, matching, or format detail beyond what the schema already supplies, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Unified search across all collections') and enumerates the covered domains, so an agent knows this spans books, media, sensory goods, restaurants and quotes. It implicitly contrasts with the domain-specific siblings but never names them, so the differentiation is inferable rather than explicit.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Unified across all collections' implies this is the cross-domain entry point, which is useful given siblings like search_books, search_media, search_sensory_vault and search_restaurants. However, it never states when to prefer this over a domain-specific search or how to scope results, leaving the routing decision to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
store_memoryStore MemoryC
Store a personal preference, habit, directive, or constraint in long-term memory.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Optional topic keywords for indexing (e.g. ['coffee', 'beverages']). | |
| content | Yes | The fact, preference, or directive to remember (e.g. 'Prefers dark roast pour-overs'). | |
| category | No | 'preference', 'dislike', 'goal', 'habit', 'context', or 'directive'. | preference |
| importance | No | Integer priority from 1 (minor quirk) to 5 (critical hard directive). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It does not explain persistence semantics, whether duplicate memories are merged, what happens on retrieval, or any permissions or side effects. Only the base action is stated, leaving significant gaps for a mutation-style tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no filler. It is efficient, though its extreme brevity pushes against the informational needs of the tool rather than being a structural flaw.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given a four-parameter mutation tool with no annotations and an output schema that handles return values, the description is too thin. It omits routing guidance relative to recall_memories, behavioral details about long-term storage, and any indication of scope or deduplication, leaving an agent under-informed for correct invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all four parameters in detail. The description adds a loose content-type list that partially overlaps with the category values, but provides no additional syntax, constraints, or examples beyond what the schema already gives. A baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Store') and resource ('long-term memory'), and enumerates the kinds of content accepted (preference, habit, directive, constraint). This clearly distinguishes it from the retrieval-oriented sibling recall_memories, though it does not name that sibling explicitly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no guidance on when to use this tool versus alternatives such as recall_memories or the many domain-specific logging/search tools. The description merely states what it does; an agent must infer the appropriate context from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
vet_recommendation_candidateVet Recommendation CandidateC
Check a recommendation candidate for library collision and calculate taste affinity score.
| Name | Required | Description | Default |
|---|---|---|---|
| domain | Yes | The entertainment domain ('books', 'movies', 'whiskey', etc.). | |
| attributes | No | Associated genres, flavor accords, or tags (optional). | |
| title_or_name | Yes | Title of the book/movie or name of the artisanal item/venue. | |
| maker_or_creator | No | Author, director, brand, or chef (optional). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states two operations (collision check and affinity scoring) but says nothing about side effects, permissions required, what happens on collision, or whether the operation is read-only.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single sentence with no wasted words. The compound purpose is front-loaded and immediately scannable.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with four parameters and no annotations, the description is too thin. While the output schema covers return values, the description lacks usage guidance, behavioral details, and any indication of how collision results or affinity scores should be interpreted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all four parameters are documented in the input schema. The description adds no additional meaning about parameter usage, formats, or constraints beyond what the schema already provides, making the baseline score of 3 appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a clear compound purpose: check a recommendation candidate for library collision and calculate a taste affinity score. It identifies the resource (recommendation candidate) and the specific actions, but does not differentiate this tool from sibling tools like search_vault or get_user_taste_profile.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no explicit guidance on when to use this tool versus alternatives, nor any prerequisites or exclusions. The context of 'recommendation candidate' implies a vetting step, but the agent must infer this and receives no routing instructions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
19 tool updates
v0.2.0- First observed
curate_for_tonight - First observed
get_aesthetic_pairing - First observed
get_agent_recommendation_brief - First observed
get_entertainment_stats - First observed
get_reading_list - First observed
get_user_taste_profile - First observed
get_watchlist - First observed
log_read_book - First observed
log_restaurant - First observed
log_sensory_item - First observed
log_watched_media - First observed
recall_memories - First observed
search_books - First observed
search_media - First observed
search_restaurants - First observed
search_sensory_vault - First observed
search_vault - First observed
store_memory - First observed
vet_recommendation_candidate
TDQS
Scored across 19 tools
Most tools are clearly distinct (e.g., search_books vs search_media vs search_sensory_vault). However, search_vault is a unified search that overlaps with the domain-specific searches and get_reading_list with search_books (on shelf filter) could cause mild confusion. These overlaps are described but still require judgment.
Predominantly verb_noun (get_user_taste_profile, search_books, log_read_book), but some nouns are compound (search_sensory_vault, get_aesthetic_pairing). Minor deviations but overall predictable.
19 tools is slightly heavy but justifiable given the domain covers multiple verticals (books, media, dining, sensory, memory). Not excessive.
Covers logging and searching for most domains, but missing update/delete operations for some entities (e.g., no update_book, delete_media). Podcasts are mentioned in stats but no tools exist for them. Quotes also lack dedicated tools. These gaps could cause agent dead-ends.
Maintenance
Related MCP Connectors
- AchriomOAuthcom.achriom
Media memory for AI agents and their humans: books, movies, music, shows, anime, podcasts, games.
The media memory layer for AI agents and their humans. Your AI client gets 29 tools to search your collection, add items, update ratings, preview music, and find patterns across everything you've read, watched, and listened to.
- LeafOAuthapp.readwithleaf
AI assistant integration for Leaf ā track books, log reading sessions, and manage your library.
An AI-first personal CRM you run in natural language: contacts, reminders, notes, and more.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables AI assistants to help users manage their reading experience by searching books, tracking reading progress, managing bookmarks, and generating personalized recommendations and summaries.-
- FlicenseNot gradedqualityDmaintenanceTracks movies, books, and TV shows with ratings and preferences, providing intelligent cross-media recommendations. Automatically fetches metadata from OMDB, Google Books, and TMDB to help manage watchlists and analyze viewing patterns.1-
- FlicenseNot gradedqualityDmaintenanceEnables personalized book recommendations by managing reading profiles and preferences, with tools to add genres, authors, and track books, then get AI-powered suggestions.30-
- FlicenseAqualityCmaintenanceEnables AI assistants to interact with BookLore self-hosted libraries, allowing natural language queries to search books, manage reading status, ratings, series, authors, and highlights.71-