From 81d4b680b3b8292ad0195b36911a39951a0c28cf Mon Sep 17 00:00:00 2001 From: Dan Barr <6922515+danbarr@users.noreply.github.com> Date: Thu, 27 Nov 2025 22:16:48 -0500 Subject: [PATCH] feat: add support for build args in spec.yaml files --- README.md | 17 +++++++++++++++++ cmd/dockhand/main.go | 9 +++++---- docs/packaging.md | 3 +++ 3 files changed, 25 insertions(+), 4 deletions(-) diff --git a/README.md b/README.md index 9d622e5..dec242f 100644 --- a/README.md +++ b/README.md @@ -59,6 +59,9 @@ metadata: spec: package: "your-package-name" # Required: Package name from registry version: "1.0.0" # Required: Specific version to build + args: # Optional: Additional arguments for the package + - "arg1" # Arguments are passed to the entrypoint + - "arg2" provenance: # Optional but recommended repository_uri: "https://github.com/user/repo" # Expected source repository (used for verification) @@ -97,12 +100,26 @@ metadata: spec: package: "@your-org/mcp-server" # NPM package name version: "2.1.0" + args: # Optional: Add required CLI arguments + - "start" # For packages that need specific commands provenance: repository_uri: "https://github.com/your-org/mcp-server" repository_ref: "refs/tags/v2.1.0" ``` +**Real-world example** (LaunchDarkly MCP server): +```yaml +# Some packages require specific CLI arguments to run +# These are baked into the container entrypoint +spec: + package: "@launchdarkly/mcp-server" + version: "0.4.2" + args: + - "start" # Required by LaunchDarkly's CLI +# Results in: ENTRYPOINT ["npx", "@launchdarkly/mcp-server", "start"] +``` + #### UVX (Python) Example Directory structure: diff --git a/cmd/dockhand/main.go b/cmd/dockhand/main.go index 4910dd3..24a7cf5 100644 --- a/cmd/dockhand/main.go +++ b/cmd/dockhand/main.go @@ -39,8 +39,9 @@ type MCPServerMetadata struct { // MCPServerPackageSpec defines the package to be containerized type MCPServerPackageSpec struct { - Package string `yaml:"package"` // e.g., "@upstash/context7-mcp" - Version string `yaml:"version,omitempty"` // e.g., "1.0.14" + Package string `yaml:"package"` // e.g., "@upstash/context7-mcp" + Version string `yaml:"version,omitempty"` // e.g., "1.0.14" + Args []string `yaml:"args,omitempty"` // Additional arguments for the package } // MCPServerProvenance contains supply chain provenance information @@ -319,8 +320,8 @@ func generateDockerfile(ctx context.Context, spec *MCPServerSpec, customTag stri protocolScheme, "", // caCertPath - empty for now imageTag, - []string{}, // extraArgs - true, // always dryRun to generate Dockerfile + spec.Spec.Args, // Pass args from spec if present + true, // always dryRun to generate Dockerfile ) if err != nil { return "", fmt.Errorf("failed to generate Dockerfile for protocol scheme %s: %w", protocolScheme, err) diff --git a/docs/packaging.md b/docs/packaging.md index 51d36b9..1afc44f 100644 --- a/docs/packaging.md +++ b/docs/packaging.md @@ -28,6 +28,9 @@ metadata: spec: package: "{package-identifier}" # PyPI/npm name or Go module version: "{exact-version}" + args: # Optional: CLI arguments for the package + - "{arg1}" # Passed to the entrypoint command + - "{arg2}" provenance: repository_uri: "{github-url}"