@signal8ai/mcp
MCP (Model Context Protocol) server for Signal8 -- AI-extracted SEC filing intelligence data.
Gives AI agents like Claude, Cursor, and other MCP-compatible tools direct access to:
- Company fundamentals (quotes, financials, earnings, float, executives, peers, news)
- Dilution analysis (warrants, convertibles, preferred, shelf registrations, ATMs, equity lines and S-1 offerings, each figure cited to the SEC filing it was read from)
- Dilution Pressure Score (0-100, seven components: shelf capacity, ATM/equity-line capacity, warrants in the money, convertible proximity, cash burn, historical dilution, toxic financing)
- Baby shelf capacity (S-3 General Instruction I.B.6 one-third-of-float cap, recomputed from the live float)
- Cash runway (cash position, monthly burn, capital raises since the last balance sheet)
- Intelligence (counterparties, counsel, insiders, institutions, ROFR triggers, cluster buys)
- Cross-company intelligence (top AUM institutions, cross-company counsel & insider patterns)
- Compliance monitoring (Nasdaq/NYSE deficiency detection, listing classification)
- Company screening (dilution-aware filters with 30+ fields)
- ETF analysis (holdings, sectors, countries, performance, comparables)
Installation
npm install -g @signal8ai/mcp
# or use npx (no install needed)
npx @signal8ai/mcp
Setup
1. Get your API key
API and MCP access are included with Signal8 Pro ($59/mo, or $588/yr). A free Signal8 account cannot create API keys. Upgrade at signal8.ai/pro, then create a key in the developer portal at signal8.ai/developer/api-keys.
Using Claude.ai or Claude Desktop? You can skip the key entirely: add the hosted server as a custom connector and sign in with your Signal8 account (see Hosted Endpoint).
2. Configure your MCP client
Claude Desktop
Add to your Claude Desktop config file:
macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
Windows: %APPDATA%\Claude\claude_desktop_config.json
{
"mcpServers": {
"signal8": {
"command": "npx",
"args": ["-y", "@signal8ai/mcp"],
"env": {
"SIGNAL8_API_KEY": "sk_live_your_key_here"
}
}
}
}
Cursor
Add to .cursor/mcp.json in your project root:
{
"mcpServers": {
"signal8": {
"command": "npx",
"args": ["-y", "@signal8ai/mcp"],
"env": {
"SIGNAL8_API_KEY": "sk_live_your_key_here"
}
}
}
}
Other MCP Clients
Set the SIGNAL8_API_KEY environment variable and run:
SIGNAL8_API_KEY=sk_live_your_key_here npx @signal8ai/mcp
Available Tools (107)
The server exposes 104 live tools at runtime. The reference tables below are
a representative catalog grouped by domain, not an exhaustive list; the
Extractions section documents tools that are currently disabled and not
registered live. The authoritative list is what tools/list returns.
Companies (3 tools)
Company Data (13 tools)
Market — Cross-Ticker (6 tools)
Calendar (5 tools)
SEC Filings & EDGAR archive (10 tools)
Backed by Signal8's own archive of SEC EDGAR filings — the archive's held
range (see archiveFrom in each response; currently from late 2021, expanding
back to 2016 as the history backfill fills in), full-text indexed and updated
through the day. Filings older than archiveFrom may be absent, so an empty
result is not proof a filing was never made. Record-only rows (bodyStored: false) carry metadata but no body.
Full-text query syntax (search_sec_filings.q, search_filing_text.pattern):
unquoted words must all appear; "quoted phrase" for exact wording; OR
between alternatives; -word to exclude; w1 NEAR/10 w2 (or NEAR(10), bare
NEAR = 10) for proximity; word* for a prefix of 4+ letters; $AAPL or a
capitalised ticker scopes to that company; a form code (8-K), item 5.02 /
8-K 1.05 and a bare year scope to that form / 8-K item / year. Relevance page 1
shows a few filings per company; meta.diversity names who has more. How the archive read the
query is returned in meta.understanding (pass understand: false to search
the words literally). facets: true adds per-form / per-year / per-8-K-item
counts over the whole result set — absent when not measured, never zero.
Section search + exhibit types (both search tools): section restricts
matching to business, risk_factors, cybersecurity, legal_proceedings,
mdna, market_risk, controls, ex99 (press releases) or an 8-K item
(item_5_02); exhibitTypes keeps filings with e.g. EX-10 (material
contracts) or EX-99.1. A section is applied only when meta.sections says
so — otherwise meta.unsupported explains that the whole filing was searched.
Rows may carry matchedSections (absent = not measured).
Company filters on search_sec_filings follow the same rules as the
signal8.ai/sec-filings page: they are applied from the archive only, against
the filer's own CIK, on issuer-filed forms only (Form 4, 144 and SCHEDULE 13D/G
are dropped and reported in companyFilter.droppedForms). Companies with no
measured value for a filter are excluded and counted in companyFilter.unknown.
Unknown values return a 400 listing the valid names. If the archive cannot
answer, the call fails with COMPANY_FILTER_NOT_APPLIED and a reason rather
than returning unfiltered rows.
13F values: the SEC changed the unit of a 13F <value> from thousands of
dollars to whole dollars for filings on/after 2023-01-03.
get_filing_structured returns valueUsd / totalMarketValueUsd normalised to
dollars (null when the unit cannot be determined) next to the raw
valueThousands, and valueUnit says which unit the raw number is in.
Extractions (4 tools)
Dilution (7 tools)
Small-cap dilution analysis read directly from SEC filings. Every figure carries the
accession number, filing date and the quoted sentence it came from. Included in
Signal8 Pro. Call get_dilution_coverage first: it
is the cheapest way to learn whether there is anything to fetch.
Not measured is not zero. A null, withheld or unavailable figure means Signal8 did not measure it. It never means the company has no warrants, no shelf or no dilution, and the tool descriptions tell the model so.
Use the explain_dilution prompt to walk a ticker's dilution picture in plain English.
Intelligence — Per-Company (12 tools)
Intelligence — Cross-Company (3 tools)
Compliance (4 tools)
Screener (2 tools)
Events & ATM (2 tools)
ETF (1 tool)
Market Intelligence — Tool Reference
Cross-ticker market and calendar tools that operate over the entire universe rather than a single company. The single-ticker get_quote tool is included here for completeness; the rest were added in the Market Intelligence rollout.
get_quote
Real-time quote for a single ticker (price, change, volume, day range).
Inputs:
Sample output (regular trading hours, 9:30am–4:00pm ET):
{
"data": {
"ticker": "AAPL",
"currentPrice": 178.42,
"change": 2.15,
"changePercent": 1.22,
"high": 179.10,
"low": 176.80,
"open": 177.05,
"previousClose": 176.27,
"preMarketPrice": null,
"preMarketChangePercent": null,
"afterHoursPrice": null,
"afterHoursChangePercent": null,
"timestamp": 1714492800
}
}
Sample output (extended hours — pre-market or after-hours):
{
"data": {
"ticker": "AAPL",
"currentPrice": 178.42,
"change": 2.15,
"changePercent": 1.22,
"high": 179.10,
"low": 176.80,
"open": 177.05,
"previousClose": 176.27,
"preMarketPrice": 179.05,
"preMarketChangePercent": 0.35,
"afterHoursPrice": 178.90,
"afterHoursChangePercent": 0.27,
"timestamp": 1714492800
}
}
Extended-hours windows (US equities, ET): pre-market 4:00am–9:30am, after-hours 4:00pm–8:00pm. Outside those windows
preMarketPrice,preMarketChangePercent,afterHoursPrice, andafterHoursChangePercentarenull. In practice only one pair is populated at a time depending on the current window — the second example shows both populated for illustration.
Use case: "What is AAPL trading at right now?"
get_quotes_batch
Fetch real-time quotes for up to 200 tickers in one call. Backed by POST /api/v1/public/market/quotes. Tickers absent from the upstream feed map to null.
Inputs:
Sample output:
{
"data": {
"count": 3,
"quotes": {
"AAPL": { "ticker": "AAPL", "currentPrice": 178.42, "changePercent": 1.22 },
"MSFT": { "ticker": "MSFT", "currentPrice": 412.10, "changePercent": 0.41 },
"NVDA": null
}
}
}
Use case: "Pull live quotes for my entire 50-ticker watchlist in one call."
get_quotes_universe
Quotes for all constituents of a known index universe (S&P 500, Nasdaq 100, or Dow 30).
Inputs:
Sample output:
{
"data": {
"universe": "dji",
"count": 30,
"quotes": {
"AAPL": { "currentPrice": 178.42, "changePercent": 1.22 },
"MSFT": { "currentPrice": 412.10, "changePercent": 0.41 }
}
}
}
Use case: "Give me a live snapshot of every Dow 30 component."
get_index_snapshot
Bulk daily snapshot (OHLC, volume, % change) for an explicit ticker list (max 50) or the full tracked universe when omitted.
Inputs: none required (optional tickers query when called via REST)
Sample output:
{
"data": {
"count": 2,
"snapshots": [
{ "ticker": "SPY", "close": 512.34, "changePercent": 0.42, "volume": 78321000 },
{ "ticker": "QQQ", "close": 438.21, "changePercent": 0.55, "volume": 41902000 }
]
}
}
Use case: "Show me a one-shot snapshot of where the index ETFs closed."
get_sector_etf_snapshot
Snapshot of the 11 SPDR sector ETFs (XLK, XLF, XLV, XLY, XLP, XLE, XLI, XLB, XLRE, XLU, XLC) with a sector label per row. Useful for sector-rotation views.
Inputs: none
Sample output:
{
"data": {
"count": 11,
"sectors": [
{ "ticker": "XLK", "sector": "Technology", "close": 218.40, "changePercent": 0.85 },
{ "ticker": "XLF", "sector": "Financials", "close": 41.23, "changePercent": -0.12 }
]
}
}
Use case: "Which sectors are leading and lagging today?"
get_top_movers
Top market movers by direction (gainers, losers, or most-active by volume), computed from ticker_snapshots. Excludes warrants/units/ETFs/funds.
Inputs:
Sample output:
{
"data": {
"direction": "gainers",
"session": "regular",
"count": 2,
"movers": [
{ "rank": 1, "ticker": "XYZ", "name": "Acme Corp", "price": 12.34, "changePercent": 42.1, "volume": 12000000, "marketCap": 350000000, "isETF": false },
{ "rank": 2, "ticker": "ABC", "name": "ABC Inc", "price": 5.62, "changePercent": 31.8, "volume": 8400000, "marketCap": 120000000, "isETF": false }
]
}
}
Use case: "What are today's top 10 gainers?"
get_market_breadth
Market breadth aggregates (advance/decline counts and ratio, % of constituents trading above their 50DMA / 200DMA, and counts of new 52-week highs/lows) for a chosen universe. Point-in-time only — no historical breadth.
Inputs:
Sample output:
{
"data": {
"universe": "sp500",
"asOf": "2026-04-30T20:00:00.000Z",
"advancers": 312,
"decliners": 175,
"unchanged": 16,
"advanceDeclineRatio": 1.7828571428571428,
"pctAbove50DMA": 0.642,
"pctAbove200DMA": 0.561,
"new52wHighs": 18,
"new52wLows": 4
}
}
Use case: "How many S&P 500 names are above their 200DMA right now?" or "Add a one-line market-state header to today's commentary tweet."
get_earnings_calendar
Forward-looking and recent earnings releases between two dates. Optionally filter to a list of tickers.
Inputs:
Sample output:
{
"data": {
"events": [
{ "ticker": "AAPL", "date": "2026-05-02", "time": "AMC", "epsEstimate": 1.50, "revenueEstimate": 90100000000 }
],
"total": 1,
"limit": 50,
"offset": 0
}
}
Use case: "Which mega-caps report earnings next week?"
get_economic_calendar
Macroeconomic events (CPI, FOMC, NFP, GDP, etc.) between two dates, filtered by country and impact level.
Inputs:
Sample output:
{
"data": {
"events": [
{ "date": "2026-05-07", "country": "US", "event": "FOMC Rate Decision", "impact": "High", "actual": null, "forecast": "5.25%", "previous": "5.25%" }
],
"total": 1
}
}
Use case: "What high-impact US events land this week?"
get_filing_calendar
Forward-looking 10-K / 10-Q SEC filing-deadline calendar by index universe. Deadlines computed from each company's last-reported period end + filer-status offset.
Inputs:
Sample output:
{
"data": {
"rows": [
{
"ticker": "AAPL", "companyName": "Apple Inc.",
"formType": "10-Q", "periodEnd": "2026-03-29",
"deadline": "2026-05-13", "daysUntilDeadline": 13,
"filerStatus": "large_accelerated"
}
],
"count": 1,
"window": { "from": "2026-04-30", "to": "2026-06-14" },
"universe": "sp500",
"formTypes": ["10-K", "10-Q"]
}
}
Use case: "Which S&P 500 names have a 10-Q deadline in the next two weeks?"
get_lockup_expirations
Upcoming IPO/secondary lockup expirations within a date window. Derived from underwriting-terms extractions (S-1 / F-1 / 424B*) — coverage is partial; check meta.coveragePercent.
Inputs:
Sample output:
{
"data": {
"rows": [
{
"ticker": "NEWCO", "companyName": "NewCo Inc.",
"lockupEndDate": "2026-05-21", "daysUntilExpiry": 21,
"originalFilingType": "S-1", "sharesUnlocking": 24500000,
"sourceFilingUrl": "https://sec.gov/..."
}
],
"meta": {
"coveragePercent": 38.4,
"totalCandidates": 412,
"parsedCount": 158,
"windowStart": "2026-04-30",
"windowEnd": "2026-07-29",
"universe": "all"
}
}
}
Use case: "Any IPO lockup expirations coming up in the next 30 days?"
get_recent_material_filings
Recent 8-K filings flagged as materially significant within a named index universe, optionally filtered by item codes (e.g. 1.01 material agreement, 5.02 leadership change). Lookback fixed at 7 days.
Inputs:
Sample output:
{
"data": {
"universe": "sp500",
"items": ["1.01", "5.02"],
"count": 1,
"filings": [
{
"ticker": "AAPL", "companyName": "Apple Inc.",
"filingDate": "2026-04-29T20:15:00Z", "formType": "8-K",
"items": ["1.01"], "filingUrl": "https://sec.gov/...",
"summary": "Material definitive agreement entered into..."
}
]
}
}
Use case: "Any S&P 500 leadership-change 8-Ks filed this week?"
Resources
Prompts (4)
Hosted Endpoint
For web-based MCP clients, use the hosted Streamable HTTP endpoint:
POST https://mcp.signal8.ai/mcp
Authorization: Bearer sk_live_your_key_here
Content-Type: application/json
Clients that support custom bearer-token headers (e.g. Claude Code CLI's
--transport http connector, Cursor, and VS Code's MCP support) can send your
API key as shown above.
Clients that support MCP OAuth need no key at all. In Claude.ai or Claude
Desktop, open Settings → Connectors → Add custom connector, paste
https://mcp.signal8.ai/mcp, and Claude opens a Signal8 sign-in to authorize
the connection. The server advertises its authorization server at
https://mcp.signal8.ai/.well-known/oauth-protected-resource (OAuth 2.1 with
PKCE and dynamic client registration, issued by https://api.signal8.ai).
OAuth connections are subject to the same Signal8 Pro requirement and rate
limits as API keys.
Environment Variables
Pricing
The MCP server and the REST API it calls are included with Signal8 Pro ($59/mo, or $588/yr) at 120 requests per minute and 10,000 requests per day, with up to 3 API keys. There are no per-call credits or per-request charges: every request the server makes to the Signal8 API counts once against those limits. Free Signal8 accounts do not include API or MCP access. See signal8.ai/developer.
Programmatic Usage
import { createMcpServer, Signal8ApiClient } from '@signal8ai/mcp';
const client = new Signal8ApiClient({
baseUrl: 'https://api.signal8.ai/api/v1/public',
apiKey: 'sk_live_xxx',
});
const server = createMcpServer(client);
// Connect to any MCP transport...
License
MIT -- see the LICENSE file. Copyright (c) 2025-2026 Signal8 AI, Inc.
Use of the hosted Signal8 API and data is additionally governed by the Signal8 Terms of Service.
Signal8 Academy (free, no API key)
The free Signal8 Academy (plain-English guides to
dilution, SEC filings, market structure and using Signal8, plus a glossary) is
available to MCP clients without a Signal8 Pro API key: the local stdio
server answers these even when SIGNAL8_API_KEY is unset. (The hosted endpoint
still asks every tool call to sign in, as for any other tool.)
Tracks: dilution, filings, market-structure, signal8. Content is fetched
from GET /api/v1/public/learn/*, so guide updates appear without a package
release. Links in the Markdown point at signal8.ai.