@blanketbyte/wise-mcp 1.0.0 → 1.0.2
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 +5 -1
- package/dist/cli.js +1 -1
- package/dist/stdio.js +25 -12
- package/package.json +3 -2
package/README.md
CHANGED
|
@@ -189,6 +189,8 @@ Add this to the client's MCP config (for Claude Desktop: **Settings → Develope
|
|
|
189
189
|
}
|
|
190
190
|
```
|
|
191
191
|
|
|
192
|
+
The repo is also an [Agent Plugin](https://agent-plugins.org) (`plugin.json` + `mcp.json`), so clients and directories that support the standard can install it directly. Set `WISE_API_TOKEN` in your client.
|
|
193
|
+
|
|
192
194
|
Optional env: `WRITES_ENABLED=false` for read-only, `MAX_TRANSFER_AMOUNT` for a per-transfer limit. Run `npx @blanketbyte/wise-mcp --help` for all options.
|
|
193
195
|
|
|
194
196
|
> [!NOTE]
|
|
@@ -198,6 +200,8 @@ Optional env: `WRITES_ENABLED=false` for read-only, `MAX_TRANSFER_AMOUNT` for a
|
|
|
198
200
|
|
|
199
201
|
The container serves plain HTTP on port **3000**; put it behind anything that terminates HTTPS. State (sealed tokens, sessions) lives in **`/data`**.
|
|
200
202
|
|
|
203
|
+
A prebuilt image is published with every release: **`ghcr.io/blanketbyte/wise-mcp:<version>`** (or `:latest`), for `linux/amd64` and `linux/arm64`. Use it instead of building from source wherever your platform accepts an image.
|
|
204
|
+
|
|
201
205
|
### Dokploy
|
|
202
206
|
|
|
203
207
|
1. **DNS**: point a hostname (e.g. `wise.example.com`) at your Dokploy server.
|
|
@@ -301,7 +305,7 @@ The remote end-to-end test boots the server next to a mock Wise API and drives e
|
|
|
301
305
|
|
|
302
306
|
### Releasing
|
|
303
307
|
|
|
304
|
-
Push a tag matching `package.json` (e.g. `v1.1.0`). The release workflow runs the tests, publishes `@blanketbyte/wise-mcp` to npm with provenance (
|
|
308
|
+
Push a tag matching `package.json` (e.g. `v1.1.0`). The release workflow runs the tests, publishes `@blanketbyte/wise-mcp` to npm with provenance (trusted publishing over GitHub OIDC, no npm token stored anywhere), lists it in the [official MCP Registry](https://registry.modelcontextprotocol.io) from `server.json`, attaches the `.mcpb` to a GitHub release, and pushes the Docker image to `ghcr.io/blanketbyte/wise-mcp`. Before the first release, remove `"private": true` from `package.json`.
|
|
305
309
|
|
|
306
310
|
<details>
|
|
307
311
|
<summary>Project layout</summary>
|
package/dist/cli.js
CHANGED
|
@@ -9,7 +9,7 @@ Usage:
|
|
|
9
9
|
wise-mcp serve Run the remote HTTP server (OAuth, for Claude and ChatGPT custom connectors)
|
|
10
10
|
|
|
11
11
|
Local mode env:
|
|
12
|
-
WISE_API_TOKEN Wise personal API token (required)
|
|
12
|
+
WISE_API_TOKEN Wise personal API token (required for tool calls)
|
|
13
13
|
WRITES_ENABLED false = read-only (default true; writes are always two-step)
|
|
14
14
|
MAX_TRANSFER_AMOUNT optional max per transfer, in the source currency
|
|
15
15
|
DATA_DIR where the audit log is written (default ~/.wise-mcp)
|
package/dist/stdio.js
CHANGED
|
@@ -11,24 +11,37 @@ import { WiseService } from "./wise/service.js";
|
|
|
11
11
|
* Local mode: speaks MCP over stdin/stdout for Claude Desktop, Claude Code, Cursor, etc.
|
|
12
12
|
* No OAuth or sessions: the Wise token comes from WISE_API_TOKEN in the app's MCP config.
|
|
13
13
|
* stdout carries the protocol, so everything else goes to stderr.
|
|
14
|
+
*
|
|
15
|
+
* Without a token the server still starts and lists its tools (so directories like Glama can
|
|
16
|
+
* inspect it); every tool call then explains how to set WISE_API_TOKEN.
|
|
14
17
|
*/
|
|
15
18
|
const log = (msg) => process.stderr.write(`[wise-mcp] ${msg}\n`);
|
|
19
|
+
const MISSING_TOKEN = "WISE_API_TOKEN is not set. Create a token in Wise → Settings → API tokens and add it to this server's env in your MCP client config.";
|
|
20
|
+
/** Stand-in client used when no token is configured: every Wise call explains what to do. */
|
|
21
|
+
class MissingTokenClient extends WiseClient {
|
|
22
|
+
async request() {
|
|
23
|
+
throw new Error(MISSING_TOKEN);
|
|
24
|
+
}
|
|
25
|
+
}
|
|
16
26
|
const token = process.env.WISE_API_TOKEN?.trim();
|
|
27
|
+
let client;
|
|
17
28
|
if (!token) {
|
|
18
|
-
log(
|
|
19
|
-
|
|
29
|
+
log(`${MISSING_TOKEN} Starting anyway: tools are listed, but calls will fail until it's set.`);
|
|
30
|
+
client = new MissingTokenClient("", config.WISE_API_URL);
|
|
20
31
|
}
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
}
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
32
|
+
else {
|
|
33
|
+
client = new WiseClient(token, config.WISE_API_URL);
|
|
34
|
+
try {
|
|
35
|
+
const me = await client.me();
|
|
36
|
+
log(`connected as Wise user ${me.id}`);
|
|
37
|
+
}
|
|
38
|
+
catch (err) {
|
|
39
|
+
if (err instanceof WiseAccessRevokedError || (err instanceof WiseApiError && err.status === 403)) {
|
|
40
|
+
log("Wise rejected WISE_API_TOKEN. Check it's copied fully and not revoked.");
|
|
41
|
+
process.exit(1);
|
|
42
|
+
}
|
|
43
|
+
log(`couldn't reach Wise yet (${err instanceof Error ? err.message : err}); tools will retry`);
|
|
30
44
|
}
|
|
31
|
-
log(`couldn't reach Wise yet (${err instanceof Error ? err.message : err}); tools will retry`);
|
|
32
45
|
}
|
|
33
46
|
mkdirSync(config.DATA_DIR, { recursive: true });
|
|
34
47
|
let icons = [];
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blanketbyte/wise-mcp",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.2",
|
|
4
4
|
"description": "MCP server for Wise: read balances, card payments, transfers and recipients, and prepare transfers you approve twice. Runs locally (npx, for Claude, Codex, Cursor…) or as a remote connector for Claude and ChatGPT.",
|
|
5
5
|
"mcpName": "io.github.BlanketByte/wise-mcp",
|
|
6
6
|
"keywords": [
|
|
@@ -51,7 +51,8 @@
|
|
|
51
51
|
"e2e:stdio": "tsx scripts/e2e-stdio.ts",
|
|
52
52
|
"test": "npm run typecheck && npm run e2e && npm run e2e:stdio",
|
|
53
53
|
"mcpb": "bash scripts/build-mcpb.sh",
|
|
54
|
-
"prepublishOnly": "npm run build && npm test"
|
|
54
|
+
"prepublishOnly": "npm run build && npm test",
|
|
55
|
+
"version": "node scripts/sync-version.mjs && git add plugin.json server.json mcpb/manifest.json"
|
|
55
56
|
},
|
|
56
57
|
"dependencies": {
|
|
57
58
|
"@modelcontextprotocol/sdk": "^1.32.1",
|