Penwright MCP
Provides read-only access to Penwright's public writing-craft book library, guide metadata, and magazine essays. It allows agents to search the library, retrieve specific library works, access guide metadata, and fetch magazine pieces without authentication.
Endpoint and access
No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.
https://penwright.ink/api/mcpWhat its tools do
9 tools, grouped by the hints the server advertises. Hints are self-declared, not verified behavior.
Checks and signals
Each line is separate evidence, not a trust score.
- Passed Endpoint answered the live check ·
- Passed Official MCP Registry namespace is tied to penwright.ink ·
- Passed Endpoint is on the registry namespace domain ·
- Availability 1 of 1 checks passed in 30 days
What you can do with it
- Search the writing-craft book library
- Retrieve metadata for specific library works
- Access card-level metadata for writing guides
- Fetch magazine essay content
Source and maintenance
Protocol and capabilities
- Server
- penwright-discovery 1.2.0
- MCP protocol negotiated in check
- 2025-11-25
- Tools
- 9 advertised
- Resources
- Not advertised
- Resource templates
- Not advertised
- Prompts
- Not advertised
{
"tools": {
"listChanged": true
}
}Server-provided instructions
Untrusted server output shown for inspection. It is not Koskamo guidance and is excluded from knowledge search.
Tools
9 advertised
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.
{
"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."
}
}
}{
"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
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}get_library_work — Get a writing-craft library work
Returns one writing-craft library work's bibliographic record and (when profiled) its thesis.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"libraryId"
],
"properties": {
"libraryId": {
"type": "string",
"description": "Library catalog id (e.g. libce6efaa49e6f0175)."
}
}
}{
"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
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": 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 (23): memoir-writing, nonfiction-writing, fiction-writing, getting-published, self-publishing, book-marketing, design-a-publication, typography-and-layout, ….
{
"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)."
}
}
}{
"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
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": 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.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"slug"
],
"properties": {
"slug": {
"type": "string",
"description": "Magazine piece slug."
}
}
}{
"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
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": 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, ….
{
"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)."
}
}
}{
"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
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}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.
{
"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."
}
}
}{
"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
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": 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.
{
"type": "object",
"$schema": "http://json-schema.org/draft-07/schema#",
"required": [
"id"
],
"properties": {
"id": {
"type": "string",
"description": "The Answer's stable id or slug."
}
}
}{
"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
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}list_answers — List Answers (contract v0)
List Answers (contract v0), paginated with an opaque cursor. Read-only.
{
"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."
}
}
}{
"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
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": 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.
{
"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."
}
}
}{
"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
}{
"readOnlyHint": true,
"openWorldHint": false,
"destructiveHint": false
}Prompts
Not advertised
Resources
Not advertised
90-day uptime
A lightweight connection check about every six hours, sampled on hosts with many listings. It shows the server answered, not that its tools work.
- 2026-11-07: 2 of 2 checks answered
30-day availability
Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.
- Successful checks
- 1 of 1 (100%)
- Average latency
- 469 ms
- 95th percentile latency
- 469 ms
Maintenance history
Public check and source-refresh events. Editorial and ownership records remain private.
- · probe · passed · 469 ms · metadata changed · 9 tool(s)
Connect from your client
Each snippet registers the same endpoint; pick the client you use.
Claude Code
claude mcp add --transport http penwright-mcp https://penwright.ink/api/mcpCodex
codex mcp add penwright-mcp --url https://penwright.ink/api/mcpCursor
{
"mcpServers": {
"penwright-mcp": {
"url": "https://penwright.ink/api/mcp"
}
}
}Cline
{
"mcpServers": {
"penwright-mcp": {
"type": "streamableHttp",
"url": "https://penwright.ink/api/mcp",
"disabled": false
}
}
}VS Code
{
"servers": {
"penwright-mcp": {
"type": "http",
"url": "https://penwright.ink/api/mcp"
}
}
}Gemini CLI
gemini mcp add --transport http penwright-mcp https://penwright.ink/api/mcpClaude Desktop
https://penwright.ink/api/mcpWindsurf
{
"mcpServers": {
"penwright-mcp": {
"serverUrl": "https://penwright.ink/api/mcp"
}
}
}Let your agent find its tools
Find servers like Penwright MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.
Other documentation and reference servers
Do you run Penwright MCP?
Prove ownership with a DNS record, a well-known file, or your Official MCP Registry entry, and your edits publish immediately. Proofs are re-checked weekly; admins can still hide or remove a listing.