@daxaur/ctrl-mcp 0.1.4 → 0.1.6

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/dist/blocks.d.ts CHANGED
@@ -1,101 +1,300 @@
1
1
  /**
2
- * Block catalog schemas — mirrors lib/terminal/block-definitions.ts in the main
3
- * CTRL repo. We re-declare here so the MCP plugin is self-contained (Claude
4
- * can reason about valid block types without an extra API roundtrip).
2
+ * Block catalog schemas — mirrors only the LIVE production blocks visible in
3
+ * ctrl.build/terminal. Anything marked hidden in block-definitions.ts, or
4
+ * defined there without a keeper executor, is intentionally excluded.
5
5
  *
6
- * Keep in sync with main repo on every block addition.
6
+ * Live block count: 9 triggers · 5 actions · 4 conditions · 3 utilities = 21.
7
+ *
8
+ * NOT exposed (and why):
9
+ * - limitless.* + polymarket.* — hidden in block-definitions.ts
10
+ * - social.farcaster_cast — hidden, NEYNAR_API_KEY not in prod
11
+ * - signal.aixbt_mention — hidden, cookie.fun mirror not wired
12
+ * - cond.yield_threshold — hidden, no DefiLlama eval
13
+ * - util.stop / util.snapshot — no keeper case, silently no-op
14
+ *
15
+ * Keep in sync with main repo. Agents can call ctrl_get_block_catalog for the
16
+ * live list if this falls behind.
7
17
  */
8
18
  import { z } from 'zod';
9
19
  export declare const TRIGGER_TYPES: readonly ["time.interval", "trigger.manual", "price.above", "price.below", "price.change", "pool.created", "watch.whale", "event.transfer", "event.balance"];
10
20
  export declare const ACTION_TYPES: readonly ["cypher.swap", "read.balance", "notify.telegram", "notify.discord", "util.webhook"];
11
21
  export declare const CONDITION_TYPES: readonly ["cond.price", "cond.balance", "cond.allowed_weekdays", "cond.time_window"];
12
- export declare const UTILITY_TYPES: readonly ["util.delay", "util.note", "util.log", "util.stop", "util.snapshot"];
22
+ export declare const UTILITY_TYPES: readonly ["util.delay", "util.note", "util.log"];
13
23
  export type TriggerType = (typeof TRIGGER_TYPES)[number];
14
24
  export type ActionType = (typeof ACTION_TYPES)[number];
15
25
  export type ConditionType = (typeof CONDITION_TYPES)[number];
16
26
  export type UtilityType = (typeof UTILITY_TYPES)[number];
17
- /** A workflow is a trigger + an ordered chain of action/condition/utility blocks. */
18
- export declare const WorkflowDefinitionSchema: z.ZodObject<{
19
- name: z.ZodString;
20
- description: z.ZodOptional<z.ZodString>;
21
- trigger: z.ZodObject<{
22
- type: z.ZodEnum<["time.interval", "trigger.manual", "price.above", "price.below", "price.change", "pool.created", "watch.whale", "event.transfer", "event.balance"]>;
23
- config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
27
+ export type BlockType = TriggerType | ActionType | ConditionType | UtilityType;
28
+ export declare const BLOCK_CONFIG_SCHEMAS: {
29
+ readonly 'time.interval': z.ZodObject<{
30
+ minutes: z.ZodNumber;
31
+ }, "strip", z.ZodTypeAny, {
32
+ minutes: number;
33
+ }, {
34
+ minutes: number;
35
+ }>;
36
+ readonly 'trigger.manual': z.ZodObject<{}, "passthrough", z.ZodTypeAny, z.objectOutputType<{}, z.ZodTypeAny, "passthrough">, z.objectInputType<{}, z.ZodTypeAny, "passthrough">>;
37
+ readonly 'price.above': z.ZodObject<{
38
+ token: z.ZodString;
39
+ threshold: z.ZodNumber;
40
+ }, "strip", z.ZodTypeAny, {
41
+ token: string;
42
+ threshold: number;
43
+ }, {
44
+ token: string;
45
+ threshold: number;
46
+ }>;
47
+ readonly 'price.below': z.ZodObject<{
48
+ token: z.ZodString;
49
+ threshold: z.ZodNumber;
50
+ }, "strip", z.ZodTypeAny, {
51
+ token: string;
52
+ threshold: number;
53
+ }, {
54
+ token: string;
55
+ threshold: number;
56
+ }>;
57
+ readonly 'price.change': z.ZodObject<{
58
+ token: z.ZodString;
59
+ percentChange: z.ZodNumber;
60
+ }, "strip", z.ZodTypeAny, {
61
+ token: string;
62
+ percentChange: number;
63
+ }, {
64
+ token: string;
65
+ percentChange: number;
66
+ }>;
67
+ readonly 'pool.created': z.ZodObject<{
68
+ launchpad: z.ZodDefault<z.ZodOptional<z.ZodEnum<["any", "clanker", "flaunch", "zora", "bankr"]>>>;
69
+ quoteToken: z.ZodDefault<z.ZodOptional<z.ZodEnum<["any", "WETH", "USDC"]>>>;
70
+ minLiquidity: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
71
+ maxFdv: z.ZodOptional<z.ZodNumber>;
72
+ safetyEnabled: z.ZodOptional<z.ZodBoolean>;
73
+ keywordIncludes: z.ZodOptional<z.ZodString>;
74
+ keywordExcludes: z.ZodOptional<z.ZodString>;
75
+ keywordMatchMode: z.ZodDefault<z.ZodOptional<z.ZodEnum<["any", "all"]>>>;
76
+ }, "strip", z.ZodTypeAny, {
77
+ launchpad: "any" | "clanker" | "flaunch" | "zora" | "bankr";
78
+ quoteToken: "any" | "WETH" | "USDC";
79
+ minLiquidity: number;
80
+ keywordMatchMode: "any" | "all";
81
+ maxFdv?: number | undefined;
82
+ safetyEnabled?: boolean | undefined;
83
+ keywordIncludes?: string | undefined;
84
+ keywordExcludes?: string | undefined;
85
+ }, {
86
+ launchpad?: "any" | "clanker" | "flaunch" | "zora" | "bankr" | undefined;
87
+ quoteToken?: "any" | "WETH" | "USDC" | undefined;
88
+ minLiquidity?: number | undefined;
89
+ maxFdv?: number | undefined;
90
+ safetyEnabled?: boolean | undefined;
91
+ keywordIncludes?: string | undefined;
92
+ keywordExcludes?: string | undefined;
93
+ keywordMatchMode?: "any" | "all" | undefined;
94
+ }>;
95
+ readonly 'watch.whale': z.ZodObject<{
96
+ address: z.ZodString;
97
+ token: z.ZodDefault<z.ZodOptional<z.ZodString>>;
98
+ minAmount: z.ZodNumber;
99
+ direction: z.ZodDefault<z.ZodOptional<z.ZodEnum<["any", "incoming", "outgoing"]>>>;
100
+ }, "strip", z.ZodTypeAny, {
101
+ token: string;
102
+ address: string;
103
+ minAmount: number;
104
+ direction: "any" | "incoming" | "outgoing";
105
+ }, {
106
+ address: string;
107
+ minAmount: number;
108
+ token?: string | undefined;
109
+ direction?: "any" | "incoming" | "outgoing" | undefined;
110
+ }>;
111
+ readonly 'event.transfer': z.ZodObject<{
112
+ tokenAddress: z.ZodString;
113
+ minAmount: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
114
+ fromAddress: z.ZodOptional<z.ZodString>;
115
+ toAddress: z.ZodOptional<z.ZodString>;
116
+ direction: z.ZodDefault<z.ZodOptional<z.ZodEnum<["any", "incoming", "outgoing"]>>>;
117
+ }, "strip", z.ZodTypeAny, {
118
+ minAmount: number;
119
+ direction: "any" | "incoming" | "outgoing";
120
+ tokenAddress: string;
121
+ fromAddress?: string | undefined;
122
+ toAddress?: string | undefined;
123
+ }, {
124
+ tokenAddress: string;
125
+ minAmount?: number | undefined;
126
+ direction?: "any" | "incoming" | "outgoing" | undefined;
127
+ fromAddress?: string | undefined;
128
+ toAddress?: string | undefined;
129
+ }>;
130
+ readonly 'event.balance': z.ZodObject<{
131
+ token: z.ZodString;
132
+ condition: z.ZodEnum<[">=", "<=", ">", "<"]>;
133
+ threshold: z.ZodNumber;
134
+ }, "strip", z.ZodTypeAny, {
135
+ token: string;
136
+ threshold: number;
137
+ condition: ">=" | "<=" | ">" | "<";
138
+ }, {
139
+ token: string;
140
+ threshold: number;
141
+ condition: ">=" | "<=" | ">" | "<";
142
+ }>;
143
+ readonly 'cypher.swap': z.ZodObject<{
144
+ tokenIn: z.ZodString;
145
+ tokenOut: z.ZodString;
146
+ amount: z.ZodNumber;
147
+ amountMode: z.ZodDefault<z.ZodOptional<z.ZodEnum<["fixed", "percent"]>>>;
148
+ slippage: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
149
+ autoSellEnabled: z.ZodDefault<z.ZodOptional<z.ZodBoolean>>;
150
+ autoSellMultiplier: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
151
+ autoSellPercent: z.ZodDefault<z.ZodOptional<z.ZodNumber>>;
152
+ }, "strip", z.ZodTypeAny, {
153
+ tokenIn: string;
154
+ tokenOut: string;
155
+ amount: number;
156
+ amountMode: "fixed" | "percent";
157
+ slippage: number;
158
+ autoSellEnabled: boolean;
159
+ autoSellMultiplier: number;
160
+ autoSellPercent: number;
161
+ }, {
162
+ tokenIn: string;
163
+ tokenOut: string;
164
+ amount: number;
165
+ amountMode?: "fixed" | "percent" | undefined;
166
+ slippage?: number | undefined;
167
+ autoSellEnabled?: boolean | undefined;
168
+ autoSellMultiplier?: number | undefined;
169
+ autoSellPercent?: number | undefined;
170
+ }>;
171
+ readonly 'read.balance': z.ZodObject<{
172
+ token: z.ZodString;
173
+ walletAddress: z.ZodOptional<z.ZodString>;
174
+ }, "strip", z.ZodTypeAny, {
175
+ token: string;
176
+ walletAddress?: string | undefined;
177
+ }, {
178
+ token: string;
179
+ walletAddress?: string | undefined;
180
+ }>;
181
+ readonly 'notify.telegram': z.ZodObject<{
182
+ message: z.ZodString;
183
+ }, "strip", z.ZodTypeAny, {
184
+ message: string;
185
+ }, {
186
+ message: string;
187
+ }>;
188
+ readonly 'notify.discord': z.ZodObject<{
189
+ webhookUrl: z.ZodEffects<z.ZodString, string, string>;
190
+ message: z.ZodString;
191
+ }, "strip", z.ZodTypeAny, {
192
+ message: string;
193
+ webhookUrl: string;
194
+ }, {
195
+ message: string;
196
+ webhookUrl: string;
197
+ }>;
198
+ readonly 'util.webhook': z.ZodObject<{
199
+ url: z.ZodEffects<z.ZodString, string, string>;
200
+ payload: z.ZodOptional<z.ZodString>;
201
+ }, "strip", z.ZodTypeAny, {
202
+ url: string;
203
+ payload?: string | undefined;
204
+ }, {
205
+ url: string;
206
+ payload?: string | undefined;
207
+ }>;
208
+ readonly 'cond.price': z.ZodObject<{
209
+ token: z.ZodString;
210
+ operator: z.ZodEnum<[">", "<"]>;
211
+ threshold: z.ZodNumber;
24
212
  }, "strip", z.ZodTypeAny, {
25
- type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
26
- config?: Record<string, any> | undefined;
213
+ token: string;
214
+ threshold: number;
215
+ operator: ">" | "<";
27
216
  }, {
28
- type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
29
- config?: Record<string, any> | undefined;
217
+ token: string;
218
+ threshold: number;
219
+ operator: ">" | "<";
30
220
  }>;
31
- chain: z.ZodArray<z.ZodUnion<[z.ZodObject<{
32
- type: z.ZodEnum<["cypher.swap", "read.balance", "notify.telegram", "notify.discord", "util.webhook"]>;
33
- config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
221
+ readonly 'cond.balance': z.ZodObject<{
222
+ token: z.ZodString;
223
+ operator: z.ZodEnum<[">=", "<", ">", "<="]>;
224
+ minBalance: z.ZodNumber;
34
225
  }, "strip", z.ZodTypeAny, {
35
- type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
36
- config?: Record<string, any> | undefined;
226
+ token: string;
227
+ operator: ">=" | "<=" | ">" | "<";
228
+ minBalance: number;
37
229
  }, {
38
- type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
39
- config?: Record<string, any> | undefined;
40
- }>, z.ZodObject<{
41
- type: z.ZodEnum<["cond.price", "cond.balance", "cond.allowed_weekdays", "cond.time_window"]>;
42
- config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
230
+ token: string;
231
+ operator: ">=" | "<=" | ">" | "<";
232
+ minBalance: number;
233
+ }>;
234
+ readonly 'cond.allowed_weekdays': z.ZodObject<{
235
+ weekdays: z.ZodArray<z.ZodNumber, "many">;
43
236
  }, "strip", z.ZodTypeAny, {
44
- type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
45
- config?: Record<string, any> | undefined;
237
+ weekdays: number[];
46
238
  }, {
47
- type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
48
- config?: Record<string, any> | undefined;
49
- }>, z.ZodObject<{
50
- type: z.ZodEnum<["util.delay", "util.note", "util.log", "util.stop", "util.snapshot"]>;
51
- config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
239
+ weekdays: number[];
240
+ }>;
241
+ readonly 'cond.time_window': z.ZodObject<{
242
+ mode: z.ZodDefault<z.ZodOptional<z.ZodEnum<["during", "skip"]>>>;
243
+ startUTC: z.ZodDefault<z.ZodString>;
244
+ endUTC: z.ZodDefault<z.ZodString>;
52
245
  }, "strip", z.ZodTypeAny, {
53
- type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
54
- config?: Record<string, any> | undefined;
246
+ mode: "during" | "skip";
247
+ startUTC: string;
248
+ endUTC: string;
55
249
  }, {
56
- type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
57
- config?: Record<string, any> | undefined;
58
- }>]>, "many">;
250
+ mode?: "during" | "skip" | undefined;
251
+ startUTC?: string | undefined;
252
+ endUTC?: string | undefined;
253
+ }>;
254
+ readonly 'util.delay': z.ZodObject<{
255
+ seconds: z.ZodNumber;
256
+ }, "strip", z.ZodTypeAny, {
257
+ seconds: number;
258
+ }, {
259
+ seconds: number;
260
+ }>;
261
+ readonly 'util.note': z.ZodObject<{
262
+ note: z.ZodOptional<z.ZodString>;
263
+ }, "strip", z.ZodTypeAny, {
264
+ note?: string | undefined;
265
+ }, {
266
+ note?: string | undefined;
267
+ }>;
268
+ readonly 'util.log': z.ZodObject<{
269
+ level: z.ZodDefault<z.ZodOptional<z.ZodEnum<["info", "success", "warn", "error"]>>>;
270
+ message: z.ZodString;
271
+ }, "strip", z.ZodTypeAny, {
272
+ message: string;
273
+ level: "info" | "success" | "warn" | "error";
274
+ }, {
275
+ message: string;
276
+ level?: "info" | "success" | "warn" | "error" | undefined;
277
+ }>;
278
+ };
279
+ export type BlockConfigSchemas = typeof BLOCK_CONFIG_SCHEMAS;
280
+ /** A workflow = trigger + ordered chain of action/condition/utility blocks. */
281
+ export declare const WorkflowDefinitionSchema: z.ZodObject<{
282
+ name: z.ZodString;
283
+ description: z.ZodOptional<z.ZodString>;
284
+ trigger: z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>;
285
+ chain: z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>, z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>, z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>]>, "many">;
59
286
  }, "strip", z.ZodTypeAny, {
60
287
  name: string;
61
- trigger: {
62
- type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
63
- config?: Record<string, any> | undefined;
64
- };
65
- chain: ({
66
- type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
67
- config?: Record<string, any> | undefined;
68
- } | {
69
- type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
70
- config?: Record<string, any> | undefined;
71
- } | {
72
- type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
73
- config?: Record<string, any> | undefined;
74
- })[];
288
+ chain: any[];
75
289
  description?: string | undefined;
290
+ trigger?: any;
76
291
  }, {
77
292
  name: string;
78
- trigger: {
79
- type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
80
- config?: Record<string, any> | undefined;
81
- };
82
- chain: ({
83
- type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
84
- config?: Record<string, any> | undefined;
85
- } | {
86
- type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
87
- config?: Record<string, any> | undefined;
88
- } | {
89
- type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
90
- config?: Record<string, any> | undefined;
91
- })[];
293
+ chain: any[];
92
294
  description?: string | undefined;
295
+ trigger?: any;
93
296
  }>;
94
297
  export type WorkflowDefinition = z.infer<typeof WorkflowDefinitionSchema>;
95
- /**
96
- * Convert a simple {trigger, chain} schema into CTRL's internal
97
- * {nodes, edges} shape used by the canvas + keeper.
98
- */
99
298
  export declare function compileToWorkflowData(def: WorkflowDefinition): {
100
299
  nodes: Array<{
101
300
  id: string;
@@ -1 +1 @@
1
- {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../src/blocks.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAEvB,eAAO,MAAM,aAAa,8JAUhB,CAAA;AAEV,eAAO,MAAM,YAAY,+FAMf,CAAA;AAEV,eAAO,MAAM,eAAe,sFAKlB,CAAA;AAEV,eAAO,MAAM,aAAa,gFAMhB,CAAA;AAEV,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AACxD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AACtD,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AAsBxD,qFAAqF;AACrF,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAQnC,CAAA;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAEzE;;;GAGG;AACH,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,GAAG;IAC9D,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,SAAS,EAAE,MAAM,CAAC;QAAC,YAAY,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;QAAC,QAAQ,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,CAAC,CAAA;IACtJ,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC7D,CA0CA"}
1
+ {"version":3,"file":"blocks.d.ts","sourceRoot":"","sources":["../src/blocks.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;GAgBG;AAEH,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAA;AAIvB,eAAO,MAAM,aAAa,8JAUhB,CAAA;AAEV,eAAO,MAAM,YAAY,+FAMf,CAAA;AAEV,eAAO,MAAM,eAAe,sFAKlB,CAAA;AAEV,eAAO,MAAM,aAAa,kDAIhB,CAAA;AAEV,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AACxD,MAAM,MAAM,UAAU,GAAG,CAAC,OAAO,YAAY,CAAC,CAAC,MAAM,CAAC,CAAA;AACtD,MAAM,MAAM,aAAa,GAAG,CAAC,OAAO,eAAe,CAAC,CAAC,MAAM,CAAC,CAAA;AAC5D,MAAM,MAAM,WAAW,GAAG,CAAC,OAAO,aAAa,CAAC,CAAC,MAAM,CAAC,CAAA;AACxD,MAAM,MAAM,SAAS,GAAG,WAAW,GAAG,UAAU,GAAG,aAAa,GAAG,WAAW,CAAA;AAuK9E,eAAO,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsBmB,CAAA;AAEpD,MAAM,MAAM,kBAAkB,GAAG,OAAO,oBAAoB,CAAA;AAqB5D,+EAA+E;AAC/E,eAAO,MAAM,wBAAwB;;;;;;;;;;;;;;;EAKnC,CAAA;AAEF,MAAM,MAAM,kBAAkB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC,CAAA;AAkBzE,wBAAgB,qBAAqB,CAAC,GAAG,EAAE,kBAAkB,GAAG;IAC9D,KAAK,EAAE,KAAK,CAAC;QACX,EAAE,EAAE,MAAM,CAAA;QACV,IAAI,EAAE,MAAM,CAAA;QACZ,SAAS,EAAE,MAAM,CAAA;QACjB,YAAY,EAAE,MAAM,CAAA;QACpB,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;QAC7B,QAAQ,EAAE;YAAE,CAAC,EAAE,MAAM,CAAC;YAAC,CAAC,EAAE,MAAM,CAAA;SAAE,CAAA;KACnC,CAAC,CAAA;IACF,KAAK,EAAE,KAAK,CAAC;QAAE,EAAE,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAC;QAAC,MAAM,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAC7D,CAsCA"}
package/dist/blocks.js CHANGED
@@ -1,11 +1,22 @@
1
1
  /**
2
- * Block catalog schemas — mirrors lib/terminal/block-definitions.ts in the main
3
- * CTRL repo. We re-declare here so the MCP plugin is self-contained (Claude
4
- * can reason about valid block types without an extra API roundtrip).
2
+ * Block catalog schemas — mirrors only the LIVE production blocks visible in
3
+ * ctrl.build/terminal. Anything marked hidden in block-definitions.ts, or
4
+ * defined there without a keeper executor, is intentionally excluded.
5
5
  *
6
- * Keep in sync with main repo on every block addition.
6
+ * Live block count: 9 triggers · 5 actions · 4 conditions · 3 utilities = 21.
7
+ *
8
+ * NOT exposed (and why):
9
+ * - limitless.* + polymarket.* — hidden in block-definitions.ts
10
+ * - social.farcaster_cast — hidden, NEYNAR_API_KEY not in prod
11
+ * - signal.aixbt_mention — hidden, cookie.fun mirror not wired
12
+ * - cond.yield_threshold — hidden, no DefiLlama eval
13
+ * - util.stop / util.snapshot — no keeper case, silently no-op
14
+ *
15
+ * Keep in sync with main repo. Agents can call ctrl_get_block_catalog for the
16
+ * live list if this falls behind.
7
17
  */
8
18
  import { z } from 'zod';
19
+ // ─── Block id arrays ────────────────────────────────────────────────────────
9
20
  export const TRIGGER_TYPES = [
10
21
  'time.interval',
11
22
  'trigger.manual',
@@ -34,64 +45,217 @@ export const UTILITY_TYPES = [
34
45
  'util.delay',
35
46
  'util.note',
36
47
  'util.log',
37
- 'util.stop',
38
- 'util.snapshot',
39
48
  ];
40
- const triggerBlock = z.object({
41
- type: z.enum(TRIGGER_TYPES),
42
- config: z.record(z.any()).optional(),
49
+ // ─── Reusable atoms ─────────────────────────────────────────────────────────
50
+ const tokenRef = z.string().min(1).describe('Token symbol (ETH/WETH/USDC) or 0x address');
51
+ const addressRef = z.string().regex(/^0x[a-fA-F0-9]{40}$/).describe('0x address');
52
+ // ─── Trigger configs ────────────────────────────────────────────────────────
53
+ const TimeIntervalConfig = z.object({
54
+ minutes: z.number().positive(),
55
+ });
56
+ const ManualTriggerConfig = z.object({}).passthrough();
57
+ const PriceAboveConfig = z.object({
58
+ token: tokenRef,
59
+ threshold: z.number().min(0).describe('USD price'),
60
+ });
61
+ const PriceBelowConfig = z.object({
62
+ token: tokenRef,
63
+ threshold: z.number().min(0).describe('USD price'),
64
+ });
65
+ const PriceChangeConfig = z.object({
66
+ token: tokenRef,
67
+ percentChange: z.number().min(0.1).describe('Absolute percent move'),
68
+ });
69
+ const PoolCreatedConfig = z.object({
70
+ launchpad: z
71
+ .enum(['any', 'clanker', 'flaunch', 'zora', 'bankr'])
72
+ .optional()
73
+ .default('any')
74
+ .describe('Launchpad to watch. bankr = Doppler V4.'),
75
+ quoteToken: z.enum(['any', 'WETH', 'USDC']).optional().default('any'),
76
+ minLiquidity: z.number().min(0).optional().default(0).describe('Min pool liquidity in USD'),
77
+ maxFdv: z.number().min(0).optional().describe('Reject launches above this FDV (USD)'),
78
+ safetyEnabled: z
79
+ .boolean()
80
+ .optional()
81
+ .describe('GoPlus honeypot + tax gate. Default ON for non-curated launchpads.'),
82
+ keywordIncludes: z
83
+ .string()
84
+ .optional()
85
+ .describe('Comma-separated keywords token name/ticker must include'),
86
+ keywordExcludes: z.string().optional().describe('Comma-separated keywords that auto-reject'),
87
+ keywordMatchMode: z.enum(['any', 'all']).optional().default('any'),
88
+ });
89
+ const WatchWhaleConfig = z.object({
90
+ address: addressRef.describe('Wallet to watch'),
91
+ token: tokenRef.optional().default('ETH'),
92
+ minAmount: z.number().positive(),
93
+ direction: z.enum(['any', 'incoming', 'outgoing']).optional().default('any'),
94
+ });
95
+ const EventTransferConfig = z.object({
96
+ tokenAddress: addressRef,
97
+ minAmount: z.number().min(0).optional().default(0),
98
+ fromAddress: addressRef.optional(),
99
+ toAddress: addressRef.optional(),
100
+ direction: z.enum(['any', 'incoming', 'outgoing']).optional().default('any'),
101
+ });
102
+ const EventBalanceConfig = z.object({
103
+ token: tokenRef,
104
+ condition: z.enum(['>=', '<=', '>', '<']),
105
+ threshold: z.number(),
106
+ });
107
+ // ─── Action configs ─────────────────────────────────────────────────────────
108
+ const CypherSwapConfig = z.object({
109
+ tokenIn: z
110
+ .string()
111
+ .min(1)
112
+ .describe('Input token symbol/0x, or "{{trigger.tokenAddress}}" for dynamic sells'),
113
+ tokenOut: z
114
+ .string()
115
+ .min(1)
116
+ .describe('Output token symbol/0x, or "{{trigger.tokenAddress}}" for snipes'),
117
+ amount: z.number().positive().describe('Amount of tokenIn (or % of balance if amountMode=percent)'),
118
+ amountMode: z.enum(['fixed', 'percent']).optional().default('fixed'),
119
+ slippage: z.number().min(0.1).max(50).optional().default(15).describe('Slippage %'),
120
+ autoSellEnabled: z.boolean().optional().default(false),
121
+ autoSellMultiplier: z
122
+ .number()
123
+ .min(1.01)
124
+ .optional()
125
+ .default(2)
126
+ .describe('Auto-sell at N× entry price'),
127
+ autoSellPercent: z.number().min(1).max(100).optional().default(50).describe('% of position to sell'),
128
+ });
129
+ const ReadBalanceConfig = z.object({
130
+ token: tokenRef,
131
+ walletAddress: addressRef.optional().describe('Defaults to vault wallet'),
43
132
  });
44
- const actionBlock = z.object({
45
- type: z.enum(ACTION_TYPES),
46
- config: z.record(z.any()).optional(),
133
+ const NotifyTelegramConfig = z.object({
134
+ message: z
135
+ .string()
136
+ .min(1)
137
+ .max(4000)
138
+ .describe('Supports {{token}}, {{price}}, {{amount}}, {{txHash}}, {{trigger.*}} vars'),
139
+ });
140
+ const NotifyDiscordConfig = z.object({
141
+ webhookUrl: z
142
+ .string()
143
+ .url()
144
+ .refine((u) => u.startsWith('https://discord.com/api/webhooks/'), {
145
+ message: 'Must be a https://discord.com/api/webhooks/... URL',
146
+ }),
147
+ message: z.string().min(1).max(2000),
148
+ });
149
+ const UtilWebhookConfig = z.object({
150
+ url: z.string().url().refine((u) => u.startsWith('https://'), { message: 'HTTPS only' }),
151
+ payload: z.string().optional().describe('JSON string body; template vars supported'),
152
+ });
153
+ // ─── Condition configs ──────────────────────────────────────────────────────
154
+ const CondPriceConfig = z.object({
155
+ token: z.string().min(1),
156
+ operator: z.enum(['>', '<']),
157
+ threshold: z.number().min(0).describe('USD price'),
158
+ });
159
+ const CondBalanceConfig = z.object({
160
+ token: tokenRef,
161
+ operator: z.enum(['>=', '<', '>', '<=']),
162
+ minBalance: z.number(),
163
+ });
164
+ const CondWeekdaysConfig = z.object({
165
+ weekdays: z.array(z.number().int().min(1).max(7)).describe('ISO weekdays Mon=1..Sun=7'),
166
+ });
167
+ const HHMM = z.string().regex(/^([01]\d|2[0-3]):[0-5]\d$/, { message: 'HH:MM 24h UTC' });
168
+ const CondTimeWindowConfig = z.object({
169
+ mode: z.enum(['during', 'skip']).optional().default('during'),
170
+ startUTC: HHMM.default('13:00'),
171
+ endUTC: HHMM.default('22:00'),
47
172
  });
48
- const conditionBlock = z.object({
49
- type: z.enum(CONDITION_TYPES),
50
- config: z.record(z.any()).optional(),
173
+ // ─── Utility configs ────────────────────────────────────────────────────────
174
+ const UtilDelayConfig = z.object({
175
+ seconds: z.number().positive(),
51
176
  });
52
- const utilityBlock = z.object({
53
- type: z.enum(UTILITY_TYPES),
54
- config: z.record(z.any()).optional(),
177
+ const UtilNoteConfig = z.object({
178
+ note: z.string().max(2000).optional(),
55
179
  });
56
- /** A workflow is a trigger + an ordered chain of action/condition/utility blocks. */
180
+ const UtilLogConfig = z.object({
181
+ level: z.enum(['info', 'success', 'warn', 'error']).optional().default('info'),
182
+ message: z.string().min(1).max(2000),
183
+ });
184
+ // ─── Master per-block schema map ────────────────────────────────────────────
185
+ export const BLOCK_CONFIG_SCHEMAS = {
186
+ 'time.interval': TimeIntervalConfig,
187
+ 'trigger.manual': ManualTriggerConfig,
188
+ 'price.above': PriceAboveConfig,
189
+ 'price.below': PriceBelowConfig,
190
+ 'price.change': PriceChangeConfig,
191
+ 'pool.created': PoolCreatedConfig,
192
+ 'watch.whale': WatchWhaleConfig,
193
+ 'event.transfer': EventTransferConfig,
194
+ 'event.balance': EventBalanceConfig,
195
+ 'cypher.swap': CypherSwapConfig,
196
+ 'read.balance': ReadBalanceConfig,
197
+ 'notify.telegram': NotifyTelegramConfig,
198
+ 'notify.discord': NotifyDiscordConfig,
199
+ 'util.webhook': UtilWebhookConfig,
200
+ 'cond.price': CondPriceConfig,
201
+ 'cond.balance': CondBalanceConfig,
202
+ 'cond.allowed_weekdays': CondWeekdaysConfig,
203
+ 'cond.time_window': CondTimeWindowConfig,
204
+ 'util.delay': UtilDelayConfig,
205
+ 'util.note': UtilNoteConfig,
206
+ 'util.log': UtilLogConfig,
207
+ };
208
+ // ─── Discriminated-union blocks ─────────────────────────────────────────────
209
+ function typedBlockUnion(types) {
210
+ const variants = types.map((t) => z.object({
211
+ type: z.literal(t),
212
+ config: BLOCK_CONFIG_SCHEMAS[t].optional().default({}),
213
+ }));
214
+ return z.union(variants);
215
+ }
216
+ const TriggerBlock = typedBlockUnion(TRIGGER_TYPES);
217
+ const ActionBlock = typedBlockUnion(ACTION_TYPES);
218
+ const ConditionBlock = typedBlockUnion(CONDITION_TYPES);
219
+ const UtilityBlock = typedBlockUnion(UTILITY_TYPES);
220
+ const ChainBlock = z.union([ActionBlock, ConditionBlock, UtilityBlock]);
221
+ /** A workflow = trigger + ordered chain of action/condition/utility blocks. */
57
222
  export const WorkflowDefinitionSchema = z.object({
58
223
  name: z.string().min(1).max(120),
59
224
  description: z.string().max(500).optional(),
60
- trigger: triggerBlock,
61
- chain: z
62
- .array(z.union([actionBlock, conditionBlock, utilityBlock]))
63
- .min(1)
64
- .max(20),
225
+ trigger: TriggerBlock,
226
+ chain: z.array(ChainBlock).min(1).max(20),
65
227
  });
66
- /**
67
- * Convert a simple {trigger, chain} schema into CTRL's internal
68
- * {nodes, edges} shape used by the canvas + keeper.
69
- */
228
+ // ─── Compile to CTRL canvas {nodes, edges} ──────────────────────────────────
229
+ const ACTION_SET = new Set(ACTION_TYPES);
230
+ const CONDITION_SET = new Set(CONDITION_TYPES);
231
+ function classify(type) {
232
+ if (ACTION_SET.has(type))
233
+ return 'action';
234
+ if (CONDITION_SET.has(type))
235
+ return 'condition';
236
+ return 'utility';
237
+ }
70
238
  export function compileToWorkflowData(def) {
71
239
  const nodes = [];
72
240
  const edges = [];
241
+ const trigger = def.trigger;
73
242
  const triggerId = 'n0_trigger';
74
- const [triggerCategory, triggerSubtype] = def.trigger.type.split('.');
75
243
  nodes.push({
76
244
  id: triggerId,
77
245
  type: 'automation',
78
246
  blockType: 'trigger',
79
- blockSubtype: `${triggerCategory}.${triggerSubtype}`,
80
- data: { blockId: def.trigger.type, config: def.trigger.config ?? {} },
247
+ blockSubtype: trigger.type,
248
+ data: { blockId: trigger.type, config: trigger.config ?? {} },
81
249
  position: { x: 80, y: 80 },
82
250
  });
83
251
  let prevId = triggerId;
84
252
  def.chain.forEach((block, idx) => {
85
- const id = `n${idx + 1}_${block.type.replace('.', '_')}`;
86
- const [category, subtype] = block.type.split('.');
87
- const isAction = ACTION_TYPES.includes(block.type);
88
- const isCondition = CONDITION_TYPES.includes(block.type);
89
- const blockType = isAction ? 'action' : isCondition ? 'condition' : 'utility';
253
+ const id = `n${idx + 1}_${block.type.replace(/\./g, '_')}`;
90
254
  nodes.push({
91
255
  id,
92
256
  type: 'automation',
93
- blockType,
94
- blockSubtype: `${category}.${subtype}`,
257
+ blockType: classify(block.type),
258
+ blockSubtype: block.type,
95
259
  data: { blockId: block.type, config: block.config ?? {} },
96
260
  position: { x: 80 + (idx + 1) * 320, y: 80 },
97
261
  });
@@ -1 +1 @@
1
- {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../src/blocks.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"blocks.js","sourceRoot":"","sources":["../src/blocks.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -22,6 +22,7 @@ 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
24
  import { VAULT_STATUS_TOOL, handleVaultStatus } from './tools/vault-status.js';
25
+ import { GET_BLOCK_CATALOG_TOOL, handleGetBlockCatalog, } from './tools/get-block-catalog.js';
25
26
  import { CtrlApiError } from './client.js';
26
27
  const server = new Server({
27
28
  name: '@daxaur/ctrl-mcp',
@@ -33,6 +34,7 @@ const server = new Server({
33
34
  });
34
35
  const TOOLS = [
35
36
  VAULT_STATUS_TOOL,
37
+ GET_BLOCK_CATALOG_TOOL,
36
38
  CREATE_WORKFLOW_TOOL,
37
39
  ACTIVATE_TOOL,
38
40
  FIRE_MANUAL_TOOL,
@@ -40,6 +42,7 @@ const TOOLS = [
40
42
  ];
41
43
  const HANDLERS = {
42
44
  ctrl_get_vault_status: handleVaultStatus,
45
+ ctrl_get_block_catalog: handleGetBlockCatalog,
43
46
  ctrl_create_workflow: handleCreateWorkflow,
44
47
  ctrl_activate: handleActivate,
45
48
  ctrl_fire_manual: handleFireManual,
@@ -83,6 +86,37 @@ server.setRequestHandler(CallToolRequestSchema, async (req) => {
83
86
  }
84
87
  });
85
88
  async function main() {
89
+ // Subcommand dispatch — `install [target]` writes the user's MCP client
90
+ // config for them so they don't have to hand-edit JSON. Default (no args)
91
+ // is the stdio MCP server itself.
92
+ const argv = process.argv.slice(2);
93
+ if (argv[0] === 'install') {
94
+ const { runInstall } = await import('./install.js');
95
+ await runInstall(argv.slice(1));
96
+ return;
97
+ }
98
+ if (argv[0] === '--version' || argv[0] === '-v') {
99
+ console.log('@daxaur/ctrl-mcp 0.1.5');
100
+ return;
101
+ }
102
+ if (argv[0] === '--help' || argv[0] === '-h') {
103
+ console.log([
104
+ '@daxaur/ctrl-mcp — Base MCP plugin for CTRL workflow automation',
105
+ '',
106
+ 'Usage:',
107
+ ' npx -y @daxaur/ctrl-mcp run as stdio MCP server (default — used by MCP clients)',
108
+ ' npx -y @daxaur/ctrl-mcp install [claude|cursor|codex|all]',
109
+ ' auto-configure your AI client',
110
+ ' npx -y @daxaur/ctrl-mcp --version',
111
+ '',
112
+ 'Env:',
113
+ ' CTRL_API_KEY mint at https://ctrl.build/mcp',
114
+ '',
115
+ 'Install in Claude Desktop:',
116
+ ' CTRL_API_KEY=sk_ctrl_... npx -y @daxaur/ctrl-mcp install claude',
117
+ ].join('\n'));
118
+ return;
119
+ }
86
120
  const transport = new StdioServerTransport();
87
121
  await server.connect(transport);
88
122
  // 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":"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"}
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"}
@@ -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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"}
@@ -9,78 +9,18 @@ import { z } from 'zod';
9
9
  export declare const createWorkflowInputSchema: z.ZodObject<{
10
10
  name: z.ZodString;
11
11
  description: z.ZodOptional<z.ZodString>;
12
- trigger: z.ZodObject<{
13
- type: z.ZodEnum<["time.interval", "trigger.manual", "price.above", "price.below", "price.change", "pool.created", "watch.whale", "event.transfer", "event.balance"]>;
14
- config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
15
- }, "strip", z.ZodTypeAny, {
16
- type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
17
- config?: Record<string, any> | undefined;
18
- }, {
19
- type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
20
- config?: Record<string, any> | undefined;
21
- }>;
22
- chain: z.ZodArray<z.ZodUnion<[z.ZodObject<{
23
- type: z.ZodEnum<["cypher.swap", "read.balance", "notify.telegram", "notify.discord", "util.webhook"]>;
24
- config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
25
- }, "strip", z.ZodTypeAny, {
26
- type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
27
- config?: Record<string, any> | undefined;
28
- }, {
29
- type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
30
- config?: Record<string, any> | undefined;
31
- }>, z.ZodObject<{
32
- type: z.ZodEnum<["cond.price", "cond.balance", "cond.allowed_weekdays", "cond.time_window"]>;
33
- config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
34
- }, "strip", z.ZodTypeAny, {
35
- type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
36
- config?: Record<string, any> | undefined;
37
- }, {
38
- type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
39
- config?: Record<string, any> | undefined;
40
- }>, z.ZodObject<{
41
- type: z.ZodEnum<["util.delay", "util.note", "util.log", "util.stop", "util.snapshot"]>;
42
- config: z.ZodOptional<z.ZodRecord<z.ZodString, z.ZodAny>>;
43
- }, "strip", z.ZodTypeAny, {
44
- type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
45
- config?: Record<string, any> | undefined;
46
- }, {
47
- type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
48
- config?: Record<string, any> | undefined;
49
- }>]>, "many">;
12
+ trigger: z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>;
13
+ chain: z.ZodArray<z.ZodUnion<[z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>, z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>, z.ZodUnion<[z.ZodTypeAny, z.ZodTypeAny, ...z.ZodTypeAny[]]>]>, "many">;
50
14
  }, "strip", z.ZodTypeAny, {
51
15
  name: string;
52
- trigger: {
53
- type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
54
- config?: Record<string, any> | undefined;
55
- };
56
- chain: ({
57
- type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
58
- config?: Record<string, any> | undefined;
59
- } | {
60
- type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
61
- config?: Record<string, any> | undefined;
62
- } | {
63
- type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
64
- config?: Record<string, any> | undefined;
65
- })[];
16
+ chain: any[];
66
17
  description?: string | undefined;
18
+ trigger?: any;
67
19
  }, {
68
20
  name: string;
69
- trigger: {
70
- type: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
71
- config?: Record<string, any> | undefined;
72
- };
73
- chain: ({
74
- type: "cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook";
75
- config?: Record<string, any> | undefined;
76
- } | {
77
- type: "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window";
78
- config?: Record<string, any> | undefined;
79
- } | {
80
- type: "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot";
81
- config?: Record<string, any> | undefined;
82
- })[];
21
+ chain: any[];
83
22
  description?: string | undefined;
23
+ trigger?: any;
84
24
  }>;
85
25
  export declare const CREATE_WORKFLOW_TOOL: {
86
26
  readonly name: "ctrl_create_workflow";
@@ -147,8 +87,8 @@ export declare function handleCreateWorkflow(rawInput: unknown): Promise<{
147
87
  workflowId: string;
148
88
  activateUrl: string;
149
89
  status: string;
150
- trigger: "time.interval" | "trigger.manual" | "price.above" | "price.below" | "price.change" | "pool.created" | "watch.whale" | "event.transfer" | "event.balance";
151
- chain: ("cypher.swap" | "read.balance" | "notify.telegram" | "notify.discord" | "util.webhook" | "cond.price" | "cond.balance" | "cond.allowed_weekdays" | "cond.time_window" | "util.delay" | "util.note" | "util.log" | "util.stop" | "util.snapshot")[];
90
+ trigger: any;
91
+ chain: any[];
152
92
  };
153
93
  }>;
154
94
  //# sourceMappingURL=create-workflow.d.ts.map
@@ -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;;;;;;;;;;;;GAmD3D"}
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"}
@@ -0,0 +1,49 @@
1
+ /**
2
+ * ctrl_get_block_catalog — return the live block catalog from /api/mcp/block-catalog.
3
+ *
4
+ * Agents call this when they need the most up-to-date list of supported
5
+ * triggers/actions/conditions/utilities with their config field schemas.
6
+ * The route is auth-free (documentation) so this works without an API key.
7
+ */
8
+ export interface BlockConfigField {
9
+ name: string;
10
+ type: string;
11
+ required: boolean;
12
+ default?: string | number | boolean;
13
+ enum_values?: string[];
14
+ description: string;
15
+ }
16
+ export interface CatalogEntry {
17
+ id: string;
18
+ label: string;
19
+ description: string;
20
+ config_fields: BlockConfigField[];
21
+ }
22
+ export interface BlockCatalog {
23
+ triggers: CatalogEntry[];
24
+ actions: CatalogEntry[];
25
+ conditions: CatalogEntry[];
26
+ utilities: CatalogEntry[];
27
+ }
28
+ export declare const GET_BLOCK_CATALOG_TOOL: {
29
+ readonly name: "ctrl_get_block_catalog";
30
+ readonly description: "Return the live catalog of every CTRL workflow block (trigger, action, condition, utility) with id, label, description, and config-field schemas. Call this BEFORE ctrl_create_workflow whenever you're unsure about a block's exact config shape, or whenever you want the freshest list of supported blocks (CTRL ships new blocks regularly — the static plugin schema may lag). Optional input: { category } to narrow to a single bucket.";
31
+ readonly inputSchema: {
32
+ readonly type: "object";
33
+ readonly properties: {
34
+ readonly category: {
35
+ readonly type: "string";
36
+ readonly enum: readonly ["trigger", "action", "condition", "utility"];
37
+ readonly description: "Optional. Filter to a single block bucket. Omit to get all four.";
38
+ };
39
+ };
40
+ };
41
+ };
42
+ export declare function handleGetBlockCatalog(rawInput: unknown): Promise<{
43
+ content: {
44
+ type: "text";
45
+ text: string;
46
+ }[];
47
+ structuredContent: Record<string, unknown>;
48
+ }>;
49
+ //# sourceMappingURL=get-block-catalog.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-block-catalog.d.ts","sourceRoot":"","sources":["../../src/tools/get-block-catalog.ts"],"names":[],"mappings":"AAAA;;;;;;GAMG;AAIH,MAAM,WAAW,gBAAgB;IAC/B,IAAI,EAAE,MAAM,CAAA;IACZ,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,EAAE,OAAO,CAAA;IACjB,OAAO,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,OAAO,CAAA;IACnC,WAAW,CAAC,EAAE,MAAM,EAAE,CAAA;IACtB,WAAW,EAAE,MAAM,CAAA;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAA;IACV,KAAK,EAAE,MAAM,CAAA;IACb,WAAW,EAAE,MAAM,CAAA;IACnB,aAAa,EAAE,gBAAgB,EAAE,CAAA;CAClC;AAED,MAAM,WAAW,YAAY;IAC3B,QAAQ,EAAE,YAAY,EAAE,CAAA;IACxB,OAAO,EAAE,YAAY,EAAE,CAAA;IACvB,UAAU,EAAE,YAAY,EAAE,CAAA;IAC1B,SAAS,EAAE,YAAY,EAAE,CAAA;CAC1B;AAED,eAAO,MAAM,sBAAsB;;;;;;;;;;;;;CAezB,CAAA;AAkBV,wBAAsB,qBAAqB,CAAC,QAAQ,EAAE,OAAO;;;;;uBAsDhB,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC;GAEnE"}
@@ -0,0 +1,84 @@
1
+ /**
2
+ * ctrl_get_block_catalog — return the live block catalog from /api/mcp/block-catalog.
3
+ *
4
+ * Agents call this when they need the most up-to-date list of supported
5
+ * triggers/actions/conditions/utilities with their config field schemas.
6
+ * The route is auth-free (documentation) so this works without an API key.
7
+ */
8
+ import { CTRL_API_BASE } from '../config.js';
9
+ export const GET_BLOCK_CATALOG_TOOL = {
10
+ name: 'ctrl_get_block_catalog',
11
+ description: "Return the live catalog of every CTRL workflow block (trigger, action, condition, utility) with id, label, description, and config-field schemas. Call this BEFORE ctrl_create_workflow whenever you're unsure about a block's exact config shape, or whenever you want the freshest list of supported blocks (CTRL ships new blocks regularly — the static plugin schema may lag). Optional input: { category } to narrow to a single bucket.",
12
+ inputSchema: {
13
+ type: 'object',
14
+ properties: {
15
+ category: {
16
+ type: 'string',
17
+ enum: ['trigger', 'action', 'condition', 'utility'],
18
+ description: 'Optional. Filter to a single block bucket. Omit to get all four.',
19
+ },
20
+ },
21
+ },
22
+ };
23
+ function isCategory(v) {
24
+ return v === 'trigger' || v === 'action' || v === 'condition' || v === 'utility';
25
+ }
26
+ function summarize(entries) {
27
+ return entries
28
+ .map((e) => {
29
+ const req = e.config_fields.filter((f) => f.required).map((f) => f.name);
30
+ const reqStr = req.length ? ` [required: ${req.join(', ')}]` : '';
31
+ return ` • ${e.id} — ${e.description}${reqStr}`;
32
+ })
33
+ .join('\n');
34
+ }
35
+ export async function handleGetBlockCatalog(rawInput) {
36
+ const input = (rawInput ?? {});
37
+ const category = isCategory(input.category) ? input.category : undefined;
38
+ const url = new URL('/api/mcp/block-catalog', CTRL_API_BASE);
39
+ if (category)
40
+ url.searchParams.set('category', category);
41
+ const controller = new AbortController();
42
+ const timeout = setTimeout(() => controller.abort(), 15_000);
43
+ let res;
44
+ try {
45
+ res = await fetch(url, {
46
+ method: 'GET',
47
+ headers: {
48
+ Accept: 'application/json',
49
+ 'User-Agent': '@daxaur/ctrl-mcp',
50
+ },
51
+ signal: controller.signal,
52
+ });
53
+ }
54
+ finally {
55
+ clearTimeout(timeout);
56
+ }
57
+ if (!res.ok) {
58
+ throw new Error(`Block catalog fetch failed: HTTP ${res.status} ${res.statusText}`);
59
+ }
60
+ const catalog = (await res.json());
61
+ const lines = [];
62
+ if (!category || category === 'trigger') {
63
+ lines.push(`Triggers (${catalog.triggers.length}):`);
64
+ lines.push(summarize(catalog.triggers));
65
+ }
66
+ if (!category || category === 'action') {
67
+ lines.push(`\nActions (${catalog.actions.length}):`);
68
+ lines.push(summarize(catalog.actions));
69
+ }
70
+ if (!category || category === 'condition') {
71
+ lines.push(`\nConditions (${catalog.conditions.length}):`);
72
+ lines.push(summarize(catalog.conditions));
73
+ }
74
+ if (!category || category === 'utility') {
75
+ lines.push(`\nUtilities (${catalog.utilities.length}):`);
76
+ lines.push(summarize(catalog.utilities));
77
+ }
78
+ lines.push('\nUse the structuredContent payload for full config_fields metadata when wiring up ctrl_create_workflow.');
79
+ return {
80
+ content: [{ type: 'text', text: lines.join('\n') }],
81
+ structuredContent: catalog,
82
+ };
83
+ }
84
+ //# sourceMappingURL=get-block-catalog.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"get-block-catalog.js","sourceRoot":"","sources":["../../src/tools/get-block-catalog.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@daxaur/ctrl-mcp",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
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",