NBG Rates (National Bank of Georgia)
Server Details
GEL exchange rates from the National Bank of Georgia with per-unit values. Not affiliated with NBG.
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- akalongman/nbg-rates-mcp
- GitHub Stars
- 3
- Server Listing
- NBG Rates
TDQS
Scored across 5 tools
Each tool has a clearly distinct purpose: single conversion (nbg_convert) vs batch conversion (nbg_convert_many), point-in-time rates (nbg_get_rates) vs historical range (nbg_rate_history), and currency enumeration (nbg_list_currencies). The names and descriptions make the boundaries unambiguous, so an agent can select correctly without guessing.
All five tools follow the same nbg_ verb_noun snake_case convention (nbg_convert, nbg_convert_many, nbg_get_rates, nbg_list_currencies, nbg_rate_history). The pattern is predictable throughout with no mixing of conventions.
Five tools is well-scoped for a currency-rates service, with each tool earning its place (convert, bulk convert, list, current rates, history). No redundancy and no thinness.
The surface covers the full lifecycle for this domain: currency enumeration, single-date rates, historical ranges, and both single and bulk conversion. No obvious operation is missing and the batch variant handles the multi-invoice use case.
Available Tools
5 toolsnbg_convertConvert via NBG rateARead-onlyIdempotentInspect
Converts an amount between two currencies using the official NBG rate in force on a calendar date. Either side may be GEL; a pair without GEL is converted through GEL (via: "GEL"). Show resultRounded as the amount; result is the unrounded value for further calculation. Dates are calendar days in Tbilisi; the default is today. NBG sets a rate on business days around 17:00 Tbilisi time, valid from the next calendar day until the next rate, so after 17:00 tomorrow can be requested by date. Sundays, Mondays and days after a public holiday have no rate of their own: the rate in force was set earlier and is returned with carriedOver true and effectiveDate set to the day it took effect. Quote effectiveDate when carriedOver is true. A date whose rate NBG has not published yet returns an error, never a guess.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | ISO 4217 code, or GEL. | |
| date | No | Calendar date YYYY-MM-DD whose official rate to apply. Defaults to today in Tbilisi. | |
| from | Yes | ISO 4217 code, or GEL. | |
| amount | Yes | Amount in the "from" currency. May be negative. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| via | Yes | |
| from | Yes | |
| rate | Yes | One unit of "from" expressed in "to" |
| amount | Yes | |
| result | Yes | Unrounded |
| carriedOver | Yes | true when the rate in force on requestedDate took effect on an earlier day; it is still the official rate |
| effectiveDate | Yes | Calendar date the returned rate took effect, as published by NBG |
| requestedDate | Yes | |
| resultRounded | Yes | result rounded half up to 2 decimals from the exact value; the amount to show. JSON drops trailing zeros, so 3.90 arrives as 3.9. Exact up to about 7e13 in the target currency; above that the nearest double. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover safety (readOnly, idempotent, non-destructive), and the description adds substantial behavior beyond them: rate publication at ~17:00 Tbilisi with next-day validity, carried-over rates on Sundays/Mondays/post-holidays flagged via carriedOver and effectiveDate, and an explicit 'error, never a guess' failure mode. That is exactly the extra context an agent needs to interpret results.
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?
One dense paragraph, front-loaded with the core purpose, then usage, then output/date semantics. Every sentence carries information, though the 17:00/carried-over timing block is lengthy and could be tightened without losing meaning.
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 4-parameter conversion tool with annotations and an output schema, the description covers input constraints, the GEL routing rule, output-field usage (resultRounded vs result), date/rollover behavior, and error semantics. Nothing an agent needs to call it correctly is missing.
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 real meaning: it constrains 'from'/'to' to currency sides (one may be GEL), explains the implicit GEL conversion and the 'via' output value, and clarifies 'date' is a Tbilisi calendar day defaulting to today with post-17:00 forward availability.
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 opening sentence names a specific verb and resource ('Converts an amount between two currencies') and pins the rate source and effective-date semantics. This clearly separates it from nbg_convert_many (bulk) and nbg_rate_history (historical listing), so an agent can route correctly without opening the schema.
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 concrete usage context: either side may be GEL, non-GEL pairs route through GEL with a 'via' value, and the date defaults to today in Tbilisi. It also implies the single-pair use case but never explicitly names an alternative tool (e.g. nbg_convert_many) or states exclusions, so it stops short of a full when/when-not statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nbg_convert_manyConvert a list via NBG ratesARead-onlyIdempotentInspect
Converts a list of amounts, each at the official NBG rate in force on its own date: one call for a list of invoices. Items are answered independently; a bad date or code fails only its item, with the error text in that item. total is present when every converted item has the same target currency and covers the converted items only; call it partial when skipped is not 0. Once NBG stops answering, the remaining dates fail with the same error without being asked. Show resultRounded as the amount; result is the unrounded value for further calculation. Dates are calendar days in Tbilisi; the default is today. NBG sets a rate on business days around 17:00 Tbilisi time, valid from the next calendar day until the next rate, so after 17:00 tomorrow can be requested by date. Sundays, Mondays and days after a public holiday have no rate of their own: the rate in force was set earlier and is returned with carriedOver true and effectiveDate set to the day it took effect. Quote effectiveDate when carriedOver is true. A date whose rate NBG has not published yet returns an error, never a guess.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | 1 to 100 conversions, each with the fields of nbg_convert; items are answered independently. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | One entry per input item, in input order: a conversion, or the item with an error |
| total | No | Present only when at least one item converted, every converted item has the same target currency, and the sum is a finite number. It covers the converted items only: when skipped is not 0, say the total is partial and list the skipped items. |
| skipped | Yes | |
| converted | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The annotations already cover read-only, open-world, idempotent, and non-destructive behavior, but the description adds substantial operational context: per-item error isolation, when total becomes partial via skipped, NBG outage fallback, resultRounded vs result semantics, Tbilisi calendar rules, rate publication timing, and carriedOver/effectiveDate behavior. It also states that unpublished rates return an error rather than a guess.
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?
Despite its length, the description is front-loaded with purpose and then proceeds through item independence, aggregation, rate timing, and output-field guidance. Each sentence carries necessary behavioral detail for a complex batch-rate tool.
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?
An output schema exists, but the description still explains crucial return-field semantics like resultRounded, result, total, skipped, carriedOver, and effectiveDate. Combined with detailed failure and rate-publication rules, an agent has enough context to call and interpret this 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 coverage is 100%, and the nested item fields are already documented with descriptions and defaults. The description reinforces date semantics ('calendar days in Tbilisi', default today) but adds little beyond what the schema already states for the items parameter.
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 (Converts), the resource (a list of amounts), and the key scoping rule (each at the official NBG rate in force on its own date). The phrase 'one call for a list of invoices' makes the batch purpose distinct from the single-conversion sibling nbg_convert.
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 context for use: converting a list of invoices in one call, with items answered independently. It does not explicitly name when to use nbg_convert instead or state exclusions, so it falls short of full alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nbg_get_ratesNBG rates for a dateARead-onlyIdempotentInspect
Official National Bank of Georgia (NBG) exchange rates of the Georgian lari (GEL) in force on one calendar date. Every rate is GEL per ONE unit of the currency (NBG quotes some currencies per 10, 100, 1000 or 10000 units; the raw pair is returned as nbgQuantity and nbgRate). Dates are calendar days in Tbilisi; the default is today. NBG sets a rate on business days around 17:00 Tbilisi time, valid from the next calendar day until the next rate, so after 17:00 tomorrow can be requested by date. Sundays, Mondays and days after a public holiday have no rate of their own: the rate in force was set earlier and is returned with carriedOver true and effectiveDate set to the day it took effect. Quote effectiveDate when carriedOver is true. A date whose rate NBG has not published yet returns an error, never a guess. When nbgQuantity is not 1, state NBG's quoted form first, nbgRate GEL per nbgQuantity units (for example 1.6452 GEL per 100 JPY), and the per-unit rate beside it: that quoted form is what nbg.gov.ge and accounting software show.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | Calendar date YYYY-MM-DD. Defaults to today in Tbilisi. Tomorrow's rate exists after about 17:00 Tbilisi time. | |
| language | No | Language of currency names: en (default) or ka (Georgian). Codes, numbers and dates are identical in both. | |
| currencies | No | ISO 4217 codes to return, case-insensitive, duplicates ignored (for example ["USD", "EUR"]). Omit for all currencies. GEL has no row, since every rate is in GEL, so it is listed in unknownCodes. |
Output Schema
| Name | Required | Description |
|---|---|---|
| rates | Yes | |
| carriedOver | Yes | true when the rate in force on requestedDate took effect on an earlier day; it is still the official rate |
| unknownCodes | Yes | |
| effectiveDate | Yes | Calendar date the returned rate took effect, as published by NBG |
| requestedDate | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, and the description layers substantial extra behavior on top: carriedOver/effectiveDate semantics, the guarantee that unpublished dates return an error 'never a guess,' and the nbgQuantity quoting convention. This is real context the agent cannot get from structured fields.
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?
Purpose is front-loaded and nearly every sentence carries operational weight (timing, carried-over handling, error guarantee). It runs long at roughly 200 words, and the final output-formatting instruction partly duplicates what the output schema covers, but there is little true 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 rate-lookup tool with an output schema, it covers everything an agent needs: default date, business-day publication timing, carried-over behavior, error-on-unpublished, and how to present multi-unit quotes. Nothing material is missing.
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 date, language and currencies are already fully documented, including the 17:00 timing note that the description repeats. The extra detail about nbgQuantity and GEL landing in unknownCodes concerns output interpretation rather than the input parameters, so baseline 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?
States a specific verb+resource: official NBG GEL exchange rates 'in force on one calendar date.' The single-date framing implicitly separates it from nbg_rate_history, but no sibling is named explicitly, so it stops short of full sibling differentiation.
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?
Offers operational timing guidance (default is today; after 17:00 Tbilisi tomorrow can be requested), which implies when the tool applies. However, it never says when to prefer this over nbg_convert, nbg_convert_many or nbg_rate_history, leaving tool selection to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nbg_list_currenciesNBG currency listARead-onlyIdempotentInspect
Lists every currency NBG publishes a GEL rate for today, with its name and the unit quantity NBG quotes it in. NBG quoted other currencies in the past, so a code missing here may still have historical rates. nbgQuantity is the unit count NBG quotes the raw rate for (JPY is quoted as 1.6452 GEL per 100 JPY); for the rates themselves call nbg_get_rates.
| Name | Required | Description | Default |
|---|---|---|---|
| language | No | Language of currency names: en (default) or ka (Georgian). Codes, numbers and dates are identical in both. |
Output Schema
| Name | Required | Description |
|---|---|---|
| currencies | Yes | |
| effectiveDate | Yes | Calendar date the returned rate took effect, as published by NBG |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description adds real behavioral context beyond that: the list is a today-only snapshot, absent codes may still have history, and nbgQuantity explains the quoting unit (with a concrete JPY example) that would otherwise be misinterpreted as a raw price.
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 sentences, each carrying distinct load: scope, historical caveat, and unit semantics plus alternative routing. The scoping statement is front-loaded and there is no 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?
An output schema exists, so return values need no prose explanation, and the annotations cover the safety profile. What remains — the today-only scope, the historical-gap caveat, and the quoting-unit semantics — is exactly what the description supplies.
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% and the single language parameter is fully documented in the schema, including the en/ka enum and the default. The description adds nothing about the parameter, 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?
States a specific verb and resource ('Lists every currency NBG publishes a GEL rate for today') and scopes it to today's published set. It explicitly routes rate retrieval to the sibling nbg_get_rates, so an agent can distinguish it from nbg_get_rates without opening either schema.
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 explicit routing: 'for the rates themselves call nbg_get_rates', which names the alternative and the condition that selects it. It also warns that a missing code may still have historical rates, preventing a false negative when the agent is deciding between this tool and nbg_rate_history.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
nbg_rate_historyNBG rate historyARead-onlyIdempotentInspect
Official NBG rate of one currency (GEL per one unit) in force on every calendar day of an inclusive range of at most 366 days. Dates are calendar days in Tbilisi. Days without a rate of their own (Sundays, Mondays and days after a public holiday; before September 2021 NBG set a rate for every calendar day) carry the earlier rate. Days whose own rate is in force contain only date and rate; a carried-over day adds effectiveDate and carriedOver: true. Quote effectiveDate when carriedOver is true. A range reaching a date NBG has not published yet returns an error. summary holds the first, last, change, lowest and highest rate with their dates, and the average over the calendar days, computed by the server: report those rather than deriving them. One NBG request per call.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | Last calendar day, inclusive. At most 366 days including "from". | |
| from | Yes | First calendar day, inclusive. | |
| currency | Yes | ISO 4217 code, for example USD. |
Output Schema
| Name | Required | Description |
|---|---|---|
| to | Yes | |
| days | Yes | |
| from | Yes | |
| summary | Yes | Computed by the server; report these instead of deriving them from days. change and average are exact, rounded half up to the decimals NBG's quantity gives the currency, 4 + log10(nbgQuantity), the largest over the days (4 for USD, 7 for AMD). |
| currency | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly, idempotent, non-destructive, open world); the description goes well beyond them by disclosing carry-over semantics, the effectiveDate/carriedOver fields and when to quote them, the error on unpublished dates, the Tbilisi calendar basis, and the one-request-per-call limit. This is exactly the behavioral context an agent needs to interpret results 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?
Purpose and scope are front-loaded in sentence one, and every sentence carries information (carry-over, errors, summary, request budget). The middle section is a dense run-on that takes effort to parse, but there is no filler to cut.
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 3-parameter, single-request range query with an output schema, the description covers the edge cases that matter: carry-over days, unpublished-date errors, and the server-computed summary. Even though an output schema exists, the explanation of carriedOver semantics is the key to correct interpretation and is fully provided.
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; the description adds genuine meaning beyond the schema by fixing the unit (GEL per one unit) and the timezone basis (Tbilisi calendar days), neither of which appears in the parameter descriptions. It restates the 366-day cap rather than adding to it.
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 first sentence names a specific resource (official NBG rate), its unit basis (GEL per one unit), and its exact scope (every calendar day of an inclusive range up to 366 days). That scope is clearly distinguishable from the convert and list_currencies siblings, which serve different jobs.
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 range-based framing, but no sibling is named and there is no explicit statement of when to prefer this over nbg_get_rates or nbg_convert. The closest thing to guidance is operational ('one NBG request per call', 'report summary rather than deriving them'), which governs use of the result rather than tool selection.
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
nbg_convert - First observed
nbg_convert_many - First observed
nbg_get_rates - First observed
nbg_list_currencies - First observed
nbg_rate_history
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.
Free, source-labeled FX rates: 10,296 pairs across 144 currencies, all update ~60s intraday.
National Bank of Romania (Banca Naţională a României, BNR) FX reference rates MCP. Keyless.
Related MCP Servers
- AlicenseAqualityDmaintenanceFetches official currency exchange rates from the National Bank of Kazakhstan, supports conversion and rate dynamics tracking.515 npmMIT
- AlicenseNot gradedqualityBmaintenanceProvides National Bank of Romania (BNR) FX reference rates without API key.8 npmMIT
- AlicenseNot gradedqualityBmaintenanceProvides access to National Bank of Ukraine public statistics without API keys.18 npmMIT

UniRate MCPofficial
AlicenseAqualityCmaintenanceCurrency conversion and exchange rates for AI assistants. 170+ currencies, historical data back to 1999.436 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.