Skip to main content
Glama
Climate MCP Server

Climate MCP Server

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.projects

Design 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 null before 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

cfu://funds

analytics.fund

fund.csv

fund_id

One row per fund

cfu://pledges

analytics.pledges

pledges.csv

pledge_id

One row per pledge record

cfu://projects

analytics.projects

projects.csv

project_id

One row per project

Financial stages (in pipeline order): pledge → deposit → approval → disbursement


Tools Reference

Audit Tools (3)

Tool

Description

start_run(query)

Begin a new audit run; clears previous events and returns a run_id

get_audit_trail()

Compact view of tools called in the current run with datasets and columns used

finalize_run(query?, extra_notes?)

Write the full run log to runs/<run_id>.md and clear memory

Contract Tools (2)

Tool

Description

get_schema_contract_summary()

Machine-readable JSON schema contract (call before cross-dataset analysis)

get_schema_contract()

Full schema contract as Markdown text

Discovery Tools (5)

Tool

Description

list_datasets()

All registered datasets with URI, primary key, grain, and description

describe_dataset(filename?, dataset_uri?)

Row count, column names, dtypes, and null counts

preview_dataset(n?, filename?, dataset_uri?)

First N rows (max 25)

list_unique_values(column, limit?, filename?, dataset_uri?)

Sorted unique non-null values in a column (max 200)

resolve_entity(column, query, top_k?, filename?, dataset_uri?)

Fuzzy-match a user string against real column values — call before passing names to other tools

Summary Tools (9)

Tool

Description

search_funds(query, limit?)

Keyword search across fund name, type, focus, and sector

get_fund_details(fund_id)

Full dataset record for a single fund

fund_summary(fund_id)

Profile card: metadata, stage metrics, portfolio share, and conversion ratios

portfolio_summary()

Portfolio-wide totals: fund count, four-stage sums, adaptation/mitigation counts

sector_summary(metric?, top_n?)

Totals and percentage share by fund_focus_sector

fund_type_distribution(metric?, top_n?)

Totals and percentage share by fund_type

adaptation_vs_mitigation_summary(metric?)

Funds bucketed into adaptation-only / mitigation-only / both / neither

compare_funds(fund_ids, metrics?)

Side-by-side comparison of multiple funds

fund_stage_totals(scope, fund_id?, value?)

Stage totals for portfolio / single fund / fund_type / sector

Finance Tools (5)

Tool

Description

fund_conversion_ratios(fund_name, ...)

Four pipeline ratios for one fund (deposit/pledge, approval/deposit, disbursement/approval, disbursement/pledge)

rank_entities(filename, group_by, stage, top_k?, ...)

Rank a grouping column by a finance stage; supports wide and long dataset layouts

rank_by_column(filename, group_by, value_column, top_k?, ascending?, filters?)

Rank by any numeric column (non-stage columns, ascending order, any dataset)

filter_funds_by_threshold(filename, ratio_metric, threshold, ...)

Return funds where a ratio metric falls below a threshold

fund_stage_gap(filename?, fund_col?, fund_name?)

Absolute gaps between consecutive stages (pledge→deposit, deposit→approval, approval→disbursement)

Aggregation Tools (1)

Tool

Description

avg_projects_per_fund_by_type(source?, agg?, filters_json?)

Average approved projects per fund grouped by fund_type; supports fund-table fast path or projects-table fine-grained path with filters

Quality Tools (1)

Tool

Description

missing_report(filename, group_by, columns, limit?)

Missing-value counts grouped by a column — audit data completeness before analysis


Setup

Prerequisites

  • Python 3.12+

  • uv package manager

Install

git clone <YOUR_REPO_URL>
cd climate_mcp_server
uv sync

Verify 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.py

The 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

CLIMATE_MCP_TRANSPORT

Client protocol

STDIO (default)

unset or stdio

Process stdin/stdout (Claude Desktop, local Cursor)

SSE

sse or http

HTTP: GET event stream + POST messages (classic MCP remote)

Streamable HTTP

streamable-http

Single HTTP MCP endpoint (newer transport)

Optional:

  • CLIMATE_MCP_HOST — bind address (default 0.0.0.0 for HTTP modes so the VM accepts remote connections; 127.0.0.1 for 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.py

On 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.py

Default 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

  1. Find your repo root path:

    pwd
  2. In Claude Desktop → Settings → MCP Servers, add a new server:

    • Name: finance

    • Transport: stdio

    • Command: uv

    • Args: run, python, mcp_server/finance/server.py

    • Working directory: your repo root path

  3. Restart Claude Desktop. The 26 tools will appear in the tool picker.


Running Tests

uv run python tests/run_tests.py --all

The 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 only

Dependencies

Package

Version

Purpose

mcp[cli]

≥ 1.26.0

FastMCP server framework

pandas

≥ 3.0.0

DataFrame processing and aggregations

duckdb

≥ 1.4.0

Primary dataset storage and table queries

httpx

≥ 0.28.1

HTTP transport support

Python ≥ 3.12 required.

Available Tools

26 tools
adaptation_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

    A3.9/5.0

    Scored across 26 tools

    Disambiguation5/5

    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.

    Naming Consistency5/5

    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.

    Tool Count4/5

    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.

    Completeness4/5

    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

    ActivityInactive
    ResponsivenessNo recent community issues

    Related MCP Connectors

    Related MCP Servers

    • F
      license
      Not graded
      quality
      D
      maintenance
      Provides 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
      -
    • A
      license
      Not graded
      quality
      A
      maintenance
      Exposes 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 npm
      Apache 2.0
    • A
      license
      Not graded
      quality
      A
      maintenance
      Enables 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 npm
      Apache 2.0
    • A
      license
      Not graded
      quality
      A
      maintenance
      Exposes 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 npm
      Apache 2.0