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
2 changes: 1 addition & 1 deletion pkg/container/templates/go.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -99,4 +99,4 @@ COPY --from=builder --chown=appuser:appgroup /build/ /app/
USER appuser

# Run the pre-built MCP server binary
ENTRYPOINT ["/app/mcp-server"{{range .MCPArgs}}, "{{.}}"{{end}}]
ENTRYPOINT ["/app/mcp-server"]
2 changes: 1 addition & 1 deletion pkg/container/templates/npx.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -98,7 +98,7 @@ USER appuser
# `MCPPackage` may include a version suffix (e.g., `package@1.2.3`), which we cannot use here.
# Create a small wrapper script to handle this.
RUN echo "#!/bin/sh" >> entrypoint.sh && \
echo "exec npx $(echo {{.MCPPackage}} | sed 's/@[^@/]*$//'){{range .MCPArgs}}, "{{.}}"{{end}}" >> entrypoint.sh && \
echo "exec npx {{.MCPPackage}} \"\$@\"" >> entrypoint.sh && \
chmod +x entrypoint.sh

# Run the preinstalled MCP package directly using npx.
Expand Down
2 changes: 0 additions & 2 deletions pkg/container/templates/templates.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,8 +16,6 @@ var templateFS embed.FS
type TemplateData struct {
// MCPPackage is the name of the MCP package to run.
MCPPackage string
// MCPArgs are the arguments to pass to the MCP package.
MCPArgs []string
// CACertContent is the content of the custom CA certificate to include in the image.
CACertContent string
// IsLocalPath indicates if the MCPPackage is a local path that should be copied into the container.
Expand Down
23 changes: 7 additions & 16 deletions pkg/container/templates/templates_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,6 @@ func TestGetDockerfileTemplate(t *testing.T) {
transportType: TransportTypeUVX,
data: TemplateData{
MCPPackage: "example-package",
MCPArgs: []string{"--arg1", "--arg2", "value"},
},
wantContains: []string{
"FROM python:",
Expand All @@ -31,7 +30,7 @@ func TestGetDockerfileTemplate(t *testing.T) {
"package_spec=$(echo \"$package\" | sed 's/@/==/')",
"uv tool install \"$package_spec\"",
"COPY --from=builder --chown=appuser:appgroup /opt/uv-tools /opt/uv-tools",
"ENTRYPOINT [\"sh\", \"-c\", \"package='example-package'; exec \\\"${package%%@*}\\\" \\\"--arg1\\\" \\\"--arg2\\\" \\\"value\\\" \\\"$@\\\"\", \"--\"]",
"ENTRYPOINT [\"sh\", \"-c\", \"package='example-package'; exec \\\"${package%%@*}\\\"\", \"--\"]",
},
wantMatches: []string{
`FROM python:\d+\.\d+-slim AS builder`, // Match builder stage
Expand All @@ -48,7 +47,6 @@ func TestGetDockerfileTemplate(t *testing.T) {
transportType: TransportTypeUVX,
data: TemplateData{
MCPPackage: "example-package",
MCPArgs: []string{"--arg1", "--arg2", "value"},
CACertContent: "-----BEGIN CERTIFICATE-----\nMIICertificateContent\n-----END CERTIFICATE-----",
},
wantContains: []string{
Expand All @@ -58,7 +56,7 @@ func TestGetDockerfileTemplate(t *testing.T) {
"package_spec=$(echo \"$package\" | sed 's/@/==/')",
"uv tool install \"$package_spec\"",
"COPY --from=builder --chown=appuser:appgroup /opt/uv-tools /opt/uv-tools",
"ENTRYPOINT [\"sh\", \"-c\", \"package='example-package'; exec \\\"${package%%@*}\\\" \\\"--arg1\\\" \\\"--arg2\\\" \\\"value\\\" \\\"$@\\\"\", \"--\"]",
"ENTRYPOINT [\"sh\", \"-c\", \"package='example-package'; exec \\\"${package%%@*}\\\"\", \"--\"]",
"Add custom CA certificate BEFORE any network operations",
"COPY ca-cert.crt /tmp/custom-ca.crt",
"cat /tmp/custom-ca.crt >> /etc/ssl/certs/ca-certificates.crt",
Expand All @@ -76,13 +74,12 @@ func TestGetDockerfileTemplate(t *testing.T) {
transportType: TransportTypeNPX,
data: TemplateData{
MCPPackage: "example-package",
MCPArgs: []string{"--arg1", "--arg2", "value"},
},
wantContains: []string{
"FROM node:",
"npm install --save example-package",
"COPY --from=builder --chown=appuser:appgroup /build/node_modules /app/node_modules",
"echo \"exec npx $(echo example-package | sed 's/@[^@/]*$//'), \"--arg1\", \"--arg2\", \"value\"\" >> entrypoint.sh",
"echo \"exec npx example-package \\\"\\$@\\\"\" >> entrypoint.sh",
"ENTRYPOINT [\"./entrypoint.sh\"]",
},
wantMatches: []string{
Expand All @@ -100,13 +97,12 @@ func TestGetDockerfileTemplate(t *testing.T) {
transportType: TransportTypeNPX,
data: TemplateData{
MCPPackage: "example-package",
MCPArgs: []string{"--arg1", "--arg2", "value"},
CACertContent: "-----BEGIN CERTIFICATE-----\nMIICertificateContent\n-----END CERTIFICATE-----",
},
wantContains: []string{
"FROM node:",
"npm install --save example-package",
"echo \"exec npx $(echo example-package | sed 's/@[^@/]*$//'), \"--arg1\", \"--arg2\", \"value\"\" >> entrypoint.sh",
"echo \"exec npx example-package \\\"\\$@\\\"\" >> entrypoint.sh",
"ENTRYPOINT [\"./entrypoint.sh\"]",
"Add custom CA certificate BEFORE any network operations",
"COPY ca-cert.crt /tmp/custom-ca.crt",
Expand All @@ -125,7 +121,6 @@ func TestGetDockerfileTemplate(t *testing.T) {
transportType: TransportTypeGO,
data: TemplateData{
MCPPackage: "example-package",
MCPArgs: []string{"--arg1", "--arg2", "value"},
},
wantContains: []string{
"FROM golang:",
Expand All @@ -134,7 +129,7 @@ func TestGetDockerfileTemplate(t *testing.T) {
"go install \"$package\"",
"FROM alpine:",
"COPY --from=builder --chown=appuser:appgroup /app/mcp-server /app/mcp-server",
"ENTRYPOINT [\"/app/mcp-server\", \"--arg1\", \"--arg2\", \"value\"]",
"ENTRYPOINT [\"/app/mcp-server\"]",
},
wantMatches: []string{
`FROM golang:\d+\.\d+-alpine AS builder`, // Match builder stage
Expand All @@ -151,7 +146,6 @@ func TestGetDockerfileTemplate(t *testing.T) {
transportType: TransportTypeGO,
data: TemplateData{
MCPPackage: "example-package",
MCPArgs: []string{"--arg1", "--arg2", "value"},
CACertContent: "-----BEGIN CERTIFICATE-----\nMIICertificateContent\n-----END CERTIFICATE-----",
},
wantContains: []string{
Expand All @@ -160,7 +154,7 @@ func TestGetDockerfileTemplate(t *testing.T) {
"package=\"${package}@latest\"",
"go install \"$package\"",
"FROM alpine:",
"ENTRYPOINT [\"/app/mcp-server\", \"--arg1\", \"--arg2\", \"value\"]",
"ENTRYPOINT [\"/app/mcp-server\"]",
"Add custom CA certificate BEFORE any network operations",
"COPY ca-cert.crt /tmp/custom-ca.crt",
"cat /tmp/custom-ca.crt >> /etc/ssl/certs/ca-certificates.crt",
Expand All @@ -178,7 +172,6 @@ func TestGetDockerfileTemplate(t *testing.T) {
transportType: TransportTypeGO,
data: TemplateData{
MCPPackage: "./cmd/server",
MCPArgs: []string{"--arg1", "value"},
IsLocalPath: true,
},
wantContains: []string{
Expand All @@ -188,7 +181,7 @@ func TestGetDockerfileTemplate(t *testing.T) {
"FROM alpine:",
"COPY --from=builder --chown=appuser:appgroup /app/mcp-server /app/mcp-server",
"COPY --from=builder --chown=appuser:appgroup /build/ /app/",
"ENTRYPOINT [\"/app/mcp-server\", \"--arg1\", \"value\"]",
"ENTRYPOINT [\"/app/mcp-server\"]",
},
wantMatches: []string{
`FROM golang:\d+\.\d+-alpine AS builder`, // Match builder stage
Expand All @@ -204,7 +197,6 @@ func TestGetDockerfileTemplate(t *testing.T) {
transportType: TransportTypeGO,
data: TemplateData{
MCPPackage: ".",
MCPArgs: []string{},
IsLocalPath: true,
},
wantContains: []string{
Expand All @@ -229,7 +221,6 @@ func TestGetDockerfileTemplate(t *testing.T) {
transportType: "unsupported",
data: TemplateData{
MCPPackage: "example-package",
MCPArgs: []string{"--arg1", "--arg2", "value"},
},
wantContains: nil,
wantNotContains: nil,
Expand Down
2 changes: 1 addition & 1 deletion pkg/container/templates/uvx.tmpl
Original file line number Diff line number Diff line change
Expand Up @@ -118,4 +118,4 @@ USER appuser
# We use sh -c to allow the package name to be resolved from PATH
# Strip version specifier (if present) from package name for execution
# Handles format like package@version
ENTRYPOINT ["sh", "-c", "package='{{.MCPPackage}}'; exec \"${package%%@*}\" {{range .MCPArgs}}\"{{.}}\" {{end}}\"$@\"", "--"]
ENTRYPOINT ["sh", "-c", "package='{{.MCPPackage}}'; exec \"${package%%@*}\"", "--"]
1 change: 0 additions & 1 deletion pkg/runner/protocol.go
Original file line number Diff line number Diff line change
Expand Up @@ -91,7 +91,6 @@ func createTemplateData(transportType templates.TransportType, packageName, caCe

templateData := templates.TemplateData{
MCPPackage: packageName,
MCPArgs: []string{}, // No additional arguments for now
IsLocalPath: isLocalPath,
}

Expand Down
4 changes: 0 additions & 4 deletions pkg/runner/protocol_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -188,7 +188,6 @@ func TestTemplateDataWithLocalPath(t *testing.T) {
packageName: "github.com/example/package",
expected: templates.TemplateData{
MCPPackage: "github.com/example/package",
MCPArgs: []string{},
IsLocalPath: false,
},
},
Expand All @@ -197,7 +196,6 @@ func TestTemplateDataWithLocalPath(t *testing.T) {
packageName: "./cmd/server",
expected: templates.TemplateData{
MCPPackage: "./cmd/server",
MCPArgs: []string{},
IsLocalPath: true,
},
},
Expand All @@ -206,7 +204,6 @@ func TestTemplateDataWithLocalPath(t *testing.T) {
packageName: ".",
expected: templates.TemplateData{
MCPPackage: ".",
MCPArgs: []string{},
IsLocalPath: true,
},
},
Expand All @@ -220,7 +217,6 @@ func TestTemplateDataWithLocalPath(t *testing.T) {

templateData := templates.TemplateData{
MCPPackage: tt.packageName,
MCPArgs: []string{},
IsLocalPath: isLocalPath,
}

Expand Down
Loading