blokctl 0.6.12 → 0.6.14

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.
@@ -17,7 +17,7 @@ const exec = util.promisify(child_process.exec);
17
17
  const HOME_DIR = `${os.homedir()}/.blok`;
18
18
  const GITHUB_REPO_LOCAL = `${HOME_DIR}/blok`;
19
19
  const GITHUB_REPO_REMOTE = "https://github.com/well-prado/blok.git";
20
- const GITHUB_REPO_RELEASE_TAG = "v0.6.12";
20
+ const GITHUB_REPO_RELEASE_TAG = "v0.6.14";
21
21
  fsExtra.ensureDirSync(HOME_DIR);
22
22
  const options = {
23
23
  baseDir: HOME_DIR,
@@ -117,6 +117,7 @@ export async function createProject(opts, version, currentPath = false, localRep
117
117
  value: "websocket",
118
118
  hint: "Bi-directional real-time (mounts on HTTP port)",
119
119
  },
120
+ { label: "MCP", value: "mcp", hint: "Model Context Protocol server (mounts on HTTP port)" },
120
121
  { label: "Queue", value: "queue", hint: "Kafka/RabbitMQ/SQS/Redis (port 4005)" },
121
122
  { label: "Pub/Sub", value: "pubsub", hint: "GCP/AWS/Azure messaging (port 4006)" },
122
123
  ],
@@ -264,7 +265,7 @@ export async function createProject(opts, version, currentPath = false, localRep
264
265
  const triggerConfigs = selectedTriggers.map((kind) => createTriggerConfig(kind));
265
266
  const mountedOnHttp = new Set();
266
267
  if (selectedTriggers.includes("http")) {
267
- for (const kind of ["sse", "websocket", "webhook"]) {
268
+ for (const kind of ["sse", "websocket", "webhook", "mcp"]) {
268
269
  if (selectedTriggers.includes(kind))
269
270
  mountedOnHttp.add(kind);
270
271
  }
@@ -480,12 +481,13 @@ export async function createProject(opts, version, currentPath = false, localRep
480
481
  "@blokjs/trigger-cron": "triggers/cron",
481
482
  "@blokjs/trigger-grpc": "triggers/grpc",
482
483
  "@blokjs/trigger-pubsub": "triggers/pubsub",
484
+ "@blokjs/trigger-mcp": "triggers/mcp",
483
485
  "@blokjs/trigger-sse": "triggers/sse",
484
486
  "@blokjs/trigger-webhook": "triggers/webhook",
485
487
  "@blokjs/trigger-websocket": "triggers/websocket",
486
488
  "@blokjs/trigger-worker": "triggers/worker",
487
489
  };
488
- const BLOKJS_DEP_RANGE = "^0.6.12";
490
+ const BLOKJS_DEP_RANGE = "^0.6.14";
489
491
  for (const depGroup of ["dependencies", "devDependencies", "peerDependencies"]) {
490
492
  const deps = packageJsonContent[depGroup];
491
493
  if (!deps)
@@ -606,6 +608,16 @@ export async function createProject(opts, version, currentPath = false, localRep
606
608
  ...wsDeps,
607
609
  };
608
610
  }
611
+ if (selectedTriggers.includes("mcp")) {
612
+ const mcpDeps = {
613
+ "@blokjs/trigger-mcp": localRepoPath ? `file:${path.resolve(repoSource, "triggers/mcp")}` : BLOKJS_DEP_RANGE,
614
+ hono: "^4.11.7",
615
+ };
616
+ packageJsonContent.dependencies = {
617
+ ...packageJsonContent.dependencies,
618
+ ...mcpDeps,
619
+ };
620
+ }
609
621
  if (Object.keys(triggerPackageDeps).length > 0) {
610
622
  packageJsonContent.dependencies = {
611
623
  ...packageJsonContent.dependencies,
@@ -716,7 +728,13 @@ export async function createProject(opts, version, currentPath = false, localRep
716
728
  const httpPort = triggerConfigs.find((tc) => tc.kind === "http")?.port;
717
729
  for (const tc of triggerConfigs) {
718
730
  if (mountedOnHttp.has(tc.kind) && httpPort !== undefined) {
719
- const samplePath = tc.kind === "sse" ? "/sse/demo" : "/ws/echo";
731
+ const samplePath = tc.kind === "sse"
732
+ ? "/sse/demo"
733
+ : tc.kind === "mcp"
734
+ ? "/mcp/sse"
735
+ : tc.kind === "webhook"
736
+ ? "/webhooks"
737
+ : "/ws/echo";
720
738
  console.log(` ${tc.label}: http://localhost:${httpPort}${samplePath} (mounted on HTTP)`);
721
739
  }
722
740
  else {
@@ -829,13 +847,15 @@ function generateTriggerEntryFile(triggerKind, selectedTriggers = [triggerKind])
829
847
  const sseAlsoSelected = selectedTriggers.includes("sse");
830
848
  const wsAlsoSelected = selectedTriggers.includes("websocket");
831
849
  const webhookAlsoSelected = selectedTriggers.includes("webhook");
832
- const needsShared = sseAlsoSelected || wsAlsoSelected || webhookAlsoSelected;
850
+ const mcpAlsoSelected = selectedTriggers.includes("mcp");
851
+ const needsShared = sseAlsoSelected || wsAlsoSelected || webhookAlsoSelected || mcpAlsoSelected;
833
852
  const sharedHelperImports = needsShared
834
853
  ? `\nimport { NodeMap, WorkflowRegistry } from "@blokjs/runner";\nimport sharedNodes from "../../Nodes";\nimport sharedWorkflows from "../../Workflows";`
835
854
  : "";
836
855
  const sseImports = sseAlsoSelected ? `\nimport SSETrigger from "@blokjs/trigger-sse";` : "";
837
856
  const wsImports = wsAlsoSelected ? `\nimport WebSocketTrigger from "@blokjs/trigger-websocket";` : "";
838
857
  const webhookImports = webhookAlsoSelected ? `\nimport WebhookTrigger from "@blokjs/trigger-webhook";` : "";
858
+ const mcpImports = mcpAlsoSelected ? `\nimport McpTrigger from "@blokjs/trigger-mcp";` : "";
839
859
  const sharedBootstrapPrelude = needsShared
840
860
  ? `\n\n // Build a NodeMap from the shared Nodes record; both SSE and
841
861
  // WebSocket triggers consume this via setNodeMap so they can
@@ -858,15 +878,21 @@ function generateTriggerEntryFile(triggerKind, selectedTriggers = [triggerKind])
858
878
  for (const [name, wf] of Object.entries(sharedWorkflows)) {
859
879
  const w = wf as {
860
880
  name?: string;
861
- trigger?: { sse?: unknown; websocket?: unknown; webhook?: unknown };
862
- _config?: { name?: string; trigger?: { sse?: unknown; websocket?: unknown; webhook?: unknown } };
881
+ trigger?: { sse?: unknown; websocket?: unknown; webhook?: unknown; mcp?: unknown };
882
+ _config?: { name?: string; trigger?: { sse?: unknown; websocket?: unknown; webhook?: unknown; mcp?: unknown } };
863
883
  };
864
884
  const triggerCfg = w._config?.trigger ?? w.trigger;
865
885
  if (!triggerCfg) continue;
866
- if (!triggerCfg.sse && !triggerCfg.websocket && !triggerCfg.webhook) continue;
886
+ if (!triggerCfg.sse && !triggerCfg.websocket && !triggerCfg.webhook && !triggerCfg.mcp) continue;
867
887
  const resolvedName = w._config?.name ?? w.name ?? name;
868
888
  if (registry.get(resolvedName)) continue;
869
- const kind = triggerCfg.sse ? "sse" : triggerCfg.websocket ? "websocket" : "webhook";
889
+ const kind = triggerCfg.sse
890
+ ? "sse"
891
+ : triggerCfg.websocket
892
+ ? "websocket"
893
+ : triggerCfg.webhook
894
+ ? "webhook"
895
+ : "mcp";
870
896
  registry.register({
871
897
  name: resolvedName,
872
898
  source: \`\${kind}:\${name}\`,
@@ -919,10 +945,25 @@ function generateTriggerEntryFile(triggerKind, selectedTriggers = [triggerKind])
919
945
  });
920
946
  await webhookTrigger.listen();`
921
947
  : "";
922
- const fullBootstrap = `${sharedBootstrapPrelude}${sseBootstrap}${wsBootstrap}${webhookBootstrap}`;
948
+ const mcpBootstrap = mcpAlsoSelected
949
+ ? `\n // Mount the MCP server on the HTTP process's shared Hono app.
950
+ // McpTrigger.constructor(app, httpTrigger?) mirrors SSE / WS / Webhook —
951
+ // it registers its SSE (/<path>/sse + /<path>/messages) and
952
+ // Streamable-HTTP (/<path>) routes inside addPreCatchAllHook so they
953
+ // win Hono's first-match dispatch over the legacy workflow catch-all.
954
+ // Workflows with \`trigger.mcp\` (registered above) become MCP tools /
955
+ // resources; tools/call runs them through the runner.
956
+ const mcpTrigger = new McpTrigger(this.httpTrigger.getApp(), this.httpTrigger);
957
+ mcpTrigger.setNodeMap({
958
+ nodes: subTriggerNodeMap,
959
+ workflows: sharedWorkflows as unknown as Parameters<typeof mcpTrigger.setNodeMap>[0]["workflows"],
960
+ });
961
+ await mcpTrigger.listen();`
962
+ : "";
963
+ const fullBootstrap = `${sharedBootstrapPrelude}${sseBootstrap}${wsBootstrap}${webhookBootstrap}${mcpBootstrap}`;
923
964
  return `import { DefaultLogger } from "@blokjs/runner";
924
965
  import { type Span, metrics, trace } from "@opentelemetry/api";
925
- import HttpTrigger from "./runner/HttpTrigger";${sharedHelperImports}${sseImports}${wsImports}${webhookImports}
966
+ import HttpTrigger from "./runner/HttpTrigger";${sharedHelperImports}${sseImports}${wsImports}${webhookImports}${mcpImports}
926
967
 
927
968
  export default class App {
928
969
  private httpTrigger: HttpTrigger = <HttpTrigger>{};
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "blokctl",
3
- "version": "0.6.12",
3
+ "version": "0.6.14",
4
4
  "author": "Deskree Technologies Inc.",
5
5
  "license": "Apache-2.0",
6
6
  "description": "cli for blok",
@@ -30,7 +30,7 @@
30
30
  "keywords": ["blokctl", "cli", "blok", "blok"],
31
31
  "dependencies": {
32
32
  "@ai-sdk/openai": "^1.3.22",
33
- "@blokjs/runner": "^0.6.12",
33
+ "@blokjs/runner": "^0.6.14",
34
34
  "@clack/prompts": "^1.0.0",
35
35
  "ai": "^4.3.16",
36
36
  "better-sqlite3": "^12.6.2",