Serveur MCP

Penwright — writing-craft library, guide metadata, and magazine

ink.penwright/discovery
Connaissance et documentation Médias et contenu Public et accessible MCP 2025-11-25

Ce que fait ce MCP

Provides searchable writing-craft book records, guide metadata, and published multi-voice magazine pieces.

choose_camp
Choose your camp on a guide's debates
Given a guide slug and one pick per debate ('A', 'B', or skip, in debate order, as a single string e.g. 'ABAB'), returns which library ids argue the picked side of each debate and the union reading list. Pure compute over public debate data — no book text is generated.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['guide'], 'properties': {'guide': {'type': 'string', 'description': 'Guide slug (e.g. memoir-writing, nonfiction-writing, fiction-writing, getting-published).'}, 'picks': {'type': 'string', 'description': 'One char per debate in order: A, B, or any other char (or omit) for skip.'}}}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['contract', 'guideSlug', 'guideTitle', 'picks', 'libraryIds', 'canonicalUrl', 'guideCanonicalUrl'], 'properties': {'picks': {'type': 'array', 'items': {'type': 'object', 'required': ['debateSlug', 'name', 'pick', 'libraryIds', 'canonicalUrl'], 'properties': {'name': {'type': 'string'}, 'pick': {'enum': ['A', 'B', 'skip'], 'type': 'string'}, 'debateSlug': {'type': 'string'}, 'libraryIds': {'type': 'array', 'items': {'type': 'string'}}, 'canonicalUrl': {'type': 'string'}}, 'additionalProperties': False}}, 'contract': {'type': 'string'}, 'guideSlug': {'type': 'string'}, 'guideTitle': {'type': 'string'}, 'libraryIds': {'type': 'array', 'items': {'type': 'string'}}, 'canonicalUrl': {'type': 'string'}, 'guideCanonicalUrl': {'type': 'string'}}, 'additionalProperties': False}
get_answer
Get one Answer (contract v0)
Get one Answer — question, grounded answer, visible citations — by id or slug, in the Answer contract v0 shape (ANSWERS-PROGRAM.md). Read-only. Returns null if not found.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id'], 'properties': {'id': {'type': 'string', 'description': "The Answer's stable id or slug."}}}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['id', 'slug', 'question', 'shortAnswer', 'answer', 'home', 'canonicalUrl', 'citations', 'status', 'access', 'version', 'contentHash', 'generatedBy', 'updatedAt'], 'properties': {'id': {'type': 'string'}, 'home': {'type': 'string'}, 'slug': {'type': 'string'}, 'access': {'type': 'string', 'const': 'free'}, 'answer': {'type': 'string'}, 'status': {'type': 'string'}, 'version': {'type': 'number'}, 'question': {'type': 'string'}, 'citations': {'type': 'array', 'items': {'type': 'object', 'required': ['libraryId', 'title'], 'properties': {'claim': {'type': 'string'}, 'title': {'type': 'string'}, 'author': {'type': 'string'}, 'locator': {'type': 'string'}, 'libraryId': {'type': 'string'}}, 'additionalProperties': False}}, 'updatedAt': {'type': 'string'}, 'contentHash': {'type': 'string'}, 'generatedBy': {'type': 'object', 'required': ['authored'], 'properties': {'authored': {'type': 'boolean', 'const': True}}, 'additionalProperties': False}, 'shortAnswer': {'type': 'string'}, 'canonicalUrl': {'type': 'string'}, 'relatedGuides': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'url'], 'properties': {'url': {'type': 'string'}, 'slug': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}
get_debate
Get a debate: where the writing-craft books split
Returns one debate — a named tension between poles argued by different books on the same capability guide, with stakes, guidance, and the library ids of resolvable authors on either side. Known slugs (38): memoir-sentence-craft-or-structural-architecture-first, memoir-daily-discipline-or-trusting-inspiration, memoir-memoir-for-healing-or-for-readers, memoir-factual-accuracy-or-emotional-truth, memoir-chase-publication-or-intrinsic-reward, ….
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'Debate slug (e.g. memoir-factual-accuracy-or-emotional-truth).'}}}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['contract', 'slug', 'guideSlug', 'guideTitle', 'topic', 'name', 'poles', 'stakes', 'guidance', 'libraryIds', 'canonicalUrl', 'guideCanonicalUrl'], 'properties': {'name': {'type': 'string'}, 'slug': {'type': 'string'}, 'poles': {'type': 'array', 'items': [{'type': 'string'}, {'type': 'string'}], 'maxItems': 2, 'minItems': 2, 'additionalItems': False}, 'topic': {'type': 'string'}, 'stakes': {'type': ['string', 'null']}, 'contract': {'type': 'string'}, 'guidance': {'type': 'string'}, 'guideSlug': {'type': 'string'}, 'guideTitle': {'type': 'string'}, 'libraryIds': {'type': 'array', 'items': {'type': 'string'}}, 'canonicalUrl': {'type': 'string'}, 'guideCanonicalUrl': {'type': 'string'}}, 'additionalProperties': False}
get_guide
Get a grounded writing-craft guide's metadata
Returns one live guide's title, subtitle, access, book count, and reading time — card-level metadata only, never the paid body/depth content. Known slugs (21): memoir-writing, nonfiction-writing, fiction-writing, getting-published, self-publishing, book-marketing, design-a-publication, typography-and-layout, ….
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'Guide slug (e.g. memoir-writing, fiction-writing, getting-published, self-publishing).'}}}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['contract', 'slug', 'title', 'subtitle', 'guideType', 'access', 'books', 'readingTimeMin', 'updated', 'live', 'canonicalUrl'], 'properties': {'live': {'type': 'boolean'}, 'slug': {'type': 'string'}, 'books': {'type': ['number', 'null']}, 'title': {'type': 'string'}, 'access': {'type': 'string'}, 'updated': {'type': ['string', 'null']}, 'contract': {'type': 'string'}, 'subtitle': {'type': 'string'}, 'guideType': {'type': ['string', 'null']}, 'canonicalUrl': {'type': 'string'}, 'readingTimeMin': {'type': ['number', 'null']}}, 'additionalProperties': False}
get_library_work
Get a writing-craft library work
Returns one writing-craft library work's bibliographic record and (when profiled) its thesis.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['libraryId'], 'properties': {'libraryId': {'type': 'string', 'description': 'Library catalog id (e.g. libce6efaa49e6f0175).'}}}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['contract', 'libraryId', 'title', 'author', 'year', 'tags', 'logline', 'pitch', 'canonicalUrl'], 'properties': {'tags': {'type': 'array', 'items': {'type': 'string'}}, 'year': {'type': ['number', 'null']}, 'pitch': {'type': ['string', 'null']}, 'title': {'type': 'string'}, 'author': {'type': ['string', 'null']}, 'logline': {'type': ['string', 'null']}, 'contract': {'type': 'string'}, 'libraryId': {'type': 'string'}, 'canonicalUrl': {'type': 'string'}}, 'additionalProperties': False}
get_magazine_piece
Get a multi-voice Writers'-Desk magazine piece
Returns one published magazine piece's question, per-writer sections, and editor's coda — the same content the human page renders, ungated. Known slugs (1): the-whole-room--my-memoir-keeps-stalling-i-can-write-scenes.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['slug'], 'properties': {'slug': {'type': 'string', 'description': 'Magazine piece slug.'}}}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['contract', 'slug', 'title', 'format', 'question', 'generated', 'sections', 'editor', 'editorCoda', 'canonicalUrl'], 'properties': {'slug': {'type': 'string'}, 'title': {'type': 'string'}, 'editor': {'type': 'object', 'required': ['displayName', 'role'], 'properties': {'role': {'type': 'string'}, 'displayName': {'type': 'string'}}, 'additionalProperties': False}, 'format': {'type': 'string'}, 'contract': {'type': 'string'}, 'question': {'type': 'string'}, 'sections': {'type': 'array', 'items': {'type': 'object', 'required': ['writer', 'displayName', 'byline', 'body'], 'properties': {'body': {'type': 'string'}, 'byline': {'type': 'string'}, 'writer': {'type': 'string'}, 'displayName': {'type': 'string'}}, 'additionalProperties': False}}, 'generated': {'type': 'string'}, 'editorCoda': {'type': 'string'}, 'canonicalUrl': {'type': 'string'}}, 'additionalProperties': False}
list_answers
List Answers (contract v0)
List Answers (contract v0), paginated with an opaque cursor. Read-only.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'limit': {'type': 'integer', 'maximum': 200, 'description': 'Max answers to return (default 25, capped 200).', 'exclusiveMinimum': 0}, 'cursor': {'type': 'string', 'description': "Opaque pagination cursor from a previous list_answers call's nextCursor."}}}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['contract', 'count', 'nextCursor', 'items'], 'properties': {'count': {'type': 'number'}, 'items': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'slug', 'question', 'shortAnswer', 'answer', 'home', 'canonicalUrl', 'citations', 'status', 'access', 'version', 'contentHash', 'generatedBy', 'updatedAt'], 'properties': {'id': {'type': 'string'}, 'home': {'type': 'string'}, 'slug': {'type': 'string'}, 'access': {'type': 'string', 'const': 'free'}, 'answer': {'type': 'string'}, 'status': {'type': 'string'}, 'version': {'type': 'number'}, 'question': {'type': 'string'}, 'citations': {'type': 'array', 'items': {'type': 'object', 'required': ['libraryId', 'title'], 'properties': {'claim': {'type': 'string'}, 'title': {'type': 'string'}, 'author': {'type': 'string'}, 'locator': {'type': 'string'}, 'libraryId': {'type': 'string'}}, 'additionalProperties': False}}, 'updatedAt': {'type': 'string'}, 'contentHash': {'type': 'string'}, 'generatedBy': {'type': 'object', 'required': ['authored'], 'properties': {'authored': {'type': 'boolean', 'const': True}}, 'additionalProperties': False}, 'shortAnswer': {'type': 'string'}, 'canonicalUrl': {'type': 'string'}, 'relatedGuides': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'url'], 'properties': {'url': {'type': 'string'}, 'slug': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}}, 'contract': {'type': 'string'}, 'nextCursor': {'type': ['string', 'null']}}, 'additionalProperties': False}
search_answers
Search Answers (contract v0) by free text
Search Answers by free-text query over question/answer text. Returns contract v0 records. Read-only.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['query'], 'properties': {'limit': {'type': 'integer', 'maximum': 200, 'description': 'Max results to return (default 25, capped 200).', 'exclusiveMinimum': 0}, 'query': {'type': 'string', 'minLength': 1, 'description': 'Free-text query matched against question/answer text.'}}}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['contract', 'query', 'count', 'results'], 'properties': {'count': {'type': 'number'}, 'query': {'type': 'string'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['id', 'slug', 'question', 'shortAnswer', 'answer', 'home', 'canonicalUrl', 'citations', 'status', 'access', 'version', 'contentHash', 'generatedBy', 'updatedAt'], 'properties': {'id': {'type': 'string'}, 'home': {'type': 'string'}, 'slug': {'type': 'string'}, 'access': {'type': 'string', 'const': 'free'}, 'answer': {'type': 'string'}, 'status': {'type': 'string'}, 'version': {'type': 'number'}, 'question': {'type': 'string'}, 'citations': {'type': 'array', 'items': {'type': 'object', 'required': ['libraryId', 'title'], 'properties': {'claim': {'type': 'string'}, 'title': {'type': 'string'}, 'author': {'type': 'string'}, 'locator': {'type': 'string'}, 'libraryId': {'type': 'string'}}, 'additionalProperties': False}}, 'updatedAt': {'type': 'string'}, 'contentHash': {'type': 'string'}, 'generatedBy': {'type': 'object', 'required': ['authored'], 'properties': {'authored': {'type': 'boolean', 'const': True}}, 'additionalProperties': False}, 'shortAnswer': {'type': 'string'}, 'canonicalUrl': {'type': 'string'}, 'relatedGuides': {'type': 'array', 'items': {'type': 'object', 'required': ['slug', 'url'], 'properties': {'url': {'type': 'string'}, 'slug': {'type': 'string'}}, 'additionalProperties': False}}}, 'additionalProperties': False}}, 'contract': {'type': 'string'}}, 'additionalProperties': False}
search_library
Search the writing-craft library catalog
Search or list Penwright's writing-craft book library by title/author substring and/or property tag. No filters returns the first page.
Lecture seule
Schéma d’entrée
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'properties': {'tag': {'type': 'string', 'description': 'Case-insensitive property-tag substring.'}, 'limit': {'type': 'integer', 'maximum': 100, 'minimum': 1, 'description': 'Max rows to return (default 25, max 100).'}, 'query': {'type': 'string', 'description': 'Case-insensitive title/author substring.'}}}
Schéma de sortie
{'type': 'object', '$schema': 'http://json-schema.org/draft-07/schema#', 'required': ['contract', 'query', 'tag', 'total', 'count', 'results'], 'properties': {'tag': {'type': ['string', 'null']}, 'count': {'type': 'number'}, 'query': {'type': ['string', 'null']}, 'total': {'type': 'number'}, 'results': {'type': 'array', 'items': {'type': 'object', 'required': ['libraryId', 'title', 'author', 'year', 'tags', 'canonicalUrl'], 'properties': {'tags': {'type': 'array', 'items': {'type': 'string'}}, 'year': {'type': ['number', 'null']}, 'title': {'type': 'string'}, 'author': {'type': ['string', 'null']}, 'libraryId': {'type': 'string'}, 'canonicalUrl': {'type': 'string'}}, 'additionalProperties': False}}, 'contract': {'type': 'string'}}, 'additionalProperties': False}
Ajouté
search_answers
1 October 2026 02:44
Ajouté
list_answers
1 October 2026 02:44
Ajouté
get_answer
1 October 2026 02:44
Ajouté
choose_camp
1 October 2026 02:44
Ajouté
get_debate
1 October 2026 02:44
Supprimé
get_membership_offer
27 September 2026 02:43
Ajouté
get_membership_offer
17 September 2026 12:39
Ajouté
get_magazine_piece
17 September 2026 12:39
Ajouté
get_guide
17 September 2026 12:39
Ajouté
get_library_work
17 September 2026 12:39
Ajouté
search_library
17 September 2026 12:39