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 skills add cyanheads/coingecko-mcp-server --skill api-lintergit clone --depth 1 https://github.com/cyanheads/coingecko-mcp-serverWrote this? Show the measurements
A badge with what this costs and how it scanned, read live from this page, so it follows the numbers instead of freezing them. Markdown for a README, HTML for a documentation site or a project page.
[](https://agentmods.dev/skills/cyanheads/coingecko-mcp-server/api-linter)<a href="https://agentmods.dev/skills/cyanheads/coingecko-mcp-server/api-linter"><img src="https://agentmods.dev/badge/skills/cyanheads/coingecko-mcp-server/api-linter.svg" alt="Measured on agentmods" height="20"></a>What 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.1 | $0.00086 | $0.12808 |
| Opus 5 | $0.00043 | $0.06404 |
| Sonnet 5 | $0.00017 | $0.02562 |
| Haiku 4.5 | $0.00009 | $0.01281 |
Grade A, and why
api-linter 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 8d 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.
This is a copy
100% identical to api-linter — 4 lines differ, which has more behind it and is treated as the original. This page carries a canonical link to it rather than competing with it.
How it starts
The opening of the file, as written. The whole thing — 984 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Overview
The linter validates tool, resource, and prompt definitions against the MCP spec and framework conventions. It is build-time only — not invoked at server startup. It runs in two places:
| Entry point | When | On failure |
|---|---|---|
bun run lint:mcp |
Manual or CI | Prints errors + warnings, exits non-zero on errors. |
bun run devcheck |
Pre-commit workflow | Wraps lint:mcp alongside typecheck, format, bun audit, bun outdated. |
Both surface the same LintReport from validateDefinitions() (exported from @cyanheads/mcp-ts-core/linter). Each diagnostic has a stable rule ID — that's the anchor you land on via the See: skills/api-linter/SKILL.md#<rule> breadcrumb appended to every message.
Severity:
- error — MUST-level spec violation; blocks
devcheck. - warning — SHOULD-level or quality issue; logged but
devcheckcontinues.
Imports (if you need to run the linter programmatically):
import { validateDefinitions } from '@cyanheads/mcp-ts-core/linter';
import type { LintReport, LintDiagnostic } from '@cyanheads/mcp-ts-core/linter';
const report = validateDefinitions({ tools, resources, prompts, serverJson, packageJson });
if (!report.passed) process.exit(1);
Rule index
Grouped by family. Jump to any rule ID via its anchor.
| Family | Rules | Section |
|---|---|---|
| Definition | definition-invalid |
Definition rules |
| Format parity | format-parity, format-parity-threw, format-parity-walk-failed, format-parity-depth-limit |
Format parity |
| Schema | schema-is-object, describe-on-fields, schema-serializable, schema-unsatisfiable, header-param-designation |
Schema rules |
| Portability | schema-format-portability, schema-anyof-needs-type, schema-no-discriminator-keyword, schema-no-defs, schema-root-oneof-portability, schema-dialect-tag |
Portability rules |
| Names | name-required, name-format, name-unique |
Name rules |
| Tools | description-required, handler-required, auth-type, auth-scope-format, annotation-type, annotation-coherence, meta-ui-type, meta-ui-resource-uri-required, meta-ui-resource-uri-scheme, app-tool-resource-pairing, canvas-consumer-missing |
Tool rules |
| Resources | uri-template-required, uri-template-valid, resource-name-not-uri, template-params-align |
Resource rules |
| Landing | landing-* (23 rules — shape, tagline, logo, links, repo, envExample, connectSnippets, theme) |
Landing config rules |
| Prompts | generate-required |
Prompt rules |
| Handler body | prefer-mcp-error-in-handler, prefer-error-factory, preserve-cause-on-rethrow, no-stringify-upstream-error |
Handler body rules |
| Error contract (structural) | error-contract-type, error-contract-empty, error-contract-entry-type, error-contract-code-type, error-contract-code-unknown, error-contract-code-unknown-error, error-contract-reason-required, error-contract-reason-format, error-contract-reason-unique, error-contract-when-required, error-contract-retryable-type, error-contract-recovery-required, error-contract-recovery-empty, error-contract-recovery-min-words |
Error contract rules |
| Error contract (conformance) | error-contract-conformance, error-contract-prefer-fail |
Error contract rules |
| Enrichment | enrichment-type, enrichment-empty, enrichment-field-type, enrichment-output-collision, enrichment-prefer-block, enrichment-trailer-render, enrichment-trailer-orphan, enrichment-trailer-unknown-field, capped-list-no-truncation |
Enrichment rules |
| server.json | ~40 rules prefixed server-json-* |
server.json rules |
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.
- 8d ago First seen · 984 lines · 86 tokens per session scan A 8f2c3de62558
api-linter is a skill published in the GitHub repository cyanheads/coingecko-mcp-server (1 stars, last pushed 18d ago), licensed Apache-2.0. It adds 86 tokens to every session and 12,808 once invoked, about $0.0004 per session on Opus 5. A static security scan graded it A with 0 findings. It is 100% identical to api-linter, differing in 4 lines, and is treated as a copy.
Other skills, from other repositories
tax-lawyer-au-crypto
Australian crypto tax treatment per ATO guidance QC 53725. Crypto assets are CGT assets under ITAA 1997 s 108-5. Each disposal triggers CGT event A1. Covers personal-use exception, trading stock test, and the 50% CGT discount.
BytesAgain Crypto Toolkit — 200+ Technical Indicators, Real-Time Market Data
Use when you need real-time crypto prices, technical indicators (RSI, MACD, Bollinger, 50+), market rankings, on-chain data, or trading signals. Zero API key required.
doctor
System health diagnostics and troubleshooting.
hive-mcp
Use this skill when the user wants to install, configure, connect, verify, or debug Hive MCP in an AI client — Claude, ChatGPT/OpenAI, Grok, Cursor, Windsurf, VS Code, Gemini CLI, or Codex — including OAuth browser sign-in, headless API-key fallback, missing tools, 401/auth errors, and hosted-vs-stdio questions. For…
hive-dex-pool-analysis
Use this skill when the user asks about a DEX pool or trading pair — liquidity depth, recent swaps/trades, OHLCV candles, trending pools, fee tiers, or token-level DEX flow on a chain — including "how deep is the X/Y pool", "what's trading on Uniswap", or a pasted pair address. For CEX prices, order books, and funding…
hive-market-research
Use this skill for any live crypto market question — prices, 24h moves, liquidity, exchange/venue data, OHLC candles, order books, tickers, funding rates, derivatives, trading context — even casual asks like "what's BTC at" or "is ETH pumping". Use it whenever the answer needs current market numbers instead of memory.…