Penwright — writing-craft library, guide metadata, and magazine
Read-only access to Penwright's writing-craft book library, grounded guide metadata (card-level...
我该使用它吗
质量与安全性
基于对工具定义和协议合规性的自动分析。
上下文开销
这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 token 数。数值越高,可用于其他任务的注意力就越少。
安装
一键安装
将以下内容添加到你的 `claude_desktop_config.json` 文件中:
{
"mcpServers": {
"discovery": {
"url": "https://penwright.ink/api/mcp"
}
}
}远程端点
https://penwright.ink/api/mcpstreamable-http它能做什么
工具清单
工具(9)
🟢search_library(query, tag, limit)
Search or list Penwright's writing-craft book library by title/author substring and/or property tag. No filters returns the first page.
输入模式
{
"type": "object",
"properties": {
"query": {
"description": "Case-insensitive title/author substring.",
"type": "string"
},
"tag": {
"description": "Case-insensitive property-tag substring.",
"type": "string"
},
"limit": {
"description": "Max rows to return (default 25, max 100).",
"type": "integer",
"minimum": 1,
"maximum": 100
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"query": {
"type": [
"string",
"null"
]
},
"tag": {
"type": [
"string",
"null"
]
},
"total": {
"type": "number"
},
"count": {
"type": "number"
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"libraryId": {
"type": "string"
},
"title": {
"type": "string"
},
"author": {
"type": [
"string",
"null"
]
},
"year": {
"type": [
"number",
"null"
]
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"canonicalUrl": {
"type": "string"
}
},
"required": [
"libraryId",
"title",
"author",
"year",
"tags",
"canonicalUrl"
],
"additionalProperties": false
}
}
},
"required": [
"contract",
"query",
"tag",
"total",
"count",
"results"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get_library_work(libraryId)
Returns one writing-craft library work's bibliographic record and (when profiled) its thesis.
输入模式
{
"type": "object",
"properties": {
"libraryId": {
"type": "string",
"description": "Library catalog id (e.g. libce6efaa49e6f0175)."
}
},
"required": [
"libraryId"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"libraryId": {
"type": "string"
},
"title": {
"type": "string"
},
"author": {
"type": [
"string",
"null"
]
},
"year": {
"type": [
"number",
"null"
]
},
"tags": {
"type": "array",
"items": {
"type": "string"
}
},
"logline": {
"type": [
"string",
"null"
]
},
"pitch": {
"type": [
"string",
"null"
]
},
"canonicalUrl": {
"type": "string"
}
},
"required": [
"contract",
"libraryId",
"title",
"author",
"year",
"tags",
"logline",
"pitch",
"canonicalUrl"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get_guide(slug)
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, ….
输入模式
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Guide slug (e.g. memoir-writing, fiction-writing, getting-published, self-publishing)."
}
},
"required": [
"slug"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"slug": {
"type": "string"
},
"title": {
"type": "string"
},
"subtitle": {
"type": "string"
},
"guideType": {
"type": [
"string",
"null"
]
},
"access": {
"type": "string"
},
"books": {
"type": [
"number",
"null"
]
},
"readingTimeMin": {
"type": [
"number",
"null"
]
},
"updated": {
"type": [
"string",
"null"
]
},
"live": {
"type": "boolean"
},
"canonicalUrl": {
"type": "string"
}
},
"required": [
"contract",
"slug",
"title",
"subtitle",
"guideType",
"access",
"books",
"readingTimeMin",
"updated",
"live",
"canonicalUrl"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get_magazine_piece(slug)
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.
输入模式
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Magazine piece slug."
}
},
"required": [
"slug"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"slug": {
"type": "string"
},
"title": {
"type": "string"
},
"format": {
"type": "string"
},
"question": {
"type": "string"
},
"generated": {
"type": "string"
},
"sections": {
"type": "array",
"items": {
"type": "object",
"properties": {
"writer": {
"type": "string"
},
"displayName": {
"type": "string"
},
"byline": {
"type": "string"
},
"body": {
"type": "string"
}
},
"required": [
"writer",
"displayName",
"byline",
"body"
],
"additionalProperties": false
}
},
"editor": {
"type": "object",
"properties": {
"displayName": {
"type": "string"
},
"role": {
"type": "string"
}
},
"required": [
"displayName",
"role"
],
"additionalProperties": false
},
"editorCoda": {
"type": "string"
},
"canonicalUrl": {
"type": "string"
}
},
"required": [
"contract",
"slug",
"title",
"format",
"question",
"generated",
"sections",
"editor",
"editorCoda",
"canonicalUrl"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get_debate(slug)
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, ….
输入模式
{
"type": "object",
"properties": {
"slug": {
"type": "string",
"description": "Debate slug (e.g. memoir-factual-accuracy-or-emotional-truth)."
}
},
"required": [
"slug"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"slug": {
"type": "string"
},
"guideSlug": {
"type": "string"
},
"guideTitle": {
"type": "string"
},
"topic": {
"type": "string"
},
"name": {
"type": "string"
},
"poles": {
"type": "array",
"items": [
{
"type": "string"
},
{
"type": "string"
}
],
"additionalItems": false,
"minItems": 2,
"maxItems": 2
},
"stakes": {
"type": [
"string",
"null"
]
},
"guidance": {
"type": "string"
},
"libraryIds": {
"type": "array",
"items": {
"type": "string"
}
},
"canonicalUrl": {
"type": "string"
},
"guideCanonicalUrl": {
"type": "string"
}
},
"required": [
"contract",
"slug",
"guideSlug",
"guideTitle",
"topic",
"name",
"poles",
"stakes",
"guidance",
"libraryIds",
"canonicalUrl",
"guideCanonicalUrl"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢choose_camp(guide, picks)
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.
输入模式
{
"type": "object",
"properties": {
"guide": {
"type": "string",
"description": "Guide slug (e.g. memoir-writing, nonfiction-writing, fiction-writing, getting-published)."
},
"picks": {
"description": "One char per debate in order: A, B, or any other char (or omit) for skip.",
"type": "string"
}
},
"required": [
"guide"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"guideSlug": {
"type": "string"
},
"guideTitle": {
"type": "string"
},
"picks": {
"type": "array",
"items": {
"type": "object",
"properties": {
"debateSlug": {
"type": "string"
},
"name": {
"type": "string"
},
"pick": {
"type": "string",
"enum": [
"A",
"B",
"skip"
]
},
"libraryIds": {
"type": "array",
"items": {
"type": "string"
}
},
"canonicalUrl": {
"type": "string"
}
},
"required": [
"debateSlug",
"name",
"pick",
"libraryIds",
"canonicalUrl"
],
"additionalProperties": false
}
},
"libraryIds": {
"type": "array",
"items": {
"type": "string"
}
},
"canonicalUrl": {
"type": "string"
},
"guideCanonicalUrl": {
"type": "string"
}
},
"required": [
"contract",
"guideSlug",
"guideTitle",
"picks",
"libraryIds",
"canonicalUrl",
"guideCanonicalUrl"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢get_answer(id)
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.
输入模式
{
"type": "object",
"properties": {
"id": {
"type": "string",
"description": "The Answer's stable id or slug."
}
},
"required": [
"id"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"id": {
"type": "string"
},
"slug": {
"type": "string"
},
"question": {
"type": "string"
},
"shortAnswer": {
"type": "string"
},
"answer": {
"type": "string"
},
"home": {
"type": "string"
},
"canonicalUrl": {
"type": "string"
},
"relatedGuides": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"slug",
"url"
],
"additionalProperties": false
}
},
"citations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"libraryId": {
"type": "string"
},
"title": {
"type": "string"
},
"author": {
"type": "string"
},
"locator": {
"type": "string"
},
"claim": {
"type": "string"
}
},
"required": [
"libraryId",
"title"
],
"additionalProperties": false
}
},
"status": {
"type": "string"
},
"access": {
"type": "string",
"const": "free"
},
"version": {
"type": "number"
},
"contentHash": {
"type": "string"
},
"generatedBy": {
"type": "object",
"properties": {
"authored": {
"type": "boolean",
"const": true
}
},
"required": [
"authored"
],
"additionalProperties": false
},
"updatedAt": {
"type": "string"
}
},
"required": [
"id",
"slug",
"question",
"shortAnswer",
"answer",
"home",
"canonicalUrl",
"citations",
"status",
"access",
"version",
"contentHash",
"generatedBy",
"updatedAt"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢list_answers(limit, cursor)
List Answers (contract v0), paginated with an opaque cursor. Read-only.
输入模式
{
"type": "object",
"properties": {
"limit": {
"description": "Max answers to return (default 25, capped 200).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 200
},
"cursor": {
"description": "Opaque pagination cursor from a previous list_answers call's nextCursor.",
"type": "string"
}
},
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"count": {
"type": "number"
},
"nextCursor": {
"type": [
"string",
"null"
]
},
"items": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"slug": {
"type": "string"
},
"question": {
"type": "string"
},
"shortAnswer": {
"type": "string"
},
"answer": {
"type": "string"
},
"home": {
"type": "string"
},
"canonicalUrl": {
"type": "string"
},
"relatedGuides": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"slug",
"url"
],
"additionalProperties": false
}
},
"citations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"libraryId": {
"type": "string"
},
"title": {
"type": "string"
},
"author": {
"type": "string"
},
"locator": {
"type": "string"
},
"claim": {
"type": "string"
}
},
"required": [
"libraryId",
"title"
],
"additionalProperties": false
}
},
"status": {
"type": "string"
},
"access": {
"type": "string",
"const": "free"
},
"version": {
"type": "number"
},
"contentHash": {
"type": "string"
},
"generatedBy": {
"type": "object",
"properties": {
"authored": {
"type": "boolean",
"const": true
}
},
"required": [
"authored"
],
"additionalProperties": false
},
"updatedAt": {
"type": "string"
}
},
"required": [
"id",
"slug",
"question",
"shortAnswer",
"answer",
"home",
"canonicalUrl",
"citations",
"status",
"access",
"version",
"contentHash",
"generatedBy",
"updatedAt"
],
"additionalProperties": false
}
}
},
"required": [
"contract",
"count",
"nextCursor",
"items"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}🟢search_answers(query, limit)
Search Answers by free-text query over question/answer text. Returns contract v0 records. Read-only.
输入模式
{
"type": "object",
"properties": {
"query": {
"type": "string",
"minLength": 1,
"description": "Free-text query matched against question/answer text."
},
"limit": {
"description": "Max results to return (default 25, capped 200).",
"type": "integer",
"exclusiveMinimum": 0,
"maximum": 200
}
},
"required": [
"query"
],
"$schema": "http://json-schema.org/draft-07/schema#"
}输出模式
{
"type": "object",
"properties": {
"contract": {
"type": "string"
},
"query": {
"type": "string"
},
"count": {
"type": "number"
},
"results": {
"type": "array",
"items": {
"type": "object",
"properties": {
"id": {
"type": "string"
},
"slug": {
"type": "string"
},
"question": {
"type": "string"
},
"shortAnswer": {
"type": "string"
},
"answer": {
"type": "string"
},
"home": {
"type": "string"
},
"canonicalUrl": {
"type": "string"
},
"relatedGuides": {
"type": "array",
"items": {
"type": "object",
"properties": {
"slug": {
"type": "string"
},
"url": {
"type": "string"
}
},
"required": [
"slug",
"url"
],
"additionalProperties": false
}
},
"citations": {
"type": "array",
"items": {
"type": "object",
"properties": {
"libraryId": {
"type": "string"
},
"title": {
"type": "string"
},
"author": {
"type": "string"
},
"locator": {
"type": "string"
},
"claim": {
"type": "string"
}
},
"required": [
"libraryId",
"title"
],
"additionalProperties": false
}
},
"status": {
"type": "string"
},
"access": {
"type": "string",
"const": "free"
},
"version": {
"type": "number"
},
"contentHash": {
"type": "string"
},
"generatedBy": {
"type": "object",
"properties": {
"authored": {
"type": "boolean",
"const": true
}
},
"required": [
"authored"
],
"additionalProperties": false
},
"updatedAt": {
"type": "string"
}
},
"required": [
"id",
"slug",
"question",
"shortAnswer",
"answer",
"home",
"canonicalUrl",
"citations",
"status",
"access",
"version",
"contentHash",
"generatedBy",
"updatedAt"
],
"additionalProperties": false
}
}
},
"required": [
"contract",
"query",
"count",
"results"
],
"$schema": "http://json-schema.org/draft-07/schema#",
"additionalProperties": false
}社区
证据