Getting it into your agent
One page per mod, every tool's command on it. A separate URL per tool would split the same page into five that compete with each other.
npx agentmods add skills/grinv/mal-mcp/releasenpx skills add Grinv/mal-mcp --skill releasegit clone --depth 1 https://github.com/Grinv/mal-mcpWhat it costs to keep this loaded
Counted locally with the o200k_base tokenizer, which is exact for GPT models; Claude uses its own tokenizer and its counts differ. Treat this as one consistent yardstick across the catalogue rather than a bill. Prices are per million input tokens.
| Model | Per session | Once invoked |
|---|---|---|
| Fable 5 | $0.00046 | $0.01713 |
| Opus 5 | $0.00023 | $0.00856 |
| Sonnet 5 | $0.00009 | $0.00343 |
| Haiku 4.5 | $0.00005 | $0.00171 |
Grade A, and why
release scanned grade A with 0 findings against 26 rules in 11 categories — prompt injection, anti-refusal, data exfiltration, privilege escalation, supply chain, agent snooping, system-prompt leakage, SSRF and excessive agency — measured 2d ago.
A static scan of the body, not an audit. Every finding is printed with the line that produced it so you can judge whether it matters here. A mod is markdown that instructs an agent; that is exactly why what it instructs is worth reading.
Nothing flagged
None of the 26 patterns this scan looks for appear in this file: no shell pipes, no recursive deletes, no credential paths, no hidden text, no instruction-override or anti-refusal phrasing, no agent-config snooping. That is not a guarantee, it is the absence of the things that are checkable.
How it starts
The opening of the file, as written. The whole thing — 109 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Releasing
package.json is the single source of truth for the version. The npm
version lifecycle hook runs scripts/sync-version.mjs, which propagates it to
src/version.ts, manifest.json, server.json (incl. the .mcpb release-asset
URL), and CHANGELOG.md — it renames ## [Unreleased] to ## [<version>] - <date> and reopens a fresh, empty ## [Unreleased] above it, rolling the
trailing compare-link block forward the same way; version.test.ts guards
that the derived files never drift, and unit-tests the CHANGELOG rename
directly (renderChangelogRelease). You do not need to rename the
heading yourself — don't hand-edit it back to [Unreleased] after running
npm version.
A preversion hook (scripts/preversion-check.mjs) runs first — it's a
presence-only safety net, not a substitute for actually running the skill
below as a real judgment step. It runs two checks, in order:
- Unpushed-tag race: if the current
package.jsonversion already has a local git tag, it blocks unless that tag is also onorigin— this is the exact race that once orphaned a version in a sibling repo (npm versionrun twice within minutes, the first tag/commit never pushed, silently buried under the second). Push the dangling tag (git push origin vX.Y.Z) or delete it if it was a mistake (git tag -d vX.Y.Z), then retry. - Empty changelog: it blocks
npm versionifCHANGELOG.md's[Unreleased]section is empty: run thechangelog-styleskill against the commits since the last tag first — it's what actually makes the entries short, self-describing, free of implementation detail, and linked to their commits; the hook only confirms something is there, not that it follows that style. (Or re-run withCONFIRM_EMPTY_CHANGELOG=1if this release genuinely has no user-facing changes, e.g. a pure dependency bump.)
When invoked as this skill, run these as explicit steps, not optional —
don't rely on the preversion hook alone to catch a skipped one:
- Invoke the
changelog-styleskill against the commits since the last tag; write/fix the[Unreleased]entries per its style rules (heading rename happens later, automatically — see above). - Run the
docs-consistency-checkskill. - Commit all of the above.
npm version <patch|minor|major>— preversion gate, then bumps + syncs every file (including the CHANGELOG rename) + commits"release: vX.Y.Z"- tags
vX.Y.Z.
- tags
git push --follow-tags— pushing the tag triggers.github/workflows/release.yml. Verify the tag actually reached the remote:git ls-remote --tags origin | grep vX.Y.Z.--follow-tagsonly pushes annotated tags (npm version's default) reachable from what's being pushed — if you ever re-tag by hand (e.g.git tag -f vX.Y.Z <commit>to fix something before pushing), that recreates it as a lightweight tag, which--follow-tagssilently skips; push it explicitly instead (git push origin vX.Y.Z) and re-verify withgit ls-remote. (Confirmed live 2026-07-29: agit tag -fwithout-aproduced exactly this silent no-op.)
The tag push (v*) runs the Release workflow: check:api gate → build → test
→ pack .mcpb → GitHub Release → npm publish (OIDC trusted publishing, with
provenance — no token) → publish to the official MCP Registry (mcp-publisher,
GitHub OIDC; the binary is pinned to an exact version + verified SHA-256 rather
than latest). The workflow's CHANGELOG-extraction step fails loudly (not silently)
if it can't find a ## [<version>] section, as a backstop if the heading rename
above is somehow bypassed. The npm publish step is itself pinned to an exact
verified-good npm version — no token — and is skipped without failing the job
if this version is already on npm, so a re-run after a partial failure doesn't
abort. The .mcpb SHA-256 injection into server.json likewise fails loudly if
the injection didn't actually match a package, instead of silently leaving a
stale hash. Never hand-edit the version in the derived files; bump
package.json via npm version and let the hook sync the rest.
What this file has done since we first saw it
Hashed on every crawl. A supply-chain change to an agent config is a question of when, not whether, so the history is kept rather than the latest state alone.
- 2d ago First seen · 109 lines · 46 tokens per session scan A 5e4c32de92b4
release is a skill published in the GitHub repository Grinv/mal-mcp (2 stars, last pushed 9d ago), licensed MIT. It adds 46 tokens to every session and 1,713 once invoked, about $0.0002 per session on Opus 5. A static security scan graded it A with 0 findings. No closer match exists in the catalogue, so it is treated as the original; first seen 2026-08-31.
Other skills, from other repositories
release
Cut a release of anilist-mcp-server — draft CHANGELOG entries, check docs/metadata consistency, then bump/tag/push. Use when asked to release, cut a version, or publish a new version of this package.
live-audit
Audit anilist-mcp-server — build/test/lint gate, live MCP tool edge-case sweep (input validation, not-found paths, mutations with capture/revert), source-level code review, and docs/metadata consistency. Use when asked to test/audit the published or just-fixed anilist-mcp-server package, hunt for bugs/edge cases, or…
release
Cut a release of tmdb-mcp — draft CHANGELOG entries, check docs/metadata consistency, then bump/tag/push. Use when asked to release, cut a version, or publish a new version of this package.
release
Cut a release of steam-games-mcp — draft CHANGELOG entries, check docs/metadata consistency, then bump/tag/push. Use when asked to release, cut a version, or publish a new version of this package.
changelog-style
Turn a commit range into CHANGELOG.md entries following common-changelog style. Use when finishing a PR or cutting a release, to write/fix the [Unreleased] section's entries — moving [Unreleased] under a new dated version heading is a separate, automated step (see the release skill / scripts/sync-version.mjs), not…
prompt-check
Live-test every MCP Prompt in src/prompts.ts through the real MCP protocol (not a static read) across every argument combination. Use when a prompt is added or its argument-handling logic changes, or as part of a live-audit pass.