colombia-finance-mcp
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., "@colombia-finance-mcpHow much is USD 2,500 in COP at last Friday's official rate?"
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.
colombia-finance-mcp
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 |
| Official TRM (COP per USD) for any date since 1991 — today by default. Correctly resolves weekends/holidays to the carried-over rate. |
| Daily TRM series between two dates (up to ~5 years) with statistics: min, max, average, percent change. Long ranges are auto-sampled. |
| 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 buildClaude Code:
claude mcp add colombia-finance -- node /absolute/path/to/colombia-finance-mcp/dist/index.jsClaude 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
carriedOverexplicitly.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 toolsconvert_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).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | TRM date to use (YYYY-MM-DD, omit for today) | |
| amount | Yes | Amount to convert | |
| direction | Yes | Conversion direction |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Date in YYYY-MM-DD (omit for today's rate, America/Bogota time) |
TDQS
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.
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.
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.
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.
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.
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).
| Name | Required | Description | Default |
|---|---|---|---|
| end | Yes | Range end (YYYY-MM-DD, inclusive) | |
| start | Yes | Range start (YYYY-MM-DD, inclusive) |
TDQS
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.
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.
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.
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.
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.
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.
3 tool updates
v0.1.0- First observed
convert_usd_cop - First observed
get_trm - First observed
get_trm_range
TDQS
Scored across 3 tools
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.
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.
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.
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
Related MCP Connectors
Unofficial access to CBRT/TCMB daily exchange rates: latest, history since 1996, conversion.
Chile and LATAM data utilities: UF, RUT, business days, FX and VAT. Free daily MCP quota.
Convert currencies on the daily European Central Bank reference rates. No API key, no signup.
Convert currencies on the daily European Central Bank reference rates. No API key, no signup.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceA 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.9Mozilla Public 2.0
- AlicenseBqualityFmaintenanceProvides 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.61MIT
- FlicenseNot gradedqualityDmaintenanceProvides 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.-
- AlicenseNot gradedqualityCmaintenanceProvides 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