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

Read-only access to Penwright's writing-craft book library, grounded guide metadata (card-level...

我该使用它吗

质量与安全性

A
描述质量
96%
模式完整度
98%
命名质量
98%
投毒风险
100%
权限匹配度
100%
协议合规性
100%

基于对工具定义和协议合规性的自动分析。

上下文开销

~3,240token 数(工具定义)
~3.5 KB典型响应大小
对注意力有显著影响(占 128k 上下文窗口的 2.53%)

这是每次将服务器的工具加载到模型上下文窗口时所消耗的大致 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
}

社区

评价此服务器

证据

最近观测

已验证未记录版本9 个工具
已验证未记录版本4 个工具
已验证未记录版本5 个工具