@allratestoday/mcp-server 0.3.1 → 0.3.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +378 -36
- package/dist/client.js +1 -1
- package/dist/index.js +7 -7
- package/package.json +7 -8
package/README.md
CHANGED
|
@@ -1,52 +1,111 @@
|
|
|
1
|
-
#
|
|
1
|
+
# Realtime Exchange Rate MCP Server
|
|
2
|
+
|
|
3
|
+
[](https://www.npmjs.com/package/@allratestoday/mcp-server)
|
|
4
|
+
[](https://www.npmjs.com/package/@allratestoday/mcp-server)
|
|
5
|
+
[](./LICENSE)
|
|
6
|
+
[](https://modelcontextprotocol.io)
|
|
2
7
|
|
|
3
8
|
English | [简体中文](./README-zh-CN.md)
|
|
4
9
|
|
|
5
|
-
|
|
10
|
+
> Give your AI coding assistant a live window into the foreign-exchange market.
|
|
11
|
+
|
|
12
|
+
A Model Context Protocol server that lets **Claude Code**, **Cursor**, **Claude Desktop**, **Windsurf**, and any other MCP-compatible client fetch real-time currency rates, historical data, and multi-currency lookups.
|
|
6
13
|
|
|
7
|
-
|
|
14
|
+
After installation, your assistant can answer questions like:
|
|
8
15
|
|
|
9
16
|
- *"What's the current USD to EUR rate?"*
|
|
10
|
-
- *"Show me
|
|
11
|
-
- *"Convert 250 USD into CAD
|
|
17
|
+
- *"Show me how GBP/JPY moved over the last 30 days."*
|
|
18
|
+
- *"Convert 250 USD into CAD at a real rate."*
|
|
19
|
+
- *"Compare USD against EUR, GBP, and JPY simultaneously."*
|
|
12
20
|
- *"List every supported currency."*
|
|
13
21
|
|
|
14
|
-
|
|
22
|
+
---
|
|
23
|
+
|
|
24
|
+
## Table of contents
|
|
25
|
+
|
|
26
|
+
- [What you get](#what-you-get)
|
|
27
|
+
- [Get an API key (required)](#get-an-api-key-required)
|
|
28
|
+
- [Install](#install)
|
|
29
|
+
- [Quick setup per client](#quick-setup-per-client)
|
|
30
|
+
- [Claude Code](#claude-code)
|
|
31
|
+
- [Cursor](#cursor)
|
|
32
|
+
- [Claude Desktop](#claude-desktop)
|
|
33
|
+
- [Windsurf](#windsurf)
|
|
34
|
+
- [Generic stdio MCP client](#generic-stdio-mcp-client)
|
|
35
|
+
- [Verify it works](#verify-it-works)
|
|
36
|
+
- [Tools reference](#tools-reference)
|
|
37
|
+
- [Environment variables](#environment-variables)
|
|
38
|
+
- [Troubleshooting](#troubleshooting)
|
|
39
|
+
- [Error reference](#error-reference)
|
|
40
|
+
- [FAQ](#faq)
|
|
41
|
+
- [Development](#development)
|
|
42
|
+
- [Changelog](#changelog)
|
|
43
|
+
- [Support](#support)
|
|
44
|
+
- [License](#license)
|
|
45
|
+
|
|
46
|
+
---
|
|
47
|
+
|
|
48
|
+
## What you get
|
|
49
|
+
|
|
50
|
+
| Capability | Detail |
|
|
51
|
+
|---|---|
|
|
52
|
+
| **Currencies** | 150+ ISO 4217 codes, all major and most exotics |
|
|
53
|
+
| **Update frequency** | Mid-market rates refresh every ~60 seconds |
|
|
54
|
+
| **Historical depth** | Up to 1 year via `1d` / `7d` / `30d` / `1y` granularity |
|
|
55
|
+
| **Tools exposed** | 4 — `get_exchange_rate`, `get_historical_rates`, `get_rates_authenticated`, `list_currencies` |
|
|
56
|
+
| **Transport** | stdio (subprocess), MCP 1.x compatible |
|
|
57
|
+
| **Runtime** | Node.js ≥18 |
|
|
58
|
+
|
|
59
|
+
---
|
|
60
|
+
|
|
61
|
+
## Get an API key (required)
|
|
15
62
|
|
|
16
|
-
The
|
|
63
|
+
The server **will not start** without a valid `ALLRATES_API_KEY`. Rates are served by [AllRatesToday](https://allratestoday.com); a free key is enough for development and personal use.
|
|
17
64
|
|
|
18
|
-
1. Register at [allratestoday.com/register](https://allratestoday.com/register)
|
|
65
|
+
1. Register at [allratestoday.com/register](https://allratestoday.com/register)
|
|
19
66
|
2. Verify your email
|
|
20
|
-
3. Copy your key from the dashboard
|
|
21
|
-
4.
|
|
67
|
+
3. Copy your key from the dashboard (format: `art_live_xxxxx`)
|
|
68
|
+
4. Use it as `ALLRATES_API_KEY` in the configs below
|
|
22
69
|
|
|
23
|
-
|
|
70
|
+
If the key is missing, the server prints clear registration instructions on stderr and exits with code 1.
|
|
71
|
+
|
|
72
|
+
---
|
|
24
73
|
|
|
25
74
|
## Install
|
|
26
75
|
|
|
76
|
+
The server is published as an npm package. The simplest install is **zero-install via `npx`**, which is what every config below uses.
|
|
77
|
+
|
|
27
78
|
```bash
|
|
79
|
+
# Run without installing (recommended)
|
|
80
|
+
npx -y @allratestoday/mcp-server
|
|
81
|
+
|
|
82
|
+
# Or install globally
|
|
28
83
|
npm install -g @allratestoday/mcp-server
|
|
84
|
+
allratestoday-mcp
|
|
29
85
|
```
|
|
30
86
|
|
|
31
|
-
|
|
87
|
+
Both commands launch the stdio MCP server and wait for a client to connect. They're not meant to be run directly from your shell — your MCP client launches them as a subprocess.
|
|
32
88
|
|
|
33
|
-
|
|
89
|
+
---
|
|
34
90
|
|
|
35
|
-
|
|
91
|
+
## Quick setup per client
|
|
36
92
|
|
|
37
|
-
|
|
38
|
-
claude mcp add allratestoday -- npx -y @allratestoday/mcp-server
|
|
39
|
-
```
|
|
93
|
+
Each client reads MCP servers from a different config file. Pick yours below.
|
|
40
94
|
|
|
41
|
-
|
|
95
|
+
### Claude Code
|
|
96
|
+
|
|
97
|
+
The fastest path uses the built-in CLI:
|
|
42
98
|
|
|
43
99
|
```bash
|
|
100
|
+
claude mcp add allratestoday -- npx -y @allratestoday/mcp-server
|
|
44
101
|
claude mcp env allratestoday ALLRATES_API_KEY=art_live_xxxxx
|
|
45
102
|
```
|
|
46
103
|
|
|
104
|
+
Restart Claude Code. Verify by asking it: *"What's the current USD to EUR rate?"*
|
|
105
|
+
|
|
47
106
|
### Cursor
|
|
48
107
|
|
|
49
|
-
Edit `~/.cursor/mcp.json` (or
|
|
108
|
+
Edit `~/.cursor/mcp.json` (or `.cursor/mcp.json` inside your project for project-scoped servers):
|
|
50
109
|
|
|
51
110
|
```json
|
|
52
111
|
{
|
|
@@ -62,9 +121,17 @@ Edit `~/.cursor/mcp.json` (or your project `.cursor/mcp.json`):
|
|
|
62
121
|
}
|
|
63
122
|
```
|
|
64
123
|
|
|
124
|
+
Restart Cursor. The four tools should appear in the MCP tool picker.
|
|
125
|
+
|
|
65
126
|
### Claude Desktop
|
|
66
127
|
|
|
67
|
-
Edit
|
|
128
|
+
Edit the config file (path depends on OS):
|
|
129
|
+
|
|
130
|
+
| OS | Path |
|
|
131
|
+
|---|---|
|
|
132
|
+
| macOS | `~/Library/Application Support/Claude/claude_desktop_config.json` |
|
|
133
|
+
| Windows | `%APPDATA%\Claude\claude_desktop_config.json` |
|
|
134
|
+
| Linux | `~/.config/Claude/claude_desktop_config.json` |
|
|
68
135
|
|
|
69
136
|
```json
|
|
70
137
|
{
|
|
@@ -80,40 +147,315 @@ Edit `~/Library/Application Support/Claude/claude_desktop_config.json` (macOS) o
|
|
|
80
147
|
}
|
|
81
148
|
```
|
|
82
149
|
|
|
83
|
-
|
|
150
|
+
**Fully quit and reopen Claude Desktop** (Cmd+Q on macOS, right-click tray icon → Exit on Windows). Closing the window alone keeps the old config loaded.
|
|
151
|
+
|
|
152
|
+
### Windsurf
|
|
153
|
+
|
|
154
|
+
Edit `~/.codeium/windsurf/mcp_config.json`:
|
|
155
|
+
|
|
156
|
+
```json
|
|
157
|
+
{
|
|
158
|
+
"mcpServers": {
|
|
159
|
+
"allratestoday": {
|
|
160
|
+
"command": "npx",
|
|
161
|
+
"args": ["-y", "@allratestoday/mcp-server"],
|
|
162
|
+
"env": {
|
|
163
|
+
"ALLRATES_API_KEY": "art_live_xxxxx"
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
}
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Restart Windsurf.
|
|
171
|
+
|
|
172
|
+
### Generic stdio MCP client
|
|
173
|
+
|
|
174
|
+
Any MCP host that supports stdio transport works. The launch command is:
|
|
175
|
+
|
|
176
|
+
```
|
|
177
|
+
npx -y @allratestoday/mcp-server
|
|
178
|
+
```
|
|
179
|
+
|
|
180
|
+
…with the environment variable `ALLRATES_API_KEY` set. The protocol version is MCP 1.x.
|
|
181
|
+
|
|
182
|
+
---
|
|
183
|
+
|
|
184
|
+
## Verify it works
|
|
185
|
+
|
|
186
|
+
After configuring your client, test in this order:
|
|
187
|
+
|
|
188
|
+
1. **Server starts** — open the client. If the MCP integration shows a red dot or "failed to connect", the API key is missing or wrong (see [Troubleshooting](#troubleshooting)).
|
|
189
|
+
|
|
190
|
+
2. **Tools are listed** — most clients have a "tools" or "MCP" panel. You should see:
|
|
191
|
+
- `get_exchange_rate`
|
|
192
|
+
- `get_historical_rates`
|
|
193
|
+
- `get_rates_authenticated`
|
|
194
|
+
- `list_currencies`
|
|
84
195
|
|
|
85
|
-
|
|
196
|
+
3. **A live call returns a number** — ask the assistant:
|
|
86
197
|
|
|
87
|
-
|
|
198
|
+
> *What's the current USD to EUR rate?*
|
|
88
199
|
|
|
89
|
-
|
|
200
|
+
The assistant will call `get_exchange_rate(source: "USD", target: "EUR")` and reply with a real rate (e.g. `"USD to EUR is currently 0.9214."`). If it fabricates a number without making a tool call, the server isn't connected.
|
|
90
201
|
|
|
91
|
-
|
|
202
|
+
---
|
|
92
203
|
|
|
93
|
-
|
|
204
|
+
## Tools reference
|
|
205
|
+
|
|
206
|
+
All four tools require an API key.
|
|
207
|
+
|
|
208
|
+
### `get_exchange_rate`
|
|
209
|
+
|
|
210
|
+
Current mid-market rate between two currencies.
|
|
211
|
+
|
|
212
|
+
**Input**
|
|
213
|
+
|
|
214
|
+
| Field | Type | Required | Description |
|
|
215
|
+
|---|---|---|---|
|
|
216
|
+
| `source` | string | yes | 3-letter ISO 4217 code, e.g. `USD` |
|
|
217
|
+
| `target` | string | yes | 3-letter ISO 4217 code, e.g. `EUR` |
|
|
218
|
+
|
|
219
|
+
**Example call**
|
|
220
|
+
|
|
221
|
+
```json
|
|
222
|
+
{ "source": "USD", "target": "EUR" }
|
|
223
|
+
```
|
|
224
|
+
|
|
225
|
+
**Example response**
|
|
226
|
+
|
|
227
|
+
```json
|
|
228
|
+
{ "rate": 0.92145, "source": "wise" }
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
### `get_historical_rates`
|
|
232
|
+
|
|
233
|
+
Time-series data points for a currency pair over a fixed period.
|
|
234
|
+
|
|
235
|
+
**Input**
|
|
236
|
+
|
|
237
|
+
| Field | Type | Required | Description |
|
|
238
|
+
|---|---|---|---|
|
|
239
|
+
| `source` | string | yes | Source currency code |
|
|
240
|
+
| `target` | string | yes | Target currency code |
|
|
241
|
+
| `period` | string | no (default `7d`) | One of `1d`, `7d`, `30d`, `1y` |
|
|
242
|
+
|
|
243
|
+
**Granularity by period**
|
|
244
|
+
|
|
245
|
+
| `period` | Data points |
|
|
94
246
|
|---|---|
|
|
95
|
-
| `
|
|
96
|
-
| `
|
|
97
|
-
| `
|
|
98
|
-
| `
|
|
247
|
+
| `1d` | Hourly (24 points) |
|
|
248
|
+
| `7d` | Daily (7 points) |
|
|
249
|
+
| `30d` | Daily (30 points) |
|
|
250
|
+
| `1y` | Weekly (52 points) |
|
|
251
|
+
|
|
252
|
+
**Example call**
|
|
253
|
+
|
|
254
|
+
```json
|
|
255
|
+
{ "source": "USD", "target": "INR", "period": "30d" }
|
|
256
|
+
```
|
|
257
|
+
|
|
258
|
+
**Example response (truncated)**
|
|
259
|
+
|
|
260
|
+
```json
|
|
261
|
+
{
|
|
262
|
+
"source": "USD",
|
|
263
|
+
"target": "INR",
|
|
264
|
+
"period": "30d",
|
|
265
|
+
"data": [
|
|
266
|
+
{ "date": "2026-03-27T00:00:00Z", "rate": 83.42, "timestamp": 1743033600000 },
|
|
267
|
+
{ "date": "2026-03-28T00:00:00Z", "rate": 83.51, "timestamp": 1743120000000 },
|
|
268
|
+
"..."
|
|
269
|
+
]
|
|
270
|
+
}
|
|
271
|
+
```
|
|
272
|
+
|
|
273
|
+
### `get_rates_authenticated`
|
|
274
|
+
|
|
275
|
+
Multiple targets in one call, with optional historical timestamp or grouping window.
|
|
276
|
+
|
|
277
|
+
**Input**
|
|
278
|
+
|
|
279
|
+
| Field | Type | Required | Description |
|
|
280
|
+
|---|---|---|---|
|
|
281
|
+
| `source` | string | yes | Source currency code |
|
|
282
|
+
| `target` | string | yes | One or more codes, comma-separated (`EUR,GBP,JPY`) |
|
|
283
|
+
| `time` | string (ISO 8601) | no | Historical point in time |
|
|
284
|
+
| `group` | string | no | One of `hour`, `day`, `week`, `month` |
|
|
285
|
+
|
|
286
|
+
**Example call**
|
|
287
|
+
|
|
288
|
+
```json
|
|
289
|
+
{ "source": "USD", "target": "EUR,GBP,JPY" }
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
**Example response**
|
|
293
|
+
|
|
294
|
+
```json
|
|
295
|
+
[
|
|
296
|
+
{ "rate": 0.9214, "source": "USD", "target": "EUR", "time": "2026-04-26T11:00:00Z" },
|
|
297
|
+
{ "rate": 0.7891, "source": "USD", "target": "GBP", "time": "2026-04-26T11:00:00Z" },
|
|
298
|
+
{ "rate": 151.34, "source": "USD", "target": "JPY", "time": "2026-04-26T11:00:00Z" }
|
|
299
|
+
]
|
|
300
|
+
```
|
|
301
|
+
|
|
302
|
+
### `list_currencies`
|
|
303
|
+
|
|
304
|
+
All supported currencies with codes, names, and symbols. Cached upstream for 24 hours.
|
|
305
|
+
|
|
306
|
+
**Input** — none.
|
|
307
|
+
|
|
308
|
+
**Example response (truncated)**
|
|
309
|
+
|
|
310
|
+
```json
|
|
311
|
+
{
|
|
312
|
+
"currencies": [
|
|
313
|
+
{ "code": "USD", "name": "US Dollar", "symbol": "$" },
|
|
314
|
+
{ "code": "EUR", "name": "Euro", "symbol": "€" },
|
|
315
|
+
{ "code": "GBP", "name": "British Pound", "symbol": "£" },
|
|
316
|
+
"..."
|
|
317
|
+
],
|
|
318
|
+
"count": 162
|
|
319
|
+
}
|
|
320
|
+
```
|
|
321
|
+
|
|
322
|
+
---
|
|
99
323
|
|
|
100
324
|
## Environment variables
|
|
101
325
|
|
|
102
|
-
| Variable | Default | Purpose |
|
|
326
|
+
| Variable | Default | Required | Purpose |
|
|
327
|
+
|---|---|---|---|
|
|
328
|
+
| `ALLRATES_API_KEY` | — | **yes** | Your API key. The server exits at startup if unset. |
|
|
329
|
+
| `ALLRATES_BASE_URL` | `https://allratestoday.com/api` | no | Override for self-hosted or staging deployments. |
|
|
330
|
+
|
|
331
|
+
You set these in your MCP client's config (in the `env` block) — not in your shell — because MCP servers are launched as subprocesses with isolated environments.
|
|
332
|
+
|
|
333
|
+
---
|
|
334
|
+
|
|
335
|
+
## Troubleshooting
|
|
336
|
+
|
|
337
|
+
| Symptom | Likely cause | Fix |
|
|
103
338
|
|---|---|---|
|
|
104
|
-
| `ALLRATES_API_KEY`
|
|
105
|
-
|
|
|
339
|
+
| Client shows "MCP server failed to start" or red dot | `ALLRATES_API_KEY` not set or invalid | Verify the key in your client config; check it matches the dashboard |
|
|
340
|
+
| Tools show but every call returns "Invalid API key" | Key is malformed (missing prefix, truncated, or revoked) | Copy a fresh key from the dashboard |
|
|
341
|
+
| Tools return "API quota exceeded" | Plan request limit hit | Wait until next month or upgrade plan |
|
|
342
|
+
| Historical tool returns "Bad request" | Invalid period or unknown currency code | Period must be `1d`/`7d`/`30d`/`1y`; codes must be 3 letters |
|
|
343
|
+
| Server starts but tools never appear in client | Client didn't reload after config change | Fully quit (not just close) and reopen the client |
|
|
344
|
+
| `npx` runs but hangs forever | The server is waiting for an MCP client to connect — this is normal when run from a shell | Don't run from a shell; let your MCP client launch it |
|
|
345
|
+
|
|
346
|
+
### Inspect server logs
|
|
347
|
+
|
|
348
|
+
To see what the server is doing, run it manually with the API key set:
|
|
349
|
+
|
|
350
|
+
```bash
|
|
351
|
+
ALLRATES_API_KEY=art_live_xxxxx npx -y @allratestoday/mcp-server
|
|
352
|
+
```
|
|
353
|
+
|
|
354
|
+
You should see no output when healthy (stdio is reserved for the MCP protocol). Any errors print to stderr.
|
|
355
|
+
|
|
356
|
+
---
|
|
357
|
+
|
|
358
|
+
## Error reference
|
|
359
|
+
|
|
360
|
+
The server maps API errors to clear, actionable messages.
|
|
361
|
+
|
|
362
|
+
| HTTP status | Meaning | Tool error message |
|
|
363
|
+
|---|---|---|
|
|
364
|
+
| 200 | Success | (rate returned) |
|
|
365
|
+
| 400 | Bad request — usually unknown currency code | `Bad request — possibly an unknown currency code` |
|
|
366
|
+
| 401 | Invalid or missing API key | `Invalid API key` |
|
|
367
|
+
| 429 | Quota exceeded | `API quota exceeded` |
|
|
368
|
+
| 5xx | Upstream server-side issue | `HTTP 5xx — <upstream message>` |
|
|
369
|
+
|
|
370
|
+
The LLM will surface these messages in its response, so a user prompt that hits a 429 results in the assistant saying *"the API quota has been exceeded — please try again next month or upgrade your plan."*
|
|
371
|
+
|
|
372
|
+
---
|
|
373
|
+
|
|
374
|
+
## FAQ
|
|
375
|
+
|
|
376
|
+
**Do you store my conversation or query data?**
|
|
377
|
+
No. Only your API key and the request parameters (source, target, period, time) are sent to the upstream API — never the LLM's conversation context, sheet contents, or anything else.
|
|
378
|
+
|
|
379
|
+
**What happens to my API key?**
|
|
380
|
+
It's only sent as a `Bearer` token in the `Authorization` header on requests to the upstream API. It's never logged or transmitted elsewhere.
|
|
381
|
+
|
|
382
|
+
**Why is my historical request slow on first call?**
|
|
383
|
+
Cold-start of `npx` (first run downloads the package) plus an initial upstream cache miss. Subsequent calls are fast (<200ms typically).
|
|
384
|
+
|
|
385
|
+
**Can I run this without npm/Node?**
|
|
386
|
+
Not currently — Node ≥18 is required. We've considered a standalone binary; if that matters to you, open an issue.
|
|
387
|
+
|
|
388
|
+
**Is there a self-hosted option?**
|
|
389
|
+
Yes, set `ALLRATES_BASE_URL` to point to your own instance.
|
|
390
|
+
|
|
391
|
+
**Does this work with ChatGPT?**
|
|
392
|
+
The Anthropic MCP standard works with any MCP-compatible client. ChatGPT Desktop has experimental MCP support; check OpenAI's docs for current status.
|
|
393
|
+
|
|
394
|
+
---
|
|
106
395
|
|
|
107
396
|
## Development
|
|
108
397
|
|
|
109
398
|
```bash
|
|
110
|
-
git clone https://github.com/cahthuranag/mcp
|
|
111
|
-
cd mcp
|
|
399
|
+
git clone https://github.com/cahthuranag/realtime-exchange-rate-mcp.git
|
|
400
|
+
cd realtime-exchange-rate-mcp
|
|
112
401
|
npm install
|
|
113
402
|
npm run build
|
|
114
|
-
node dist/index.js
|
|
403
|
+
ALLRATES_API_KEY=art_live_xxxxx node dist/index.js
|
|
404
|
+
```
|
|
405
|
+
|
|
406
|
+
The server runs on stdio and waits for an MCP client to connect. Hit Ctrl+C to exit.
|
|
407
|
+
|
|
408
|
+
To watch and rebuild on changes during development:
|
|
409
|
+
|
|
410
|
+
```bash
|
|
411
|
+
npm run dev
|
|
412
|
+
```
|
|
413
|
+
|
|
414
|
+
To test against a local instance:
|
|
415
|
+
|
|
416
|
+
```bash
|
|
417
|
+
ALLRATES_BASE_URL=http://localhost:8080/api ALLRATES_API_KEY=test_key node dist/index.js
|
|
115
418
|
```
|
|
116
419
|
|
|
420
|
+
### Project structure
|
|
421
|
+
|
|
422
|
+
```
|
|
423
|
+
src/
|
|
424
|
+
├── index.ts # MCP server, tool registration, request handlers
|
|
425
|
+
└── client.ts # HTTP client + error mapping
|
|
426
|
+
dist/ # Compiled JS (gitignored)
|
|
427
|
+
server.json # MCP registry manifest
|
|
428
|
+
package.json # npm metadata, dependencies, scripts
|
|
429
|
+
```
|
|
430
|
+
|
|
431
|
+
### Contributing
|
|
432
|
+
|
|
433
|
+
Issues and PRs welcome at [github.com/cahthuranag/realtime-exchange-rate-mcp](https://github.com/cahthuranag/realtime-exchange-rate-mcp). Before opening a PR:
|
|
434
|
+
|
|
435
|
+
1. `npm run build` should succeed with no errors
|
|
436
|
+
2. Test against a real API key (set in `ALLRATES_API_KEY`)
|
|
437
|
+
3. Update tool descriptions in `src/index.ts` if you change tool behavior
|
|
438
|
+
4. Update this README's "Tools reference" section if you add or rename a tool
|
|
439
|
+
|
|
440
|
+
---
|
|
441
|
+
|
|
442
|
+
## Changelog
|
|
443
|
+
|
|
444
|
+
See [GitHub Releases](https://github.com/cahthuranag/realtime-exchange-rate-mcp/releases) for the full list. Recent highlights:
|
|
445
|
+
|
|
446
|
+
- **0.3.x** — API key required for all tools; fail-fast at startup with clear error
|
|
447
|
+
- **0.2.x** — Removed news tool, required auth on `get_historical_rates`
|
|
448
|
+
- **0.1.x** — Initial release with 5 tools
|
|
449
|
+
|
|
450
|
+
---
|
|
451
|
+
|
|
452
|
+
## Support
|
|
453
|
+
|
|
454
|
+
- **Bug reports**: [github.com/cahthuranag/realtime-exchange-rate-mcp/issues](https://github.com/cahthuranag/realtime-exchange-rate-mcp/issues)
|
|
455
|
+
- **MCP questions**: [modelcontextprotocol.io](https://modelcontextprotocol.io) — protocol docs
|
|
456
|
+
|
|
457
|
+
---
|
|
458
|
+
|
|
117
459
|
## License
|
|
118
460
|
|
|
119
461
|
MIT — see [LICENSE](./LICENSE).
|
package/dist/client.js
CHANGED
|
@@ -30,7 +30,7 @@ export class AllRatesTodayClient {
|
|
|
30
30
|
'User-Agent': USER_AGENT,
|
|
31
31
|
};
|
|
32
32
|
if (!this.apiKey) {
|
|
33
|
-
throw new AllRatesTodayError('
|
|
33
|
+
throw new AllRatesTodayError('API key is required. Get one at https://allratestoday.com/register, then set ALLRATES_API_KEY in your MCP config.');
|
|
34
34
|
}
|
|
35
35
|
headers['Authorization'] = `Bearer ${this.apiKey}`;
|
|
36
36
|
const res = await this.fetchImpl(url.toString(), { method: 'GET', headers });
|
package/dist/index.js
CHANGED
|
@@ -12,7 +12,7 @@ const CCY = {
|
|
|
12
12
|
const tools = [
|
|
13
13
|
{
|
|
14
14
|
name: 'get_exchange_rate',
|
|
15
|
-
description: 'Get the current mid-market exchange rate between two currencies. Returns a single rate number. Requires
|
|
15
|
+
description: 'Get the current mid-market exchange rate between two currencies. Returns a single rate number. Requires API key (ALLRATES_API_KEY).',
|
|
16
16
|
inputSchema: {
|
|
17
17
|
type: 'object',
|
|
18
18
|
additionalProperties: false,
|
|
@@ -25,7 +25,7 @@ const tools = [
|
|
|
25
25
|
},
|
|
26
26
|
{
|
|
27
27
|
name: 'get_historical_rates',
|
|
28
|
-
description: 'Get historical exchange-rate data points for a currency pair over a period. Periods: 1d (hourly), 7d (daily), 30d (daily), 1y (weekly). Requires
|
|
28
|
+
description: 'Get historical exchange-rate data points for a currency pair over a period. Periods: 1d (hourly), 7d (daily), 30d (daily), 1y (weekly). Requires API key (ALLRATES_API_KEY).',
|
|
29
29
|
inputSchema: {
|
|
30
30
|
type: 'object',
|
|
31
31
|
additionalProperties: false,
|
|
@@ -44,7 +44,7 @@ const tools = [
|
|
|
44
44
|
},
|
|
45
45
|
{
|
|
46
46
|
name: 'get_rates_authenticated',
|
|
47
|
-
description: 'Get rates with higher limits and multi-target support. Requires
|
|
47
|
+
description: 'Get rates with higher limits and multi-target support. Requires API key (ALLRATES_API_KEY). Supports comma-separated targets like "EUR,GBP,JPY".',
|
|
48
48
|
inputSchema: {
|
|
49
49
|
type: 'object',
|
|
50
50
|
additionalProperties: false,
|
|
@@ -70,7 +70,7 @@ const tools = [
|
|
|
70
70
|
},
|
|
71
71
|
{
|
|
72
72
|
name: 'list_currencies',
|
|
73
|
-
description: 'List all supported currencies with code, name, and symbol. Requires
|
|
73
|
+
description: 'List all supported currencies with code, name, and symbol. Requires API key (ALLRATES_API_KEY). Cached 24h upstream.',
|
|
74
74
|
inputSchema: { type: 'object', additionalProperties: false, properties: {} },
|
|
75
75
|
},
|
|
76
76
|
];
|
|
@@ -83,9 +83,9 @@ async function main() {
|
|
|
83
83
|
if (!apiKey) {
|
|
84
84
|
console.error([
|
|
85
85
|
'',
|
|
86
|
-
'
|
|
86
|
+
' This MCP server requires an API key.',
|
|
87
87
|
'',
|
|
88
|
-
' 1.
|
|
88
|
+
' 1. Get a free key at https://allratestoday.com/register',
|
|
89
89
|
' 2. Copy your API key from the dashboard',
|
|
90
90
|
' 3. Set ALLRATES_API_KEY in your MCP client config:',
|
|
91
91
|
'',
|
|
@@ -102,7 +102,7 @@ async function main() {
|
|
|
102
102
|
apiKey,
|
|
103
103
|
baseUrl: process.env.ALLRATES_BASE_URL,
|
|
104
104
|
});
|
|
105
|
-
const server = new Server({ name: '
|
|
105
|
+
const server = new Server({ name: 'realtime-exchange-rate-mcp', version: '0.3.2' }, { capabilities: { tools: {} } });
|
|
106
106
|
server.setRequestHandler(ListToolsRequestSchema, async () => ({ tools }));
|
|
107
107
|
server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
108
108
|
const { name, arguments: args = {} } = req.params;
|
package/package.json
CHANGED
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@allratestoday/mcp-server",
|
|
3
|
-
"version": "0.3.
|
|
4
|
-
"mcpName": "io.github.cahthuranag/mcp
|
|
5
|
-
"description": "MCP server
|
|
3
|
+
"version": "0.3.3",
|
|
4
|
+
"mcpName": "io.github.cahthuranag/realtime-exchange-rate-mcp",
|
|
5
|
+
"description": "MCP server that lets AI coding tools (Claude Code, Cursor, Claude Desktop) fetch real-time and historical currency exchange rates.",
|
|
6
6
|
"keywords": [
|
|
7
7
|
"mcp",
|
|
8
8
|
"model-context-protocol",
|
|
@@ -10,16 +10,15 @@
|
|
|
10
10
|
"cursor",
|
|
11
11
|
"currency",
|
|
12
12
|
"exchange-rate",
|
|
13
|
-
"forex"
|
|
14
|
-
"allratestoday"
|
|
13
|
+
"forex"
|
|
15
14
|
],
|
|
16
15
|
"license": "MIT",
|
|
17
|
-
"homepage": "https://
|
|
16
|
+
"homepage": "https://github.com/cahthuranag/realtime-exchange-rate-mcp",
|
|
18
17
|
"repository": {
|
|
19
18
|
"type": "git",
|
|
20
|
-
"url": "git+https://github.com/cahthuranag/mcp
|
|
19
|
+
"url": "git+https://github.com/cahthuranag/realtime-exchange-rate-mcp.git"
|
|
21
20
|
},
|
|
22
|
-
"bugs": "https://github.com/cahthuranag/mcp
|
|
21
|
+
"bugs": "https://github.com/cahthuranag/realtime-exchange-rate-mcp/issues",
|
|
23
22
|
"type": "module",
|
|
24
23
|
"main": "dist/index.js",
|
|
25
24
|
"bin": {
|