Skip to main content
Glama
AlejandroGuerra1823

colombia-finance-mcp

colombia-finance-mcp

MCP TypeScript Tests License: MIT

An MCP server for Colombian financial data: gives Claude (or any MCP client) live access to the TRM — Colombia's official USD/COP exchange rate, certified by the Superintendencia Financiera — straight from the government open-data API. No API keys, no scraping.

Ask things like:

"What's today's TRM?" "How did the peso move in the first half of 2026? Min, max, average?" "How much is USD 2,500 in pesos at the official rate of last Friday?"

Tools

Tool

What it does

get_trm

Official TRM (COP per USD) for any date since 1991 — today by default. Correctly resolves weekends/holidays to the carried-over rate.

get_trm_range

Daily TRM series between two dates (up to ~5 years) with statistics: min, max, average, percent change. Long ranges are auto-sampled.

convert_usd_cop

Converts USD ⇄ COP at the official TRM of any date.

Example response from get_trm:

{
  "requestedDate": "2026-09-26",
  "copPerUsd": 3306.86,
  "validFrom": "2026-09-26",
  "validTo": "2026-09-28",
  "carriedOver": false,
  "source": "Source: TRM certified by the Superintendencia Financiera de Colombia, published on datos.gov.co (dataset 32sa-8pi3)."
}

Related MCP server: TCMB MCP

Quickstart

Requires Node.js ≥ 18.

git clone https://github.com/AlejandroGuerra1823/colombia-finance-mcp.git
cd colombia-finance-mcp
npm install && npm run build

Claude Code:

claude mcp add colombia-finance -- node /absolute/path/to/colombia-finance-mcp/dist/index.js

Claude Desktop (claude_desktop_config.json):

{
  "mcpServers": {
    "colombia-finance": {
      "command": "node",
      "args": ["/absolute/path/to/colombia-finance-mcp/dist/index.js"]
    }
  }
}

How it works

Claude ──(MCP / stdio)──▶ server.ts ──▶ trm.ts ──▶ datos.gov.co (Socrata API)
                          3 tools        │
                          zod-validated  ├─ validation (dates, series bounds)
                          inputs         ├─ in-memory cache (historical = immutable,
                                         │   current rate = 1h TTL)
                                         └─ stats engine (min/max/avg/Δ%)

Design decisions worth noting:

  • TRM semantics are handled correctly. Each TRM record has a validity window; on weekends and holidays the last business-day rate carries over. Lookups resolve "latest record ≤ date", and responses flag carriedOver explicitly.

  • Cache split by mutability. Historical rates never change → cached forever. The current rate can be superseded → 1-hour TTL.

  • Errors are messages, not crashes. Invalid dates, empty ranges, oversized ranges and malformed upstream data all return structured MCP errors the model can read and act on.

  • stdout is protocol-only. All logging goes to stderr, as the MCP stdio transport requires.

Development

npm run build   # compile TypeScript (strict mode)
npm test        # vitest — 16 unit tests (validation, stats, cache, error paths)

Roadmap

  • UVR (Unidad de Valor Real) lookups

  • IBR reference rate

  • Colombian inflation (IPC) series

  • npm package (npx colombia-finance-mcp)

Data source & disclaimer

Data comes from datos.gov.co dataset 32sa-8pi3, published by the Superintendencia Financiera de Colombia. This project is informational and not financial advice.

Author

Alejandro Guerra — AI Engineer · digital banking LinkedIn · Portfolio · GitHub

MIT © 2026

Available Tools

3 tools
convert_usd_copConvert between USD and COP at official TRMA

Convert an amount between USD and COP using the official TRM of a given date (defaults to today). Source: TRM certified by the Superintendencia Financiera de Colombia, published on datos.gov.co (dataset 32sa-8pi3).

NameRequiredDescriptionDefault
dateNoTRM date to use (YYYY-MM-DD, omit for today)
amountYesAmount to convert
directionYesConversion direction

TDQS

A3.5/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden. It usefully discloses provenance (TRM certified by the Superintendencia Financiera, datos.gov.co dataset 32sa-8pi3), which is real behavioral context. However, it omits operational traits an agent needs: what happens when the requested date has no published TRM (weekends/holidays), result precision/rounding, and whether any auth or rate limit applies.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness5/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two tight sentences: the core action and date default come first, then source provenance. No filler, no redundancy with the title or schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

There is no output schema, so the description should hint at the return shape, and for a date-driven exchange-rate tool the handling of non-published dates is a material omission. Provenance and defaulting are covered, but the agent still lacks enough to predict failure or output format.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, so all three parameters are already documented, and the description's 'defaults to today' merely restates the schema's 'omit for today'. No additional meaning (e.g. direction semantics, expected magnitudes) is added, so the baseline of 3 applies.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description names a specific verb (Convert) and resource (USD/COP amount) and pins the rate basis to the official TRM of a given date. It implicitly separates itself from get_trm/get_trm_range by being a conversion rather than a lookup, but never names those siblings explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states the default behavior (date omitted = today), which frames usage, but gives no guidance on when to prefer this over get_trm or get_trm_range. The only routing signal is the word 'Convert', left for the agent to infer.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_trmGet TRM (USD/COP official rate)A

Get Colombia's official TRM exchange rate (COP per 1 USD) for a date. Omit the date for today's rate. Weekends and holidays return the carried-over rate from the last business day. Series starts 1991-12-02. Source: TRM certified by the Superintendencia Financiera de Colombia, published on datos.gov.co (dataset 32sa-8pi3).

NameRequiredDescriptionDefault
dateNoDate in YYYY-MM-DD (omit for today's rate, America/Bogota time)

TDQS

A3.9/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the holiday/weekend carry-over behavior, the series start date (1991-12-02), and the authoritative source. It omits anything about the response shape or rate limits, but for a read-only public rate lookup that is a minor gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Four tight sentences, front-loaded with the core purpose, then behavior, then provenance. The source/dataset citation is marginally optional but inexpensive and supports trust, so nothing meaningfully wasteful.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-optional-param read tool with no output schema, the description covers the key unknowns: default behavior, timezone, carry-over semantics, historical start, and units (COP per 1 USD). It never sketches the return payload, which is the only notable omission.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100% and there is a single optional parameter, so the baseline is 3. The description's 'omit the date for today's rate' and the Bogota-timezone note essentially restate what the schema already documents, adding no new parameter meaning.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get Colombia's official TRM exchange rate (COP per 1 USD) for a date'), with units and scope made explicit. It does not explicitly name the sibling get_trm_range or convert_usd_cop, though 'for a date' (singular) implicitly contrasts with a range lookup.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Gives clear operating context: 'Omit the date for today's rate' and the weekend/holiday carry-over rule tell the agent exactly how to call it and what to expect. It stops short of naming alternatives, e.g. when to prefer get_trm_range or convert_usd_cop instead.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

get_trm_rangeGet TRM history with statisticsA

Get the TRM (USD/COP) daily series between two dates (max ~5 years) with statistics: min, max, average, and percent change. Returns the full series for ranges up to 90 points, otherwise a monthly-sampled series plus stats. Source: TRM certified by the Superintendencia Financiera de Colombia, published on datos.gov.co (dataset 32sa-8pi3).

NameRequiredDescriptionDefault
endYesRange end (YYYY-MM-DD, inclusive)
startYesRange start (YYYY-MM-DD, inclusive)

TDQS

A3.7/5.0
Behavior4/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full burden and does well: it discloses the ~5-year maximum span, the sampling behavior (full series up to 90 points, monthly-sampled otherwise), and exactly what statistics are returned. It omits any auth, rate-limit, or error behavior, but the shape and limits of the response are unusually well described.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Three dense sentences, front-loaded with the core action and limit, followed by return-shape and source details. Every sentence contributes; only the dataset ID citation is arguably incidental to invocation.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

With no output schema and no annotations, the description compensates well by specifying the return contents (min, max, average, percent change) and the conditional full-vs-monthly-sampled series behavior. A note on date ordering or the failure mode for out-of-range dates is the only notable gap.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 100%, so the format and inclusivity of both date parameters are already documented in the schema. The description adds the ~5-year maximum range constraint, which is meaningful, but no further syntax or edge-case semantics beyond the schema.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ('Get the TRM (USD/COP) daily series between two dates') plus the scope and output content (statistics). It is clearly distinct from a single-rate sibling via the two-date range framing, though it never explicitly names get_trm or convert_usd_cop as the alternatives.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the 'between two dates' framing and the 'max ~5 years' limit, which tells the agent when the tool is applicable. There is no explicit when-to-use vs. when-not-to-use guidance or routing to the sibling tools for single-date or conversion needs.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 3 tool updatesv0.1.0
    • First observedconvert_usd_cop
    • First observedget_trm
    • First observedget_trm_range

TDQS

A4/5.0

Scored across 3 tools

Disambiguation5/5

Each tool has a clearly distinct purpose: get_trm retrieves a single date's rate, get_trm_range retrieves a series with statistics, and convert_usd_cop performs currency conversion. There is no overlap or ambiguity in their functions.

Naming Consistency5/5

All tool names follow a consistent verb_noun snake_case pattern (get_trm, get_trm_range, convert_usd_cop). The verbs are appropriate and the naming is predictable.

Tool Count5/5

Three tools is well within the typical 3-15 range and each earns its place by covering a distinct aspect of TRM data: single rate, range with stats, and conversion. The set is neither bloated nor thin.

Completeness5/5

For the inferred domain of Colombia's TRM exchange rate, the surface is complete: it supports retrieving a single date's rate, analyzing a date range with statistics, and converting amounts. No obvious gaps or dead ends exist.

Maintenance

ActivitySlowing
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A template for deploying MCP servers on Cloudflare Workers without authentication. Enables easy creation and deployment of custom MCP tools that can be accessed remotely via Claude Desktop or Cloudflare AI Playground.
    9
    Mozilla Public 2.0
  • A
    license
    B
    quality
    F
    maintenance
    Provides access to Turkish Central Bank (TCMB) exchange rates with current and historical data since 1996, currency conversion, rate history statistics, and multi-currency comparisons with smart caching.
    6
    1
    MIT
  • F
    license
    Not graded
    quality
    D
    maintenance
    Provides real-time and historical foreign exchange rates for 31+ currencies, enabling currency conversion, historical rate lookups, and time series analysis using data from the Frankfurter API.
    -
  • A
    license
    Not graded
    quality
    C
    maintenance
    Provides access to Chilean economic indicators (dolar, UF, IPC, etc.) via the mindicador.cl API, enabling queries for current values, historical series, and specific dates.
    MIT