Climate MCP Server
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Climate MCP Server what are the top 5 funds by total pledges?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Climate MCP Server
A Model Context Protocol (MCP) server that exposes 26 structured analytical tools over Climate Finance Update (CFU) datasets. Designed for use with Claude Desktop (STDIO) or any MCP-compatible client.
Overview
The server enables structured queries against three Climate Finance datasets (DuckDB-backed) — funds, pledges, and projects — without requiring the client to write any data access code. All tools return a consistent JSON envelope and emit audit events for full reproducibility.
Key capabilities:
Fund-level financial analysis (stage totals, conversion ratios, gaps)
Portfolio-wide aggregations by fund type, sector, adaptation/mitigation
Contributor/donor ranking across pledge and deposit stages
Data quality diagnostics (missing value reports)
Schema contract introspection
Run-level audit trail with Markdown export
Related MCP server: Financial Modeling Prep MCP Server
Project Report
For a narrative project description (problem statement, architecture, deployment, and validation), see:
docs/PROJECT_REPORT.md
Project Structure
climate_mcp_server/
├── data/ # Optional compatibility exports (legacy CSV aliases)
│ ├── fund.csv
│ ├── pledges.csv
│ └── projects.csv
│
├── ingestion_layer/ # CFU download → DuckDB → CSV (runs at MCP startup unless CLIMATE_MCP_SKIP_CFU_PIPELINE=1)
│ ├── cfu_pipeline.py # Main pipeline: scrape dashboard, download Excel, load DuckDB, export CSVs
│ ├── transform.py # Transform / analytics steps used by the pipeline
│ ├── Requirements.txt # Standalone ingestion dependencies (optional)
│ ├── notification developer.py # Optional notifications (email, etc.)
│ └── data/
│ ├── climate_funds.duckdb # Primary store: raw.* + analytics.* tables
│ ├── manifest.json # Last run: URLs, checksums, paths to exports
│ ├── raw_change_report.json # Diff-style report between ingested versions
│ ├── transform_schema_review.json
│ ├── archive/ # Timestamped Excel workbooks (*.xlsx)
│ ├── raw/ # latest.xlsx + latest.sha256.txt (working copy)
│ ├── raw_snapshots/ # Per-sheet CSV snapshots (*_latest.csv)
│ └── exports/ # Versioned CSVs for inspection / non-DuckDB fallback
│ ├── fund/fund1.csv
│ ├── pledges/pledges1.csv
│ └── projects/projects1.csv
│
├── docs/
│ ├── schema_contract.md # Human-readable governed schema contract
│ └── schema_contract_summary.json # Machine-readable contract summary (LLM validation)
│
├── runs/ # Auto-generated audit run logs
│ └── *.md # One Markdown file per run_id
│
├── mcp_server/
│ ├── finance/
│ │ └── server.py # MCP server entry point (FastMCP initialisation)
│ │
│ ├── tools/ # All 26 MCP tools
│ │ ├── registry.py # Central tool registration (single entry point)
│ │ ├── context.py # Shared singleton context: paths, table loader, audit state, and shared helpers
│ │ ├── audit_tools.py # start_run / get_audit_trail / finalize_run
│ │ ├── contract_tools.py # get_schema_contract / get_schema_contract_summary
│ │ ├── discovery_tools.py # list_datasets / describe_dataset / preview_dataset / list_unique_values / resolve_entity
│ │ ├── summary_tools.py # search_funds / get_fund_details / fund_summary / portfolio_summary / sector_summary /
│ │ │ # fund_type_distribution / adaptation_vs_mitigation_summary / compare_funds / fund_stage_totals
│ │ ├── finance_tools.py # fund_conversion_ratios / rank_entities / rank_by_column / filter_funds_by_threshold / fund_stage_gap
│ │ ├── aggregation_tools.py # avg_projects_per_fund_by_type
│ │ └── quality_tools.py # missing_report
│ │
│ └── data/
│ └── datasets.py # Dataset URI registry (cfu://funds → analytics.fund, etc.)
│
├── mcp_client/ # MCP client package
│ ├── CLIENT_ARCHITECTURE.md
│ ├── __init__.py
│ ├── __main__.py
│ ├── agent.py
│ ├── api.py
│ ├── config.py
│ ├── erasmus.py
│ ├── errors.py
│ └── mcp_tools.py
│
├── tests/
│ └── run_tests.py # Self-contained test runner (111 tests, no pytest required)
│
├── pyproject.toml # Project metadata and dependencies
├── uv.lock # Locked dependency versions
├── .python-version # Python version pin
└── .gitignore
Architecture
MCP Client (ClimateGPT)
│
│ JSON-RPC tool request
▼
MCP Server — FastMCP ("finance")
│
├── Tool Layer (7 modules, 26 tools)
│ audit_tools → run lifecycle management
│ contract_tools → schema governance
│ discovery_tools → dataset exploration
│ summary_tools → fund profiles and aggregations
│ finance_tools → ratios, rankings, gaps, thresholds
│ aggregation_tools→ cross-dataset aggregations
│ quality_tools → data completeness diagnostics
│
├── Shared Context (context.py)
│ Singleton ToolContext — thread-safe, mtime-cached dataset loading
│ Shared helpers: _to_num, _records, _load, _norm
│ Audit state: active_run_id, run_events, log_tool_event()
│ Uniform output envelope: tool_result()
│
├── Dataset Registry (datasets.py)
│ URI resolution: cfu://funds → analytics.fund
│ cfu://pledges → analytics.pledges
│ cfu://projects → analytics.projects
│
└── DuckDB Dataset Tables
analytics.fund · analytics.pledges · analytics.projectsDesign principles:
Every tool returns the same JSON envelope:
{"ok": bool, "data": {...}, "meta": {...}, "error": null | "message"}Dataset tables are loaded once and cached by DuckDB file mtime; no redundant reads across tools
All string comparisons are case-insensitive via
_norm()(lowercase + strip)NaN values are replaced with
nullbefore serialisation via_records()The singleton context is protected by a double-checked lock for thread safety
Datasets
URI | Database Table | Legacy Alias | Primary Key | Grain |
|
|
|
| One row per fund |
|
|
|
| One row per pledge record |
|
|
|
| One row per project |
Financial stages (in pipeline order): pledge → deposit → approval → disbursement
Tools Reference
Audit Tools (3)
Tool | Description |
| Begin a new audit run; clears previous events and returns a |
| Compact view of tools called in the current run with datasets and columns used |
| Write the full run log to |
Contract Tools (2)
Tool | Description |
| Machine-readable JSON schema contract (call before cross-dataset analysis) |
| Full schema contract as Markdown text |
Discovery Tools (5)
Tool | Description |
| All registered datasets with URI, primary key, grain, and description |
| Row count, column names, dtypes, and null counts |
| First N rows (max 25) |
| Sorted unique non-null values in a column (max 200) |
| Fuzzy-match a user string against real column values — call before passing names to other tools |
Summary Tools (9)
Tool | Description |
| Keyword search across fund name, type, focus, and sector |
| Full dataset record for a single fund |
| Profile card: metadata, stage metrics, portfolio share, and conversion ratios |
| Portfolio-wide totals: fund count, four-stage sums, adaptation/mitigation counts |
| Totals and percentage share by |
| Totals and percentage share by |
| Funds bucketed into adaptation-only / mitigation-only / both / neither |
| Side-by-side comparison of multiple funds |
| Stage totals for portfolio / single fund / fund_type / sector |
Finance Tools (5)
Tool | Description |
| Four pipeline ratios for one fund (deposit/pledge, approval/deposit, disbursement/approval, disbursement/pledge) |
| Rank a grouping column by a finance stage; supports wide and long dataset layouts |
| Rank by any numeric column (non-stage columns, ascending order, any dataset) |
| Return funds where a ratio metric falls below a threshold |
| Absolute gaps between consecutive stages (pledge→deposit, deposit→approval, approval→disbursement) |
Aggregation Tools (1)
Tool | Description |
| Average approved projects per fund grouped by |
Quality Tools (1)
Tool | Description |
| Missing-value counts grouped by a column — audit data completeness before analysis |
Setup
Prerequisites
Python 3.12+
uvpackage manager
Install
git clone <YOUR_REPO_URL>
cd climate_mcp_server
uv syncVerify the environment:
uv run python -c "import pandas; print('pandas ok')"
uv run python -c "from mcp.server.fastmcp import FastMCP; print('mcp ok')"Verify the database exists:
ls "ingestion_layer/data"
# climate_funds.duckdb manifest.json archive/ exports/ raw/ raw_snapshots/ ...Running the Server
Local / STDIO (default)
uv run python mcp_server/finance/server.pyThe process stays running and waits for an MCP client connection over STDIO. Stop with Ctrl+C.
HTTP instead of STDIO
The server uses STDIO by default. For a VM or remote client, set CLIMATE_MCP_TRANSPORT:
Transport |
| Client protocol |
STDIO (default) | unset or | Process stdin/stdout (Claude Desktop, local Cursor) |
SSE |
| HTTP: GET event stream + POST messages (classic MCP remote) |
Streamable HTTP |
| Single HTTP MCP endpoint (newer transport) |
Optional:
CLIMATE_MCP_HOST— bind address (default0.0.0.0for HTTP modes so the VM accepts remote connections;127.0.0.1for STDIO).CLIMATE_MCP_PORT— listen port (default 8000).CLIMATE_MCP_MOUNT_PATH— URL prefix (default/). Non-root mounts apply to every path below.
SSE example (reachable from your laptop on the lab network):
export CLIMATE_MCP_TRANSPORT=sse
export CLIMATE_MCP_HOST=0.0.0.0
export CLIMATE_MCP_PORT=8000
uv run python mcp_server/finance/server.pyOn startup, stderr prints the exact GET (SSE) and POST (messages) URLs. Defaults from FastMCP: /sse and /messages/ under the mount path.
Streamable HTTP example:
export CLIMATE_MCP_TRANSPORT=streamable-http
export CLIMATE_MCP_HOST=0.0.0.0
export CLIMATE_MCP_PORT=8000
uv run python mcp_server/finance/server.pyDefault MCP path: /mcp (see stderr line for the full URL).
Security: there is no authentication on these HTTP endpoints unless you add a reverse proxy (TLS, firewall, API keys). Do not expose them to the public internet without hardening.
You can still use FastMCP’s FASTMCP_* settings (see library docs) for fine-grained paths like FASTMCP_SSE_PATH if needed.
Connecting with Claude Desktop
Find your repo root path:
pwdIn Claude Desktop → Settings → MCP Servers, add a new server:
Name:
financeTransport:
stdioCommand:
uvArgs:
run,python,mcp_server/finance/server.pyWorking directory: your repo root path
Restart Claude Desktop. The 26 tools will appear in the tool picker.
Running Tests
uv run python tests/run_tests.py --allThe test runner requires no external test framework. It runs two layers:
Layer 1 — Unit tests for all 26 tools (tool behaviour, error paths, output envelope)
Layer 2 — Smoke tests for real-world research questions and use cases (UC1–UC4)
Expected output: 111 PASS | 0 FAIL
Run individual layers:
uv run python tests/run_tests.py --layer1 # unit tests only
uv run python tests/run_tests.py --layer2 # smoke tests onlyDependencies
Package | Version | Purpose |
| ≥ 1.26.0 | FastMCP server framework |
| ≥ 3.0.0 | DataFrame processing and aggregations |
| ≥ 1.4.0 | Primary dataset storage and table queries |
| ≥ 0.28.1 | HTTP transport support |
Python ≥ 3.12 required.
Available Tools
26 toolsadaptation_vs_mitigation_summaryC
Buckets funds into adaptation_only, mitigation_only, both, or neither.
Returns count and metric total + share per bucket.
Inputs: metric. Returns: object
avg_projects_per_fund_by_typeA
Average number of approved projects per fund, grouped by fund_type.
Use ONLY when the user explicitly wants an average per fund by type.
Do NOT use for the TOTAL count of approved projects across all funds —
use portfolio_summary (total_number_of_projects_approved).
Do NOT use to find which individual funds approve the most projects —
use rank_by_column on fund.csv with group_by='fund' and
value_column='number_of_projects_approved'.
source='fund' → uses pre-aggregated number_of_projects_approved per fund.
source='projects' → distinct project_id per fund; filters_json narrows
rows, e.g. '{"fund_type": "Multilateral"}'.
agg: mean (default) | median | min | max
Inputs: agg, source, filters_json. Returns: object
compare_fundsA
Side-by-side comparison of multiple funds across selected metrics.
'fund_ids': list of integer fund IDs.
Always obtain IDs from search_funds (or resolve_entity + get_fund_details)
for each user-supplied fund name in the same turn — do not guess or
hard-code IDs like [1,2,3]; names and table order can change.
'metrics': columns to include (default: all four stages + projects approved).
Inputs: fund_ids (required), metrics. Returns: object
describe_datasetA
Row count, column names, dtypes, and null counts for a dataset.
Pass 'filename' (e.g. 'fund.csv') or 'dataset_uri' (e.g. 'cfu://funds').
Use when column names are uncertain; skip as a first step if the system
prompt or schema contract already lists the columns you need.
Inputs: filename, dataset_uri. Returns: object
filter_funds_by_thresholdA
Returns funds where a ratio metric falls below a threshold, sorted by
ratio ascending (worst performers first).
ratio_metric options: deposit_over_pledge, approval_over_deposit,
disbursement_over_approval, disbursement_over_pledge.
Use for screening underperformers, e.g. 'find funds with deposit/pledge < 0.5'.
top_k: max funds to return (default 10, max 50). Check
total_funds_below_threshold in the response to see if results were
truncated — increase top_k if needed.
Response columns: fund, ratio, pledge, disbursement only (trimmed to
avoid context overflow).
Inputs: filename (required), threshold (required), ratio_metric (required), top_k, +1 more. Returns: object
finalize_runA
Write the full run log to runs/<run_id>.md and clear memory.
Call once at the end of each user query to persist the audit trail.
'extra_notes': optional free-text annotation to append to the log.
Inputs: query, extra_notes. Returns: result
fund_conversion_ratiosA
For a single named fund: conversion ratios between each funding stage
(deposit/pledge, approval/deposit, disbursement/approval,
disbursement/pledge). Use when the user asks about the full funding
pipeline for a specific fund, conversion ratios, how efficiently a fund
moves money, or which fund has the highest/lowest disbursement-to-pledge
ratio (call once per fund, or compare funds after resolving names).
Do NOT use for portfolio-wide totals — use portfolio_summary.
Do NOT use only to fetch raw stage amounts — use fund_stage_totals or
fund_summary; use this tool when ratios / pipeline efficiency matter.
Use search_funds first if the exact fund name is unknown.
Response includes match_method (exact|fuzzy|unresolved), match_confidence
(1.0 for exact), fuzzy_candidates with per-candidate similarity, and
match_warning when fuzzy similarity is low — relay these to the user.
Inputs: fund_name (required), filename, fund_col, use_fuzzy_match. Returns: object
fund_stage_gapA
Dollar gap between consecutive funding stages for one fund
(fund_name set) or the whole portfolio (fund_name=None): pledge→deposit,
deposit→approval, approval→disbursement.
Use when the user asks how much pledged money has not been deposited,
gaps between approved and disbursed for a specific fund, or stage gaps
in the pipeline.
Do NOT use for a global approved-vs-disbursed question with no fund
named — use portfolio_summary for portfolio-wide totals and ratios.
More direct than subtracting fund_stage_totals manually for gap questions.
top_k: when fund_name is None (portfolio mode), return only the top N
funds by deposit descending (default 20, max 30). Check total_funds
and showing_top in the response to see if results were truncated.
Inputs: top_k, filename, fund_col, fund_name. Returns: object
fund_stage_totalsA
Raw dollar totals at each pipeline stage for a scope (no ratios).
scope='portfolio' → all funds; scope='fund' → fund_id required;
scope='fund_type' or 'sector' → filter by value (fund_type or
fund_focus_sector on fund.csv).
Use for total amounts by fund type or fund focus sector — not for
conversion ratios; for a named fund's pipeline efficiency use
fund_conversion_ratios or fund_summary.
Do NOT use for portfolio-wide overview questions — use portfolio_summary
first. Use search_funds / get_fund_details to resolve fund_id when needed.
Inputs: scope, value, fund_id. Returns: object
fund_summaryA
Structured profile card for one fund: metadata, all four stage metrics,
portfolio share, and stage conversion ratios (deposit/pledge, etc.).
Combines B's fund_summary with A's fund_conversion_ratios into one call.
Inputs: fund_id (required). Returns: object
fund_type_distributionA
Totals and percentage share by fund_type, sorted descending.
'metric' selects the stage column (pledge/deposit/approval/disbursement).
'top_n' limits the number of fund types returned (default 20, max 200).
Inputs: top_n, metric. Returns: object
get_audit_trailA
Returns the compact audit trail for the current run:
which tools were called, which dataset and columns each used.
Call at any point mid-run to inspect what has been executed so far.
Inputs: no named parameters. Returns: result
get_fund_detailsA
Full dataset record for a single fund by fund_id.
Use resolve_entity first if you only have a fund name, not an ID.
Inputs: fund_id (required). Returns: object
get_schema_contractA
Full schema contract as Markdown (stage discipline, integrity rules).
Prefer get_schema_contract_summary for a compact JSON view. Not
intended as the first step for routine lookups — use when you need the
complete governance text or summary is insufficient.
Inputs: no named parameters. Returns: object
get_schema_contract_summaryA
Machine-readable JSON schema contract for all datasets (layers, keys, grain, cross-layer rules).
Use for cross-dataset analysis when you need formal governance rules. Avoid as the first call for simple single-table questions when column names are already provided to the model — the payload is large.
Inputs: no named parameters. Returns: object
list_datasetsA
List registered datasets (URI, primary key, grain, description).
Prefer analysis tools (portfolio_summary, rank_by_column, etc.) when
the client already documents fund.csv / pledges.csv / projects.csv —
do not call this as a first step only to rediscover known files, as
responses can be large.
Use when the dataset list is unknown or you need registry metadata.
Inputs: no named parameters. Returns: object
list_unique_valuesA
Sorted unique non-null values in a column (max 200).
Use to discover valid filter values (fund_type names, sector names, etc.)
before passing them to query tools.
Inputs: column (required), limit, filename, dataset_uri. Returns: object
missing_reportA
For any dataset table, groups rows by 'group_by' and reports missing-value
counts across the specified 'columns'.
Use before analysis to audit data completeness and find problematic records.
Example: missing_report('fund.csv', 'fund_type', ['pledge', 'deposit'])
(filename aliases map to database-backed tables by default.)
Inputs: columns (required), filename (required), group_by (required), limit. Returns: object
portfolio_summaryA
Portfolio-wide totals across all funds: fund count, sums for each
pipeline stage, total number_of_projects_approved when present, and
adaptation/mitigation fund counts. No arguments.
Use when the user asks: total pledged/approved/disbursed across ALL
funds, how many projects approved in total, global share of approved
funding disbursed (or not yet disbursed), or overall
disbursement-to-pledge ratio (derive from returned totals).
Do NOT use for a single fund — use fund_conversion_ratios,
fund_summary, or fund_stage_totals(scope='fund', fund_id=...).
Inputs: no named parameters. Returns: object
preview_datasetA
First N rows of any dataset table (max 25).
Pass 'filename' or 'dataset_uri'.
Use to inspect raw data shape before analysis.
Inputs: n, filename, dataset_uri. Returns: object
rank_by_columnA
Rank any grouping column by any numeric column in any dataset.
When to use:
- Top donors or contributors by pledged or deposited amount
(pledges.csv, group_by contributor or country).
- Regional or recipient analysis (projects.csv, group_by
world_bank_region or country).
- LDC vs non-LDC, SIDS, sector (e.g. agriculture), grant vs loan —
group_by the relevant column on projects.csv.
- Which funds approve the most projects (fund.csv,
value_column=number_of_projects_approved).
- Ascending or descending order (ascending parameter).
Do NOT use when:
- The dataset is long-format (stage as row values) and you rank by
stage — use rank_entities instead.
- On fund.csv you only need standard pipeline stage totals ranked —
prefer rank_entities(filename='fund.csv', group_by='fund',
stage=...) for pledge/deposit/approval/disbursement.
'value_column': any numeric column in the file.
'filters': optional {column: value | [value, ...]} dict to narrow rows
before ranking. List values use OR logic (any match kept).
If a string value does not match exactly, substring fallback is tried:
unambiguous → auto-resolved with filter_resolutions in response;
ambiguous → error listing candidates; no match → error listing
available values for that column.
'top_k': number of groups to return (default 20, max 100). Check
total_groups_found in the response to see if results were truncated.
Inputs: filename (required), group_by (required), value_column (required), top_k, +2 more. Returns: object
rank_entitiesA
Rank entities by a finance STAGE total: pledge, deposit, approval, or
disbursement. Supported layouts: wide (one column per stage, e.g.
fund.csv) or long ('stage' + 'amount' columns).
When to use:
- Ranking by a pipeline stage column (pledge/deposit/approval/
disbursement), especially on fund.csv (e.g. top funds by pledged
amount, most deposits received).
Do NOT use when:
- Ranking donors, contributors, countries, regions, or projects —
use rank_by_column on pledges.csv or projects.csv with the right
group_by and value_column.
- Ranking by number_of_projects_approved, ratios, percentages, or
non-stage numeric columns — use rank_by_column or
fund_conversion_ratios / filter_funds_by_threshold as appropriate.
- You need ascending sort — use rank_by_column.
'stage': pledge | deposit | approval | disbursement.
'filters': optional {column: value} dict to narrow rows before ranking.
Inputs: stage (required), filename (required), group_by (required), top_k, +3 more. Returns: object
resolve_entityA
Fuzzy-match a user-supplied string against real column values (difflib).
Always call this before any tool that takes a fund name, type, or sector
string — prevents 'not found' errors from typos or partial names.
Returns best_match (the value to pass to other tools) plus candidates.
Inputs: query (required), column (required), top_k, filename, +1 more. Returns: object
search_fundsA
Keyword search across fund name, type, focus, and sector columns.
Returns matching rows with key financial metrics.
Each row includes match_relevance (0–1) vs the query for the best-matching
searched cell — low scores mean substring-only hits; tell the user to verify.
Use as the primary entry point when a user mentions a fund name or theme.
Inputs: query (required), limit. Returns: object
sector_summaryA
Totals and share grouped by fund_focus_sector (adaptation / mitigation /
multiple / none focus of the fund entity). 'metric' is the stage column
(pledge/deposit/approval/disbursement).
Use when the user asks how pledges or flows split across fund *focus*
sectors at the fund level.
Do NOT use for geographic regions — use rank_by_column on
projects.csv grouped by world_bank_region (or country).
Do NOT use for project-level sectors (e.g. agriculture) — use
rank_by_column on projects.csv grouped by sector.
Inputs: top_n, metric. Returns: object
start_runA
Begin a new audit run for a user query.
Call once at the start of each user question.
Clears previous in-memory events and returns a run_id.
All subsequent tool calls will log themselves to this run automatically.
Inputs: query (required). Returns: result
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
Loading tool schema changelog…
TDQS
Scored across 26 tools
Each tool has a well-defined, distinct purpose. Overlaps like fund_summary vs fund_details vs fund_stage_totals are clearly differentiated in descriptions, and audit/schema tools are separate from analysis tools. No ambiguity.
All tool names use snake_case with a consistent verb_noun or noun_verb pattern (e.g., start_run, list_datasets, fund_summary). No mixing of conventions like camelCase.
26 tools is on the higher side but still reasonable for a comprehensive climate finance analysis server. Each tool earns its place with distinct functionality, though slight trimming could be considered.
The tool surface covers CRUD-like operations (search, get details, summarize, compare, rank, filter) and includes audit/meta tools. Minor gaps exist (e.g., no direct update tool), but core analytical workflows are well-covered.
Maintenance
Related MCP Connectors
Read-only cited financial datasets, bounded research queries and source diagnostics.
500+ transparent financial methods calculated from raw statements, not third-party endpoints.
Normalized SEC EDGAR fundamentals. 3 of 6 tools free; the rest $0.04-$0.10 per call in USDC.
443 finance tools, 60 prompts: quant, SEC and EU filings, fact checks, rates, odds, DeFi, macro.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceProvides 667 specialized tools for financial and operational tasks, including fund accounting, compliance, DeFi, and tax management. It enables users to integrate extensive financial intelligence and automated workflows into any MCP-compatible client.1-
- AlicenseNot gradedqualityAmaintenanceExposes over 250 financial data tools across 24 categories — including stocks, ETFs, crypto, forex, commodities, economics, company fundamentals, and SEC filings — to AI assistants over HTTP/SSE. Supports dynamic, static, or full tool loading so clients can enable only the toolsets they need at runtime.444 npmApache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to access and analyze financial data, stock information, company fundamentals, market insights, and 250+ tools across asset classes. Supports flexible hosted or self-hosted deployment with dynamic toolset management.444 npmApache 2.0
- AlicenseNot gradedqualityAmaintenanceExposes 250+ financial data tools to AI assistants, enabling access and analysis of stocks, company fundamentals, ETFs, crypto, forex, commodities, economic indicators, and market insights.444 npmApache 2.0