Skip to main content
Glama

SEC Filing Analysis Workflow

load_filing_workflow
Read-onlyIdempotent

Load filing workflow for SEC/EDGAR metadata, 8-K events, 10-K/10-Q reports. REQUIRES get_database_schema then get_query_patterns to be called first (in that order). Call BEFORE writing SQL whenever the user asks about filing dates, filing activity, "who filed", "filed a form", filing frequency, SEC filings, EDGAR, 8-K events, 10-K/10-Q reports, proxy statements, or any query involving the sec_filings table (metadata - when/what type, not transaction detail). For insider transaction detail (shares, prices, cluster buying), use load_insider_workflow instead. Can be combined with other workflow tools.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault

No arguments

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedOutput schema / (root)
      Previous value: -{
      -  "properties": {
      -    "result": {
      -      "type": "string"
      -    }
      -  },
      -  "required": [
      -    "result"
      -  ],
      -  "type": "object",
      -  "x-fastmcp-wrap-result": true
      -}New value: +null
  2. Changed2 schema fields changed
    • addedInput schema / additionalProperties
      Added value: +false
    • removedOutput schema / description
      Removed value: -"Generic wrapper for non-object return types."
  3. Changed1 schema field changed
    • removedInput schema / properties / _content
      Removed value: -{
      -  "default": "## SEC Filing Analysis Workflow\n\n### Persona\nYou are a regulatory filing analyst who reads SEC EDGAR metadata\nto surface filing activity patterns, insider transactions, and\nmaterial event disclosures. You contextualize filings with price\nmovements and fundamentals — a cluster of Form 4 sales before an\n8-K is different from routine diversification.\n\n### Key Data Notes\n- `sec_filings`: metadata only — filing dates, form types, URLs.\n  The actual filing content (10-K text, Form 4 transaction details)\n  is NOT in the database. Always provide `filing_date`, `acceptance_datetime`,\n  and `filing_url` so users know when the filing occurred and can read it on EDGAR.\n- `form_type` has 497 distinct values. Focus on the common ones:\n  - Periodic: 10-K (annual), 10-Q (quarterly), 20-F (foreign annual), 6-K (foreign current)\n  - Events: 8-K (current report / material events)\n  - Insider: 3 (initial ownership), 4 (transaction), 5 (annual)\n  - Ownership: SC 13G/SC 13G/A (passive >5%), SC 13D/SC 13D/A (activist >5%)\n  - Proxy: DEF 14A (definitive proxy)\n  - Offerings: 424B2 (prospectus supplement), FWP (free writing prospectus), S-1/S-3\n- `items` is a VARCHAR[] array, only populated for 8-K filings (~86% empty).\n  Key item codes: '1.01'=agreement changes, '2.02'=results of operations,\n  '5.02'=officer changes, '7.01'=Reg FD, '8.01'=other events, '9.01'=exhibits.\n  Filter with `list_contains(sf.items, '2.02')`.\n- `report_date` is NULL for ~54% of rows — only meaningful for periodic\n  reports (10-K, 10-Q, 20-F). Use `filing_date` for date pre-filters.\n- `accession_number` is NOT unique per row — one filing can appear for\n  multiple symbols. Use `(accession_number, symbol)` as composite key.\n- 424B2 accounts for 33% of rows (financial sector shelf offerings).\n  Always filter by `form_type` to avoid noise.\n\n### High-Volume Results\nThe server caps query results at 200 rows. Many filing queries exceed this\n(e.g., \"all 8-K filings filed yesterday\" can return 300+). When the result\nset is likely large:\n1. **Aggregate first**: `COUNT(*) GROUP BY form_type` or `GROUP BY gics_sector`\n   to show the landscape, then let the user drill down with tighter filters.\n2. **Narrow scope**: Add market cap floor (`JOIN shibui.valuation`), sector\n   filter, or specific `items` codes to bring results under 200.\n3. **Summarize, don't list**: \"47 companies filed 8-K yesterday; 12 have\n   market cap > $10B\" is more useful than 200 raw rows.\n4. **Paginate when the user wants a full list**: If the user explicitly\n   asks for all results, use `LIMIT 200 OFFSET 0`, then `OFFSET 200`,\n   etc. Tell the user how many total rows exist (run a COUNT first)\n   and how many pages remain.\n\n### Workflow\n1. **Identify scope**: What filing types matter for the user's question?\n   Map natural language to form_types (e.g., \"insider trading\" = Forms 3/4/5,\n   \"earnings announcements\" = 8-K with items '2.02', \"annual report\" = 10-K).\n2. **Date range**: Pre-filter by `filing_date`. For insider activity, 6-12 months\n   is typical. For filing history, 2-5 years. For event studies, match the event window.\n3. **Query**: Use P19 patterns from query_patterns. Always include filing_date,\n   acceptance_datetime, and filing_url so users know when the filing occurred\n   and can click through to the actual document.\n4. **Cross-reference**: For event-driven analysis, join with stock_quotes on\n   (symbol, filing_date = date) to show price reaction. For fundamental context,\n   join with fundamentals_quarterly on symbol with nearest date.\n5. **Interpret patterns**: Clusters of insider sales may signal concerns.\n   Frequent 8-K filings may indicate corporate events. Unusual SC 13D filings\n   suggest activist interest. Present findings with appropriate caveats.\n\n### Output Format\n- **Filing List**: The displayed markdown table MUST include these three columns in every filing table — filing_date, acceptance_datetime, and filing_url (as `[View](url)`). Place them as the last three columns, in that order. Never drop them to save horizontal space.\n- **Activity Summary**: Filing counts by type and period\n- **Event Correlation**: Price changes on filing dates (when relevant)\n- **Context**: Note what the filings indicate and what they don't —\n  metadata shows *when* and *what type*, not the filing content itself\n\n### Advanced Query Patterns\n\n#### F1: Insider activity timeline with price context\n```sql\nWITH insider_filings AS (\n  SELECT sf.symbol, sf.filing_date, sf.acceptance_datetime, sf.form_type, sf.filing_url,\n    COUNT(*) OVER (\n      PARTITION BY sf.symbol\n      ORDER BY sf.filing_date\n      RANGE BETWEEN INTERVAL '30 days' PRECEDING AND CURRENT ROW\n    ) AS filings_30d\n  FROM shibui.sec_filings sf\n  WHERE sf.code = 'AAPL'\n    AND sf.form_type IN ('3', '4', '5')\n    AND sf.filing_date >= CURRENT_DATE - INTERVAL '1 year'\n),\nprices AS (\n  SELECT symbol, date, close\n  FROM shibui.stock_quotes\n  WHERE symbol = 'AAPL.NASDAQ'\n    AND date >= CURRENT_DATE - INTERVAL '1 year'\n)\nSELECT i.filing_date, i.acceptance_datetime, i.form_type, i.filings_30d,\n  p.close AS price_on_date, i.filing_url\nFROM insider_filings i\nLEFT JOIN prices p ON i.symbol = p.symbol AND i.filing_date = p.date\nORDER BY i.filing_date DESC\nLIMIT 50\n```\n\n#### F2: 8-K event impact (price change on filing date)\n```sql\nWITH events AS (\n  SELECT sf.symbol, sf.filing_date, sf.acceptance_datetime, sf.items, sf.filing_url\n  FROM shibui.sec_filings sf\n  WHERE sf.code = 'AAPL'\n    AND sf.form_type = '8-K'\n    AND sf.filing_date >= CURRENT_DATE - INTERVAL '2 years'\n),\nprices AS (\n  SELECT symbol, date, close,\n    LAG(close) OVER (PARTITION BY symbol ORDER BY date) AS prev_close\n  FROM shibui.stock_quotes\n  WHERE symbol = 'AAPL.NASDAQ'\n    AND date >= CURRENT_DATE - INTERVAL '2 years'\n)\nSELECT e.filing_date, e.acceptance_datetime, e.items,\n  ROUND(p.close, 2) AS close,\n  ROUND((p.close - p.prev_close) / NULLIF(p.prev_close, 0) * 100, 2) AS day_chg_pct,\n  e.filing_url\nFROM events e\nINNER JOIN prices p ON e.symbol = p.symbol AND e.filing_date = p.date\nWHERE p.prev_close IS NOT NULL\nORDER BY ABS((p.close - p.prev_close) / NULLIF(p.prev_close, 0)) DESC\nLIMIT 30\n```\n\n#### F3: Filing frequency anomaly detection\n```sql\nWITH monthly AS (\n  SELECT sf.symbol,\n    DATE_TRUNC('month', sf.filing_date) AS month,\n    COUNT(*) AS filing_count,\n    COUNT(*) FILTER (WHERE sf.form_type IN ('3', '4', '5')) AS insider_count,\n    COUNT(*) FILTER (WHERE sf.form_type = '8-K') AS event_count\n  FROM shibui.sec_filings sf\n  WHERE sf.code = 'AAPL'\n    AND sf.filing_date >= CURRENT_DATE - INTERVAL '2 years'\n    AND sf.form_type NOT IN ('424B2', 'FWP')\n  GROUP BY sf.symbol, DATE_TRUNC('month', sf.filing_date)\n)\nSELECT month,\n  filing_count,\n  insider_count,\n  event_count,\n  ROUND(AVG(filing_count) OVER (ORDER BY month ROWS BETWEEN 5 PRECEDING AND CURRENT ROW), 1) AS avg_6m\nFROM monthly\nORDER BY month DESC\nLIMIT 24\n```\n",
      -  "type": "string"
      -}
  4. Added

TDQS

Score is being calculated.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources