Quickstart on Kind¶
Run Kavrynt 0.0.2-beta.1 in a disposable local Kind cluster, register an MCP
server, and route a request through the Gateway. No source access is needed:
everything comes from published container images and the Helm chart.
Time: about 10 minutes.
Beta
0.0.2-beta.1 is for evaluation in trusted clusters. The Gateway does not
authenticate clients or enforce policy yet. See
Current limitations.
Prerequisites¶
docker version --format '{{.Server.Version}}'
kind version
kubectl version --client
helm version --short
1. Create a cluster¶
kind create cluster --name kavrynt-trial
kubectl config current-context
Expected: kind-kavrynt-trial.
2. Install Kavrynt¶
export KAVRYNT_VERSION=0.0.2-beta.1
helm upgrade --install kavrynt oci://registry-1.docker.io/kavrynt/kavrynt \
--version "$KAVRYNT_VERSION" \
--namespace kavrynt-system \
--create-namespace \
--wait --timeout 3m
The chart installs the MCPServer CRD, the Operator, and the Gateway, pulling
docker.io/kavrynt/gateway and docker.io/kavrynt/operator at the same
version.
Check the runtime:
kubectl get deployments -n kavrynt-system
kubectl get crd mcpservers.kavrynt.io
Expected:
NAME READY UP-TO-DATE AVAILABLE
kavrynt-gateway 1/1 1 1
kavrynt-operator 1/1 1 1
3. Deploy a test backend¶
This echo server proves routing. It is not an MCP implementation; any MCP server that speaks Streamable HTTP works the same way.
kubectl create deployment example-mcp-server \
--image=hashicorp/http-echo:1.0 \
-- /http-echo -listen=:8080 -text='{"mock":true,"service":"example-mcp-server"}'
kubectl expose deployment example-mcp-server --port=8080 --target-port=8080
kubectl rollout status deployment/example-mcp-server --timeout=120s
4. Register it as an MCPServer¶
kubectl apply -f - <<'EOF'
apiVersion: kavrynt.io/v1alpha1
kind: MCPServer
metadata:
name: example-mcp-server
namespace: default
spec:
version: 0.1.0
transport: http
endpoint: http://example-mcp-server.default.svc.cluster.local:8080
EOF
kubectl wait mcpserver/example-mcp-server --for=condition=Ready --timeout=60s
kubectl get mcpservers
Expected:
NAME TRANSPORT VERSION READY AGE
example-mcp-server http 0.1.0 True 5s
5. Route a request through the Gateway¶
kubectl port-forward -n kavrynt-system svc/kavrynt-gateway 18080:8080 >/tmp/kavrynt-gateway.log 2>&1 &
GATEWAY_PF=$!
sleep 3
curl -fsS http://127.0.0.1:18080/v1/routes
curl -fsS -X POST http://127.0.0.1:18080/mcp/default.example-mcp-server \
-H 'Content-Type: application/json' \
--data '{"jsonrpc":"2.0","id":1,"method":"tools/list","params":{}}'
Expected route list (abridged) and proxied response:
{"routes":[{"name":"default.example-mcp-server","version":"0.1.0","transport":"http",...}]}
{"mock":true,"service":"example-mcp-server"}
Routes are namespace-qualified: /mcp/<namespace>.<name>.
6. Remove the server¶
kubectl delete mcpserver example-mcp-server
sleep 2
curl -fsS http://127.0.0.1:18080/v1/routes
kill "$GATEWAY_PF"
Expected: {"routes":[]}.
Clean up¶
kind delete cluster --name kavrynt-trial