@daxaur/ctrl-mcp 0.1.0 → 0.1.5
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 +9 -3
- package/dist/config.d.ts +11 -0
- package/dist/config.d.ts.map +1 -1
- package/dist/config.js +14 -0
- package/dist/config.js.map +1 -1
- package/dist/index.js +34 -0
- package/dist/index.js.map +1 -1
- package/dist/install.d.ts +15 -0
- package/dist/install.d.ts.map +1 -0
- package/dist/install.js +170 -0
- package/dist/install.js.map +1 -0
- package/dist/tools/activate-workflow.d.ts.map +1 -1
- package/dist/tools/activate-workflow.js +19 -2
- package/dist/tools/activate-workflow.js.map +1 -1
- package/dist/tools/create-workflow.d.ts.map +1 -1
- package/dist/tools/create-workflow.js +5 -2
- package/dist/tools/create-workflow.js.map +1 -1
- package/dist/tools/vault-status.d.ts +52 -0
- package/dist/tools/vault-status.d.ts.map +1 -0
- package/dist/tools/vault-status.js +59 -0
- package/dist/tools/vault-status.js.map +1 -0
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,10 +1,16 @@
|
|
|
1
1
|
# @daxaur/ctrl-mcp
|
|
2
2
|
|
|
3
|
-
**
|
|
3
|
+
**Workflow automation built on Base MCP. Designed to compose with every native plugin.**
|
|
4
4
|
|
|
5
|
-
Tell Claude, Cursor, or
|
|
5
|
+
Tell Claude, Cursor, or Codex what your agent should do. CTRL assembles the workflow, you sign once, and CTRL's keeper runs it on Base mainnet — chaining into other Base MCP plugins (Moonwell, Uniswap, Aerodrome, send_calls) as the workflow needs them.
|
|
6
6
|
|
|
7
|
-
> Built for the [Base Agent Quest](https://x.com/buildonbase/status/2059713951974236219)
|
|
7
|
+
> Built for the [Base Agent Quest](https://x.com/buildonbase/status/2059713951974236219). Custom Base MCP plugin per the [official spec](https://docs.base.org/ai-agents/plugins/custom-plugins). Live at [ctrl.build/mcp](https://ctrl.build/mcp).
|
|
8
|
+
|
|
9
|
+
## How CTRL composes with Base MCP
|
|
10
|
+
|
|
11
|
+
CTRL is the automation layer for Base MCP. The native plugins are precise primitives — each transaction goes through human approval, which is exactly what they're built for. CTRL adds a different primitive: a persistent workflow that fires those native plugin actions automatically on triggers (time, price, on-chain events, social signals), under on-chain spending caps the user signed once.
|
|
12
|
+
|
|
13
|
+
Your agent uses native plugins for one-shot actions, and CTRL when you want those actions to recur or fire conditionally. The two work together — your agent can chain `base.send_calls` to fund a CTRL vault and `ctrl_activate` to start the workflow in the same chat.
|
|
8
14
|
|
|
9
15
|
---
|
|
10
16
|
|
package/dist/config.d.ts
CHANGED
|
@@ -15,5 +15,16 @@ export declare const DEFAULT_EXPIRY_DAYS = 30;
|
|
|
15
15
|
export declare const V13_FACTORY_ADDRESS: "0x8E547D7758C79e23146f77b783149435feeA3e45";
|
|
16
16
|
export declare function requireApiKey(): string;
|
|
17
17
|
export declare function activateUrl(workflowId: string): string;
|
|
18
|
+
/**
|
|
19
|
+
* URL with the agent's proposed caps encoded as query params so the
|
|
20
|
+
* /activate landing page can pre-fill the signing form. User can still
|
|
21
|
+
* edit before signing — these are defaults, not commitments.
|
|
22
|
+
*/
|
|
23
|
+
export declare function activateUrlWithCaps(workflowId: string, caps: {
|
|
24
|
+
maxPerSwapEth: string;
|
|
25
|
+
maxPerDayEth: string;
|
|
26
|
+
depositEth: string;
|
|
27
|
+
expiryDays: number;
|
|
28
|
+
}): string;
|
|
18
29
|
export declare function workflowUrl(workflowId: string): string;
|
|
19
30
|
//# sourceMappingURL=config.d.ts.map
|
package/dist/config.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,aAAa,QAC6C,CAAA;AAEvE,eAAO,MAAM,YAAY,QAAiC,CAAA;AAE1D,eAAO,MAAM,aAAa,OAAO,CAAA;AAEjC,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,SAAS,CAAA;AAC9C,eAAO,MAAM,uBAAuB,QAAQ,CAAA;AAC5C,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,EAC9B,4CAAqD,CAAA;AAEvD,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
|
1
|
+
{"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,eAAO,MAAM,aAAa,QAC6C,CAAA;AAEvE,eAAO,MAAM,YAAY,QAAiC,CAAA;AAE1D,eAAO,MAAM,aAAa,OAAO,CAAA;AAEjC,6EAA6E;AAC7E,eAAO,MAAM,wBAAwB,SAAS,CAAA;AAC9C,eAAO,MAAM,uBAAuB,QAAQ,CAAA;AAC5C,eAAO,MAAM,mBAAmB,KAAK,CAAA;AAErC,wFAAwF;AACxF,eAAO,MAAM,mBAAmB,EAC9B,4CAAqD,CAAA;AAEvD,wBAAgB,aAAa,IAAI,MAAM,CAOtC;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtD;AAED;;;;GAIG;AACH,wBAAgB,mBAAmB,CACjC,UAAU,EAAE,MAAM,EAClB,IAAI,EAAE;IAAE,aAAa,EAAE,MAAM,CAAC;IAAC,YAAY,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAC;IAAC,UAAU,EAAE,MAAM,CAAA;CAAE,GAC5F,MAAM,CAQR;AAED,wBAAgB,WAAW,CAAC,UAAU,EAAE,MAAM,GAAG,MAAM,CAEtD"}
|
package/dist/config.js
CHANGED
|
@@ -22,6 +22,20 @@ export function requireApiKey() {
|
|
|
22
22
|
export function activateUrl(workflowId) {
|
|
23
23
|
return `${CTRL_API_BASE}/activate/${workflowId}`;
|
|
24
24
|
}
|
|
25
|
+
/**
|
|
26
|
+
* URL with the agent's proposed caps encoded as query params so the
|
|
27
|
+
* /activate landing page can pre-fill the signing form. User can still
|
|
28
|
+
* edit before signing — these are defaults, not commitments.
|
|
29
|
+
*/
|
|
30
|
+
export function activateUrlWithCaps(workflowId, caps) {
|
|
31
|
+
const qs = new URLSearchParams({
|
|
32
|
+
maxPerSwap: caps.maxPerSwapEth,
|
|
33
|
+
maxPerDay: caps.maxPerDayEth,
|
|
34
|
+
deposit: caps.depositEth,
|
|
35
|
+
expiry: String(caps.expiryDays),
|
|
36
|
+
});
|
|
37
|
+
return `${activateUrl(workflowId)}?${qs.toString()}`;
|
|
38
|
+
}
|
|
25
39
|
export function workflowUrl(workflowId) {
|
|
26
40
|
return `${CTRL_API_BASE}/workflow/${workflowId}`;
|
|
27
41
|
}
|
package/dist/config.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,aAAa,GACxB,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,oBAAoB,CAAA;AAEvE,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAA;AAE1D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAA,CAAC,eAAe;AAEjD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAA;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAA;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAA;AAErC,wFAAwF;AACxF,MAAM,CAAC,MAAM,mBAAmB,GAC9B,4CAAqD,CAAA;AAEvD,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,8HAA8H,CAC/H,CAAA;IACH,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,GAAG,aAAa,aAAa,UAAU,EAAE,CAAA;AAClD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,GAAG,aAAa,aAAa,UAAU,EAAE,CAAA;AAClD,CAAC"}
|
|
1
|
+
{"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,MAAM,CAAC,MAAM,aAAa,GACxB,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,IAAI,oBAAoB,CAAA;AAEvE,MAAM,CAAC,MAAM,YAAY,GAAG,OAAO,CAAC,GAAG,CAAC,YAAY,IAAI,EAAE,CAAA;AAE1D,MAAM,CAAC,MAAM,aAAa,GAAG,IAAI,CAAA,CAAC,eAAe;AAEjD,6EAA6E;AAC7E,MAAM,CAAC,MAAM,wBAAwB,GAAG,MAAM,CAAA;AAC9C,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAAA;AAC5C,MAAM,CAAC,MAAM,mBAAmB,GAAG,EAAE,CAAA;AAErC,wFAAwF;AACxF,MAAM,CAAC,MAAM,mBAAmB,GAC9B,4CAAqD,CAAA;AAEvD,MAAM,UAAU,aAAa;IAC3B,IAAI,CAAC,YAAY,EAAE,CAAC;QAClB,MAAM,IAAI,KAAK,CACb,8HAA8H,CAC/H,CAAA;IACH,CAAC;IACD,OAAO,YAAY,CAAA;AACrB,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,GAAG,aAAa,aAAa,UAAU,EAAE,CAAA;AAClD,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,mBAAmB,CACjC,UAAkB,EAClB,IAA6F;IAE7F,MAAM,EAAE,GAAG,IAAI,eAAe,CAAC;QAC7B,UAAU,EAAE,IAAI,CAAC,aAAa;QAC9B,SAAS,EAAE,IAAI,CAAC,YAAY;QAC5B,OAAO,EAAE,IAAI,CAAC,UAAU;QACxB,MAAM,EAAE,MAAM,CAAC,IAAI,CAAC,UAAU,CAAC;KAChC,CAAC,CAAA;IACF,OAAO,GAAG,WAAW,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,QAAQ,EAAE,EAAE,CAAA;AACtD,CAAC;AAED,MAAM,UAAU,WAAW,CAAC,UAAkB;IAC5C,OAAO,GAAG,aAAa,aAAa,UAAU,EAAE,CAAA;AAClD,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -21,6 +21,7 @@ import { CREATE_WORKFLOW_TOOL, handleCreateWorkflow, } from './tools/create-work
|
|
|
21
21
|
import { ACTIVATE_TOOL, handleActivate, } from './tools/activate-workflow.js';
|
|
22
22
|
import { FIRE_MANUAL_TOOL, handleFireManual } from './tools/fire-manual.js';
|
|
23
23
|
import { GET_EXECUTION_LOGS_TOOL, handleGetExecutionLogs, } from './tools/get-execution-logs.js';
|
|
24
|
+
import { VAULT_STATUS_TOOL, handleVaultStatus } from './tools/vault-status.js';
|
|
24
25
|
import { CtrlApiError } from './client.js';
|
|
25
26
|
const server = new Server({
|
|
26
27
|
name: '@daxaur/ctrl-mcp',
|
|
@@ -31,12 +32,14 @@ const server = new Server({
|
|
|
31
32
|
},
|
|
32
33
|
});
|
|
33
34
|
const TOOLS = [
|
|
35
|
+
VAULT_STATUS_TOOL,
|
|
34
36
|
CREATE_WORKFLOW_TOOL,
|
|
35
37
|
ACTIVATE_TOOL,
|
|
36
38
|
FIRE_MANUAL_TOOL,
|
|
37
39
|
GET_EXECUTION_LOGS_TOOL,
|
|
38
40
|
];
|
|
39
41
|
const HANDLERS = {
|
|
42
|
+
ctrl_get_vault_status: handleVaultStatus,
|
|
40
43
|
ctrl_create_workflow: handleCreateWorkflow,
|
|
41
44
|
ctrl_activate: handleActivate,
|
|
42
45
|
ctrl_fire_manual: handleFireManual,
|
|
@@ -80,6 +83,37 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
|
|
|
80
83
|
}
|
|
81
84
|
});
|
|
82
85
|
async function main() {
|
|
86
|
+
// Subcommand dispatch — `install [target]` writes the user's MCP client
|
|
87
|
+
// config for them so they don't have to hand-edit JSON. Default (no args)
|
|
88
|
+
// is the stdio MCP server itself.
|
|
89
|
+
const argv = process.argv.slice(2);
|
|
90
|
+
if (argv[0] === 'install') {
|
|
91
|
+
const { runInstall } = await import('./install.js');
|
|
92
|
+
await runInstall(argv.slice(1));
|
|
93
|
+
return;
|
|
94
|
+
}
|
|
95
|
+
if (argv[0] === '--version' || argv[0] === '-v') {
|
|
96
|
+
console.log('@daxaur/ctrl-mcp 0.1.5');
|
|
97
|
+
return;
|
|
98
|
+
}
|
|
99
|
+
if (argv[0] === '--help' || argv[0] === '-h') {
|
|
100
|
+
console.log([
|
|
101
|
+
'@daxaur/ctrl-mcp — Base MCP plugin for CTRL workflow automation',
|
|
102
|
+
'',
|
|
103
|
+
'Usage:',
|
|
104
|
+
' npx -y @daxaur/ctrl-mcp run as stdio MCP server (default — used by MCP clients)',
|
|
105
|
+
' npx -y @daxaur/ctrl-mcp install [claude|cursor|codex|all]',
|
|
106
|
+
' auto-configure your AI client',
|
|
107
|
+
' npx -y @daxaur/ctrl-mcp --version',
|
|
108
|
+
'',
|
|
109
|
+
'Env:',
|
|
110
|
+
' CTRL_API_KEY mint at https://ctrl.build/mcp',
|
|
111
|
+
'',
|
|
112
|
+
'Install in Claude Desktop:',
|
|
113
|
+
' CTRL_API_KEY=sk_ctrl_... npx -y @daxaur/ctrl-mcp install claude',
|
|
114
|
+
].join('\n'));
|
|
115
|
+
return;
|
|
116
|
+
}
|
|
83
117
|
const transport = new StdioServerTransport();
|
|
84
118
|
await server.connect(transport);
|
|
85
119
|
// Log to stderr so it doesn't corrupt the stdio protocol on stdout.
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;GAcG;AAEH,OAAO,EAAE,MAAM,EAAE,MAAM,2CAA2C,CAAA;AAClE,OAAO,EAAE,oBAAoB,EAAE,MAAM,2CAA2C,CAAA;AAChF,OAAO,EACL,qBAAqB,EACrB,sBAAsB,GACvB,MAAM,oCAAoC,CAAA;AAE3C,OAAO,EACL,oBAAoB,EACpB,oBAAoB,GACrB,MAAM,4BAA4B,CAAA;AACnC,OAAO,EACL,aAAa,EACb,cAAc,GACf,MAAM,8BAA8B,CAAA;AACrC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC3E,OAAO,EACL,uBAAuB,EACvB,sBAAsB,GACvB,MAAM,+BAA+B,CAAA;AACtC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAA;AAE1C,MAAM,MAAM,GAAG,IAAI,MAAM,CACvB;IACE,IAAI,EAAE,kBAAkB;IACxB,OAAO,EAAE,OAAO;CACjB,EACD;IACE,YAAY,EAAE;QACZ,KAAK,EAAE,EAAE;KACV;CACF,CACF,CAAA;AAED,MAAM,KAAK,GAAG;IACZ,oBAAoB;IACpB,aAAa;IACb,gBAAgB;IAChB,uBAAuB;CACf,CAAA;AAEV,MAAM,QAAQ,GAAyD;IACrE,oBAAoB,EAAE,oBAAoB;IAC1C,aAAa,EAAE,cAAc;IAC7B,gBAAgB,EAAE,gBAAgB;IAClC,uBAAuB,EAAE,sBAAsB;CAChD,CAAA;AAED,MAAM,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,KAAK,IAAI,EAAE,CAAC,CAAC;IAC5D,KAAK,EAAE,KAAK;CACb,CAAC,CAAC,CAAA;AAEH,MAAM,CAAC,iBAAiB,CAAC,qBAAqB,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;IAC5D,MAAM,EAAE,IAAI,EAAE,SAAS,EAAE,IAAI,EAAE,GAAG,GAAG,CAAC,MAAM,CAAA;IAC5C,MAAM,OAAO,GAAG,QAAQ,CAAC,IAAI,CAAC,CAAA;IAE9B,IAAI,CAAC,OAAO,EAAE,CAAC;QACb,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,iBAAiB,IAAI,gBAAgB,MAAM,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE;iBAC9E;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;IAED,IAAI,CAAC;QACH,MAAM,MAAM,GAAG,MAAM,OAAO,CAAC,IAAI,IAAI,EAAE,CAAC,CAAA;QACxC,OAAO,MAA4D,CAAA;IACrE,CAAC;IAAC,OAAO,GAAG,EAAE,CAAC;QACb,MAAM,KAAK,GAAG,GAAG,YAAY,YAAY,CAAA;QACzC,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAA;QAChE,OAAO;YACL,OAAO,EAAE;gBACP;oBACE,IAAI,EAAE,MAAe;oBACrB,IAAI,EAAE,KAAK;wBACT,CAAC,CAAC,wBAAyB,GAAoB,CAAC,MAAM,MAAM,OAAO,EAAE;wBACrE,CAAC,CAAC,eAAe,OAAO,EAAE;iBAC7B;aACF;YACD,OAAO,EAAE,IAAI;SACd,CAAA;IACH,CAAC;AACH,CAAC,CAAC,CAAA;AAEF,KAAK,UAAU,IAAI;IACjB,MAAM,SAAS,GAAG,IAAI,oBAAoB,EAAE,CAAA;IAC5C,MAAM,MAAM,CAAC,OAAO,CAAC,SAAS,CAAC,CAAA;IAC/B,oEAAoE;IACpE,OAAO,CAAC,KAAK,CAAC,4CAA4C,CAAC,CAAA;AAC7D,CAAC;AAED,IAAI,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;IACnB,OAAO,CAAC,KAAK,CAAC,2BAA2B,EAAE,GAAG,CAAC,CAAA;IAC/C,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAA;AACjB,CAAC,CAAC,CAAA"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @daxaur/ctrl-mcp install — auto-configure Claude Desktop / Cursor / Codex.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* npx @daxaur/ctrl-mcp install claude # writes Claude Desktop config
|
|
6
|
+
* npx @daxaur/ctrl-mcp install cursor # writes Cursor mcp.json
|
|
7
|
+
* npx @daxaur/ctrl-mcp install codex # writes Codex config
|
|
8
|
+
* npx @daxaur/ctrl-mcp install all # writes any client whose config dir exists
|
|
9
|
+
*
|
|
10
|
+
* Reads existing config (if any), merges the `ctrl` entry under mcpServers
|
|
11
|
+
* (preserving other servers), writes it back. Prompts for CTRL_API_KEY if
|
|
12
|
+
* not in env. Idempotent — re-running just updates the entry.
|
|
13
|
+
*/
|
|
14
|
+
export declare function runInstall(argv: string[]): Promise<void>;
|
|
15
|
+
//# sourceMappingURL=install.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.d.ts","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AA0JH,wBAAsB,UAAU,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC,CAmD9D"}
|
package/dist/install.js
ADDED
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @daxaur/ctrl-mcp install — auto-configure Claude Desktop / Cursor / Codex.
|
|
3
|
+
*
|
|
4
|
+
* Usage:
|
|
5
|
+
* npx @daxaur/ctrl-mcp install claude # writes Claude Desktop config
|
|
6
|
+
* npx @daxaur/ctrl-mcp install cursor # writes Cursor mcp.json
|
|
7
|
+
* npx @daxaur/ctrl-mcp install codex # writes Codex config
|
|
8
|
+
* npx @daxaur/ctrl-mcp install all # writes any client whose config dir exists
|
|
9
|
+
*
|
|
10
|
+
* Reads existing config (if any), merges the `ctrl` entry under mcpServers
|
|
11
|
+
* (preserving other servers), writes it back. Prompts for CTRL_API_KEY if
|
|
12
|
+
* not in env. Idempotent — re-running just updates the entry.
|
|
13
|
+
*/
|
|
14
|
+
import fs from 'node:fs';
|
|
15
|
+
import path from 'node:path';
|
|
16
|
+
import os from 'node:os';
|
|
17
|
+
import readline from 'node:readline/promises';
|
|
18
|
+
import { stdin as input, stdout as output } from 'node:process';
|
|
19
|
+
function clientSpecs() {
|
|
20
|
+
const home = os.homedir();
|
|
21
|
+
return [
|
|
22
|
+
{
|
|
23
|
+
id: 'claude',
|
|
24
|
+
label: 'Claude Desktop',
|
|
25
|
+
configPath: path.join(home, 'Library', 'Application Support', 'Claude', 'claude_desktop_config.json'),
|
|
26
|
+
schemaShape: 'mcpServers',
|
|
27
|
+
},
|
|
28
|
+
{
|
|
29
|
+
id: 'cursor',
|
|
30
|
+
label: 'Cursor',
|
|
31
|
+
configPath: path.join(home, '.cursor', 'mcp.json'),
|
|
32
|
+
schemaShape: 'mcpServers',
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
id: 'codex',
|
|
36
|
+
label: 'Codex',
|
|
37
|
+
configPath: path.join(home, '.config', 'openai-codex', 'mcp.json'),
|
|
38
|
+
schemaShape: 'mcpServers',
|
|
39
|
+
},
|
|
40
|
+
];
|
|
41
|
+
}
|
|
42
|
+
async function promptForKey() {
|
|
43
|
+
const rl = readline.createInterface({ input, output });
|
|
44
|
+
try {
|
|
45
|
+
const answer = await rl.question('\nPaste your CTRL API key (mint at https://ctrl.build/mcp): ');
|
|
46
|
+
return answer.trim();
|
|
47
|
+
}
|
|
48
|
+
finally {
|
|
49
|
+
rl.close();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
function mcpEntry(apiKey) {
|
|
53
|
+
return {
|
|
54
|
+
command: 'npx',
|
|
55
|
+
args: ['-y', '@daxaur/ctrl-mcp@latest'],
|
|
56
|
+
env: { CTRL_API_KEY: apiKey },
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
function readConfig(p) {
|
|
60
|
+
if (!fs.existsSync(p))
|
|
61
|
+
return {};
|
|
62
|
+
try {
|
|
63
|
+
const raw = fs.readFileSync(p, 'utf8').trim();
|
|
64
|
+
if (!raw)
|
|
65
|
+
return {};
|
|
66
|
+
return JSON.parse(raw);
|
|
67
|
+
}
|
|
68
|
+
catch (e) {
|
|
69
|
+
throw new Error(`Could not parse ${p}: ${e instanceof Error ? e.message : String(e)}. Open it in a JSON validator and fix the syntax, then re-run.`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
function writeConfig(p, cfg) {
|
|
73
|
+
fs.mkdirSync(path.dirname(p), { recursive: true });
|
|
74
|
+
// Preserve a single trailing newline + 2-space indent (the convention every client uses).
|
|
75
|
+
fs.writeFileSync(p, JSON.stringify(cfg, null, 2) + '\n', 'utf8');
|
|
76
|
+
}
|
|
77
|
+
async function installOne(spec, apiKey, opts) {
|
|
78
|
+
const dir = path.dirname(spec.configPath);
|
|
79
|
+
const dirExists = fs.existsSync(dir);
|
|
80
|
+
if (!dirExists && opts.skipIfMissingDir) {
|
|
81
|
+
return {
|
|
82
|
+
client: spec.id,
|
|
83
|
+
label: spec.label,
|
|
84
|
+
path: spec.configPath,
|
|
85
|
+
action: 'skipped',
|
|
86
|
+
reason: `${dir} does not exist — ${spec.label} likely not installed on this machine`,
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
const existed = fs.existsSync(spec.configPath);
|
|
90
|
+
const cfg = readConfig(spec.configPath);
|
|
91
|
+
const servers = (cfg.mcpServers || {});
|
|
92
|
+
const prevEntry = servers.ctrl;
|
|
93
|
+
const nextEntry = mcpEntry(apiKey);
|
|
94
|
+
if (prevEntry &&
|
|
95
|
+
JSON.stringify(prevEntry) === JSON.stringify(nextEntry)) {
|
|
96
|
+
return {
|
|
97
|
+
client: spec.id,
|
|
98
|
+
label: spec.label,
|
|
99
|
+
path: spec.configPath,
|
|
100
|
+
action: 'already-current',
|
|
101
|
+
};
|
|
102
|
+
}
|
|
103
|
+
servers.ctrl = nextEntry;
|
|
104
|
+
cfg.mcpServers = servers;
|
|
105
|
+
writeConfig(spec.configPath, cfg);
|
|
106
|
+
return {
|
|
107
|
+
client: spec.id,
|
|
108
|
+
label: spec.label,
|
|
109
|
+
path: spec.configPath,
|
|
110
|
+
action: existed ? 'updated' : 'created',
|
|
111
|
+
};
|
|
112
|
+
}
|
|
113
|
+
function logResult(r) {
|
|
114
|
+
const sym = r.action === 'created'
|
|
115
|
+
? '✓ created'
|
|
116
|
+
: r.action === 'updated'
|
|
117
|
+
? '✓ updated'
|
|
118
|
+
: r.action === 'already-current'
|
|
119
|
+
? '· already current'
|
|
120
|
+
: '· skipped';
|
|
121
|
+
console.log(`${sym} ${r.label.padEnd(16)} ${r.path}`);
|
|
122
|
+
if (r.reason)
|
|
123
|
+
console.log(` ${r.reason}`);
|
|
124
|
+
}
|
|
125
|
+
export async function runInstall(argv) {
|
|
126
|
+
const target = (argv[0] || 'all').toLowerCase();
|
|
127
|
+
const validClients = ['claude', 'cursor', 'codex'];
|
|
128
|
+
if (target !== 'all' && !validClients.includes(target)) {
|
|
129
|
+
console.error(`Unknown target: ${target}. Use one of: ${validClients.join(', ')}, all.`);
|
|
130
|
+
process.exit(1);
|
|
131
|
+
}
|
|
132
|
+
let apiKey = process.env.CTRL_API_KEY || '';
|
|
133
|
+
if (!apiKey) {
|
|
134
|
+
apiKey = await promptForKey();
|
|
135
|
+
}
|
|
136
|
+
if (!apiKey || !apiKey.startsWith('sk_ctrl_')) {
|
|
137
|
+
console.error(`\nMissing or malformed CTRL API key. Mint one at https://ctrl.build/mcp, then re-run.`);
|
|
138
|
+
process.exit(1);
|
|
139
|
+
}
|
|
140
|
+
const specs = clientSpecs();
|
|
141
|
+
const selected = target === 'all' ? specs : specs.filter((s) => s.id === target);
|
|
142
|
+
console.log(`\nInstalling @daxaur/ctrl-mcp into ${selected.length} client${selected.length === 1 ? '' : 's'}…\n`);
|
|
143
|
+
const results = [];
|
|
144
|
+
for (const spec of selected) {
|
|
145
|
+
try {
|
|
146
|
+
const r = await installOne(spec, apiKey, {
|
|
147
|
+
skipIfMissingDir: target === 'all',
|
|
148
|
+
});
|
|
149
|
+
results.push(r);
|
|
150
|
+
logResult(r);
|
|
151
|
+
}
|
|
152
|
+
catch (e) {
|
|
153
|
+
console.error(`✗ ${spec.label}: ${e instanceof Error ? e.message : String(e)}`);
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
const wrote = results.filter((r) => r.action === 'created' || r.action === 'updated');
|
|
157
|
+
if (wrote.length > 0) {
|
|
158
|
+
console.log(`\nDone. Fully quit ${wrote.map((r) => r.label).join(' + ')} (Cmd+Q) and reopen — closing the window isn't enough.`);
|
|
159
|
+
console.log(`Then ask: "list the tools you have from ctrl" — you should see five.`);
|
|
160
|
+
}
|
|
161
|
+
else if (results.every((r) => r.action === 'already-current')) {
|
|
162
|
+
console.log(`\nNothing to change — your config already points at this key.`);
|
|
163
|
+
}
|
|
164
|
+
else if (results.every((r) => r.action === 'skipped')) {
|
|
165
|
+
console.log(`\nNone of the supported clients are installed at the default paths.`);
|
|
166
|
+
console.log(`If you have a non-standard install, paste this into your client's MCP config manually:`);
|
|
167
|
+
console.log(`\n ${JSON.stringify({ mcpServers: { ctrl: mcpEntry(apiKey) } }, null, 2)}`);
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
//# sourceMappingURL=install.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"install.js","sourceRoot":"","sources":["../src/install.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activate-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/activate-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsChB,CAAA;AAwBV,wBAAsB,cAAc,CAAC,QAAQ,EAAE,OAAO;;;;;;;;;;gBAjB9C,KAAK,MAAM,EAAE;kBACX,KAAK,MAAM,EAAE;mBACZ,KAAK,MAAM,EAAE;qBACX,MAAM;yBACF,MAAM;;;2BAGJ,MAAM;0BACP,MAAM;wBACR,MAAM;;;;
|
|
1
|
+
{"version":3,"file":"activate-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/activate-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAoBH,eAAO,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsChB,CAAA;AAwBV,wBAAsB,cAAc,CAAC,QAAQ,EAAE,OAAO;;;;;;;;;;gBAjB9C,KAAK,MAAM,EAAE;kBACX,KAAK,MAAM,EAAE;mBACZ,KAAK,MAAM,EAAE;qBACX,MAAM;yBACF,MAAM;;;2BAGJ,MAAM;0BACP,MAAM;wBACR,MAAM;;;;GAqFrB"}
|
|
@@ -8,7 +8,7 @@
|
|
|
8
8
|
*/
|
|
9
9
|
import { z } from 'zod';
|
|
10
10
|
import { ctrlFetch } from '../client.js';
|
|
11
|
-
import {
|
|
11
|
+
import { activateUrlWithCaps, CTRL_CHAIN_ID, DEFAULT_EXPIRY_DAYS, DEFAULT_MAX_PER_DAY_ETH, DEFAULT_MAX_PER_SWAP_ETH, } from '../config.js';
|
|
12
12
|
const ActivateInputSchema = z.object({
|
|
13
13
|
workflowId: z.string().min(1),
|
|
14
14
|
maxPerSwapEth: z.string().default(DEFAULT_MAX_PER_SWAP_ETH),
|
|
@@ -61,8 +61,24 @@ export async function handleActivate(rawInput) {
|
|
|
61
61
|
expiryDays: input.expiryDays,
|
|
62
62
|
},
|
|
63
63
|
});
|
|
64
|
-
const url =
|
|
64
|
+
const url = activateUrlWithCaps(input.workflowId, {
|
|
65
|
+
maxPerSwapEth: input.maxPerSwapEth,
|
|
66
|
+
maxPerDayEth: input.maxPerDayEth,
|
|
67
|
+
depositEth: input.depositEth,
|
|
68
|
+
expiryDays: input.expiryDays,
|
|
69
|
+
});
|
|
65
70
|
const txCount = res.transactions.length;
|
|
71
|
+
// Composition guidance — tell the agent what to chain into next.
|
|
72
|
+
// CTRL is designed to work alongside other Base MCP plugins, especially
|
|
73
|
+
// base.send_calls for funding the vault.
|
|
74
|
+
const composeNote = [];
|
|
75
|
+
if (!res.vaultExists && (input.depositEth === '0' || Number(input.depositEth) === 0)) {
|
|
76
|
+
composeNote.push(`Next: after the user signs, chain into base.send_calls with`, ` calls=[{ to: "${res.vaultAddress}", value: "0xCONFIRM_AMOUNT_WEI" }]`, `to fund the vault. Without funds the workflow activates but cannot fire.`, `Recommend 0.005-0.02 ETH for a first run.`);
|
|
77
|
+
}
|
|
78
|
+
else if (res.vaultExists) {
|
|
79
|
+
composeNote.push(`Next: confirm the vault is funded. Call ctrl_get_vault_status — if`, `ETH/WETH < ${input.maxPerSwapEth}, chain into base.send_calls to top up`, `${res.vaultAddress} from the user's wallet.`);
|
|
80
|
+
}
|
|
81
|
+
composeNote.push(``, `After funding, calling ctrl_fire_manual once gives the user a visible`, `proof-of-life execution on BaseScan rather than waiting for the natural trigger.`);
|
|
66
82
|
return {
|
|
67
83
|
content: [
|
|
68
84
|
{
|
|
@@ -78,6 +94,7 @@ export async function handleActivate(rawInput) {
|
|
|
78
94
|
`Vault address (predicted): ${res.vaultAddress}`,
|
|
79
95
|
`Chain: Base mainnet (${CTRL_CHAIN_ID})`,
|
|
80
96
|
``,
|
|
97
|
+
...(composeNote.length > 0 ? [...composeNote, ``] : []),
|
|
81
98
|
`After signing, CTRL's keeper executes the workflow autonomously — no further signatures needed until the rule expires (${input.expiryDays} days) or the user pauses the vault.`,
|
|
82
99
|
].join('\n'),
|
|
83
100
|
},
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"activate-workflow.js","sourceRoot":"","sources":["../../src/tools/activate-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AACvB,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AACxC,OAAO,EACL,
|
|
1
|
+
{"version":3,"file":"activate-workflow.js","sourceRoot":"","sources":["../../src/tools/activate-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/create-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAA2B,CAAA;AAEjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFvB,CAAA;AAMV,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,OAAO;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"create-workflow.d.ts","sourceRoot":"","sources":["../../src/tools/create-workflow.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAQvB,eAAO,MAAM,yBAAyB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAA2B,CAAA;AAEjE,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAqFvB,CAAA;AAMV,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,OAAO;;;;;;;;;;;;GAmD3D"}
|
|
@@ -120,10 +120,13 @@ export async function handleCreateWorkflow(rawInput) {
|
|
|
120
120
|
`Trigger: ${input.trigger.type}`,
|
|
121
121
|
`Chain: ${input.chain.map((b) => b.type).join(' → ')}`,
|
|
122
122
|
``,
|
|
123
|
-
|
|
123
|
+
`▶ NEXT: call \`ctrl_get_vault_status\` first to check the user's vault state, then`,
|
|
124
|
+
` \`ctrl_activate\` with chosen caps (maxPerSwapEth, maxPerDayEth, depositEth).`,
|
|
125
|
+
``,
|
|
126
|
+
`Activation returns an EIP-5792 batch the user signs once at:`,
|
|
124
127
|
url,
|
|
125
128
|
``,
|
|
126
|
-
`That
|
|
129
|
+
`That signature deploys their CTRL vault and registers the spending rule on Base mainnet (chain ${CTRL_CHAIN_ID}). After signing, CTRL's keeper runs the workflow autonomously per the on-chain caps — no further signatures needed.`,
|
|
127
130
|
].join('\n'),
|
|
128
131
|
},
|
|
129
132
|
],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"create-workflow.js","sourceRoot":"","sources":["../../src/tools/create-workflow.ts"],"names":[],"mappings":"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
|
|
1
|
+
{"version":3,"file":"create-workflow.js","sourceRoot":"","sources":["../../src/tools/create-workflow.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ctrl_get_vault_status — read the user's CTRL vault state.
|
|
3
|
+
*
|
|
4
|
+
* The agent should call this BEFORE ctrl_activate so it can tell the user
|
|
5
|
+
* exactly what their starting point is:
|
|
6
|
+
* - vault deployed yet?
|
|
7
|
+
* - ETH/WETH balance?
|
|
8
|
+
* - any active spending rules?
|
|
9
|
+
* - circuit breaker tripped?
|
|
10
|
+
*
|
|
11
|
+
* Used to warn the user that an empty vault means the workflow can't fire
|
|
12
|
+
* even though it's "active".
|
|
13
|
+
*/
|
|
14
|
+
interface VaultStatusResponse {
|
|
15
|
+
walletAddress: `0x${string}`;
|
|
16
|
+
vaultExists: boolean;
|
|
17
|
+
vaultAddress: `0x${string}` | null;
|
|
18
|
+
predictedVaultAddress: `0x${string}` | null;
|
|
19
|
+
balances: {
|
|
20
|
+
ethWei: string;
|
|
21
|
+
ethDecimal: string;
|
|
22
|
+
wethWei: string;
|
|
23
|
+
wethDecimal: string;
|
|
24
|
+
};
|
|
25
|
+
activeRules: Array<{
|
|
26
|
+
ruleId: `0x${string}`;
|
|
27
|
+
maxPerSwapEth: string;
|
|
28
|
+
maxPerDayEth: string;
|
|
29
|
+
dailySpentEth: string;
|
|
30
|
+
expiryUnix: number;
|
|
31
|
+
expiryHumanReadable: string;
|
|
32
|
+
}>;
|
|
33
|
+
ready: boolean;
|
|
34
|
+
warnings: string[];
|
|
35
|
+
}
|
|
36
|
+
export declare const VAULT_STATUS_TOOL: {
|
|
37
|
+
readonly name: "ctrl_get_vault_status";
|
|
38
|
+
readonly description: "Read the user's CTRL vault state: address (or predicted address if not deployed yet), ETH + WETH balance, and any active spending rules. Call this BEFORE ctrl_activate so you can tell the user how much they need to fund (vault must hold ETH/WETH for swaps; keeper pays its own gas). Also surfaces warnings if the vault is empty or if rules are about to expire.";
|
|
39
|
+
readonly inputSchema: {
|
|
40
|
+
readonly type: "object";
|
|
41
|
+
readonly properties: {};
|
|
42
|
+
};
|
|
43
|
+
};
|
|
44
|
+
export declare function handleVaultStatus(_input: unknown): Promise<{
|
|
45
|
+
content: {
|
|
46
|
+
type: "text";
|
|
47
|
+
text: string;
|
|
48
|
+
}[];
|
|
49
|
+
structuredContent: VaultStatusResponse;
|
|
50
|
+
}>;
|
|
51
|
+
export {};
|
|
52
|
+
//# sourceMappingURL=vault-status.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-status.d.ts","sourceRoot":"","sources":["../../src/tools/vault-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAIH,UAAU,mBAAmB;IAC3B,aAAa,EAAE,KAAK,MAAM,EAAE,CAAA;IAC5B,WAAW,EAAE,OAAO,CAAA;IACpB,YAAY,EAAE,KAAK,MAAM,EAAE,GAAG,IAAI,CAAA;IAClC,qBAAqB,EAAE,KAAK,MAAM,EAAE,GAAG,IAAI,CAAA;IAC3C,QAAQ,EAAE;QACR,MAAM,EAAE,MAAM,CAAA;QACd,UAAU,EAAE,MAAM,CAAA;QAClB,OAAO,EAAE,MAAM,CAAA;QACf,WAAW,EAAE,MAAM,CAAA;KACpB,CAAA;IACD,WAAW,EAAE,KAAK,CAAC;QACjB,MAAM,EAAE,KAAK,MAAM,EAAE,CAAA;QACrB,aAAa,EAAE,MAAM,CAAA;QACrB,YAAY,EAAE,MAAM,CAAA;QACpB,aAAa,EAAE,MAAM,CAAA;QACrB,UAAU,EAAE,MAAM,CAAA;QAClB,mBAAmB,EAAE,MAAM,CAAA;KAC5B,CAAC,CAAA;IACF,KAAK,EAAE,OAAO,CAAA;IACd,QAAQ,EAAE,MAAM,EAAE,CAAA;CACnB;AAED,eAAO,MAAM,iBAAiB;;;;;;;CAQpB,CAAA;AAEV,wBAAsB,iBAAiB,CAAC,MAAM,EAAE,OAAO;;;;;;GAmCtD"}
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ctrl_get_vault_status — read the user's CTRL vault state.
|
|
3
|
+
*
|
|
4
|
+
* The agent should call this BEFORE ctrl_activate so it can tell the user
|
|
5
|
+
* exactly what their starting point is:
|
|
6
|
+
* - vault deployed yet?
|
|
7
|
+
* - ETH/WETH balance?
|
|
8
|
+
* - any active spending rules?
|
|
9
|
+
* - circuit breaker tripped?
|
|
10
|
+
*
|
|
11
|
+
* Used to warn the user that an empty vault means the workflow can't fire
|
|
12
|
+
* even though it's "active".
|
|
13
|
+
*/
|
|
14
|
+
import { ctrlFetch } from '../client.js';
|
|
15
|
+
export const VAULT_STATUS_TOOL = {
|
|
16
|
+
name: 'ctrl_get_vault_status',
|
|
17
|
+
description: 'Read the user\'s CTRL vault state: address (or predicted address if not deployed yet), ETH + WETH balance, and any active spending rules. Call this BEFORE ctrl_activate so you can tell the user how much they need to fund (vault must hold ETH/WETH for swaps; keeper pays its own gas). Also surfaces warnings if the vault is empty or if rules are about to expire.',
|
|
18
|
+
inputSchema: {
|
|
19
|
+
type: 'object',
|
|
20
|
+
properties: {},
|
|
21
|
+
},
|
|
22
|
+
};
|
|
23
|
+
export async function handleVaultStatus(_input) {
|
|
24
|
+
const res = await ctrlFetch('/api/mcp/vault-status', {
|
|
25
|
+
method: 'GET',
|
|
26
|
+
});
|
|
27
|
+
const lines = [];
|
|
28
|
+
if (!res.vaultExists) {
|
|
29
|
+
lines.push(`Vault NOT deployed yet.`);
|
|
30
|
+
lines.push(`Predicted address (CREATE2): ${res.predictedVaultAddress}`);
|
|
31
|
+
lines.push(`Wallet ETH balance: ${res.balances.ethDecimal} ETH`);
|
|
32
|
+
lines.push(``);
|
|
33
|
+
lines.push(`When you call ctrl_activate, the EIP-5792 batch will deploy this vault. Set depositEth in that call to fund it in the same signature — otherwise the workflow activates with 0 balance and can't fire until you send ETH to ${res.predictedVaultAddress}.`);
|
|
34
|
+
}
|
|
35
|
+
else {
|
|
36
|
+
lines.push(`Vault: ${res.vaultAddress}`);
|
|
37
|
+
lines.push(`ETH: ${res.balances.ethDecimal}`);
|
|
38
|
+
lines.push(`WETH: ${res.balances.wethDecimal}`);
|
|
39
|
+
lines.push(`Active rules: ${res.activeRules.length}`);
|
|
40
|
+
for (const r of res.activeRules) {
|
|
41
|
+
lines.push(` • cap ${r.maxPerSwapEth}/swap, ${r.maxPerDayEth}/day (spent today: ${r.dailySpentEth}) · expires ${r.expiryHumanReadable}`);
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
if (res.warnings.length > 0) {
|
|
45
|
+
lines.push(``);
|
|
46
|
+
lines.push(`Warnings:`);
|
|
47
|
+
for (const w of res.warnings)
|
|
48
|
+
lines.push(` ⚠ ${w}`);
|
|
49
|
+
}
|
|
50
|
+
if (!res.ready) {
|
|
51
|
+
lines.push(``);
|
|
52
|
+
lines.push(`NOT READY to fire workflows — address the warnings above before activating.`);
|
|
53
|
+
}
|
|
54
|
+
return {
|
|
55
|
+
content: [{ type: 'text', text: lines.join('\n') }],
|
|
56
|
+
structuredContent: res,
|
|
57
|
+
};
|
|
58
|
+
}
|
|
59
|
+
//# sourceMappingURL=vault-status.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"vault-status.js","sourceRoot":"","sources":["../../src/tools/vault-status.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;GAYG;AAEH,OAAO,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAyBxC,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,IAAI,EAAE,uBAAuB;IAC7B,WAAW,EACT,2WAA2W;IAC7W,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,UAAU,EAAE,EAAE;KACf;CACO,CAAA;AAEV,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,MAAe;IACrD,MAAM,GAAG,GAAG,MAAM,SAAS,CAAsB,uBAAuB,EAAE;QACxE,MAAM,EAAE,KAAK;KACd,CAAC,CAAA;IAEF,MAAM,KAAK,GAAa,EAAE,CAAA;IAC1B,IAAI,CAAC,GAAG,CAAC,WAAW,EAAE,CAAC;QACrB,KAAK,CAAC,IAAI,CAAC,yBAAyB,CAAC,CAAA;QACrC,KAAK,CAAC,IAAI,CAAC,gCAAgC,GAAG,CAAC,qBAAqB,EAAE,CAAC,CAAA;QACvE,KAAK,CAAC,IAAI,CAAC,uBAAuB,GAAG,CAAC,QAAQ,CAAC,UAAU,MAAM,CAAC,CAAA;QAChE,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,+NAA+N,GAAG,CAAC,qBAAqB,GAAG,CAAC,CAAA;IACzQ,CAAC;SAAM,CAAC;QACN,KAAK,CAAC,IAAI,CAAC,UAAU,GAAG,CAAC,YAAY,EAAE,CAAC,CAAA;QACxC,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAA;QAC9C,KAAK,CAAC,IAAI,CAAC,SAAS,GAAG,CAAC,QAAQ,CAAC,WAAW,EAAE,CAAC,CAAA;QAC/C,KAAK,CAAC,IAAI,CAAC,iBAAiB,GAAG,CAAC,WAAW,CAAC,MAAM,EAAE,CAAC,CAAA;QACrD,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,WAAW,EAAE,CAAC;YAChC,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC,aAAa,UAAU,CAAC,CAAC,YAAY,sBAAsB,CAAC,CAAC,aAAa,eAAe,CAAC,CAAC,mBAAmB,EAAE,CAAC,CAAA;QAC3I,CAAC;IACH,CAAC;IACD,IAAI,GAAG,CAAC,QAAQ,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC5B,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,WAAW,CAAC,CAAA;QACvB,KAAK,MAAM,CAAC,IAAI,GAAG,CAAC,QAAQ;YAAE,KAAK,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,CAAA;IACtD,CAAC;IACD,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;QACf,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC,CAAA;QACd,KAAK,CAAC,IAAI,CAAC,6EAA6E,CAAC,CAAA;IAC3F,CAAC;IAED,OAAO;QACL,OAAO,EAAE,CAAC,EAAE,IAAI,EAAE,MAAe,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;QAC5D,iBAAiB,EAAE,GAAG;KACvB,CAAA;AACH,CAAC"}
|
package/package.json
CHANGED