@warmio/mcp 11.0.5 → 11.0.7
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 +47 -8
- package/dist/cli.js +3 -1
- package/dist/cli.js.map +1 -1
- package/dist/config-paths.d.ts.map +1 -1
- package/dist/config-paths.js +5 -5
- package/dist/config-paths.js.map +1 -1
- package/dist/install.d.ts.map +1 -1
- package/dist/install.js +42 -33
- package/dist/install.js.map +1 -1
- package/dist/load-env.d.ts +3 -0
- package/dist/load-env.d.ts.map +1 -1
- package/dist/load-env.js +23 -9
- package/dist/load-env.js.map +1 -1
- package/dist/server.d.ts.map +1 -1
- package/dist/server.js +37 -21
- package/dist/server.js.map +1 -1
- package/dist/warm-api-client.d.ts +7 -9
- package/dist/warm-api-client.d.ts.map +1 -1
- package/dist/warm-api-client.js +56 -20
- package/dist/warm-api-client.js.map +1 -1
- package/package.json +6 -8
- package/.cursor-plugin/README.md +0 -152
- package/.cursor-plugin/plugin.json +0 -39
- package/assets/logo.svg +0 -14
- package/mcp.json +0 -11
- package/skills/warm/SKILL.md +0 -152
package/README.md
CHANGED
|
@@ -3,19 +3,58 @@
|
|
|
3
3
|
`@warmio/mcp` is Warm's local stdio MCP server. Run the interactive installer to validate and store one full-access `WARM_API_KEY`, then configure detected supported clients:
|
|
4
4
|
|
|
5
5
|
```sh
|
|
6
|
-
npx -y @warmio/mcp@
|
|
6
|
+
npx -y @warmio/mcp@11.0.7 install
|
|
7
7
|
```
|
|
8
8
|
|
|
9
|
-
Each client starts the server with:
|
|
9
|
+
Each client starts the server with the exact pinned package spec from `@warmio/contracts/mcp` (currently `@warmio/mcp@11.0.7`):
|
|
10
10
|
|
|
11
11
|
```sh
|
|
12
|
-
npx -y @warmio/mcp@
|
|
12
|
+
npx -y @warmio/mcp@11.0.7 mcp
|
|
13
13
|
```
|
|
14
14
|
|
|
15
|
-
The server exposes financial-context read tools plus the automation operation catalog. The installer
|
|
16
|
-
stores the local credential with owner-only file permissions. Importing `@warmio/mcp` exposes the
|
|
17
|
-
library API without starting the CLI.
|
|
15
|
+
The server exposes financial-context read tools plus the automation operation catalog. The installer stores the local credential with owner-only file permissions. Importing `@warmio/mcp` exposes the library API without starting the CLI.
|
|
18
16
|
|
|
19
|
-
##
|
|
17
|
+
## Environment precedence
|
|
20
18
|
|
|
21
|
-
|
|
19
|
+
Credential and config resolution is fixed and never loaded from ancestor or project `.env` files by default:
|
|
20
|
+
|
|
21
|
+
1. `WARM_API_KEY` — direct process environment value wins over every file-backed credential.
|
|
22
|
+
2. `WARM_API_KEY_FILE` — overrides the default stored-key path (`$WARM_CONFIG_DIR/api_key` or the platform default Warm config directory).
|
|
23
|
+
3. `WARM_CONFIG_DIR` — overrides the default Warm config directory used for the stored API key file.
|
|
24
|
+
|
|
25
|
+
API traffic always uses the canonical `API_ORIGIN` (`https://app.warm.io`). The only supported endpoint override is an explicit programmatic `apiUrl` option passed by trusted callers such as tests; ambient `WARM_API_URL` and project `.env` values are ignored.
|
|
26
|
+
|
|
27
|
+
Optional local development: set `WARM_LOAD_PROJECT_ENV=1` before starting the CLI to load only `process.cwd()/.env`. Even with that opt-in, `WARM_API_KEY`, `WARM_API_KEY_FILE`, `WARM_CONFIG_DIR`, and `WARM_API_URL` are blocked and must be supplied through the process environment or installer storage instead.
|
|
28
|
+
|
|
29
|
+
## Launcher integrity contract
|
|
30
|
+
|
|
31
|
+
Generated launcher configs pin an exact package version (`@warmio/mcp@<version>`), never `@latest`. The release manifest records a `packageIntegrity` contract whose `registryIntegrity` value is populated only after the trusted publish workflow (`.github/workflows/publish-mcp.yml`) completes npm registry readback for the pinned version. Until that gate passes, treat `registryIntegrity: null` as an external deployment requirement rather than a local hash to copy by hand.
|
|
32
|
+
|
|
33
|
+
Set `WARM_MCP_REQUIRE_REGISTRY_INTEGRITY=1` to require an exact registry readback. When the manifest still has `registryIntegrity: null`, set `WARM_MCP_REGISTRY_INTEGRITY` to the trusted workflow's `dist.integrity` value. The gate rejects missing or malformed values. Default installs and launcher generation remain allowed until this opt-in gate is enabled.
|
|
34
|
+
|
|
35
|
+
## Claude Desktop Extension
|
|
36
|
+
|
|
37
|
+
For Claude Desktop users, a packaged `.mcpb` extension is available in `mcpb/`. To build it:
|
|
38
|
+
|
|
39
|
+
```sh
|
|
40
|
+
cd mcpb
|
|
41
|
+
pnpm install
|
|
42
|
+
pnpm pack
|
|
43
|
+
```
|
|
44
|
+
|
|
45
|
+
This produces `warm.mcpb` which can be installed via double-click or drag-and-drop into Claude Desktop.
|
|
46
|
+
The extension uses the same API key authentication as the CLI but provides a settings UI for key entry.
|
|
47
|
+
|
|
48
|
+
## Cursor Plugin
|
|
49
|
+
|
|
50
|
+
The official Cursor plugin packaging lives in a separate public repository:
|
|
51
|
+
|
|
52
|
+
**https://github.com/jasonstockman/warm-cursor-plugin**
|
|
53
|
+
|
|
54
|
+
This package (`@warmio/mcp`) is the MCP implementation. The public plugin repo contains only:
|
|
55
|
+
|
|
56
|
+
- `.cursor-plugin/plugin.json` — Plugin metadata and marketplace configuration
|
|
57
|
+
- `skills/warm/SKILL.md` — Agent-facing tool documentation
|
|
58
|
+
- User-facing installation and usage docs
|
|
59
|
+
|
|
60
|
+
When tool schemas or behavior change here, update `skills/warm/SKILL.md` in the plugin repo to keep agent docs in sync.
|
package/dist/cli.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
// This entrypoint is intentionally separate from the package root so importing
|
|
3
3
|
// @warmio/mcp remains side-effect free while the executable can dispatch CLI commands.
|
|
4
4
|
import { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';
|
|
5
|
-
import { WARM_MCP_INSTALLER_COMMAND, WARM_MCP_SERVER_COMMAND } from '@warmio/contracts/mcp';
|
|
5
|
+
import { assertWarmMcpLauncherContract, maybeRequireWarmMcpRegistryIntegrity, WARM_MCP_MANIFEST, WARM_MCP_INSTALLER_COMMAND, WARM_MCP_SERVER_COMMAND, } from '@warmio/contracts/mcp';
|
|
6
6
|
import { install } from './install.js';
|
|
7
7
|
import { loadDotEnv } from './load-env.js';
|
|
8
8
|
import { createWarmServer } from './server.js';
|
|
@@ -13,6 +13,8 @@ async function main(args) {
|
|
|
13
13
|
loadDotEnv();
|
|
14
14
|
const command = args[0] || (process.stdin.isTTY && process.stdout.isTTY ? 'install' : 'mcp');
|
|
15
15
|
if (command === 'mcp') {
|
|
16
|
+
assertWarmMcpLauncherContract(WARM_MCP_MANIFEST);
|
|
17
|
+
maybeRequireWarmMcpRegistryIntegrity(WARM_MCP_MANIFEST.packageIntegrity.registryIntegrity);
|
|
16
18
|
const server = createWarmServer();
|
|
17
19
|
await server.connect(new StdioServerTransport());
|
|
18
20
|
return;
|
package/dist/cli.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,+EAA+E;AAC/E,uFAAuF;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":";AACA,+EAA+E;AAC/E,uFAAuF;AACvF,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAC;AACjF,OAAO,EACL,6BAA6B,EAC7B,oCAAoC,EACpC,iBAAiB,EACjB,0BAA0B,EAC1B,uBAAuB,GACxB,MAAM,uBAAuB,CAAC;AAC/B,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AACvC,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,SAAS,KAAK;IACZ,OAAO,CAAC,GAAG,CAAC,UAAU,0BAA0B,gBAAgB,uBAAuB,EAAE,CAAC,CAAC;AAC7F,CAAC;AAED,KAAK,UAAU,IAAI,CAAC,IAAc;IAChC,UAAU,EAAE,CAAC;IACb,MAAM,OAAO,GAAG,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,OAAO,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC7F,IAAI,OAAO,KAAK,KAAK,EAAE,CAAC;QACtB,6BAA6B,CAAC,iBAAiB,CAAC,CAAC;QACjD,oCAAoC,CAAC,iBAAiB,CAAC,gBAAgB,CAAC,iBAAiB,CAAC,CAAC;QAC3F,MAAM,MAAM,GAAG,gBAAgB,EAAE,CAAC;QAClC,MAAM,MAAM,CAAC,OAAO,CAAC,IAAI,oBAAoB,EAAE,CAAC,CAAC;QACjD,OAAO;IACT,CAAC;IACD,IAAI,OAAO,KAAK,SAAS,EAAE,CAAC;QAC1B,MAAM,eAAe,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,QAAQ,KAAK,SAAS,CAAC,CAAC;QACjF,IAAI,eAAe;YAAE,MAAM,IAAI,KAAK,CAAC,qBAAqB,eAAe,EAAE,CAAC,CAAC;QAC7E,MAAM,OAAO,CAAC,EAAE,KAAK,EAAE,IAAI,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC,CAAC;QACnD,OAAO;IACT,CAAC;IACD,KAAK,EAAE,CAAC;IACR,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC;AAED,KAAK,IAAI,CAAC,OAAO,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;IAC/C,OAAO,CAAC,KAAK,CAAC,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC;IACtE,OAAO,CAAC,QAAQ,GAAG,CAAC,CAAC;AACvB,CAAC,CAAC,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-paths.d.ts","sourceRoot":"","sources":["../src/config-paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,IAAI,MAAM,
|
|
1
|
+
{"version":3,"file":"config-paths.d.ts","sourceRoot":"","sources":["../src/config-paths.ts"],"names":[],"mappings":"AAKA,wBAAgB,gBAAgB,IAAI,MAAM,CAazC;AAED,wBAAgB,iBAAiB,IAAI,MAAM,CAI1C;AAED,wBAAgB,cAAc,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAMhE"}
|
package/dist/config-paths.js
CHANGED
|
@@ -3,13 +3,13 @@ import * as os from 'node:os';
|
|
|
3
3
|
import * as path from 'node:path';
|
|
4
4
|
import { WARM_MCP_CREDENTIALS } from '@warmio/contracts/mcp';
|
|
5
5
|
export function getWarmConfigDir() {
|
|
6
|
-
if (process.env
|
|
7
|
-
return process.env
|
|
6
|
+
if (process.env['WARM_CONFIG_DIR']?.trim())
|
|
7
|
+
return process.env['WARM_CONFIG_DIR'].trim();
|
|
8
8
|
if (process.platform === 'win32') {
|
|
9
|
-
return path.join(process.env
|
|
9
|
+
return path.join(process.env['APPDATA'] || path.join(os.homedir(), 'AppData', 'Roaming'), 'Warm');
|
|
10
10
|
}
|
|
11
|
-
if (process.env
|
|
12
|
-
return path.join(process.env
|
|
11
|
+
if (process.env['XDG_CONFIG_HOME']?.trim())
|
|
12
|
+
return path.join(process.env['XDG_CONFIG_HOME'].trim(), 'warm');
|
|
13
13
|
return process.platform === 'darwin'
|
|
14
14
|
? path.join(os.homedir(), 'Library', 'Application Support', 'Warm')
|
|
15
15
|
: path.join(os.homedir(), '.config', 'warm');
|
package/dist/config-paths.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config-paths.js","sourceRoot":"","sources":["../src/config-paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,
|
|
1
|
+
{"version":3,"file":"config-paths.js","sourceRoot":"","sources":["../src/config-paths.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,oBAAoB,EAAE,MAAM,uBAAuB,CAAC;AAE7D,MAAM,UAAU,gBAAgB;IAC9B,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE;QAAE,OAAO,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,CAAC;IACzF,IAAI,OAAO,CAAC,QAAQ,KAAK,OAAO,EAAE,CAAC;QACjC,OAAO,IAAI,CAAC,IAAI,CACd,OAAO,CAAC,GAAG,CAAC,SAAS,CAAC,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,SAAS,CAAC,EACvE,MAAM,CACP,CAAC;IACJ,CAAC;IACD,IAAI,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,EAAE,IAAI,EAAE;QACxC,OAAO,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,iBAAiB,CAAC,CAAC,IAAI,EAAE,EAAE,MAAM,CAAC,CAAC;IAClE,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;QAClC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,qBAAqB,EAAE,MAAM,CAAC;QACnE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,OAAO,EAAE,EAAE,SAAS,EAAE,MAAM,CAAC,CAAC;AACjD,CAAC;AAED,MAAM,UAAU,iBAAiB;IAC/B,MAAM,QAAQ,GAAG,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,CAAC;IACzE,IAAI,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC9B,OAAO,IAAI,CAAC,IAAI,CAAC,gBAAgB,EAAE,EAAE,oBAAoB,CAAC,eAAe,CAAC,CAAC;AAC7E,CAAC;AAED,MAAM,UAAU,cAAc,CAAC,UAAkB;IAC/C,IAAI,CAAC;QACH,OAAO,EAAE,CAAC,YAAY,CAAC,UAAU,EAAE,MAAM,CAAC,CAAC,IAAI,EAAE,IAAI,IAAI,CAAC;IAC5D,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC"}
|
package/dist/install.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAyCA,KAAK,aAAa,GAAG;IACnB,MAAM,EAAE,OAAO,CAAC;CACjB,CAAC;AAcF,MAAM,WAAW,cAAc;IAC7B,gGAAgG;IAChG,KAAK,CAAC,EAAE,OAAO,CAAC;IAChB,gEAAgE;IAChE,mBAAmB,CAAC,EAAE,OAAO,KAAK,CAAC;IACnC,uEAAuE;IACvE,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,iEAAiE;IACjE,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,sEAAsE;IACtE,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,OAAO,EAAE,aAAa,KAAK,OAAO,CAAC,MAAM,CAAC,CAAC;IACvE,sEAAsE;IACtE,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,OAAO,CAAC,CAAC;IACjD,0EAA0E;IAC1E,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,MAAM,KAAK,IAAI,CAAC;IACnC,yEAAyE;IACzE,gBAAgB,CAAC,EAAE,MAAM,CAAC;IAC1B,iFAAiF;IACjF,iBAAiB,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;CAC7E;AAgXD,2EAA2E;AAC3E,wBAAsB,OAAO,CAAC,OAAO,GAAE,cAAmB,GAAG,OAAO,CAAC,IAAI,CAAC,CAwCzE"}
|
package/dist/install.js
CHANGED
|
@@ -4,8 +4,11 @@ import * as os from 'node:os';
|
|
|
4
4
|
import * as path from 'node:path';
|
|
5
5
|
import { createInterface } from 'node:readline';
|
|
6
6
|
import { API_ORIGIN, WARM_API_KEY_PREFIX } from '@warmio/contracts/api';
|
|
7
|
-
import { WARM_MCP_CLIENTS, WARM_MCP_PROJECT_CONFIGS, WARM_MCP_SERVER_CONFIG, } from '@warmio/contracts/mcp';
|
|
7
|
+
import { assertWarmMcpLauncherContract, maybeRequireWarmMcpRegistryIntegrity, WARM_MCP_CLIENTS, WARM_MCP_MANIFEST, WARM_MCP_PROJECT_CONFIGS, WARM_MCP_SERVER_CONFIG, } from '@warmio/contracts/mcp';
|
|
8
8
|
import { getWarmApiKeyPath } from './config-paths.js';
|
|
9
|
+
function hasReadlineWriter(readline) {
|
|
10
|
+
return '_writeToOutput' in readline && readline._writeToOutput instanceof Function;
|
|
11
|
+
}
|
|
9
12
|
// Client configuration is intentionally an open JSON object owned by each MCP client.
|
|
10
13
|
// oxlint-disable-next-line anti-slop/no-unknown-parameters -- filesystem JSON is decoded at this object guard.
|
|
11
14
|
function isRecord(value) {
|
|
@@ -15,7 +18,7 @@ function isRecord(value) {
|
|
|
15
18
|
const API_KEY_PATTERN = new RegExp(`^${WARM_API_KEY_PREFIX}[A-Za-z0-9_-]{43}$`);
|
|
16
19
|
function configPath(config, homeDir) {
|
|
17
20
|
const root = config.root === 'appData'
|
|
18
|
-
? process.env
|
|
21
|
+
? process.env['APPDATA']?.trim() || path.join(homeDir, 'AppData', 'Roaming')
|
|
19
22
|
: homeDir;
|
|
20
23
|
return path.join(root, ...config.segments);
|
|
21
24
|
}
|
|
@@ -58,19 +61,19 @@ function isCurrentWarmConfig(client, server) {
|
|
|
58
61
|
if (!isRecord(server))
|
|
59
62
|
return false;
|
|
60
63
|
if (client.configDialect === 'openCode') {
|
|
61
|
-
return (server
|
|
62
|
-
Array.isArray(server
|
|
63
|
-
server
|
|
64
|
-
server
|
|
65
|
-
server
|
|
64
|
+
return (server['type'] === 'local' &&
|
|
65
|
+
Array.isArray(server['command']) &&
|
|
66
|
+
server['command'].length === WARM_MCP_SERVER_CONFIG.args.length + 1 &&
|
|
67
|
+
server['command'][0] === WARM_MCP_SERVER_CONFIG.command &&
|
|
68
|
+
server['command']
|
|
66
69
|
.slice(1)
|
|
67
70
|
.every((argument, index) => argument === WARM_MCP_SERVER_CONFIG.args[index]) &&
|
|
68
71
|
Object.keys(server).length === 2);
|
|
69
72
|
}
|
|
70
|
-
return (server
|
|
71
|
-
Array.isArray(server
|
|
72
|
-
server
|
|
73
|
-
server
|
|
73
|
+
return (server['command'] === WARM_MCP_SERVER_CONFIG.command &&
|
|
74
|
+
Array.isArray(server['args']) &&
|
|
75
|
+
server['args'].length === WARM_MCP_SERVER_CONFIG.args.length &&
|
|
76
|
+
server['args'].every((argument, index) => argument === WARM_MCP_SERVER_CONFIG.args[index]) &&
|
|
74
77
|
Object.keys(server).length === 2);
|
|
75
78
|
}
|
|
76
79
|
function parseJsonConfig(client, content) {
|
|
@@ -93,7 +96,7 @@ function existingWarmConfig(client) {
|
|
|
93
96
|
: '';
|
|
94
97
|
const section = content.match(WARM_TOML_BLOCK)?.[0];
|
|
95
98
|
return {
|
|
96
|
-
current:
|
|
99
|
+
current: section !== undefined &&
|
|
97
100
|
!content.includes('[mcp_servers.warm.env]') &&
|
|
98
101
|
section.trim() ===
|
|
99
102
|
[
|
|
@@ -106,42 +109,44 @@ function existingWarmConfig(client) {
|
|
|
106
109
|
}
|
|
107
110
|
const config = readJsonConfig(client);
|
|
108
111
|
if (client.configDialect === 'openCode') {
|
|
109
|
-
const servers = isRecord(config
|
|
110
|
-
const legacyServers = isRecord(config
|
|
112
|
+
const servers = isRecord(config['mcp']) ? config['mcp'] : {};
|
|
113
|
+
const legacyServers = isRecord(config['mcpServers']) ? config['mcpServers'] : {};
|
|
111
114
|
const hasLegacyWarmConfig = 'warm' in legacyServers;
|
|
112
115
|
return {
|
|
113
|
-
current: isRecord(servers
|
|
116
|
+
current: isRecord(servers['warm']) &&
|
|
117
|
+
isCurrentWarmConfig(client, servers['warm']) &&
|
|
118
|
+
!hasLegacyWarmConfig,
|
|
114
119
|
exists: 'warm' in servers || hasLegacyWarmConfig,
|
|
115
120
|
};
|
|
116
121
|
}
|
|
117
|
-
const servers = isRecord(config
|
|
122
|
+
const servers = isRecord(config['mcpServers']) ? config['mcpServers'] : {};
|
|
118
123
|
return {
|
|
119
|
-
current: isRecord(servers
|
|
124
|
+
current: isRecord(servers['warm']) && isCurrentWarmConfig(client, servers['warm']),
|
|
120
125
|
exists: 'warm' in servers,
|
|
121
126
|
};
|
|
122
127
|
}
|
|
123
128
|
function prepareJsonConfig(client, current) {
|
|
124
129
|
const config = parseJsonConfig(client, current);
|
|
125
130
|
if (client.configDialect === 'openCode') {
|
|
126
|
-
const servers = isRecord(config
|
|
127
|
-
servers
|
|
131
|
+
const servers = isRecord(config['mcp']) ? config['mcp'] : {};
|
|
132
|
+
servers['warm'] = {
|
|
128
133
|
type: 'local',
|
|
129
134
|
command: [WARM_MCP_SERVER_CONFIG.command, ...WARM_MCP_SERVER_CONFIG.args],
|
|
130
135
|
};
|
|
131
|
-
config
|
|
132
|
-
if (isRecord(config
|
|
133
|
-
delete config
|
|
134
|
-
if (Object.keys(config
|
|
135
|
-
delete config
|
|
136
|
+
config['mcp'] = servers;
|
|
137
|
+
if (isRecord(config['mcpServers']) && 'warm' in config['mcpServers']) {
|
|
138
|
+
delete config['mcpServers']['warm'];
|
|
139
|
+
if (Object.keys(config['mcpServers']).length === 0)
|
|
140
|
+
delete config['mcpServers'];
|
|
136
141
|
}
|
|
137
142
|
return `${JSON.stringify(config, null, 2)}\n`;
|
|
138
143
|
}
|
|
139
|
-
const servers = isRecord(config
|
|
140
|
-
servers
|
|
144
|
+
const servers = isRecord(config['mcpServers']) ? config['mcpServers'] : {};
|
|
145
|
+
servers['warm'] = {
|
|
141
146
|
command: WARM_MCP_SERVER_CONFIG.command,
|
|
142
147
|
args: [...WARM_MCP_SERVER_CONFIG.args],
|
|
143
148
|
};
|
|
144
|
-
config
|
|
149
|
+
config['mcpServers'] = servers;
|
|
145
150
|
return `${JSON.stringify(config, null, 2)}\n`;
|
|
146
151
|
}
|
|
147
152
|
function prepareTomlConfig(current) {
|
|
@@ -262,11 +267,13 @@ function readlinePrompt(question, options) {
|
|
|
262
267
|
input: process.stdin,
|
|
263
268
|
output: process.stdout,
|
|
264
269
|
});
|
|
265
|
-
|
|
266
|
-
|
|
267
|
-
|
|
268
|
-
|
|
269
|
-
|
|
270
|
+
if (options.hidden &&
|
|
271
|
+
hasReadlineWriter(readline) &&
|
|
272
|
+
process.stdin.isTTY &&
|
|
273
|
+
process.stdout.isTTY) {
|
|
274
|
+
const writeToOutput = readline._writeToOutput;
|
|
275
|
+
writeToOutput.call(readline, question);
|
|
276
|
+
readline._writeToOutput = (value) => writeToOutput.call(readline, value.replace(/[^\r\n]/g, '•'));
|
|
270
277
|
}
|
|
271
278
|
readline.question(options.hidden ? '' : question, (answer) => {
|
|
272
279
|
readline.close();
|
|
@@ -286,7 +293,7 @@ async function validateApiKey(apiKey, options) {
|
|
|
286
293
|
});
|
|
287
294
|
const text = await response.text();
|
|
288
295
|
const body = parseJsonResponse(text);
|
|
289
|
-
if (!response.ok || !isRecord(body) || body
|
|
296
|
+
if (!response.ok || !isRecord(body) || body['valid'] !== true || Object.keys(body).length !== 1) {
|
|
290
297
|
throw new Error('Warm API key validation failed. Check Warm Settings and try again.');
|
|
291
298
|
}
|
|
292
299
|
}
|
|
@@ -329,6 +336,8 @@ async function resolveApiKey(target, ask, options) {
|
|
|
329
336
|
}
|
|
330
337
|
/** Configure detected supported MCP clients for the local stdio server. */
|
|
331
338
|
export async function install(options = {}) {
|
|
339
|
+
assertWarmMcpLauncherContract(WARM_MCP_MANIFEST);
|
|
340
|
+
maybeRequireWarmMcpRegistryIntegrity(WARM_MCP_MANIFEST.packageIntegrity.registryIntegrity);
|
|
332
341
|
const homeDir = options.homeDir || os.homedir();
|
|
333
342
|
const workingDirectory = options.workingDirectory || process.cwd();
|
|
334
343
|
const ask = options.prompt || readlinePrompt;
|
package/dist/install.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
package/dist/load-env.d.ts
CHANGED
|
@@ -1,2 +1,5 @@
|
|
|
1
|
+
export declare const WARM_LOAD_PROJECT_ENV = "WARM_LOAD_PROJECT_ENV";
|
|
2
|
+
export declare const BLOCKED_PROJECT_ENV_KEYS: readonly ['WARM_API_KEY', 'WARM_API_KEY_FILE', 'WARM_CONFIG_DIR', 'WARM_API_URL'];
|
|
1
3
|
export declare function loadDotEnv(): void;
|
|
4
|
+
export declare function resetLoadDotEnvState(): void;
|
|
2
5
|
//# sourceMappingURL=load-env.d.ts.map
|
package/dist/load-env.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-env.d.ts","sourceRoot":"","sources":["../src/load-env.ts"],"names":[],"mappings":"AAMA,wBAAgB,UAAU,IAAI,IAAI,
|
|
1
|
+
{"version":3,"file":"load-env.d.ts","sourceRoot":"","sources":["../src/load-env.ts"],"names":[],"mappings":"AAMA,eAAO,MAAM,qBAAqB,0BAA0B,CAAC;AAE7D,eAAO,MAAM,wBAAwB,YACnC,cAAc,EACd,mBAAmB,EACnB,iBAAiB,EACjB,cAAc,CACN,CAAC;AAIX,wBAAgB,UAAU,IAAI,IAAI,CAajC;AAED,wBAAgB,oBAAoB,IAAI,IAAI,CAE3C"}
|
package/dist/load-env.js
CHANGED
|
@@ -1,19 +1,33 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
-
import {
|
|
3
|
+
import { parse as parseEnvFile } from 'dotenv';
|
|
4
4
|
let loaded = false;
|
|
5
|
+
export const WARM_LOAD_PROJECT_ENV = 'WARM_LOAD_PROJECT_ENV';
|
|
6
|
+
export const BLOCKED_PROJECT_ENV_KEYS = [
|
|
7
|
+
'WARM_API_KEY',
|
|
8
|
+
'WARM_API_KEY_FILE',
|
|
9
|
+
'WARM_CONFIG_DIR',
|
|
10
|
+
'WARM_API_URL',
|
|
11
|
+
];
|
|
12
|
+
const blockedProjectEnvKeys = new Set(BLOCKED_PROJECT_ENV_KEYS);
|
|
5
13
|
export function loadDotEnv() {
|
|
6
14
|
if (loaded)
|
|
7
15
|
return;
|
|
8
16
|
loaded = true;
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
+
if (process.env[WARM_LOAD_PROJECT_ENV]?.trim() !== '1')
|
|
18
|
+
return;
|
|
19
|
+
const candidate = path.join(process.cwd(), '.env');
|
|
20
|
+
if (!fs.existsSync(candidate))
|
|
21
|
+
return;
|
|
22
|
+
const parsed = parseEnvFile(fs.readFileSync(candidate));
|
|
23
|
+
for (const [key, value] of Object.entries(parsed)) {
|
|
24
|
+
if (blockedProjectEnvKeys.has(key))
|
|
25
|
+
continue;
|
|
26
|
+
if (process.env[key] === undefined)
|
|
27
|
+
process.env[key] = value;
|
|
17
28
|
}
|
|
18
29
|
}
|
|
30
|
+
export function resetLoadDotEnvState() {
|
|
31
|
+
loaded = false;
|
|
32
|
+
}
|
|
19
33
|
//# sourceMappingURL=load-env.js.map
|
package/dist/load-env.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../src/load-env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,
|
|
1
|
+
{"version":3,"file":"load-env.js","sourceRoot":"","sources":["../src/load-env.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAC;AAClC,OAAO,EAAE,KAAK,IAAI,YAAY,EAAE,MAAM,QAAQ,CAAC;AAE/C,IAAI,MAAM,GAAG,KAAK,CAAC;AAEnB,MAAM,CAAC,MAAM,qBAAqB,GAAG,uBAAuB,CAAC;AAE7D,MAAM,CAAC,MAAM,wBAAwB,GAAG;IACtC,cAAc;IACd,mBAAmB;IACnB,iBAAiB;IACjB,cAAc;CACN,CAAC;AAEX,MAAM,qBAAqB,GAAG,IAAI,GAAG,CAAS,wBAAwB,CAAC,CAAC;AAExE,MAAM,UAAU,UAAU;IACxB,IAAI,MAAM;QAAE,OAAO;IACnB,MAAM,GAAG,IAAI,CAAC;IACd,IAAI,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,EAAE,IAAI,EAAE,KAAK,GAAG;QAAE,OAAO;IAE/D,MAAM,SAAS,GAAG,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,MAAM,CAAC,CAAC;IACnD,IAAI,CAAC,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC;QAAE,OAAO;IAEtC,MAAM,MAAM,GAAG,YAAY,CAAC,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAC;IACxD,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC;QAClD,IAAI,qBAAqB,CAAC,GAAG,CAAC,GAAG,CAAC;YAAE,SAAS;QAC7C,IAAI,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,KAAK,SAAS;YAAE,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;IAC/D,CAAC;AACH,CAAC;AAED,MAAM,UAAU,oBAAoB;IAClC,MAAM,GAAG,KAAK,CAAC;AACjB,CAAC"}
|
package/dist/server.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;
|
|
1
|
+
{"version":3,"file":"server.d.ts","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,EAKL,KAAK,cAAc,EAGpB,MAAM,oCAAoC,CAAC;AAS5C,OAAO,EAIL,KAAK,4BAA4B,EAEjC,KAAK,oBAAoB,EAE1B,MAAM,sBAAsB,CAAC;AAE9B,OAAO,EACL,2BAA2B,EAC3B,mBAAmB,EACnB,mBAAmB,EACnB,YAAY,GACb,MAAM,sBAAsB,CAAC;AAC9B,YAAY,EAAE,4BAA4B,EAAE,oBAAoB,EAAE,MAAM,sBAAsB,CAAC;AAE/F,MAAM,WAAW,iBAAkB,SAAQ,oBAAoB;IAC7D,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AACD,MAAM,WAAW,yBAA0B,SAAQ,4BAA4B;IAC7E,UAAU,CAAC,EAAE,cAAc,CAAC;CAC7B;AAgBD,eAAO,MAAM,gBAAgB;IAAK,IAAI;IAAU,OAAO;CAAoB,CAAC;AA+K5E,8DAA8D;AAC9D,wBAAgB,gBAAgB,CAAC,OAAO,GAAE,iBAAsB,GAAG,SAAS,CAM3E;AAED,qFAAqF;AACrF,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,yBAAyB,GAAG,SAAS,CAKtF"}
|
package/dist/server.js
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import * as fs from 'node:fs';
|
|
2
2
|
/* oxlint-disable anti-slop/no-shape-in-symbol-names -- inputShape and ZodRawShape are canonical MCP/Zod contract terms. */
|
|
3
3
|
import { McpServer } from '@modelcontextprotocol/sdk/server/mcp.js';
|
|
4
|
-
import { toJsonSchemaCompat } from '@modelcontextprotocol/sdk/server/zod-json-schema-compat.js';
|
|
5
4
|
import { CallToolRequestSchema, ErrorCode, ListToolsRequestSchema, McpError, } from '@modelcontextprotocol/sdk/types.js';
|
|
6
5
|
import { z } from 'zod';
|
|
7
6
|
import { getTransactionsMcpInputSchema, normalizeGetTransactionsMcpInput, privateMcpToolDefinitions, privateMcpToolDescriptors, } from '@warmio/contracts/mcp';
|
|
@@ -20,7 +19,7 @@ export const WARM_SERVER_INFO = { name: 'warm', version: packageVersion() };
|
|
|
20
19
|
// oxlint-disable-next-line anti-slop/no-object-parameters -- MCP structured content requires a JSON object result.
|
|
21
20
|
function structuredResult(value, isError = false) {
|
|
22
21
|
return {
|
|
23
|
-
content: [{ type: 'text', text: JSON.stringify(value
|
|
22
|
+
content: [{ type: 'text', text: JSON.stringify(value) }],
|
|
24
23
|
...(isError ? { isError: true } : { structuredContent: value }),
|
|
25
24
|
};
|
|
26
25
|
}
|
|
@@ -49,6 +48,9 @@ function mcpOutputSchema(name) {
|
|
|
49
48
|
? outputSchema
|
|
50
49
|
: { ...outputSchema, type: 'object' };
|
|
51
50
|
}
|
|
51
|
+
function isMcpToolInputSchema(value) {
|
|
52
|
+
return 'type' in value && value.type === 'object';
|
|
53
|
+
}
|
|
52
54
|
function readToolDefinitions(client) {
|
|
53
55
|
return [
|
|
54
56
|
{
|
|
@@ -57,7 +59,7 @@ function readToolDefinitions(client) {
|
|
|
57
59
|
},
|
|
58
60
|
{
|
|
59
61
|
...descriptor('get_transactions'),
|
|
60
|
-
handler: async (args) => await client.getTransactions(normalizeGetTransactionsMcpInput(
|
|
62
|
+
handler: async (args) => await client.getTransactions(normalizeGetTransactionsMcpInput(args)),
|
|
61
63
|
},
|
|
62
64
|
];
|
|
63
65
|
}
|
|
@@ -65,47 +67,61 @@ function automationToolDefinitions(client) {
|
|
|
65
67
|
return [
|
|
66
68
|
{
|
|
67
69
|
...descriptor('search_operations'),
|
|
68
|
-
handler: async (args) => await client.searchOperations(z.string().optional().parse(args
|
|
70
|
+
handler: async (args) => await client.searchOperations(z.string().optional().parse(args['query'])),
|
|
69
71
|
},
|
|
70
72
|
{
|
|
71
73
|
...descriptor('describe_operation'),
|
|
72
|
-
handler: async (args) => await client.describeOperation(z.string().parse(args
|
|
74
|
+
handler: async (args) => await client.describeOperation(z.string().parse(args['operation_id']), automationInputSchema.optional().parse(args['input'])),
|
|
73
75
|
},
|
|
74
76
|
{
|
|
75
77
|
...descriptor('invoke_operation'),
|
|
76
|
-
handler: async (args) => await client.invokeOperation(z.string().parse(args
|
|
78
|
+
handler: async (args) => await client.invokeOperation(z.string().parse(args['operation_id']), automationInputSchema.optional().parse(args['input']), z.string().uuid().optional().parse(args['approval_id'])),
|
|
77
79
|
},
|
|
78
80
|
];
|
|
79
81
|
}
|
|
80
82
|
function registerTools(server, tools) {
|
|
81
83
|
server.server.registerCapabilities({ tools: { listChanged: true } });
|
|
82
84
|
server.server.setRequestHandler(ListToolsRequestSchema, () => ({
|
|
83
|
-
tools: tools.map((tool) =>
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
90
|
-
|
|
91
|
-
|
|
92
|
-
|
|
85
|
+
tools: tools.map((tool) => {
|
|
86
|
+
const inputSchema = canonicalToolDescriptor(tool.name).input_schema;
|
|
87
|
+
if (!isMcpToolInputSchema(inputSchema)) {
|
|
88
|
+
throw new Error(`Invalid MCP input schema for ${tool.name}.`);
|
|
89
|
+
}
|
|
90
|
+
return {
|
|
91
|
+
annotations: tool.annotations,
|
|
92
|
+
description: tool.description,
|
|
93
|
+
inputSchema,
|
|
94
|
+
outputSchema: mcpOutputSchema(tool.name),
|
|
95
|
+
name: tool.name,
|
|
96
|
+
};
|
|
97
|
+
}),
|
|
93
98
|
}));
|
|
94
99
|
server.server.setRequestHandler(CallToolRequestSchema, async (request) => {
|
|
95
100
|
const tool = tools.find((candidate) => candidate.name === request.params.name);
|
|
96
101
|
if (!tool)
|
|
97
102
|
throw new McpError(ErrorCode.InvalidParams, `Tool ${request.params.name} not found`);
|
|
103
|
+
const invoke = async (name, handler) => {
|
|
104
|
+
try {
|
|
105
|
+
const result = await handler();
|
|
106
|
+
const invokeStatus = z.object({ status: z.number() }).safeParse(result);
|
|
107
|
+
return structuredResult(result, name === 'invoke_operation' && invokeStatus.success && invokeStatus.data.status >= 400);
|
|
108
|
+
}
|
|
109
|
+
catch (error) {
|
|
110
|
+
return toolFailure(error);
|
|
111
|
+
}
|
|
112
|
+
};
|
|
113
|
+
if (tool.name === 'get_transactions') {
|
|
114
|
+
const parsed = await getTransactionsMcpInputSchema.safeParseAsync(request.params.arguments ?? {});
|
|
115
|
+
if (!parsed.success)
|
|
116
|
+
throw new McpError(ErrorCode.InvalidParams, `Invalid arguments for tool ${tool.name}: ${parsed.error.message}`);
|
|
117
|
+
return await invoke(tool.name, () => tool.handler(parsed.data));
|
|
118
|
+
}
|
|
98
119
|
const parsed = await z
|
|
99
120
|
.object(tool.inputShape)
|
|
100
121
|
.strict()
|
|
101
122
|
.safeParseAsync(request.params.arguments ?? {});
|
|
102
123
|
if (!parsed.success)
|
|
103
124
|
throw new McpError(ErrorCode.InvalidParams, `Invalid arguments for tool ${tool.name}: ${parsed.error.message}`);
|
|
104
|
-
if (tool.name === 'get_transactions') {
|
|
105
|
-
const transactionInput = await getTransactionsMcpInputSchema.safeParseAsync(parsed.data);
|
|
106
|
-
if (!transactionInput.success)
|
|
107
|
-
throw new McpError(ErrorCode.InvalidParams, `Invalid arguments for tool ${tool.name}: ${transactionInput.error.message}`);
|
|
108
|
-
}
|
|
109
125
|
try {
|
|
110
126
|
const result = await tool.handler(parsed.data);
|
|
111
127
|
const invokeStatus = z.object({ status: z.number() }).safeParse(result);
|
package/dist/server.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAC;AAC9B,2HAA2H;AAC3H,OAAO,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AACpE,OAAO,
|
|
1
|
+
{"version":3,"file":"server.js","sourceRoot":"","sources":["../src/server.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,9 @@
|
|
|
1
|
-
import type {
|
|
2
|
-
|
|
1
|
+
import type { normalizeGetTransactionsMcpInput } from '@warmio/contracts/mcp';
|
|
2
|
+
import type { AutomationInput, AutomationOperation, FinancialContext, FinancialContextMeta, FinancialContextTransactionsRequest, LatestTransactions, TransactionMonth } from '@warmio/contracts/types';
|
|
3
|
+
export type { AutomationInput, AutomationOperation, FinancialContext, FinancialContextMeta, FinancialContextTransactionsRequest, LatestTransactions, TransactionMonth, } from '@warmio/contracts/types';
|
|
4
|
+
export type FinancialContextMonth = Extract<FinancialContextTransactionsRequest, {
|
|
5
|
+
month: string;
|
|
6
|
+
}>['month'];
|
|
3
7
|
export interface WarmApiClientOptions {
|
|
4
8
|
apiKeyResolver?: () => string | null;
|
|
5
9
|
apiUrl?: string;
|
|
@@ -9,13 +13,7 @@ export interface WarmApiClientOptions {
|
|
|
9
13
|
export interface ReadOnlyWarmApiClientOptions extends Omit<WarmApiClientOptions, 'apiKeyResolver'> {
|
|
10
14
|
accessTokenResolver: () => string | null;
|
|
11
15
|
}
|
|
12
|
-
export type GetTransactionsInput =
|
|
13
|
-
month: string;
|
|
14
|
-
latest?: never;
|
|
15
|
-
} | {
|
|
16
|
-
latest: true;
|
|
17
|
-
month?: never;
|
|
18
|
-
};
|
|
16
|
+
export type GetTransactionsInput = ReturnType<typeof normalizeGetTransactionsMcpInput>;
|
|
19
17
|
export type GetTransactionsOutput = TransactionMonth | LatestTransactions;
|
|
20
18
|
export type AutomationOperationDescription = AutomationOperation & {
|
|
21
19
|
input_schema: Record<string, unknown>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warm-api-client.d.ts","sourceRoot":"","sources":["../src/warm-api-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"warm-api-client.d.ts","sourceRoot":"","sources":["../src/warm-api-client.ts"],"names":[],"mappings":"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"}
|
package/dist/warm-api-client.js
CHANGED
|
@@ -1,10 +1,17 @@
|
|
|
1
1
|
import { API_ORIGIN, apiEndpointManifest } from '@warmio/contracts/api';
|
|
2
|
+
import { automationInvocationResponseSchema, automationOperationDescriptionResponseSchema, automationOperationSearchResponseSchema, financialContextMetaSchema, financialContextSchema, latestTransactionsSchema, transactionMonthSchema, } from '@warmio/contracts/schemas';
|
|
2
3
|
import { WARM_MCP_CREDENTIALS, WARM_MCP_INSTALLER_COMMAND } from '@warmio/contracts/mcp';
|
|
3
4
|
import { z } from 'zod';
|
|
4
5
|
import { getWarmApiKeyPath, readConfigFile } from './config-paths.js';
|
|
5
6
|
export const API_URL = API_ORIGIN;
|
|
6
|
-
const
|
|
7
|
-
|
|
7
|
+
const endpointByOperationId = new Map(apiEndpointManifest.map((endpoint) => [endpoint.operation_id, endpoint.path]));
|
|
8
|
+
function endpointFor(operationId) {
|
|
9
|
+
const endpoint = endpointByOperationId.get(operationId);
|
|
10
|
+
if (!endpoint)
|
|
11
|
+
throw new Error(`Unknown Warm API operation: ${operationId}`);
|
|
12
|
+
return endpoint;
|
|
13
|
+
}
|
|
14
|
+
const DEFAULT_TIMEOUT_MS = Number(process.env['WARM_API_TIMEOUT_MS'] || 10_000) || 10_000;
|
|
8
15
|
let cachedApiKey;
|
|
9
16
|
export function getConfiguredApiKey() {
|
|
10
17
|
if (cachedApiKey !== undefined)
|
|
@@ -47,6 +54,29 @@ function parseResponseBody(text) {
|
|
|
47
54
|
return text;
|
|
48
55
|
}
|
|
49
56
|
}
|
|
57
|
+
function parseDescribeOperationResponse(value) {
|
|
58
|
+
const parsed = automationOperationDescriptionResponseSchema.parse(value);
|
|
59
|
+
const output = { operation: parsed.operation };
|
|
60
|
+
if (parsed.approval) {
|
|
61
|
+
output.approval = parsed.approval;
|
|
62
|
+
}
|
|
63
|
+
return output;
|
|
64
|
+
}
|
|
65
|
+
function parseInvokeOperationResponse(value) {
|
|
66
|
+
const parsed = automationInvocationResponseSchema.parse(value);
|
|
67
|
+
return {
|
|
68
|
+
body: parsed.body,
|
|
69
|
+
headers: parsed.headers,
|
|
70
|
+
operation_id: parsed.operation_id,
|
|
71
|
+
status: parsed.status,
|
|
72
|
+
};
|
|
73
|
+
}
|
|
74
|
+
const describeOperationResponseParser = {
|
|
75
|
+
parse: parseDescribeOperationResponse,
|
|
76
|
+
};
|
|
77
|
+
const invokeOperationResponseParser = {
|
|
78
|
+
parse: parseInvokeOperationResponse,
|
|
79
|
+
};
|
|
50
80
|
function errorFromResponse(response) {
|
|
51
81
|
const knownMessages = new Map([
|
|
52
82
|
[401, 'Invalid API key. Regenerate it in Warm Settings.'],
|
|
@@ -62,7 +92,7 @@ function createRequest(authorizationResolver, options) {
|
|
|
62
92
|
const apiUrl = options.apiUrl || API_URL;
|
|
63
93
|
const fetchImplementation = options.fetchImplementation || fetch;
|
|
64
94
|
const requestTimeoutMs = options.requestTimeoutMs || DEFAULT_TIMEOUT_MS;
|
|
65
|
-
return async (input) => {
|
|
95
|
+
return async (input, responseSchema) => {
|
|
66
96
|
const token = authorizationResolver();
|
|
67
97
|
if (!token)
|
|
68
98
|
throw new Error(`No Warm API key configured. Run \"${WARM_MCP_INSTALLER_COMMAND}\" or set ${WARM_MCP_CREDENTIALS.apiKeyEnv}.`);
|
|
@@ -80,11 +110,16 @@ function createRequest(authorizationResolver, options) {
|
|
|
80
110
|
Accept: 'application/json',
|
|
81
111
|
Authorization: `Bearer ${token}`,
|
|
82
112
|
};
|
|
83
|
-
const requestInit = {
|
|
84
|
-
|
|
113
|
+
const requestInit = {
|
|
114
|
+
headers,
|
|
115
|
+
signal: requestSignal(requestTimeoutMs),
|
|
116
|
+
};
|
|
117
|
+
if (input.method) {
|
|
85
118
|
requestInit.method = input.method;
|
|
86
|
-
|
|
119
|
+
}
|
|
120
|
+
if (input.body) {
|
|
87
121
|
requestInit.body = JSON.stringify(input.body);
|
|
122
|
+
}
|
|
88
123
|
const response = await fetchImplementation(url, requestInit);
|
|
89
124
|
const text = await response.text();
|
|
90
125
|
const body = parseResponseBody(text);
|
|
@@ -95,23 +130,24 @@ function createRequest(authorizationResolver, options) {
|
|
|
95
130
|
};
|
|
96
131
|
if (!response.ok)
|
|
97
132
|
throw errorFromResponse(apiResponse);
|
|
98
|
-
return body;
|
|
133
|
+
return responseSchema.parse(body);
|
|
99
134
|
};
|
|
100
135
|
}
|
|
101
136
|
function createReadOnlyClient(request) {
|
|
102
137
|
return {
|
|
103
|
-
getFinancialContext: () => request({ endpoint:
|
|
104
|
-
getFinancialContextMeta: () => request({ endpoint:
|
|
138
|
+
getFinancialContext: () => request({ endpoint: endpointFor('getFinancialContext') }, financialContextSchema),
|
|
139
|
+
getFinancialContextMeta: () => request({ endpoint: endpointFor('getFinancialContextMeta') }, financialContextMetaSchema),
|
|
105
140
|
getTransactions: (input) => {
|
|
106
|
-
if ('month' in input)
|
|
141
|
+
if ('month' in input) {
|
|
107
142
|
return request({
|
|
108
|
-
endpoint:
|
|
143
|
+
endpoint: endpointFor('getFinancialContextTransactions'),
|
|
109
144
|
query: { month: input.month },
|
|
110
|
-
});
|
|
145
|
+
}, transactionMonthSchema);
|
|
146
|
+
}
|
|
111
147
|
return request({
|
|
112
|
-
endpoint:
|
|
148
|
+
endpoint: endpointFor('getFinancialContextTransactions'),
|
|
113
149
|
query: { latest: '1' },
|
|
114
|
-
});
|
|
150
|
+
}, latestTransactionsSchema);
|
|
115
151
|
},
|
|
116
152
|
};
|
|
117
153
|
}
|
|
@@ -120,29 +156,29 @@ function createClient(authorizationResolver, options) {
|
|
|
120
156
|
return {
|
|
121
157
|
...createReadOnlyClient(request),
|
|
122
158
|
searchOperations: (query) => request({
|
|
123
|
-
endpoint:
|
|
159
|
+
endpoint: endpointFor('searchOperations'),
|
|
124
160
|
method: 'POST',
|
|
125
161
|
body: query ? { query } : {},
|
|
126
|
-
}),
|
|
162
|
+
}, automationOperationSearchResponseSchema),
|
|
127
163
|
describeOperation: (operation_id, input) => {
|
|
128
164
|
const body = { operation_id };
|
|
129
165
|
if (input)
|
|
130
166
|
Object.assign(body, { input });
|
|
131
167
|
return request({
|
|
132
|
-
endpoint:
|
|
168
|
+
endpoint: endpointFor('describeOperation'),
|
|
133
169
|
method: 'POST',
|
|
134
170
|
body,
|
|
135
|
-
});
|
|
171
|
+
}, describeOperationResponseParser);
|
|
136
172
|
},
|
|
137
173
|
invokeOperation: (operation_id, input, approval_id) => {
|
|
138
174
|
const body = { operation_id, input: input ?? {} };
|
|
139
175
|
if (approval_id)
|
|
140
176
|
Object.assign(body, { approval_id });
|
|
141
177
|
return request({
|
|
142
|
-
endpoint:
|
|
178
|
+
endpoint: endpointFor('invokeOperation'),
|
|
143
179
|
method: 'POST',
|
|
144
180
|
body,
|
|
145
|
-
});
|
|
181
|
+
}, invokeOperationResponseParser);
|
|
146
182
|
},
|
|
147
183
|
};
|
|
148
184
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"warm-api-client.js","sourceRoot":"","sources":["../src/warm-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"warm-api-client.js","sourceRoot":"","sources":["../src/warm-api-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,mBAAmB,EAAE,MAAM,uBAAuB,CAAC;AACxE,OAAO,EACL,kCAAkC,EAClC,4CAA4C,EAC5C,uCAAuC,EACvC,0BAA0B,EAC1B,sBAAsB,EACtB,wBAAwB,EACxB,sBAAsB,GACvB,MAAM,2BAA2B,CAAC;AACnC,OAAO,EAAE,oBAAoB,EAAE,0BAA0B,EAAE,MAAM,uBAAuB,CAAC;AAEzF,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAUxB,OAAO,EAAE,iBAAiB,EAAE,cAAc,EAAE,MAAM,mBAAmB,CAAC;AAgEtE,MAAM,CAAC,MAAM,OAAO,GAAG,UAAU,CAAC;AAElC,MAAM,qBAAqB,GAAG,IAAI,GAAG,CACnC,mBAAmB,CAAC,GAAG,CAAC,CAAC,QAAQ,EAAE,EAAE,CAAC,CAAC,QAAQ,CAAC,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAU,CAAC,CACvF,CAAC;AAEF,SAAS,WAAW,CAAC,WAA2B;IAC9C,MAAM,QAAQ,GAAG,qBAAqB,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;IACxD,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,+BAA+B,WAAW,EAAE,CAAC,CAAC;IAC7E,OAAO,QAAQ,CAAC;AAClB,CAAC;AACD,MAAM,kBAAkB,GAAG,MAAM,CAAC,OAAO,CAAC,GAAG,CAAC,qBAAqB,CAAC,IAAI,MAAM,CAAC,IAAI,MAAM,CAAC;AAC1F,IAAI,YAAuC,CAAC;AAE5C,MAAM,UAAU,mBAAmB;IACjC,IAAI,YAAY,KAAK,SAAS;QAAE,OAAO,YAAY,CAAC;IACpD,YAAY;QACV,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC,SAAS,CAAC,EAAE,IAAI,EAAE,IAAI,cAAc,CAAC,iBAAiB,EAAE,CAAC,CAAC;IAC7F,OAAO,YAAY,IAAI,IAAI,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,0BAA0B;IACxC,YAAY,GAAG,SAAS,CAAC;AAC3B,CAAC;AAQD,MAAM,OAAO,YAAa,SAAQ,KAAK;IAG1B,QAAQ;IAFnB,YACE,OAAe,EACN,QAAkC;QAE3C,KAAK,CAAC,OAAO,CAAC,CAAC;wBAFN,QAAQ;QAGjB,IAAI,CAAC,IAAI,GAAG,cAAc,CAAC;IAC7B,CAAC;IAED,0IAA0I;IAC1I,IAAI,IAAI;QACN,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC;IAC5B,CAAC;IACD,IAAI,OAAO;QACT,OAAO,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC;IAC/B,CAAC;IACD,IAAI,MAAM;QACR,OAAO,IAAI,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC9B,CAAC;CACF;AAaD,SAAS,aAAa,CAAC,SAAiB;IACtC,OAAO,WAAW,CAAC,OAAO,EAAE,CAAC,SAAS,CAAC,IAAI,IAAI,eAAe,EAAE,CAAC,MAAM,CAAC;AAC1E,CAAC;AACD,SAAS,iBAAiB,CAAC,IAAY;IACrC,IAAI,CAAC,IAAI;QAAE,OAAO,IAAI,CAAC;IACvB,IAAI,CAAC;QACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IAC1B,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,IAAI,CAAC;IACd,CAAC;AACH,CAAC;AAED,SAAS,8BAA8B,CACrC,KAAmE;IAEnE,MAAM,MAAM,GAAG,4CAA4C,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IACzE,MAAM,MAAM,GAA4B,EAAE,SAAS,EAAE,MAAM,CAAC,SAAS,EAAE,CAAC;IACxE,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACpB,MAAM,CAAC,QAAQ,GAAG,MAAM,CAAC,QAAQ,CAAC;IACpC,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC;AAED,SAAS,4BAA4B,CACnC,KAAyD;IAEzD,MAAM,MAAM,GAAG,kCAAkC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;IAC/D,OAAO;QACL,IAAI,EAAE,MAAM,CAAC,IAAI;QACjB,OAAO,EAAE,MAAM,CAAC,OAAO;QACvB,YAAY,EAAE,MAAM,CAAC,YAAY;QACjC,MAAM,EAAE,MAAM,CAAC,MAAM;KACtB,CAAC;AACJ,CAAC;AAID,MAAM,+BAA+B,GAA4C;IAC/E,KAAK,EAAE,8BAA8B;CACtC,CAAC;AACF,MAAM,6BAA6B,GAA0C;IAC3E,KAAK,EAAE,4BAA4B;CACpC,CAAC;AAEF,SAAS,iBAAiB,CAAC,QAAkC;IAC3D,MAAM,aAAa,GAAG,IAAI,GAAG,CAAC;QAC5B,CAAC,GAAG,EAAE,kDAAkD,CAAC;QACzD,CAAC,GAAG,EAAE,6CAA6C,CAAC;QACpD,CAAC,GAAG,EAAE,kDAAkD,CAAC;KAC1D,CAAC,CAAC;IACH,MAAM,SAAS,GAAG,CAAC,CAAC,MAAM,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,KAAK,CAAC;IACvF,OAAO,IAAI,YAAY,CACrB,aAAa,CAAC,GAAG,CAAC,QAAQ,CAAC,MAAM,CAAC;QAChC,SAAS;QACT,8BAA8B,QAAQ,CAAC,MAAM,EAAE,EACjD,QAAQ,CACT,CAAC;AACJ,CAAC;AACD,SAAS,aAAa,CACpB,qBAA4C,EAC5C,OAAqD;IAKrD,MAAM,MAAM,GAAG,OAAO,CAAC,MAAM,IAAI,OAAO,CAAC;IACzC,MAAM,mBAAmB,GAAG,OAAO,CAAC,mBAAmB,IAAI,KAAK,CAAC;IACjE,MAAM,gBAAgB,GAAG,OAAO,CAAC,gBAAgB,IAAI,kBAAkB,CAAC;IAExE,OAAO,KAAK,EACV,KAAqB,EACrB,cAAyC,EACrB,EAAE;QACtB,MAAM,KAAK,GAAG,qBAAqB,EAAE,CAAC;QACtC,IAAI,CAAC,KAAK;YACR,MAAM,IAAI,KAAK,CACb,qCAAqC,0BAA0B,aAAa,oBAAoB,CAAC,SAAS,GAAG,CAC9G,CAAC;QACJ,MAAM,GAAG,GAAG,IAAI,GAAG,CAAC,KAAK,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;QAC5C,KAAK,MAAM,CAAC,GAAG,EAAE,KAAK,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,KAAK,CAAC,KAAK,IAAI,EAAE,CAAC;YAC1D,IAAI,KAAK;gBAAE,GAAG,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC9C,MAAM,OAAO,GAAG,KAAK,CAAC,IAAI;YACxB,CAAC,CAAC;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,aAAa,EAAE,UAAU,KAAK,EAAE;gBAChC,cAAc,EAAE,kBAAkB;aACnC;YACH,CAAC,CAAC;gBACE,MAAM,EAAE,kBAAkB;gBAC1B,aAAa,EAAE,UAAU,KAAK,EAAE;aACjC,CAAC;QACN,MAAM,WAAW,GAAgB;YAC/B,OAAO;YACP,MAAM,EAAE,aAAa,CAAC,gBAAgB,CAAC;SACxC,CAAC;QACF,IAAI,KAAK,CAAC,MAAM,EAAE,CAAC;YACjB,WAAW,CAAC,MAAM,GAAG,KAAK,CAAC,MAAM,CAAC;QACpC,CAAC;QACD,IAAI,KAAK,CAAC,IAAI,EAAE,CAAC;YACf,WAAW,CAAC,IAAI,GAAG,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;QAChD,CAAC;QACD,MAAM,QAAQ,GAAG,MAAM,mBAAmB,CAAC,GAAG,EAAE,WAAW,CAAC,CAAC;QAC7D,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;QACnC,MAAM,IAAI,GAAG,iBAAiB,CAAC,IAAI,CAAC,CAAC;QACrC,MAAM,WAAW,GAAG;YAClB,IAAI;YACJ,OAAO,EAAE,MAAM,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,OAAO,EAAE,CAAC;YACvD,MAAM,EAAE,QAAQ,CAAC,MAAM;SACxB,CAAC;QACF,IAAI,CAAC,QAAQ,CAAC,EAAE;YAAE,MAAM,iBAAiB,CAAC,WAAW,CAAC,CAAC;QACvD,OAAO,cAAc,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC,CAAC;AACJ,CAAC;AAED,SAAS,oBAAoB,CAC3B,OAGuB;IAEvB,OAAO;QACL,mBAAmB,EAAE,GAAG,EAAE,CACxB,OAAO,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,qBAAqB,CAAC,EAAE,EAAE,sBAAsB,CAAC;QACnF,uBAAuB,EAAE,GAAG,EAAE,CAC5B,OAAO,CAAC,EAAE,QAAQ,EAAE,WAAW,CAAC,yBAAyB,CAAC,EAAE,EAAE,0BAA0B,CAAC;QAC3F,eAAe,EAAE,CAAC,KAAK,EAAE,EAAE;YACzB,IAAI,OAAO,IAAI,KAAK,EAAE,CAAC;gBACrB,OAAO,OAAO,CACZ;oBACE,QAAQ,EAAE,WAAW,CAAC,iCAAiC,CAAC;oBACxD,KAAK,EAAE,EAAE,KAAK,EAAE,KAAK,CAAC,KAAK,EAAE;iBAC9B,EACD,sBAAsB,CACvB,CAAC;YACJ,CAAC;YAED,OAAO,OAAO,CACZ;gBACE,QAAQ,EAAE,WAAW,CAAC,iCAAiC,CAAC;gBACxD,KAAK,EAAE,EAAE,MAAM,EAAE,GAAG,EAAE;aACvB,EACD,wBAAwB,CACzB,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,SAAS,YAAY,CACnB,qBAA4C,EAC5C,OAAqD;IAErD,MAAM,OAAO,GAAG,aAAa,CAAC,qBAAqB,EAAE,OAAO,CAAC,CAAC;IAC9D,OAAO;QACL,GAAG,oBAAoB,CAAC,OAAO,CAAC;QAChC,gBAAgB,EAAE,CAAC,KAAK,EAAE,EAAE,CAC1B,OAAO,CACL;YACE,QAAQ,EAAE,WAAW,CAAC,kBAAkB,CAAC;YACzC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,KAAK,CAAC,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,EAAE;SAC7B,EACD,uCAAuC,CACxC;QACH,iBAAiB,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,EAAE;YACzC,MAAM,IAAI,GAAG,EAAE,YAAY,EAAE,CAAC;YAC9B,IAAI,KAAK;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,KAAK,EAAE,CAAC,CAAC;YAC1C,OAAO,OAAO,CACZ;gBACE,QAAQ,EAAE,WAAW,CAAC,mBAAmB,CAAC;gBAC1C,MAAM,EAAE,MAAM;gBACd,IAAI;aACL,EACD,+BAA+B,CAChC,CAAC;QACJ,CAAC;QACD,eAAe,EAAE,CAAC,YAAY,EAAE,KAAK,EAAE,WAAW,EAAE,EAAE;YACpD,MAAM,IAAI,GAAG,EAAE,YAAY,EAAE,KAAK,EAAE,KAAK,IAAI,EAAE,EAAE,CAAC;YAClD,IAAI,WAAW;gBAAE,MAAM,CAAC,MAAM,CAAC,IAAI,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;YACtD,OAAO,OAAO,CACZ;gBACE,QAAQ,EAAE,WAAW,CAAC,iBAAiB,CAAC;gBACxC,MAAM,EAAE,MAAM;gBACd,IAAI;aACL,EACD,6BAA6B,CAC9B,CAAC;QACJ,CAAC;KACF,CAAC;AACJ,CAAC;AAED,MAAM,UAAU,mBAAmB,CAAC,OAAO,GAAyB,EAAE;IACpE,OAAO,YAAY,CAAC,OAAO,CAAC,cAAc,IAAI,mBAAmB,EAAE,OAAO,CAAC,CAAC;AAC9E,CAAC;AAED,MAAM,UAAU,2BAA2B,CACzC,OAAqC;IAErC,OAAO,oBAAoB,CAAC,aAAa,CAAC,OAAO,CAAC,mBAAmB,EAAE,OAAO,CAAC,CAAC,CAAC;AACnF,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@warmio/mcp",
|
|
3
|
-
"version": "11.0.
|
|
3
|
+
"version": "11.0.7",
|
|
4
4
|
"description": "Warm local stdio MCP server",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"engines": {
|
|
@@ -33,16 +33,14 @@
|
|
|
33
33
|
"warmio": "dist/cli.js"
|
|
34
34
|
},
|
|
35
35
|
"files": [
|
|
36
|
-
"dist"
|
|
37
|
-
".cursor-plugin",
|
|
38
|
-
"assets",
|
|
39
|
-
"mcp.json",
|
|
40
|
-
"skills"
|
|
36
|
+
"dist"
|
|
41
37
|
],
|
|
42
38
|
"scripts": {
|
|
43
39
|
"build": "tsc -p tsconfig.json",
|
|
44
40
|
"test": "pnpm build && node --test test/*.mjs",
|
|
45
|
-
"pack:check": "pnpm pack --dry-run"
|
|
41
|
+
"pack:check": "pnpm pack --dry-run",
|
|
42
|
+
"mcpb:build": "cd mcpb && pnpm install && pnpm build",
|
|
43
|
+
"mcpb:pack": "cd mcpb && pnpm pack"
|
|
46
44
|
},
|
|
47
45
|
"keywords": [
|
|
48
46
|
"mcp",
|
|
@@ -59,7 +57,7 @@
|
|
|
59
57
|
},
|
|
60
58
|
"dependencies": {
|
|
61
59
|
"@modelcontextprotocol/sdk": "^1.27.1",
|
|
62
|
-
"@warmio/contracts": "3.0.
|
|
60
|
+
"@warmio/contracts": "3.0.2",
|
|
63
61
|
"dotenv": "^17.2.3",
|
|
64
62
|
"zod": "^3.25.76"
|
|
65
63
|
},
|
package/.cursor-plugin/README.md
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
# Warm Cursor Plugin
|
|
2
|
-
|
|
3
|
-
Official Cursor Marketplace plugin for [Warm](https://warm.io) — personal finance automation via MCP.
|
|
4
|
-
|
|
5
|
-
## Features
|
|
6
|
-
|
|
7
|
-
This plugin provides access to Warm's Model Context Protocol (MCP) server, enabling AI assistants to:
|
|
8
|
-
|
|
9
|
-
- **Read financial context** — balances, accounts, budgets, goals, liabilities, holdings
|
|
10
|
-
- **Retrieve transactions** — latest 10-day window or specific month
|
|
11
|
-
- **Search operations** — discover available automation operations
|
|
12
|
-
- **Invoke operations** — execute approved automations with write-operation safeguards
|
|
13
|
-
|
|
14
|
-
All write operations require explicit approval via a two-step describe → invoke flow.
|
|
15
|
-
|
|
16
|
-
## Installation
|
|
17
|
-
|
|
18
|
-
### From Cursor Marketplace (Recommended)
|
|
19
|
-
|
|
20
|
-
1. Open Cursor
|
|
21
|
-
2. Go to Settings → Cursor Plugins
|
|
22
|
-
3. Search for "Warm"
|
|
23
|
-
4. Click "Install"
|
|
24
|
-
5. Enter your Warm API key when prompted
|
|
25
|
-
|
|
26
|
-
Get your API key: [https://warm.io/settings/api-keys](https://warm.io/settings/api-keys)
|
|
27
|
-
|
|
28
|
-
### Local Testing (Development)
|
|
29
|
-
|
|
30
|
-
For local development and testing:
|
|
31
|
-
|
|
32
|
-
```bash
|
|
33
|
-
# Symlink the full plugin package root (not just .cursor-plugin/)
|
|
34
|
-
mkdir -p ~/.cursor/plugins/local
|
|
35
|
-
ln -s /path/to/warm-app/libraries/mcp ~/.cursor/plugins/local/warm
|
|
36
|
-
|
|
37
|
-
# Restart Cursor or run Developer: Reload Window
|
|
38
|
-
```
|
|
39
|
-
|
|
40
|
-
## Configuration
|
|
41
|
-
|
|
42
|
-
The plugin requires one environment variable:
|
|
43
|
-
|
|
44
|
-
- **`WARM_API_KEY`** (required, secret) — Your Warm API key from [https://warm.io/settings/api-keys](https://warm.io/settings/api-keys)
|
|
45
|
-
|
|
46
|
-
This is automatically configured when you install from the Cursor Marketplace.
|
|
47
|
-
|
|
48
|
-
## Available MCP Tools
|
|
49
|
-
|
|
50
|
-
### Read Tools
|
|
51
|
-
|
|
52
|
-
- `get_financial_context` — Compact overview of your financial status
|
|
53
|
-
- `get_transactions` — Transaction history (latest or by month)
|
|
54
|
-
|
|
55
|
-
### Automation Tools
|
|
56
|
-
|
|
57
|
-
- `search_operations` — Find available operations
|
|
58
|
-
- `describe_operation` — Get operation details and approval for writes
|
|
59
|
-
- `invoke_operation` — Execute approved operations
|
|
60
|
-
|
|
61
|
-
See [skills/warm/SKILL.md](../skills/warm/SKILL.md) for detailed usage examples and workflow guidance.
|
|
62
|
-
|
|
63
|
-
## Usage Examples
|
|
64
|
-
|
|
65
|
-
### Read Financial Data
|
|
66
|
-
|
|
67
|
-
```
|
|
68
|
-
Show me my current net worth and account balances
|
|
69
|
-
```
|
|
70
|
-
|
|
71
|
-
```
|
|
72
|
-
What were my transactions in January 2024?
|
|
73
|
-
```
|
|
74
|
-
|
|
75
|
-
### Automation
|
|
76
|
-
|
|
77
|
-
```
|
|
78
|
-
Search for operations related to budgets
|
|
79
|
-
```
|
|
80
|
-
|
|
81
|
-
```
|
|
82
|
-
Create a monthly budget for groceries with $500 limit
|
|
83
|
-
(The assistant will use describe_operation to get approval, then invoke_operation)
|
|
84
|
-
```
|
|
85
|
-
|
|
86
|
-
## Security & Approvals
|
|
87
|
-
|
|
88
|
-
- **Read operations** execute immediately without approval
|
|
89
|
-
- **Write operations** require a two-step approval flow:
|
|
90
|
-
1. `describe_operation` with exact input → returns `approval_id`
|
|
91
|
-
2. `invoke_operation` with same input + `approval_id` → executes
|
|
92
|
-
- Approvals expire and are single-use
|
|
93
|
-
- The AI cannot move money or modify data without explicit approval
|
|
94
|
-
|
|
95
|
-
## Documentation
|
|
96
|
-
|
|
97
|
-
- Plugin skill guide: [skills/warm/SKILL.md](../skills/warm/SKILL.md)
|
|
98
|
-
- Warm Developer Docs: [https://warm.io/developers](https://warm.io/developers)
|
|
99
|
-
- MCP package source: [libraries/mcp](../)
|
|
100
|
-
- Published npm package: [@warmio/mcp](https://www.npmjs.com/package/@warmio/mcp)
|
|
101
|
-
|
|
102
|
-
## Publishing to Cursor Marketplace
|
|
103
|
-
|
|
104
|
-
To publish this plugin to the Cursor Marketplace:
|
|
105
|
-
|
|
106
|
-
1. Ensure `plugin.json`, `mcp.json`, and `skills/warm/SKILL.md` are complete and correct
|
|
107
|
-
2. Test locally via `~/.cursor/plugins/local/warm` symlink to `libraries/mcp`
|
|
108
|
-
3. Submit at: [https://cursor.com/marketplace/publish](https://cursor.com/marketplace/publish)
|
|
109
|
-
4. Provide repository path: `jasonstockman/warm-app` (monorepo root with `.cursor-plugin/marketplace.json`)
|
|
110
|
-
|
|
111
|
-
The marketplace will read the plugin manifest and host it for one-click installation.
|
|
112
|
-
|
|
113
|
-
## Development
|
|
114
|
-
|
|
115
|
-
This plugin is maintained in the [warm-app](https://github.com/jasonstockman/warm-app) monorepo under `libraries/mcp/.cursor-plugin`.
|
|
116
|
-
|
|
117
|
-
The underlying MCP server is published as [@warmio/mcp](https://www.npmjs.com/package/@warmio/mcp) on npm.
|
|
118
|
-
|
|
119
|
-
### Local Package Testing
|
|
120
|
-
|
|
121
|
-
To test against a local build of `@warmio/mcp`:
|
|
122
|
-
|
|
123
|
-
```bash
|
|
124
|
-
# Build the MCP package
|
|
125
|
-
cd libraries/mcp
|
|
126
|
-
pnpm build
|
|
127
|
-
|
|
128
|
-
# Update mcp.json to use local path temporarily
|
|
129
|
-
{
|
|
130
|
-
"mcpServers": {
|
|
131
|
-
"warm": {
|
|
132
|
-
"command": "node",
|
|
133
|
-
"args": ["/absolute/path/to/libraries/mcp/dist/cli.js", "mcp"],
|
|
134
|
-
"env": {
|
|
135
|
-
"WARM_API_KEY": "${WARM_API_KEY}"
|
|
136
|
-
}
|
|
137
|
-
}
|
|
138
|
-
}
|
|
139
|
-
}
|
|
140
|
-
```
|
|
141
|
-
|
|
142
|
-
Remember to revert to `npx -y @warmio/mcp@latest mcp` before publishing.
|
|
143
|
-
|
|
144
|
-
## License
|
|
145
|
-
|
|
146
|
-
MIT License — see [LICENSE](../LICENSE) or repository root for details.
|
|
147
|
-
|
|
148
|
-
## Support
|
|
149
|
-
|
|
150
|
-
- Issues: [GitHub Issues](https://github.com/jasonstockman/warm-app/issues)
|
|
151
|
-
- Email: hello@warm.io
|
|
152
|
-
- Documentation: https://warm.io/developers
|
|
@@ -1,39 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "warm",
|
|
3
|
-
"displayName": "Warm",
|
|
4
|
-
"version": "1.0.0",
|
|
5
|
-
"description": "Personal finance automation MCP server. Read financial context, transactions, search operations, and invoke approved automations.",
|
|
6
|
-
"author": {
|
|
7
|
-
"name": "Warm",
|
|
8
|
-
"email": "hello@warm.io"
|
|
9
|
-
},
|
|
10
|
-
"homepage": "https://warm.io/developers",
|
|
11
|
-
"repository": "https://github.com/jasonstockman/warm-app",
|
|
12
|
-
"license": "MIT",
|
|
13
|
-
"logo": "assets/logo.svg",
|
|
14
|
-
"keywords": [
|
|
15
|
-
"warm",
|
|
16
|
-
"finance",
|
|
17
|
-
"automation",
|
|
18
|
-
"personal-finance",
|
|
19
|
-
"financial-data",
|
|
20
|
-
"budgets",
|
|
21
|
-
"transactions",
|
|
22
|
-
"mcp"
|
|
23
|
-
],
|
|
24
|
-
"category": "integrations",
|
|
25
|
-
"tags": ["finance", "automation", "personal-finance", "mcp"],
|
|
26
|
-
"variables": {
|
|
27
|
-
"type": "object",
|
|
28
|
-
"properties": {
|
|
29
|
-
"WARM_API_KEY": {
|
|
30
|
-
"type": "string",
|
|
31
|
-
"title": "Warm API key",
|
|
32
|
-
"description": "Full-access API key from https://warm.io/settings/api-keys"
|
|
33
|
-
}
|
|
34
|
-
},
|
|
35
|
-
"required": ["WARM_API_KEY"]
|
|
36
|
-
},
|
|
37
|
-
"mcpServers": "./mcp.json",
|
|
38
|
-
"skills": "./skills/"
|
|
39
|
-
}
|
package/assets/logo.svg
DELETED
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
<svg xmlns="http://www.w3.org/2000/svg" width="600" height="469" viewBox="0 0 600 469" version="1.1">
|
|
2
|
-
<style>
|
|
3
|
-
:root {
|
|
4
|
-
color-scheme: light dark;
|
|
5
|
-
color: CanvasText;
|
|
6
|
-
}
|
|
7
|
-
</style>
|
|
8
|
-
<!-- Left segment -->
|
|
9
|
-
<path d="M 33.500 40.660 C 20.206 42.744, 0 48.560, -0 50.302 C -0 51.759, 123.955 348.889, 127.738 356.500 C 142.182 385.561, 169.450 410.275, 198.946 421.040 C 218.922 428.330, 243.683 430.825, 264.526 427.648 C 277.151 425.724, 294.628 420.011, 294.194 417.952 C 293.790 416.040, 172.732 124.599, 168.522 115.405 C 161.779 100.679, 149.168 84.171, 135.093 71.646 C 119.358 57.644, 98.880 47.362, 77 42.478 C 69.645 40.836, 40.220 39.606, 33.500 40.660" fill="currentColor" stroke="currentColor" stroke-width="8"/>
|
|
10
|
-
<!-- Center segment -->
|
|
11
|
-
<path d="M 229.651 41.597 C 217.916 43.718, 202.443 49.144, 202.744 51.035 C 203.418 55.268, 329.689 356.584, 333.687 363.500 C 340.525 375.327, 345.293 381.483, 355.408 391.538 C 374.603 410.619, 398.878 423.014, 425.907 427.533 C 439.649 429.831, 463.594 429.132, 476 426.072 C 489.892 422.645, 497.188 419.815, 496.703 418.043 C 495.416 413.331, 371.058 116.094, 367.406 109 C 349.467 74.149, 313.008 47.875, 273.752 41.509 C 262.281 39.648, 240.195 39.693, 229.651 41.597" fill="currentColor" stroke="currentColor" stroke-width="8"/>
|
|
12
|
-
<!-- Right segment -->
|
|
13
|
-
<path d="M 463 40.593 C 451.670 42.545, 447.288 43.569, 439 46.203 C 433.775 47.864, 429.338 49.372, 429.140 49.555 C 428.942 49.737, 434.670 64.021, 441.868 81.297 C 455.574 114.190, 462.215 131.660, 468.447 151.208 C 475.360 172.892, 486.124 186.213, 503.834 194.997 C 530.956 208.450, 564.982 201.679, 583.654 179.112 C 604.399 154.041, 605.407 121.944, 586.291 95.155 C 567.827 69.280, 539.107 50.114, 508 42.907 C 500.680 41.212, 494.713 40.644, 482 40.434 C 472.925 40.284, 464.375 40.356, 463 40.593" fill="currentColor" stroke="currentColor" stroke-width="8"/>
|
|
14
|
-
</svg>
|
package/mcp.json
DELETED
package/skills/warm/SKILL.md
DELETED
|
@@ -1,152 +0,0 @@
|
|
|
1
|
-
---
|
|
2
|
-
name: warm
|
|
3
|
-
description: Use Warm MCP tools to read financial context, retrieve transactions, search operations, and invoke approved automations.
|
|
4
|
-
---
|
|
5
|
-
|
|
6
|
-
# Warm MCP Skill
|
|
7
|
-
|
|
8
|
-
Use Warm MCP tools to read financial context, retrieve transactions, search operations, and invoke approved automations.
|
|
9
|
-
|
|
10
|
-
## Available Tools
|
|
11
|
-
|
|
12
|
-
### Read Tools
|
|
13
|
-
|
|
14
|
-
**`get_financial_context`** — Read-only compact FinancialContext JSON. Includes:
|
|
15
|
-
|
|
16
|
-
- `status.position` — current balances and net worth
|
|
17
|
-
- `status.accounts` — connected accounts
|
|
18
|
-
- Transaction index (total/months)
|
|
19
|
-
- Recurring transactions
|
|
20
|
-
- Budgets, goals, snapshots
|
|
21
|
-
- Liabilities, holdings, health metrics
|
|
22
|
-
|
|
23
|
-
Transaction items are not inline; use `get_transactions` to retrieve items.
|
|
24
|
-
|
|
25
|
-
**`get_transactions`** — Read-only transactions from the FinancialContext artifact.
|
|
26
|
-
|
|
27
|
-
- Pass `period: "latest"` for the fixed 10-day latest window
|
|
28
|
-
- Pass `period: "YYYY-MM"` for a specific month (e.g. `"2024-01"`)
|
|
29
|
-
- Months outside the covered range return an error
|
|
30
|
-
- The latest window is not caller-configurable
|
|
31
|
-
|
|
32
|
-
### Automation Tools
|
|
33
|
-
|
|
34
|
-
**`search_operations`** — Search the supported Warm operation catalog.
|
|
35
|
-
|
|
36
|
-
- Use this first to find the smallest matching operation
|
|
37
|
-
- Optional `query` parameter: words describing the action or data you need (max 200 chars)
|
|
38
|
-
- Returns matching operations with IDs and descriptions
|
|
39
|
-
|
|
40
|
-
**`describe_operation`** — Describe one operation, including its input schema and risk.
|
|
41
|
-
|
|
42
|
-
- Required: `operation_id` (string)
|
|
43
|
-
- Optional: `input` (exact intended input)
|
|
44
|
-
- For write operations, pass the exact intended input to receive an approval with:
|
|
45
|
-
- `approval_id` (UUID)
|
|
46
|
-
- Status, URL, and expiry timestamp
|
|
47
|
-
- Use the approval_id to invoke the operation
|
|
48
|
-
|
|
49
|
-
**`invoke_operation`** — Invoke one previously discovered Warm operation.
|
|
50
|
-
|
|
51
|
-
- Required: `operation_id` (string)
|
|
52
|
-
- Optional: `input` (operation parameters)
|
|
53
|
-
- Optional: `approval_id` (UUID, required for write operations)
|
|
54
|
-
- Every write operation requires the `approval_id` returned for the exact same input by `describe_operation`
|
|
55
|
-
- Returns operation result with status, body, headers, and operation_id
|
|
56
|
-
|
|
57
|
-
## Workflow
|
|
58
|
-
|
|
59
|
-
### Reading Financial Data
|
|
60
|
-
|
|
61
|
-
1. Call `get_financial_context` to get the overview
|
|
62
|
-
2. Call `get_transactions` with `period: "latest"` or `period: "YYYY-MM"` to retrieve transactions
|
|
63
|
-
|
|
64
|
-
### Invoking Automations
|
|
65
|
-
|
|
66
|
-
1. Call `search_operations` with optional query to find relevant operations
|
|
67
|
-
2. Call `describe_operation` with the `operation_id` and exact `input` to get approval (for writes)
|
|
68
|
-
3. **Wait for owner approval**: For write operations, surface the `approval.url` to the user and wait for them to visit it and approve in Warm Settings
|
|
69
|
-
4. Call `invoke_operation` with the `operation_id`, `input`, and `approval_id` (only after approval status changes from `pending`)
|
|
70
|
-
|
|
71
|
-
## Important Rules
|
|
72
|
-
|
|
73
|
-
- **Never move money without explicit approval**: Write operations require an `approval_id` from `describe_operation` AND owner approval at the returned `approval.url`
|
|
74
|
-
- **Wait for owner approval**: After calling `describe_operation` for a write, surface the `approval.url` and wait for owner confirmation before calling `invoke_operation`
|
|
75
|
-
- **Use exact input for approval**: The `input` passed to `describe_operation` must match exactly the `input` passed to `invoke_operation`
|
|
76
|
-
- **Check operation risk**: Review the risk level in `describe_operation` response before proceeding
|
|
77
|
-
- **Respect expiry**: Approval IDs have an expiry timestamp; check before invoking
|
|
78
|
-
- **Handle errors**: Operations return status codes; check for success (2xx) vs error (4xx/5xx). A 409 status typically means the approval is still `pending` and not yet approved by the owner
|
|
79
|
-
|
|
80
|
-
## Examples
|
|
81
|
-
|
|
82
|
-
### Get Financial Overview
|
|
83
|
-
|
|
84
|
-
```typescript
|
|
85
|
-
// Step 1: Get context
|
|
86
|
-
const context = await get_financial_context({});
|
|
87
|
-
console.log(`Net worth: $${context.status.position.net_worth}`);
|
|
88
|
-
|
|
89
|
-
// Step 2: Get recent transactions
|
|
90
|
-
const transactions = await get_transactions({ period: 'latest' });
|
|
91
|
-
console.log(`Recent transactions: ${transactions.items.length}`);
|
|
92
|
-
```
|
|
93
|
-
|
|
94
|
-
### Search and Invoke Operation
|
|
95
|
-
|
|
96
|
-
```typescript
|
|
97
|
-
// Step 1: Search for operations
|
|
98
|
-
const results = await search_operations({
|
|
99
|
-
query: 'create budget',
|
|
100
|
-
});
|
|
101
|
-
|
|
102
|
-
// Step 2: Describe the operation with exact input
|
|
103
|
-
const description = await describe_operation({
|
|
104
|
-
operation_id: 'budgets.create',
|
|
105
|
-
input: {
|
|
106
|
-
body: {
|
|
107
|
-
name: 'Groceries',
|
|
108
|
-
budget_type: 'category',
|
|
109
|
-
amount: 500,
|
|
110
|
-
period: 'monthly',
|
|
111
|
-
rollover_enabled: false,
|
|
112
|
-
},
|
|
113
|
-
},
|
|
114
|
-
});
|
|
115
|
-
|
|
116
|
-
// Step 3: Owner must approve at the returned URL
|
|
117
|
-
console.log(`Approval required: ${description.approval.url}`);
|
|
118
|
-
console.log(`Status: ${description.approval.status}`); // "pending"
|
|
119
|
-
// Owner visits URL, reviews, and approves
|
|
120
|
-
|
|
121
|
-
// Step 4: After owner approval, invoke with approval_id
|
|
122
|
-
const result = await invoke_operation({
|
|
123
|
-
operation_id: 'budgets.create',
|
|
124
|
-
input: {
|
|
125
|
-
body: {
|
|
126
|
-
name: 'Groceries',
|
|
127
|
-
budget_type: 'category',
|
|
128
|
-
amount: 500,
|
|
129
|
-
period: 'monthly',
|
|
130
|
-
rollover_enabled: false,
|
|
131
|
-
},
|
|
132
|
-
},
|
|
133
|
-
approval_id: description.approval.id,
|
|
134
|
-
});
|
|
135
|
-
```
|
|
136
|
-
|
|
137
|
-
## Error Handling
|
|
138
|
-
|
|
139
|
-
- API errors return structured JSON with `error` and `status` fields
|
|
140
|
-
- Transaction queries for invalid months return descriptive errors
|
|
141
|
-
- Write operations without valid approval_id fail with 403/401 errors
|
|
142
|
-
- Always check operation status codes before treating results as successful
|
|
143
|
-
|
|
144
|
-
## Authentication
|
|
145
|
-
|
|
146
|
-
The Warm MCP server uses the `WARM_API_KEY` environment variable for authentication. This is automatically configured by the Cursor plugin when you provide your API key.
|
|
147
|
-
|
|
148
|
-
Get your API key from: https://warm.io/settings/api-keys
|
|
149
|
-
|
|
150
|
-
## Documentation
|
|
151
|
-
|
|
152
|
-
Full API documentation: https://warm.io/developers
|