Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
17 changes: 17 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down Expand Up @@ -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:
Expand Down
9 changes: 5 additions & 4 deletions cmd/dockhand/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down
3 changes: 3 additions & 0 deletions docs/packaging.md
Original file line number Diff line number Diff line change
Expand Up @@ -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}"
Expand Down
Loading