server.json
1 field changed
- version
-
0.4.00.5.0
io.github.cyanheads/anime-mcp-server
7 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/anime-mcp-server/HEAD/AGENTS.md
− **Version:** 0.3.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.5− | `bun run lint:packaging` | Packaging surface checks — `server.json`/`manifest.json` env-var parity (run by devcheck) |− `npm 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.4.0+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.18`+ **MCP SDK:** `@modelcontextprotocol/server` ^2.4.0+ **Zod:** ^4.6.7+ Summary formatters escape provider/caller prose at each interpolation through framework Markdown helpers; URLs use explicit links or images, never recursive prose escaping. Multiline heading names remain within the heading. `anime_get_recommendations` selects `source: anilist` (default) or `jikan` and exposes `jikan_status` on both surfaces. Jikan deduplicates maximum votes, orders votes descending/MAL ID ascending, locally slices candidates, then resolves at most 25 non-adult MAL IDs in one Ani+ Root `skills/` is an optional, author-managed tree for agents that install this server. It ships through plugins and bundles; npm and Docker delivery require their packaging entries, and MCP delivery requires `createApp({ skills: 'skills' })`. Maintenance never creates or overwrites it; use `add-skill` to author and validate it.+ | `add-skill` | Author a skill the server publishes in root `skills/` for the agents that use it — structure, validation, delivery |+ | `bun run lint:packaging` | Packaging surface checks — env-var parity, `.mcpbignore` coverage, plugin manifests, and the published `skills/` tree (run by devcheck) |+ `npm 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. The pack step is followed by+ - [ ] `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/anime-mcp-server/HEAD/AGENTS.md
− **Version:** 0.2.1− **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.13`− **MCP SDK:** `@modelcontextprotocol/server` ^2.2.0− description: 'Top, trending, or seasonal rankings for anime or manga.',− const media = await anilist.getRankings(input.mode, input.media_type, input.page, input.per_page);− return { media };− import { notFound } from '@cyanheads/mcp-ts-core/errors';− description: 'Full media record for an anime or manga by AniList ID.',− const numericId = parseInt(params.id, 10);− if (isNaN(numericId) || numericId < 1) throw notFound(`Invalid AniList media ID: ${params.id}`);− return detail;− - [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = unscoped repo name; `interface.shortDescription` from `package.json` description− - [ ] `.codex-plugin/mcp.json` updated — server name key is the unscoped repo name; env vars added for any required API keys− - [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; inline `mcpServers` entry keyed by the unscoped repo name, env vars for any required API keys+ **Version:** 0.3.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+ - **Cut noise.** Add only what earns its place: no speculative generality, no guards for states the framework already prevents (Zod-validated params, classified errors), no abstraction until a third caller proves it, no option nothing sets.+ description: 'Top/trending rankings for anime or manga; seasonal rankings apply only to anime.',+ const page = await anilist.getRankings({ mode: input.mode, mediaType: input.media_type, page: input.page, perPage: input.per_page });+ return { media: page.media.map((media) => ({ id: media.id, title: media.title.romaji ?? 'Unknown', mean_score: media.meanScore ?? null })) };+ import { notFound, validationError } from '@cyanheads/mcp-ts-core/errors';+ description: 'Compact media context for an anime or manga by AniList ID.',+ const numericId = Number(params.id);+ if (!/^[0-9]+(?![\s\S])/.test(params.id) || numericId < 1 || numericId > 2147483647) {+ throw validationError('Use ASCII decimal digits representing an AniList ID from 1 to 2147483647.');+ }+ return { id: detail.id, title: detail.title, description: detail.description };+ `anime_get_media` and `anime_find_characters` expose `full_text` (default false): complete domain JSON in safely fenced text, with enrichment in its separate trailing block. Default summaries slice normalized descriptions to 500 source characters before escaping provider text and disclose exact omissions. Relation results use depth-bounded BFS paths and a relation-priority/year heuristic; `relation_to_root` describes only a direct root edge. MANGA rankings reject broadcast seasons. IDs are bound+ - [ ] `.codex-plugin/plugin.json` populated — `name`, `version`, `description`, `repository`, `license` from `package.json`; `interface.displayName` = the unscoped repo name (never the npm scope — `lint:packaging` enforces this); `interface.shortDescription` from `package.json` description+ - [ ] `.codex-plugin/mcp.json` updated — server name key is the unscoped repo name; every user-supplied variable (API key, contact email, instance URL) is listed in `env_vars` so Codex forwards it from the user's environment. Never write `"KEY": ""` into `env` — an empty value replaces the user's exported key and is read as unset+ - [ ] `.claude-plugin/plugin.json` populated — `name`, `version`, `description`, `author`, `repository`, `license`, `keywords` from `package.json`; inline `mcpServers` entry keyed by the unscoped repo name. Every user-supplied variable is declared under `userConfig` (`type`, `title`, `description`; `sensitive: true` for keys and tokens; `required: true` or `default: ""`) and referenced from `env` as `"KEY": "${user_config.<option>}"` — mirror the `user_config` block in `manifest.json`. Never wri
https://raw.githubusercontent.com/cyanheads/anime-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.6`− **MCP SDK:** `@modelcontextprotocol/server` ^2.0.0− - **Use `ctx.state`** for tenant-scoped storage. Never access persistence directly.− | `ctx.fail` | Typed error factory for declared error contracts — `ctx.fail('reason', message, { recovery })`. |− | `ctx.state` | Tenant-scoped KV — `.get(key)`, `.set(key, value, { ttl? })`, `.delete(key)`, `.getMany(keys)`, `.list(prefix, { cursor, limit })`. Accepts any serializable value. |− | `ctx.requestInput` | Suspend and ask the caller for more input — the handler is re-entered with the answers; read them via `ctx.inputs`. Always present. |− | `ctx.inputs` | Reader over a retried request's responses — `.accepted(key, schema)`, `.view(key)`, `.state()`, `.dropped`. Empty on the first round. |− | `ctx.enrich` | Success-path agent context (empty-result notices, query echo, pagination totals) — `.notice()` / `.total()` / `.echo()` / `.truncated()`. Reaches `structuredContent` and `content[]`; lands only when the definition declares an `enrichment` block (no-op otherwise). |− | `ctx.signal` | `AbortSignal` for cancellation (pass to fetch calls in service layer). |− | `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 descriptive metadata for the agent's next move (≥ 5 words, lint-validated) — the single source of truth. To put − if (!item) throw ctx.fail('no_match', `No item ${input.id}`, ctx.recoveryFor('no_match'));− throw new McpError(JsonRpcErrorCode.DatabaseError, 'Connection failed', { pool: 'primary' });− 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. Keep development skills out of root `skills/`, which plugin clients auto-load.− **Agent skill directory:** Copy `framework-skills/` into the directory your agent discovers (Claude Code: `.claude/skills/`, others: equivalent). After framework updates, run the `maintenance` skill — Phase B re-syncs the agent directory.− | `devcheck` | Lint, format, typecheck, audit |− | `git-wrapup` | Verify and commit the work stack, then bump the version and open the release PR. |− | `release-pr-review` | Review an open gated release PR; fixes land as ordinary commits. |− | `release-and-publish` | Fast-forward merge + tag + push + npm + MCP Registry + GH Release + Docker. |− | `api-mirror` | MirrorService: persistent self-refreshing local mirror (embedded SQLite + FTS5) of a bulk upstream dataset — Tier 3 opt-in |− | `techniques` | Catalog of response/data-shaping techniques — overflow handling, payload shaping, retrieval patterns |− | `npm run build` | Compile TypeScript |− | `npm run rebuild` | Clean + build |− | `npm run clean` | Remove build artifacts |− | `npm run devcheck` | Lint + format + typecheck + security + changelog sync |− | `bun run audit:fix` | Upgrade vulnerable packages within existing ranges; try first, then targeted `bun update` and `bun dedupe`. |− | `bun run audit:refresh` | Last resort: delete `bun.lock`, reinstall, and audit; every ranged dependency re-resolves. |− | `npm run tree` | Generate directory structure doc |− | `npm run format` | Auto-fix formatting (safe fixes only) |− | `npm run format:unsafe` | Also apply Biome's unsafe autofixes — review the diff; they can change behavior |− | `npm test` | Run tests (Vitest — use `npm run test`, not `bun test`) |− | `npm run start:stdio` | Production mode (stdio) |− | `npm run start:http` | Production mode (HTTP) |− | `npm run changelog:build` | Regenerate `CHANGELOG.md` from `changelog/*.md` |− | `npm run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |− | `npm run bundle` | Build and pack as `.mcpb` for one-click Claude Desktop install |− Only `.github/workflows/codeql.yml` runs on GitHub. Development and release gates run locally; CodeQL default setup stays off so the file can run.− `npm 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 − **Adding an env var requires both files:** `server.json` (registry discovery, `environmentVariables[]`) and `manifest.json` (bundle install UX, `mcp_config.env` + `user_config`). `lint:packaging` (run by `devcheck`) verifies the env var names match.+ **Version:** 0.2.1+ **Framework:** [@cyanheads/mcp-ts-core](https://www.npmjs.com/package/@cyanheads/mcp-ts-core) `^0.13.13`+ **MCP SDK:** `@modelcontextprotocol/server` ^2.2.0+ - **Use `ctx.state`** for tenant-scoped storage. Values round-trip as JSON on every provider: Dates read as ISO strings and returned objects never share identity. Never access persistence directly.+ | `ctx.state` | Tenant-scoped KV — `.get(key)`, `.set(key, value, { ttl? })`, `.delete(key)`, `.getMany(keys)`, `.list(prefix, { cursor, limit })`. Accepts any JSON-serializable value; reads return its JSON form (a `Date` comes back as an ISO string). |+ | `ctx.requestInput` | Suspend and ask the caller for more input — `return ctx.requestInput({ inputRequests: { key: inputRequired.elicit({ message, requestedSchema }) } })`. Never returns; the handler is re-entered with the answers. Always present. |+ | `ctx.inputs` | The request's responses — `.accepted(key, schema)`, `.view(key)`, `.state()`, `.dropped` — limited to what the client declared (`elicitation` and its form/url modes, `sampling`, `roots`). Client-supplied: a consent gate trusts only a `ctx.state` record it stored when it asked, bound to the operation, caller, and target (see the `api-context` skill). |+ | `ctx.clientCapabilities` | What the client declared for this request, `undefined` when no view exists. Decides whether to ask for optional context (e.g. roots); never a reason to skip a consent prompt. |+ | `ctx.enrich` | Success-path agent context (empty-result notices, query echo, pagination totals) — `ctx.enrich(...)` or `.notice()` / `.total()` / `.echo()` / `.truncated()`. Reaches `structuredContent` and `content[]`; lands only when the definition declares an `enrichment` block (no-op otherwise). |+ | `ctx.signal` | `AbortSignal` for cancellation. |+ | `ctx.requestId` | Request ID — the one every log record of the call carries and its error envelope returns as `data.requestId`. |+ **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. The framework puts it on the+ if (!item) throw ctx.fail('no_match', `No item ${input.id}`);+ throw new McpError(JsonRpcErrorCode.InitializationFailed, 'Connection failed', { pool: 'primary' });+ 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.+ | `git-wrapup` | Land working-tree changes as a commit stack — version bump, changelog, verify, commit by concern, release commit on top. No tag, no push to main; opens the release PR when the project declares release PR mode |+ | `release-pr-review` | Review pass on an open release PR — simplifier + correctness review, fixes as ordinary commits on top of the stack, PR body kept in sync. Release PR mode only |+ | `release-and-publish` | Fast-forward merge (release PR mode) + tag + push + npm + MCP Registry + GH Release + Docker. Picks up from `git-wrapup` |+ | `techniques` | Catalog of response/data-shaping techniques — overflow handling, payload shaping, retrieval patterns |+ | `api-mirror` | MirrorService: persistent self-refreshing local mirror (embedded SQLite + FTS5) of a bulk upstream dataset — Tier 3 opt-in |+ | `bun run build` | Compile TypeScript |+ | `bun run rebuild` | Clean + build |+ | `bun run clean` | Remove build artifacts |+ | `bun run devcheck` | Lint + format + typecheck + security + changelog sync |+ | `bun run audit:fix` | `bun audit fix` — upgrade vulnerable packages to the lowest safe version within existing ranges (`--dry-run` previews, `--latest` rewrites ranges). First response when `devcheck` flags a transitive advisory; then `bun update <name>`, then `bun dedupe` |+ | `bun run audit:refresh` | Delete `bun.lock` and reinstall. Last resort after `audit:fix`, `bun update <name>`, and `bun dedupe` — re-resolves every ranged dep (the framework pin included) and rewrites the lockfile as `lockfileVersion: 2` |+ | `bun run lint:mcp` | Run the MCP definition linter standalone (rule catalog: `api-linter` skill) |+ | `bun run lint:packaging` | Packaging surface checks — `server.json`/`manifest.json` env-var parity (run by devcheck) |+ | `bun run list-skills` | Print the skill registry |+ | `bun run tree` | Generate directory structure doc |+ | `bun run format` | Auto-fix formatting (safe fixes only) |+ | `bun run format:unsafe` | Also apply Biome's unsafe autofixes — review the diff; they can change behavior |+ | `bun run test` | Run tests (Vitest — use `bun run test`, not `bun test`) |+ | `bun run start:stdio` | Production mode (stdio) |+ | `bun run start:http` | Production mode (HTTP) |+ | `bun run changelog:build` | Regenerate `CHANGELOG.md` from `changelog/*.md` |+ | `bun run changelog:check` | Verify `CHANGELOG.md` is in sync (used by devcheck) |+ | `bun run bundle` | Build, pack, and clean a `.mcpb` for one-click Claude Desktop install |+ **CI is one file.** `.github/workflows/codeql.yml` (scaffolded) is the only GitHub Actions workflow: CodeQL is GitHub-owned end to end, and the file runs only while the repo's CodeQL *default setup* is turned off. Verification — `devcheck`, tests, the release gates — runs locally; don't add a workflow that re-runs it.
Showing the first 40 of each.
We can't find the internet
Attempting to reconnect
Something went wrong!
Attempting to reconnect