NBP MCP
Server Details
Official Polish central bank (NBP) exchange rates, currency conversion and gold prices.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 5 tools
The pairing of nbp_exchange_rate (single currency vs PLN) and nbp_exchange_rates (full table) differs only by a trailing 's', creating a real misselection risk despite the descriptions. nbp_rate_series vs nbp_exchange_rate is also a plausible confusion point (history vs single point), though nbp_convert and nbp_gold_price are clearly distinct.
All names share a consistent nbp_ snake_case prefix and readable noun/verb forms (convert, exchange_rate, gold_price, rate_series). The only blemish is the singular/plural pair exchange_rate vs exchange_rates, which is a semantic distinction carried by one character.
Five tools is well-scoped for an exchange-rate data source: conversion, single rate, table snapshot, gold price, and time series each cover a distinct need. Nothing feels padded or missing at the count level.
The surface covers conversion, current/historical rates, full tables, gold, and series history with date-window chaining guidance. Minor gaps exist (e.g. no tool to enumerate supported currency codes or available tables/date ranges), but agents can work around them.
Available Tools
5 toolsnbp_convertConvert currencies via NBP ratesAInspect
Convert an amount between two currencies using official NBP mid rates, cross-rated through PLN. Supports PLN and every currency NBP quotes: table A is used first and table B (exotic currencies, published Wednesdays) is consulted automatically for codes A doesn't carry — each side of the response shows the rate, table and effectiveDate used. Latest rates by default, or historical with date. NBP publishes only on Polish business days — on weekends/holidays the request falls back to the most recent preceding publication; effectiveDate in the response shows the date actually used.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Target currency code (e.g. EUR, PLN). Case-insensitive. | |
| date | No | Optional historical date (YYYY-MM-DD). Omit for the latest rates. | |
| from | Yes | Source currency code (e.g. USD, PLN). Case-insensitive. | |
| amount | Yes | Amount in the source currency to convert. | |
| no_cache | No | Force a fresh NBP fetch and bypass this server's result cache. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden and does so well: it discloses table A/table B lookup order, automatic consultation of table B for exotic currencies, response fields showing rate, table, and effectiveDate, and non-business-day fallback behavior. These are exactly the operational traits an agent needs to invoke and interpret the tool correctly.
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?
The description is front-loaded with the core conversion purpose and then layers on only relevant details about table selection, response fields, and publication fallback. Every sentence contributes useful operational context without repetition or filler.
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?
Given there is no output schema, the description sufficiently explains the relevant response structure by noting that each side of the response shows the rate, table, and effectiveDate used. Combined with its explanation of date handling and fallback behavior, an agent has enough information to call and interpret the tool correctly.
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 baseline is 3, but the description adds meaningful semantics beyond the schema by explaining that date selects historical rates and that weekends/holidays resolve to the most recent preceding publication. It does not mention no_cache, but the schema already documents that parameter adequately.
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 states a specific verb and resource: convert an amount between two currencies using official NBP mid rates, cross-rated through PLN. This clearly separates it from the sibling rate-retrieval tools such as nbp_exchange_rate and nbp_rate_series without requiring the agent to compare schemas.
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 gives clear usage context: latest rates by default, historical rates when date is provided, and automatic fallback to the most recent preceding publication on weekends/holidays. It does not explicitly name the sibling tools as alternatives or state when not to use this conversion tool, so it stops short of full routing guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nbp_exchange_rateNBP currency rate vs PLNAInspect
Get the official NBP rate for one currency against PLN (Polish złoty) — the latest rate by default, or the rate in force on a historical date. Tables 'a'/'b' return the mid rate; table 'c' returns bid/ask. NBP publishes only on Polish business days — on weekends/holidays the request falls back to the most recent preceding publication; effectiveDate in the response shows the date actually used. Use nbp_rate_series for a multi-day history.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Three-letter ISO 4217 currency code (e.g. USD, EUR, CHF). Case-insensitive. | |
| date | No | Optional historical date (YYYY-MM-DD). Omit for the latest rate. | |
| table | No | NBP table: 'a' (default) = official mid rates of ~35 major currencies, published every business day; 'b' = mid rates of ~115 less-traded currencies, published Wednesdays; 'c' = bid/ask (buy/sell) rates of major currencies, published every business day. | |
| no_cache | No | Force a fresh NBP fetch and bypass this server's result cache. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden and does it well: it discloses the weekend/holiday fallback to the last preceding publication, that effectiveDate in the response shows the date actually used, and that table 'c' returns bid/ask rather than a mid rate. It does not discuss caching behavior beyond what the schema's no_cache field implies, but the key gotcha for an agent (silent date fallback) is surfaced.
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 compact sentences, front-loaded with the core action and default, then table semantics, then the fallback caveat, then the alternative tool. No filler and nothing buried.
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?
No output schema exists, yet the description names a return field (effectiveDate) and its meaning, which is exactly the gap that would otherwise hurt. The only shortfall is the lack of differentiation from the other rate-related siblings (nbp_convert, nbp_exchange_rates).
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 baseline is 3, but the description adds behavior the schema does not: that 'date' is the rate 'in force on' that day rather than a strict publication date, and the mid-vs-bid/ask consequence of the table choice. That is meaningful semantics beyond the enum and pattern already documented.
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 official NBP rate for one currency against PLN') and immediately scopes the two modes: latest by default or a historical date. It also names the sibling it is not (nbp_rate_series) for multi-day history, so an agent can route without opening schemas.
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?
Explicitly routes multi-day history to nbp_rate_series and explains the latest-vs-historical selection via the date parameter. It does not distinguish itself from nbp_convert or nbp_exchange_rates (plural), which remain plausible alternatives for a converting or bulk-rates use case.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nbp_exchange_ratesNBP exchange-rate tableAInspect
Get a full NBP (Polish central bank) exchange-rate table against PLN — the latest published table by default, or the table in force on a historical date. NBP publishes only on Polish business days — on weekends/holidays the request falls back to the most recent preceding publication; effectiveDate in the response shows the date actually used. Rates data starts 2002-01-02.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Optional historical date (YYYY-MM-DD). Omit for the latest table. | |
| table | No | NBP table: 'a' (default) = official mid rates of ~35 major currencies, published every business day; 'b' = mid rates of ~115 less-traded currencies, published Wednesdays; 'c' = bid/ask (buy/sell) rates of major currencies, published every business day. | |
| no_cache | No | Force a fresh NBP fetch and bypass this server's result cache. Default false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does so well: it discloses the Polish business-day publishing calendar, the weekend/holiday fallback to the most recent preceding publication, the presence of effectiveDate to reveal the date actually used, and the 2002-01-02 data start. These are exactly the non-obvious traits that would otherwise cause wrong assumptions about dates.
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?
A front-loaded single paragraph with no filler — purpose first, then the calendar/fallback caveat, then the data-range bound. It is dense enough that splitting into purpose-and-behavior sentences would scan faster, but every clause carries information.
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?
All three optional parameters are covered and the return payload is partially characterized via effectiveDate, which matters because there is no output schema. It stops short of describing the shape of the rate list itself (currency code plus mid/bid/ask fields), which is the only remaining gap for a caller.
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 the schema already documents date, table, and no_cache, making 3 the baseline. The description earns above baseline by adding real semantics for `date`: the business-day fallback rule and the historical lower bound (2002-01-02) are not derivable from the schema's 'Optional historical date (YYYY-MM-DD)'.
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 gives a specific verb and resource ('Get a full NBP ... exchange-rate table against PLN'), and 'full ... table' implicitly separates it from the singular nbp_exchange_rate. Siblings are never named, so differentiation relies on the agent inferring singular-vs-table from the tool name.
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 clearly explains the two operating modes (latest by default, or a historical date), which is useful internal guidance. But it never states when to prefer this over nbp_exchange_rate, nbp_rate_series, or nbp_convert, so sibling selection is left to inference from the names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nbp_gold_priceNBP gold priceAInspect
Get the official NBP gold price — PLN per 1 gram of 1000-fineness gold. Latest price by default; or one historical date; or the last N quotes (last_n, max 255); or a start_date/end_date range (max 93 days per query). Published every business day. NBP publishes only on Polish business days — on weekends/holidays the request falls back to the most recent preceding publication; effectiveDate in the response shows the date actually used. Gold data starts 2013-01-02.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | One historical date (YYYY-MM-DD). Mutually exclusive with last_n and the range. | |
| last_n | No | Return the last N published prices (1-255). Mutually exclusive with date and the range. | |
| end_date | No | Range end (YYYY-MM-DD, inclusive). Requires start_date; span ≤ 93 days. | |
| no_cache | No | Force a fresh NBP fetch and bypass this server's result cache. Default false. | |
| start_date | No | Range start (YYYY-MM-DD, inclusive). Requires end_date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full load and does so well: it discloses non-obvious behavior — weekend/holiday requests fall back to the most recent prior publication, and effectiveDate reports the date actually used. The historical boundary (data starts 2013-01-02) is another useful disclosure. It is silent on caching behavior and error/empty-result handling, which keeps it off a 5.
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?
Dense and front-loaded — scope and unit come first, modes second, edge behavior third. Minor redundancy between 'Published every business day' and 'NBP publishes only on Polish business days', which say nearly the same thing twice.
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?
No output schema and no annotations, and the description does name at least one response field (effectiveDate) plus the date floor, which covers the main ambiguity. It stops short of indicating the return shape for the single-value versus list modes, leaving some guesswork about whether last_n/range return an array.
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 the baseline is 3, but the description adds genuinely schema-adjacent meaning: no parameters yields the latest price by default, and the modes are mutually exclusive alternatives rather than combinable filters. The remaining limits (255, 93 days) merely restate schema text.
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?
Names a specific resource and unit (official NBP gold price, PLN per 1 gram of 1000-fineness gold), which immediately distinguishes it from the currency-focused siblings (nbp_convert, nbp_exchange_rate, nbp_rate_series). The four supported query modes are stated in the same breath as the purpose.
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?
Enumerates the four calling modes (default latest, single date, last_n, start/end range) with their caps (255 quotes, 93-day span), so mode selection is clear. It does not explicitly say when to prefer a sibling such as nbp_rate_series, though the gold-only scope makes that largely self-evident.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nbp_rate_seriesNBP currency rate historyAInspect
Get a historical time series of NBP rates for one currency against PLN: either the last N published quotes (last_n, default 30, max 255) or an explicit start_date/end_date window (max 93 days per query — NBP's hard limit; chain calls for longer spans). Quotes exist only for publication days: business days for tables 'a'/'c', Wednesdays for 'b'. Data starts 2002-01-02.
| Name | Required | Description | Default |
|---|---|---|---|
| code | Yes | Three-letter ISO 4217 currency code (e.g. USD, EUR, CHF). Case-insensitive. | |
| table | No | NBP table: 'a' (default) = official mid rates of ~35 major currencies, published every business day; 'b' = mid rates of ~115 less-traded currencies, published Wednesdays; 'c' = bid/ask (buy/sell) rates of major currencies, published every business day. | |
| last_n | No | Return the last N published quotes (1-255). Default 30. Mutually exclusive with start_date/end_date. | |
| end_date | No | Window end (YYYY-MM-DD, inclusive). Requires start_date; span ≤ 93 days. | |
| no_cache | No | Force a fresh NBP fetch and bypass this server's result cache. Default false. | |
| start_date | No | Window start (YYYY-MM-DD, inclusive). Requires end_date. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the behavioral burden and discloses key constraints: maximum 93-day windows, chaining for longer spans, publication-day availability for tables 'a'/'c' versus Wednesdays for 'b', and data starting 2002-01-02. It does not mention auth, rate limits, caching, or return shape, but it adds substantial behavioral context beyond the schema.
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?
The description is compact and front-loaded: it opens with the core purpose, then presents the two query modes and key constraints. Every sentence contributes useful information without repetition or filler.
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 six-parameter historical-series tool with a fully described schema but no annotations or output schema, the description covers purpose, mode selection, NBP's hard limit, publication calendars, and data start. It could say more about return format or caching, but it is complete enough for correct invocation.
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 schema already documents code, table, last_n, start_date, end_date, and no_cache in detail. The description reinforces the two query modes and adds the useful chaining note for spans over 93 days, but most parameter meaning is already present in 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?
The description states a specific verb and resource: retrieving a historical time series of NBP rates for one currency against PLN. It clearly separates this from a current-rate or conversion tool through the phrase "historical time series," though it does not explicitly name sibling 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?
It gives clear usage modes: either last_n quotes or an explicit start_date/end_date window, and notes that longer spans require chained calls due to NBP's 93-day limit. It does not explicitly compare this tool with siblings like nbp_exchange_rate or nbp_convert, but the operational context is clear.
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.
5 tool updates
- First observed
nbp_convert - First observed
nbp_exchange_rate - First observed
nbp_exchange_rates - First observed
nbp_gold_price - First observed
nbp_rate_series
Related MCP Connectors
Official exchange rates from central banks: latest & historical rates plus currency conversion.
Official ČNB exchange rates — daily & historical CZK vs EUR, USD, 30+ currencies. For accounting.
Unofficial access to CBRT/TCMB daily exchange rates: latest, history since 1996, conversion.
Official ECB euro reference rates for invoices and tax returns. $0.004/call via x402.
Related MCP Servers
- AlicenseAqualityDmaintenanceFetches official currency exchange rates from the National Bank of Kazakhstan, supports conversion and rate dynamics tracking.515 npmMIT
- AlicenseAqualityBmaintenanceLocal MCP server for the Polish National Bank (NBP) public API enabling exchange rates, gold prices, and currency conversion without authentication.6MIT
- AlicenseNot gradedqualityBmaintenanceProvides National Bank of Romania (BNR) FX reference rates without API key.425 npmMIT
- AlicenseNot gradedqualityBmaintenanceEnables access to National Bank of Poland (NBP) financial data, including exchange rates and other economic indicators, through the NBP Web API without requiring an API key.385 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.