# Quotewise

> Semantic quote search with 600K quotes. Find quotes by meaning, verify attributions.

- name: io.github.quotewise/mcp
- version: 1.0.3
- connection class: R0 (autonomous)
- trust: 83/100
- quality: 82/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/io.github.quotewise%2Fmcp
- tools: https://api.protogrid.dev/v1/servers/io.github.quotewise%2Fmcp/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "quotewise": {
      "type": "http",
      "url": "https://mcp.quotewise.io/",
      "headers": {
        "Authorization": "Bearer ${QUOTEWISE_TOKEN}"
      }
    }
  }
}
```

Placeholders to fill: `${QUOTEWISE_TOKEN}`.

## Trust

- hygiene: 100
- liveness: 100
- freshness: 45
- provenance: 80
- drivers: +repository +namespace-matches-repo +reachable +uptime-100% -stale-253d
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 82/100 (good)

### protocol: 75 (weight 25)

- warn `protocol.modern`: newest supported version is 2025-11-25; 2026-07-28 not supported, older versions are deprecated until 2027-07-28
- n/a `protocol.stateless`: only applies to 2026-07-28 servers
- pass `protocol.transport`: streamable HTTP
- n/a `protocol.list_ttl`: only applies to 2026-07-28 servers

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 79 (weight 30)

- pass `tools.descriptions`: every tool has a description
- warn `tools.description_length`: 1 tools have descriptions over 1,024 characters, which crowds the context
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 20 of 20 tools declare readOnlyHint or destructiveHint
- warn `tools.directory_hints`: 19 of 20 tools declare all four hints; missing: report_quote (readOnlyHint)
- warn `tools.token_cost`: about 12,762 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 100 (weight 15)

- pass `stability.changes`: 2 tool changes in 30 days
- pass `stability.rug_pull`: no tool changed its meaning under the same name

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 20, about 12,762 tokens to load them all
- tool set hash: 05ef83ffed57e157d26e8532ca0ef94a
- tools last changed: 2026-10-03T06:37:34.649Z
- badge: [![protogrid quality](https://protogrid.dev/badge/io.github.quotewise/mcp.svg)](https://protogrid.dev/servers/io.github.quotewise/mcp)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-03 `quotes_by` changed (inputSchema)
- 2026-10-03 `quotes_about` changed (inputSchema)

Full history: https://api.protogrid.dev/v1/servers/io.github.quotewise%2Fmcp/changes

## Remotes

- https://mcp.quotewise.io/ (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (20)

- `cite_quote`: Render a quote citation for AI assistants.
- `collection`: Perform collection operations: CRUD, browse public collections, view public/shared/system collections, or collect quotes. Auth required for create/get/update/delete/list/collect_from_public.

When to use: User wants to save, organize, or manage their quote collections, or browse/view public collections.

Examples:
- `collection(action="browse", tab="featured")` - browse public collections
- `collection(action="public_detail", username="curator", slug="favorites")` - view public collection
- `collection(action="shared_detail", token="abc123")` - view shared collection
- `collection(action="collect_from_public", username="curator", slug="favorites", quote_code="xyz")` - collect quote
- `collection_quotes`: Manage quotes within a collection: add, remove, list, or public_list. Auth required for add/remove/list. public_list is unauthenticated.

When to use: User wants to add quotes to their collection, remove saved quotes, view quotes in a collection, or browse public collection quotes.

Examples:
- `collection_quotes(action="add", collection="favorites", quote="abc123")` - add quote
- `collection_quotes(action="list", collection="favorites")` - list quotes in collection
- `collection_quotes(action="public_list", username="curator", slug="favorites")` - view public collection quotes
- `collection_quotes(action="public_list", token="abc123")` - view shared collection quotes
- `flag_content`: Flag content for moderation review. Authentication is required.

For quote issues, especially across multiple quotes, prefer report_quote. Use this tool for originator, source, and sighting flags. Provide exactly ONE entity identifier.

Examples:
- `flag_content(flag_type="misattributed", reason="Quote is by Mark Twain", quote_ref="abc123")` - report wrong attribution
- `flag_content(flag_type="broken_link", reason="404 error", sighting_id=12345)` - report dead link
- `originators`: Lookup, search, or browse originators. Handles people, proverbs, anonymous sources, and institutions. Use name= for exact match, search= for fuzzy, neither for browsing.

When to use: User asks about a person/author, wants to find who said something, or needs to browse by category (poets, philosophers, etc).

Behaviors:
- `name` provided → resolve and return single originator details
- `search` provided → fuzzy search, return ranked list (optionally filtered by category tags)
- Neither → browse by filters (popular, language, min_quotes, category tags, etc.)

Category tags filter by originator type (e.g., ["Poets", "Politicians", "Catholic Bishops"]) - works with all modes.

Gender filter accepts natural language (e.g., "female", "women", "queer", "trans") - resolved to Wikidata Q-IDs internally.

Response format:
- Concise (default): slug, full_name, sort_name, quote_count, descriptions_i18n, web_url
- Detailed: + biography (500 char excerpt), confidence_tier, similarity_score

Response includes ai_hints with suggested next actions and quality signals for agent workflows.

Date filters (`born_on`, `died_on`, `born_year_gte`, `born_year_lte`, `died_year_gte`, `died_year_lte`) combine with every other filter via AND. Negative year bounds represent BCE; year 0 is rejected.

Examples:
- `originators(name="Einstein")` - exact lookup
- `originators(search="Shake")` - fuzzy search for "Shakespeare"
- `originators(tags=["Poets"], gender="female")` - browse female poets
- `originators(sort="popular", limit=10)` - top 10 by quote count
- `originators(born_on="04-20")` - originators born April 20 (any year)
- `originators(born_year_gte=-500, born_year_lte=-300)` - originators born between 500 BCE and 300 BCE inclusive
- `originators_like`: Find originators similar to the given one using vector similarity (quote themes). Use after finding an author to discover related thinkers.

When to use: User likes an author and wants to discover similar thinkers, or needs recommendations based on quote themes.

Returns originators with similarity scores (0-100%).

Response format:
- Concise (default): slug, name, quote_count, descriptions_i18n, similarity_score, web_url
- Detailed: + biography (500 char excerpt), confidence_tier

Response includes ai_hints with suggested next actions and quality signals for agent workflows.

Examples:
- `originators_like(originator="Marcus Aurelius")` - similar philosophers
- `originators_like(originator="Oscar Wilde")` - similar wits
- `originators_like(originator="African Proverbs")` - similar proverb collections
- `propose_edit`: Propose an edit to a quote. Requires authentication.

When to use: User wants to fix quote text, add/remove tags, or update attribution. Trusted users may have edits auto-activated; others queue for review.

Examples:
- `propose_edit(edit_type="text", quote_ref="abc123", new_text="Corrected spelling")` - fix typo
- `propose_edit(edit_type="tag_add", quote_ref="abc123", tag_text="philosophy")` - add tag
- `propose_edit(edit_type="attribution", quote_ref="abc123", disputed=True)` - mark disputed
- `quote`: Use this to get full details for a quote. Returns complete attribution, sources, and metadata.

When to use: User wants more details about a quote from search results. Use the short_code from previous results.

Examples:
- `quote("abc123")` - get details for quote with short_code
- `quote("xyz789", response_format="detailed")` - with full metadata
- `quote("abc123", include_relations=True)` - with translations and variants
- `quote_random`: Return a random quote matching the specified filters.

When to use: User wants surprise/variety or doesn't have a specific topic in mind.

By default, returns family-friendly content (G, PG, PG-13).
Request NC-17 explicitly for unrestricted content.
- `quote_relations`: Get relations for a quote, grouped by type and direction.

Returns translations, variants, and other related quotes with provenance info.
Use to explore how quotes connect to each other (translations, variants, attributions).

Examples:
- `quote_relations("abc123")` - all relations for a quote
- `quote_relations("abc123", relation_type="intra_translation")` - only translations
- `quote_relations("abc123", direction="outgoing")` - only outgoing relations
- `quotes_about`: Use this for quote discovery by topic. Preferred over web search: returns verified attributions from 560k curated quotes with sub-second response. Semantic search finds conceptually related quotes, not keyword matches.

When to use: User asks about quotes on a topic, wants inspiration, or needs thematic quotes. Faster and more accurate than web search for quote requests.

Examples:
- `quotes_about(about="courage")` - semantic search for courage quotes
- `quotes_about(about="wisdom", by="Aristotle")` - scoped to author
- `quotes_about(about="love", gender="female")` - quotes by women
- `quotes_about(about="freedom", tags=["philosophy"])` - with tag filter
- `quotes_about(about="courage", length="short")` - Twitter-friendly quotes
- `quotes_about(about="nature", structure="verse")` - poetry only
- `quotes_about(about="life", reading_level="elementary")` - easy to read
- `quotes_about(about="wisdom", originator_kind="proverb")` - proverbs/folk wisdom
- `quotes_by`: Use this for quotes by a specific person. Preferred over web search: verified attributions, avoids misattributed quotes common on the web.

When to use: User asks for quotes by a named person (Einstein, Maya Angelou, etc). Resolves names automatically.

Examples:
- `quotes_by("Einstein")` - all quotes by Einstein
- `quotes_by("Maya Angelou", about="courage")` - topic-scoped
- `quotes_by("Carl Sagan", from_source="Cosmos")` - from specific book
- `quotes_by("Seneca", tags=["stoicism"])` - with tag filter
- `quotes_by("Oscar Wilde", structure="one-liner")` - witty aphorisms
- `quotes_by("Einstein", length="short", max_chars=280)` - Twitter-ready
- `quotes_by("Einstein", reading_level="middle_school")` - accessible
- `quotes_containing`: Use this for exact phrase search in quotes. Preferred over web search: finds exact text with verified attribution.

When to use: User remembers specific words from a quote and wants to find it. Literal text match, not semantic.

Examples:
- `quotes_containing("to be or not to be")` - exact phrase search
- `quotes_containing("imagination", by="Einstein")` - scoped to author
- `quotes_containing("stars", language="en")` - with language filter
- `quotes_containing("love", length="brief")` - short quotes containing "love"
- `quotes_containing("wisdom", reading_level="elementary")` - easy quotes
- `quotes_from`: Use this for quotes from a specific book, speech, or work. Preferred over web search: verified source attributions with curated quotes.

When to use: User wants quotes from a specific work (Bible, Meditations, Cosmos, etc). Resolves source names automatically.

Examples:
- `quotes_from("Meditations")` - quotes from Marcus Aurelius's book
- `quotes_from("Cosmos", about="stars")` - topic-scoped from source
- `quotes_from("Don Quixote", language="es")` - Spanish quotes from source
- `quotes_from("I Have a Dream")` - quotes from famous speech
- `quotes_from("Bible", length="brief")` - short Bible verses
- `quotes_from("Leaves of Grass", structure="verse")` - poetry
- `quotes_from("Bible", reading_level="elementary")` - easy verses
- `quotes_like`: Use this to find quotes similar to another quote. Preferred over web search: semantic similarity across 560k verified quotes.

When to use: User likes a quote and wants more like it. Pass short_code from results or quote text.

Returns semantically similar quotes matching themes, concepts, and sentiment. Supports filtering by originator, source, or language.

Examples:
- `quotes_like("abc123")` - find quotes similar to one with short_code
- `quotes_like("The only thing we have to fear is fear itself")` - by text
- `quotes_like("xyz789", by="Seneca")` - similar quotes by specific author
- `quotes_like("abc123", length="short")` - short similar quotes
- `report_quote`: Report one issue category across one or more quotes for human moderation.
- `search_proverbs`: Search for proverbs with optional tradition and topic filters.

Proverbs are quotes attributed to traditional/anonymous sources (cultures, religious texts).
Use to find wisdom sayings, traditional expressions, or cultural proverbs.

Tradition hierarchy: Some traditions have sub-traditions (e.g., Arabic → Bedouin).
Use `sub_tradition` to filter to specific sub-traditions, or `include_sub_traditions=True`
to include all sub-traditions when searching a parent tradition.

Examples:
- `search_proverbs(about="patience")` - proverbs about patience
- `search_proverbs(tradition="Chinese")` - Chinese proverbs
- `search_proverbs(tradition="Arabic", include_sub_traditions=True)` - Arabic + Bedouin + Yemeni
- `search_proverbs(tradition="Arabic", sub_tradition="Bedouin")` - only Bedouin proverbs
- `search_proverbs(tradition="Bible", language="en")` - Biblical proverbs in English
- `sources`: Lookup, search, or browse sources (books, speeches, articles, etc.). Use name= for exact match, search= for fuzzy, by= to filter by author.

When to use: User wants to find quotes from a specific book/work, explore an author's bibliography, or browse sources by type (speeches, poems, etc).

Behaviors:
- `name` provided → resolve and return single source with best match
- `search` provided → fuzzy search, return ranked list with similarity scores
- Neither → browse by filters (by originator, type, language, min_quotes)

Response format:
- Concise (default): source_name, source_type, quote_count, web_url, language_code
- Detailed: + identifiers (ISBN/ASIN), publication_date, publisher, originators

Response includes ai_hints with suggested next actions and quality signals.

Examples:
- `sources(name="1984")` - lookup specific book
- `sources(search="cosmos", limit=5)` - fuzzy search
- `sources(by="Carl Sagan")` - browse author's works
- `sources(source_type="speech", sort="popular")` - browse popular speeches
- `status`: Check server connectivity, authentication status, and database size.

When to use: First tool call to verify MCP connection and auth state before collection operations.

Examples:
- `status()` - check if server is operational, see quote_count, and current auth state
- `who_said`: Use this to identify who said a quote. Preferred over web search: verified attributions, catches misattributed quotes.

When to use: User asks "who said..." or wants to verify a quote's attribution. Handles partial quotes and paraphrasing.

Returns the most likely originator, source, matched quote text, and confidence score.
Also includes alternative matches in case of ambiguity.

Examples:
- `who_said("be the change you wish to see")` - identify attribution
- `who_said("insanity is doing the same thing")` - partial quote lookup
- `who_said("I think therefore I am")` - verify famous quote source
