finagent-mesh-mcp
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
finagent-mesh-mcp
Hybrid financial agent stack for evaluating open System-1 decision models on FinAgentBench: typed Choice (which SEC filing type?) then Score / dense / lexical ranking (which passages?), with optional Gemini System-2 answer synthesis, MCP tools, and MLflow Runs/Traces.
Target hardware: HP ZGX Nano / NVIDIA DGX Spark (Grace Blackwell ARM64, ~128GB unified memory). Heavy engines are served one at a time (sequential exclusive GPU ports).
What this repo does
Institutional questions over SEC filings need document structure and passage evidence. This harness:
Samples FinAgentBench examples (document-type + chunk labels).
Runs a LangGraph agent: Stage-1 Choice → Stage-2 Score → nDCG@5 / MAP@5 / MRR@5 → optional Gemini synthesis + answer EM/F1.
Sweeps a Choice × Score paper matrix (Block A / Block B) across open decision models and strong baselines.
Writes paper-facing analysis, CSV/JSON tables, and per-example inspect HTML, with nested MLflow Runs/Traces for debugging.
Reading order for the “why”:
Doc | Audience | Contents |
Developers & architects | Short note: agent shape, FinAgentBench, MCP, performance/safety — takeaways from | |
Developers & architects | Continuation: why/how we specialized Stage-2 Score (006), results vs paper baselines, next steps | |
Deeper survey | System-1 landscape, trade-offs, failure modes |
Related MCP server: SEC EDGAR Data MCP
Why FinAgentBench
Choi et al., FinAgentBench, ACM ICAIF 2025 provide ~26K annotated examples with two explicit retrieval steps and nDCG@5 / MAP@5 / MRR@5. This repo uses the ICAIF’25 challenge dump (~2.4K) from Kaggle.
Resource | Link |
Paper (ACM DL) | |
UNIST record | |
ICAIF’25 challenge | |
Kaggle data |
Pipeline stage | Job | Primitive |
Stage 1 | Rank 5 filing types | Choice |
Stage 2 | Rank passages inside the Top-1 type | Score / Action Cache / BM25 / E5 |
System 2 (optional) | Answer from top-K evidence | Gemini Flash (fail-closed) |
Further reading: Jev architecture probes, Decision 1.0/2.0, CLM, AnyJev / arXiv:2610.00831, JevBench.
How the benchmark is built
Block A — Stage-1 Choice varies; Stage-2 Lux Score is fixed. Differences in Stage-1 nDCG@5 / Top-1 recall measure routing quality.
Block B — Stage-1 Lux Choice is fixed; Stage-2 Score (or BM25 / E5 / CLM) varies. Compare overall Stage-2 nDCG@5 (full pipeline) and S2 nDCG@5|Top-1 (scorer quality when the filing type was correct).
Wrong Top-1 type yields empty_top1_chunks — a routing failure, not a scorer bug. Those examples contribute 0 to overall S2 nDCG and are excluded from conditional-on-Top-1 metrics.
Default matrix = required pairs in configs/engines.yaml (optional: false). --real defaults to ranking-only and N = min(200, dataset size).
MLflow parent Run (matrix run_id)
└─ nested Run (run_id:example_id)
└─ Trace: finagent_example
├─ stage1 Choice → stage2 Score → metrics
└─ (optional) gemini_synthesize → answer_scoreModels selected
Survey latency / composite figures are not FinAgentBench scores — they guide architectural fit; run --real for numbers.
In the harness
Model | Architecture | Params / context | FinAgent Mesh role |
Decision-2.0 Lux-9B | Qwen3.5 + Gated DeltaNet | ~8B / 16k | Shared Block A Score + Block B Choice ( |
Decision-2.0 Kai-0.6B | Vela encoder | 0.6B / 1k | Fast Stage-1 Choice. HF |
CLM-8B | Frozen Qwen3-8B dual encoder + InfoNCE | 8B+ / 2k | Stage-2 Action Cache. HF |
AnyJev L0 | Cyclic permutations on Lux Choice | inherits | Stage-1 order-bias control. GitHub |
Laya (ModernBERT) | Bidirectional MLM heads | 421M / 512 | Edge Stage-1. HF |
Qwen3-8B AR | Autoregressive JSON | 8B | Generative baseline ( |
BM25 / E5-base | Lexical / dense | — | Strong Stage-2 baselines |
Default pairs (configs/engines.yaml → matrix_pairs)
Pair id | Block | Stage 1 | Stage 2 | Default |
| A+B | Lux | Lux | Required — shared physical run |
| A | AnyJev L0 | Lux | Required |
| A | Kai / Laya | Lux | Required |
| A | Qwen3-8B JSON | Lux | Required baseline |
| B | Lux | CLM / BM25 / E5 | Required |
| B | Lux / noop | shortlist-CLM / AR | Optional ( |
| champion | AnyJev L0 | E5 / BM25 | Opt-in P1 (S8) |
| B optional | Lux | BM25→Lux Score (k=32) | Opt-in P1 (S2b) |
| B baseline | Lux | E5→CrossEncoder (k=32) | Opt-in P1 (S7; #2) |
| trained | frozen Lux | BM25→Unsloth Score (k=32) | Parallel 006 track ( |
| yield | Lux / frozen Lux | Lux / BM25→Unsloth + first-non-empty | Opt-in 007 ( |
Deferred trained CLM heads: issue #1.
P1 Stage-2 ceilings (champions, shortlist→Lux, E5→CE): feature 005-s2-approach-ceilings; measured in paper-p1-ceilings-n200 (see below).
Trained Score track (Unsloth): feature 006-unsloth-decision-track; measured in unsloth-score-paper-n200 (see below).
Out of the default matrix
Model | Why interesting | Why not default |
Jev (TypeSafe) | Defines the System-1 bar | Hosted / proprietary |
djev / DiffusionGemma | Multimodal | VRAM + not text-SEC chunks |
Other Decision-2.0 sizes / Jeeves / SemIf / … | Family completeness | Overlap or memory vs sequential budget |
CLM as Stage 1 / Laya·Kai as Stage 2 | — | Wrong primitive or context/cost fit |
Unsloth Qwen3.8 Decision Score (006 / #5) | Trainable Score head comparable to paper matrix | Parallel stack — not a Decision-2.0 Lux drop-in; optional |
Unsloth Score track (006) — high level
After the zero-shot matrix showed Stage-2 Score (not Choice) as the weaker hop, feature 006 adds a parallel trained Score path that does not overwrite paper baselines:
Export a leakage-safe split: paper N=200 ids are test-only; train/val come from the rest of FinAgentBench.
Train a QLoRA Score head (Unsloth
FastDecisionModel/DecisionTraineron Qwen3.8-27B) — supervised relevance grades, not RL in v1.Eval with frozen Lux Choice from
paper-n200-full+ BM25 shortlist k=32 + the trained head (lux-unsloth-score), writing onlyunsloth-*artifacts.
Operator guide: specs/006-unsloth-decision-track/quickstart.md. Architect narrative: Tuning Decision Models for Enterprise Agents.md. Plain-language vs paper numbers: unsloth-score-paper-n200-comparison.md. Choice train and AnyJev×Unsloth compounds remain deferred past v1.
# Unsloth fine-tune stack — all deps via uv (pyproject [unsloth] extra):
uv sync --extra real --extra unsloth
# or: bash scripts/install_unsloth_zgx.sh --with-real
uv run python scripts/export_unsloth_dataset.py
uv run python scripts/train_unsloth_score.py --max-train-rows 1000 --dry-run # or full GPU train
uv run python scripts/run_unsloth_eval.py --real --pairs lux-unsloth-score \
--checkpoint artifacts/unsloth/checkpoints/<run> --records 20 --run-id unsloth-score-smoke20Results: paper-n200-full (N=200, seed=42)
Merged primary + retry matrix: 8/8 required pairs measured, ranking-only. Published analysis under artifacts/benchmarks/ includes P0 evidence (routing audit, dual S2, strata, win/loss, bootstrap CIs, multi-seed rollup).
For a non-metrics walkthrough of what these numbers mean for agent design (routing vs yield vs passage search vs generation), see Decision Models for Enterprise Agentic Architecture.md.
Headline findings
Question | Winner | Key numbers |
Best Choice router (Block A) |
| S1 nDCG@5 0.8625 (+0.021 vs Lux 0.8413); Top-1 recall 95.1%; OFR 9.0% |
Best passage scorer (Block B) |
| S2 nDCG@5 0.2825 scored-only (+0.061 vs Lux); pipeline-averaged 0.157 |
Routing / yield | Lux Choice | Empty-Top-1 40.5%; pipeline yield 59.5%. Many empties are correct Top-1 + empty pool (67/200), not only wrong type — see Routing accounting in the analysis. |
Block A order (S1 nDCG@5): AnyJev 0.862 → Lux 0.841 → Kai 0.783 → AR 0.777 → Laya 0.751.
Block B order (scored-only S2 nDCG@5): E5 0.282 → BM25 0.265 → Lux Score 0.221 → CLM 0.103. Win/tie/loss vs Lux (nDCG@5, ε=0.01): E5 51/26/34; BM25 51/23/37.
Multi-seed core (seeds 42 / 7 / 123, four pairs): AnyJev beats Lux S1 on all three seeds. Across-seed mean S2: E5 ≈ 0.265, BM25 ≈ 0.246, Lux ≈ 0.209 — Block B order is not seed-stable (BM25 ≈ E5 on seed 7; BM25 collapses on seed 123). Cite mean + min–max from the Multi-seed summary in the analysis.
Optional baselines (paper-n200-optional, same N/seed; local artifacts): BM25→CLM shortlist S2 0.1475 (beats zero-shot CLM 0.103, still behind Lux/E5/BM25); one-shot AR S2 0.2737 (~E5) as a collapsed baseline (~3% AR parse fail).
Synthesis reuse (paper-n200-full-synth): Gemini attached to saved rankings for anyjev / lux / e5 / bm25 (no Choice/Score re-run). Attempted 119–128 / pair, 0 Gemini fails. Answer EM/F1 are N/A — the harness dump has answer_label: null on all examples (skipped_no_label).
Rebuild analysis (no engines):uv run python scripts/run_benchmark.py --analysis-from paper-n200-full --multi-seed-from paper-n200-s7-core,paper-n200-s123-core
Detailed artifacts
Artifact | Path |
Analysis (read this first) | |
Analysis JSON | |
Matrix tables | |
Matrix state | |
Compact inspect (GitHub) |
|
Full inspect HTML (download) |
|
Optional / synth analyses (local) |
|
P0 evidence commands (re-run / extend)
# Rebuild published analysis + multi-seed rollup (no GPU)
uv run python scripts/run_benchmark.py --analysis-from paper-n200-full \
--multi-seed-from paper-n200-s7-core,paper-n200-s123-core
# Optional baselines (ranking-only)
uv run python scripts/run_benchmark.py --real --include-optional \
--pairs lux-clm-shortlist,one-shot-ar \
--records 200 --seed 42 --run-id paper-n200-optional
# Synthesis reuse (Gemini only; needs GOOGLE_API_KEY)
uv run python scripts/run_benchmark.py --real --with-synthesis \
--synthesis-from-rankings paper-n200-full \
--pairs anyjev-l0-lux,lux-lux,lux-e5,lux-bm25 \
--run-id paper-n200-full-synthSpec: specs/004-paper-p0-evidence/. Trained CLM-ft remains deferred #1.
Results: paper-p1-ceilings-n200 (N=200, seed=42)
P1 Stage-2 approach ceilings on the same example IDs as paper-n200-full (ranking-only). Matrix state merges the four P1 pairs with published baselines so Champion / P1 Δ columns and bootstrap CIs are filled. Spec: 005-s2-approach-ceilings.
Headline findings
Question | Winner | Key numbers |
Best Stage-2 scorer (incl. P1) |
| S2 nDCG@5 0.3517 scored (+0.131 vs lux-lux; bootstrap 95% CI excludes 0); S2|Top-1 0.3735 |
Champion compound (S8) |
| S2 0.2868 (+0.057 vs anyjev-l0-lux; +0.004 vs lux-e5). |
Pretrained CE “ceiling” (S7) | does not beat E5 |
|
Takeaway: BM25 shortlist → Lux Score is the Stage-2 win on this sample. Best Choice × classical IR helps vs Lux Score alone, but barely moves the needle vs Lux Choice × the same IR head. Off-the-shelf CrossEncoder is a useful baseline, not an IR ceiling here.
Rebuild (no engines; baselines already merged into matrix state):
uv run python scripts/run_benchmark.py --analysis-from paper-p1-ceilings-n200 \
--multi-seed-from paper-n200-s7-core,paper-n200-s123-coreArtifact | Path |
Analysis | |
Analysis JSON | |
Matrix tables |
|
Matrix state | |
Compact inspect (GitHub) |
|
Full inspect HTML (download) |
|
Full re-run:
uv run python scripts/run_benchmark.py --real --skip-synthesis \
--pairs anyjev-l0-e5,anyjev-l0-bm25,lux-lux-shortlist,lux-e5-ce \
--records 200 --seed 42 --run-id paper-p1-ceilings-n200Results: unsloth-score-paper-n200 (N=200, seed=42)
Parallel 006 eval on the same paper holdout ids as paper-n200-full (ranking-only). Stage-1 Lux Choice is frozen from the published run; Stage-2 is BM25 top-32 → fully trained Unsloth Score (score-qwen38-r16). Paper paper-n200-full* / paper-p1-ceilings-n200* files are left untouched.
Headline findings
Comparator | S2 nDCG@5 (scored) | Notes |
| 0.606 | MRR 0.794; S2|Top-1 0.643; pipeline-averaged 0.355 |
Untuned Lux Score ( | 0.221 | Pre-tune decision Score baseline |
Best required Block B ( | 0.283 | Best zero-shot scorer in |
Best shortlist peer ( | 0.352 | Same BM25→Score shape, untuned Lux head (P1) |
Takeaway: specializing Stage-2 Score under a fixed Choice + shortlist contract clearly beats both classical IR and untuned Lux Score on this holdout. Empty-Top-1 remains ~37–40% — yield is still an architecture/corpus issue, not fixed by Score FT alone. Latency (~29 s p50 for the 27B QLoRA path) is a product trade vs BM25/E5.
Yield recovery (007 / #10) — measured
Opt-in first-non-empty Stage-2 type fallback when Choice Top-1 has no chunks. Does not overwrite paper-n200-full* or unsloth-score-paper-n200*. Same N=200 / seed 42 holdout as the paper matrix.
System | Empty (orig → post) | Yield | Fallbacks | S2 nDCG scored | S2 nDCG pipeline |
paper | 40.5% → 40.5% | ~59.5% | — | 0.221 | — |
| 40.5% → 2.0% | 94% | 77 | 0.227 | 0.214 |
| 37.5% → 37.5% | 58.5% | — | 0.606 | 0.354 |
| 37.5% → 2.0% | 94% | 71 | 0.614 | 0.577 |
Takeaway: yield recovery collapses empty Top-1 from ~38–40% to 2% and lifts Unsloth pipeline S2 nDCG by +0.22; scored-only quality barely moves (+0.008). Score FT (006) and yield fallback (007) fix different gaps. Caveat: first-non-empty may pick a non-gold filing type.
Artifact | Path |
Plain-language comparison | |
Lux twin analysis | |
Unsloth twin analysis | |
Spec / quickstart |
# Lux twin
uv run python scripts/run_benchmark.py --real --skip-synthesis \
--pairs lux-lux-yield --records 200 --seed 42 --run-id yield-paper-n200-lux
# Unsloth twin
uv run --extra unsloth python scripts/run_unsloth_eval.py --real --skip-synthesis \
--pairs lux-unsloth-score-yield --yield-recovery \
--frozen-stage1-from paper-n200-full \
--checkpoint artifacts/unsloth/checkpoints/score-qwen38-r16 \
--records 200 --seed 42 --run-id yield-unsloth-score-paper-n200
# Baseline checksum regression (must be unchanged after yield runs)
sha256sum artifacts/benchmarks/paper-n200-full.json \
artifacts/benchmarks/unsloth-score-paper-n200.jsonArtifact (006 Unsloth Score) | Path |
Plain-language comparison | |
Harness analysis | |
Matrix tables |
|
Matrix state | |
Compact inspect |
|
Architect write-up | |
Spec / quickstart |
Full paper-slice eval (after train; resume-safe ledger):
uv run --extra unsloth python scripts/run_unsloth_eval.py --real --skip-synthesis \
--pairs lux-unsloth-score \
--frozen-stage1-from paper-n200-full \
--checkpoint artifacts/unsloth/checkpoints/score-qwen38-r16 \
--records 200 --seed 42 \
--run-id unsloth-score-paper-n200Technical stack
Layer | Technology | Role |
Orchestration | LangGraph (+ LangChain Core) | Per-example agent graph |
System-1 | Local | Choice / Score / Action Cache / BM25 / E5 / AR |
System-2 | Gemini Flash via | Fail-closed synthesis (no extractive fallback) |
Tools | MCP ( | Optional enrichment |
Observability | MLflow 3 nested Runs + GenAI Traces | Metrics + span tree |
Eval ledger | SQLite | Crash-resume, leases, ranking vs synthesis phases |
Packaging | uv + Python 3.12, Typer, Pydantic, httpx |
|
Optional --extra real: torch, transformers, sentence-transformers, rank-bm25, huggingface-hub.
Agent flow
flowchart TD
Q[Query + SEC chunks] --> S1
S1["stage1 · Choice<br/>rank filing types"] --> S2
S2["stage2 · Score / Action Cache<br/>rank passages in Top-1 type"] --> M
M["metrics · nDCG@5 MAP@5 MRR@5"] --> R{skip_synthesis?}
R -->|yes · ranking-only| END1[End · ranking_complete]
R -->|no| G["synthesize · Gemini Flash<br/>top-K chunks"]
G --> A["answer_score · EM + token F1"]
A --> END2[End · completed]MLflow
Tracking defaults to SQLite (MLFLOW_TRACKING_URI=sqlite:///mlflow.db):
./scripts/mlflow_ui.sh
# http://127.0.0.1:5000 → experiment finagent-mesh → Runs | TracesSurface | Contents |
Runs (nested per example) |
|
Traces |
|
Set MLFLOW_DISABLE_AUTOLOG=1 to disable LangGraph autolog. Migrate old FileStore: uv run mlflow migrate-filestore --source ./mlruns --target sqlite:///mlflow.db.
Quick start: smoke test
Use a new --run-id every smoke so the SQLite ledger does not resume an old run.
0. One-time setup
cp .env.example .env
# Required for --real:
# SYSTEMONE_MOCK=0
# SYSTEMONE_BACKEND=real
# HF_TOKEN=… # Hub rate limits
# GOOGLE_API_KEY=… # only if --with-synthesis
# KAGGLE_USERNAME / KAGGLE_KEY # first FinAgentBench download only
# MLFLOW_TRACKING_URI=sqlite:///mlflow.db
uv sync --extra real --group dev
./scripts/prepare_real_stack.sh
# Optional weight prefetch:
./scripts/prepare_real_stack.sh --prefetchCreate a Hugging Face read token at HF settings/tokens. For Gemini, set GOOGLE_API_KEY. Accept Kaggle competition rules if data is not already under data/finagentbench/.
1. MLflow UI (separate terminal)
./scripts/mlflow_ui.sh2. Minimal technical smoke (S1 + S2 + Gemini + MLflow)
uv run python scripts/run_benchmark.py --real --with-synthesis \
--pairs lux-lux \
--records 5 --seed 42 \
--run-id paper-smoke-mlflow-gemini-5Pass criteria: CLI exit 0; ranking in inspect HTML; non-empty Gemini synthesis; nested MLflow Runs + Trace with systemone_* and gemini_synthesize.
Ranking-only smoke:
uv run python scripts/run_benchmark.py --real \
--pairs lux-lux --records 5 --seed 42 \
--run-id paper-smoke-rank-5Full paper run
uv run python scripts/run_benchmark.py --real --seed 42 --run-id paper-n200With Gemini synthesis on the same sample:
uv run python scripts/run_benchmark.py --real --with-synthesis \
--seed 42 --run-id paper-n200-synthWhat --real does
Resolves required Block A/B pairs from
configs/engines.yaml.Starts engines with
SYSTEMONE_BACKEND=real(refusesSYSTEMONE_MOCK=1).Force-restarts sidecars on ports 8000/8001/8002 unless
--keep-servers.Keeps Lux Score warm on :8001 across Block A while Choice swaps on :8000.
Auto-fetches FinAgentBench from Kaggle if missing (
--no-fetch-datato disable).Writes
artifacts/benchmarks/<run-id>.{json,csv,md,analysis.md,analysis.json,inspect.html,inspect.json}.
GPU policy: sequential exclusive heavies; keep Lux warm across Block A (shared Score) and Block B (shared Choice). Rebuild reports without engines: --analysis-from <run-id> / --inspect-from <run-id>.
Selective runs
uv run python scripts/run_benchmark.py --list-pairs
uv run python scripts/run_benchmark.py --list-engines
# Highest-value subset
uv run python scripts/run_benchmark.py --real \
--pairs lux-lux,lux-bm25,kai-lux \
--records 20 --seed 42 --run-id paper-core
# Optional Block B rows
uv run python scripts/run_benchmark.py --real --include-optional --run-id paper-opt
# Reuse warm sidecars
uv run python scripts/run_benchmark.py --real --keep-servers \
--pairs lux-lux --records 5 --seed 42 --run-id warm-reuse
# External server management
uv run python scripts/run_benchmark.py --real --no-manage-servers \
--pairs lux-lux --records 5 --run-id external-servers
# Rebuild published analysis/inspect from saved matrix state
uv run python scripts/run_benchmark.py --analysis-from paper-n200-full
uv run python scripts/run_benchmark.py --inspect-from paper-n200-fullStop leftovers: bash scripts/serve_engine.sh stop-all.
run_benchmark.py CLI reference
Flag | Default | Meaning |
| off | Real HF models, refuse mock, ranking-only unless |
|
| Seeded sample size |
|
| RNG seed |
|
| Matrix run id (ledger + artifact stem) |
| all required Block A/B | Comma-separated |
| — | Legacy ablation; mutually exclusive with |
| off | Add |
| off | Gemini Flash + answer scoring |
| implied by | Explicit ranking-only |
|
| System-2 model id |
|
| Dataset directory or JSONL |
|
| Report output directory |
|
| With |
| fetch on | Kaggle download if missing |
| on with | Kill ports 8000–8002 before the run |
| off | Reuse running sidecars |
| off | Do not start/stop engines |
| off | Debug only; illegal with |
| — | Catalog and exit |
| — | Rebuild reports from a saved matrix; no engines |
Layout
scripts/run_benchmark.py— paper Block A/B matrix + reports (--real)scripts/mlflow_ui.sh— MLflow UI (sqlite:///mlflow.db)configs/engines.yaml— engines, HF ids,matrix_pairsscripts/download_finagentbench_kaggle.py— fetch + convert ICAIF’25 dumpscripts/prepare_real_stack.sh— torch/transformers; optional HF prefetchscripts/serve_engine.sh— start/stop/restart/health/stop-allsrc/finagent_mesh/agent/graph.py— LangGraph pipelinesrc/finagent_mesh/runtime/harness.py/tracing.py— ledger + MLflowsrc/finagent_mesh/matrix/— report, analysis, inspect, mergesrc/finagent_mesh/clients/engines/real_infer.py— Decision-2.0 / embed / AR / CLMartifacts/benchmarks/paper-n200-full.*— published N=200 analysis; compact.inspect.md+ per-pair pages for GitHub; full.inspect.htmlfor downloadartifacts/benchmarks/paper-p1-ceilings-n200.*— same pattern for P1 ceilingsartifacts/benchmarks/unsloth-score-paper-n200.*— trained Score track (006); plusunsloth-score-paper-n200-comparison.mdartifacts/benchmarks/yield-*-n200*/yield-recovery-n200-comparison.md— Stage-2 yield recovery (007)scripts/export_unsloth_dataset.py/train_unsloth_score.py/run_unsloth_eval.py— 006 parallel train/eval CLIsArchitecture (short):
Decision Models for Enterprise Agentic Architecture.md·Tuning Decision Models for Enterprise Agents.mdSurvey (long):
Architectural Foundations for Open Decision Models.mdSpecs:
specs/007-stage2-yield/·specs/006-unsloth-decision-track/·specs/005-s2-approach-ceilings/·specs/003-choice-score-paper/·specs/004-paper-p0-evidence/·specs/002-decision-model-bench/·specs/001-finagentbench-harness/
This server cannot be deployed
Maintenance
Related MCP Connectors
Real SEC, 13F, insider, congress & macro data your AI agent can cite. Hosted MCP, 24 tools.
SEC & financial-data MCP: filings, financials, ownership, factors, fund letters, prompts.
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.
Related MCP Servers
- AlicenseAqualityCmaintenanceProvides live financial data for any LLM agent, including stock quotes, crypto prices, SEC filings, XBRL financials, FX rates, and macro indicators, through ten MCP tools.11109 npm1MIT
- AlicenseNot gradedqualityCmaintenanceHosted MCP server granting AI agents access to 20M+ SEC EDGAR filings, 100M+ exhibits, and comprehensive entity data through 49 tools, with support for raw documents, extracted sections, and structured JSON.14 npm2MIT
- AlicenseBqualityCmaintenanceEnables multi-agent financial research through MCP, combining live or offline market, news, fundamentals, document RAG, and risk tools with critic review, synthesis, and execution tracing.10MIT
- FlicenseNot gradedqualityCmaintenanceEnables MCP-compatible agents to perform stock analysis and ML workflows, including live market data retrieval, model training, MLflow experiment tracking, champion/challenger model promotion, and Docker deployment.-