MCP serverIntegration

Cursor and exchange rates: fixtures, lookups and docs

Three tasks a developer gives Cursor, with the real tool replies

6 Nov 2026 · 2 min read

In Cursor the exchange rate server is a coding aid. Ask for a week of real rates to use as a test fixture, check one rate while you write a conversion function, or have the assistant search the docs before it writes the request. Setup is on the Cursor setup page.

Add the server

~/.cursor/mcp.json
{ "mcpServers": { "exchangerate-dev": { "url": "https://api.exchangerate.dev/v1/mcp/" } } }

Keep the trailing slash. The replies below come straight from the server. The sentences a model writes around them change from model to model, so they are left out.

Task 1: a test fixture from real rates

Prompt: "Get USD to IDR for 26 to 30 October and write a Vitest fixture from it." Cursor calls get_range.

Tool call
{"name":"get_range","arguments":{"base":"USD","symbols":"IDR","start_date":"2026-10-26","end_date":"2026-10-30"}}
Reply, trimmed to date and rate
[{"date":"2026-10-26","IDR":18162.6},{"date":"2026-10-27","IDR":18138.6},{"date":"2026-10-28","IDR":18176.4},{"date":"2026-10-29","IDR":18143.0},{"date":"2026-10-30","IDR":18148.2}]

Cursor writes the fixture from five real daily rates, so the test data has the shape and noise of the real thing. The reply also carries is_forward_filled for each day, which is false here. A range that spans a weekend returns business days only.

Task 2: check a rate while you code

Prompt: "What is USD/IDR now? I need the order of magnitude for a currency formatter test." Cursor calls get_rate.

Tool call
{"name":"get_rate","arguments":{"base":"USD","quote":"IDR"}}
Reply, trimmed
{"base":"USD","quote":"IDR","rate":18140.11,"stale":false,"market_session":"open","data_updated_at":"2026-11-02T11:18:59+00:00","derived":false}

The rate is five digits before the decimal point, which matters for field widths and number formatting. Currencies also differ in minor units: list_currencies returns minor_units for each code, so the formatter test can cover yen at 0, dollars at 2 and dinars at 3.

Task 3: read the docs before writing the call

Prompt: "How often do rates update? I want to size a cache." Cursor calls search_docs.

Tool call
{"name":"search_docs","arguments":{"query":"how often do rates update","limit":1}}
Reply, trimmed
{"results":[{"question":"How often do rates update?","answer":"All 144 currencies update live, roughly every 60 seconds on trading days. The ECB daily fix provides fallback for about 30 currencies. Read source and market_session on each response to identify its data class and trading session."}]}

A cache of 60 seconds on a paid key matches the update rate. Without a key or on Free, rates arrive 15 minutes late, so a cache of that length costs nothing in freshness.

Quota while you code

AccessRequestsRates
No key100 an hour per IP15 minutes late
Free key5,000 a month, 10 a minute15 minutes late
Paid keyBy planLive

Each tool call counts as one request against the same limits as the matching REST call.

Questions

Project or global config?

Put the file at `.cursor/mcp.json` in a project root for one project, or `~/.cursor/mcp.json` for all of them.

Can Cursor write the integration code too?

Yes. Ask it to read the OpenAPI document or `search_docs` first, then write the request. The reply fields shown here are what your code receives.

Does it work offline?

No. The hosted server needs a connection. The npm bridge also calls the hosted API.

Keep reading

Connect with no key, then add one for your own quota

Every plan includes MCP, Free too. Free gives 5,000 requests a month and 10 a minute. Without a key the shared pool allows 100 an hour per IP address.

Get a free key