swallowkit 1.0.0-beta.19 → 1.0.0-beta.20

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.
Files changed (75) hide show
  1. package/README.ja.md +36 -4
  2. package/README.md +36 -4
  3. package/dist/cli/commands/add-auth.d.ts.map +1 -1
  4. package/dist/cli/commands/add-auth.js +2 -0
  5. package/dist/cli/commands/add-auth.js.map +1 -1
  6. package/dist/cli/commands/add-connector.d.ts.map +1 -1
  7. package/dist/cli/commands/add-connector.js +2 -0
  8. package/dist/cli/commands/add-connector.js.map +1 -1
  9. package/dist/cli/commands/create-model.d.ts +0 -4
  10. package/dist/cli/commands/create-model.d.ts.map +1 -1
  11. package/dist/cli/commands/create-model.js +19 -145
  12. package/dist/cli/commands/create-model.js.map +1 -1
  13. package/dist/cli/commands/init.d.ts.map +1 -1
  14. package/dist/cli/commands/init.js +2 -0
  15. package/dist/cli/commands/init.js.map +1 -1
  16. package/dist/cli/commands/scaffold.d.ts.map +1 -1
  17. package/dist/cli/commands/scaffold.js +22 -10
  18. package/dist/cli/commands/scaffold.js.map +1 -1
  19. package/dist/cli/index.d.ts.map +1 -1
  20. package/dist/cli/index.js +5 -0
  21. package/dist/cli/index.js.map +1 -1
  22. package/dist/core/operations/create-model.d.ts +15 -0
  23. package/dist/core/operations/create-model.d.ts.map +1 -0
  24. package/dist/core/operations/create-model.js +171 -0
  25. package/dist/core/operations/create-model.js.map +1 -0
  26. package/dist/core/operations/runtime.d.ts +32 -0
  27. package/dist/core/operations/runtime.d.ts.map +1 -0
  28. package/dist/core/operations/runtime.js +225 -0
  29. package/dist/core/operations/runtime.js.map +1 -0
  30. package/dist/core/operations/scaffold-machine.d.ts +16 -0
  31. package/dist/core/operations/scaffold-machine.d.ts.map +1 -0
  32. package/dist/core/operations/scaffold-machine.js +63 -0
  33. package/dist/core/operations/scaffold-machine.js.map +1 -0
  34. package/dist/core/project/manifest.d.ts +92 -0
  35. package/dist/core/project/manifest.d.ts.map +1 -0
  36. package/dist/core/project/manifest.js +321 -0
  37. package/dist/core/project/manifest.js.map +1 -0
  38. package/dist/core/project/validation.d.ts +20 -0
  39. package/dist/core/project/validation.d.ts.map +1 -0
  40. package/dist/core/project/validation.js +204 -0
  41. package/dist/core/project/validation.js.map +1 -0
  42. package/dist/machine/contracts.d.ts +16 -0
  43. package/dist/machine/contracts.d.ts.map +1 -0
  44. package/dist/machine/contracts.js +3 -0
  45. package/dist/machine/contracts.js.map +1 -0
  46. package/dist/machine/errors.d.ts +11 -0
  47. package/dist/machine/errors.d.ts.map +1 -0
  48. package/dist/machine/errors.js +34 -0
  49. package/dist/machine/errors.js.map +1 -0
  50. package/dist/machine/index.d.ts +3 -0
  51. package/dist/machine/index.d.ts.map +1 -0
  52. package/dist/machine/index.js +156 -0
  53. package/dist/machine/index.js.map +1 -0
  54. package/dist/mcp/index.d.ts +25 -0
  55. package/dist/mcp/index.d.ts.map +1 -0
  56. package/dist/mcp/index.js +184 -0
  57. package/dist/mcp/index.js.map +1 -0
  58. package/package.json +6 -4
  59. package/src/__tests__/machine.test.ts +212 -0
  60. package/src/__tests__/mcp.test.ts +56 -0
  61. package/src/cli/commands/add-auth.ts +2 -0
  62. package/src/cli/commands/add-connector.ts +2 -0
  63. package/src/cli/commands/create-model.ts +19 -168
  64. package/src/cli/commands/init.ts +3 -0
  65. package/src/cli/commands/scaffold.ts +27 -10
  66. package/src/cli/index.ts +6 -0
  67. package/src/core/operations/create-model.ts +174 -0
  68. package/src/core/operations/runtime.ts +235 -0
  69. package/src/core/operations/scaffold-machine.ts +91 -0
  70. package/src/core/project/manifest.ts +402 -0
  71. package/src/core/project/validation.ts +221 -0
  72. package/src/machine/contracts.ts +17 -0
  73. package/src/machine/errors.ts +34 -0
  74. package/src/machine/index.ts +173 -0
  75. package/src/mcp/index.ts +185 -0
@@ -0,0 +1,34 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.MachineCommandError = void 0;
4
+ exports.toMachineError = toMachineError;
5
+ class MachineCommandError extends Error {
6
+ constructor(code, message, details) {
7
+ super(message);
8
+ this.name = "MachineCommandError";
9
+ this.code = code;
10
+ this.details = details;
11
+ }
12
+ }
13
+ exports.MachineCommandError = MachineCommandError;
14
+ function toMachineError(error) {
15
+ if (error instanceof MachineCommandError) {
16
+ return {
17
+ code: error.code,
18
+ message: error.message,
19
+ ...(error.details === undefined ? {} : { details: error.details }),
20
+ };
21
+ }
22
+ if (error instanceof Error) {
23
+ return {
24
+ code: "internal-error",
25
+ message: error.message,
26
+ };
27
+ }
28
+ return {
29
+ code: "internal-error",
30
+ message: "Unknown error",
31
+ details: error,
32
+ };
33
+ }
34
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../../src/machine/errors.ts"],"names":[],"mappings":";;;AAYA,wCAqBC;AAjCD,MAAa,mBAAoB,SAAQ,KAAK;IAI5C,YAAY,IAAY,EAAE,OAAe,EAAE,OAAiB;QAC1D,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,qBAAqB,CAAC;QAClC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,OAAO,GAAG,OAAO,CAAC;IACzB,CAAC;CACF;AAVD,kDAUC;AAED,SAAgB,cAAc,CAAC,KAAc;IAC3C,IAAI,KAAK,YAAY,mBAAmB,EAAE,CAAC;QACzC,OAAO;YACL,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,OAAO,EAAE,KAAK,CAAC,OAAO;YACtB,GAAG,CAAC,KAAK,CAAC,OAAO,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,OAAO,EAAE,KAAK,CAAC,OAAO,EAAE,CAAC;SACnE,CAAC;IACJ,CAAC;IAED,IAAI,KAAK,YAAY,KAAK,EAAE,CAAC;QAC3B,OAAO;YACL,IAAI,EAAE,gBAAgB;YACtB,OAAO,EAAE,KAAK,CAAC,OAAO;SACvB,CAAC;IACJ,CAAC;IAED,OAAO;QACL,IAAI,EAAE,gBAAgB;QACtB,OAAO,EAAE,eAAe;QACxB,OAAO,EAAE,KAAK;KACf,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ export declare function isMachineCommand(argv: string[]): boolean;
2
+ export declare function runMachineCli(argv?: string[]): Promise<void>;
3
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/machine/index.ts"],"names":[],"mappings":"AAwJA,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,OAAO,CAExD;AAED,wBAAsB,aAAa,CAAC,IAAI,GAAE,MAAM,EAAiB,GAAG,OAAO,CAAC,IAAI,CAAC,CAgBhF"}
@@ -0,0 +1,156 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.isMachineCommand = isMachineCommand;
4
+ exports.runMachineCli = runMachineCli;
5
+ const commander_1 = require("commander");
6
+ const create_model_1 = require("../core/operations/create-model");
7
+ const scaffold_machine_1 = require("../core/operations/scaffold-machine");
8
+ const manifest_1 = require("../core/project/manifest");
9
+ const validation_1 = require("../core/project/validation");
10
+ const errors_1 = require("./errors");
11
+ function writeMachineResponse(response) {
12
+ process.stdout.write(`${JSON.stringify(response, null, 2)}\n`);
13
+ }
14
+ function writeMachineSuccess(command, data) {
15
+ const response = {
16
+ ok: true,
17
+ command,
18
+ data,
19
+ };
20
+ writeMachineResponse(response);
21
+ }
22
+ function writeMachineError(command, error) {
23
+ const response = {
24
+ ok: false,
25
+ command,
26
+ error: (0, errors_1.toMachineError)(error),
27
+ };
28
+ writeMachineResponse(response);
29
+ }
30
+ async function handleMachineAction(command, action) {
31
+ try {
32
+ writeMachineSuccess(command, await action());
33
+ }
34
+ catch (error) {
35
+ writeMachineError(command, error);
36
+ process.exitCode = 1;
37
+ }
38
+ }
39
+ function createMachineProgram() {
40
+ const program = new commander_1.Command();
41
+ program
42
+ .name("swallowkit machine")
43
+ .description("SwallowKit machine-readable CLI for AI and MCP integrations")
44
+ .showHelpAfterError(false)
45
+ .configureOutput({
46
+ writeErr: () => undefined,
47
+ writeOut: () => undefined,
48
+ });
49
+ const inspect = new commander_1.Command("inspect");
50
+ inspect
51
+ .command("project")
52
+ .description("Inspect SwallowKit project metadata")
53
+ .action(async () => {
54
+ await handleMachineAction("inspect-project", async () => {
55
+ const loaded = await (0, manifest_1.loadProjectManifest)();
56
+ return {
57
+ manifestSource: loaded.source,
58
+ diagnostics: loaded.diagnostics,
59
+ manifest: loaded.manifest,
60
+ };
61
+ });
62
+ });
63
+ inspect
64
+ .command("entities")
65
+ .description("Inspect SwallowKit entities")
66
+ .action(async () => {
67
+ await handleMachineAction("inspect-entities", async () => {
68
+ const loaded = await (0, manifest_1.loadProjectManifest)();
69
+ return {
70
+ manifestSource: loaded.source,
71
+ diagnostics: loaded.diagnostics,
72
+ entities: loaded.manifest.entities,
73
+ };
74
+ });
75
+ });
76
+ inspect
77
+ .command("routes")
78
+ .description("Inspect SwallowKit routes")
79
+ .action(async () => {
80
+ await handleMachineAction("inspect-routes", async () => {
81
+ const loaded = await (0, manifest_1.loadProjectManifest)();
82
+ return {
83
+ manifestSource: loaded.source,
84
+ diagnostics: loaded.diagnostics,
85
+ routes: loaded.manifest.routes,
86
+ };
87
+ });
88
+ });
89
+ const validate = new commander_1.Command("validate");
90
+ validate
91
+ .command("project")
92
+ .description("Validate SwallowKit project metadata and conventions")
93
+ .action(async () => {
94
+ await handleMachineAction("validate-project", async () => (0, validation_1.validateProject)());
95
+ });
96
+ const generate = new commander_1.Command("generate");
97
+ generate
98
+ .command("model")
99
+ .description("Generate model templates with deterministic JSON output")
100
+ .argument("<names...>", "Model names to generate")
101
+ .option("--models-dir <dir>", "Models directory", "shared/models")
102
+ .option("--connector <name>", "Associate the models with a configured connector")
103
+ .option("--overwrite <mode>", "Overwrite policy: always | never", "never")
104
+ .action(async (names, options) => {
105
+ await handleMachineAction("generate-model", async () => {
106
+ if (options.overwrite !== "always" && options.overwrite !== "never") {
107
+ throw new errors_1.MachineCommandError("invalid-overwrite-mode", `Unsupported overwrite mode: ${options.overwrite}. Use "always" or "never".`);
108
+ }
109
+ return (0, create_model_1.createModelOperation)({
110
+ names,
111
+ modelsDir: options.modelsDir,
112
+ connector: options.connector,
113
+ overwriteMode: options.overwrite,
114
+ });
115
+ });
116
+ });
117
+ generate
118
+ .command("scaffold")
119
+ .description("Generate scaffold artifacts with deterministic JSON output")
120
+ .argument("<model>", "Model file or model name")
121
+ .option("--functions-dir <dir>", "Functions directory", "functions")
122
+ .option("--api-dir <dir>", "API routes directory", "app/api")
123
+ .option("--api-only", "Generate only API artifacts", false)
124
+ .action(async (model, options) => {
125
+ await handleMachineAction("generate-scaffold", async () => (0, scaffold_machine_1.runMachineScaffoldOperation)({
126
+ model,
127
+ functionsDir: options.functionsDir,
128
+ apiDir: options.apiDir,
129
+ apiOnly: options.apiOnly,
130
+ }));
131
+ });
132
+ program.addCommand(inspect);
133
+ program.addCommand(validate);
134
+ program.addCommand(generate);
135
+ return program;
136
+ }
137
+ function isMachineCommand(argv) {
138
+ return argv[2] === "machine";
139
+ }
140
+ async function runMachineCli(argv = process.argv) {
141
+ const program = createMachineProgram();
142
+ program.exitOverride();
143
+ try {
144
+ await program.parseAsync(argv.slice(3), { from: "user" });
145
+ }
146
+ catch (error) {
147
+ if (error instanceof commander_1.CommanderError) {
148
+ writeMachineError("machine-parse", new errors_1.MachineCommandError("invalid-command", error.message));
149
+ process.exitCode = Number.isFinite(error.exitCode) ? error.exitCode : 1;
150
+ return;
151
+ }
152
+ writeMachineError("machine-parse", error);
153
+ process.exitCode = 1;
154
+ }
155
+ }
156
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/machine/index.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env node
2
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp";
3
+ import * as z from "zod/v4";
4
+ type MachineCliRunner = (args: string[]) => Promise<{
5
+ stdout: string;
6
+ stderr: string;
7
+ exitCode: number;
8
+ }>;
9
+ type ToolContentResult = {
10
+ content: Array<{
11
+ type: "text";
12
+ text: string;
13
+ }>;
14
+ };
15
+ type ToolDefinition = {
16
+ name: string;
17
+ description: string;
18
+ inputSchema: z.ZodTypeAny;
19
+ handler: (input: any) => Promise<ToolContentResult>;
20
+ };
21
+ export declare function buildSwallowKitToolDefinitions(runMachineCli?: MachineCliRunner): ToolDefinition[];
22
+ export declare function createSwallowKitMcpServer(runMachineCli?: MachineCliRunner): McpServer;
23
+ export declare function runMcpServer(): Promise<void>;
24
+ export {};
25
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":";AAGA,OAAO,EAAE,SAAS,EAAE,MAAM,sCAAsC,CAAC;AAEjE,OAAO,KAAK,CAAC,MAAM,QAAQ,CAAC;AAS5B,KAAK,gBAAgB,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAC1G,KAAK,iBAAiB,GAAG;IAAE,OAAO,EAAE,KAAK,CAAC;QAAE,IAAI,EAAE,MAAM,CAAC;QAAC,IAAI,EAAE,MAAM,CAAA;KAAE,CAAC,CAAA;CAAE,CAAC;AAC5E,KAAK,cAAc,GAAG;IACpB,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,CAAC,CAAC,UAAU,CAAC;IAC1B,OAAO,EAAE,CAAC,KAAK,EAAE,GAAG,KAAK,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACrD,CAAC;AAkDF,wBAAgB,8BAA8B,CAC5C,aAAa,GAAE,gBAA0C,GACxD,cAAc,EAAE,CA8ElB;AAED,wBAAgB,yBAAyB,CAAC,aAAa,GAAE,gBAA0C,GAAG,SAAS,CAkB9G;AAED,wBAAsB,YAAY,IAAI,OAAO,CAAC,IAAI,CAAC,CAIlD"}
@@ -0,0 +1,184 @@
1
+ #!/usr/bin/env node
2
+ "use strict";
3
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
4
+ if (k2 === undefined) k2 = k;
5
+ var desc = Object.getOwnPropertyDescriptor(m, k);
6
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
7
+ desc = { enumerable: true, get: function() { return m[k]; } };
8
+ }
9
+ Object.defineProperty(o, k2, desc);
10
+ }) : (function(o, m, k, k2) {
11
+ if (k2 === undefined) k2 = k;
12
+ o[k2] = m[k];
13
+ }));
14
+ var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
15
+ Object.defineProperty(o, "default", { enumerable: true, value: v });
16
+ }) : function(o, v) {
17
+ o["default"] = v;
18
+ });
19
+ var __importStar = (this && this.__importStar) || (function () {
20
+ var ownKeys = function(o) {
21
+ ownKeys = Object.getOwnPropertyNames || function (o) {
22
+ var ar = [];
23
+ for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
24
+ return ar;
25
+ };
26
+ return ownKeys(o);
27
+ };
28
+ return function (mod) {
29
+ if (mod && mod.__esModule) return mod;
30
+ var result = {};
31
+ if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
32
+ __setModuleDefault(result, mod);
33
+ return result;
34
+ };
35
+ })();
36
+ Object.defineProperty(exports, "__esModule", { value: true });
37
+ exports.buildSwallowKitToolDefinitions = buildSwallowKitToolDefinitions;
38
+ exports.createSwallowKitMcpServer = createSwallowKitMcpServer;
39
+ exports.runMcpServer = runMcpServer;
40
+ const path = __importStar(require("path"));
41
+ const mcp_1 = require("@modelcontextprotocol/sdk/server/mcp");
42
+ const stdio_1 = require("@modelcontextprotocol/sdk/server/stdio");
43
+ const z = __importStar(require("zod/v4"));
44
+ function resolveMachineCliEntrypoint() {
45
+ return path.resolve(__dirname, "..", "cli", "index.js");
46
+ }
47
+ async function defaultMachineCliRunner(args) {
48
+ const { execa } = await Promise.resolve().then(() => __importStar(require("execa")));
49
+ const result = await execa(process.execPath, [resolveMachineCliEntrypoint(), "machine", ...args], {
50
+ reject: false,
51
+ });
52
+ return {
53
+ stdout: result.stdout,
54
+ stderr: result.stderr,
55
+ exitCode: result.exitCode ?? 0,
56
+ };
57
+ }
58
+ async function executeMachineCommand(args, runMachineCli) {
59
+ const result = await runMachineCli(args);
60
+ let parsed;
61
+ try {
62
+ parsed = JSON.parse(result.stdout);
63
+ }
64
+ catch {
65
+ throw new Error(result.stderr || result.stdout || "Machine CLI returned invalid JSON.");
66
+ }
67
+ if (!parsed.ok) {
68
+ throw new Error(parsed.error.message);
69
+ }
70
+ return parsed;
71
+ }
72
+ function jsonTextContent(value) {
73
+ return {
74
+ content: [
75
+ {
76
+ type: "text",
77
+ text: JSON.stringify(value, null, 2),
78
+ },
79
+ ],
80
+ };
81
+ }
82
+ function buildSwallowKitToolDefinitions(runMachineCli = defaultMachineCliRunner) {
83
+ return [
84
+ {
85
+ name: "swallowkit_inspect_project",
86
+ description: "Return framework-owned SwallowKit project metadata.",
87
+ inputSchema: z.object({}),
88
+ handler: async () => {
89
+ const response = await executeMachineCommand(["inspect", "project"], runMachineCli);
90
+ return jsonTextContent(response.data);
91
+ },
92
+ },
93
+ {
94
+ name: "swallowkit_inspect_entities",
95
+ description: "Return SwallowKit entities, schema metadata, and connector/auth annotations.",
96
+ inputSchema: z.object({}),
97
+ handler: async () => {
98
+ const response = await executeMachineCommand(["inspect", "entities"], runMachineCli);
99
+ return jsonTextContent(response.data);
100
+ },
101
+ },
102
+ {
103
+ name: "swallowkit_inspect_routes",
104
+ description: "Return BFF and Functions route metadata understood by SwallowKit.",
105
+ inputSchema: z.object({}),
106
+ handler: async () => {
107
+ const response = await executeMachineCommand(["inspect", "routes"], runMachineCli);
108
+ return jsonTextContent(response.data);
109
+ },
110
+ },
111
+ {
112
+ name: "swallowkit_validate_project",
113
+ description: "Validate project metadata, generated artifacts, and framework conventions.",
114
+ inputSchema: z.object({}),
115
+ handler: async () => {
116
+ const response = await executeMachineCommand(["validate", "project"], runMachineCli);
117
+ return jsonTextContent(response.data);
118
+ },
119
+ },
120
+ {
121
+ name: "swallowkit_generate_model",
122
+ description: "Generate SwallowKit model templates through the official generator.",
123
+ inputSchema: z.object({
124
+ names: z.array(z.string()).min(1),
125
+ modelsDir: z.string().optional(),
126
+ connector: z.string().optional(),
127
+ overwrite: z.enum(["always", "never"]).optional(),
128
+ }),
129
+ handler: async ({ names, modelsDir, connector, overwrite }) => {
130
+ const response = await executeMachineCommand(["generate", "model", ...names, ...(modelsDir ? ["--models-dir", modelsDir] : []), ...(connector ? ["--connector", connector] : []), "--overwrite", overwrite || "never"], runMachineCli);
131
+ return jsonTextContent(response.data);
132
+ },
133
+ },
134
+ {
135
+ name: "swallowkit_scaffold_model",
136
+ description: "Generate SwallowKit scaffold artifacts through the official generator.",
137
+ inputSchema: z.object({
138
+ model: z.string(),
139
+ functionsDir: z.string().optional(),
140
+ apiDir: z.string().optional(),
141
+ apiOnly: z.boolean().optional(),
142
+ }),
143
+ handler: async ({ model, functionsDir, apiDir, apiOnly }) => {
144
+ const args = ["generate", "scaffold", model];
145
+ if (functionsDir) {
146
+ args.push("--functions-dir", functionsDir);
147
+ }
148
+ if (apiDir) {
149
+ args.push("--api-dir", apiDir);
150
+ }
151
+ if (apiOnly) {
152
+ args.push("--api-only");
153
+ }
154
+ const response = await executeMachineCommand(args, runMachineCli);
155
+ return jsonTextContent(response.data);
156
+ },
157
+ },
158
+ ];
159
+ }
160
+ function createSwallowKitMcpServer(runMachineCli = defaultMachineCliRunner) {
161
+ const server = new mcp_1.McpServer({
162
+ name: "swallowkit-mcp",
163
+ version: process.env.npm_package_version || "0.0.0",
164
+ });
165
+ for (const tool of buildSwallowKitToolDefinitions(runMachineCli)) {
166
+ server.registerTool(tool.name, {
167
+ description: tool.description,
168
+ inputSchema: tool.inputSchema,
169
+ }, tool.handler);
170
+ }
171
+ return server;
172
+ }
173
+ async function runMcpServer() {
174
+ const server = createSwallowKitMcpServer();
175
+ const transport = new stdio_1.StdioServerTransport();
176
+ await server.connect(transport);
177
+ }
178
+ if (require.main === module) {
179
+ void runMcpServer().catch((error) => {
180
+ console.error(error);
181
+ process.exitCode = 1;
182
+ });
183
+ }
184
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/mcp/index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "swallowkit",
3
- "version": "1.0.0-beta.19",
3
+ "version": "1.0.0-beta.20",
4
4
  "description": "Type-safe schema-driven development toolkit for Next.js applications on Azure",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "bin": {
8
- "swallowkit": "dist/cli/index.js"
8
+ "swallowkit": "dist/cli/index.js",
9
+ "swallowkit-mcp": "dist/mcp/index.js"
9
10
  },
10
11
  "files": [
11
12
  "dist",
@@ -35,14 +36,15 @@
35
36
  "license": "MIT",
36
37
  "dependencies": {
37
38
  "@azure/cosmos": "^4.9.2",
39
+ "@modelcontextprotocol/sdk": "^1.29.0",
38
40
  "commander": "^11.0.0",
39
41
  "cors": "^2.8.5",
40
42
  "execa": "^8.0.1",
41
43
  "express": "^4.18.0",
44
+ "jsonwebtoken": "^9.0.0",
42
45
  "prompts": "^2.4.2",
43
46
  "tsx": "^4.7.0",
44
- "zod": "^3.25.76",
45
- "jsonwebtoken": "^9.0.0"
47
+ "zod": "^3.25.76"
46
48
  },
47
49
  "devDependencies": {
48
50
  "@types/cors": "^2.8.0",