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/finnhub-mcp-server --skill api-contextgit clone --depth 1 https://github.com/cyanheads/finnhub-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/finnhub-mcp-server/api-context)<a href="https://agentmods.dev/skills/cyanheads/finnhub-mcp-server/api-context"><img src="https://agentmods.dev/badge/skills/cyanheads/finnhub-mcp-server/api-context/github.svg" alt="Measured on agentmods" height="20"></a>Or the 80×15 button, for a site that already has a row of RSS and ATOM ones. Only the verdict fits; the numbers stay here.
<a href="https://agentmods.dev/skills/cyanheads/finnhub-mcp-server/api-context"><img src="https://agentmods.dev/badge/skills/cyanheads/finnhub-mcp-server/api-context.svg" alt="Reviewed on agentmods" width="80" 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.00084 | $0.15859 |
| Opus 5.5 | $0.00034 | $0.06344 |
| Sonnet 5.5 | $0.00017 | $0.03172 |
| Haiku 4.5 | $0.00008 | $0.01586 |
Grade A, and why
api-context scanned grade A with 1 finding 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 16d 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.
Makes network callslowCapability
Not a fault in itself. Listed so you know the mod talks to something, and to what.
const response = await fetch(url, { signal: ctx.signal }); This is a copy
100% identical to api-context — 6 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 — 950 lines — stays where its author put it; the contents beside it link to each section on GitHub.
Overview
Every tool and resource handler receives a single Context (ctx) argument. It provides request identity, structured logging, tenant-scoped storage, multi-round-trip input collection, and cancellation — all auto-correlated to the current request.
The framework auto-instruments every handler call (OTel span, duration, payload metrics). Use ctx.log for domain-specific logging and ctx.state for storage inside handlers. Use the global logger and StorageService directly only in lifecycle/background code (setup(), services).
Context interface
import type { Context } from '@cyanheads/mcp-ts-core';
interface Context extends RequestContext {
// Identity & tracing (inherited from RequestContext — see § RequestContext)
readonly requestId: string; // Per request; returned on its errors as data.requestId
readonly timestamp: string; // ISO 8601 request start time
readonly tenantId?: string; // JWT 'tid' claim; 'default' for stdio and HTTP+MCP_AUTH_MODE=none
readonly sessionId?: string; // Mcp-Session-Id (HTTP stateful/auto); undefined elsewhere unless opted in
readonly traceId?: string; // Trace containing this handler execution
readonly spanId?: string; // The handler's own execution span
readonly auth?: AuthContext; // Parsed auth claims (clientId, scopes, sub)
readonly operation?: string; // Label for the operation this context belongs to
readonly extra?: Readonly<Record<string, unknown>>; // Correlation bag — the one open field
// Structured logging — auto-includes requestId, traceId, tenantId.
// Dual-sink: Pino on the server, plus notifications/message to the client.
readonly log: ContextLogger;
// Tenant-scoped key-value storage
readonly state: ContextState;
// Multi-round-trip input — always present, both eras (see § ctx.requestInput)
readonly requestInput: RequestInputFn; // (spec, options?) => never — suspends and asks the caller
readonly inputs: ContextInputs; // the request's responses, limited to what the client declared
// What the client declared: the SDK-parsed `initialize` value (2025 era) or the
// request's envelope as sent (2026-07-28); undefined when no view exists
// (see § ctx.clientCapabilities)
readonly clientCapabilities: ClientCapabilities | undefined;
// List-changed / resource-updated notifications — wired in every handler ctx;
// delivery is request-scoped (see § list-changed notifications)
readonly notifyResourceListChanged?: () => void;
readonly notifyResourceUpdated?: (uri: string) => void;
readonly notifyPromptListChanged?: () => void;
readonly notifyToolListChanged?: () => void;
// Cancellation
readonly signal: AbortSignal;
// Raw URI — present only for resource handlers
readonly uri?: URL;
// Agent-facing success-path enrichment — accumulates notices, query echo, totals
// onto the request; reaches structuredContent + content[]. Always present (no-op
// when no `enrichment` block), strictly typed on HandlerContext<R, E> against the
// declared fields. Kind-tagged helpers: enrich.notice / .total / .echo.
readonly enrich: Enrich;
// Non-text content blocks (image/audio bytes) for the calling model — prepended
// to content[] after format() runs, never placed in structuredContent. Always
// present (no-op when never called). Helpers: content.image / .audio; content(block)
// pushes a raw ContentBlock.
readonly content: ContentCollect;
// Contract resolver — always present (returns {} when no contract is attached or the
// reason is unknown), strictly typed on HandlerContext<R> against declared reasons.
// The framework already sends a declared hint with any failure carrying the reason.
recoveryFor(reason: string): { recovery: { hint: string } } | {};
}
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.
- 16d ago Changed · +129 lines · +5 tokens per session 08661b80ea4f
- 1mo ago Changed · +6 lines 6d67a08d2b4c
- 1mo ago First seen · 815 lines · 79 tokens per session scan A c78158354f33
api-context is a skill published in the GitHub repository cyanheads/finnhub-mcp-server (1 stars, last pushed 17d ago), licensed Apache-2.0. It adds 84 tokens to every session and 15,859 once invoked, about $0.0003 per session on Opus 5.5. A static security scan graded it A with 1 finding (makes network calls). It is 100% identical to api-context, differing in 6 lines, and is treated as a copy.
Other skills, from other repositories
messari-x402
Access Messari's full API via x402 pay-per-request — no API key needed. Asset data, market metrics, signals, news, fundraising, token unlocks, on-chain networks, and AI chat, all paid with USDC on Base.
massive-flat-files
Foundation skill for bulk historical workflows backed by Massive's S3 flat files. Use whenever you need more than a few hundred ticker-days of trades, quotes, or aggregates. Faster, cheaper, and rate-limit-free compared to REST. Included with any paid Massive plan.
massive-api-patterns
Foundation skill for any REST workflow hitting api.massive.com. Use when calling any /v1, /v2, /v3 endpoint. Covers auth header, rate limit handling, pagination, and the best-price fallback chain. Every other REST-using skill depends on this.
polymarket
Query Polymarket: markets, prices, orderbooks, history.
tinker-training-cost
Calculates training costs for Tinker fine-tuning jobs. Use when estimating costs for Tinker LLM training, counting tokens in datasets, or comparing Tinker model training prices. Tokenizes datasets using the correct model tokenizer and provides accurate cost estimates.
tickdb-market-data
A real-time market-data API for foreign exchange, metals, indexes, stocks, and cryptocurrencies. An API is a service that software can call to request data.