@paretools/docker 0.3.0 → 0.6.0

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 (58) hide show
  1. package/README.md +46 -12
  2. package/dist/index.js +1 -1
  3. package/dist/index.js.map +1 -1
  4. package/dist/lib/docker-runner.d.ts.map +1 -1
  5. package/dist/lib/docker-runner.js +4 -3
  6. package/dist/lib/docker-runner.js.map +1 -1
  7. package/dist/lib/formatters.d.ts +106 -1
  8. package/dist/lib/formatters.d.ts.map +1 -1
  9. package/dist/lib/formatters.js +170 -0
  10. package/dist/lib/formatters.js.map +1 -1
  11. package/dist/lib/parsers.d.ts +15 -1
  12. package/dist/lib/parsers.d.ts.map +1 -1
  13. package/dist/lib/parsers.js +93 -0
  14. package/dist/lib/parsers.js.map +1 -1
  15. package/dist/lib/validation.d.ts +15 -0
  16. package/dist/lib/validation.d.ts.map +1 -0
  17. package/dist/lib/validation.js +94 -0
  18. package/dist/lib/validation.js.map +1 -0
  19. package/dist/schemas/index.d.ts +82 -176
  20. package/dist/schemas/index.d.ts.map +1 -1
  21. package/dist/schemas/index.js +39 -0
  22. package/dist/schemas/index.js.map +1 -1
  23. package/dist/tools/build.d.ts.map +1 -1
  24. package/dist/tools/build.js +37 -8
  25. package/dist/tools/build.js.map +1 -1
  26. package/dist/tools/compose-down.d.ts +3 -0
  27. package/dist/tools/compose-down.d.ts.map +1 -0
  28. package/dist/tools/compose-down.js +58 -0
  29. package/dist/tools/compose-down.js.map +1 -0
  30. package/dist/tools/compose-up.d.ts +3 -0
  31. package/dist/tools/compose-up.d.ts.map +1 -0
  32. package/dist/tools/compose-up.js +68 -0
  33. package/dist/tools/compose-up.js.map +1 -0
  34. package/dist/tools/exec.d.ts +3 -0
  35. package/dist/tools/exec.d.ts.map +1 -0
  36. package/dist/tools/exec.js +68 -0
  37. package/dist/tools/exec.js.map +1 -0
  38. package/dist/tools/images.d.ts.map +1 -1
  39. package/dist/tools/images.js +16 -5
  40. package/dist/tools/images.js.map +1 -1
  41. package/dist/tools/index.d.ts.map +1 -1
  42. package/dist/tools/index.js +10 -0
  43. package/dist/tools/index.js.map +1 -1
  44. package/dist/tools/logs.d.ts.map +1 -1
  45. package/dist/tools/logs.js +14 -5
  46. package/dist/tools/logs.js.map +1 -1
  47. package/dist/tools/ps.d.ts.map +1 -1
  48. package/dist/tools/ps.js +9 -4
  49. package/dist/tools/ps.js.map +1 -1
  50. package/dist/tools/pull.d.ts +3 -0
  51. package/dist/tools/pull.d.ts.map +1 -0
  52. package/dist/tools/pull.js +50 -0
  53. package/dist/tools/pull.js.map +1 -0
  54. package/dist/tools/run.d.ts +3 -0
  55. package/dist/tools/run.d.ts.map +1 -0
  56. package/dist/tools/run.js +106 -0
  57. package/dist/tools/run.js.map +1 -0
  58. package/package.json +20 -9
@@ -0,0 +1,58 @@
1
+ import { z } from "zod";
2
+ import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
+ import { docker } from "../lib/docker-runner.js";
4
+ import { parseComposeDownOutput } from "../lib/parsers.js";
5
+ import { formatComposeDown, compactComposeDownMap, formatComposeDownCompact, } from "../lib/formatters.js";
6
+ import { DockerComposeDownSchema } from "../schemas/index.js";
7
+ export function registerComposeDownTool(server) {
8
+ server.registerTool("compose-down", {
9
+ title: "Docker Compose Down",
10
+ description: "Stops Docker Compose services and returns structured status. Use instead of running `docker compose down` in the terminal.",
11
+ inputSchema: {
12
+ path: z
13
+ .string()
14
+ .max(INPUT_LIMITS.PATH_MAX)
15
+ .describe("Directory containing docker-compose.yml"),
16
+ volumes: z
17
+ .boolean()
18
+ .optional()
19
+ .default(false)
20
+ .describe("Also remove named volumes (default: false)"),
21
+ removeOrphans: z
22
+ .boolean()
23
+ .optional()
24
+ .default(false)
25
+ .describe("Remove orphan containers (default: false)"),
26
+ file: z
27
+ .string()
28
+ .max(INPUT_LIMITS.PATH_MAX)
29
+ .optional()
30
+ .describe("Compose file path (default: docker-compose.yml)"),
31
+ compact: z
32
+ .boolean()
33
+ .optional()
34
+ .default(true)
35
+ .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
36
+ },
37
+ outputSchema: DockerComposeDownSchema,
38
+ }, async ({ path, volumes, removeOrphans, file, compact }) => {
39
+ if (file)
40
+ assertNoFlagInjection(file, "file");
41
+ const args = ["compose"];
42
+ if (file)
43
+ args.push("-f", file);
44
+ args.push("down");
45
+ if (volumes)
46
+ args.push("--volumes");
47
+ if (removeOrphans)
48
+ args.push("--remove-orphans");
49
+ const result = await docker(args, path);
50
+ const data = parseComposeDownOutput(result.stdout, result.stderr, result.exitCode);
51
+ if (result.exitCode !== 0 && data.stopped === 0 && data.removed === 0) {
52
+ const errorMsg = result.stderr || result.stdout || "Unknown error";
53
+ throw new Error(`docker compose down failed: ${errorMsg.trim()}`);
54
+ }
55
+ return compactDualOutput(data, result.stdout, formatComposeDown, compactComposeDownMap, formatComposeDownCompact, compact === false);
56
+ });
57
+ }
58
+ //# sourceMappingURL=compose-down.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-down.js","sourceRoot":"","sources":["../../src/tools/compose-down.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,sBAAsB,EAAE,MAAM,mBAAmB,CAAC;AAC3D,OAAO,EACL,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,GACzB,MAAM,sBAAsB,CAAC;AAC9B,OAAO,EAAE,uBAAuB,EAAE,MAAM,qBAAqB,CAAC;AAE9D,MAAM,UAAU,uBAAuB,CAAC,MAAiB;IACvD,MAAM,CAAC,YAAY,CACjB,cAAc,EACd;QACE,KAAK,EAAE,qBAAqB;QAC5B,WAAW,EACT,4HAA4H;QAC9H,WAAW,EAAE;YACX,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,CAAC,yCAAyC,CAAC;YACtD,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,4CAA4C,CAAC;YACzD,aAAa,EAAE,CAAC;iBACb,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,2CAA2C,CAAC;YACxD,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,iDAAiD,CAAC;YAC9D,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,uBAAuB;KACtC,EACD,KAAK,EAAE,EAAE,IAAI,EAAE,OAAO,EAAE,aAAa,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QACxD,IAAI,IAAI;YAAE,qBAAqB,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC;QAE9C,MAAM,IAAI,GAAG,CAAC,SAAS,CAAC,CAAC;QACzB,IAAI,IAAI;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAChC,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAClB,IAAI,OAAO;YAAE,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,CAAC;QACpC,IAAI,aAAa;YAAE,IAAI,CAAC,IAAI,CAAC,kBAAkB,CAAC,CAAC;QAEjD,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QACxC,MAAM,IAAI,GAAG,sBAAsB,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;QAEnF,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,IAAI,IAAI,CAAC,OAAO,KAAK,CAAC,EAAE,CAAC;YACtE,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,+BAA+B,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QACpE,CAAC;QAED,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,iBAAiB,EACjB,qBAAqB,EACrB,wBAAwB,EACxB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerComposeUpTool(server: McpServer): void;
3
+ //# sourceMappingURL=compose-up.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-up.d.ts","sourceRoot":"","sources":["../../src/tools/compose-up.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,SAAS,QA0EtD"}
@@ -0,0 +1,68 @@
1
+ import { z } from "zod";
2
+ import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
+ import { docker } from "../lib/docker-runner.js";
4
+ import { parseComposeUpOutput } from "../lib/parsers.js";
5
+ import { formatComposeUp, compactComposeUpMap, formatComposeUpCompact } from "../lib/formatters.js";
6
+ import { DockerComposeUpSchema } from "../schemas/index.js";
7
+ export function registerComposeUpTool(server) {
8
+ server.registerTool("compose-up", {
9
+ title: "Docker Compose Up",
10
+ description: "Starts Docker Compose services and returns structured status. Use instead of running `docker compose up` in the terminal.",
11
+ inputSchema: {
12
+ path: z
13
+ .string()
14
+ .max(INPUT_LIMITS.PATH_MAX)
15
+ .describe("Directory containing docker-compose.yml"),
16
+ services: z
17
+ .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
18
+ .max(INPUT_LIMITS.ARRAY_MAX)
19
+ .optional()
20
+ .default([])
21
+ .describe("Specific services to start (default: all)"),
22
+ detach: z.boolean().optional().default(true).describe("Run in background (default: true)"),
23
+ build: z
24
+ .boolean()
25
+ .optional()
26
+ .default(false)
27
+ .describe("Build images before starting (default: false)"),
28
+ file: z
29
+ .string()
30
+ .max(INPUT_LIMITS.PATH_MAX)
31
+ .optional()
32
+ .describe("Compose file path (default: docker-compose.yml)"),
33
+ compact: z
34
+ .boolean()
35
+ .optional()
36
+ .default(true)
37
+ .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
38
+ },
39
+ outputSchema: DockerComposeUpSchema,
40
+ }, async ({ path, services, detach, build, file, compact }) => {
41
+ if (file)
42
+ assertNoFlagInjection(file, "file");
43
+ if (services) {
44
+ for (const s of services) {
45
+ assertNoFlagInjection(s, "services");
46
+ }
47
+ }
48
+ const args = ["compose"];
49
+ if (file)
50
+ args.push("-f", file);
51
+ args.push("up");
52
+ if (detach)
53
+ args.push("-d");
54
+ if (build)
55
+ args.push("--build");
56
+ if (services && services.length > 0) {
57
+ args.push(...services);
58
+ }
59
+ const result = await docker(args, path);
60
+ const data = parseComposeUpOutput(result.stdout, result.stderr, result.exitCode);
61
+ if (result.exitCode !== 0 && data.started === 0) {
62
+ const errorMsg = result.stderr || result.stdout || "Unknown error";
63
+ throw new Error(`docker compose up failed: ${errorMsg.trim()}`);
64
+ }
65
+ return compactDualOutput(data, result.stdout, formatComposeUp, compactComposeUpMap, formatComposeUpCompact, compact === false);
66
+ });
67
+ }
68
+ //# sourceMappingURL=compose-up.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"compose-up.js","sourceRoot":"","sources":["../../src/tools/compose-up.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerExecTool(server: McpServer): void;
3
+ //# sourceMappingURL=exec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.d.ts","sourceRoot":"","sources":["../../src/tools/exec.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QA0EjD"}
@@ -0,0 +1,68 @@
1
+ import { z } from "zod";
2
+ import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
+ import { docker } from "../lib/docker-runner.js";
4
+ import { parseExecOutput } from "../lib/parsers.js";
5
+ import { formatExec, compactExecMap, formatExecCompact } from "../lib/formatters.js";
6
+ import { DockerExecSchema } from "../schemas/index.js";
7
+ export function registerExecTool(server) {
8
+ server.registerTool("exec", {
9
+ title: "Docker Exec",
10
+ description: "Executes arbitrary commands inside a running Docker container and returns structured output. " +
11
+ "Use instead of running `docker exec` in the terminal. " +
12
+ "WARNING: This runs arbitrary commands inside the container. Only use on trusted containers.",
13
+ inputSchema: {
14
+ container: z.string().max(INPUT_LIMITS.SHORT_STRING_MAX).describe("Container name or ID"),
15
+ command: z
16
+ .array(z.string().max(INPUT_LIMITS.STRING_MAX))
17
+ .max(INPUT_LIMITS.ARRAY_MAX)
18
+ .describe('Command to execute (e.g., ["ls", "-la"])'),
19
+ workdir: z
20
+ .string()
21
+ .max(INPUT_LIMITS.PATH_MAX)
22
+ .optional()
23
+ .describe("Working directory inside the container"),
24
+ env: z
25
+ .array(z.string().max(INPUT_LIMITS.STRING_MAX))
26
+ .max(INPUT_LIMITS.ARRAY_MAX)
27
+ .optional()
28
+ .default([])
29
+ .describe('Environment variables (e.g., ["KEY=VALUE"])'),
30
+ path: z
31
+ .string()
32
+ .max(INPUT_LIMITS.PATH_MAX)
33
+ .optional()
34
+ .describe("Host working directory (default: cwd)"),
35
+ compact: z
36
+ .boolean()
37
+ .optional()
38
+ .default(true)
39
+ .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
40
+ },
41
+ outputSchema: DockerExecSchema,
42
+ }, async ({ container, command, workdir, env, path, compact }) => {
43
+ if (!command || command.length === 0) {
44
+ throw new Error("command array must not be empty");
45
+ }
46
+ assertNoFlagInjection(container, "container");
47
+ assertNoFlagInjection(command[0], "command");
48
+ if (workdir)
49
+ assertNoFlagInjection(workdir, "workdir");
50
+ // Validate first element of command array (the binary name) to prevent flag injection.
51
+ // Subsequent elements are intentionally unchecked as they are arguments to the command itself.
52
+ if (command.length > 0) {
53
+ assertNoFlagInjection(command[0], "command");
54
+ }
55
+ const args = ["exec"];
56
+ if (workdir)
57
+ args.push("-w", workdir);
58
+ for (const e of env ?? []) {
59
+ assertNoFlagInjection(e, "env");
60
+ args.push("-e", e);
61
+ }
62
+ args.push(container, ...command);
63
+ const result = await docker(args, path);
64
+ const data = parseExecOutput(result.stdout, result.stderr, result.exitCode);
65
+ return compactDualOutput(data, result.stdout, formatExec, compactExecMap, formatExecCompact, compact === false);
66
+ });
67
+ }
68
+ //# sourceMappingURL=exec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"exec.js","sourceRoot":"","sources":["../../src/tools/exec.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/tools/images.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QA2BnD"}
1
+ {"version":3,"file":"images.d.ts","sourceRoot":"","sources":["../../src/tools/images.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,SAAS,QA+CnD"}
@@ -1,8 +1,8 @@
1
1
  import { z } from "zod";
2
- import { dualOutput } from "@paretools/shared";
2
+ import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
3
  import { docker } from "../lib/docker-runner.js";
4
4
  import { parseImagesJson } from "../lib/parsers.js";
5
- import { formatImages } from "../lib/formatters.js";
5
+ import { formatImages, compactImagesMap, formatImagesCompact } from "../lib/formatters.js";
6
6
  import { DockerImagesSchema } from "../schemas/index.js";
7
7
  export function registerImagesTool(server) {
8
8
  server.registerTool("images", {
@@ -14,10 +14,21 @@ export function registerImagesTool(server) {
14
14
  .optional()
15
15
  .default(false)
16
16
  .describe("Show all images including intermediates"),
17
- filter: z.string().optional().describe("Filter by reference (e.g., 'myapp', 'nginx:*')"),
17
+ filter: z
18
+ .string()
19
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
20
+ .optional()
21
+ .describe("Filter by reference (e.g., 'myapp', 'nginx:*')"),
22
+ compact: z
23
+ .boolean()
24
+ .optional()
25
+ .default(true)
26
+ .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
18
27
  },
19
28
  outputSchema: DockerImagesSchema,
20
- }, async ({ all, filter }) => {
29
+ }, async ({ all, filter, compact }) => {
30
+ if (filter)
31
+ assertNoFlagInjection(filter, "filter");
21
32
  const args = ["images", "--format", "json"];
22
33
  if (all)
23
34
  args.push("-a");
@@ -25,7 +36,7 @@ export function registerImagesTool(server) {
25
36
  args.push(filter);
26
37
  const result = await docker(args);
27
38
  const data = parseImagesJson(result.stdout);
28
- return dualOutput(data, formatImages);
39
+ return compactDualOutput(data, result.stdout, formatImages, compactImagesMap, formatImagesCompact, compact === false);
29
40
  });
30
41
  }
31
42
  //# sourceMappingURL=images.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/tools/images.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC;AACpD,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,uIAAuI;QACzI,WAAW,EAAE;YACX,GAAG,EAAE,CAAC;iBACH,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,yCAAyC,CAAC;YACtD,MAAM,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,EAAE,CAAC,QAAQ,CAAC,gDAAgD,CAAC;SACzF;QACD,YAAY,EAAE,kBAAkB;KACjC,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,EAAE,EAAE;QACxB,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,UAAU,CAAC,IAAI,EAAE,YAAY,CAAC,CAAC;IACxC,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"images.js","sourceRoot":"","sources":["../../src/tools/images.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,YAAY,EAAE,gBAAgB,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3F,OAAO,EAAE,kBAAkB,EAAE,MAAM,qBAAqB,CAAC;AAEzD,MAAM,UAAU,kBAAkB,CAAC,MAAiB;IAClD,MAAM,CAAC,YAAY,CACjB,QAAQ,EACR;QACE,KAAK,EAAE,eAAe;QACtB,WAAW,EACT,uIAAuI;QACzI,WAAW,EAAE;YACX,GAAG,EAAE,CAAC;iBACH,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,KAAK,CAAC;iBACd,QAAQ,CAAC,yCAAyC,CAAC;YACtD,MAAM,EAAE,CAAC;iBACN,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,EAAE;iBACV,QAAQ,CAAC,gDAAgD,CAAC;YAC7D,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,kBAAkB;KACjC,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,MAAM,EAAE,OAAO,EAAE,EAAE,EAAE;QACjC,IAAI,MAAM;YAAE,qBAAqB,CAAC,MAAM,EAAE,QAAQ,CAAC,CAAC;QAEpD,MAAM,IAAI,GAAG,CAAC,QAAQ,EAAE,UAAU,EAAE,MAAM,CAAC,CAAC;QAC5C,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,IAAI,MAAM;YAAE,IAAI,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QAE9B,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QAC5C,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,YAAY,EACZ,gBAAgB,EAChB,mBAAmB,EACnB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAMzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAKjD"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAWzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAUjD"}
@@ -2,10 +2,20 @@ import { registerPsTool } from "./ps.js";
2
2
  import { registerBuildTool } from "./build.js";
3
3
  import { registerLogsTool } from "./logs.js";
4
4
  import { registerImagesTool } from "./images.js";
5
+ import { registerRunTool } from "./run.js";
6
+ import { registerExecTool } from "./exec.js";
7
+ import { registerComposeUpTool } from "./compose-up.js";
8
+ import { registerComposeDownTool } from "./compose-down.js";
9
+ import { registerPullTool } from "./pull.js";
5
10
  export function registerAllTools(server) {
6
11
  registerPsTool(server);
7
12
  registerBuildTool(server);
8
13
  registerLogsTool(server);
9
14
  registerImagesTool(server);
15
+ registerRunTool(server);
16
+ registerExecTool(server);
17
+ registerComposeUpTool(server);
18
+ registerComposeDownTool(server);
19
+ registerPullTool(server);
10
20
  }
11
21
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AAEjD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,kBAAkB,CAAC,MAAM,CAAC,CAAC;AAC7B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/tools/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,cAAc,EAAE,MAAM,SAAS,CAAC;AACzC,OAAO,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,kBAAkB,EAAE,MAAM,aAAa,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,qBAAqB,EAAE,MAAM,iBAAiB,CAAC;AACxD,OAAO,EAAE,uBAAuB,EAAE,MAAM,mBAAmB,CAAC;AAC5D,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAE7C,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,cAAc,CAAC,MAAM,CAAC,CAAC;IACvB,iBAAiB,CAAC,MAAM,CAAC,CAAC;IAC1B,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,kBAAkB,CAAC,MAAM,CAAC,CAAC;IAC3B,eAAe,CAAC,MAAM,CAAC,CAAC;IACxB,gBAAgB,CAAC,MAAM,CAAC,CAAC;IACzB,qBAAqB,CAAC,MAAM,CAAC,CAAC;IAC9B,uBAAuB,CAAC,MAAM,CAAC,CAAC;IAChC,gBAAgB,CAAC,MAAM,CAAC,CAAC;AAC3B,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QA+BjD"}
1
+ {"version":3,"file":"logs.d.ts","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QAiDjD"}
@@ -1,15 +1,15 @@
1
1
  import { z } from "zod";
2
- import { dualOutput } from "@paretools/shared";
2
+ import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
3
  import { docker } from "../lib/docker-runner.js";
4
4
  import { parseLogsOutput } from "../lib/parsers.js";
5
- import { formatLogs } from "../lib/formatters.js";
5
+ import { formatLogs, compactLogsMap, formatLogsCompact } from "../lib/formatters.js";
6
6
  import { DockerLogsSchema } from "../schemas/index.js";
7
7
  export function registerLogsTool(server) {
8
8
  server.registerTool("logs", {
9
9
  title: "Docker Logs",
10
10
  description: "Retrieves container logs as structured line arrays. Use instead of running `docker logs` in the terminal.",
11
11
  inputSchema: {
12
- container: z.string().describe("Container name or ID"),
12
+ container: z.string().max(INPUT_LIMITS.SHORT_STRING_MAX).describe("Container name or ID"),
13
13
  tail: z
14
14
  .number()
15
15
  .optional()
@@ -17,18 +17,27 @@ export function registerLogsTool(server) {
17
17
  .describe("Number of lines to return (default: 100)"),
18
18
  since: z
19
19
  .string()
20
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
20
21
  .optional()
21
22
  .describe("Show logs since timestamp (e.g., '10m', '2024-01-01')"),
23
+ compact: z
24
+ .boolean()
25
+ .optional()
26
+ .default(true)
27
+ .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
22
28
  },
23
29
  outputSchema: DockerLogsSchema,
24
- }, async ({ container, tail, since }) => {
30
+ }, async ({ container, tail, since, compact }) => {
31
+ assertNoFlagInjection(container, "container");
32
+ if (since)
33
+ assertNoFlagInjection(since, "since");
25
34
  const args = ["logs", container, "--tail", String(tail ?? 100)];
26
35
  if (since)
27
36
  args.push("--since", since);
28
37
  const result = await docker(args);
29
38
  const output = result.stdout || result.stderr;
30
39
  const data = parseLogsOutput(output, container);
31
- return dualOutput(data, formatLogs);
40
+ return compactDualOutput(data, output, formatLogs, compactLogsMap, formatLogsCompact, compact === false);
32
41
  });
33
42
  }
34
43
  //# sourceMappingURL=logs.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,MAAM,sBAAsB,CAAC;AAClD,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,2GAA2G;QAC7G,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACtD,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,GAAG,CAAC;iBACZ,QAAQ,CAAC,0CAA0C,CAAC;YACvD,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;SACrE;QACD,YAAY,EAAE,gBAAgB;KAC/B,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,EAAE,EAAE;QACnC,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;QAChE,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QAC9C,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChD,OAAO,UAAU,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;IACtC,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"logs.js","sourceRoot":"","sources":["../../src/tools/logs.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,2GAA2G;QAC7G,WAAW,EAAE;YACX,SAAS,EAAE,CAAC,CAAC,MAAM,EAAE,CAAC,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC,CAAC,QAAQ,CAAC,sBAAsB,CAAC;YACzF,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,QAAQ,EAAE;iBACV,OAAO,CAAC,GAAG,CAAC;iBACZ,QAAQ,CAAC,0CAA0C,CAAC;YACvD,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,EAAE;iBACV,QAAQ,CAAC,uDAAuD,CAAC;YACpE,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,gBAAgB;KAC/B,EACD,KAAK,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,EAAE,EAAE,EAAE;QAC5C,qBAAqB,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;QAC9C,IAAI,KAAK;YAAE,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QAEjD,MAAM,IAAI,GAAG,CAAC,MAAM,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,CAAC,IAAI,IAAI,GAAG,CAAC,CAAC,CAAC;QAChE,IAAI,KAAK;YAAE,IAAI,CAAC,IAAI,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;QAEvC,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,MAAM,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,CAAC;QAC9C,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,EAAE,SAAS,CAAC,CAAC;QAChD,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,EACN,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../src/tools/ps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,QAwB/C"}
1
+ {"version":3,"file":"ps.d.ts","sourceRoot":"","sources":["../../src/tools/ps.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,cAAc,CAAC,MAAM,EAAE,SAAS,QAsC/C"}
package/dist/tools/ps.js CHANGED
@@ -1,8 +1,8 @@
1
1
  import { z } from "zod";
2
- import { dualOutput } from "@paretools/shared";
2
+ import { compactDualOutput } from "@paretools/shared";
3
3
  import { docker } from "../lib/docker-runner.js";
4
4
  import { parsePsJson } from "../lib/parsers.js";
5
- import { formatPs } from "../lib/formatters.js";
5
+ import { formatPs, compactPsMap, formatPsCompact } from "../lib/formatters.js";
6
6
  import { DockerPsSchema } from "../schemas/index.js";
7
7
  export function registerPsTool(server) {
8
8
  server.registerTool("ps", {
@@ -14,15 +14,20 @@ export function registerPsTool(server) {
14
14
  .optional()
15
15
  .default(true)
16
16
  .describe("Show all containers (default: true, includes stopped)"),
17
+ compact: z
18
+ .boolean()
19
+ .optional()
20
+ .default(true)
21
+ .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
17
22
  },
18
23
  outputSchema: DockerPsSchema,
19
- }, async ({ all }) => {
24
+ }, async ({ all, compact }) => {
20
25
  const args = ["ps", "--format", "json", "--no-trunc"];
21
26
  if (all)
22
27
  args.push("-a");
23
28
  const result = await docker(args);
24
29
  const data = parsePsJson(result.stdout);
25
- return dualOutput(data, formatPs);
30
+ return compactDualOutput(data, result.stdout, formatPs, compactPsMap, formatPsCompact, compact === false);
26
31
  });
27
32
  }
28
33
  //# sourceMappingURL=ps.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"ps.js","sourceRoot":"","sources":["../../src/tools/ps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AAC/C,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AAChD,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,CAAC,YAAY,CACjB,IAAI,EACJ;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,mIAAmI;QACrI,WAAW,EAAE;YACX,GAAG,EAAE,CAAC;iBACH,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CAAC,uDAAuD,CAAC;SACrE;QACD,YAAY,EAAE,cAAc;KAC7B,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,EAAE,EAAE;QAChB,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACtD,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,UAAU,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAC;IACpC,CAAC,CACF,CAAC;AACJ,CAAC"}
1
+ {"version":3,"file":"ps.js","sourceRoot":"","sources":["../../src/tools/ps.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,MAAM,mBAAmB,CAAC;AACtD,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAC;AAChD,OAAO,EAAE,QAAQ,EAAE,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAC;AAC/E,OAAO,EAAE,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAErD,MAAM,UAAU,cAAc,CAAC,MAAiB;IAC9C,MAAM,CAAC,YAAY,CACjB,IAAI,EACJ;QACE,KAAK,EAAE,WAAW;QAClB,WAAW,EACT,mIAAmI;QACrI,WAAW,EAAE;YACX,GAAG,EAAE,CAAC;iBACH,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CAAC,uDAAuD,CAAC;YACpE,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,cAAc;KAC7B,EACD,KAAK,EAAE,EAAE,GAAG,EAAE,OAAO,EAAE,EAAE,EAAE;QACzB,MAAM,IAAI,GAAG,CAAC,IAAI,EAAE,UAAU,EAAE,MAAM,EAAE,YAAY,CAAC,CAAC;QACtD,IAAI,GAAG;YAAE,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACzB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,CAAC,CAAC;QAClC,MAAM,IAAI,GAAG,WAAW,CAAC,MAAM,CAAC,MAAM,CAAC,CAAC;QACxC,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,QAAQ,EACR,YAAY,EACZ,eAAe,EACf,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerPullTool(server: McpServer): void;
3
+ //# sourceMappingURL=pull.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.d.ts","sourceRoot":"","sources":["../../src/tools/pull.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAOzE,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,SAAS,QA0DjD"}
@@ -0,0 +1,50 @@
1
+ import { z } from "zod";
2
+ import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
+ import { docker } from "../lib/docker-runner.js";
4
+ import { parsePullOutput } from "../lib/parsers.js";
5
+ import { formatPull, compactPullMap, formatPullCompact } from "../lib/formatters.js";
6
+ import { DockerPullSchema } from "../schemas/index.js";
7
+ export function registerPullTool(server) {
8
+ server.registerTool("pull", {
9
+ title: "Docker Pull",
10
+ description: "Pulls a Docker image from a registry and returns structured result with digest info. Use instead of running `docker pull` in the terminal.",
11
+ inputSchema: {
12
+ image: z
13
+ .string()
14
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
15
+ .describe("Image to pull (e.g., nginx:latest, ubuntu:22.04)"),
16
+ platform: z
17
+ .string()
18
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
19
+ .optional()
20
+ .describe('Target platform (e.g., "linux/amd64", "linux/arm64")'),
21
+ path: z
22
+ .string()
23
+ .max(INPUT_LIMITS.PATH_MAX)
24
+ .optional()
25
+ .describe("Working directory (default: cwd)"),
26
+ compact: z
27
+ .boolean()
28
+ .optional()
29
+ .default(true)
30
+ .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
31
+ },
32
+ outputSchema: DockerPullSchema,
33
+ }, async ({ image, platform, path, compact }) => {
34
+ assertNoFlagInjection(image, "image");
35
+ if (platform)
36
+ assertNoFlagInjection(platform, "platform");
37
+ const args = ["pull"];
38
+ if (platform)
39
+ args.push("--platform", platform);
40
+ args.push(image);
41
+ const result = await docker(args, path);
42
+ if (result.exitCode !== 0) {
43
+ const errorMsg = result.stderr || result.stdout || "Unknown error";
44
+ throw new Error(`docker pull failed: ${errorMsg.trim()}`);
45
+ }
46
+ const data = parsePullOutput(result.stdout, result.stderr, result.exitCode, image);
47
+ return compactDualOutput(data, result.stdout, formatPull, compactPullMap, formatPullCompact, compact === false);
48
+ });
49
+ }
50
+ //# sourceMappingURL=pull.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pull.js","sourceRoot":"","sources":["../../src/tools/pull.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAExB,OAAO,EAAE,iBAAiB,EAAE,qBAAqB,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAC3F,OAAO,EAAE,MAAM,EAAE,MAAM,yBAAyB,CAAC;AACjD,OAAO,EAAE,eAAe,EAAE,MAAM,mBAAmB,CAAC;AACpD,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACrF,OAAO,EAAE,gBAAgB,EAAE,MAAM,qBAAqB,CAAC;AAEvD,MAAM,UAAU,gBAAgB,CAAC,MAAiB;IAChD,MAAM,CAAC,YAAY,CACjB,MAAM,EACN;QACE,KAAK,EAAE,aAAa;QACpB,WAAW,EACT,4IAA4I;QAC9I,WAAW,EAAE;YACX,KAAK,EAAE,CAAC;iBACL,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,CAAC,kDAAkD,CAAC;YAC/D,QAAQ,EAAE,CAAC;iBACR,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,gBAAgB,CAAC;iBAClC,QAAQ,EAAE;iBACV,QAAQ,CAAC,sDAAsD,CAAC;YACnE,IAAI,EAAE,CAAC;iBACJ,MAAM,EAAE;iBACR,GAAG,CAAC,YAAY,CAAC,QAAQ,CAAC;iBAC1B,QAAQ,EAAE;iBACV,QAAQ,CAAC,kCAAkC,CAAC;YAC/C,OAAO,EAAE,CAAC;iBACP,OAAO,EAAE;iBACT,QAAQ,EAAE;iBACV,OAAO,CAAC,IAAI,CAAC;iBACb,QAAQ,CACP,kGAAkG,CACnG;SACJ;QACD,YAAY,EAAE,gBAAgB;KAC/B,EACD,KAAK,EAAE,EAAE,KAAK,EAAE,QAAQ,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE,EAAE;QAC3C,qBAAqB,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;QACtC,IAAI,QAAQ;YAAE,qBAAqB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC;QAE1D,MAAM,IAAI,GAAG,CAAC,MAAM,CAAC,CAAC;QACtB,IAAI,QAAQ;YAAE,IAAI,CAAC,IAAI,CAAC,YAAY,EAAE,QAAQ,CAAC,CAAC;QAChD,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAEjB,MAAM,MAAM,GAAG,MAAM,MAAM,CAAC,IAAI,EAAE,IAAI,CAAC,CAAC;QAExC,IAAI,MAAM,CAAC,QAAQ,KAAK,CAAC,EAAE,CAAC;YAC1B,MAAM,QAAQ,GAAG,MAAM,CAAC,MAAM,IAAI,MAAM,CAAC,MAAM,IAAI,eAAe,CAAC;YACnE,MAAM,IAAI,KAAK,CAAC,uBAAuB,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;QAED,MAAM,IAAI,GAAG,eAAe,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,QAAQ,EAAE,KAAK,CAAC,CAAC;QACnF,OAAO,iBAAiB,CACtB,IAAI,EACJ,MAAM,CAAC,MAAM,EACb,UAAU,EACV,cAAc,EACd,iBAAiB,EACjB,OAAO,KAAK,KAAK,CAClB,CAAC;IACJ,CAAC,CACF,CAAC;AACJ,CAAC"}
@@ -0,0 +1,3 @@
1
+ import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function registerRunTool(server: McpServer): void;
3
+ //# sourceMappingURL=run.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"run.d.ts","sourceRoot":"","sources":["../../src/tools/run.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yCAAyC,CAAC;AAQzE,wBAAgB,eAAe,CAAC,MAAM,EAAE,SAAS,QA+GhD"}
@@ -0,0 +1,106 @@
1
+ import { z } from "zod";
2
+ import { compactDualOutput, assertNoFlagInjection, INPUT_LIMITS } from "@paretools/shared";
3
+ import { docker } from "../lib/docker-runner.js";
4
+ import { parseRunOutput } from "../lib/parsers.js";
5
+ import { formatRun, compactRunMap, formatRunCompact } from "../lib/formatters.js";
6
+ import { DockerRunSchema } from "../schemas/index.js";
7
+ import { assertValidPortMapping, assertSafeVolumeMount } from "../lib/validation.js";
8
+ export function registerRunTool(server) {
9
+ server.registerTool("run", {
10
+ title: "Docker Run",
11
+ description: "Runs a Docker container from an image and returns structured container ID and status. Use instead of running `docker run` in the terminal.",
12
+ inputSchema: {
13
+ image: z
14
+ .string()
15
+ .max(INPUT_LIMITS.SHORT_STRING_MAX)
16
+ .describe("Docker image to run (e.g., nginx:latest)"),
17
+ name: z.string().max(INPUT_LIMITS.SHORT_STRING_MAX).optional().describe("Container name"),
18
+ ports: z
19
+ .array(z.string().max(INPUT_LIMITS.SHORT_STRING_MAX))
20
+ .max(INPUT_LIMITS.ARRAY_MAX)
21
+ .optional()
22
+ .default([])
23
+ .describe('Port mappings (e.g., ["8080:80", "443:443"])'),
24
+ volumes: z
25
+ .array(z.string().max(INPUT_LIMITS.PATH_MAX))
26
+ .max(INPUT_LIMITS.ARRAY_MAX)
27
+ .optional()
28
+ .default([])
29
+ .describe('Volume mounts (e.g., ["/host/path:/container/path"])'),
30
+ env: z
31
+ .array(z.string().max(INPUT_LIMITS.STRING_MAX))
32
+ .max(INPUT_LIMITS.ARRAY_MAX)
33
+ .optional()
34
+ .default([])
35
+ .describe('Environment variables (e.g., ["KEY=VALUE"])'),
36
+ detach: z
37
+ .boolean()
38
+ .optional()
39
+ .default(true)
40
+ .describe("Run container in background (default: true)"),
41
+ rm: z
42
+ .boolean()
43
+ .optional()
44
+ .default(false)
45
+ .describe("Remove container after exit (default: false)"),
46
+ command: z
47
+ .array(z.string().max(INPUT_LIMITS.STRING_MAX))
48
+ .max(INPUT_LIMITS.ARRAY_MAX)
49
+ .optional()
50
+ .default([])
51
+ .describe("Command to run in the container"),
52
+ path: z
53
+ .string()
54
+ .max(INPUT_LIMITS.PATH_MAX)
55
+ .optional()
56
+ .describe("Working directory (default: cwd)"),
57
+ compact: z
58
+ .boolean()
59
+ .optional()
60
+ .default(true)
61
+ .describe("Auto-compact when structured output exceeds raw CLI tokens. Set false to always get full schema."),
62
+ },
63
+ outputSchema: DockerRunSchema,
64
+ }, async ({ image, name, ports, volumes, env, detach, rm, command, path, compact }) => {
65
+ assertNoFlagInjection(image, "image");
66
+ if (name)
67
+ assertNoFlagInjection(name, "name");
68
+ // Validate first element of command array (the binary name) to prevent flag injection.
69
+ // Subsequent elements are intentionally unchecked as they are arguments to the command itself.
70
+ if (command && command.length > 0) {
71
+ assertNoFlagInjection(command[0], "command");
72
+ }
73
+ const args = ["run"];
74
+ if (detach)
75
+ args.push("-d");
76
+ if (rm)
77
+ args.push("--rm");
78
+ if (name)
79
+ args.push("--name", name);
80
+ for (const p of ports ?? []) {
81
+ assertValidPortMapping(p);
82
+ args.push("-p", p);
83
+ }
84
+ for (const v of volumes ?? []) {
85
+ assertNoFlagInjection(v, "volumes");
86
+ assertSafeVolumeMount(v);
87
+ args.push("-v", v);
88
+ }
89
+ for (const e of env ?? []) {
90
+ assertNoFlagInjection(e, "env");
91
+ args.push("-e", e);
92
+ }
93
+ args.push(image);
94
+ if (command && command.length > 0) {
95
+ args.push(...command);
96
+ }
97
+ const result = await docker(args, path);
98
+ if (result.exitCode !== 0) {
99
+ const errorMsg = result.stderr || result.stdout || "Unknown error";
100
+ throw new Error(`docker run failed: ${errorMsg.trim()}`);
101
+ }
102
+ const data = parseRunOutput(result.stdout, image, detach ?? true, name);
103
+ return compactDualOutput(data, result.stdout, formatRun, compactRunMap, formatRunCompact, compact === false);
104
+ });
105
+ }
106
+ //# sourceMappingURL=run.js.map