form4api-mcp
This MCP server lets an AI assistant research SEC insider trading, institutional holdings, Form 144 sale intents, and congressional STOCK Act trades through hosted Form4API data.
Resolve companies and insiders from names, tickers, or CIKs; fetch profiles, company rosters, and filing histories.
Search and filter Form 4 transactions by ticker, CIK, transaction code/category, date range, dollar/share size, 10b5-1 status, significance, and institutional-ownership trend.
Access live/recent Form 4 filings, paginate filing lists, and retrieve individual filings by accession number.
Analyze insider conviction with cluster buy/sell signals, monthly sentiment scores, and signal explainability.
Detect early sale intent via Form 144 notice-of-proposed-sale filings.
Query institutional 13F-HR holdings, managers, and AUM data.
Track congressional STOCK Act trades with amount ranges and disclosure lag, plus politician/ticker rollups.
Find insider cluster-buy × congressional-purchase convergence signals.
Evaluate insider track records using career summaries, buy scorecards, and leaderboards.
Run bundled company insider research with
research_company, including transactions, signals, sentiment, and buy/sell direction.Monitor data quality, ingestion health, uptime history, public corpus stats, and API key usage/webhook activity.
Use 6 ready-made research prompts for common workflows like insider monitoring, cluster scans, Form 144 early warnings, and institutional-insider overlap.
Many capabilities are plan-gated; paywalled calls return structured upgrade_required responses instead of raw errors.
form4api-mcp
Production-grade SEC Form 4 insider trading data for any MCP-compatible AI assistant — amendment-aware, 10b5-1 clean, with Form 144 + institutional 13F-HR overlay, plus congressional STOCK Act trades and insider/Congress convergence — 39 tools + 6 ready-made research prompts
An MCP server that exposes the hosted Form4API REST API to Claude Desktop, Cursor, Windsurf, VS Code, Codex CLI, and any other MCP-compatible client. Configured once, your LLM can answer questions about insider trading, institutional positioning, and intent-to-sell filings directly during research sessions.
Four data-quality claims no scraping-based alternative can make:
🛡 Amendment-aware — Form 4/A amendments are reconciled automatically. No double-counting when an insider corrects a filing.
🎯 10b5-1 clean — every transaction flagged as pre-scheduled (10b5-1 plan) or discretionary. Cluster signals exclude planned trades by construction.
📜 Form 144 intent-to-sell — 125K+ Form 144 filings indexed. Catch insider sales ~2 days before they hit Form 4.
🏛 Institutional × insider join — every transaction carries the current 13F-HR ownership context (top-3 holders, AUM trend) in the same response: no second call, no client-side join. Among the self-serve SEC data APIs we've surveyed, none return both sides in one query — sec-api.io and Kaleidoscope both ship 13F and insider data as separate endpoints.
Quick install
1. Get a free API key
Go to www.form4api.com → Sign in → Dashboard. Free plan includes 500 requests/day, no credit card required.
2. Add to your MCP client
Claude Desktop — edit ~/Library/Application Support/Claude/claude_desktop_config.json (macOS) or %APPDATA%\Claude\claude_desktop_config.json (Windows):
{
"mcpServers": {
"form4api": {
"command": "npx",
"args": ["-y", "form4api-mcp"],
"env": {
"FORM4API_KEY": "YOUR_API_KEY"
}
}
}
}Restart the client. The tools appear automatically.
Claude Code (CLI):
claude mcp add form4api -- npx -y form4api-mcp…then set FORM4API_KEY in your shell or in ~/.claude/mcp.json.
Cursor — edit ~/.cursor/mcp.json (user-level) or .cursor/mcp.json (workspace-level):
{
"mcpServers": {
"form4api": {
"command": "npx",
"args": ["-y", "form4api-mcp"],
"env": {
"FORM4API_KEY": "YOUR_API_KEY"
}
}
}
}Restart Cursor. The tools appear automatically.
Windsurf — edit ~/.codeium/windsurf/mcp_config.json:
{
"mcpServers": {
"form4api": {
"command": "npx",
"args": ["-y", "form4api-mcp"],
"env": {
"FORM4API_KEY": "YOUR_API_KEY"
}
}
}
}Restart Windsurf. The tools appear automatically.
VS Code — edit .vscode/mcp.json (workspace-level). Note: VS Code uses the servers key (not mcpServers):
{
"servers": {
"form4api": {
"command": "npx",
"args": ["-y", "form4api-mcp"],
"env": {
"FORM4API_KEY": "YOUR_API_KEY"
}
}
}
}Restart VS Code. The tools appear automatically.
Codex CLI — config is TOML at ~/.codex/config.toml:
[mcp_servers.form4api]
command = "npx"
args = ["-y", "form4api-mcp"]
env = { FORM4API_KEY = "YOUR_API_KEY" }Verify it works
Ask your LLM to run the verify_setup tool — it confirms your API key is valid and the MCP server is reachable, or returns the exact fix steps.
Example: "Run the verify_setup tool to confirm the MCP is configured correctly."
Try before you commit a key
get_public_stats is a keyless tool — it works with no FORM4API_KEY set. Try it first to preview live data coverage before signing up:
FORM4API_KEY="" npx form4api-mcpOnce you like what you see, sign up for a free key at www.form4api.com → set FORM4API_KEY → all tools unlock.
3. Or run directly
FORM4API_KEY=YOUR_API_KEY npx form4api-mcpRelated MCP server: alphai-news
Available tools (39)
Search
Tool | Description | Plan |
| Resolve a company name, ticker fragment, or a person's name to a ticker or CIK — the usual first call when you don't already have an identifier. Returns separately-ranked | Free |
Form 4 insider trading
Tool | Description | Plan |
| Bundled insider-research context for one ticker in a single call — company profile, recent transactions, cluster signals, sentiment, and a computed buy/sell direction summary. Replaces 4 separate calls and degrades gracefully when a section needs a higher plan | Free (signals/sentiment sections need Business) |
| Search insider transactions — filter by ticker, insider, date range, transaction codes or whole categories ( | Free |
| Most recent Form 4 filings, optionally filtered by ticker | Free |
| Form 4 filings as a paginated list, newest filed first — filter by ticker, cik, or a filed-date window. Use this to page through filings; | Free |
| Single filing by accession number | Free |
| Insider profile — name, title, director/officer/10pct owner flags | Free |
| All transactions for a specific insider (by CIK) | Free |
| Company profile — name, CIK, SIC sector, state, website, filing counts | Free |
| All insiders who have filed Form 4s for a company | Free |
| Similar companies in the same SIC industry (4-digit first, topped up from the 2-digit prefix), ranked by Form 4 filings in the last 12 months | Free |
| List companies, sorted by name or filing count | Free |
| Browse insiders alphabetically by surname — an A-Z rail with a count per letter, plus one page of insiders under the requested letter | Free |
| Aggregate career rollup: total bought/sold, top companies, 10b5-1 split, return averages | Pro |
| Buy track-record scorecard for an insider (CIK) — hit rate and avg/median return on discretionary open-market buys; null when fewer than 5 matured samples | Pro |
| Top insiders ranked by | Business |
Signals + sentiment
Tool | Description | Plan |
| Cluster buy/sell signals — multiple insiders at the same company in the same direction. Excludes 10b5-1 trades automatically | Business |
| MSPR-style monthly sentiment score per ticker (-100 to +100). 10b5-1 excluded so the score reflects real insider conviction | Business |
Form 144 + institutional
Tool | Description | Plan |
| Notice-of-proposed-sale filings — early signal ~2 days before Form 4 sale lands | Business |
| Institutional positions from Form 13F-HR (filter by ticker, CUSIP, manager, quarter, min value) | Business |
| Institutional manager index with latest AUM | Business |
| Explain why a signal fired — the insiders and trades counted, exclusions, and criteria | Business |
| Public data-quality, freshness and coverage metrics | Free |
| Schedule 13D/13G >5% beneficial-ownership crossings for a company — filer, ownership percent, event date, form type | Business |
Congress + convergence
Tool | Description | Plan |
| Congressional STOCK Act trades (periodic transaction reports) — filter by ticker, politician, party, chamber, state, transaction type, min amount, or date range. Coverage is U.S. House only — Senate eFD blocks datacenter traffic, so | Free (30-day disclosure window; Starter 366 days; Pro+ unlimited history) |
| Ranked rollup of politicians by congressional trade activity — total/buy/sell counts, most recent disclosure | Pro |
| One politician's full profile by bioguide ID — totals, top traded tickers, most recent trades | Pro |
| Which politicians traded a given ticker, with net buy/sell counts | Pro |
| Tickers where an insider cluster-buy and a congressional purchase happened within a trailing window of each other. | Pro |
Utility
Tool | Description | Plan |
| Your API key usage stats and current plan | Free |
| Recent API requests for this key | Free |
| Daily request counts for the last N days | Free |
| Substring search on insider names | Free |
| List your webhook subscriptions, with delivery health per webhook ( | Free |
| Replay webhook delivery events since a timestamp. Read-only | Free |
| Verify the MCP is configured correctly — confirms API key is valid and server is reachable | Free |
| Public corpus-wide totals (filings, transactions, companies, 13F-HR AUM, ingestion latency) — no API key required | Free (keyless) |
| Trailing 90-day daily uptime history for the public status page | Free (keyless) |
| Live ingestion-health check — Form 4 freshness, parse-queue backlog, price-feed staleness | Free (keyless) |
Prompts (6)
Beyond the 39 tools, this MCP ships 6 prompts — ready-made research recipes that a client can list (prompts/list) and load (prompts/get) so you don't have to hand-assemble the right tool sequence yourself. Each one tells the LLM exactly which SEC Form 4 / Form 144 / 13F-HR tools to call, in what order, and how to read plan-gated results.
Prompt | Args | What it does |
|
| Recent SEC Form 4 insider activity for a ticker — transactions (10b5-1 flagged), cluster signals, sentiment — summarized as buy/sell conviction with post-trade-return context |
|
| Market-wide scan of recent cluster-buy signals, 10b5-1 excluded, ranked by conviction (insider count + $ value), each with a sentiment score |
|
| Pending Form 144 notice-of-proposed-sale filings cross-referenced against recent Form 4 sells — flags discretionary (non-10b5-1) notices as the highest-signal early warnings, ~2 days ahead of the sale |
|
| An insider's career track record — total bought/sold, historical post-trade returns on discretionary buys, and whether their buying has historically beaten their scheduled 10b5-1 selling |
|
| Combines 13F-HR institutional holders with recent insider transactions to spot where smart money and insiders agree or diverge |
|
| Screens insider buys with post-trade-return filters to surface historically-successful dip-buying patterns |
These map to the recipe workflows scraping-based Form 4 MCPs don't offer — each one leans on data this MCP alone exposes (10b5-1 flags, Form 144, 13F-HR join, per-insider return scoring). Plan requirements are honored honestly: prompts that touch Business-plan tools (get_signals, get_sentiment, get_form144, get_holdings, get_managers) or Pro-plan tools (get_insider_career_summary, get_insider_scorecard) instruct the LLM to surface the structured upgrade_required response rather than silently failing.
In Claude Desktop, prompts surface as a / slash-command picker; in Claude Code or other MCP clients, ask the assistant to "use the insider_monitor prompt for NVDA" (or similar) and it will fetch and follow the recipe.
Example prompts
Configured? Ask your LLM:
Quality-led (these require our amendment-aware, 10b5-1 clean, joined dataset):
"Show me cluster buy signals from this week — discretionary only, no planned trades"
"Which companies have insiders buying while institutional ownership is increasing this quarter?"
"Are there any Form 144 filings at NVDA suggesting upcoming sales?"
"What's the monthly insider sentiment for TSLA over the last 6 months, with 10b5-1 plans excluded?"
"Berkshire Hathaway's top 13F-HR holdings — what did they add or trim this quarter?"
Standard insider research:
"What insider trades happened at NVDA in the last 30 days, excluding 10b5-1 plans?"
"What is Tim Cook's career insider-trading summary?"
"Show me all open-market purchases over $1M at Tesla in 2026"
"What has the CFO of Microsoft been doing with their shares this year?"
Why this MCP vs scraping-based alternatives
Some MCPs in this space scrape free public sites (e.g. openinsider.com) for Form 4 data. That's fine for a quick prototype but the data layer they give your LLM has structural gaps:
form4api-mcp | Scraping-based MCPs | |
Form 4/A amendment handling | ✅ reconciled automatically | ❌ double-counts |
10b5-1 plan flag | ✅ exposed on every transaction | ❌ planned + discretionary mixed |
Form 144 intent-to-sell | ✅ 125K+ filings | ❌ not exposed |
Institutional × insider join | ✅ top-3 holders + AUM trend per transaction | ❌ insider only |
Sentiment (10b5-1 excluded) | ✅ MSPR-style score | ❌ planned trades pollute score |
Source resilience | ✅ hosted API contract | ❌ breaks when source HTML changes |
Webhooks / production delivery | ✅ HMAC + retry + DLQ | ❌ MCP-only, no fallback |
SDKs | ✅ Python + JS | ❌ MCP-only |
Commercial support | ✅ | ❌ |
If your LLM session is the start of a real research workflow that eventually wants production delivery, picking the MCP that has a graduation path matters.
Beyond MCP — when you need more
Webhook tools are read-only. The MCP can list your webhooks (list_webhooks) and replay delivery events (get_webhook_events), nothing more. Creating, deleting, enabling and testing webhooks, and setting a custom auth header, are done through the REST API or the dashboard. This is deliberate: the MCP exposes no write tools for webhooks.
The MCP is the easiest entry point. When your workflow grows past LLM-mediated research, the rest of the Form4API platform is right behind it:
Webhooks — HMAC-signed, exponential backoff, dead-letter queue, auto-disable on persistent failure. For production pipelines, not just LLM chats.
Python SDK —
pip install form4api(PyPI)JS / TypeScript SDK —
npm install form4api(npm)Dashboard — usage, billing self-serve, key rotation, webhook health, billing history.
The MCP wraps the same backend as all of the above — every fact your LLM cites can be re-fetched programmatically through any of these channels with the same key.
Plans
25 of the 39 tools work on the free plan, and every tool that is free today stays free. New premium capability gets tiered as it ships; nothing that already works on your key is taken away later.
Tool | Free | Pro | Business |
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
| ✓ | ✓ | ✓ |
| — | ✓ | ✓ |
| — | — | ✓ |
| — | — | ✓ |
| — | — | ✓ |
| ✓ (30-day disclosure window) | ✓ (unlimited history) | ✓ (unlimited history) |
| — | ✓ | ✓ |
Requests/day | 500 | 50,000 | 250,000 |
Requests/minute | 60 | 200 | 500 |
| 20 pages | unlimited | unlimited |
Starter sits between Free and Pro: 7,500 requests/day and 120/minute, 100 pages of get_transactions paging depth and a 366-day congressional history window. Tools marked Pro or Business in the table still need that plan. Enterprise is unlimited requests/day at 2,000/minute.
For a bulk historical pull, use the REST /v1/transactions/export endpoint (Business) rather
than paging — it streams the whole filtered set as CSV in one request.
What your agent sees at a paywall
A gated call never surfaces a bare HTTP error. The MCP returns a structured
upgrade_required payload so the model can explain the situation and the fix in one turn:
{
"error": "upgrade_required",
"required_plan": "business",
"current_plan": "Free",
"message": "This endpoint requires the Business plan or higher. Your current plan is Free.",
"unlocks": "The Business plan includes cluster-buy signals and sentiment scores, 13F institutional holdings and managers, Form 144 notices, bulk CSV export, and 250,000 requests/day."
}message is the API's own explanation, kept verbatim — it names the specific limit or
parameter that stopped the call, which is usually what the model needs to suggest a working
alternative. The same shape is returned when a Pro-only parameter is used on an otherwise
free tool, so the model can simply retry without that filter.
upgrade_url is included only when the API supplies one; it is omitted otherwise.
Data coverage
1.38M+ Form 4 transactions from SEC EDGAR
620K+ filings across all reporting companies
125K+ Form 144 notice-of-proposed-sale filings (Business+)
45M+ Form 13F-HR holdings across 118K+ filings, $80T+ AUM in the latest complete quarter (Business+)
3.3+ years of history (since 2023-04)
10b5-1 plan flag on every transaction
Amendment-aware — Form 4/A reconciled
Congressional STOCK Act trades — U.S. House Clerk periodic transaction reports only (Senate eFD is not ingested).
list_congress_tradesis available on every plan with a history window by plan (Free 30 days, Starter 366 days, Pro+ unlimited); politician rollups and convergence need Pro+. Digital filings, amounts always shown as disclosed ranges (amountLow/amountHigh), never a fabricated midpoint, plusdisclosureLagDayson every trade (up to 45 days under the STOCK Act)Real-time ingestion — new filings within minutes of SEC publication
Install as a Claude Desktop Extension (DXT)
A manifest.json is included at the repo root for one-click install via the Desktop Extensions (DXT) format. Once Claude Desktop supports .dxt files natively, pack and install with:
npx @anthropic-ai/dxt pack
# Produces form4api-mcp.dxt — open it in Claude Desktop to installUntil then, use the standard claude_desktop_config.json method described in Quick install above.
How tools stay in sync with the backend
This MCP is split between two layers:
Hand-written tools in
src/tools/*.ts(transactions, signals, sentiment, form144, holdings, …) — these carry the LLM-discriminator descriptions (amendment-aware, 10b5-1 clean, etc.) that make this MCP pick correctly over alternatives.Auto-generated tools in
src/tools/_generated.ts— produced fromhttps://api.form4api.com/openapi/v1.jsonbynpm run codegen. Every new backend endpoint that lands in the OpenAPI spec flows in here automatically. CI runsnpm run codegen:checkon every PR and fails the build if the committed file drifts from what the live spec would produce, so the MCP is never silently behind the backend.
To add a new generated tool: ship the endpoint on the backend, regenerate (npm run codegen), commit src/tools/_generated.ts, publish. No tool-wrapper code needed.
The 6 recipe prompts live in src/prompts/recipes.ts — also hand-written, not generated. They add no new backend surface area; each one is a client-side template that tells the LLM which existing tools to call and in what order.
Links
Available Tools
38 toolscheck_usageARead-only
Snapshot of the authenticated API key's current usage — plan name, requests made today, daily limit, and all-time request count. Use this for a quick right-now check; use the generated get_usage_history tool for a daily trend over time, or get_key_activity for a per-request log. Free plan, works on every tier.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, indicating it's a safe read operation. The description adds useful behavioral context: it works on every tier and is free, and it's a snapshot of current usage. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two sentences with no wasted words. It is front-loaded with the core purpose and efficiently includes usage guidelines and alternatives.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description sufficiently explains the tool's output fields (plan name, requests today, daily limit, all-time count). It is complete for a simple snapshot tool with no parameters.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are no parameters (schema coverage 100% trivial), so baseline is 4. The description adds meaning by explaining what the tool returns (plan name, requests today, etc.), compensating for the lack of an output schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool provides a snapshot of the authenticated API key's current usage, listing specific fields (plan name, requests today, daily limit, all-time count). The verb 'check' matches the tool name and the resource is well-defined, distinguishing it from sibling tools like get_usage_history and get_key_activity.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description explicitly says to use this for a quick right-now check and provides alternatives: get_usage_history for daily trends and get_key_activity for per-request logs. This gives clear when-to-use and when-not-to-use guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
explain_signalARead-only
Explain why a signal fired: the insiders and trades counted, what was excluded, and the criteria (Business plan+). Use this when the question is WHY a named company's signal fired, or WHICH insiders and trades made up its cluster. It takes the ticker directly, so there is no need to call GET /v1/signals first; that endpoint is for finding which companies have signals. Reconstructs the full evidence behind one company's insider signal from GET /v1/signals: the detection criteria (5-day cluster window, 3-insider threshold, 90-day ratio window, 10b5-1 exclusion), the list of cluster buyers and sellers (each with their role and individual trades in the window), trades that were excluded from the cluster count and why (10b5-1 plan or superseded by amendment), and the raw buy/sell share totals behind the 90-day ratio. Use this to audit or debug a specific signal rather than to scan many companies (use GET /v1/signals for that). This is a LIVE reconstruction from current non-superseded data, computed on every request (no caching) — it can differ slightly from the originally stored signal if trades were amended afterward. Requires Business plan or higher (402 PLAN_REQUIRED on Free/Starter/Pro). Returns 404 COMPANY_NOT_FOUND if the ticker isn't tracked, 404 SIGNAL_NOT_FOUND if no signal exists for the given/most-recent date, or 400 INVALID_DATE if date isn't YYYY-MM-DD.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Exact signal date to explain, format YYYY-MM-DD. Omit to explain the company's most recent signal. Returns 404 SIGNAL_NOT_FOUND if no signal exists for the given (or most recent) date. | |
| ticker | Yes | Company ticker symbol, case-insensitive (e.g. "AAPL"). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint; the description goes well beyond them by disclosing that this is a LIVE, uncached reconstruction that can diverge from the stored signal after amendments, the Business-plan gating (402 PLAN_REQUIRED on Free/Starter/Pro), and the exact 404/400 failure modes. It does not spell out pagination or sizing of the returned evidence lists, but the safety and cost profile is fully covered.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then usage, then mechanics, and it is dense with no filler sentences. It is on the long side and the routing advice ('audit or debug a specific signal rather than scan') restates the earlier 'use this when' guidance, a mild redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a tool with no output schema and thin annotations, the description carries the full load and does so: it enumerates what is returned (criteria, cluster buyers/sellers with roles and trades, exclusions and reasons, raw buy/sell totals), the plan requirement, and every error code. An agent has everything needed to call and interpret it.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents both parameters; the description's added value is contextual, explaining that ticker is taken directly (enabling the skip of a prior lookup) and that omitting date falls back to the most recent signal with a SIGNAL_NOT_FOUND on miss. That reinforces behavior but adds little syntax beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Explain why a signal fired') and immediately enumerates the substance returned: the insiders and trades counted, what was excluded, and the criteria. It explicitly distinguishes itself from get_signals (finding which companies have signals) versus this tool (explaining one company's signal), so an agent can route without inspecting either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-to-use conditions ('when the question is WHY a named company's signal fired, or WHICH insiders and trades made up its cluster') and an explicit when-not with the named alternative ('rather than to scan many companies (use GET /v1/signals for that)'). It also removes a prerequisite the agent might otherwise assume ('there is no need to call GET /v1/signals first').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_insidersARead-only
Full roster of insiders who have ever filed a Form 4 for a given ticker — name, CIK, titles, director/officer/10%-owner flags, last-filed date, and total transaction count per insider. Use this to enumerate a company's insiders (e.g. before pulling each one's career summary); use get_transactions with ticker= for the underlying trade history itself. Free plan. Paginated, max 100/page.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. | |
| ticker | Yes | Stock ticker symbol, case-insensitive, e.g. MSFT. | |
| per_page | No | Results per page. Defaults to 20, maximum 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Description adds value beyond readOnlyHint and openWorldHint by specifying pagination (max 100/page), free plan, and the exact fields returned. No contradictions with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise sentences covering purpose, usage guidance, and pagination/free plan. No unnecessary words, highly efficient.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output fields are described, pagination mentioned. Lacks handling of edge cases like empty results or error conditions, but adequate for a list tool without output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so description does not need to add much. The description mentions 'given ticker' but adds no extra semantics beyond schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a full roster of insiders who filed Form 4 for a ticker, listing specific fields. It distinguishes from sibling tool get_transactions by noting it is for enumerating insiders before pulling career summaries.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool (to enumerate insiders before pulling career summaries) and directs to get_transactions for trade history, providing clear alternative guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_company_overviewARead-only
Company profile for a single ticker — name, CIK, SIC sector/description, state of incorporation, website, total Form 4 filing count, and active insider count. Use this for company identity/metadata; use get_company_insiders to list who is filing, or get_transactions with ticker= for their trade history. Free plan.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Stock ticker symbol, case-insensitive, e.g. MSFT. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the description adds value by specifying 'Free plan' (implies usage limits) and listing returned fields. No contradictions; additional context enhances transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, front-loaded with purpose and fields, followed by usage guidance. No unnecessary words; every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple tool with one parameter and no output schema, the description lists all returned fields and provides usage context. Lacks mention of limits or pagination, but not needed for single-ticker lookup. Adequately complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% for the single parameter (ticker), so baseline is 3. The description doesn't add extra semantics beyond the schema, but it's adequate given the high coverage.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it provides a company profile for a single ticker, listing specific fields (name, CIK, SIC, etc.). It distinguishes from siblings by explicitly naming get_company_insiders and get_transactions as alternatives for different purposes.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool ('for company identity/metadata') and when to use alternatives ('use get_company_insiders to list who is filing, or get_transactions with ticker= for their trade history'). Clear and actionable guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_congress_politicianARead-only
Get one politician's congressional trading profile (Pro plan+). Returns one politician's profile — identity fields, total/buy/sell trade counts, most recent trade's disclosure date, their top N most-traded tickers (by trade count), and their N most recent trades (same shape as GET /v1/congress/trades). Use this for a one-call politician overview rather than paging /v1/congress/trades?politician= yourself. Accepts either a bioguide ID (e.g. "P000197") or the politician's URL slug (e.g. "nancy-pelosi") in the path, matched case-insensitively against whichever field applies. Returns 404 NOT_FOUND if neither matches. Requires Pro plan or higher (402 PLAN_REQUIRED on Free/Starter). Query runs live — no caching.
| Name | Required | Description | Default |
|---|---|---|---|
| idOrSlug | Yes | Politician's bioguide ID (e.g. "P000197") or URL slug (e.g. "nancy-pelosi"), exact match, case-insensitive. Tried against both fields. | |
| top_tickers | No | Number of most-traded tickers to include. Defaults to 10, maximum 50. | |
| recent_trades | No | Number of most recent trades to include. Defaults to 20, maximum 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/anomaly annotations, the description discloses live execution with no caching, the Pro plan requirement (402 on Free/Starter), and the 404 behavior when neither ID nor slug matches. These are valuable behavioral traits that the annotations do not already cover.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and contains all necessary behavioral context in a compact two-sentence paragraph, but there’s a small redundancy: the pseudo‑'Requires Pro plan or higher' line repeats the parenthetical '(Pro plan+)' from the opening sentence. Still, overall structure and placement are excellent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given there is no output schema, the description clearly enumerates the required return data: identity fields, buy/sell trade counts, most recent disclosure date, top N tickers, and recent trades with their shape. It also covers error responses and plan restrictions, making the tool realistically callable end-to-end without additional assumptions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% description coverage, so the baseline is 3. The main description adds marginal value by clarifying that 'most traded' is by trade count and that recent trades have a specific shared shape, but it does not materially change understanding of the three parameters beyond the schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Get one politician's congressional trading profile.' It then enumerates the exact returned fields and differentiates the tool from paging /v1/congress/trades by framing it as a 'one-call politician overview,' which helps an agent distinguish it from siblings like list_congress_trades or get_congress_ticker_rollup.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs agents with 'Use this for a one-call politician overview rather than paging /v1/politician= yourself.' This names the alternative approach and tells the agent when this tool is appropriate, satisfying both when-to-use and an alternative context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_congress_ticker_rollupARead-only
Which politicians traded a ticker, with net buy/sell counts (Pro plan+). Returns every politician who has a non-superseded congressional trade in the given ticker, each with their trade/buy/sell counts, plus ticker-level totals. Optional window_days restricts to trades with a transactionDate in the trailing N days; omit for all-time. A ticker with no congress trades returns 200 with an empty politicians array and zero counts rather than 404 — there is no separate ticker/company entity in this dataset to 404 against. Requires Pro plan or higher (402 PLAN_REQUIRED on Free/Starter). Query runs live — no caching.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Ticker symbol, case-insensitive (e.g. "AAPL"). | |
| window_days | No | Trailing window in days ending now, applied to transactionDate. Omit for all-time. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the readOnlyHint and openWorldHint annotations by disclosing plan gating, the PLAN_REQUIRED error on Free/Starter, the live no-cache behavior, the meaning of non-superseded trades, and the 200-with-empty-array behavior for tickers with no congressional trades. This is strong behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is dense but appropriately detailed, covering return shape, edge cases, plan limits, and live behavior. It is not overly verbose, though the explanation about the absence of a separate ticker entity could have been tightened.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description sufficiently explains the expected return shape, empty-ticker behavior, and access constraints. It could be even more complete by specifying exact response fields or boundary behavior, but it is enough for an agent to select and invoke the tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already documents both parameters with 100% coverage, so the description adds little parameter meaning beyond repeating the trailing-window behavior for window_days. This matches the baseline of 3 when schema descriptions carry the semantic load.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: it returns every politician who traded a given ticker, with per-politician trade counts and ticker-level totals. This is a specific verb-resource pairing that is semantically distinct from sibling tools like get_transactions or list_congress_trades.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives clear parameter context, such as optional window_days behavior and Pro plan requirements, but it never explicitly tells an agent when to choose this tool over a sibling like get_congress_politician or list_congress_trades. It provides implied usage rather than direct routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_convergence_signalsARead-only
Insider cluster-buy x congressional-purchase convergence (Pro plan+). Returns the tickers where an insider cluster-buy (InsiderSignal.IsClusterBuy) and at least one non-superseded congressional PURCHASE happened within window_days of EACH OTHER, restricted to convergences where the MORE RECENT of the pair's two dates is within a trailing lookback_days (so this surfaces CURRENT convergences, not ancient history). DEFINITION: for each result, insider.signalDate is the SignalDate of the qualifying cluster-buy signal with the most recent date (insider.insiderCount is that same signal's count — never summed or maxed across multiple signals), and congress is every non-superseded congressional purchase that paired with at least one qualifying cluster-buy (not every purchase in the window — only the ones that actually paired). firstSeen/lastSeen are the earliest/most recent dates among all qualifying insider and congress dates for that ticker. STRENGTH is documented arithmetic, NOT a black-box or predictive/ML score: strength = (distinct congressional purchasers among the qualifying legs) x (the representative signal's insiderCount) — a plain multiplication of two observed counts, nothing more. HONESTY: every congress leg always carries both amountLow and amountHigh (STOCK Act discloses ranges, never exact figures — never combined into a fabricated midpoint) and disclosureLagDays = (disclosureDate - transactionDate). Congressional trades whose dates are impossible or implausible (a dateQuality flag: transaction_after_disclosure, future_transaction_date or implausible_lag) are excluded from detection, so they never appear as legs and never create a convergence; dateQuality is therefore null on every leg returned here and disclosureLagDays is always set. Congressional trades are disclosed up to 45 days after the actual trade under the STOCK Act, so this endpoint is detection/monitoring of what insiders AND members of Congress have DISCLOSED buying, not a claim of predictive edge, alpha, or win rate — no performance numbers are computed or implied anywhere in this response. window_days and lookback_days are both caller-overridable with clamps (see each parameter's own description for the exact bounds). Requires Pro plan or higher (402 PLAN_REQUIRED on Free/Starter). limit is accepted as an alias for per_page. Query runs live against the database — no caching.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. | |
| limit | No | Alias for per_page. | |
| ticker | No | Ticker symbol, case-insensitive exact match (e.g. "AAPL"). Omit to scan every ticker. | |
| per_page | No | Converged tickers per page. Defaults to 100, maximum 500. `limit` is accepted as an alias; if both are given, per_page wins. | |
| window_days | No | Trailing-day window: an insider cluster-buy date and a congressional purchase date must fall within this many days of EACH OTHER (either order) to count as a qualifying pair. Defaults to 30, clamped to [1, 90]. | |
| lookback_days | No | How far back from now the MORE RECENT of a qualifying pair's two dates must fall to still count as a current convergence (the less-recent date in a pair can be older, as long as it's within window_days of a recent partner). Defaults to 180, clamped to [1, 730]. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover readOnlyHint and openWorldHint, so the description carries real weight and delivers: plan gating with the exact error code, live uncached query behavior, caller-overridable clamps on window_days/lookback_days, exclusion of implausible congressional dates, and an explicit disclaimer that no alpha/win-rate is computed. This is behavioral context well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The core purpose and scoping are front-loaded, and the DEFINITION/HONESTY sections carry substantive return-value and disclosure semantics rather than filler. It is nonetheless a dense wall of ALL-CAPS prose with some repetition (e.g. the 'no predictive edge' point is made twice), which costs it the top mark.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully documents the return shape: insider.signalDate, insider.insiderCount semantics, the congress leg set, firstSeen/lastSeen, the strength multiplication formula, amountLow/amountHigh ranges, disclosureLagDays, and dateQuality being null. Nothing an agent needs to interpret results is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents page, per_page/limit, ticker, window_days and lookback_days including their defaults, bounds and the alias rule. The description largely restates those (e.g. the alias and clamp notes), adding only marginal meaning, so the baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise compound resource (insider cluster-buy x congressional-purchase convergence) with the exact qualifying conditions, immediately distinguishing it from siblings like get_signals, get_key_activity and get_insider_transactions. An agent can tell what this tool returns without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives clear context for use (detection/monitoring of disclosed insider AND congressional buying, not predictive edge) and a hard prerequisite (Pro plan+, 402 PLAN_REQUIRED on Free/Starter). It does not, however, explicitly name an alternative sibling or state when NOT to use it versus get_signals.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_data_qualityARead-only
Public data-quality, freshness and coverage metrics for the whole dataset. Returns public, keyless metrics on data freshness, ingestion latency, corpus coverage, and post-trade returns coverage — use this to check whether the dataset is current before relying on it (e.g. confirm Form 4 ingestion isn't stalled, or that price data isn't stale), not to look up any single company, insider, or transaction. Includes: most recent Form 4 processed timestamp and median/p95 filing-accepted-to-processed latency in seconds, latest price-bar date and how many days behind it is, total companies/transactions tracked plus filing counts by form type (4, 144, 13F-HR), the percentage of 13F CUSIPs resolved to a ticker, and the percentage of eligible transactions with fully computed post-trade returns. Takes no parameters. Cached for 30 minutes; no API key or plan required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds valuable context: caching for 30 minutes, no API key required, and a detailed list of returned metrics. This goes beyond the annotations without contradicting them.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured, starting with purpose, then usage guidance, then a bulleted list of included metrics, and finally caching/auth notes. It is slightly long but every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description provides a comprehensive list of what is returned (timestamps, latencies, counts, percentages) and context on caching and public access. The tool is simple and the description fully explains its behavior and output.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The schema has zero parameters and the description explicitly confirms 'Takes no parameters', adding certainty. With no parameters, the baseline is 4, and the description fulfills that.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns public data-quality metrics for the whole dataset, using specific verbs like 'returns' and 'use this to check'. It distinguishes itself from sibling tools by explicitly stating it is not for looking up individual companies or transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear when-to-use guidance ('check whether the dataset is current before relying on it') and what not to use it for ('not to look up any single company'). It mentions it's public and needs no API key, but does not explicitly name alternative sibling tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_filingARead-only
Fetch one Form 4 filing by its exact SEC accession number (format NNNNNNNNNN-YY-NNNNNN, e.g. 0000320193-26-000001). Use this once you already have an accession number from get_recent_filings or get_transactions. Returns filed/period-of-report dates, company and insider identity, and transaction count for that filing. Free plan.
| Name | Required | Description | Default |
|---|---|---|---|
| accession | Yes | SEC accession number in NNNNNNNNNN-YY-NNNNNN format (10-digit filer CIK, 2-digit year, 6-digit sequence), e.g. 0000320193-26-000001. Copy this from a get_recent_filings or get_transactions result. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnlyHint and openWorldHint. Description adds return fields (dates, identity, transaction count) and free plan mention, but lacks details on error behavior or limitations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with purpose and example, concise with no unnecessary words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 1 param and no output schema, description covers what is returned and when to use. Could mention missing accession handler but sufficient for context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% with description. Description adds format example (0000320193-26-000001) and context to copy from other tools, exceeding the schema's base description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it fetches a Form 4 filing by accession number, with format example. Distinguishes from siblings like get_recent_filings and get_transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this once you already have an accession number from get_recent_filings or get_transactions', providing clear when-to-use and source of input.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_form144ARead-only
Form 144 notice-of-proposed-sale filings — insiders disclose intent to sell roughly 2 days before the matching Form 4 sale lands, so this is an early-warning signal, especially discretionary (non-10b5-1) notices. Filter by ticker, insider name (partial match), date range, or exclude_10b5. Cross-reference with get_transactions/get_insider_transactions to see whether the intent was actually executed. Requires Business plan. Paginated, max 100/page.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End filing date, inclusive, format YYYY-MM-DD (e.g. 2026-12-31). | |
| from | No | Start filing date, inclusive, format YYYY-MM-DD (e.g. 2026-01-01). | |
| page | No | 1-based page number. Defaults to 1. | |
| ticker | No | Stock ticker symbol, case-insensitive, e.g. AAPL. | |
| per_page | No | Results per page. Defaults to 20, maximum 100. | |
| exclude_10b5 | No | If true, exclude pre-scheduled 10b5-1 plan filings. Recommended for signal analysis — discretionary sale-intent notices only. | |
| insider_name | No | Filter by insider name, case-insensitive partial/substring match, e.g. "cook". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Despite annotations already providing readOnlyHint and openWorldHint, the description adds valuable behavioral context: timing (2 days before Form 4), pagination (max 100/page), and the signal nature (discretionary vs 10b5-1). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Every sentence adds value: purpose, timing, filtering, cross-reference, plan requirement, pagination. No wasted words, well-structured and front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers core purpose, filtering, usage advice, complementary tools, and restrictions. Lacks explicit output fields, but given no output schema and common knowledge of Form 144, it is sufficiently complete for an experienced agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds marginal value by advising use of exclude_10b5 for signal analysis and clarifying date range and partial match on insider name, but mostly reiterates schema descriptions.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves Form 144 'notice-of-proposed-sale' filings, explaining they are early-warning signals for insider sales. It distinguishes from siblings like get_transactions by suggesting cross-referencing to check execution, and specifies filtering options.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly guides when to use (early-warning signal) and when to use alternatives ('Cross-reference with get_transactions/get_insider_transactions'). Also recommends excluding 10b5-1 for signal analysis and notes 'Requires Business plan' as a usage restriction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_holdingsARead-only
Institutional 13F-HR positions — filter by ticker (CUSIP resolved to ticker automatically), CUSIP, manager CIK, quarter, or minimum position value. Answers "who owns NVDA" or "which managers hold AAPL this quarter"; pair with get_managers to look up a manager's identity/AUM, or get_transactions to cross-reference insider activity at the same company. Requires Business plan. Paginated, max 100/page.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. | |
| cusip | No | CUSIP identifier of the security — the standard 9-character alphanumeric security identifier (8 chars + 1 check digit), e.g. 037833100. | |
| ticker | No | Stock ticker the position is in, case-insensitive (e.g. AAPL). Resolves via CUSIP → ticker mapping for issuers without direct ticker rows. | |
| quarter | No | Quarter in YYYY-Qn format, e.g. 2026-Q1. Omit for the latest available quarter. | |
| per_page | No | Results per page. Defaults to 20, maximum 100. | |
| min_value | No | Minimum reported position value in USD, inclusive, as of the 13F-HR filing. | |
| manager_cik | No | CIK of the institutional manager (13F-HR filer) — SEC's numeric filer identifier. Leading zeros optional. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnly and openWorld hints. Description adds pagination limit (max 100/page) and plan requirement, which are useful behavioral details beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no redundancy. Efficiently conveys resource, filters, use cases, sibling associations, and constraints (plan, pagination).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only tool with good schema and no output schema, description adequately covers functionality, filtering, pagination, and plan requirement. Missing return format details but acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 7 parameters with descriptions (100% coverage). Description adds context like 'CUSIP resolved to ticker automatically' but mostly summarizes, not adding significant new semantics beyond schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool returns institutional 13F-HR holdings with filtering options. It gives concrete use cases ('who owns NVDA') and distinguishes from siblings like get_managers and get_transactions.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides examples of when to use and pairs with siblings for further lookups. Mentions plan requirement. Lacks explicit when-not-to-use but context is clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_insider_career_summaryARead-only
Aggregate career rollup for one insider by CIK — first/last transaction dates, total shares/value bought vs sold, top companies traded, transaction-code breakdown, 10b5-1 plan split, and average post-trade returns (stored as fractions, e.g. 0.05 = +5%). Use this instead of get_insider_transactions when you want a pre-computed summary rather than raw rows; pair with the generated get_insider_scorecard for hit-rate statistics on their discretionary buys specifically. Requires Pro plan.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | Yes | Insider CIK number — SEC's numeric filer identifier. Leading zeros optional. Example: 1214156 for Tim Cook. Resolve a name to a CIK first with search_insiders if you don't already have it. Note: response return fields are stored as fractions (0.05 = +5%), not percentages. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true. Description adds that it requires a Pro plan and that return fields are fractions (e.g., 0.05 = +5%), complementing annotations without contradiction. No missing behavioral traits.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single paragraph is efficient and front-loaded with the main purpose. Could be slightly more structured (bullets for fields), but no redundancy. Every sentence adds value.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, usage guidance, behavioral nuances, and parameter details. Does not mention error handling or rate limits, but given simplicity (single param, no output schema) and annotations, it is sufficiently complete.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers the CIK parameter fully. Description adds value by noting leading zeros optional, providing a concrete example (Tim Cook), instructing to resolve names via search_insiders, and clarifying return format (fractions).
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it aggregates a career rollup for one insider by CIK, listing specific data fields. It explicitly distinguishes from get_insider_transactions, making its purpose unambiguous and distinct among siblings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit usage guidance: 'Use this instead of get_insider_transactions when you want a pre-computed summary rather than raw rows; pair with the generated get_insider_scorecard'. Provides when-to-use, when-not, and recommended companion tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_insider_directoryARead-only
Browse insiders alphabetically by surname. Returns the A-Z rail with a count per letter, plus one page of insiders under the
requested letter. Omit letter to get the rail and totals with no rows.
Names come from EDGAR surname-first ("HENNEMAN JOHN B III"), so alphabetical order is order by surname. Casing in the source is inconsistent and is not normalised here.
This lists only insiders with at least 3 non-superseded transactions, capped at the
5,000 most active — the same set as the insiders sitemap shard, so the two cannot
drift. To find someone outside that set, use GET /v1/insiders?name= which searches
every filer. Rebuilt daily; refreshedAt reports when. limit is accepted as an alias for
per_page. Not plan-gated.
One row per FILER GROUP. A fund group files a single Form 4 listing several
reporting owners — the fund, its GP, its management company — and each is a real
EDGAR filer with its own CIK. Listing all of them spent about 11% of this capped
surface describing the same actors more than once, so browse shows one per group
and filerGroupSize says how many others share those exact transactions. The
others are not hidden: each keeps its own profile and is still returned by
GET /v1/insiders?name=.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number within the letter. Defaults to 1. | |
| limit | No | Alias for per_page. | |
| letter | No | Single letter A-Z to list, or "#" for names that do not begin with a letter. Omit to get the A-Z rail and totals without any rows. | |
| per_page | No | Rows per page. Defaults to 200, maximum 500. `limit` is accepted as an alias; if both are given, per_page wins. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries the real behavioral burden and does so richly: the 5,000-insider cap, the 3-transaction threshold, daily rebuild with `refreshedAt`, the shared sitemap shard guaranteeing no drift, absence of plan gating, and the filer-group dedup rule with `filerGroupSize` explaining omitted actors. This is well beyond what the annotations provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and return shape are front-loaded in the first two sentences, and each paragraph covers a distinct concern (ordering, dataset membership, filer-group dedup). The closing paragraph on filer groups is somewhat long and includes a supporting statistic, but it earns its place by explaining why rows are deduplicated.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and four parameters, the description fills the gap by describing the rail/counts payload, `refreshedAt`, and `filerGroupSize`, plus how the returned names are ordered and where the data comes from. An agent can call and interpret this tool correctly from the definition alone.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description restates the `letter` omission behavior and the `limit`/`per_page` alias rather than adding new parameter-level meaning (e.g., no guidance on page bounds interaction beyond what the schema already states). The extra 'casing is not normalised' note describes the returned data, not the parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The first sentence states a specific verb and resource (browse insiders alphabetically by surname) and immediately describes the return shape (A-Z rail with per-letter counts plus one page). It also names the alternative surface (GET /v1/insiders?name=), so the agent can distinguish this from the other insider-listing siblings without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit routing conditions: omit `letter` for the rail and totals with no rows, and use GET /v1/insiders?name= to find someone outside the capped 5,000-insider set. It also states eligibility (3+ non-superseded transactions) and that the tool is not plan-gated, which is exactly the when/when-not information an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_insider_leaderboardARead-only
Ranked leaderboard of insiders by buy track-record (Business plan+). Returns the top insiders ranked by historical buy performance — same scored-buy methodology as GET /v1/insiders/{cik}/scorecard, applied across the whole corpus rather than one insider. Use this to discover which insiders have the best track record; use the per-insider scorecard once you have a specific CIK. Scores use absolute return (NOT market-adjusted) — a hit is a scored buy with a positive 3m (or 6m) return anchored at the filing-date close. Only discretionary open-market buys (P-code, not 10b5-1, not derivative) with a matured return are counted. Insiders with fewer than min_trades (floor 5) scored buys are excluded. Requires Business plan or higher (402 PLAN_REQUIRED on Free/Starter/Pro). Results are cached for 1 hour per unique parameter combination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum number of insiders to return. Defaults to 25, maximum 100. | |
| order | No | "hit_rate" (% of scored buys with a positive return) or "avg_return" (mean scored return). Defaults to "hit_rate". | |
| horizon | No | "3m" or "6m" — the post-trade return horizon to score and rank by. Defaults to "3m". | |
| min_trades | No | Minimum number of scored buys an insider must have to be ranked. Defaults to 5; values below 5 are silently raised to 5 (the scorecard sample-sufficiency floor). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses key behavioral traits beyond annotations: uses absolute return (not market-adjusted), only discretionary open-market buys, excludes non-10b5-1 buys, min_trades floor of 5, caching for 1 hour, and plan requirement. These details are not in the readOnlyHint or openWorldHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Well-structured with front-loaded purpose. Each sentence adds value, but the description is relatively long. For the complexity, it's acceptable; minor room for tightening.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers return values implicitly, explains methodology, plan requirement, and caching. Without an output schema, it provides adequate context for an agent to understand what is returned and how it is computed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. The description adds value by explaining the min_trades floor (silently raised to 5) and referencing the scoring methodology. However, it does not enumerate each parameter's details beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns a ranked leaderboard of insiders by buy track record, distinguishing it from the per-insider scorecard sibling tool. It uses specific language like 'ranked leaderboard' and 'scored-buy methodology' to convey purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says 'Use this to discover which insiders have the best track record; use the per-insider scorecard once you have a specific CIK.' It also notes the Business plan requirement and caching behavior, guiding appropriate usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_insider_profileARead-only
Identity card for one insider by CIK (SEC's numeric filer identifier): name, all known titles, and director/officer/10%-owner role flags. Returns NO transactions — when the user asks what an insider bought, sold or filed, use get_insider_transactions (raw rows) or get_insider_career_summary (aggregated rollup) instead. If you only have a name, resolve it to a CIK first with search. Free plan.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | Yes | Insider CIK number — SEC's numeric filer identifier, e.g. 0001214128. Leading zeros optional. Resolve a name to a CIK first with search_insiders if you don't already have it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover readOnlyHint and openWorldHint, but the description adds real context beyond them: what the tool deliberately does NOT return, that no transaction data is included, and a free-plan note. It stops short of describing pagination or failure modes for an unknown CIK, so it is not quite a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, each earning its place: identity-first, then the exclusion and sibling routing, then the CIK-resolution prerequisite and plan note. Front-loaded and free of filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description takes on the burden of describing returns and does so concretely (name, titles, role flags, no transactions). Combined with the sibling routing and prerequisite, an agent has everything needed to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for the single cik parameter, and the description largely restates the same CIK/leading-zeros/resolve-first guidance already in the schema. Baseline 3 applies when the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Identity card for one insider by CIK') and enumerates the returned fields (name, titles, role flags). It explicitly distinguishes itself from get_insider_transactions and get_insider_career_summary, so an agent can tell them apart without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit when-not ('Returns NO transactions') and routes to two named alternatives depending on intent (raw rows vs aggregated rollup). It also covers the prerequisite: resolve a name to a CIK via search/search_insiders first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_insider_scorecardARead-only
Get insider buy track-record scorecard (Pro plan+). Returns the historical hit rate and average/median return of an insider's discretionary open-market buys (TransactionCode=P, excluding 10b5-1 plans and derivatives), plus their best and worst scored buy. Scores use absolute return (NOT market-adjusted) anchored at the filing-date close. A 'hit' is a scored buy whose 3m (or 6m) return is positive. Use this over GET /v1/insiders/{cik}/summary when you specifically want a scored track record (with a sample-sufficiency guard) rather than raw totals; use GET /v1/insiders/leaderboard (Business+) to rank many insiders by this same methodology. Score fields (hitRate3m, avgReturn3m, etc.) are null when the insider has fewer than 5 matured scored buys (sampleSufficient=false), preventing misleading statistics from small samples. Requires Pro plan or higher (402 PLAN_REQUIRED on Free/Starter). Returns 404 NOT_FOUND if the CIK isn't tracked. Computed live — no caching. Note: all return fields (HitRate3m, AvgReturn3m, MedianReturn3m, etc.) are stored as FRACTIONS — 0.05 means +5%, -0.10 means -10%.
| Name | Required | Description | Default |
|---|---|---|---|
| cik | Yes | Insider's SEC CIK, exact match. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (readOnlyHint, openWorldHint), description details scoring methodology (absolute return, anchored at filing close), hit definition, handling of small samples, no caching, and specific return value formats (fractions). No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Description is comprehensive but efficiently structured: opens with purpose, then methodology, usage guidance, edge cases, and format notes. Every sentence adds value without unnecessary repetition.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers all essential aspects: required parameter, output fields (with fraction notation), sample sufficiency guard, error scenarios, plan restrictions, and computational behavior. Suitable for correct invocation despite lack of output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Input schema fully describes the single parameter (cik) with 'exact match'. Description adds contextual value by mentioning plan requirement and 404 error for missing CIK, which aids agent understanding of parameter validation and error handling.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states it returns a scored track record of insider buys, differentiates from sibling tools like get_insider_summary (raw totals) and get_insider_leaderboard (ranking many insiders), and specifies the methodology and output fields.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly describes when to use this tool (for scored track record) versus alternatives, notes plan requirement (Pro+), mentions error conditions (402, 404), and explains when fields are null due to sample insufficiency.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_insider_transactionsARead-only
All Form 4 transactions filed by one insider (by CIK), filterable by ticker, transaction code, date range, and 10b5-1 exclusion. Use this once you have an insider's CIK on hand; get_transactions with insider_cik= gives the same rows alongside its broader filter set, while get_insider_career_summary returns a pre-aggregated rollup instead of raw rows. Free plan. Paginated, max 100/page.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, inclusive, format YYYY-MM-DD (e.g. 2026-12-31). Filters on transactionDate. | |
| cik | Yes | Insider CIK number — SEC's numeric filer identifier, e.g. 0001214128. Leading zeros optional. | |
| code | No | Single SEC transaction code to filter to. P=open-market purchase, S=open-market sale, A=grant/award, M=option exercise, F=tax withholding on vesting, D=disposition to issuer, G=gift, C=conversion of derivative, J=other. | |
| from | No | Start date, inclusive, format YYYY-MM-DD (e.g. 2026-01-01). Filters on transactionDate. | |
| page | No | 1-based page number. Defaults to 1. | |
| ticker | No | Filter to a specific company ticker, case-insensitive, e.g. AAPL. | |
| per_page | No | Results per page. Defaults to 20, maximum 100. | |
| exclude_10b5 | No | If true, exclude pre-scheduled 10b5-1 plan trades — keeps only discretionary transactions. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds that the tool is paginated with a max of 100 per page and is on a free plan, providing useful behavioral context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences: the first states the purpose and filters, the second gives usage guidance. Every sentence adds value, no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 8 parameters and no output schema, the description covers the key aspects: what the tool returns (Form 4 rows), pagination limits, and differentiation from similar tools. It is sufficiently complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents all parameters. The description briefly summarizes the filterable fields (ticker, transactionCode, date range, exclude_10b5) but does not add significant meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool retrieves all Form 4 transactions for a specific insider by CIK, and distinguishes it from siblings by noting that get_transactions provides broader filters and get_insider_career_summary returns aggregated data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use the tool after obtaining an insider's CIK and contrasts it with alternative tools, covering when to use each. Also mentions free plan and pagination limits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_key_activityARead-only
Recent, per-request API activity log for the authenticated key. Returns the most recent HTTP requests made with the authenticated API key, most recent first, including the endpoint path, response status code, duration in milliseconds, and timestamp. Use this to debug integration issues — confirm a specific call reached the API, check for repeated 4xx/5xx responses, or spot slow requests — rather than for usage trends; for aggregate daily counts use GET /v1/keys/usage/history instead. Requires a valid X-Api-Key (401 without one).
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Number of most-recent requests to return. Defaults to 100, maximum 200. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Describes the response structure (endpoint, status, duration, timestamp), auth requirement, and the ordering (most recent first). Annotations indicate readOnly, which aligns; the description adds valuable context beyond annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three concise, front-loaded sentences: function, usage, auth. No wasted words, well structured for quick comprehension.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple interface (1 param, no output schema), the description is complete: covers purpose, return fields, use cases, auth, and alternatives. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and fully describes the 'limit' parameter with defaults and maximum. The description does not add additional meaning beyond what the schema provides, so baseline score of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns recent per-request API activity logs for the authenticated key, and distinguishes it from the sibling tool for aggregate usage trends by name.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly provides when-to-use scenarios (debugging, checking errors, spotting slow requests) and when-not-to-use (usage trends), with a direct reference to the alternative tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_managersARead-only
Browse the institutional manager index — each manager with their latest 13F-HR filing date and AUM. Filter by name (partial match — "Berkshire" returns Berkshire Hathaway) or minimum AUM. Pair with get_holdings to see what a given manager owns. Requires Business plan. Paginated, max 100/page.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Filter by manager name, case-insensitive partial/substring match. Example: "Berkshire" matches Berkshire Hathaway. | |
| page | No | 1-based page number. Defaults to 1. | |
| min_aum | No | Minimum assets-under-management in USD, inclusive, as of the manager's latest filed 13F-HR quarter. | |
| per_page | No | Results per page. Defaults to 20, maximum 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly and openWorld. The description adds value by detailing pagination (max 100/page) and the Business plan requirement, which are behavioral traits not covered by annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is three sentences, each serving a clear purpose: stating the function, explaining filters and pairing, and noting requirements and limits. No redundant information.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only browsing tool with good annotations and schema, the description covers essential usage aspects (filters, companion tool, plan requirement, pagination). No output schema exists, but the return value is implicitly clear.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so baseline is 3. The description reiterates the partial match and minimum AUM filter, but does not add significant new meaning beyond what the schema already provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool browses the institutional manager index with specific data (latest 13F-HR filing date and AUM). It distinguishes itself from siblings by mentioning pairing with get_holdings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides context for use (browsing managers) and suggests pairing with get_holdings. It also notes the Business plan requirement. However, it does not explicitly exclude scenarios where other tools might be better.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_public_statsARead-only
Public corpus-wide statistics — no API key required. Returns headline dataset totals: filing count, transaction count, tracked companies, institutional holdings rows, Form 144 and Form 13F-HR filing counts, the earliest filing date in the corpus, the most recent quarter's total 13F-HR reported AUM in USD, and measured ingestion latency (median/p95 seconds from SEC acceptance to our processing, trailing 7 days). Use this for corpus-wide totals (e.g. a marketing/status widget), not for per-company or per-insider data — those live under GET /v1/companies and GET /v1/insiders. For freshness and coverage-quality metrics (is ingestion stalled, is price data stale) use GET /v1/data-quality instead. Takes no parameters. No API key or plan required. Cached for ~12 hours.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds valuable context: no API key required, cached for ~12 hours, and lists the specific fields returned. Does not contradict annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose and key feature (no API key). It lists the returned fields but could be slightly more concise by grouping related items. Still, every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given zero parameters, no output schema, and clear annotations, the description provides complete context: what it returns, use cases, limitations, caching, and alternatives. No gaps.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters exist, so baseline is 4. Description does not need to add parameter information.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states it returns public corpus-wide statistics and distinguishes itself from sibling tools like get_company_overview and get_data_quality by specifying where to find per-company or per-insider data.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Provides explicit guidance: use for corpus-wide totals (e.g., marketing widget), not for per-company or per-insider data, and suggests alternative endpoints. Also recommends get_data_quality for freshness metrics.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_recent_filingsARead-only
Live feed of the newest SEC Form 4 filings, sorted most-recent-first, optionally filtered to one ticker. New filings typically appear within ~60 seconds of SEC publication. Use this to check "what just happened" rather than get_transactions (built for filtered/historical search across date ranges and codes). Returns per-filing accession number, filed/period-of-report dates, company + insider identity, and transaction count; pass the accession number to get_filing for full detail. Free plan. Paginated, max 100/page.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. | |
| ticker | No | Filter to one stock ticker, case-insensitive, e.g. NVDA. Omit for the unfiltered market-wide feed. | |
| per_page | No | Results per page. Defaults to 20, maximum 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, openWorldHint) already indicate read-only and open-world behavior. Description adds specific behavioral info: new filings appear within ~60 seconds, returns specific fields like accession number, dates, identities, and transaction count. No contradiction with annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences with all key information front-loaded: purpose, sorting, filtering, timing, alternative tool, output summary, and constraints. No wasted words.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema, but description lists returned fields (accession number, dates, identities, transaction count) and mentions subsequent use of get_filing for full detail. Covers timing, filtering, pagination, and sibling comparison. Complete for a simple paginated read tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema covers all 3 parameters with descriptions, so baseline is 3. Description adds extra value by explaining the purpose of the ticker filter, noting pagination and max per_page limit, and describing output fields that imply what parameters control. Slight improvement over schema alone.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it's a live feed of newest SEC Form 4 filings, sorted most-recent-first, with optional ticker filter. Distinguishes from sibling get_transactions by specifying its use case for checking current activity rather than historical search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use this tool ('what just happened') vs. get_transactions (filtered/historical). Also mentions free plan, pagination, and max 100 per page, giving clear operational context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_sentimentARead-only
Monthly insider-sentiment score for a ticker (MSPR-style, -100 to +100; positive = net buying conviction), one point per month, defaulting to roughly the last 12 months. Automatically excludes 10b5-1 plan trades so the score reflects discretionary conviction, not pre-scheduled dispositions. Use get_transactions or get_signals for the trade-level detail behind a given month. Requires Business plan.
| Name | Required | Description | Default |
|---|---|---|---|
| months | No | Number of trailing months of sentiment to return, ending with the most recent. Minimum 1, maximum 60. Omit to use the backend default (~12). | |
| ticker | Yes | Stock ticker symbol, case-insensitive, e.g. AAPL. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint, openWorldHint) are minimal; the description adds critical behavior: automatic exclusion of 10b5-1 plan trades, explaining that the score reflects discretionary conviction. This is beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four concise sentences, front-loaded with the core purpose. Every sentence adds value: purpose, behavioral note, alternative usage, requirement. No redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Despite no output schema, the description adequately explains the return value (one point per month, range -100 to +100). Combined with the schema and minimal annotations, the description is sufficient for a simple read-only tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%; both parameters have clear descriptions. The tool description adds only minor nuance (e.g., case-insensitive for ticker, default months), not significantly beyond what the schema provides.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly specifies the verb (get), resource (insider-sentiment score), and scope (by ticker, monthly, with range -100 to +100). It distinguishes from sibling tools like get_transactions and get_signals by noting they provide trade-level detail.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use alternatives: 'Use get_transactions or get_signals for the trade-level detail behind a given month.' Also notes the Business plan requirement, setting usage prerequisites.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_signalsARead-only
Cluster buy/sell signals — multiple insiders at the same company trading in the same direction within a short window, a stronger conviction signal than any single trade. Excludes 10b5-1 plan trades automatically by construction. Returns signal type, detection date, buyer/seller counts, total $ value, and the underlying transactions. Use this to FIND which companies have signals; when the user already names a company and asks WHY its signal fired or which insiders were in the cluster, call explain_signal with that ticker directly instead. Use get_transactions instead for raw, unaggregated trade search. Requires Business plan (a 402 upgrade_required response is returned otherwise). Paginated, max 50/page.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. | |
| ticker | No | Filter to a specific company ticker, case-insensitive, e.g. NVDA. Omit for a market-wide scan across all companies. | |
| per_page | No | Results per page. Defaults to 20, maximum 50. | |
| cluster_buy | No | If true, return only ClusterBuy signals (multiple insiders buying together). Omit both cluster_buy and cluster_sell to return signals of either type. | |
| cluster_sell | No | If true, return only ClusterSell signals (multiple insiders selling together). Omit both cluster_buy and cluster_sell to return signals of either type. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint/openWorldHint annotations, it discloses that 10b5-1 plan trades are excluded by construction (a non-obvious data-semantics fact), that a Business plan is required with a 402 upgrade_required response otherwise, and that results are paginated at max 50/page. These are exactly the behavioral facts annotations cannot carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the concept definition, then routing, then constraints. No sentence is filler: even the return-field list earns its place because no output schema exists.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description names the returned fields (signal type, detection date, buyer/seller counts, total value, underlying transactions) and covers auth, pagination, and result semantics. Nothing needed to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so page, per_page, ticker, cluster_buy, and cluster_sell are already fully documented, including the omit-both-to-get-either rule. The description adds pagination context but no parameter syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource and defines the domain concept ('multiple insiders at the same company trading in the same direction within a short window'), then distinguishes the tool from both explain_signal and get_transactions by name. An agent can identify this as the market-wide signal-discovery tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: 'Use this to FIND which companies have signals', call explain_signal when a company is already named and the user asks WHY, and use get_transactions for raw unaggregated search. Both alternatives and the selecting conditions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_status_historyARead-only
Measured uptime history for the public status page — trailing 90-day daily breakdown. Returns a daily breakdown of measured API uptime over a trailing 90-day window, computed from an internal heartbeat probe that runs every 5 minutes and performs the same DB-connectivity check as GET /health/ready. Each day in the days array reports the number of 5-minute slots expected to have elapsed (288 for a complete past day, pro-rated for the feature's first day and for today's partial day), how many of those slots recorded a healthy heartbeat, and the resulting uptime percentage for that day — plus an overall percentage (overallPct) across the whole window. start is the earliest date included: either the date of the very first heartbeat ever recorded, or 89 days before today once more than 90 days of history exist. Days before that are never returned. Use this to render an uptime history / status bar; for live corpus freshness use GET /v1/data-quality instead. Takes no parameters. Cached for ~5 minutes; no API key or plan required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already declare readOnlyHint=true and openWorldHint=true, and the description builds on them with substantial behavioral detail: the 5-minute heartbeat cadence, DB-connectivity nature, pro-rating of partial days, 5-minute caching, and no API key or plan requirement. It also explains the semantics of start date and overallPct, which is far beyond what annotations alone provide. There is no contradiction between description and annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is long but every sentence carries useful information: response shape, date window semantics, computation method, intended usage, alternative tool, caching, and auth requirements. It is front-loaded with the core purpose and avoids filler or redundant phrasing.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
There is no output schema, so the description correctly carries the full burden of explaining the return value: the days array, per-day slot counts, uptime percentages, overallPct, and start date behavior. It also covers parameters, caching, and auth requirements. An agent has enough information to call the tool correctly and interpret its response without external context.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool has zero parameters, so there is nothing meaningful to add beyond the empty input schema. The description explicitly states 'Takes no parameters,' which removes any assumption that a timeframe or entity filter might be required. Given the zero-parameter baseline, this is appropriately handled.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb and resource: 'Measured uptime history for the public status page — trailing 90-day daily breakdown.' It clearly distinguishes what the tool returns from other data endpoints, and later explicitly contrasts it with live freshness data from GET /v1/data-quality. This is enough for an agent to understand the tool's distinct purpose.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description is explicit about when to use the tool: 'Use this to render an uptime history / status bar; for live corpus freshness use GET /v1/data-quality instead.' It gives a positive use case, a negative use case, and names the alternative endpoint. No agent would need to infer usage context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_transactionsARead-only
Search SEC Form 4 insider transactions with rich filters: ticker, insider CIK, transaction code/category, date range, a dollar floor (min_value), institutional-ownership trend, and (Pro+) upper trade-size bounds plus post-trade return screening (1d/1w/1m/3m/6m, returns as fractions e.g. 0.05 = +5%). Returns transaction-level rows — shares, price, total value, transaction code, 10b5-1 flag, insider role flags. Use this for filtered or historical search across many companies/insiders; use get_recent_filings for an unfiltered live feed instead, or get_insider_transactions/get_company_insiders when you already have a specific insider or company. Free plan, including min_value; max_value/min_shares/max_shares/min_return_*/max_return_*/has_returns require Pro. Paginated, max 100/page, and paging depth is plan-limited (Free 20 pages, Starter 100, Pro+ unlimited) — for a bulk pull use the REST endpoint GET /v1/transactions/export (Business) instead of paging.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date, inclusive, format YYYY-MM-DD (e.g. 2026-12-31). Filters on transactionDate. | |
| cik | No | Company CIK number — SEC's numeric filer identifier, e.g. 0000320193. Leading zeros optional. | |
| code | No | Single SEC transaction code to filter to. P=open-market purchase, S=open-market sale, A=grant/award, M=option exercise, F=tax withholding on vesting, D=disposition to issuer, G=gift, C=conversion of derivative, J=other. Use `codes` instead to match more than one. | |
| from | No | Start date, inclusive, format YYYY-MM-DD (e.g. 2026-01-01). Filters on transactionDate. | |
| page | No | 1-based page number. Defaults to 1. Paging depth is plan-limited: Free reaches page 20, Starter page 100, Pro and above unlimited; beyond that the call returns 402 with the upgrade path. If you need the full history rather than a page of it, the REST endpoint GET /v1/transactions/export (Business plan) streams the entire filtered set as CSV in one request. | |
| codes | No | Comma-separated list of SEC transaction codes to include, e.g. "P,S" (see `code` for the letter meanings). Multi-code superset of `code`. | |
| ticker | No | Stock ticker symbol, case-insensitive, e.g. AAPL or aapl. Also accepts a comma-separated list of up to 25 symbols (e.g. "AAPL,MSFT") to match any of them in one call; tokens are trimmed and upper-cased, empty tokens are ignored, and more than 25 symbols returns 400. | |
| category | No | Include only one category of transactions. open_market = P/S (the signal most users want); grants = award/comp noise; derivatives = option exercises etc. | |
| filed_to | No | Inclusive end of the filed-date window, format YYYY-MM-DD. Filters on Filing.FiledAt. | |
| per_page | No | Results per page. Defaults to 20, maximum 100. | |
| max_value | No | Maximum trade value in USD (shares × price), inclusive. Requires Pro plan or higher — the whole call is rejected with 403 on Free/Starter, not silently ignored. Use min_value alone to screen by size on a free key. | |
| min_value | No | Minimum trade value in USD (shares × price), inclusive. Available on every plan. | |
| filed_from | No | Inclusive start of the filed-date window, format YYYY-MM-DD. Filters on Filing.FiledAt (when the filing became public), not transactionDate — the two can differ by days to weeks. Use this to replay disclosures in the order the market actually saw them. | |
| max_shares | No | Maximum number of shares, inclusive. Requires Pro plan or higher — the whole call is rejected with 403 on Free/Starter, not silently ignored. | |
| min_shares | No | Minimum number of shares, inclusive. Requires Pro plan or higher — the whole call is rejected with 403 on Free/Starter, not silently ignored. | |
| has_returns | No | If true, only return transactions with at least one computed post-trade return horizon (any of 1d/1w/1m/3m/6m). Requires Pro plan or higher — omitted or ignored on Free. | |
| insider_cik | No | Insider CIK number — SEC's numeric filer identifier, e.g. 0001214128. Leading zeros optional. | |
| significant | No | If true, preset = open-market trades only, no 10b5-1 plan trades, no derivatives. The "just show me real discretionary buys and sells" filter. Explicit params override it. | |
| exclude_10b5 | No | If true, exclude pre-scheduled 10b5-1 plan trades. Recommended for signal analysis — filters out automatic, non-discretionary trades. | |
| exclude_codes | No | Comma-separated list of SEC transaction codes to exclude, e.g. "A,M,F,G" to drop grants, option exercises, tax withholding and gifts. | |
| max_return_1d | No | Maximum 1-day post-trade return as a fraction (e.g. -0.1 = -10%), inclusive. Requires Pro plan or higher — omitted or ignored on Free. | |
| max_return_1m | No | Maximum 1-month post-trade return as a fraction, inclusive. Requires Pro plan or higher — omitted or ignored on Free. | |
| max_return_1w | No | Maximum 1-week post-trade return as a fraction, inclusive. Requires Pro plan or higher — omitted or ignored on Free. | |
| max_return_3m | No | Maximum 3-month post-trade return as a fraction, inclusive. Requires Pro plan or higher — omitted or ignored on Free. | |
| max_return_6m | No | Maximum 6-month post-trade return as a fraction, inclusive. Requires Pro plan or higher — omitted or ignored on Free. | |
| min_return_1d | No | Minimum 1-day post-trade return, as a FRACTION not a percentage (0.05 = +5%), inclusive. Rows with no computed 1-day return are excluded. Requires Pro plan or higher — omitted or ignored on Free. | |
| min_return_1m | No | Minimum 1-month post-trade return as a fraction (0.05 = +5%), inclusive. Requires Pro plan or higher — omitted or ignored on Free. | |
| min_return_1w | No | Minimum 1-week post-trade return as a fraction (0.05 = +5%), inclusive. Requires Pro plan or higher — omitted or ignored on Free. | |
| min_return_3m | No | Minimum 3-month post-trade return as a fraction (0.05 = +5%), inclusive. Requires Pro plan or higher — omitted or ignored on Free. | |
| min_return_6m | No | Minimum 6-month post-trade return as a fraction (0.05 = +5%), inclusive. Requires Pro plan or higher — omitted or ignored on Free. | |
| exclude_category | No | Exclude an entire category of transactions, e.g. exclude_category=derivatives drops all option-related rows. | |
| exclude_derivative | No | If true, drop derivative-security rows — the cleanest single "no options" switch. | |
| inst_ownership_trend | No | Filter by the trailing quarter-over-quarter trend in institutional (13F) ownership of the underlying company. No effect if institutional-ownership enrichment is disabled server-side; rows where the trend was suppressed for insufficient 13F coverage still match "stable". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, so the description carries plan/auth behavior: which params are Free vs Pro, that Pro-gated params cause a 403 rejection rather than silent ignoring, and that paging depth is plan-limited with a 402 beyond the cap. It also states the row contents returned and the date-vs-filed-date distinction, adding context well beyond the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with verb+resource before the filter inventory, and every clause carries operational value (plan gating, alternatives, bulk path). It is dense and somewhat long, with pagination and the export fallback stated twice, so it is efficient rather than flawless.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 33-parameter tool with no output schema, the description covers the return shape, plan requirements, pagination limits, error codes, and sibling routing. Nothing an agent needs to call it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description groups the filters and clarifies the fraction convention (0.05 = +5%), but this is already documented per-parameter in the schema, so it adds little meaning beyond the structured fields.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Search) and resource (SEC Form 4 insider transactions), then enumerates the filter dimensions it supports. It explicitly names the siblings it is not (get_recent_filings, get_insider_transactions, get_company_insiders), so an agent can disambiguate without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit selection rule: use this for filtered/historical multi-company search, use get_recent_filings for an unfiltered live feed, and use the insider/company tools when an entity is already known. It also routes bulk pulls to the REST export endpoint, which is a concrete when-not-this-tool instruction.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_usage_historyARead-only
Daily request counts for the authenticated key over a trailing window. Returns a daily time series of request counts for the authenticated API key over the trailing N days — one data point per calendar day (UTC). Use this to plot usage trends or check rate-limit headroom over time. For a single current-day snapshot (today's count, plan limit, reset time) use GET /v1/keys/usage instead; for a raw request-by-request log use GET /v1/keys/usage/activity. Requires a valid X-Api-Key (401 without one).
| Name | Required | Description | Default |
|---|---|---|---|
| days | No | Number of trailing days to include, ending today (UTC). Defaults to 30, maximum 90. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds specific context: requires valid X-Api-Key (401 otherwise), data is per calendar day UTC, and window is trailing. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences, no wasted words. Front-loaded with core purpose, then usage guidance. Every sentence serves a clear function.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a simple single-parameter tool with no output schema, the description covers purpose, usage guidelines, auth requirement, and return format (daily time series). Could be slightly improved by explicitly stating the output structure (e.g., array of {date, count}).
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents the single parameter 'days' with its default and maximum. The description adds little extra beyond mentioning 'trailing N days' and 'one data point per calendar day'—the latter relates to output, not parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool returns 'daily request counts for the authenticated key over a trailing window' as a time series, and distinguishes itself from siblings by naming specific alternatives for different use cases (single snapshot or raw log).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says when to use this tool ('plot usage trends or check rate-limit headroom over time') and when not to, referencing exact alternative endpoints. Also notes authentication requirement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_webhook_eventsARead-only
Replay webhook delivery events since a given timestamp (default: last 24h). Returns up to 500 delivery attempts across all of the authenticated key's subscriptions since since (default: last 24 hours), most recent first — delivery id, subscription id, event type, attempt count, delivered-at/next-retry-at timestamps, last HTTP status code from the receiving endpoint, whether the delivery is dead (exhausted all retries), and the event payload. Use this to reconcile missed webhook deliveries (e.g. after an outage on your receiving endpoint) rather than relying solely on push delivery. since cannot be more than 30 days in the past. Requires a valid X-Api-Key (401 without one). eventType on each row is the exact name accepted by POST /v1/webhooks and sent in the X-Event-Type delivery header (e.g. "CongressTradeFiled", "ConvergenceSignal" — not dotted names). payload is null and payloadRedacted is true for any event type above your current plan (CongressTradeFiled requires Starter, ConvergenceSignal requires Pro) — delivery history outlives the plan that created it, so payloads are checked against the plan you are on now, not the plan you had when you subscribed.
| Name | Required | Description | Default |
|---|---|---|---|
| since | No | Inclusive lower bound for delivery timestamps, ISO-8601 datetime. Defaults to 24 hours ago. Cannot be more than 30 days in the past (400 INVALID_RANGE). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: discloses the 500-row cap, most-recent-first ordering, the exact returned fields, the dead-delivery flag, the 30-day `since` limit, the 401 auth requirement, and plan-gated payload redaction. This is unusually rich operational context.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the core action, and nearly every sentence carries distinct information (limits, auth, redaction). It is dense and slightly repetitive in restating the 24h default, but not padded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully compensates by enumerating the returned fields and explaining payload nullability and plan gating. An agent has everything needed to call and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single `since` parameter is fully documented in the schema, so the description's restatement of the default and 30-day bound adds little. Baseline 3 is appropriate; the remaining bulk of the description describes response fields, not parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (replay/retrieve) and resource (webhook delivery events) with an explicit default scope (last 24h). It is clearly distinguishable from list_webhooks, which enumerates subscriptions rather than delivery attempts.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names the scenario — reconciling missed deliveries after a receiving-endpoint outage — and contrasts it with relying on push delivery. However it does not name the sibling alternative or state when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
health_ingestionARead-only
Ingestion-death detector — Form 4 freshness, parse-queue health, price-feed freshness. Returns live (uncached) ingestion health: Form 4 processing freshness (stale after 90 minutes during the weekday 06:00-22:00 US Eastern EDGAR activity window, 14 hours outside it), parse-queue health (stale when >50 jobs are pending AND the oldest has waited >45 minutes), and daily price-feed freshness (degraded, never stale, when price bars are >5 days behind). Overall status is "healthy", "degraded" (price feed only), or "stale" (Form 4 or queue). Returns HTTP 503 when stale, 200 otherwise — safe to point an external uptime monitor at directly. No API key or plan required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnlyHint=true and openWorldHint=true annotations, the description reveals key live behaviors: the result is uncached, the exact staleness thresholds for each component, the overall status values, and the HTTP 503/200 response semantics. That is strong behavioral transparency.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Though the description is dense, every clause earns its place: thresholds, status logic, HTTP behavior, and authentication requirements are all covered without fluff. The leading 'Ingestion-death detector' immediately orientates the agent.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, no-output-schema health utility, the description provides all the context an agent needs to invoke it and interpret the result: what is measured, when it is considered stale, what overall statuses occur, and what HTTP status is returned. Nothing crucial is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and schema coverage is 100%, so there are no parameter semantics to document. The baseline for a parameterless tool is appropriate here, and the description correctly focuses on behavior instead of parameters.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a precise resource ('Form 4 freshness, parse-queue health, price-feed freshness') and an actionable verb ('detector'/'Returns live ingestion health'). It clearly differentiates this tool from the broader sibling set focused on filings, insiders, or usage by centering on ingestion pipeline health.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives explicit context on when to use the tool: it can be pointed at directly by an external uptime monitor, and it requires no API key or plan. It does not enumerate alternatives or say 'use X instead of Y', but the use case is clear enough.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_companiesARead-only
List companies with a public ticker, sorted by name or total filings. Returns a single page of companies that have a tracked public ticker — for browsing or building a company picker, not for searching by name or CIK (there is no full-text search here; use GET /v1/companies/{ticker} to fetch one company by its exact ticker). Each entry includes the company's CIK, name, ticker, exchange, total filing count, and distinct insider count. There is no page parameter — this endpoint always returns the top limit companies by the chosen sort order. Not plan-gated.
| Name | Required | Description | Default |
|---|---|---|---|
| sort | No | Sort order: "name" (alphabetical, default) or "totalfilings" (most SEC filings first). Case-insensitive; unrecognized values fall back to "name". | |
| limit | No | Maximum number of companies to return. Defaults to 50, maximum 50. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already indicate readOnly and openWorld. Description adds that it returns a single page, always top limit, sort order behavior (case-insensitive, fallback), and no page parameter. No contradictions.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Single paragraph with logical flow: purpose, usage constraints, entry details, sort behavior. Efficient but could be slightly more concise.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Covers purpose, use cases, entry fields, sort behavior, limits, plan access. No output schema but details what each entry includes, making it complete for agent understanding.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% but description adds meaning: explains sort options (name/totalfilings), default, case-insensitivity, fallback; clarifies limit defaults and max; explains no page parameter.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description clearly states the tool lists companies with public tickers, sorted by name or total filings, for browsing or building a company picker. It distinguishes from sibling tool by directing to use GET /v1/companies/{ticker} for exact ticker search.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use (browsing/picker) and when not (searching by name/CIK), provides alternative endpoint, explains no page parameter and default sort behavior. 'Not plan-gated' adds clarity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_congress_politiciansARead-only
Ranked rollup of politicians by congressional trade activity (Pro plan+). Returns a paginated list of politicians who have at least one non-superseded congressional trade, each with total/buy/sell counts (sells include both Sale and PartialSale; Exchange trades count only toward total) and their most recent trade's disclosure date. Ordered by total trade count descending, ties broken by most recently disclosed. Use this to discover active traders; for one politician's full profile (including their most-traded tickers and recent trades) use GET /v1/congress/politicians/{idOrSlug}. Requires Pro plan or higher (402 PLAN_REQUIRED on Free/Starter). limit is accepted as an alias for per_page. Query runs live — no caching.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. | |
| limit | No | Alias for per_page. | |
| per_page | No | Politicians per page. Defaults to 100, maximum 500. `limit` is accepted as an alias; if both are given, per_page wins. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the readOnlyHint/openWorldHint annotations: sells include both Sale and PartialSale, Exchange trades count only toward total, ordering is total-count desc with recency tie-break, and it discloses the Pro-plan requirement plus the resulting 402 PLAN_REQUIRED for Free/Starter. The 'Query runs live — no caching' note is exactly the kind of runtime trait annotations cannot express.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the resource and the routing guidance, and most sentences carry distinct facts (counts semantics, ordering, plan gate). It is somewhat dense and the alias note slightly restates the schema, but nothing is gratuitous enough to call wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by enumerating the returned fields (total/buy/sell counts, most recent disclosure date), the ordering guarantee, and the filtering precondition. An agent has everything needed to call it correctly and interpret the result.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the description's only parameter claim ('limit is accepted as an alias for per_page') is already stated verbatim in the schema. It adds no syntax, format, or default information beyond what the structured schema provides, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource ('Ranked rollup of politicians by congressional trade activity') and immediately scopes it as a paginated list of politicians with at least one non-superseded trade. It distinguishes itself from list_congress_trades and get_congress_politician by describing the rollup nature and naming the profile endpoint as the alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
'Use this to discover active traders; for one politician's full profile (including their most-traded tickers and recent trades) use GET /v1/congress/politicians/{idOrSlug}' gives an explicit when-to-use and a named alternative with its selection condition. Plan gating is also flagged, so the agent knows the eligibility prerequisite.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_congress_tradesARead-only
Query congressional STOCK Act trades (Free+, plan-clamped disclosure window). Returns a paginated JSON list of congressional periodic-transaction-report trades, most recently DISCLOSED first, with non-superseded rows only (amended-away rows never appear). COVERAGE — HOUSE ONLY TODAY: every trade in this dataset comes from the U.S. House Clerk's PTR index. Senate eFD (efdsearch.senate.gov) returns 403 to datacenter traffic, so no Senate filings are ingested yet. chamber=Senate remains a valid filter but matches nothing and returns the response header X-Coverage-Note: chamber-not-covered, so an empty result is never ambiguous. Scanning by chamber should treat that header as "not covered", not as "no trades". PLAN-CLAMPED WINDOW: this endpoint is open to every plan, but how far back you can see is clamped on disclosureDate — Free sees only trades disclosed in the last 30 days, Starter the last 366 days, Pro/Business/Enterprise unlimited history. Passing an older disclosure_date_from than your plan allows does not extend the window — the floor always wins. Filters: ticker, politician (bioguideId, exact), party (free-text, case-insensitive exact match — not a fixed enum), chamber (House|Senate — see the coverage note above), state (2-letter code), transaction_type (purchase|sale|partial_sale|exchange), min_amount (range-aware — matches AmountLow >= value, never a fabricated midpoint), transaction_date_from/to, disclosure_date_from/to. Every row always carries BOTH amountLow and amountHigh (STOCK Act discloses ranges, never exact figures) and disclosureLagDays = (disclosureDate - transactionDate) in whole days — the STOCK Act allows up to 45 days of lag, so "real-time" here means minutes-after-disclosure, not minutes-after-trade. DATE QUALITY: source dates are sometimes wrong. When a row's dates are impossible or implausible, disclosureLagDays is null and dateQuality names the reason: transaction_after_disclosure (transaction date later than disclosure date), future_transaction_date (transaction date in the future), or implausible_lag (lag above 1500 days, almost always a mistyped year). dateQuality is null on a normal row. Flagged rows are never dropped and their raw transactionDate and disclosureDate are returned unchanged. Genuine late filings with a long but plausible lag keep their disclosureLagDays. For per-politician or per-ticker rollups use GET /v1/congress/politicians, /v1/congress/politicians/{idOrSlug}, or /v1/congress/tickers/{ticker} (all Pro+). To check whether an insider cluster-buy lines up with a congressional purchase in the same ticker, use GET /v1/signals/convergence (Pro+); for the company's own profile use GET /v1/companies/{ticker} (Free). limit is accepted as an alias for per_page. Query runs live against the database — no caching.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. | |
| limit | No | Alias for per_page. | |
| party | No | Party as disclosed by the source, case-insensitive exact match (e.g. "D", "R", "Democratic"). Free-text — not a fixed enum, so this matches whatever string the source reported. | |
| state | No | Two-letter US state/territory code, case-insensitive exact match (e.g. "CA"). | |
| ticker | No | Ticker symbol, case-insensitive exact match (e.g. "AAPL"). | |
| chamber | No | "House" or "Senate", case-insensitive. COVERAGE: this dataset currently holds House PTRs only — Senate eFD blocks datacenter traffic, so chamber=Senate is a valid filter over data we do not yet have and returns an empty array with the response header X-Coverage-Note: chamber-not-covered. | |
| per_page | No | Trades per page. Defaults to 100, maximum 500. `limit` is accepted as an alias; if both are given, per_page wins. | |
| min_amount | No | Minimum disclosed amount, range-aware: matches trades whose AmountLow >= this value. Never matched against a fabricated midpoint — see the amountLow/amountHigh honesty rule. | |
| politician | No | Politician's bioguide ID, exact match (e.g. "P000197"). | |
| transaction_type | No | "purchase", "sale", "partial_sale", or "exchange", case-insensitive. | |
| disclosure_date_to | No | Inclusive end of the disclosure-date window, format YYYY-MM-DD. | |
| transaction_date_to | No | Inclusive end of the transaction-date window, format YYYY-MM-DD. | |
| disclosure_date_from | No | Inclusive start of the disclosure-date window, format YYYY-MM-DD. Subject to the plan-clamped floor below — a Free/Starter caller cannot page back further than their plan allows even by passing an older date here. | |
| transaction_date_from | No | Inclusive start of the transaction-date window, format YYYY-MM-DD. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint and openWorldHint, but the description adds substantial behavioral context: House-only coverage with the Senate 403 reason, plan-clamped disclosure window floors per plan, non-superseded row semantics, live non-cached queries, and date-quality flagging rules. This is far beyond what the annotations convey.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and scope before diving into coverage, plan-clamping, and date quality, with clear ALL-CAPS section headers aiding scanning. It is longer than strictly necessary and lightly repetitive in restating filter behavior, but every section carries information an agent needs.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 14-parameter listing tool with no output schema and no required fields, the description covers the return shape (paginated JSON, most-recently-disclosed-first, non-superseded rows), coverage limitations, plan gating, and data-quality semantics. Nothing critical for correct invocation is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents every parameter, including the chamber coverage caveat and the plan-clamped floor for disclosure_date_from. The description largely restates those same filter semantics rather than adding new meaning, so it sits at the baseline for fully documented schemas.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opening sentence states a specific verb (Query) and resource (congressional STOCK Act trades), with scope qualifiers (Free+, plan-clamped window). It is clearly distinguishable from sibling tools like list_congress_politicians and get_congress_ticker_rollup, which are named and routed away from.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly names alternatives and their conditions: per-politician/per-ticker rollups go to the /v1/congress/* endpoints (Pro+), cluster alignment to /v1/signals/convergence, company profile to /v1/companies/{ticker}. It also tells the agent when chamber=Senate is a dead filter and to read X-Coverage-Note rather than treat empty as 'no trades'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_filingsARead-only
List Form 4 filings with optional ticker, CIK and date filters. Returns a paginated list of Form 4 filings, newest filed first. Filter by ticker, cik, and a from/to filed-date window. Each entry carries the accession number, company ticker/name, period of report, filed date, acceptedAt (the precise UTC SEC-acceptance instant, null if not captured), documentUrl (the public SEC document URL), amendment type (Original/Amendment), and the count of non-superseded transactions in that filing. Use this for a company's filing HISTORY; use GET /v1/filings/recent for a live newest-first feed (it has no page parameter), and GET /v1/transactions when you want the individual trades rather than the filings that contain them. limit is accepted as an alias for per_page. Not plan-gated.
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | Inclusive end of the filed-date window, format YYYY-MM-DD. | |
| cik | No | Company CIK (SEC identifier), e.g. "0000320193". Leading zeros optional. | |
| from | No | Inclusive start of the filed-date window, format YYYY-MM-DD. | |
| page | No | 1-based page number. Defaults to 1. | |
| limit | No | Alias for per_page. Accepted because every caller who hit this path before it existed sent `limit`. | |
| ticker | No | Company ticker symbol, case-insensitive (e.g. "AAPL"). | |
| per_page | No | Filings per page. Defaults to 20, maximum 100. `limit` is accepted as an alias; if both are given, per_page wins. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the readOnly/openWorld annotations, it discloses pagination, newest-filed-first ordering, the null semantics of acceptedAt, the alias behavior of limit, and the access state ('Not plan-gated'). These are exactly the behavioral traits an agent cannot get from the schema or annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose, then return shape, then routing guidance; each sentence carries weight. Slightly long because the filter list is effectively restated from the schema, but there is no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully enumerates the returned fields (accession number, ticker/name, period, filed date, acceptedAt, documentUrl, amendment type, transaction count) and notes pagination and ordering, so an agent knows both how to call it and what it gets back.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so all seven params are already documented in the schema (including the limit/per_page alias and the 'per_page wins' rule). The description restates the ticker/cik/from-to filters but adds no syntax or format detail beyond what the schema provides, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (List) and resource (Form 4 filings) with its filter dimensions, and explicitly distinguishes itself from sibling tools get_recent_filings and get_transactions by naming the alternative endpoints. An agent can identify the tool's role without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states 'Use this for a company's filing HISTORY', names the two alternative tools (recent live feed with no page param; transactions for individual trades) and the conditions that select each. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_schedule13_dgARead-only
List Schedule 13D/13G >5% beneficial-ownership crossings (Business plan+). Returns every parsed >5% beneficial-ownership crossing event for a company — filer/reporting person, ownership percent, event date, form type (13D or 13G), and amendment status — parsed from EDGAR's structured Schedule 13D/13G cover-page XML (mandatory since the SEC's 2023 rule, compliance date 2024-12-18). SC 13D indicates an "active" investor who may seek control or influence over the issuer and must file within five business days of crossing the threshold (shortened from 10 days by the SEC's 2023 rule amendments, effective 2024-02-05); SC 13G is a lighter, less frequent filing for "passive"/qualified investors (e.g. index funds), with its own accelerated deadlines effective 2024-09-30. A single accession can carry several rows when the filing is a joint filing (e.g. a fund, its general partner, and the individual who controls both) — each reporting person has its own ownership percent. Results exclude rows superseded by a later SC 13D/A or SC 13G/A amendment; the isAmendment field on a returned row indicates whether that row is itself an amendment, not whether it has since been superseded. Requires Business plan or higher (402 PLAN_REQUIRED on Free/Starter/Pro). limit is accepted as an alias for per_page. Query runs live against the database — no caching.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | 1-based page number. Defaults to 1. | |
| limit | No | Alias for per_page. | |
| ticker | No | Company ticker symbol, case-insensitive (e.g. "AAPL"). Omit to search across all companies. | |
| per_page | No | Rows per page. Defaults to 50, maximum 200. `limit` is accepted as an alias; if both are given, per_page wins. | |
| form_type | No | Filter to one form type: "13D" (active investor, may seek control/influence) or "13G" (passive/qualified investor). Case-insensitive. Omit for both. | |
| is_amendment | No | When true, only returns amendments (SC 13D/A or SC 13G/A rows). When false, only returns original filings. Omit for both. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that superseded SC 13D/A and 13G/A rows are excluded, that isAmendment describes the row itself rather than supersession, that the query runs live with no caching, and that Free/Starter/Pro get a 402 PLAN_REQUIRED error. These are exactly the operational traits an agent needs that the readOnly/openWorld hints do not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded correctly with the tool's scope in sentence one, but the middle is padded with regulatory lore (2023 rule compliance dates, 10-to-5-day deadline history, 2024-09-30 effective dates) that does not help selection or invocation. The load-bearing facts (superseded-row exclusion, isAmendment semantics, plan gate) have to be dug out of a dense block.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates by naming the returned fields and the joint-filing multi-row behavior. Combined with the plan requirement, live-query note, and alias handling, an agent has everything needed to call it correctly for a read-only listing tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents every parameter including the limit/per_page alias and the 13D/13G meanings. The description largely restates that schema text (e.g. the limit alias) rather than adding new semantics, so the baseline of 3 holds.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource+scope ('List Schedule 13D/13G >5% beneficial-ownership crossings (Business plan+)') and enumerates the returned fields (filer, ownership percent, event date, form type, amendment status). The resource is narrow enough to separate it from generic siblings like list_filings or get_form144, though no sibling is explicitly named for contrast.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied rather than stated: the description explains what 13D vs 13G mean and that results exclude superseded rows, letting an agent infer when this beats a generic filings list. It never says when to prefer this over list_filings/get_filing, nor any when-not condition beyond the plan gate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_webhooksARead-only
List webhook subscriptions owned by the authenticated API key. Returns active webhook subscriptions under the authenticated API key, plus any the system auto-disabled after sustained delivery failures (disabledReason "delivery_failures") — those stay visible with disabledAt/disabledReason set so you can see why delivery stopped and reverse it with POST /v1/webhooks/{id}/enable. Subscriptions you deleted yourself (disabledReason "user_deleted") are never returned here again, and neither are legacy rows disabled before this field existed (disabledReason null) — both are permanently gone from this list. Each entry: subscription id, target URL, subscribed event types, creation date, active flag, disabledAt/disabledReason (both null while active), and the isReadOnly flag. Does NOT return the signing secret again (it's shown once, at creation, by POST /v1/webhooks) — regenerate by deleting and recreating the subscription if it's lost. Requires a valid X-Api-Key (401 without one).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare readOnlyHint/openWorldHint, and the description adds substantial context beyond that: which rows are permanently excluded, that the signing secret is never returned (shown once at creation), and that a valid X-Api-Key is required (401 otherwise). This is exactly the kind of behavioral disclosure annotations can't carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The purpose is front-loaded and every sentence conveys real information, but the text is dense for a zero-param list tool and repeats 'disabledReason' multiple times, making it slightly longer than necessary.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description compensates fully by enumerating the returned entry fields (id, target URL, event types, creation date, active flag, disabledAt/disabledReason, isReadOnly) and the exclusions. An agent has everything needed to interpret results and know the auth requirement.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
There are zero input parameters, so the baseline is 4 and there is no parameter syntax to add. The description instead documents the returned fields, which is useful but belongs to output/behavioral rather than parameter semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with a specific verb+resource: 'List webhook subscriptions owned by the authenticated API key.' This clearly distinguishes it from siblings like get_webhook_events or the many financial-data tools, so an agent can identify the tool's role without opening a schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explains the exact scope of what is and isn't returned (active, auto-disabled, user-deleted, legacy rows) and even points to the remediation path (POST /v1/webhooks/{id}/enable). It doesn't name a sibling alternative, but for a zero-param listing tool there is no obvious competing tool, so guidance is effectively complete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
research_companyARead-only
Bundled insider-research context for one ticker in a single call — company profile, recent insider transactions (10b5-1 flagged), cluster buy/sell signals, monthly sentiment score, and a computed net buy/sell direction summary. Use this FIRST for any company insider-research question; it replaces 4 separate calls (get_company_overview, get_transactions, get_signals, get_sentiment) and degrades gracefully — if signals/sentiment require a plan you don't have, they come back null with an explanatory _unavailable note instead of failing the whole call. Company/transaction data works on Free; signals/sentiment sections require Business. Fetches all sections concurrently. Research and decision-support only, not investment advice.
| Name | Required | Description | Default |
|---|---|---|---|
| ticker | Yes | Stock ticker symbol to research, case-insensitive, e.g. AAPL. Normalized to uppercase internally. | |
| recent_limit | No | Maximum number of recent insider transactions to include in the bundled result. Minimum 1, defaults to 10, maximum 100. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses graceful degradation with null and _unavailable notes, concurrency (fetches all sections concurrently), and plan-based availability (Free vs Business), which go beyond the readOnlyHint and openWorldHint annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is moderately sized but front-loaded with the main purpose, and each sentence adds value; however, it includes a disclaimer that could be separate, preventing a perfect score.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a complex tool with no output schema, the description thoroughly explains the bundled components, plan behavior, concurrency, and degradation, providing sufficient context for an agent.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3. Description does not add significant new information about parameter meaning beyond the schema, though it contextualizes recent_limit within the bundled result.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool bundles company profile, insider transactions, signals, sentiment, and direction summary into one call, and explicitly distinguishes it from four sibling tools it replaces.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly advises to use this tool FIRST for any insider-research question, replaces separate calls, and explains graceful degradation and plan requirements for when to use alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
searchARead-only
Resolve free-text input — a company name, ticker fragment, or a person's name — to a ticker or CIK. This is usually the right FIRST call when a user names a company or insider you don't already have an identifier for; feed the resulting ticker into get_company_overview/get_transactions or the CIK into get_insider_profile/get_insider_transactions. Returns two independently-ranked lists: companies (only ones with a resolved public ticker, ranked exact ticker match, then ticker-prefix, then name-prefix, then name-contains) and insiders (matched by splitting the query on whitespace so every token must match the name, e.g. "tim cook" matches SEC-style "Cook Timothy D"; ranked by total filing count, most active first). Each insider's ticker is a ticker associated with that insider (may be null). q must be 2-64 characters after trimming (400 QUERY_TOO_SHORT/QUERY_TOO_LONG). limit applies independently to each list, default 8, max 20. Free plan, no caching.
| Name | Required | Description | Default |
|---|---|---|---|
| q | Yes | Search text — a company name/ticker fragment and/or a person's name, in any order (e.g. "tim cook" matches insider "Cook Timothy D"). Trimmed before validation; must be 2-64 characters after trimming. | |
| limit | No | Maximum number of results per section (companies, insiders), applied independently to each. Defaults to 8, clamped to 1-20. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare readOnlyHint/openWorldHint, so safety is covered; the description adds substantial context beyond them: two independently-ranked lists, exact ranking algorithms, whitespace-token matching semantics, null ticker possibility, the 2-64 char constraint with specific 400 error codes, limit behavior, and 'Free plan, no caching'.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Dense but front-loaded: the core purpose and primary use case come first, then return shape, then constraints. Every sentence carries information (ranking, matching, limits, errors), though the length is near the upper bound for a search tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description fully covers the return value (two independently-ranked lists with their ranking criteria) and the input constraints, error codes, and scope. Nothing an agent needs to invoke and interpret it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description compensates further by explaining the matching semantics ('splitting the query on whitespace so every token must match') and that limit applies independently to each list, adding meaning beyond the schema's literal text.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb+resource (resolve free-text input to a ticker or CIK) and explicitly identifies itself as 'usually the right FIRST call' when no identifier is known. It clearly differentiates from siblings by naming the downstream tools it routes into (get_company_overview, get_transactions, get_insider_profile, get_insider_transactions).
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use it (user names a company or insider with no known identifier) and what to do with the output. The 'FIRST call' framing plus downstream routing gives the agent a clear decision rule rather than leaving it to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_insidersARead-only
Search insiders (officers, directors, 10% owners) by name. Searches insiders by name and returns a paginated list of matches with each insider's CIK, title, director/officer/10%-owner flags, and total filing count. Use this to resolve a person's name to their CIK before fetching their transaction history, career summary, or scorecard — the CIK returned here feeds directly into GET /v1/insiders/{cik}/transactions, /summary, and /scorecard. Omitting the name filter returns insiders in alphabetical order rather than performing a search. limit is accepted as an alias for per_page. Not plan-gated — available on the Free tier.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Case-insensitive substring match against the insider's full name (e.g. "Musk", "cook"). Must be at least 2 characters — shorter values return a 400 QUERY_TOO_SHORT error. Omit to list all insiders alphabetically. | |
| page | No | 1-based page number. Defaults to 1. | |
| limit | No | Alias for per_page. | |
| per_page | No | Number of insiders per page. Defaults to 20, maximum 500. `limit` is accepted as an alias; if both are given, per_page wins. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/openWorldHint it discloses pagination behavior, the alphabetical fallback when no filter is supplied, the alias precedence rule, the QUERY_TOO_SHORT failure mode, and that the tool is not plan-gated. That is substantial operational context an agent cannot get from the annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with purpose and return contents, then routing guidance, then edge cases in descending priority — zero filler. It is dense at three sentences, but every clause carries information (fields, CIK handoff, omission behavior, alias, tier).
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema, the description still enumerates the returned fields and pagination, and it covers the error path, the no-filter fallback, and plan availability. An agent has everything needed to call it correctly and interpret the response.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the schema already documents `name` matching semantics, the 2-character minimum with its 400 error, `page`/`per_page` defaults and maximum, and the `limit` alias. The description restates the alias and omission behavior but adds no syntax or format detail beyond the schema, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Specific verb+resource ('Search insiders') with the entity qualifier spelled out (officers, directors, 10% owners) and the return shape enumerated (CIK, title, flags, filing count). It is clearly separable from siblings like get_insider_directory and get_insider_profile, which return a person given an identifier rather than resolving a name to one.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states the when-to-use: 'resolve a person's name to their CIK before fetching their transaction history, career summary, or scorecard,' naming the downstream endpoints the CIK feeds. It also documents the degenerate case — omitting `name` returns alphabetical listing rather than searching — so the agent knows not to call it as a plain lister.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_setupARead-only
Diagnostic check: confirms FORM4API_KEY is present and valid, the backend is reachable, and reports your current plan — returns a pass/fail/warn per check plus concrete next steps (where to get a key, how to upgrade) instead of a raw error. Run this first whenever another tool fails or returns a 401/402, to isolate whether the problem is configuration, plan, or a backend outage. No API key or parameters required.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint. The description adds that the tool returns 'pass/fail/warn per check plus concrete next steps' instead of raw errors, and that it can isolate configuration vs. plan vs. backend issues.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three sentences: first states purpose and return format, second tells when to use, third reassures no parameters. No wasted words, front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter, read-only diagnostic tool with no output schema, the description fully explains the return type (pass/fail/warn + next steps) and usage context. Nothing missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
No parameters in schema, and description confirms 'No API key or parameters required'. This adds clarity that nothing is needed, scoring baseline 4 for zero-param tool.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Clearly states it performs a diagnostic check for API key validity, backend reachability, and plan status. It distinguishes itself from siblings like check_usage or get_public_stats by focusing on setup verification.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly tells when to use: 'Run this first whenever another tool fails or returns a 401/402'. Also notes that no API key or parameters are required, guiding the agent to use it as a first step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v1.9.7- Changed
get_convergence_signals2 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Alias for per_page.", + "type": "integer" +} - changed
Input schema / properties / per_page / descriptionPrevious value: -"Converged tickers per page. Defaults to 100, maximum 500."New value: +"Converged tickers per page. Defaults to 100, maximum 500. `limit` is accepted as an alias; if both are given, per_page wins."
- Changed
get_insider_directory2 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Alias for per_page.", + "type": "integer" +} - changed
Input schema / properties / per_page / descriptionPrevious value: -"Rows per page. Defaults to 200, maximum 500."New value: +"Rows per page. Defaults to 200, maximum 500. `limit` is accepted as an alias; if both are given, per_page wins."
- Changed
get_transactions3 fields changed- added
Input schema / properties / filed_fromAdded value: +{ + "description": "Inclusive start of the filed-date window, format YYYY-MM-DD. Filters on Filing.FiledAt (when the filing became public), not transactionDate — the two can differ by days to weeks. Use this to replay disclosures in the order the market actually saw them.", + "type": "string" +} - added
Input schema / properties / filed_toAdded value: +{ + "description": "Inclusive end of the filed-date window, format YYYY-MM-DD. Filters on Filing.FiledAt.", + "type": "string" +} - changed
Input schema / properties / ticker / descriptionPrevious value: -"Stock ticker symbol, case-insensitive, e.g. AAPL or aapl."New value: +"Stock ticker symbol, case-insensitive, e.g. AAPL or aapl. Also accepts a comma-separated list of up to 25 symbols (e.g. \"AAPL,MSFT\") to match any of them in one call; tokens are trimmed and upper-cased, empty tokens are ignored, and more than 25 symbols returns 400."
- Changed
list_congress_politicians2 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Alias for per_page.", + "type": "integer" +} - changed
Input schema / properties / per_page / descriptionPrevious value: -"Politicians per page. Defaults to 100, maximum 500."New value: +"Politicians per page. Defaults to 100, maximum 500. `limit` is accepted as an alias; if both are given, per_page wins."
- Changed
list_congress_trades2 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Alias for per_page.", + "type": "integer" +} - changed
Input schema / properties / per_page / descriptionPrevious value: -"Trades per page. Defaults to 100, maximum 500."New value: +"Trades per page. Defaults to 100, maximum 500. `limit` is accepted as an alias; if both are given, per_page wins."
- Added
list_schedule13_dg - Added
search - Changed
search_insiders2 fields changed- added
Input schema / properties / limitAdded value: +{ + "description": "Alias for per_page.", + "type": "integer" +} - changed
Input schema / properties / per_page / descriptionPrevious value: -"Number of insiders per page. Defaults to 20, maximum 500."New value: +"Number of insiders per page. Defaults to 20, maximum 500. `limit` is accepted as an alias; if both are given, per_page wins."
10 tool updates
v1.9.6- Added
get_congress_politician - Added
get_congress_ticker_rollup - Added
get_convergence_signals - Added
get_insider_directory - Added
get_status_history - Changed
get_transactions17 fields changed- added
Input schema / properties / has_returnsAdded value: +{ + "description": "If true, only return transactions with at least one computed post-trade return horizon (any of 1d/1w/1m/3m/6m). Requires Pro plan or higher — omitted or ignored on Free.", + "type": "boolean" +} - added
Input schema / properties / inst_ownership_trendAdded value: +{ + "description": "Filter by the trailing quarter-over-quarter trend in institutional (13F) ownership of the underlying company. No effect if institutional-ownership enrichment is disabled server-side; rows where the trend was suppressed for insufficient 13F coverage still match \"stable\".", + "enum": [ + "increasing", + "decreasing", + "stable" + ], + "type": "string" +} - added
Input schema / properties / max_return_1dAdded value: +{ + "description": "Maximum 1-day post-trade return as a fraction (e.g. -0.1 = -10%), inclusive. Requires Pro plan or higher — omitted or ignored on Free.", + "type": "number" +} - added
Input schema / properties / max_return_1mAdded value: +{ + "description": "Maximum 1-month post-trade return as a fraction, inclusive. Requires Pro plan or higher — omitted or ignored on Free.", + "type": "number" +} - added
Input schema / properties / max_return_1wAdded value: +{ + "description": "Maximum 1-week post-trade return as a fraction, inclusive. Requires Pro plan or higher — omitted or ignored on Free.", + "type": "number" +} - added
Input schema / properties / max_return_3mAdded value: +{ + "description": "Maximum 3-month post-trade return as a fraction, inclusive. Requires Pro plan or higher — omitted or ignored on Free.", + "type": "number" +} - added
Input schema / properties / max_return_6mAdded value: +{ + "description": "Maximum 6-month post-trade return as a fraction, inclusive. Requires Pro plan or higher — omitted or ignored on Free.", + "type": "number" +} - changed
Input schema / properties / max_shares / descriptionPrevious value: -"Maximum number of shares, inclusive. Requires Pro plan or higher — omitted or ignored on Free."New value: +"Maximum number of shares, inclusive. Requires Pro plan or higher — the whole call is rejected with 403 on Free/Starter, not silently ignored." - changed
Input schema / properties / max_value / descriptionPrevious value: -"Maximum trade value in USD (shares × price), inclusive. Requires Pro plan or higher — omitted or ignored on Free."New value: +"Maximum trade value in USD (shares × price), inclusive. Requires Pro plan or higher — the whole call is rejected with 403 on Free/Starter, not silently ignored. Use min_value alone to screen by size on a free key." - added
Input schema / properties / min_return_1dAdded value: +{ + "description": "Minimum 1-day post-trade return, as a FRACTION not a percentage (0.05 = +5%), inclusive. Rows with no computed 1-day return are excluded. Requires Pro plan or higher — omitted or ignored on Free.", + "type": "number" +} - added
Input schema / properties / min_return_1mAdded value: +{ + "description": "Minimum 1-month post-trade return as a fraction (0.05 = +5%), inclusive. Requires Pro plan or higher — omitted or ignored on Free.", + "type": "number" +} - added
Input schema / properties / min_return_1wAdded value: +{ + "description": "Minimum 1-week post-trade return as a fraction (0.05 = +5%), inclusive. Requires Pro plan or higher — omitted or ignored on Free.", + "type": "number" +} - added
Input schema / properties / min_return_3mAdded value: +{ + "description": "Minimum 3-month post-trade return as a fraction (0.05 = +5%), inclusive. Requires Pro plan or higher — omitted or ignored on Free.", + "type": "number" +} - added
Input schema / properties / min_return_6mAdded value: +{ + "description": "Minimum 6-month post-trade return as a fraction (0.05 = +5%), inclusive. Requires Pro plan or higher — omitted or ignored on Free.", + "type": "number" +} - changed
Input schema / properties / min_shares / descriptionPrevious value: -"Minimum number of shares, inclusive. Requires Pro plan or higher — omitted or ignored on Free."New value: +"Minimum number of shares, inclusive. Requires Pro plan or higher — the whole call is rejected with 403 on Free/Starter, not silently ignored." - changed
Input schema / properties / min_value / descriptionPrevious value: -"Minimum trade value in USD (shares × price), inclusive. Requires Pro plan or higher — omitted or ignored on Free."New value: +"Minimum trade value in USD (shares × price), inclusive. Available on every plan." - changed
Input schema / properties / page / descriptionPrevious value: -"1-based page number. Defaults to 1."New value: +"1-based page number. Defaults to 1. Paging depth is plan-limited: Free reaches page 20, Starter page 100, Pro and above unlimited; beyond that the call returns 402 with the upgrade path. If you need the full history rather than a page of it, the REST endpoint GET /v1/transactions/export (Business plan) streams the entire filtered set as CSV in one request."
- Added
health_ingestion - Added
list_congress_politicians - Added
list_congress_trades - Added
list_filings
18 tool updates
- Changed
explain_signal2 fields changed- added
Input schema / properties / date / descriptionAdded value: +"Exact signal date to explain, format YYYY-MM-DD. Omit to explain the company's most recent signal. Returns 404 SIGNAL_NOT_FOUND if no signal exists for the given (or most recent) date." - added
Input schema / properties / ticker / descriptionAdded value: +"Company ticker symbol, case-insensitive (e.g. \"AAPL\")."
- Changed
get_company_insiders3 fields changed- changed
Input schema / properties / page / descriptionPrevious value: -"Page number"New value: +"1-based page number. Defaults to 1." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (max 100)"New value: +"Results per page. Defaults to 20, maximum 100." - changed
Input schema / properties / ticker / descriptionPrevious value: -"Stock ticker symbol"New value: +"Stock ticker symbol, case-insensitive, e.g. MSFT."
- Changed
get_company_overview1 field changed- changed
Input schema / properties / ticker / descriptionPrevious value: -"Stock ticker symbol, e.g. MSFT"New value: +"Stock ticker symbol, case-insensitive, e.g. MSFT."
- Changed
get_filing1 field changed- changed
Input schema / properties / accession / descriptionPrevious value: -"Accession number, e.g. 0000320193-26-000001"New value: +"SEC accession number in NNNNNNNNNN-YY-NNNNNN format (10-digit filer CIK, 2-digit year, 6-digit sequence), e.g. 0000320193-26-000001. Copy this from a get_recent_filings or get_transactions result."
- Changed
get_form1447 fields changed- changed
Input schema / properties / exclude_10b5 / descriptionPrevious value: -"If true, exclude pre-scheduled 10b5-1 plan filings. Recommended for signal analysis — discretionary sales only."New value: +"If true, exclude pre-scheduled 10b5-1 plan filings. Recommended for signal analysis — discretionary sale-intent notices only." - changed
Input schema / properties / from / descriptionPrevious value: -"Start filing date in ISO 8601 format, e.g. 2026-01-01"New value: +"Start filing date, inclusive, format YYYY-MM-DD (e.g. 2026-01-01)." - changed
Input schema / properties / insider_name / descriptionPrevious value: -"Filter by insider name (partial match)"New value: +"Filter by insider name, case-insensitive partial/substring match, e.g. \"cook\"." - changed
Input schema / properties / page / descriptionPrevious value: -"Page number for pagination"New value: +"1-based page number. Defaults to 1." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (max 100)"New value: +"Results per page. Defaults to 20, maximum 100." - changed
Input schema / properties / ticker / descriptionPrevious value: -"Stock ticker symbol, e.g. AAPL"New value: +"Stock ticker symbol, case-insensitive, e.g. AAPL." - changed
Input schema / properties / to / descriptionPrevious value: -"End filing date in ISO 8601 format, e.g. 2026-12-31"New value: +"End filing date, inclusive, format YYYY-MM-DD (e.g. 2026-12-31)."
- Changed
get_holdings7 fields changed- changed
Input schema / properties / cusip / descriptionPrevious value: -"CUSIP identifier of the security"New value: +"CUSIP identifier of the security — the standard 9-character alphanumeric security identifier (8 chars + 1 check digit), e.g. 037833100." - changed
Input schema / properties / manager_cik / descriptionPrevious value: -"CIK of the institutional manager"New value: +"CIK of the institutional manager (13F-HR filer) — SEC's numeric filer identifier. Leading zeros optional." - changed
Input schema / properties / min_value / descriptionPrevious value: -"Minimum position value in USD"New value: +"Minimum reported position value in USD, inclusive, as of the 13F-HR filing." - changed
Input schema / properties / page / descriptionPrevious value: -"Page number for pagination"New value: +"1-based page number. Defaults to 1." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (max 100)"New value: +"Results per page. Defaults to 20, maximum 100." - changed
Input schema / properties / quarter / descriptionPrevious value: -"Quarter in YYYY-Qn format, e.g. 2026-Q1"New value: +"Quarter in YYYY-Qn format, e.g. 2026-Q1. Omit for the latest available quarter." - changed
Input schema / properties / ticker / descriptionPrevious value: -"Stock ticker the position is in (e.g. AAPL). Resolves via CUSIP → ticker mapping for issuers without direct ticker rows."New value: +"Stock ticker the position is in, case-insensitive (e.g. AAPL). Resolves via CUSIP → ticker mapping for issuers without direct ticker rows."
- Changed
get_insider_career_summary1 field changed- changed
Input schema / properties / cik / descriptionPrevious value: -"Insider CIK number. From SEC EDGAR. Example: 1214156 for Tim Cook."New value: +"Insider CIK number — SEC's numeric filer identifier. Leading zeros optional. Example: 1214156 for Tim Cook. Resolve a name to a CIK first with search_insiders if you don't already have it. Note: response return fields are stored as fractions (0.05 = +5%), not percentages."
- Changed
get_insider_leaderboard4 fields changed- added
Input schema / properties / horizon / descriptionAdded value: +"\"3m\" or \"6m\" — the post-trade return horizon to score and rank by. Defaults to \"3m\"." - added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of insiders to return. Defaults to 25, maximum 100." - added
Input schema / properties / min_trades / descriptionAdded value: +"Minimum number of scored buys an insider must have to be ranked. Defaults to 5; values below 5 are silently raised to 5 (the scorecard sample-sufficiency floor)." - added
Input schema / properties / order / descriptionAdded value: +"\"hit_rate\" (% of scored buys with a positive return) or \"avg_return\" (mean scored return). Defaults to \"hit_rate\"."
- Changed
get_insider_profile1 field changed- changed
Input schema / properties / cik / descriptionPrevious value: -"Insider CIK number, e.g. 0001214128"New value: +"Insider CIK number — SEC's numeric filer identifier, e.g. 0001214128. Leading zeros optional. Resolve a name to a CIK first with search_insiders if you don't already have it."
- Changed
get_insider_scorecard1 field changed- added
Input schema / properties / cik / descriptionAdded value: +"Insider's SEC CIK, exact match."
- Changed
get_insider_transactions8 fields changed- changed
Input schema / properties / cik / descriptionPrevious value: -"Insider CIK number"New value: +"Insider CIK number — SEC's numeric filer identifier, e.g. 0001214128. Leading zeros optional." - changed
Input schema / properties / code / descriptionPrevious value: -"Filter by SEC transaction code"New value: +"Single SEC transaction code to filter to. P=open-market purchase, S=open-market sale, A=grant/award, M=option exercise, F=tax withholding on vesting, D=disposition to issuer, G=gift, C=conversion of derivative, J=other." - changed
Input schema / properties / exclude_10b5 / descriptionPrevious value: -"Exclude pre-scheduled 10b5-1 plan trades"New value: +"If true, exclude pre-scheduled 10b5-1 plan trades — keeps only discretionary transactions." - changed
Input schema / properties / from / descriptionPrevious value: -"Start date ISO 8601"New value: +"Start date, inclusive, format YYYY-MM-DD (e.g. 2026-01-01). Filters on transactionDate." - changed
Input schema / properties / page / descriptionPrevious value: -"Page number"New value: +"1-based page number. Defaults to 1." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (max 100)"New value: +"Results per page. Defaults to 20, maximum 100." - changed
Input schema / properties / ticker / descriptionPrevious value: -"Filter to a specific company ticker"New value: +"Filter to a specific company ticker, case-insensitive, e.g. AAPL." - changed
Input schema / properties / to / descriptionPrevious value: -"End date ISO 8601"New value: +"End date, inclusive, format YYYY-MM-DD (e.g. 2026-12-31). Filters on transactionDate."
- Changed
get_managers4 fields changed- changed
Input schema / properties / min_aum / descriptionPrevious value: -"Minimum AUM in USD at the latest filed quarter"New value: +"Minimum assets-under-management in USD, inclusive, as of the manager's latest filed 13F-HR quarter." - changed
Input schema / properties / name / descriptionPrevious value: -"Filter by manager name (partial, case-insensitive). Example: \"Berkshire\" matches Berkshire Hathaway."New value: +"Filter by manager name, case-insensitive partial/substring match. Example: \"Berkshire\" matches Berkshire Hathaway." - changed
Input schema / properties / page / descriptionPrevious value: -"Page number for pagination"New value: +"1-based page number. Defaults to 1." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (max 100)"New value: +"Results per page. Defaults to 20, maximum 100."
- Changed
get_recent_filings3 fields changed- changed
Input schema / properties / page / descriptionPrevious value: -"Page number"New value: +"1-based page number. Defaults to 1." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (max 100)"New value: +"Results per page. Defaults to 20, maximum 100." - changed
Input schema / properties / ticker / descriptionPrevious value: -"Filter by stock ticker, e.g. NVDA"New value: +"Filter to one stock ticker, case-insensitive, e.g. NVDA. Omit for the unfiltered market-wide feed."
- Changed
get_sentiment2 fields changed- changed
Input schema / properties / months / descriptionPrevious value: -"How many past months of sentiment to return. Defaults to backend default (~12)."New value: +"Number of trailing months of sentiment to return, ending with the most recent. Minimum 1, maximum 60. Omit to use the backend default (~12)." - changed
Input schema / properties / ticker / descriptionPrevious value: -"Stock ticker symbol, e.g. AAPL"New value: +"Stock ticker symbol, case-insensitive, e.g. AAPL."
- Changed
get_signals5 fields changed- changed
Input schema / properties / cluster_buy / descriptionPrevious value: -"Only return cluster buy signals"New value: +"If true, return only ClusterBuy signals (multiple insiders buying together). Omit both cluster_buy and cluster_sell to return signals of either type." - changed
Input schema / properties / cluster_sell / descriptionPrevious value: -"Only return cluster sell signals"New value: +"If true, return only ClusterSell signals (multiple insiders selling together). Omit both cluster_buy and cluster_sell to return signals of either type." - changed
Input schema / properties / page / descriptionPrevious value: -"Page number"New value: +"1-based page number. Defaults to 1." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (max 50)"New value: +"Results per page. Defaults to 20, maximum 50." - changed
Input schema / properties / ticker / descriptionPrevious value: -"Filter to a specific company ticker"New value: +"Filter to a specific company ticker, case-insensitive, e.g. NVDA. Omit for a market-wide scan across all companies."
- Changed
get_transactions13 fields changed- changed
Input schema / properties / cik / descriptionPrevious value: -"Company CIK number"New value: +"Company CIK number — SEC's numeric filer identifier, e.g. 0000320193. Leading zeros optional." - changed
Input schema / properties / code / descriptionPrevious value: -"SEC transaction code. P=purchase, S=sale, A=award, M=option exercise, F=tax withholding, D=disposition"New value: +"Single SEC transaction code to filter to. P=open-market purchase, S=open-market sale, A=grant/award, M=option exercise, F=tax withholding on vesting, D=disposition to issuer, G=gift, C=conversion of derivative, J=other. Use `codes` instead to match more than one." - changed
Input schema / properties / codes / descriptionPrevious value: -"Comma-separated list of SEC transaction codes to include, e.g. \"P,S\". Multi-code superset of `code`."New value: +"Comma-separated list of SEC transaction codes to include, e.g. \"P,S\" (see `code` for the letter meanings). Multi-code superset of `code`." - changed
Input schema / properties / from / descriptionPrevious value: -"Start date in ISO 8601 format, e.g. 2026-01-01"New value: +"Start date, inclusive, format YYYY-MM-DD (e.g. 2026-01-01). Filters on transactionDate." - changed
Input schema / properties / insider_cik / descriptionPrevious value: -"Insider CIK number"New value: +"Insider CIK number — SEC's numeric filer identifier, e.g. 0001214128. Leading zeros optional." - changed
Input schema / properties / max_shares / descriptionPrevious value: -"Maximum number of shares. Pro plan or higher."New value: +"Maximum number of shares, inclusive. Requires Pro plan or higher — omitted or ignored on Free." - changed
Input schema / properties / max_value / descriptionPrevious value: -"Maximum trade value in USD (shares × price). Pro plan or higher."New value: +"Maximum trade value in USD (shares × price), inclusive. Requires Pro plan or higher — omitted or ignored on Free." - changed
Input schema / properties / min_shares / descriptionPrevious value: -"Minimum number of shares. Pro plan or higher."New value: +"Minimum number of shares, inclusive. Requires Pro plan or higher — omitted or ignored on Free." - changed
Input schema / properties / min_value / descriptionPrevious value: -"Minimum trade value in USD (shares × price). Pro plan or higher."New value: +"Minimum trade value in USD (shares × price), inclusive. Requires Pro plan or higher — omitted or ignored on Free." - changed
Input schema / properties / page / descriptionPrevious value: -"Page number for pagination"New value: +"1-based page number. Defaults to 1." - changed
Input schema / properties / per_page / descriptionPrevious value: -"Results per page (max 100)"New value: +"Results per page. Defaults to 20, maximum 100." - changed
Input schema / properties / ticker / descriptionPrevious value: -"Stock ticker symbol, e.g. AAPL"New value: +"Stock ticker symbol, case-insensitive, e.g. AAPL or aapl." - changed
Input schema / properties / to / descriptionPrevious value: -"End date in ISO 8601 format, e.g. 2026-12-31"New value: +"End date, inclusive, format YYYY-MM-DD (e.g. 2026-12-31). Filters on transactionDate."
- Changed
get_webhook_events1 field changed- added
Input schema / properties / since / descriptionAdded value: +"Inclusive lower bound for delivery timestamps, ISO-8601 datetime. Defaults to 24 hours ago. Cannot be more than 30 days in the past (400 INVALID_RANGE)."
- Changed
research_company2 fields changed- changed
Input schema / properties / recent_limit / descriptionPrevious value: -"How many recent insider transactions to include (default 10, max 100)"New value: +"Maximum number of recent insider transactions to include in the bundled result. Minimum 1, defaults to 10, maximum 100." - changed
Input schema / properties / ticker / descriptionPrevious value: -"Stock ticker symbol to research, e.g. AAPL"New value: +"Stock ticker symbol to research, case-insensitive, e.g. AAPL. Normalized to uppercase internally."
4 tool updates
v1.9.2- Changed
get_key_activity1 field changed- added
Input schema / properties / limit / descriptionAdded value: +"Number of most-recent requests to return. Defaults to 100, maximum 200."
- Changed
get_usage_history1 field changed- added
Input schema / properties / days / descriptionAdded value: +"Number of trailing days to include, ending today (UTC). Defaults to 30, maximum 90."
- Changed
list_companies2 fields changed- added
Input schema / properties / limit / descriptionAdded value: +"Maximum number of companies to return. Defaults to 50, maximum 50." - added
Input schema / properties / sort / descriptionAdded value: +"Sort order: \"name\" (alphabetical, default) or \"totalfilings\" (most SEC filings first). Case-insensitive; unrecognized values fall back to \"name\"."
- Changed
search_insiders3 fields changed- added
Input schema / properties / name / descriptionAdded value: +"Case-insensitive substring match against the insider's full name (e.g. \"Musk\", \"cook\"). Must be at least 2 characters — shorter values return a 400 QUERY_TOO_SHORT error. Omit to list all insiders alphabetically." - added
Input schema / properties / page / descriptionAdded value: +"1-based page number. Defaults to 1." - added
Input schema / properties / per_page / descriptionAdded value: +"Number of insiders per page. Defaults to 20, maximum 500."
27 tool updates
v1.0.0- First observed
check_usage - First observed
explain_signal - First observed
get_company_insiders - First observed
get_company_overview - First observed
get_data_quality - First observed
get_filing - First observed
get_form144 - First observed
get_holdings - First observed
get_insider_career_summary - First observed
get_insider_leaderboard - First observed
get_insider_profile - First observed
get_insider_scorecard - First observed
get_insider_transactions - First observed
get_key_activity - First observed
get_managers - First observed
get_public_stats - First observed
get_recent_filings - First observed
get_sentiment - First observed
get_signals - First observed
get_transactions - First observed
get_usage_history - First observed
get_webhook_events - First observed
list_companies - First observed
list_webhooks - First observed
research_company - First observed
search_insiders - First observed
verify_setup
TDQS
Scored across 38 tools
There is real overlap risk (get_transactions vs get_insider_transactions vs get_recent_filings vs list_filings; search vs search_insiders vs get_insider_directory; get_signals vs explain_signal vs get_convergence_signals; check_usage vs get_usage_history vs get_key_activity), but the descriptions explicitly cross-reference each other and state when to prefer which tool, which largely resolves the ambiguity for an agent.
Almost all tools use a consistent snake_case verb_noun pattern (get_*, list_*, search_*), with only minor deviations like the bare `search`, `explain_signal`, and `verify_setup`. Nothing is chaotic or mixed-cased, so the pattern is predictable.
38 tools is heavy, though the server spans several distinct domains (Form 4, Form 144, 13F holdings, Schedule 13D/G, congressional trades, webhooks, key/usage, health). The breadth partly justifies the count, but it sits at the borderline-to-excessive end where consolidation (e.g. merged usage tools or a unified search) would help.
Coverage is broad and read-oriented: companies, insiders, transactions, filings, signals, congress, holdings, usage, and health are all represented, with sensible free-text resolution via `search`. The main gap is the webhook lifecycle — subscriptions can be listed and replayed but never created, edited, enabled, or deleted via tools despite the API supporting it.
Maintenance
Related MCP Connectors
Insidewell: SEC Form 4 insider buys/sells by ticker or whole market, with cluster-buy alerts.
Insidewell: SEC Form 4 insider buys/sells by ticker or whole market, with cluster-buy alerts.
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
Insider trading API + MCP: SEC Form 4 buys/sells, cluster buys. Keys $19/mo; 100 free/day.
Related MCP Servers
- AlicenseAqualityDmaintenanceProvides actionable financial intelligence tools for AI agents including insider buying signals, earnings IV plays, market pulse, stock analysis, and options strategies via free public data sources.6MIT
- AlicenseAqualityBmaintenanceReal-time financial news for AI agents and trading bots — AI-enriched stories with per-ticker analysis, a 1–10 relevance score, SEC Form-4 insider transactions, plus trending and "actionable-now" feeds. Free tier, OAuth, no API key to paste.113MIT
- AlicenseNot gradedqualityAmaintenanceWall Street data feed for AI agents, providing access to 100M+ source-traced SEC records, institutional holdings, insider trades, congress trading, and more via MCP tools.MIT
- AlicenseAqualityCmaintenanceEnables AI agents to query free public market data through 21 tools spanning 29 datasets sourced from SEC EDGAR/XBRL, FINRA, CFTC, the Federal Reserve, USAspending and exchange APIs. Covers short interest, insider and fund holdings, company financials, macro and policy rates, funding rates, crypto market metrics, IPOs and federal contracts, with no API key required to start.22115 npmApache 2.0