Forever Works MCP servers
Reads and responds to App Store reviews, and provides access to TestFlight feedback and crash logs.
Gives the assistant a dedicated Bitwarden vault for logins, passwords, 2FA codes and passkeys.
Works with Expo Application Services to investigate failed builds, workflow runs and store submissions, and to roll out updates.
Reads Glovo orders as itemised receipts and matches them to card charges through an unofficial API.
Provides tools to search and work in Gmail within the Google Workspace integration.
Integrates with Google Workspace across multiple Google accounts, enabling search and work in Gmail, Calendar, Drive, Docs, Sheets and Slides.
Reads and responds to Google Play reviews.
Reads Home Assistant states, areas and history, and runs actions with approval for locks.
Searches, reads and writes Notion workspaces, with pages as Markdown and typed database queries.
Registers domains and manages DNS, hosting and mail at Porkbun, with purchases requiring confirmation.
Provides tools to work in Google Slides within the Google Workspace integration.
This server does not currently have a deployable release on Glama. Follow the repository's setup instructions to install and configure it for your MCP client, including any required credentials and local dependencies.
mcps
MCP servers that let an AI assistant do a company's everyday work. Most are for services people use anywhere, such as Google Workspace, Notion, Bitwarden, Porkbun, Expo, the app stores and European banks; a second line is for companies in Romania, to file with ANAF, follow the trade register, invoice through Oblio and read the National Bank's rates.
Each server connects an MCP client, such as Claude Code, Claude Desktop, VS Code
or Cursor, to one service. They are built on one toolkit, so every tool says
what it can change: read (it changes nothing), write (it changes something
in your account) or money (it moves money, makes or unmakes a legal or fiscal
document, or commits you in a comparable way, such as a bank consent). Your
client asks you before each money call.
foreverworks.github.io/mcps presents the servers by who they are for, each with its documentation.
Under each server's name: how settled it is, then how many tools it has and the most they can do. Stable: in daily use, and its tools keep their shape. Beta: in use, and new or still growing, or reading web pages its service may change. Experimental: rests on an interface its owner may change without notice, or covers part of the service.
For companies in Romania
The paperwork a company in Romania, and the people who run it, do online: e-invoices and declarations with ANAF, filings at the trade register, invoicing, and the National Bank's exchange rates. Each README ends with the other servers we found for that service, and what this one adds.
Server | What it does |
ANAF e-FacturaStable20 tools, including money | Read, check and file a Romanian company's e-invoices and e-Transport declarations with ANAF. |
ANAF SPVBeta16 tools, including money | Download what ANAF posts to your SPV inbox, request documents, and validate or file declarations. |
BNR exchange ratesStable5 tools, read-only | Look up the National Bank of Romania's rate for any day, and convert amounts to and from RON. |
OblioStable17 tools, including money | Issue and track a Romanian company's invoices on Oblio, with totals computed as ANAF checks them. |
ONRC trade registerBeta9 tools, read and write | Follow your filings at Romania's trade register, with their documents, fee notes and invoices. |
Related MCP server: nbk-mcp
For everyone
Servers for services people use anywhere. We built each one because the servers we found did less, or there were none; each README's last section names them and says what this one adds.
Server | What it does |
App Store and Google PlayBeta7 tools, read and write | Read and answer App Store and Google Play reviews, and see TestFlight feedback and crash logs. |
BitwardenStable17 tools, read and write | Give your assistant its own Bitwarden vault for logins, passwords, 2FA codes and passkeys. |
Expo Application ServicesBeta23 tools, including money | Find out why an Expo build, workflow run or store submission failed, and roll out updates. |
Enable BankingStable10 tools, including money | Read, search and export statements and balances from banks across Europe, without moving money. |
Google WorkspaceStable115 tools, read and write | Search and work in Gmail, Calendar, Drive, Docs, Sheets and Slides across several Google accounts. |
Home AssistantBeta10 tools, read and write | Read your Home Assistant's states, areas and history, and run its actions, approving locks first. |
NotionStable27 tools, read and write | Search, read and write your Notion workspaces, with pages as Markdown and typed database queries. |
PorkbunBeta113 tools, including money | Register domains and manage DNS, hosting and mail at Porkbun, with every purchase confirmed first. |
Trademark searchBeta6 tools, read-only | Check whether a name is already a registered or pending trademark in the US or the EU. |
TypeSafeBeta3 tools, read-only | Get calibrated yes or no answers, choices and scores from TypeSafe's Jev, for one item or 1000 rows. |
Extras
These run from a clone of this repository and are not published to npm, the MCP Registry or as desktop bundles. Each README has the install steps and what the server needs.
Server | What it does |
Bolt Food receiptsExperimental8 tools, read-only | Read your Bolt Food orders as itemised receipts matched to card charges, through an unofficial API. |
Device brokerExperimental10 tools, read and write | Share your own Android emulators, iOS simulators and desktops between AI agents, in fair turns. |
Glovo receiptsExperimental8 tools, read-only | Read your Glovo orders as itemised receipts matched to card charges, through an unofficial API. |
Printer and scannerExperimental10 tools, read and write | Print, scan and check paper and toner on a network printer, with greys corrected for that printer. |
Local RAGBeta10 tools, read and write | Index your PDFs, scans and documents locally, and search them with hybrid retrieval and a reranker. |
Smart homeExperimental7 tools, read and write | Press the buttons of a TV, heater or fan remote by name through a BroadLink IR blaster. |
Shared packages
Package | What it is |
Stdio and HTTP transports with per-client tokens, a guard that classifies, audits and can confirm every tool call, an HTTP and OAuth stack, exact decimals, and byte-exact file inputs | |
receiptsNot published: only extras use it | Itemised receipts, the join from a bank card charge to the order it paid, item search and CSV exports |
Quick start
You need Node 22.19 or newer and an MCP client. The trademark search needs no account and no key for US marks, which makes it a good first server:
git clone https://github.com/foreverworks/mcps.git && cd mcps
npm ci && npm run build
claude mcp add trademarks -- node "$PWD/servers/trademarks/dist/index.js"Then ask your assistant: "Is Turnip already a registered trademark in the US for software?"
Every server's README has its install buttons, the commands for Claude Code and for clients configured with JSON, and the credentials it needs, step by step. A server starts and lists its tools before you configure anything; a tool that needs a credential you have not given answers with an error naming the variable to set. To run one copy that several clients share over HTTP, see docs/deploying.md.
What every server does the same way
Each tool says what it can change. Its class reaches your client in the standard annotations (
readOnlyHint,destructiveHint), so a client can ask before a write. A server will not start with a tool left unclassified.Money waits for you. A
moneytool asks your client to confirm every call; Claude Code does, whatever its permission mode. A deployment can instead have the server ask you itself, in one line naming the amount, the counterparty and the document (how).A deployment can set a ceiling.
MCP_MAX_ACCESS=readturns a server into a read-only one, and a lower ceiling can be set per client.Your data is not retyped. Files go in by path, never as text a model copies; amounts are exact decimal strings, never floating point; an unknown argument is refused by name; results report the SHA-256 of what was stored or sent.
Every call leaves one audit line, without its arguments, its result or any token.
It runs where you run it: over stdio, started by your client, or as one copy on loopback over Streamable HTTP, with a bearer token per client.
Tests never touch a real account. Every outside dependency is a port with a fake, and the test environment has no credentials and no network.
Status
The servers are used every day by the people who wrote them. The fifteen servers
for Romania and for everyone are published on npm and listed in the official MCP
Registry, so npx runs each of them without a clone. The extras are
never published: build them from source as above.
Documentation
Configuration: the variables every server shares, and the conventions for the rest.
Deploying: client configuration, the HTTP transport, and running a server as a systemd service.
Security: the threat model, the guard every call passes, money and confirmation, files in and out.
Authentication: how clients, servers and the services behind them authenticate, and which options a deployment has.
Architecture: how a server and the toolkit are built.
Roadmap: what other MCP servers do that these do not yet, what is done, and what is still open.
Releasing: how packages reach npm and the MCP Registry, and the plugins made from them for Claude Code and Cursor.
Privacy: what the servers do with your data.
Contributing
Fixes, new tools and new servers are welcome. CONTRIBUTING.md
has the setup, the house style and the README template, and npm run check is
the bar for a change. To report a vulnerability, please follow
SECURITY.md rather than opening a public issue.
License
Available Tools
5 toolsannual_averageBNR annual averageARead-onlyIdempotent
BNR's annual average rate for a year, as ANAF converts foreign income in the D212 ("cursul de schimb mediu anual comunicat de BNR"): the mean of the twelve monthly averages, each the mean of the month's daily rates, to four places, with the monthly values and their day counts. Not the mean of the daily rates, which differs. A year not over yet answers the months so far with complete: false.
| Name | Required | Description | Default |
|---|---|---|---|
| year | Yes | The calendar year, e.g. 2023. | |
| currency | Yes | ISO 4217 code: EUR, USD, GBP, CHF, ... (XAU gold, XDR SDR); case ignored. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| note | No | |
| year | Yes | |
| method | Yes | |
| months | Yes | |
| source | Yes | |
| average | Yes | BNR's exact text, RON per `multiplier` units |
| warning | No | |
| complete | Yes | |
| currency | Yes | |
| multiplier | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, openWorld), and the description goes further: it discloses the aggregation method (mean of twelve monthly means, each from daily rates), rounding to four places, that monthly values and day counts are returned, and the partial-year `complete: false` semantics. Minor overlap with the output schema on returned fields, and no note on caching or data vintage, keeps it from 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?
Front-loaded with the definition, then methodology, then the disambiguation, then the edge case — a logical order with no filler. Two sentences are dense but each clause carries information; the 'to four places' and day-count detail are borderline but justify themselves against the ANAF spec.
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 annotations covering safety and an output schema covering return shape, the description supplies exactly what those fields cannot: the computation semantics, precision, and the incomplete-year behavior. Complete enough to call correctly; only rate limits/caching freshness are unaddressed, which is minor for a read-only reference lookup.
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 both parameters (ISO 4217 currency, calendar year) are fully specified there, so the baseline of 3 applies. The description adds context about what the year parameter means for an in-progress year, but nothing beyond the schema about formats, bounds, or currency handling.
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 computation: 'BNR's annual average rate for a year', anchored to the exact ANAF/D212 wording it serves. It also explicitly excludes a plausible misreading ('Not the mean of the daily rates, which differs'), so an agent can separate it from the sibling `rate`/`rates` tools without opening their 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?
Gives a concrete use context (converting foreign income in the D212 return) and a negative rule (this is not the daily-rate mean), plus the edge-case behavior for an unfinished year. It stops short of naming the sibling tools to route to instead — e.g. 'use `rate` for a single day' — so the alternative is implied rather than stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
convertConvert to or from RONARead-onlyIdempotent
An amount converted to or from RON at BNR's reference rate, computed exactly and rounded once: to RON is amount x rate / multiplier, from RON amount x multiplier / rate. rate_rule picks the fixing: in_force (the day's, or the last banking day's before it, as rate answers) or last_before (the last one strictly before the day, the rule for an invoice in a foreign currency). Answers the result with the rate, its multiplier and the date BNR published it, so the conversion can be stated. One side must be RON; for two other currencies, convert twice.
| Name | Required | Description | Default |
|---|---|---|---|
| to | Yes | The currency wanted: RON, or the currency to convert RON to. ISO 4217; case ignored. | |
| date | No | The day of the conversion, YYYY-MM-DD in Bucharest (an invoice's date, a payment's); default today. | |
| from | Yes | The amount's currency: RON, or the currency to convert to RON. ISO 4217; case ignored. | |
| amount | Yes | The amount, as a decimal string: "1250.50", "-75". Never a number. | |
| places | No | Digits after the point in the result. | |
| rounding | No | How the result is rounded, once: half-up (halves away from zero, as invoices round) or half-even (banker's). | half-up |
| rate_rule | No | in_force: the rate in force on the day; last_before: the last rate published before the day. | in_force |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| to | Yes | |
| date | Yes | |
| from | Yes | |
| note | No | |
| rate | Yes | BNR's exact text, RON per `multiplier` units |
| amount | Yes | The amount converted, as given |
| places | Yes | |
| result | Yes | The converted amount, computed exactly and rounded once |
| source | Yes | |
| meaning | Yes | |
| rounding | Yes | |
| rate_rule | Yes | |
| multiplier | Yes | |
| published_on | Yes | The date of the fixing the conversion used |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond readOnlyHint/idempotentHint it discloses that rounding happens exactly once and that the response carries the rate, its multiplier and the publication date, so the conversion is auditable. The one-side-must-be-RON constraint is a behavioral rule no annotation conveys. It does not discuss rate-availability failures or how dates without a published fixing are handled.
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?
Front-loads the purpose and the formulas, then the rule selection, then the return shape. Dense but every clause carries information; the parenthetical about `rate` answers could be trimmed slightly.
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 7-parameter conversion tool with an output schema, the definition still covers the formula, direction constraint, both enum behaviors and the returned provenance fields. 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 baseline is 3, and the description earns above that by introducing the 'multiplier' factor that appears nowhere in the schema and by spelling out the direction-dependent formulas showing how amount, rate and multiplier combine.
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 ('An amount converted to or from RON at BNR's reference rate') plus the exact computation, which clearly separates it from the sibling tools rate, rates and annual_average that only surface fixings.
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 concrete when-to-use routing for the rate_rule choice: in_force for the day's rate as `rate` answers it, last_before 'the rule for an invoice in a foreign currency'. Also states the hard precondition that one side must be RON and that other pairs require two calls. It stops short of naming a sibling to use instead when only a quoted rate is wanted.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
healthHealthARead-onlyIdempotent
Whether BNR's rates can be read now: the date of its latest fixing and how many currencies it carries.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| today | Yes | |
| source | Yes | |
| warning | No | |
| currencies | Yes | |
| latest_fixing | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint and openWorldHint, so safety and repeatability are covered structurally. The description adds that the payload reports the latest fixing date and currency count, which is useful, but it does not disclose failure semantics for a health check (e.g., does an unavailable rate source surface as an error or a status field?) — the single most important behavioral trait here.
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 single front-loaded sentence that names the readiness question first and then enumerates the two returned signals. No redundant or filler wording.
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 zero-parameter status tool with an output schema and full annotation coverage, the description supplies enough to call it correctly; the output schema carries the return-shape burden. Only the degraded/unavailable-rate scenario is left unaddressed.
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?
The tool takes zero parameters, so there is nothing for the description to disambiguate; the baseline applies. No parameter-related gaps exist.
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 purpose: a readiness check on BNR rate data, returning the latest fixing date and currency count. It is clearly distinguishable in kind from the data-returning siblings (rate, rates, convert, annual_average), though it never names them explicitly and the verb is somewhat implicit ("whether ... can be read now").
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 only implied: an agent can infer this is a pre-flight availability check before calling rate/rates, but the description never says when to call it, whether it should precede the data tools, or what to do if the check fails. No exclusions or alternatives are given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rateBNR rate on a dayARead-onlyIdempotent
The National Bank of Romania's reference rate in force on a day: RON per multiplier units of the currency (1, or 100 for HUF, JPY, KRW and a few others), as the exact text BNR published, with published_on, the date of the fixing it is. A weekend, a holiday, or today before BNR publishes (about 13:00 Bucharest) takes the last banking day's fixing. Use it for any EUR/RON or other conversion stated on a date.
| Name | Required | Description | Default |
|---|---|---|---|
| date | No | The day, YYYY-MM-DD in Bucharest; default today. | |
| currency | Yes | ISO 4217 code: EUR, USD, GBP, CHF, ... (XAU gold, XDR SDR); case ignored. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| date | Yes | |
| note | No | |
| rate | Yes | BNR's exact text, RON per `multiplier` units |
| source | Yes | |
| meaning | Yes | |
| currency | Yes | |
| multiplier | Yes | |
| published_on | Yes | The date of the fixing this rate is |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, and openWorld, but the description adds genuinely new behavior: weekends, holidays, and today before ~13:00 Bucharest fall back to the last banking day's fixing, and the returned `published_on` reflects the fixing date rather than the requested date. The multiplier convention (1, or 100 for HUF/JPY/KRW) is also disclosed only here. It stops short of describing error behavior for unknown currency codes.
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 purpose and units are front-loaded in the first clause, and each subsequent clause (multiplier exception, published_on, fallback rule, use case) carries distinct information. It is somewhat dense and runs long as a single block, but 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?
For a two-parameter lookup with an output schema, everything an agent needs is present: what is returned, the multiplier caveat, the date default, and the non-banking-day fallback. Return-value explanation is correctly kept brief since the output schema exists.
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 both parameters are already documented in the input schema, which sets the baseline at 3. The description's multiplier and Bucharest-timezone context clarifies how to interpret `currency` and `date` results rather than adding new parameter syntax, so it does not materially exceed the schema's own coverage.
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: the National Bank of Romania's reference rate in force on a given day. The scope is precise enough that an agent can distinguish a point-in-time rate lookup from the sibling `rates` or `annual_average`, though neither is named to draw the contrast 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?
"Use it for any EUR/RON or other conversion stated on a date" gives a concrete when-to-use trigger. It does not name the alternatives (`convert`, `rates`, `annual_average`) or state when not to use it, so the routing to siblings is left implicit — and the conversion phrasing brushes against what `convert` likely does.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
ratesBNR rates: several currencies, or a windowARead-onlyIdempotent
BNR's reference rates as series, the exact text BNR published. With date (default today): each currency's rate in force that day, from the day's fixing or the last banking day's before it. With from (and to, default today): every fixing BNR published in the window, oldest first, at most 366 days and 2000 rates a call. Without currencies, every currency BNR published. Each series carries its multiplier (RON per 1, or per 100 for HUF, JPY, KRW and a few others).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | A window's last day, included; default today. Only with from. | |
| date | No | One day, YYYY-MM-DD in Bucharest: the rates in force on it. Not with from. | |
| from | No | A window's first day, YYYY-MM-DD: every fixing from it to `to`. | |
| currencies | No | ISO 4217 codes, e.g. ["EUR", "USD"]; default every currency BNR published. |
Output Schema
| Name | Required | Description |
|---|---|---|
| ok | Yes | |
| to | No | |
| date | No | The day asked for: each series holds the rate in force on it |
| from | No | |
| note | No | |
| count | Yes | How many rates the series hold |
| absent | No | Currencies asked for that BNR published no fixing of in the window |
| series | Yes | One per currency, or per currency and multiplier if BNR changed it within the window |
| source | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/openWorld, and the description adds substantive behavior beyond them: fallback to the last banking day's fixing when the day has none, oldest-first ordering, hard limits of 366 days and 2000 rates per call, and per-series multipliers. These are exactly the traits an agent needs to size requests and interpret values.
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, front-loaded with what the tool returns, then mode behavior, then coverage and limits. The parentheticals carry real information (defaults, multiplier rule) rather than restating the schema — every clause earns its place.
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 an output schema present, return-format detail is unnecessary, and the description covers the remaining risk areas: input mode exclusivity, defaults, request caps, and the meaning of the multiplier. Little an agent needs to call this 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; the description earns above that by adding semantics the schema lacks — that `to` is inclusive and defaults to today, that `date` is in Bucharest time, that result rates reflect non-banking-day fallback, and that omitting `currencies` returns everything BNR published.
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: BNR reference rates returned as series in the exact published text, with two modes (single day vs. window). It is distinguishable from `annual_average` and `convert`, though it never explicitly names the `rate` sibling, leaving the single-rate-vs-series boundary to be inferred from the title.
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 mode-selection guidance: use `date` for one day's rates in force, use `from`/`to` for a window of fixings. It stops short of explicit exclusions or routing to siblings such as `rate` or `convert`, so the agent must infer which tool to pick for a single conversion.
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
annual_average - First observed
convert - First observed
health - First observed
rate - First observed
rates
This server cannot be deployed
TDQS
Scored across 5 tools
Each tool has a clearly articulated scope: health (availability), rate (single day), rates (series/window),annual_average (yearly figure), convert (arithmetic). The only real hazard is the rate vs rates pair, which differ solely by plurality and require reading descriptions to separate a point lookup from a series fetch.
All names are lowercase snake_case with no convention mixing, which is good. However the set blends nouns (rate, rates, health, annual_average) with a verb (convert), and rate/rates are distinguished only by a plural, a minor predictability gap.
Five tools is exactly right for a single-source exchange-rate server: point rate, series, annual aggregate, conversion, and a health probe. Nothing redundant and nothing padded.
The surface covers the full lifecycle of BNR data: current fixing, historical windows, yearly averages, arithmetic conversion, and availability checks, with explicit notes on limits and the two-step pattern for non-RON pairs. Gaps are minor, e.g. no currency roster/metadata tool and no direct cross-currency conversion, but both are workable via rates and convert.
Maintenance
Related MCP Connectors
Convert amounts on European Central Bank daily reference rates, today or on a past date.
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.
National Bank of Romania (Banca Naţională a României, BNR) FX reference rates MCP. Keyless.
Related MCP Servers
- 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.-
- AlicenseAqualityDmaintenanceFetches official currency exchange rates from the National Bank of Kazakhstan, supports conversion and rate dynamics tracking.515 npmMIT
- AlicenseNot gradedqualityDmaintenanceEnables real-time currency exchange rate lookup, conversion, historical rates, and currency catalog using the free Frankfurter API, no API key required.1 npmISC
- AlicenseNot gradedqualityBmaintenanceProvides National Bank of Romania (BNR) FX reference rates without API key.425 npmMIT