Use SFF Book Awards with an AI Assistant
Connect an MCP-capable assistant to the public science fiction and fantasy book-awards dataset, then ask natural-language reading, comparison, and dataset-coverage questions. The server is read-only, needs no authentication or secret headers, and serves generated public artifacts rather than live source data.
- books
- 3,248
- recognitions
- 4,447
- page copy updated
- Jul 29, 2026
- dataset metadata updated
- Jul 29, 2026
- site export built
- Jul 29, 2026
Connect
Most MCP clients only need the endpoint. The lower sections are for client authors, manual smoke tests, and debugging failed connections.
- MCP endpoint
https://sffawards.com/mcp- Transport
- Modern Streamable HTTP on one endpoint. Requests use JSON-RPC over
POSTwith JSON responses or request-scoped SSE when needed. Standalone GET streams and session DELETE requests are not supported. - Protocol version
- The endpoint serves only
2026-07-28. Every request is self-describing and must carry the matching protocol value in both its HTTP header and reserved request metadata. - Authentication
- None. Do not send OAuth credentials, API keys, bearer tokens, cookies, or user account state.
Use with ChatGPT
Follow OpenAI's current Connect from ChatGPT guide for developer-mode availability and the current interface. Use https://sffawards.com/mcp as the public MCP server URL.
This endpoint needs no authentication and no secret headers. UI labels and workspace controls can change, so this page does not duplicate the setup navigation or require optional app metadata such as an icon.
Browser WebMCP
The MCP endpoint above is the recommended integration for ordinary assistant clients. The interactive browser app also exposes experimental WebMCP tools when an agent opens https://sffawards.com in a supported Chrome origin-trial or local-testing context. The homepage registers them through the current document.modelContext.registerTool() API; the tab must stay open while an agent discovers or executes them.
These browser tools are separate from the remote /mcp endpoint and use only public generated data already loaded by the app:
get_sff_awards_context- Read-only dataset freshness, counts, top facets, current URL, and discovery links.
search_sff_awards_books- Read-only bounded search and filtering without changing the visible page.
show_sff_awards_books- Applies filters to the visible browser page and returns the matching public books.
recommend_sff_awards_books- Read-only deterministic recommendations for common reader intents.
open_sff_awards_page- Navigates the visible tab to a main site page.
What You Can Ask
Use these as ordinary user prompts after your assistant is connected to the MCP server. The assistant should choose the tools; users should not need to write JSON-RPC or tool arguments by hand.
- I liked award-winning space opera. What should I read next?
- Compare three books I name and tell me which is the best entry point.
- What recent fantasy winners have lots of reader engagement?
- Which awards does a book I name have, and what else is similar?
- Explain what the dataset covers before recommending anything.
- Give me overlooked books recognized by awards in the 1990s.
- Show me Hugo-winning novels since 2010 that work as entry points.
- Find fantasy books that were recognized by more than one award family.
- Recommend standalone science fiction with strong reader ratings.
- What are good first books for exploring cyberpunk, high fantasy, or urban fantasy?
- List recent nominees with lower Goodreads rating counts but strong award evidence.
- Compare award recognition and reader engagement for books I am choosing between.
Agent Instruction
If your client lets you add server-specific instructions, use this concise contract. It tells the assistant how to use the MCP server without adding a custom discovery step.
Use the book_awards MCP server for public science fiction and fantasy award data.
Start with native MCP discovery, then call get_dataset_info when you need freshness, facets, coverage, scoring notes, limits, or export links.
Use search_books for filtered retrieval, recommend_books for reader intent, get_book for one work, get_award for one award category, get_subgenre for one taxonomy view, and compare_books for side-by-side choices.
Ground recommendations in returned award recognition, years, win or finalist status, rating counts, score context, caveats, and stable work_key values.
Do not infer live Goodreads or SFADB state; this endpoint serves generated public artifacts only.
Runtime Details
- CORS
- Open for browser and web-client use from valid HTTPS origins and local development origins. The endpoint responds with
Access-Control-Allow-Origin: *, rejects invalid or opaqueOriginvalues, and supports CORS preflight requests forContent-Type,Accept,MCP-Protocol-Version,Mcp-Method, andMcp-Name. - Response caching
- Every
/mcpresponse, including CORS preflight, usesCache-Control: no-store. Separately, MCP list and read results carry bounded public protocol cache hints so a supporting client can reuse unchanged discovery data without an HTTP intermediary storing the exchange.Access-Control-Max-Agemay cache only the preflight permission decision. - Data source
- Generated static public artifacts, not request-time Goodreads or SFADB fetching.
Required HTTP Flow
- Start with
server/discover. There is no initialization or session lifecycle. - For every
POST, includeMCP-Protocol-Version: 2026-07-28and a matchingio.modelcontextprotocol/protocolVersionvalue inparams._meta. - Include
Mcp-Methodwith the JSON-RPC method andMcp-Namefor named operations such astools/call,resources/read, andprompts/get. - Include client capabilities in the reserved request metadata; client identity is recommended but optional.
- Browser clients must send a valid HTTPS origin, or a local development origin such as
http://localhost:5173.
POST /mcp HTTP/1.1
Host: sffawards.com
Accept: application/json
Content-Type: application/json
MCP-Protocol-Version: 2026-07-28
Mcp-Method: server/discover
Origin: https://your-client.example
{
"jsonrpc": "2.0",
"id": 1,
"method": "server/discover",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "your-client",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}
Native Discovery
- Use native MCP discovery.
tools/listexposes tool descriptions, input schemas, output schemas, and read-only annotations. - Use
resources/list,resources/templates/list, andprompts/listfor the resource and prompt catalog. - Use
completion/completefor deterministic, bounded award, subgenre, recommendation-intent, genre, and work suggestions exposed by resource templates and prompts. - There is no separate discovery tool. Call
get_dataset_infoonly when the agent needs dataset facets, freshness, coverage, scoring notes, limits, and export URLs.
{
"jsonrpc": "2.0",
"id": 2,
"method": "tools/list",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "your-client",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
}
}
}
{
"discovery_methods": [
"tools/list",
"resources/list",
"resources/templates/list",
"prompts/list",
"completion/complete"
],
"schema_resources": [
"book-awards://schemas/manifest",
"book-awards://schemas/tools",
"book-awards://schemas/shared"
]
}
Current MCP Tools
get_dataset_info- Coverage, metadata freshness, facets, scoring, exports, and limits. Large author and series facet projections report available, matched, returned, limit, and truncation metadata and link to the full facets resource.
search_books- Filtered book retrieval by normalized title/author text, award-recognition genre, award, subgenre, year, recognition status, score, audience size, and series mode.
recommend_books- Goal-oriented recommendations for entry points, recent winners, reader favorites, hidden gems, similar books, and shortlist or subgenre samplers. Similar-book, award-sampler, and subgenre-sampler intents require their matching selector.
get_book- One work by
work_keyor Goodreads book ID, with optional recognitions, score context, and related books. get_award- Award-category views with year, recognition, genre, sort, and limit filters.
get_subgenre- Subgenre views with award-year, recognition, series-mode, sort, limit, and offset filters. Returns up to 50 works per page from the complete filtered population.
compare_books- Compare 2 to 5 distinct works by awards, score, genre, subgenre, series, recency, and audience size. The requested
dimensionscontrol which work fields, strongest values, and notes are returned.
Tool Calls
- Call tools through
tools/callwith the tool name and schema-valid arguments discovered fromtools/list. - Successful calls return canonical
structuredContentmatching the tool-specificoutputSchema, plus a concise text summary rather than a duplicate JSON serialization. get_book,get_award,get_subgenre, andget_dataset_infoalso return one naturalresource_linkcontent block that a supporting client can read directly.- The wire result uses the modern
resultType: "complete"envelope. Stable application handles such aswork_key, award keys, subgenre keys, andbook-awards://resource URIs live inside the returned records. genreis an award-recognition genre filter, not a work-genre or subgenre-family filter. When award or family, award year, winner state, and genre are combined, the same recognition rows must satisfy those qualifiers.non-winnersmeans a qualifying recognition row withwinner: false; it does not mean the work has no wins in every other award scope.- Work-level
genre_keysand taxonomysubgenres[*].familyremain separate evidence. A crossover work can have both supported work genres without changing recognition-filter semantics. - Cite award recognition, score or rating-count context, and caveats from returned records when making recommendations.
- Do not infer live Goodreads or SFADB state from this endpoint. Request-time external source fetching is disabled.
{
"jsonrpc": "2.0",
"id": 3,
"method": "tools/call",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "your-client",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
},
"name": "search_books",
"arguments": {
"subgenre_keys": [
"space-opera"
],
"recognition": "winners",
"limit": 5
}
}
}
{
"jsonrpc": "2.0",
"id": 3,
"result": {
"resultType": "complete",
"content": [
{
"type": "text",
"text": "Found 1 of 1 matching award-recognized books."
}
],
"structuredContent": {
"results": [
{
"work_key": "work-gr-example",
"title": "Example Award Winner",
"award_keys": [
"hugo-novel"
],
"subgenre_keys": [
"space-opera"
]
}
],
"page": {
"limit": 5,
"offset": 0,
"total": 1,
"has_more": false,
"next_offset": null
}
}
}
}
Error Handling
- Award, award-family, and subgenre keys are closed discovery vocabularies. Unknown values are rejected by tool input validation; use
get_dataset_infofacets or the full facets resource to choose a listed key. - Work keys remain open identifiers. Unknown keys for
get_book,compare_books, andrecommend_books(intent="similar_to")returnisError: truewith schema-conforming structured miss data andmissing_work_keys. - Missing intent selectors, reversed ranges, duplicate comparison keys, and incompatible comparison dimensions return actionable error tool results.
- Only confirmed missing dynamic artifacts become resource-not-found protocol errors. Asset backend failures, malformed JSON, network failures, and cancellation remain internal server errors.
- The current SDK exposes an unknown tool name as an error tool result. Malformed HTTP/JSON-RPC, invalid origins, content types, methods, and unsupported or mismatched protocol headers fail at the HTTP or protocol layer.
{
"jsonrpc": "2.0",
"id": 5,
"result": {
"resultType": "complete",
"isError": true,
"structuredContent": {
"found": false,
"intent": "similar_to",
"requested": {
"seed_work_key": "work-gr-unknown"
},
"missing_work_keys": [
"work-gr-unknown"
],
"results": [],
"page": {
"limit": 10,
"offset": 0,
"total": 0,
"has_more": false,
"next_offset": null
},
"recommendation_reasons": {}
},
"content": [
{
"type": "text",
"text": "No matching public work was found for work-gr-unknown."
}
]
}
}
Resources And Prompts
Resources expose dataset metadata, facets, scoring, exports, schemas, works, awards, and subgenres. Scoring and export resources are named projections rather than copies of all dataset metadata. Award and subgenre resources are bounded summaries with tool hints; use tools for complete filtered retrieval. Prompt templates cover next-read recommendations, book comparison, and dataset explanation. Resource templates and supported prompt arguments provide deterministic completion with at most 25 suggestions. Completion for compare_sff_books.work_keys preserves selected keys while suggesting the next distinct stable work_key.
Schema resources are available as book-awards://schemas/manifest, book-awards://schemas/tools, and book-awards://schemas/shared. Work, award, and subgenre resources use URI templates such as book-awards://works/{work_key}.
find_next_sff_readUse recommend_books or search_books to answer this reader request with award and rating evidence: recommend an award-recognized SFF book.compare_sff_booksCall compare_books for these work keys and explain the strongest fit per dimension: work-gr-44767458, work-gr-18373
Schema Artifacts
MCP clients should use tools/list as the live contract. Public schema artifacts are also available at https://sffawards.com/data/mcp/schemas/manifest.json, https://sffawards.com/data/mcp/schemas/tools.json, and https://sffawards.com/data/mcp/schemas/shared.json. The schema manifest hashes the generated tool and shared schemas. The separate OpenAPI document describes the HTTP/JSON-RPC transport envelope, not each tool's live schema, and is not claimed by either hash manifest.
Limits And Freshness
- Use
get_dataset_infofor current facets, coverage, scoring notes, export URLs, and limits before broad recommendations. Itsmetadata_updated_atvalue means the last semantic change to dataset metadata, not the identity of every artifact byte. - The root artifact manifest and its per-artifact hashes identify the complete generated MCP snapshot. The separate
awards.json.generated_atvalue records the latest site export/build time. - Search and recommendation calls are bounded for agent use. Defaults are intentionally small:
search_booksreturns 10 by default and up to 25;recommend_booksreturns 10 by default and up to 20. - Book-retrieval tools use offset pagination. When a response includes
page.has_more: true, request the same filters withoffsetset topage.next_offsetto fetch the next page. get_awardreturns up to 150 recognition records per call, andget_subgenrereturns up to 50 works per page from its complete filtered population.- Goodreads ratings are public edition metadata and may be missing for some works.
- Subgenres are controlled local taxonomy assignments, not raw Goodreads shelves.
- Machine-readable dataset metadata is also available at
https://sffawards.com/data/mcp/dataset-info.json.
{
"jsonrpc": "2.0",
"id": 4,
"method": "tools/call",
"params": {
"_meta": {
"io.modelcontextprotocol/protocolVersion": "2026-07-28",
"io.modelcontextprotocol/clientInfo": {
"name": "your-client",
"version": "1.0.0"
},
"io.modelcontextprotocol/clientCapabilities": {}
},
"name": "search_books",
"arguments": {
"subgenre_keys": [
"space-opera"
],
"recognition": "winners",
"limit": 10,
"offset": 10
}
}
}
Static Artifacts And Cache Headers
https://sffawards.com/data/mcp/manifest.jsonlists Python-generated MCP data artifact paths, byte counts, and SHA-256 hashes.https://sffawards.com/data/mcp/schemas/manifest.jsonlists generated schema artifact paths, byte counts, and SHA-256 hashes.https://sffawards.com/data/mcp/dataset-info.jsoncarries metadata freshness, limits, scoring notes, and export URLs.- Every current
/data/mcp/*URL is path-stable and usesCache-Control: public, no-cache, must-revalidate. Browsers and shared caches may store these objects but must revalidate before reuse. - Long-lived
immutablecaching is reserved for future fingerprinted URLs. Current MCP paths do not use a one-year shared TTL or a directive that permits stale reuse. - Agents that fetch static artifacts directly should compare response bytes to the manifest SHA-256 when they need snapshot identity checks.