AI-analyzed SEC filings: filings, analysis, screening, 30-day signals, track record.
One address for any MCP client. No sign-in needed on this server.
6 read1 other
Grouped by tool name.
Odel charges nothing per call. The publisher may charge for its own service.
Chat with SEC filings. Get cited answers and risk scores — free.
StockHuntr is a free AI tool for reading and analyzing SEC filings. Ask about any 10-K, 10-Q, or 8-K in plain English and get clear, cited answers straight from the filing, plus AI risk and concern scoring across 800+ US companies (all S&P 500 constituents). Everything is grounded in primary-source SEC EDGAR data. It also generates 30-day alpha signals as a secondary feature.
It competes with paid AI research tools (Fintool, AlphaSense) and free raw EDGAR — cited AI answers and risk scoring on primary-source filings, at no cost. Research and educational only; not investment advice.
Live at: stockhuntr.net
lib/qa-builders.ts)/queryMODEL.md for full model documentation/learn — Explainer library: plain-language answers about SEC forms and items (10-K vs 10-Q, 8-K items, going concern, EPS surprises, XBRL, Form 4)/sectors & /sectors/[slug] — Sector insight pages with aggregate stats (filings analyzed, avg concern, model accuracy) computed from the corpus/news & /news/[slug] — Daily AI-written news/insights section: a small, significance-gated set (≤4/day, never one-per-filing) of original articles analyzing the most significant recent filings. Each is Claude-written from stored analysis with a strict no-arithmetic/grounded prompt, carries NewsArticle JSON-LD, a visible AI-disclosure line, E-E-A-T provenance (primary-source EDGAR link + methodology), a dynamic OG image, and internal links to the filing/company/sector. Google-News-surfaced via /news-sitemap.xml (48h window, <news:news> tags); auto-syndicated to owned Medium/X/LinkedIn accounts (credential-gated). Not investment advice./pulse — Recurring "SEC Filing Pulse" report: sector concern heat, most significant filings, strongest 30-day signals (ISR-refreshed, Article JSON-LD)/feed.xml) — RSS 2.0 of the most recent AI-analyzed filings (autodiscovery <link> site-wide); consumed by feed readers + news aggregators/compare & /compare/[slug] — Comparison landing pages (e.g. Fintool vs StockHuntr, AlphaSense alternatives, Bloomberg Terminal alternatives)/api/mcp, docs at /mcp) — Remote Model Context Protocol server (Streamable HTTP) with 7 read-only tools: filings, filing analysis, company snapshot, company search, fundamentals screening, top signals, and model track record — for MCP clients (Claude, ChatGPT, agents). Published to the official MCP Registry as io.github.kyliemckinleydemo/sec-filing-analyzer. Discovery manifest at /.well-known/mcp.json. See MCP-GUIDE.md/screener) — Free server-rendered screener: filter 800+ companies by sector, market cap, P/E, dividend yield, and revenue growth; results link to AI-analyzed filings. Works without JS (native GET form); mirrored by the screen_companies MCP toolscripts/export-dataset.ts) — CC-BY-4.0 export of the analyzed-filing corpus (CSV + JSONL + dataset card) for publication on Hugging Face / Kagglesitemap.ts (+ news-sitemap.xml) & robots.ts, RSS feed.xml, public/llms.txt, JSON-LD (Organization / WebSite / SoftwareApplication / FAQPage / Article / NewsArticle / Dataset / BreadcrumbList), Microsoft Clarity analytics, and IndexNow submissionanalyze-filings cron keeps recent filings analyzed in bounded, cost-guarded batchesgenerate-news cron (daily 12:00 UTC) writes the day's ≤4 significant-filing articles via Claude (significance-gated, idempotent, cost-capped); syndicate-news cron (12:30 UTC) cross-posts new articles to owned Medium/X/LinkedIn accounts (credential-gated no-op until keys are set)backfill-predictions cron persists 30-day alpha predictions so Top Signals / Track Record / MCP stay populatedticker-audit cron surfaces ticker-universe drift (delistings, duplicates, missing companies)| Layer | Technology |
|---|---|
| Framework | Next.js 14 (App Router, Server Components) |
| Language | TypeScript |
| Database | PostgreSQL + Prisma ORM |
| AI | Anthropic Claude Sonnet 4.5 |
| Data | SEC EDGAR API, Yahoo Finance (yahoo-finance2), SEC RSS |
| Resend | |
| UI | Tailwind CSS, shadcn/ui, Recharts, Framer Motion |
| AI Interop | Remote MCP server via mcp-handler at /api/mcp |
| Testing | Vitest (244 tests), Playwright (108 E2E tests) |
| Deployment | Vercel (CLI deploy, not GitHub-integrated) |
git clone https://github.com/kyliemckinleydemo/sec-filing-analyzer.git
cd sec-filing-analyzer
npm install
Create .env.local:
# Required
DATABASE_URL="postgresql://user:password@localhost:5432/sec_analyzer"
ANTHROPIC_API_KEY="sk-ant-api03-your-key-here"
# Cron job authentication
CRON_SECRET="your-cron-secret"
# Email alerts (Resend)
RESEND_API_KEY="re_your-key-here"
ALERT_EMAIL="you@example.com"
# Auth
JWT_SECRET="your-jwt-secret"
MAGIC_LINK_SECRET="your-magic-link-secret"
npx prisma generate
npx prisma db push
npm run dev # Development server at localhost:3000
npm test # Run all 244 Vitest tests
npm run test:e2e # Run Playwright E2E tests (108)
sec-filing-analyzer/
├── app/ # Next.js App Router
│ ├── api/
│ │ ├── analyze/[accession]/ # AI filing analysis
│ │ ├── predict/[accession]/ # Price prediction
│ │ ├── filings/latest/ # Latest filings feed
│ │ ├── mcp/ # Remote MCP server (Streamable HTTP)
│ │ ├── cron/ # Automated cron jobs
│ │ │ ├── daily-filings-rss/ # SEC RSS ingestion (CIK-matched) + IndexNow
│ │ │ ├── analyze-filings/ # Automated AI analysis (bounded batches)
│ │ │ ├── backfill-predictions/ # Persist 30-day predictions
│ │ │ ├── ticker-audit/ # Weekly ticker-universe drift audit
│ │ │ ├── update-analyst-data/ # Analyst consensus
│ │ │ ├── update-stock-prices/ # Full price refresh
│ │ │ ├── update-stock-prices-batch/ # Batch rotation
│ │ │ ├── update-macro-indicators/ # Macro data
│ │ │ ├── watchlist-alerts/ # User email alerts
│ │ │ ├── watchlist-alerts-scheduler/ # Alert routing
│ │ │ ├── paper-trading-close-positions/ # Position mgmt
│ │ │ └── supervisor/ # Health monitoring
│ │ ├── auth/ # Magic link auth
│ │ ├── paper-trading/ # Trade execution
│ │ ├── watchlist/ # Watchlist CRUD
│ │ └── chat/ # AI chat
│ ├── components/ # Shared components
│ │ ├── Navigation.tsx # Sticky site header/nav
│ │ ├── Footer.tsx # Site-wide footer
│ │ └── QASection.tsx # Grounded Q&A block (FAQPage JSON-LD)
│ ├── learn/ # Explainer library (+ [slug])
│ ├── sectors/ # Sector insight pages (+ [sector])
│ ├── pulse/ # SEC Filing Pulse report
│ ├── compare/ # Comparison landing pages (+ [slug])
│ ├── latest-filings/ # Filing feed page
│ ├── filing/[accession]/ # Filing detail page
│ ├── company/[ticker]/ # Company page
│ ├── paper-trading/ # Portfolio dashboard
│ ├── watchlist/ # Watchlist page
│ ├── sitemap.ts # Dynamic sitemap.xml
│ ├── robots.ts # robots.txt (allows AI crawlers)
│ ├── layout.tsx # Root layout: nav, JSON-LD, Clarity
│ └── page.tsx # Homepage (SSR initial data)
├── lib/ # Core business logic
│ ├── alpha-model.ts # Alpha prediction model
│ ├── qa-builders.ts # Grounded Q&A pair builders
│ ├── filings-server.ts # Server-side latest-filings query
│ ├── sector-insights.ts # Sector aggregate stats
│ ├── pulse.ts # Pulse report computation
│ ├── indexnow.ts # IndexNow URL submission
│ ├── paper-trading.ts # PaperTradingEngine class
│ ├── supervisor.ts # Cron health monitoring
│ ├── claude-client.ts # Anthropic API client
│ ├── sec-rss-client.ts # SEC RSS feed client (CIK matching)
│ ├── macro-indicators.ts # Macro data fetching
│ ├── auth.ts # JWT + magic link auth
│ ├── rate-limit.ts # API rate limiting
│ └── prisma.ts # Prisma client singleton
├── public/
│ └── llms.txt # LLM/AI-crawler site summary
├── scripts/
│ └── export-dataset.ts # Open dataset export (CSV/JSONL)
├── __tests__/ # Test suite (244 Vitest + 108 E2E)
│ ├── unit/ # Pure logic tests
│ ├── integration/ # API route + service tests
│ │ ├── api/cron/ # All cron job tests
│ │ └── lib/ # Service layer tests
│ ├── e2e/ # Playwright browser tests
│ ├── fixtures/ # Shared test data
│ └── mocks/ # Prisma + module mocks
├── prisma/
│ └── schema.prisma # Database schema
├── scripts/ # Data pipeline scripts
└── vercel.json # Cron schedules + config
The system runs automated jobs via Vercel Cron (see vercel.json):
| Job | Schedule (UTC) | Description |
|---|---|---|
daily-filings-rss | 06:00, 14:00, 22:00 | Fetch SEC filings via RSS (CIK-matched), update company data, run supervisor + IndexNow |
analyze-filings | 07:00, 15:00, 21:00 | Analyze recent unanalyzed filings with Claude in bounded, cost-guarded batches |
backfill-predictions | 08:00 | Persist 30-day alpha predictions for analyzed filings that lack one |
ticker-audit | Mon 06:00 | Weekly audit surfacing ticker-universe drift (delistings, duplicates, gaps) |
update-macro-indicators | 01:00 | S&P 500, VIX, Treasury, sector ETFs |
update-analyst-data | 03:00 | Analyst consensus, target prices, upgrades/downgrades |
update-stock-prices-batch | Every 4h (6x/day) | Batch rotation price updates |
watchlist-alerts | 13:00 (morning), 23:00 (evening) | Email digests for watchlist events |
paper-trading-close-positions | (via supervisor) | Close 30-day expired positions |
supervisor | (via daily-filings) | Health checks, auto-recovery, analysis-coverage & price-freshness checks, email alerts |
All cron endpoints require Authorization: Bearer <CRON_SECRET> or vercel-cron user-agent.
The analyze-filings job only spends on the Anthropic API when ANALYSIS_ENABLED=true (dry-run otherwise).
See CRON-JOBS-README.md for detailed documentation.
npm test # All 244 Vitest tests
npm run test:unit # Unit tests only
npm run test:integration # Integration tests only
npm run test:coverage # With coverage report
npm run test:e2e # Playwright E2E (108 tests)
npm run test:count # Count tests across suites (static)
| Category | Files | Tests | What's Covered |
|---|---|---|---|
| Vitest — Unit | 4 | ~53 | Alpha model, auth, rate limiting, builders |
| Vitest — Integration | 15 | ~191 | Cron jobs, supervisor, paper trading, API routes |
| Playwright — E2E | 14 | ~108 | All pages incl. learn/sectors/pulse/compare, nav, Q&A blocks |
| Total | 33 | ~352 |
See TEST-PLAN.md for detailed test architecture.
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/filings/latest | Latest filings feed (paginated, filterable) |
| GET | /api/sec/company/{ticker} | Company info + filings from SEC EDGAR |
| GET | /api/companies/search | Search companies by ticker/name |
| GET | /api/stock/{ticker} | Stock price data |
| GET/POST | /api/mcp | Remote MCP server — 7 tools (filings, analysis, company, search, screening, top signals, track record) |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/analyze/{accession} | Run AI analysis on a filing |
| GET | /api/predict/{accession} | Generate price prediction |
| POST | /api/chat | AI chat about filings |
| POST | /api/query | Natural language query |
| Method | Endpoint | Description |
|---|---|---|
| GET | /api/cron/daily-filings-rss | Fetch new SEC filings |
| GET | /api/cron/update-analyst-data | Update analyst data |
| GET | /api/cron/update-stock-prices | Refresh stock prices |
| GET | /api/cron/update-stock-prices-batch | Batch price rotation |
| GET | /api/cron/update-macro-indicators | Macro indicator update |
| POST | /api/cron/watchlist-alerts | Send watchlist alerts |
| POST | /api/cron/watchlist-alerts-scheduler | Route alert checks |
| GET | /api/cron/paper-trading-close-positions | Close expired trades |
| GET | /api/cron/supervisor | Health monitoring |
| Variable | Required | Description |
|---|---|---|
DATABASE_URL | Yes | PostgreSQL connection string |
ANTHROPIC_API_KEY | Yes | Anthropic API key for Claude |
CRON_SECRET | Yes | Authentication for cron endpoints |
RESEND_API_KEY | Yes | Resend API key for email alerts |
ALERT_EMAIL | Yes | Email for supervisor alerts |
JWT_SECRET | Yes | Secret for JWT token signing |
MAGIC_LINK_SECRET | Yes | Secret for magic link tokens |
Deployed via Vercel CLI (not GitHub auto-deploy):
npm run deploy # Production deploy with --force
npm run deploy:preview # Preview deployment
This runs vercel --prod --force and sets the stockhuntr.net alias.
After schema changes, sync production DB:
vercel env pull .env.prod
DATABASE_URL=$(grep DATABASE_URL .env.prod | cut -d= -f2-) npx prisma db push
rm .env.prod
See DEPLOYMENT.md for the full deployment guide.
| Document | Description |
|---|---|
README.md | This file — project overview |
DEVELOPER-GUIDE.md | How to work in the repo: build/test/deploy, adding an MCP tool, SEO/GEO patterns, gotchas |
MCP-GUIDE.md | Connecting to and using the remote MCP server (7 tools) |
QUICKSTART.md | Quick start guide for new users |
TEST-PLAN.md | Test architecture and coverage |
CRON-JOBS-README.md | Cron job system documentation |
DEPLOYMENT.md | Vercel deployment guide |
MODEL.md | Alpha Model v1.0 architecture and performance |
PAPER-TRADING-SYSTEM.md | Paper trading engine docs |
CRON-SETUP.md | Email alerts and supervisor setup |
This tool is for educational and research purposes only. Do not use this as financial advice. Always consult with a qualified financial advisor before making investment decisions. Past performance does not guarantee future results.
Built with Next.js, TypeScript, Claude AI, and Vitest