filings-search
filings-search
Híbrido (BM25 + kNN) recuperación basada en agentes sobre presentaciones 10-K de la SEC, en OpenSearch, con un agente de uso de herramientas de Claude que planifica sus propias búsquedas y responde con citas por afirmación y una verificación estricta de fundamentación numérica. Interfaz FastAPI + servidor de herramientas MCP en TypeScript. Construido como el sucesor de OpenSearch de mi pipeline Qdrant; la fundamentación de citar o abstenerse está adaptada de mi envoltorio de procedencia de 12 dominios.
EDGAR ──► connector ──► section splitter ──► chunker ──► embeddings ──► OpenSearch (BM25 + HNSW kNN)
(SEC API) (ticker→CIK, (Item 1/1A/1C/7/8…) (450 tok, (nomic-embed-text │
10-K list, order-constrained, 60 overlap) local via Ollama, or │
iXBRL strip) x-ref filtered) OpenAI) ▼
hybrid search (RRF) + filters
│
┌───────────────────────────────┼─────────────────────┐
▼ ▼ ▼
FastAPI /search /ask TS MCP server eval harness
/chunk /companies (search_filings, ask_filings) (P@k/MRR, LLM-judge)
▲
Claude agent (tool loop):
resolve_company → search_filings (item/ticker/FY filters, hybrid|bm25|knn)
→ expand_chunk → answer with [c:chunk_id] cites → numeric grounding checkQué incluye
Capa | Archivo | Notas | ||
Conector |
| Mapa de tickers de la SEC + fallback de browse-edgar (maneja CIKs de shell sucesor), envíos de | ||
Análisis |
| Divisor de ítems 10-K: encabezados verificados por título, filtro de referencias cruzadas, orden canónico + selección de tramo más largo (derrota filas de tabla de contenido) | ||
Fragmentación |
| Respetando párrafos, limitado por tokens (solapamiento 450/60), ids de fragmento deterministas `sha1(accession | item | idx)` |
Incrustaciones |
|
| ||
Índice |
| Mapeo de OpenSearch 2.19: campo BM25 con analizador inglés + | ||
Recuperación |
|
| ||
Agente |
| Bucle de herramientas de Claude ( | ||
API |
| FastAPI: | ||
MCP |
| Servidor MCP stdio en TypeScript que expone | ||
Evaluación |
|
|
Related MCP server: edgar-mcp
Ejecútalo
docker compose up -d # OpenSearch 2.19 (knn + neural plugins), :9200
ollama pull nomic-embed-text # local embeddings
python3.12 -m venv .venv && ./.venv/bin/pip install -r requirements.txt
./.venv/bin/python ingest.py --recreate AAPL MSFT NVDA JPM XOM WMT TSLA JNJ # ~2 min, 8 filings, ~2.1k chunks
./run_api.sh # FastAPI on :8801
./.venv/bin/python -m filings_search.agent "What does NVIDIA disclose about export controls to China?"
./.venv/bin/python eval/run_retrieval_eval.py
./.venv/bin/python eval/run_grounding_eval.pyMCP (Claude Desktop / Claude Code / Cursor):
{"mcpServers": {"filings-search": {"command": "node", "args": ["/ABS/PATH/filings-search/mcp/dist/server.js"],
"env": {"FILINGS_API_URL": "http://127.0.0.1:8801"}}}}Configuración mediante variables de entorno: FS_OPENSEARCH_URL, FS_INDEX, FS_EMBED_BACKEND=ollama|openai, FS_AGENT_MODEL, FS_JUDGE_MODEL, SEC_USER_AGENT. ANTHROPIC_API_KEY (o ~/.env) para el agente/juez.
Resultados (2026-08-18, 8 presentaciones / 2.101 fragmentos, 28 consultas etiquetadas)
Recuperación — ver eval/retrieval_results.json:
configuración | modo | acierto@1 | acierto@5 | MRR@10 | media ms |
sin filtrar | bm25 | 0.571 | 0.857 | 0.686 | 5.7 |
sin filtrar | knn | 0.679 | 0.857 | 0.759 | 29.7 |
sin filtrar | hybrid | 0.679 | 0.857 | 0.759 | 37.9 |
filtrado por ticker | bm25 | 0.679 | 0.929 | 0.772 | 3.8 |
filtrado por ticker | knn | 0.679 | 0.893 | 0.779 | 26.6 |
filtrado por ticker | hybrid | 0.714 | 0.929 | 0.812 | 34.9 |
Fundamentación del agente — 10 preguntas de analistas, agente claude-opus-5 + juez claude-opus-5 (ver eval/grounding_results.json):
métrica | valor |
tasa de fundamentación numérica (cada cifra aparece en un fragmento citado) | 10/10 = 1,00 |
veredicto del juez LLM: fundamentado / parcialmente fundamentado / no fundamentado | 9 / 1 / 0 |
fracción media de afirmaciones respaldadas por un fragmento citado | 0,968 |
promedio de citas por respuesta | 9,7 |
promedio de llamadas a herramientas por respuesta (búsquedas/expansiones elegidas por el agente) | 7,6 |
latencia media | 41 s (13 s simple → 59 s multi-ítem) |
tokens para la ejecución de 10 preguntas | 563k in / 23k out |
El único partially_grounded (aranceles de Walmart, 0,87) fue el agente resumiendo una mitigación que el fragmento citado establece de manera más restrictiva — el juez lo detectó; para eso está el juez.
Notas de diseño / limitaciones honestas
Agéntico ≠ RAG fijo. El modelo elige empresa, Ítem, modo y cuántas rondas; un pipeline fijo de top-k no tiene segunda oportunidad. Las descripciones de las herramientas contienen la guía de 'cuándo usar' (mapa de ítems, bm25 para cifras, ampliar si está vacío).
La fundamentación es estricta a propósito. Un redondeo derivado ("$99.779M" → "~$99.8B") se marca como no fundamentado; los analistas quieren la cifra tal como se presentó. Afloje con una tolerancia si no está de acuerdo.
Las peculiaridades de la estructura 10-K son reales, no errores del analizador: JPM y XOM son 10-K 'envoltorio' cuyos MD&A/estados financieros se encuentran en una Sección Financiera al final del libro (etiquetada bajo el último Ítem); NVIDIA presenta estados bajo el Ítem 15. Las etiquetas de evaluación para esos son solo ticker. Un seguimiento es la detección de páginas F (encabezados
Consolidated Statements of …) para reetiquetar como Ítem 8.RRF es del lado del cliente — transparente y fácil de razonar; el pipeline de normalización de consultas
hybridde OpenSearch es la alternativa dentro del clúster. Aún no hay re-ranker de codificador cruzado.Una sola presentación por empresa en esta ejecución;
--filings Nobtiene años anteriores (el filtro fiscal_year ya está en el mapeo y las herramientas).Sin autenticación, sin límites de tasa, OpenSearch de un solo nodo — esto es un vertical funcional, no un despliegue.
This server cannot be deployed
Maintenance
Related MCP Connectors
Access SEC filings efficiently (10-K, 10-Q, etc), save time and tokens, and get cited answers.
Certified SEC EDGAR fact memory for AI agents with zero hallucination and filing provenance.
Primary-source SEC filing intelligence and financial/disclosure reconciliation for AI agents.
Primary-source SEC filing intelligence for AI agents, with exact evidence and provenance.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceEnables LLMs to download, parse, and analyze SEC EDGAR filings, including 10-K/Q reports, XBRL financial statements, and insider trading data. It provides structured access to institutional holdings, corporate events, and financial facts for comprehensive investment research.16MIT
- AlicenseAqualityBmaintenanceProvides access to SEC EDGAR financial data, enabling AI agents to fetch company filings, financial metrics, and narrative sections. It supports natural-language metric searching and extracts structured data from 10-K, 10-Q, and 8-K reports.692 PyPIMIT
- AlicenseAqualityBmaintenanceQuery SEC EDGAR for company filings, financial data, and executive disclosures. Search by company name or ticker, retrieve 10-K/10-Q/8-K filings, and extract structured financials — backed by the official SEC EDGAR API, built for AI agents.4MIT
- AlicenseNot gradedqualityBmaintenanceEnables agents to search SEC filings, earnings transcripts, and EU regulations with ready-to-cite evidence, including exact passages and source links.Apache 2.0