@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 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 (needs an `NPM_TOKEN` secret), lists it in the [official MCP Registry](https://registry.modelcontextprotocol.io) from `server.json`, and attaches the `.mcpb` to a GitHub release. Before the first release, remove `"private": true` from `package.json`.
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("WISE_API_TOKEN is not set. Create a token in Wise → Settings → API tokens and add it to this server's env.");
19
- process.exit(1);
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
- const client = new WiseClient(token, config.WISE_API_URL);
22
- try {
23
- const me = await client.me();
24
- log(`connected as Wise user ${me.id}`);
25
- }
26
- catch (err) {
27
- if (err instanceof WiseAccessRevokedError || (err instanceof WiseApiError && err.status === 403)) {
28
- log("Wise rejected WISE_API_TOKEN. Check it's copied fully and not revoked.");
29
- process.exit(1);
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.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",