Skip to main content
Glama

Curator MCP (curator-mcp)

Python 3.10+ License: MIT FastMCP Google Cloud Firestore Tests: 67 Passing

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:

  1. Books: Library ingestion, to-read queue, currently-reading tracking, Google Books & Open Library live discovery.

  2. Movies & TV: IMDb ratings and watchlist ingestion, TMDB discovery, and automated similar-media recommendations.

  3. Memorable Quotes & Mental Models: Capturing principles, philosophies, and memorable dialogue with theme tagging and spaced retrieval.

  4. Podcasts: Queue management, listening logs, guest tracking, key takeaways, and zero-key Apple Podcasts discovery.

  5. Sensory Vault: Connoisseur tasting logs for Tea, Whiskey, Coffee, Gin, Wine, Chocolate, Perfume, and Watches with flavor wheel accords and domain specs.

  6. Fine Dining & Restaurants: Gastronomy journal, city guides, Michelin distinctions, signature dishes, and reservation wishlists.

  7. 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.

  8. Multimodal Sensory Pairings: Cross-domain aesthetic pairings bridging books and films with beverages, ambient fragrances, chocolates, and sonic atmospheres.

  9. 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.

  10. 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.py acts as a thin controller exposing FastMCP tool endpoints that delegate directly to domain services.

  • Repository Pattern: BaseFirestoreRepository encapsulates all Firestore CRUD and FieldFilter query operations.

  • Batch Processing: BaseImporter implements safe 500-document batching chunks and dry-run simulation for CSV ingestion.

  • Resilient Fallbacks: BookMetadataClient queries 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.10 or 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

  1. In the Firebase Console, go to Project Settings > Service accounts.

  2. Click Generate new private key and save the JSON file.

  3. Move the file into your project directory (e.g. service-account.json).

  4. Copy .env.example to .env:

    cp .env.example .env
  5. Edit .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.csv

IMDb 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.csv

Note: 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

curator://context/personal_memory

Live ambient memory context: critical directives, dietary/sensory constraints, active goals, and lifestyle habits.

Resource

curator://context/taste_dna_dossier

Machine-readable Taste DNA dossier (Cultural Archetype, top creators, sensory accords).

Resource

curator://context/active_queues

Live background context: currently-reading books, movie watchlist, and podcast queue.

Resource

curator://context/daily_digest

Morning briefing: Quote of the Day, reading progress, and vault summary metrics.

Resource

curator://context/taste_profile

Live background context: user's top genres, directors, authors, flavor accords, and favorite cuisines.

Prompt

/daily-briefing

1-click morning briefing prompt synthesizing thoughts for the day and evening cultural picks.

Prompt

/tasting-session

Master Sommelier / Barista / Perfumer interactive tasting interview to evaluate and log items.

Prompt

/weekend-curation

Complete curated weekend plan (film pick + wine/tea pairing + book reading + dinner).

Prompt

/smart-recommendation-consultation

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

get_agent_recommendation_brief

domain, mood_or_intent, target_location

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.

vet_recommendation_candidate

domain, title_or_name, maker_or_creator, attributes

Call before presenting to user. Checks for library/wishlist collisions, calculates taste affinity score, and returns personalization hooks.

get_user_taste_profile

none

Aggregates favorite genres, top directors, authors, and 5ā˜…/10ā˜… items.

get_entertainment_stats

none

Macro metrics across books, media, quotes, podcasts, sensory vault, and restaurants.

curate_for_tonight

max_runtime_mins, genre, min_imdb_rating, media_type, count

Smart evening picker that filters watchlist by runtime, mood, and ratings with match reasons.

generate_cultural_wrapped

year

Comprehensive annual cultural retrospective with metrics and synthesized "Cultural Archetype".

2. Books Management & Discovery (Goodreads Standard)

Tool Name

Parameters

Description

search_books

query, shelf, limit

Search Firestore library by title or author keywords.

get_recently_read_books

limit

Retrieve finished books sorted chronologically by completion date.

get_reading_list

shelf, limit

Retrieve books from to-read or currently-reading queues.

add_to_reading_list

title, author, notes

Add a recommended book directly to the reading queue.

log_read_book

title, author, user_rating, review, private_notes, date_read

Log a finished book with Goodreads rating (0–5ā˜…), written review, private notes, and date read.

update_book_status

title, book_id, shelf, user_rating, review, private_notes, date_read, date_started

Update reading status/shelf (read, currently-reading, to-read), Goodreads rating, review, and notes.

get_book_details

book_id

Fetch complete document for a book by Goodreads ID.

lookup_book_online

title, author

Query Google Books & Open Library for synopses and covers.

find_similar_books_online

title, author, limit

Discover books similar in theme and author style.

3. Media (Movies & TV) Management & Streaming (IMDb Standard)

Tool Name

Parameters

Description

search_media

query, media_type, status, limit

Search movies and series by title or director.

get_recently_watched_media

limit, media_type

Retrieve viewed movies/series sorted chronologically by rating date.

get_watchlist

media_type, genre, limit

Retrieve watchlist items with optional genre filter.

add_to_watchlist

title, media_type, year, genres, directors, notes

Add a movie or show to the watchlist.

log_watched_media

title, media_type, user_rating, review, user_notes, date_watched

Log a viewed film/series with IMDb rating (1–10), written review, personal notes, and date.

update_media_status

title, media_id, status, user_rating, review, user_notes, date_watched

Update status (watched or watchlist), IMDb rating (1–10), written review, and viewing notes.

get_media_details

media_id

Fetch complete record by IMDb Const ID (tt...).

get_streaming_providers

title, media_type, country

Check where a title is streaming (Netflix, Max, Prime, Apple TV+) via TMDB / JustWatch.

lookup_media_online

title, media_type, year

Query TMDB for synopsis, posters, and vote average.

find_similar_media_online

title, media_type, limit

Query TMDB recommendation algorithm for similar titles.

4. Memorable Quotes & Mental Models

Tool Name

Parameters

Description

add_quote

quote_text, source_title, source_type, speaker_or_author, theme_tags, notes, favorite

Save a quote or mental model from a book or film.

get_random_quote

theme, source_type

Spaced retrieval of a random quote for inspiration or decision-making.

search_quotes

query, theme, source_title, limit

Search saved quotes by keyword, speaker, or theme.

list_favorite_quotes

limit

Retrieve all quotes marked as all-time favorites.

5. Podcasts

Tool Name

Parameters

Description

add_to_podcast_queue

podcast_name, episode_title, guest, topics, episode_url

Add an episode to the listening queue.

log_listened_podcast

podcast_name, episode_title, user_rating, guest, key_takeaways

Log a completed episode with takeaways and rating.

get_podcast_queue

limit

View upcoming podcast episodes.

search_podcasts

query, guest, topic, limit

Search podcast archive by show, guest, or topic.

lookup_podcast_online

query, limit

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_sensory_item

category, name, maker_or_brand, origin_or_region, vintage_or_year, status, user_rating, flavor_or_scent_notes, specs, review, personal_notes, price_tier, date_experienced

Log an artisanal item with tasting notes, olfactory accords, or horology specs.

update_sensory_item

item_id, user_rating, status, review, personal_notes, flavor_or_scent_notes, specs

Update tasting notes, ratings, or mark wishlist item as sampled/owned.

search_sensory_vault

query, category, status, min_rating, tag, limit

Search personal vault by keyword, category, status, rating, or flavor/scent tag.

get_sensory_taste_profile

none

Aggregated flavor profile, top accords, and favorite distillers, roasters, or perfumers.

search_open_product_catalog

category, query, limit

Free search across Open Food Facts (wines, teas, coffee, chocolate) and Whisky Hunter.

7. Fine Dining & Restaurant Journal

Tool Name

Parameters

Description

log_restaurant

name, city, cuisine, neighborhood, status, user_rating, michelin_status, price_tier, standout_dishes, notes_and_review, vibe_tags, url_or_reservation, date_visited

Log dining experiences or add to dining wishlist with dishes, vibes, and ratings.

update_restaurant

restaurant_id, status, user_rating, standout_dishes, notes_and_review, vibe_tags, date_visited, url_or_reservation

Update food reviews, signature dishes, or convert wishlist to visited.

search_restaurants

query, city, cuisine, status, vibe, min_rating, limit

Query dining history and wishlists by city, cuisine, vibe tag, or rating.

get_dining_stats

none

Summary of places visited, cities explored, top cuisines, and Michelin star breakdown.

8. Multimodal Sensory & Cultural Pairings

Tool Name

Parameters

Description

get_aesthetic_pairing

anchor_type, title_or_name, author_or_creator, mood

Cross-domain pairing matching books/films with beverages, fragrances, chocolates, and music.

get_dining_course_pairing

dish_or_cuisine, dining_style

Beverage and cellar pairing (fine wine, cocktail, tea) tailored to a culinary dish.

9. Persistent Long-Term Memory & Ambient Directives

Tool Name

Parameters

Description

store_memory

content, category, tags, importance

Autonomously store personal facts, preferences, quirks, habits, or critical directives.

recall_memories

query, category, min_importance, limit

Search and retrieve remembered user facts and directives matching topic or category.

forget_memory

memory_id

Delete an obsolete or retracted personal memory by ID.

get_memory_stats

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.

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.json to Base64 and pass it directly:

-e FIREBASE_CREDENTIALS_BASE64="$(base64 -i service-account.json)"

3. Docker MCP Toolkit (Docker Desktop)

In Docker Desktop:

  1. Open Docker Desktop Settings > Beta Features > enable Docker MCP Toolkit.

  2. Run curator-mcp as a managed container or register it directly into the local Docker MCP Gateway.

  3. 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:

  1. Enable Slim Mode (CURATOR_SLIM_MODE=true or 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).

  2. Unified Search (search_vault):

    • Instead of calling separate tools for books, movies, sensory goods, and restaurants, search_vault searches across all domains in a single tool call.

  3. Compact Payloads:

    • get_agent_recommendation_brief no 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:latest

Then 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 init to add instant 1-click installation for Claude Desktop.

  • Docker MCP Catalog: Submit curator-mcp to 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 via vet_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 attach curator://context/personal_memory via 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:

  1. Zero Secret Leakage:

    • The .gitignore strictly 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.

  2. Safe Lazy Loading:

    • config.py uses lazy proxy initialization so that running unit tests, building wheels, or executing --help commands will never throw missing-key crashes or expose environment data.

  3. 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 tests

Tests 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 tools
curate_for_tonightCurate For TonightC

Filter watchlist by available time (minutes), genre, and IMDb rating.

ParametersJSON Schema
NameRequiredDescriptionDefault
countNoNumber of curated options to present. Defaults to 3.
genreNoPreferred genre filter (e.g. 'Sci-Fi', 'Comedy', 'Drama').
media_typeNo'movie' or 'tv'. Defaults to 'movie'.movie
min_imdb_ratingNoMinimum IMDb score (e.g. 7.5).
max_runtime_minsNoMaximum runtime in minutes (e.g. 120 for 2 hours).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
moodNoAtmospheric intention (e.g. 'melancholic rain', 'late-night focus').
anchor_typeYes'book' or 'media'/'movie'.
title_or_nameYesTitle of the book or film.
author_or_creatorNoAuthor or director (optional).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesTarget category ('books', 'movies', 'whiskey', 'wine', 'restaurants', etc.).
mood_or_intentNoOptional atmospheric vibe or craving (e.g. 'cozy rainy night noir').
target_locationNoOptional geographic context for dining and physical experiences.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.7/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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').

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of books to return. Defaults to 8.
shelfNoQueue name ('to-read' or 'currently-reading'). Defaults to 'to-read'.to-read

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

A3.5/5.0
Behavior3/5

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.

Conciseness5/5

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.

Completeness4/5

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.

Parameters4/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
genreNoOptional genre filter (e.g. 'Sci-Fi', 'Thriller').
limitNoMaximum results to return. Defaults to 8.
media_typeNoOptional filter ('Movie', 'TV Series').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.2/5.0
Behavior3/5

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.

Conciseness4/5

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.

Completeness4/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
notesNoGeneral legacy notes.
titleYesBook title.
authorYesAuthor name.
reviewNoPublic review or literary analysis.
book_idNoOptional existing book ID.
date_readNoISO date read (YYYY-MM-DD), defaults to today.
user_ratingYesStar rating (0 to 5).
private_notesNoPrivate reflections or takeaways.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityYesCity where located (e.g. 'Tokyo', 'London', 'San Francisco').
nameYesName of the restaurant or establishment.
statusNo'visited' or 'wishlist'.wishlist
cuisineYesPrimary cuisine category (e.g. 'Japanese', 'Nordic', 'Italian').
vibe_tagsNoAtmosphere tags (e.g. ['omakase', 'intimate', 'speakeasy']).
price_tierNoPrice bracket ('$', '$$', '$$$', '$$$$').
user_ratingNoRating from 1.0 to 10.0 (if visited).
date_visitedNoDate of dining experience (YYYY-MM-DD).
neighborhoodNoSpecific district or quarter (e.g. 'Ginza', 'Mayfair').
restaurant_idNoOptional custom ID.
michelin_starsNo1, 2, or 3 Michelin stars (optional).
standout_dishesNoMust-order menu items or tasting course highlights.
notes_and_reviewNoDining notes, reservation tips, or food review.
url_or_reservationNoWebsite or reservation link (Resy/OpenTable).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
nameYesName of bottle, vintage, bean, blend, fragrance, or reference.
specsNoDomain-specific technical specifications (ABV, processing method, movement caliber).
reviewNoDetailed tasting appraisal.
statusNo'owned', 'wishlist', or 'experienced'.owned
item_idNoOptional existing item ID.
categoryYesDomain ('whiskey', 'wine', 'coffee', 'tea', 'gin', 'chocolate', 'perfume', 'watch').
price_tierNoPricing bracket ('$', '$$', '$$$', '$$$$').
user_ratingNoRating from 1.0 to 10.0.
maker_or_brandYesProducer, distillery, roaster, estate, or maison.
personal_notesNoPrivate reflections or cellaring notes.
vintage_or_yearNoVintage year or production release.
date_experiencedNoDate tasted or acquired (YYYY-MM-DD).
origin_or_regionNoTerroir or country of origin (e.g. 'Islay, Scotland', 'Yirgacheffe, Ethiopia').
flavor_or_scent_notesNoFlavor accords, nose aromas, or olfactory pyramid notes.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
yearNoRelease year.
titleYesTitle of the media item.
reviewNoReview notes or critical appraisal.
imdb_idNoIMDb ID (optional).
tmdb_idNoTMDB ID (optional).
media_typeNo'movie' or 'tv'.movie
user_ratingYesInteger rating from 1 to 10.
date_watchedNoISO date string (YYYY-MM-DD), defaults to today.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return. Defaults to 5.
queryNoKeyword or topic query (e.g. 'coffee', 'tokyo', 'reading').
categoryNoCategory filter ('preference', 'dislike', 'goal', 'habit', 'context', 'directive').
min_importanceNoMinimum importance threshold (1 to 5). Defaults to 1.

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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').

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of matched records to return. Defaults to 5.
queryNoKeyword string to match against title or author.
shelfNoOptional shelf filter ('read', 'currently-reading', 'to-read').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMax results to return. Defaults to 5.
queryNoSearch keywords.
statusNoOptional watch status ('watched', 'watchlist').
media_typeNoOptional filter ('Movie', 'TV Series').

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
cityNoCity filter (e.g. 'Tokyo', 'London', 'Paris').
vibeNoAtmospheric tag (e.g. 'omakase', 'romantic', 'casual').
limitNoMax results. Defaults to 5.
queryNoKeyword query matching name, neighborhood, or dishes.
statusNo'visited' or 'wishlist'.
cuisineNoCuisine category (e.g. 'Japanese', 'French', 'Seafood').
min_ratingNoMinimum rating (1.0 to 10.0).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

B3.1/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoFlavor or aroma accord tag (e.g. 'peat', 'bergamot', 'jasmine').
limitNoMax results to return. Defaults to 5.
queryNoKeyword matching name, brand, origin, or notes.
statusNoOwnership filter ('owned', 'wishlist', 'experienced').
categoryNoDomain filter ('whiskey', 'wine', 'coffee', 'tea', 'gin', 'chocolate', 'perfume', 'watch').
min_ratingNoMinimum rating threshold (1.0 to 10.0).

Output Schema

ParametersJSON Schema
NameRequiredDescription
resultYes

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum matches per domain. Defaults to 5.
queryYesSearch keywords matching titles, creators, tags, or tasting notes.
domainNoOptional domain filter ('books', 'media', 'movies', 'sensory', 'restaurants', 'quotes').

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

B3.3/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness3/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines3/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagsNoOptional topic keywords for indexing (e.g. ['coffee', 'beverages']).
contentYesThe fact, preference, or directive to remember (e.g. 'Prefers dark roast pour-overs').
categoryNo'preference', 'dislike', 'goal', 'habit', 'context', or 'directive'.preference
importanceNoInteger priority from 1 (minor quirk) to 5 (critical hard directive).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness4/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

ParametersJSON Schema
NameRequiredDescriptionDefault
domainYesThe entertainment domain ('books', 'movies', 'whiskey', etc.).
attributesNoAssociated genres, flavor accords, or tags (optional).
title_or_nameYesTitle of the book/movie or name of the artisanal item/venue.
maker_or_creatorNoAuthor, director, brand, or chef (optional).

Output Schema

ParametersJSON Schema
NameRequiredDescription

No output parameters

TDQS

C2.9/5.0
Behavior2/5

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.

Conciseness5/5

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.

Completeness2/5

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.

Parameters3/5

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.

Purpose4/5

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.

Usage Guidelines2/5

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.

  1. 19 tool updatesv0.2.0
    • First observedcurate_for_tonight
    • First observedget_aesthetic_pairing
    • First observedget_agent_recommendation_brief
    • First observedget_entertainment_stats
    • First observedget_reading_list
    • First observedget_user_taste_profile
    • First observedget_watchlist
    • First observedlog_read_book
    • First observedlog_restaurant
    • First observedlog_sensory_item
    • First observedlog_watched_media
    • First observedrecall_memories
    • First observedsearch_books
    • First observedsearch_media
    • First observedsearch_restaurants
    • First observedsearch_sensory_vault
    • First observedsearch_vault
    • First observedstore_memory
    • First observedvet_recommendation_candidate

TDQS

B3.2/5.0

Scored across 19 tools

Disambiguation4/5

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.

Naming Consistency4/5

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.

Tool Count4/5

19 tools is slightly heavy but justifiable given the domain covers multiple verticals (books, media, dining, sensory, memory). Not excessive.

Completeness3/5

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

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables AI assistants to help users manage their reading experience by searching books, tracking reading progress, managing bookmarks, and generating personalized recommendations and summaries.
    -
  • F
    license
    Not graded
    quality
    D
    maintenance
    Tracks 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
    -
  • F
    license
    A
    quality
    C
    maintenance
    Enables AI assistants to interact with BookLore self-hosted libraries, allowing natural language queries to search books, manage reading status, ratings, series, authors, and highlights.
    7
    1
    -