@signal8ai/mcp
v0.9.0
Published
Signal8 MCP Server - SEC filing intelligence for AI agents
Maintainers
Readme
@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 risk scoring (0-100 Dilution Pressure Score with 5-dimension assessment)
- SEC filing extractions (warrants, convertibles, shelf registrations, and 10 more types)
- Instrument lifecycle tracking (warrants, convertibles, ATMs with XBRL reconciliation)
- 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/mcpSetup
1. Get your API key
Sign up at signal8.com/settings/api-keys to get your API key.
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/mcpAvailable Tools (60)
Companies (3 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| search_companies | Search companies by name or ticker | 1 |
| get_company_profile | Full company profile (description, market cap, sector) | 1 |
| get_company_bundle | Consolidated data bundle in one call | 25 |
Company Data (13 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| get_quote | Real-time stock quote (price, change, volume) | 1 |
| get_market_metrics | Volume averages, volatility, SMAs, trend direction | 3 |
| get_short_interest | Short interest data and days-to-cover | 3 |
| get_float | Float composition, shares outstanding, ownership % | 3 |
| get_financials | Income statement, balance sheet, cash flow | 5 |
| get_earnings | Earnings history with EPS surprises | 3 |
| get_executives | Executive team roster and compensation | 1 |
| get_peers | Peer/comparable companies | 1 |
| get_transcripts | Earnings call transcripts | 3 |
| get_news | Latest company news headlines | 1 |
| get_analyst_consensus | Analyst ratings and price targets | 3 |
| get_material_events | Material corporate events (8-K filings) | 3 |
| get_clinical_trials | Clinical trial pipeline (biotech/pharma) | 3 |
Market — Cross-Ticker (6 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| get_quotes_batch | Batch real-time quotes for up to 200 tickers (POST) | max(1, ceil(N/10)) |
| get_quotes_universe | Quotes for an entire index universe (sp500/ndx/dji) | 5 |
| get_index_snapshot | Bulk ticker snapshots (price, day change, % change) | 1 |
| get_sector_etf_snapshot | Snapshot of the 11 SPDR sector ETFs with sector labels | 2 |
| get_top_movers | Top gainers / losers / most-active by volume (with optional session window) | 2 |
| get_market_breadth | Advance/decline, % above SMA50/200, 52-week high/low counts | 2 |
Calendar (5 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| get_earnings_calendar | Upcoming/recent earnings releases between two dates | 3 |
| get_economic_calendar | Macro/economic events (CPI, FOMC, jobs, GDP) by date and country | 3 |
| get_filing_calendar | 10-K / 10-Q SEC filing-deadline calendar by universe | 5 |
| get_lockup_expirations | Upcoming IPO/secondary lockup expirations | 5 |
| get_recent_material_filings | Recent material 8-K filings by index universe and item codes | 5 |
Extractions (4 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| get_extractions | AI-extracted SEC filing data (13 types) | 5 |
| get_filing_extractions | Extractions for a specific SEC filing | 5 |
| get_extraction_dashboard | Cross-company extraction analytics | 50 |
| get_extraction_by_type | Filter extractions by type (warrants, convertibles, etc.) | 5 |
Dilution (5 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| get_dilution_risk | Dilution Pressure Score (0-100) with 5-dimension assessment | 5 |
| get_dilution_performance | Post-dilution stock performance at +1d/+7d/+30d/+90d | 10 |
| get_instruments | Active warrants, convertibles, ATMs, shelf registrations | 5 |
| get_instrument_detail | Deep dive on a single instrument | 5 |
| get_baby_shelf | IB6 baby shelf remaining capacity | 10 |
Intelligence — Per-Company (12 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| get_counterparties | Entity-resolved counterparty relationships | 10 |
| get_counsel | Legal counsel engagements with role taxonomy | 10 |
| get_insiders | Insider trading discovery and patterns | 10 |
| get_ownership | Unified ownership (Form 4 + 13F + 13D/G) | 10 |
| get_rofr_triggers | ROFR exercise trigger detection | 10 |
| get_institutions | Institutional holders from 13F filings | 10 |
| get_institution_detail | Detailed info for a specific institution (by CIK) | 10 |
| get_institution_holdings | Full portfolio holdings for an institution | 10 |
| get_banks | Investment bank relationships from SEC filings | 10 |
| get_legal_counsels | Legal counsel relationships with partner names | 10 |
| get_insider_transactions | Detailed Form 4 transaction history | 5 |
| get_insider_cluster_buys | Cluster buying pattern detection (3+ insiders in 14 days) | 10 |
Intelligence — Cross-Company (3 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| get_institution_top_aum | Top institutional holders by AUM across all companies | 25 |
| get_counsel_cross_company | Law firm engagements across multiple companies | 25 |
| get_insider_cross_company | Insider trading patterns across multiple companies | 25 |
Compliance (4 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| get_compliance | Full compliance evaluation | 25 |
| get_deficiencies | Listing deficiency detection | 10 |
| get_compliance_alerts | Active compliance alerts | 5 |
| get_listing_classification | Exchange listing classification | 10 |
Screener (2 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| get_screener_fields | Discover available screening filters | 1 |
| screen_companies | Dilution-aware company screener | 25 |
Events & ATM (2 tools)
| Tool | Description | Credits |
|------|-------------|---------|
| get_events | Unified corporate events | 5 |
| get_atm_activity | ATM program monitoring | 5 |
ETF (1 tool)
| Tool | Description | Credits |
|------|-------------|---------|
| get_etf_bundle | Aggregated ETF data (profile, holdings, sectors, performance) | 25 |
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:
| Name | Type | Required | Description |
|------|------|----------|-------------|
| ticker | string | yes | Ticker symbol (e.g. AAPL) |
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:
| Name | Type | Required | Description | |------|------|----------|-------------| | tickers | string[] | yes | 1–200 ticker symbols |
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:
| Name | Type | Required | Description |
|------|------|----------|-------------|
| universe | enum | yes | One of sp500, ndx, dji |
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:
| Name | Type | Required | Description |
|------|------|----------|-------------|
| direction | enum | yes | gainers, losers, or active |
| limit | integer | no | 1–100 (backend default applied when omitted) |
| session | enum | no | premarket (4:00–9:30 AM ET), regular (default; close-to-close), or afterhours (4:00–8:00 PM ET). Use premarket/afterhours when posting outside RTH so rankings reflect the live window. |
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:
| Name | Type | Required | Description |
|------|------|----------|-------------|
| universe | enum | no | sp500 (default), ndx, or all |
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:
| Name | Type | Required | Description | |------|------|----------|-------------| | from | string (YYYY-MM-DD) | yes | Window start | | to | string (YYYY-MM-DD) | yes | Window end | | tickers | string[] | no | Optional ticker filter |
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:
| Name | Type | Required | Description |
|------|------|----------|-------------|
| from | string (YYYY-MM-DD) | yes | Window start |
| to | string (YYYY-MM-DD) | yes | Window end |
| country | string (ISO-2) | no | Defaults to US |
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:
| Name | Type | Required | Description |
|------|------|----------|-------------|
| from | string (YYYY-MM-DD) | no | Default today |
| to | string (YYYY-MM-DD) | no | Default today + 45d |
| universe | enum | no | sp500, ndx, dji, or all (default) |
| formTypes | string[] | no | Subset of ["10-K", "10-Q"] |
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:
| Name | Type | Required | Description |
|------|------|----------|-------------|
| from | string (YYYY-MM-DD) | no | Default today |
| to | string (YYYY-MM-DD) | no | Default today + 90d |
| universe | enum | no | sp500, ndx, dji, or all (default) |
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:
| Name | Type | Required | Description |
|------|------|----------|-------------|
| universe | enum | yes | sp500, ndx, or dji |
| items | string[] | no | 8-K item codes (e.g. ["1.01", "2.01"]) |
| limit | integer | no | 1–200 (default 50) |
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
| Resource | URI | Description |
|----------|-----|-------------|
| Company Profile | signal8://companies/{ticker}/profile | Enriched company profile by ticker |
| Extraction Types | signal8://extraction-types | List of all 13 SEC filing extraction types |
Prompts (4)
| Prompt | Arguments | Description |
|--------|-----------|-------------|
| analyze_dilution_risk | ticker (string) | 6-step dilution risk analysis workflow |
| company_due_diligence | ticker (string) | 10-step comprehensive due diligence research |
| screening_workflow | sector?, marketCapMax? (string) | 5-step discover-screen-analyze workflow |
| institutional_analysis | ticker (string) | 6-step institutional ownership & smart money analysis |
Hosted Endpoint
For web-based MCP clients, use the hosted Streamable HTTP endpoint:
POST https://mcp.signal8.com/mcp
Authorization: Bearer sk_live_your_key_here
Content-Type: application/jsonEnvironment Variables
| Variable | Required | Description |
|----------|----------|-------------|
| SIGNAL8_API_KEY | Yes | Your Signal8 API key (starts with sk_live_ or sk_test_) |
| SIGNAL8_API_URL | No | API base URL (default: https://api.signal8.com) |
Pricing
Each tool call consumes credits based on the endpoint it accesses. See credit costs in the tools table above. Get your free tier (100 credits/day) at signal8.com.
Programmatic Usage
import { createMcpServer, Signal8ApiClient } from '@signal8ai/mcp';
const client = new Signal8ApiClient({
baseUrl: 'https://api.signal8.com',
apiKey: 'sk_live_xxx',
});
const server = createMcpServer(client);
// Connect to any MCP transport...License
Proprietary - see signal8.com/terms
