@daxaur/ctrl-mcp 0.1.0 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md CHANGED
@@ -1,10 +1,16 @@
1
1
  # @daxaur/ctrl-mcp
2
2
 
3
- **Base MCP plugin for CTRL turn natural language into onchain workflow automations.**
3
+ **Workflow automation built on Base MCP. Designed to compose with every native plugin.**
4
4
 
5
- Tell Claude, Cursor, or ChatGPT what your agent should do. Watch the workflow assemble. Sign once. CTRL's keeper runs it on Base mainnet — forever, or until you pause it.
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) contest. Live at [ctrl.build/mcp](https://ctrl.build/mcp).
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
@@ -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
  }
@@ -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,
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.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;;;;GAuDrB"}
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 { activateUrl, CTRL_CHAIN_ID, DEFAULT_EXPIRY_DAYS, DEFAULT_MAX_PER_DAY_ETH, DEFAULT_MAX_PER_SWAP_ETH, } from '../config.js';
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 = activateUrl(input.workflowId);
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,WAAW,EACX,aAAa,EACb,mBAAmB,EACnB,uBAAuB,EACvB,wBAAwB,GACzB,MAAM,cAAc,CAAA;AAErB,MAAM,mBAAmB,GAAG,CAAC,CAAC,MAAM,CAAC;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;IAC7B,aAAa,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,wBAAwB,CAAC;IAC3D,YAAY,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,uBAAuB,CAAC;IACzD,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC;IACnC,UAAU,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,OAAO,CAAC,mBAAmB,CAAC;CAC1E,CAAC,CAAA;AAEF,MAAM,CAAC,MAAM,aAAa,GAAG;IAC3B,IAAI,EAAE,eAAe;IACrB,WAAW,EACT,2hBAA2hB;IAC7hB,WAAW,EAAE;QACX,IAAI,EAAE,QAAQ;QACd,QAAQ,EAAE,CAAC,YAAY,CAAC;QACxB,UAAU,EAAE;YACV,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EAAE,qCAAqC;aACnD;YACD,aAAa,EAAE;gBACb,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,sHAAsH;gBACxH,OAAO,EAAE,wBAAwB;aAClC;YACD,YAAY,EAAE;gBACZ,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,4FAA4F;gBAC9F,OAAO,EAAE,uBAAuB;aACjC;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,mLAAmL;gBACrL,OAAO,EAAE,GAAG;aACb;YACD,UAAU,EAAE;gBACV,IAAI,EAAE,QAAQ;gBACd,WAAW,EACT,+GAA+G;gBACjH,OAAO,EAAE,mBAAmB;aAC7B;SACF;KACF;CACO,CAAA;AAwBV,MAAM,CAAC,KAAK,UAAU,cAAc,CAAC,QAAiB;IACpD,MAAM,KAAK,GAAG,mBAAmB,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAA;IAEjD,MAAM,GAAG,GAAG,MAAM,SAAS,CACzB,qBAAqB,KAAK,CAAC,UAAU,EAAE,EACvC;QACE,MAAM,EAAE,MAAM;QACd,IAAI,EAAE;YACJ,aAAa,EAAE,KAAK,CAAC,aAAa;YAClC,YAAY,EAAE,KAAK,CAAC,YAAY;YAChC,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,UAAU,EAAE,KAAK,CAAC,UAAU;SAC7B;KACF,CACF,CAAA;IAED,MAAM,GAAG,GAAG,WAAW,CAAC,KAAK,CAAC,UAAU,CAAC,CAAA;IACzC,MAAM,OAAO,GAAG,GAAG,CAAC,YAAY,CAAC,MAAM,CAAA;IAEvC,OAAO;QACL,OAAO,EAAE;YACP;gBACE,IAAI,EAAE,MAAe;gBACrB,IAAI,EAAE;oBACJ,+BAA+B,OAAO,eAAe,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,GAAG,oBAAoB;oBACjG,EAAE;oBACF,GAAG,GAAG,CAAC,OAAO,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,EAAE,CAAC;oBAC7C,EAAE;oBACF,mDAAmD,OAAO,mBAAmB;oBAC7E,GAAG;oBACH,EAAE;oBACF,8BAA8B,GAAG,CAAC,YAAY,EAAE;oBAChD,wBAAwB,aAAa,GAAG;oBACxC,EAAE;oBACF,0HAA0H,KAAK,CAAC,UAAU,sCAAsC;iBACjL,CAAC,IAAI,CAAC,IAAI,CAAC;aACb;SACF;QACD,iBAAiB,EAAE;YACjB,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,WAAW,EAAE,GAAG;YAChB,YAAY,EAAE,GAAG,CAAC,YAAY;YAC9B,IAAI,EAAE,GAAG,CAAC,IAAI;YACd,OAAO,EAAE,aAAa;SACvB;KACF,CAAA;AACH,CAAC"}
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;;;;;;;;;;;;GAgD3D"}
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
- `To activate this workflow, the user must sign ONCE at:`,
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 single signature deploys their CTRL vault, registers the spending rule (max-per-swap + max-per-day caps), and starts the workflow. After signing, CTRL's keeper executes every trade autonomously on Base mainnet (chain ${CTRL_CHAIN_ID}) — no more signatures needed.`,
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
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daxaur/ctrl-mcp",
3
- "version": "0.1.0",
3
+ "version": "0.1.4",
4
4
  "description": "Base MCP plugin for CTRL — turn natural language into onchain workflow automations on Base. Sign once, trade forever.",
5
5
  "type": "module",
6
6
  "main": "dist/index.js",