server.json
2 fields changed
- env_vars
-
MCP_LOG_LEVELMCP_LOG_LEVEL, GUTENDEX_BASE_URL, GUTENBERG_TEXT_BASE_URL, GUTENBERG_MIRROR_PATH, GUTENBERG_MIRROR_REFRESH_CRON - version
-
0.3.20.3.3
io.github.cyanheads/gutenberg-mcp-server
10 changes recorded. MCP Harbor re-reads this listing from the official registry every six hours and asks the live server what it exposes, and keeps what changed between one look and the next.
https://raw.githubusercontent.com/cyanheads/gutenberg-mcp-server/HEAD/AGENTS.md
− **Version:** 0.2.0− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.15`− **MCP SDK:** `@modelcontextprotocol/server` ^2.3.1− languages: z.array(z.string().min(2).max(2)).optional().describe('ISO 639-1 language codes.'),− has_plain_text: z.boolean().describe('True if gutenberg_get_text will work for this book.'),− Discovery uses the ready RDF mirror with Unicode substring predicates before counts, ordering and paging; cold/unreadable mirrors fall back live. Every query word applies locally; live fallback rejects more than four words with `query_requires_mirror`. `ids: []` selects nothing without catalog I/O. Empty discovery succeeds with a notice and normalized typed criteria. MIME-prefix and tri-state copyright filters apply on both sources; browse continuation preserves them and repeats page 1 if its ca− gutenberg-search-books.tool.ts # Search catalog by title/author/topic/language− gutenberg-get-text.tool.ts # Retrieve plain text with offset/limit chunking− Skills are modular instructions in `framework-skills/` at the project root. Read them directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry. The directory is deliberately not `skills/`: Claude Code and Codex auto-load a plugin's root `skills/`, so a server that ships `.claude-plugin/` or `.codex-plugin/` would hand these development skills to every agent that installs it. Keep `skills/` free for skills meant f− **Agent skill directory:** Copy skills into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `framework-skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.− | `bun run lint:packaging` | Packaging surface checks — `server.json`/`manifest.json` env-var parity (run by devcheck) |− `bun run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. The pack step is followed by `scripts/clean-mcpb.ts`, which prunes dev dependencies (`mcpb clean`) and strips two classes of `node_modules/**` content that root-anchored `.mcpbignore` patterns cannot reach: dependency-shipped agent docs (`framework-skills/`, `skills/`, `.claude/`, `.agents/`, `SKILL.md`) and platform-specific native bindings, which would otherwise lock the bundle to the platform it was + **Version:** 0.3.2+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.18`+ **MCP SDK:** `@modelcontextprotocol/server` ^2.4.0+ languages: z.array(z.string().min(2).max(3)).optional().describe('Catalog language codes, exactly as results report them.'),+ has_plain_text: z.boolean().describe('True for Text records with a UTF-8 plain-text format; file existence is not guaranteed.'),+ Discovery uses the ready RDF mirror with case- and accent-insensitive substring predicates before counts, ordering and paging; cold/unreadable mirrors fall back live, where matching is upstream-defined. Every query word applies locally; live fallback rejects more than four words with `query_requires_mirror`. `ids: []` selects nothing without catalog I/O. Empty discovery succeeds with source-aware guidance naming only supplied filters and normalized typed criteria. Optional mirror language diagno+ gutenberg-search-books.tool.ts # Search catalog by title/author/topic/translator/language+ gutenberg-get-text.tool.ts # Retrieve plain text with offset/limit chunking or a find jump+ Two skill trees live at the project root, written for different readers:+ | Tree | For | Written by |+ |:-----|:----|:-----------|+ | `framework-skills/` | The agent developing this server — framework skills (`metadata.audience: external`) plus any development-time skills of the server's own | `init` and the `maintenance` sync (framework skills); you (your own) |+ | `skills/` | The agents that install the server and call its tools — tool chains, identifier sources, gates | You, deliberately, with the `add-skill` skill. Absent by default; usually none is needed |+ Development skills are modular instructions. Read them directly when a task matches — e.g., `framework-skills/add-tool/SKILL.md` when adding a tool. `bun run list-skills` prints the full registry. Their directory is deliberately not `skills/`: Claude Code and Codex auto-load a plugin's root `skills/`, so a server that ships `.claude-plugin/` or `.codex-plugin/` would hand them to every agent that installs it.+ A published skill in root `skills/` reaches plugin installs and the `.mcpb` bundle as-is, ships in the npm package and the Docker image, and reaches MCP clients when the server opts in with `createApp({ skills: 'skills' })`. `lint:packaging` validates the tree.+ **Agent skill directory:** Copy `framework-skills/` into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). Skills then load as context without referencing `framework-skills/` paths. After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.+ | `add-skill` | Author a skill the server publishes in root `skills/` for the agents that use it — when one earns its place, structure, validation, delivery |+ | `bun run lint:packaging` | Packaging surface checks — `server.json`/`manifest.json` env-var parity, `.mcpbignore` coverage, plugin manifests, the published `skills/` tree (run by devcheck) |+ `bun run bundle` produces a `.mcpb` extension bundle for one-click install in Claude Desktop. `mcpb pack` reads `.mcpbignore`, not `.gitignore`, so every root path the bundle must not ship — source, tests, docs, caches, logs, agent docs, plugin manifests, gitignored local files — needs a root-anchored line there (`/docs/`, never `docs/`, which also strips `node_modules/*/docs/`); `lint:packaging` names each missing or unanchored line. Root `skills/` ships on purpose, and so do the catalog-mirror+ - [ ] `plugin.json` + `mcp.json` (Agent Plugins 1.0.0 — read by Codex, Cursor, GitHub Copilot, VS Code, Kiro) populated — `plugin.json` `name` = the unscoped repo name (lowercase `a-z`, `0-9`, `-`, `.` only); `version`, `description`, `author`, `homepage`, `repository`, `license`, `keywords` from `package.json`; no other top-level field, `extensions` included. `mcp.json` holds one `"type": "stdio"` entry keyed by the unscoped name, `npx -y <full package name>`, and the same fixed `env` as `.code+ - [ ] Any new root dev path has a root-anchored line in `.mcpbignore`; `bun run bundle` and `lint:packaging` pass+ - [ ] If the server publishes a skill in root `skills/`: `lint:packaging` passes, and `field-test` verified every gate and identifier claim in it against live tool behavior
https://raw.githubusercontent.com/cyanheads/gutenberg-mcp-server/HEAD/AGENTS.md
− **Version:** 0.1.10− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.14`− **MCP SDK:** `@modelcontextprotocol/server` ^2.2.0− **Zod:** ^4.6.5− errors: [− { reason: 'no_results', code: JsonRpcErrorCode.NotFound,− when: 'No books matched the query.',− recovery: 'Broaden the search — try fewer words, remove language filters, or check the topic spelling.' },− ],− if (result.books.length === 0) throw ctx.fail('no_results', 'No books matched.');− **Every release goes through a release PR, straight-through** — `git-wrapup`'s "Release PR mode", mode `straight-through`. One run: `git-wrapup` lands the commit stack on `release/<version>`, pushes it, and opens the PR (title = the release commit subject, body = the release digest: theme line, `## Changes`, `## Gates`, changelog link last); `release-and-publish` then fast-forwards `main` locally with `git merge --ff-only`, creates the tag on `main`'s tip, pushes `main` and the tag, deletes the + **Version:** 0.2.0+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.15`+ **MCP SDK:** `@modelcontextprotocol/server` ^2.3.1+ **Zod:** ^4.6.7+ enrichment: {+ notice: z.string().optional().describe('Guidance for an empty search.'),+ },+ if (result.books.length === 0) ctx.enrich.notice('No books matched. Try fewer words or remove a filter.');+ Discovery uses the ready RDF mirror with Unicode substring predicates before counts, ordering and paging; cold/unreadable mirrors fall back live. Every query word applies locally; live fallback rejects more than four words with `query_requires_mirror`. `ids: []` selects nothing without catalog I/O. Empty discovery succeeds with a notice and normalized typed criteria. MIME-prefix and tri-state copyright filters apply on both sources; browse continuation preserves them and repeats page 1 if its ca+ **Every release goes through a gated release PR** — `git-wrapup`'s "Release PR mode", mode `gated`. Three separate runs, never one: `git-wrapup` lands the commit stack on `release/<version>`, pushes it, and opens the PR (title = the release commit subject, body = the release digest: theme line, `## Changes`, `## Gates`, changelog link last); `release-pr-review` reviews and fixes on that branch (each fix an ordinary commit on top of the stack, pushed plainly — nothing already pushed is ever rewri
https://raw.githubusercontent.com/cyanheads/gutenberg-mcp-server/HEAD/AGENTS.md
− **Version:** 0.1.9− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.6`− **MCP SDK:** `@modelcontextprotocol/server` ^2.0.0− ### Server instructions− `createApp({ instructions })` — optional server-level orientation, sent to clients on every `initialize` as session-level context. Use it for deployment guidance (connection aliases, regional notes, scope hints) instead of repeating the same context across tool descriptions. Client adoption is uneven, but there's no downside when set.− | `ctx.state` | Tenant-scoped KV — `.get(key)`, `.set(key, value, { ttl? })`, `.delete(key)`, `.getMany(keys)`, `.list(prefix, { cursor, limit })`. Accepts any serializable value. |− | `ctx.inputs` | Reader over a retried request's responses — `.accepted(key, schema)`, `.view(key)`, `.state()`, `.dropped`. Empty on the first round. |− | `ctx.requestId` | Unique request ID. |− **Recommended: typed error contract.** Declare `errors: [{ reason, code, when, recovery, retryable?, severity?, thrownBy? }]` on `tool()` / `resource()` to receive `ctx.fail(reason, …)` typed against the reason union. TypeScript catches typos at compile time, `data.reason` is auto-populated for observability, linter enforces conformance against the handler body. `recovery` is required (≥ 5 words, lint-validated) — the single source of truth for the agent's next move. Pass `ctx.recoveryFor('reaso− if (!item) throw ctx.fail('no_match', `No item ${input.id}`, ctx.recoveryFor('no_match'));− throw new McpError(JsonRpcErrorCode.DatabaseError, 'Connection failed', { pool: 'primary' });− **Every release goes through a release PR, straight-through** — `git-wrapup`'s "Release PR mode", mode `straight-through`. One run: `git-wrapup` lands the commit stack on `release/<version>`, pushes it, and opens the PR (title = the release commit subject, body = the changelog entry plus a gates section); `release-and-publish` then fast-forwards `main` locally with `git merge --ff-only`, creates the tag on `main`'s tip, pushes `main` and the tag, deletes the branch, and publishes. A caller's bri+ **Version:** 0.1.10+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.14`+ **MCP SDK:** `@modelcontextprotocol/server` ^2.2.0+ ### Resource+ ```ts+ import { resource, z } from '@cyanheads/mcp-ts-core';+ import { notFound } from '@cyanheads/mcp-ts-core/errors';+ export const itemData = resource('inventory://{itemId}', {+ description: 'Fetch an inventory item by ID.',+ params: z.object({ itemId: z.string().describe('Item identifier') }),+ auth: ['inventory:read'],+ async handler(params, ctx) {+ const item = await ctx.state.get(`item/${params.itemId}`);+ if (!item) throw notFound(`Item ${params.itemId} not found`, { itemId: params.itemId });+ return item;+ },+ });+ ```+ ### Prompt+ ```ts+ import { prompt, z } from '@cyanheads/mcp-ts-core';+ export const reviewCode = prompt('review_code', {+ description: 'Review code for issues and best practices.',+ args: z.object({+ code: z.string().describe('Code to review'),+ language: z.string().optional().describe('Programming language'),+ }),+ generate: (args) => [+ { role: 'user', content: { type: 'text', text: `Review this ${args.language ?? ''} code:\n${args.code}` } },+ ],+ });+ ```+ ### Server identity and instructions+ `createApp()` accepts optional identity fields forwarded to the SDK's `initialize` response and the server manifest (`/.well-known/mcp.json`):+ ```ts+ await createApp({+ name: 'my-mcp-server',+ title: 'My Server', // human-readable display name+ websiteUrl: 'https://github.com/owner/repo', // canonical homepage URL+ description: 'One-line description.', // wins over MCP_SERVER_DESCRIPTION
We can't find the internet
Attempting to reconnect
Something went wrong!
Attempting to reconnect