CAT
/MCP
SkillsMCPMarketplacesDigestToolsAdvertise

This week in Claude

Every Monday: Claude Code, Agent SDK, MCP, and the Anthropic platform moves worth your time.

Skills by Category
Frontend DevelopmentBackend & APIsTesting & QASecurityDevOps & CI/CDGit & Pull RequestsDocumentationCode Review & QualityAI & Agent BuildingSkill Development
MCP Servers by Category
Sales & MarketingWeb & Browser AutomationDatabasesAI & LLM ToolsCloud & InfrastructureCommunication & MessagingDeveloper ToolsDesign & CreativeDocuments & KnowledgeSearch & Web Crawling
Marketplaces by Category
AI Agents & OrchestrationLLM IntegrationDevelopment ToolsFrontend & UIBackend & APIsDatabasesTesting & Code QualityDevOps & CloudSecurity & ComplianceGit & Version Control

Cross AI Tools

Discover Claude Code plugins, extensions, and tools. Automatically updated directory of Anthropic Claude AI marketplaces with development tools, productivity plugins, and integrations.

Resources

  • Browse Skills
  • Browse MCP Servers
  • Browse Marketplaces
  • Plugins Reference

Community

  • About
  • Tools
  • Feedback
  • Privacy Policy
  • Advertise

Built for the Claude Code community with Claude Code by @mertduzgun

Independent project, not affiliated with Anthropic

No Crd

nogoo9/no-crd
1authSTDIOregistry active
Summary

Gives Claude the ability to spawn ephemeral Kubernetes pods on demand and proxy traffic to them without needing CRDs or cluster operators. It wraps the Kubernetes API with MCP tools for creating pods from ConfigMap templates, managing workspace lifecycles, and routing HTTP requests to running containers. Built with a reverse proxy that handles session cookies and token validation, plus a web UI for browsing workspace files. The main use case is letting AI agents provision isolated sandbox environments for code execution, data processing, or interactive sessions. Works across Node, Bun, and Deno runtimes. Handles the certificate plumbing so Bun and Deno can authenticate against Kubernetes clusters without manual TLS configuration.

CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →

@nogoo9/no-crd

nogoo9 logo

no-crd Dashboard

Agent-Driven, On-Demand Pod Orchestration in Kubernetes — Without Custom Resource Definitions.

npm version npm downloads Documentation License Coverage Status OpenSSF Scorecard Semgrep

Model Context Protocol Built with Antigravity Powered by Gemini

Bun Deno Node.js

@nogoo9/no-crd is a lightweight, cross-runtime Model Context Protocol (MCP) server that empowers AI agents and APIs to dynamically spawn, route to, and manage ephemeral containerized sandboxes on standard Kubernetes (k8s/k3s) clusters — without requiring Custom Resource Definitions (CRDs), cluster-level operators, or elevated RBAC permissions.

It provides JupyterHub-like dynamic pod lifecycle management but is completely agnostic to actual workloads and supports multi-runtime execution under Bun, Deno, and Node.js.

📚 For detailed guides, API reference, and configuration options, visit the public Documentation Website or access the built-in documentation served directly at /docs/ (e.g. http://localhost:3000/docs/) when running the server.


🗺️ Choose Your Path

To get started with @nogoo9/no-crd, select the track that matches your goals:

  • Track A: AI Agent & MCP Users $\rightarrow$ MCP Client Setup Guide
    • Best for: Connecting no-crd to Cursor, Claude Desktop, Cline, or Roo Code to let your agent manage pods.
  • Track B: Platform & Service Deployers $\rightarrow$ SSO & Routing Deployment Guide
    • Best for: Deploying a multi-tenant sandbox service in your Kubernetes cluster with Keycloak OIDC, stateless cookies, and reverse proxy routing.
  • Track C: SDK & Code Contributors $\rightarrow$ SDK & Contributor Guide
    • Best for: Programmatically controlling pods via the TypeScript SDK or contributing to the core runtime codebase.

🚀 Key Features

  • No CRDs Required: Runs directly against core Kubernetes resources (Pods, ConfigMaps, ServiceAccounts). Highly portable, secure, and compatible with restricted/managed environments (EKS, GKE, K3s).
  • Agent Sandbox Spawner: Specialized spawner tools that automate workspace provisioning with context validation, init containers, IAM roles, pre-stop hooks, and lifecycle sync.
  • ConfigMap-Based Templates: Store, version, and load reusable pod templates stored as standard Kubernetes ConfigMaps.
  • Local Filesystem Templates: Bake YAML/JSON pod templates into Docker images or mount them from host paths — with built-in defaults shipped in the package.
  • Isomorphic Multi-Runtime SDK: Imports seamlessly as a composable programmatic SDK or MCP server running under Node.js, Bun, or Deno.
  • Workspace Routing Proxy (Experimental): Built-in reverse proxy routing that dynamically pipes traffic to running container IPs with secure user token ownership verification, path-scoped session cookies (nocr_token and nocr_sess), and automatic HMAC-signed session management for short-lived token resilience.
  • Experimental JWT Authentication: Built-in OAuth token validation engine supporting HS256, RS256, ES256, JWKS endpoints, and OAuth 2.0 Token Introspection (RFC 7662).
  • Embedded Web UI App: Exposes an interactive web-based Pod Manager interface featuring a light/dark theme toggle, client-side PKCE OIDC login with proactive silent token refresh, and workspace file preview rendering (supporting HTML sandboxed iframes and custom Markdown rendering).

⚡ Quick Start

Run Standalone via NPX (No Installation)

# Option 1: Start HTTP/SSE server on port 3000
npx @nogoo9/no-crd --transport http --port 3000

# Option 2: Run over standard input/output (stdio) for local IDE agents
npx @nogoo9/no-crd --transport stdio --mode cluster

Install Globally

npm install -g @nogoo9/no-crd
nocrd9 --transport stdio --mode cluster

Run via Docker

docker run -d -p 3000:3000 \
  -v "$HOME/.kube/config:/app/.kube/config:ro" \
  -e KUBECONFIG=/app/.kube/config \
  ghcr.io/nogoo9/no-crd:latest

⚙️ Configuration & Environment Variables

The server and command-line utility are configurable using CLI options or environment variables. Below is the quick reference table of all settings:

🔌 Server Configuration

CLI OptionEnvironment VariableDefaultAllowed ValuesDescription
-t, --transportTRANSPORThttphttp, stdio, bothServer transport mode. both fires up both transports simultaneously.
-p, --portPORT3000NumberHTTP server port for SSE transport.
-H, --hostHOST0.0.0.0StringHost interface to bind the HTTP/SSE server to.
--base-urlBASE_URL""Path stringBase URL path prefix for hosting behind a reverse proxy (e.g. /gateway/no-crd).
-STATELESSfalsetrue, falseEnable stateless request handling (no session affinity).
-l, --log-levelLOG_LEVELinfodebug, info, warning, error, fatalLogging verbosity filter.
-LOG_FILEnogoo9-mcp.logStringOutput file path for file logging.
-RATE_LIMIT_MAX100NumberMaximum requests allowed per window for rate limited routes.
-RATE_LIMIT_WINDOW60000NumberTime window in milliseconds for rate limited routes.
--proxy-timeoutPROXY_TIMEOUT120000NumberTimeout in milliseconds for the routing proxy upstream requests.
--proxy-keep-alivePROXY_KEEP_ALIVEtruetrue, falseEnable TCP keep-alive for the routing proxy upstream requests.

🔒 TLS Configuration

CLI OptionEnvironment VariableDefaultAllowed ValuesDescription
--tls-certTLS_CERT-Path stringPath to TLS certificate file to enable HTTPS.
--tls-keyTLS_KEY-Path stringPath to TLS private key file to enable HTTPS.
--tls-caTLS_CA-Path stringPath to TLS CA certificate file for HTTPS client/verification.
-NODE_TLS_REJECT_UNAUTHORIZEDtrue0 (false), 1 (true)Set to 0 to bypass TLS verification (for development/testing only).

🌐 CORS Configuration

CLI OptionEnvironment VariableDefaultAllowed ValuesDescription
--cors-originCORS_ALLOWED_ORIGIN, CORS_ORIGIN*StringCORS Allowed Origin header.
--cors-methodsCORS_ALLOWED_METHODS, CORS_METHODSGET, POST, OPTIONSStringCORS Allowed Methods header.
--cors-headersCORS_ALLOWED_HEADERS, CORS_HEADERSContent-Type, Authorization, mcp-protocol-version, mcp-session-idStringCORS Allowed Headers header.
--cors-allow-credentialsCORS_ALLOW_CREDENTIALS, CORS_CREDENTIALSfalsetrue, falseEnable CORS Access-Control-Allow-Credentials header.
--cors-expose-headersCORS_EXPOSED_HEADERS, CORS_EXPOSEDmcp-session-id, x-refreshed-tokenStringCustom CORS Access-Control-Expose-Headers header.
--cors-max-ageCORS_MAX_AGE-NumberCustom CORS Access-Control-Max-Age header in seconds.

☸️ Kubernetes Configuration

CLI OptionEnvironment VariableDefaultAllowed ValuesDescription
-m, --modeMODEclustercluster, namespacedKubernetes access scope. namespaced locks operations to a single namespace.
-n, --namespaceNAMESPACE, DEFAULT_NAMESPACEnogoo9StringDefault Kubernetes namespace for operations.
--disable-permission-checksDISABLE_PERMISSION_CHECKSfalsetrue, falseDisable Kubernetes RBAC permission checks and assume all tools are enabled.
--managed-onlyMANAGED_ONLYtruetrue, falseWhen true, pod tools only operate on pods managed by this server (nogoo9/managed-by label). No one bypasses this, not even admins. See ADR-008.
--default-workspace-portDEFAULT_WORKSPACE_PORT-NumberDefault target port inside the workspace pods to proxy traffic to.
-REGISTRY_URL-URL stringTarget container registry URL to query for images (e.g. http://localhost:5001).
-TEMPLATES_DIR-Path stringPath to local directory containing pod template files (YAML/JSON). See ADR-001.
-BUILTIN_TEMPLATEStruetrue, falseSet to false to disable built-in templates shipped with the package.

🔑 Authentication Configuration

CLI OptionEnvironment VariableDefaultAllowed ValuesDescription
--auth-enabledAUTH_ENABLEDfalsetrue, falseEnables JWT token authentication on MCP tools and route proxy.
-JWT_VERIFICATION_REQUIREDtruetrue, falseEnable/disable JWT signature verification (signature checks).
-JWT_SECRET-StringSymmetric HMAC-SHA256 secret for token verification.
-JWT_PUBLIC_KEY-StringPEM encoded RSA/ECDSA public key for asymmetric token verification.
-JWKS_URI-URL stringRemote JWKS endpoint URL to dynamically retrieve verification keys.
-INTROSPECTION_ENDPOINT, JWT_INTROSPECTION_ENDPOINT-URL stringEndpoint for token introspection/validation.
-OAUTH_CLIENT_ID-StringOAuth client ID for auth configuration.
-OAUTH_CLIENT_SECRET-StringOAuth client secret for auth configuration.
-JWT_AUDIENCE-StringExpected token audience. Falls back to OAUTH_CLIENT_ID if set.
-AUTH_ISSUER, JWT_ISSUER""URL stringIdentifier URL for the Authorization Server advertised in metadata discovery.
-AUTH_SUB_JSONPATH$.subJSONPathPayload path to extract unique user identity from JWT payload.
--auth-scope-jsonpathAUTH_SCOPE_JSONPATH$.scopeJSONPathPayload path to extract scopes claim from JWT payload.
--auth-roles-jsonpathAUTH_ROLES_JSONPATH, AUTH_ADMIN_JSONPATH$.realm_access.rolesJSONPathPayload path to extract user roles from JWT payload.
-AUTH_ADMIN_ROLEadminStringRole name signifying administrator access.
--auth-required-read-scopeAUTH_REQUIRED_READ_SCOPEnogoo9:readStringOAuth scope required for read operations. If not set, read scope check is bypassed.
--auth-required-write-scopeAUTH_REQUIRED_WRITE_SCOPEnogoo9:writeStringOAuth scope required for write/mutation operations. If not set, write scope check is bypassed.
--auth-required-admin-scopeAUTH_REQUIRED_ADMIN_SCOPEnogoo9:adminStringOAuth scope required for administrator operations. If not set, admin scope check is bypassed.
--auth-required-read-roleAUTH_REQUIRED_READ_ROLEviewerStringUser role required for read operations. If not set, read role check is bypassed.
--auth-required-write-roleAUTH_REQUIRED_WRITE_ROLEuserStringUser role required for write/mutation operations. If not set, write role check is bypassed.
-PROXY_SESSION_TTL1800NumberSession cookie expiration lifetime in seconds (sliding window duration).
-PROXY_REFRESH_COOKIE_TTL604800NumberDefault Max-Age for the encrypted refresh token cookie (nocr_refresh). Overridden by the IdP's refresh_expires_in when available.
-PROXY_TOKEN_COOKIE_TTL86400NumberDefault Max-Age for the access token cookie (nocr_token). Overridden by the JWT exp claim when available.
-PROXY_SESSION_SECRET""StringHMAC secret key used to sign stateless session cookies. Falls back to JWT_SECRET if not configured.
-OAUTH_SCOPESopenid profile email offline_accessSpace-separated scope stringOAuth scopes to request during authorization. Include 'offline_access' for refresh tokens.
-OAUTH_AUTHORIZATION_URL-URL stringDirect OAuth authorization URL.
-OAUTH_SERVER_DISCOVERY_URL, OAUTH_DISCOVERY_URL-URL stringDiscovery URL for the OAuth server used by the backend gateway. Falls back to OAUTH_DISCOVERY_URL.
-OAUTH_SERVER_TOKEN_URL, OAUTH_TOKEN_URL-URL stringDirect OAuth token exchange endpoint for the backend server.
-OAUTH_END_SESSION_URL-URL stringDirect OAuth logout endpoint.
--auth-inject-workspace-jwtAUTH_INJECT_WORKSPACE_JWTtruetrue, falseDetermines if the custom 'x-workspace-jwt' header containing the raw token is injected into proxy requests.
-AUTH_DEFAULT_ROLEviewerStringFallback role if the token does not provide scopes/roles.

🖥️ UI & Themes Configuration

CLI OptionEnvironment VariableDefaultAllowed ValuesDescription
-UI_ENABLEDtruetrue, falseEnables the embedded HTML Pod Manager UI resource.
-THEMES_DIRthemesPath stringLocal directory path containing custom CSS UI themes.
-THEMES_CONFIGMAP-StringName of Kubernetes ConfigMap containing custom UI theme configurations.
-DOCS_DIR/app/docs (Docker) or docs/.vitepress/dist (Local)Path stringBase directory from which static documentation files are served.
-OAUTH_DISCOVERY_URL""URL stringDiscovery URL for the OAuth authorization server used by the UI client.
-OAUTH_CLIENT_ID""StringOAuth client ID for UI authorization.
-OAUTH_LOGIN_METHODredirectredirect, popupLogin interaction mode for UI OAuth client.
-UI_TITLEnogoo9 Pod ManagerStringCustom title shown in the dashboard header.
-UI_SUBTITLEOn-demand Kubernetes pod orchestration and agent-sandbox management without CRDs.StringCustom subtitle shown below the dashboard title.

☸️ Kubernetes Setup & RBAC Permissions

For the @nogoo9/no-crd MCP server to interact with Kubernetes, it must run with appropriate RBAC permissions. Depending on your configuration, you can deploy it with Cluster-Wide (ClusterRole) access or Namespace-Scoped (Role) access.

Tool-to-Permission Mapping

Below is the mapping showing which Kubernetes API resources and verbs each MCP tool requires. The server dynamically checks these permissions at startup (via SelfSubjectAccessReview) and only registers tools that the active identity is authorized to use.

Resource: configmaps

Required VerbAssociated MCP ToolsDescription / Purpose
createcreate_templateSave a new pod template definition as a ConfigMap.
deletedelete_templateDelete a stored pod template ConfigMap.
getcreate_pod_from_templateRead template pod specifications stored in ConfigMaps.
updateupdate_templateModify metadata, annotations, or specifications of an existing template.

Resource: events

Required VerbAssociated MCP ToolsDescription / Purpose
listget_workspace_events

Resource: namespaces

Required VerbAssociated MCP ToolsDescription / Purpose
listlist_namespacesDiscover namespaces in the cluster (only required in cluster access mode).

Resource: pods

Required VerbAssociated MCP ToolsDescription / Purpose
createcreate_pod, create_pod_from_template, spawn_workspace, upgrade_all_workspaces, upgrade_workspaceProvision and deploy new pods or workspace sandboxes.
deletedelete_pod, stop_workspace, upgrade_all_workspaces, upgrade_workspaceTerminate and clean up pods or workspace sandboxes.
getget_pod, get_workspace, upgrade_workspaceRetrieve detailed JSON spec for a specific pod.
listlist_pods, list_workspaces, upgrade_all_workspacesRetrieve lists of pods or agent workspace pods.
patchpatch_podStrategic merge patch labels, annotations, or resource requests/limits.

Resource: pods/log

Required VerbAssociated MCP ToolsDescription / Purpose
getget_pod_logsRetrieve standard output/error logs from pod containers.

1. Cluster-Wide Mode (MODE=cluster)

Use this mode if you want the MCP server to manage sandboxes across any namespace in the cluster.

Create a ClusterRole and ClusterRoleBinding:

apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRole
metadata:
  name: nogoo-mcp
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch", "create", "delete", "patch", "update"]
  - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get"]
  - apiGroups: [""]
    resources: ["namespaces"]
    verbs: ["get", "list"]
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get", "list", "create", "update", "patch", "delete"]
  - apiGroups: [""]
    resources: ["serviceaccounts"]
    verbs: ["get", "list", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: ClusterRoleBinding
metadata:
  name: nogoo-mcp
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: nogoo-mcp
subjects:
  - kind: ServiceAccount
    name: nogoo-mcp
    namespace: nogoo9 # Change to the namespace where your MCP server runs

2. Namespace-Scoped Mode (MODE=namespaced)

Use this mode if the MCP server should be restricted to a single namespace (e.g. nogoo9). In this mode, no cluster-level or administrative permissions are needed.

Create a Role and RoleBinding in the target namespace:

apiVersion: rbac.authorization.k8s.io/v1
kind: Role
metadata:
  name: nogoo-mcp
  namespace: nogoo9
rules:
  - apiGroups: [""]
    resources: ["pods"]
    verbs: ["get", "list", "watch", "create", "delete", "patch", "update"]
  - apiGroups: [""]
    resources: ["pods/log"]
    verbs: ["get"]
  - apiGroups: [""]
    resources: ["configmaps"]
    verbs: ["get", "list", "create", "update", "patch", "delete"]
  - apiGroups: [""]
    resources: ["serviceaccounts"]
    verbs: ["get", "list", "create", "update", "patch", "delete"]
---
apiVersion: rbac.authorization.k8s.io/v1
kind: RoleBinding
metadata:
  name: nogoo-mcp
  namespace: nogoo9
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: Role
  name: nogoo-mcp
subjects:
  - kind: ServiceAccount
    name: nogoo-mcp
    namespace: nogoo9

(Note: In namespace-scoped mode, the list_namespaces tool will only return the target namespace, and namespace parameter inputs to all tools will default to the target namespace.)


📑 Workspace Templates & Spawner Annotations

Templates in @nogoo9/no-crd can be loaded from three sources (highest to lowest priority):

  1. Kubernetes ConfigMaps — labeled with nogoo9/pod-template: "true" (original mechanism)
  2. Custom local directory — set via TEMPLATES_DIR env var (YAML or JSON files)
  3. Built-in templates — shipped with the npm package (disable with BUILTIN_TEMPLATES=false)

See ADR-001 for format details.

1. How to Define a Template

To register a template with the spawner, create a ConfigMap meeting the following requirements:

  1. Discovery Label: Must be labeled with nogoo9/pod-template: "true".
  2. Spec Key: The data block must contain a key named spec whose value is a JSON string conforming to the PodSpecSchema (e.g. containers, volumes, restartPolicy).
  3. Behavior Customization: Set annotations on the ConfigMap metadata to configure advanced spawner integrations (like IAM role binding, init containers, and pre-stop lifecycle hooks).

Example Template Definition:

apiVersion: v1
kind: ConfigMap
metadata:
  name: node-workspace-template
  namespace: nogoo9
  labels:
    nogoo9/pod-template: "true"
  annotations:
    nogoo9/description: "A standard Node.js development sandbox with S3 storage sync"
    nogoo9/tag: "node-20"
    nogoo9/required-context: "PROJECT_NAME,REPO_URL"
    nogoo9/iam-role-arn: "arn:aws:iam::123456789012:role/workspace-s3-access"
    nogoo9/init-image: "alpine/git"
    nogoo9/init-command: "git clone $REPO_URL /workspace/$PROJECT_NAME"
    nogoo9/pre-stop-command: "aws s3 sync /workspace s3://my-workspace-backups/$PROJECT_NAME"
    nogoo9/default-grace-period: "120"
data:
  spec: |
    {
      "containers": [
        {
          "name": "workspace",
          "image": "node:20-alpine",
          "command": ["sleep", "infinity"],
          "volumeMounts": [
            {
              "name": "workspace-storage",
              "mountPath": "/workspace"
            }
          ]
        }
      ],
      "volumes": [
        {
          "name": "workspace-storage",
          "emptyDir": {}
        }
      ]
    }

2. Supported Spawner Annotations

The spawner inspects ConfigMap metadata annotations (and custom inline annotations passed during spawn_workspace) to customize the workspace lifecycle:

Annotation / Label KeyTypeDescription
nogoo9/workspace-auth-modeAnnotation (Comma-separated)Configures authorization modes for the workspace proxy. Comma-separated list of: token-api (exposes token retrieval endpoints at _auth/token & _auth/authorize for SPAs), inject-headers (rewrites headers to forward user identity like x-user-sub and JWTs to container; enabled by default if AUTH_ENABLED=true), no-auth (bypasses all auth/owner checks for public workspaces). (Available from v0.6.0, no-auth from v0.8.0)
nogoo9/auth-require-tokenAnnotation ("true""false")
nogoo9/template-versionAnnotation (String)Specifies the version of the pod template. Used to track if workspaces are outdated. (Available from v0.8.0)
nogoo9/workspace-nameAnnotation (String)Stores the user-defined display name of the workspace. (Available from v0.4.0)
nogoo9/template-refAnnotation (String)The reference to the pod template used to spawn the workspace (e.g. default/workspace-terminal). (Available from v0.4.0)
nogoo9/managed-byLabel (String)Used to label workspace pods created by this MCP server to restrict operational scope. (Available from v0.5.0)
nogoo9/pod-templateLabel ("true")Identifies a Kubernetes ConfigMap as a reusable pod template.
nogoo9/typeLabel ("workspace")Applied automatically by the spawner to identify running agent workspace pods.
nogoo9/workspace-idLabelIdentifies the unique agent session / workspace ID associated with the running pod.
nogoo9/user-subLabel / AnnotationRepresents the authenticated user subject (owner) of the workspace pod, used for access control validation and ServiceAccount labeling.
nogoo9/descriptionAnnotation (String)A friendly, human-readable summary of the template's purpose and contents.
nogoo9/tagAnnotation (String)A version or tag associated with the template environment (e.g. node-20).
nogoo9/required-contextAnnotation (Comma-separated)Validates that target environment variables are provided in the tool call's context parameter (e.g. GITHUB_TOKEN,DATABASE_URL).
nogoo9/iam-role-arnAnnotation (AWS Role ARN)Instructs the spawner to provision a dedicated Kubernetes ServiceAccount annotated for EKS IAM Role mapping (IRSA).
nogoo9/init-imageAnnotation (Image string)The container image to run in the dynamic spawner-init init-container.
nogoo9/init-commandAnnotation (Shell command)The shell command to run in the init-container. It automatically shares the main container's volume mounts.
nogoo9/init-share-volumesAnnotation ("true""false")
nogoo9/pre-stop-commandAnnotation (Shell command)A shell command executed in a Kubernetes preStop lifecycle exec hook when the workspace is terminated (e.g. to save/push state).
nogoo9/pre-stop-sidecar-imageAnnotation (Image string)If specified alongside pre-stop-command, runs the pre-stop command inside a dedicated sidecar container instead of the main container.
nogoo9/default-grace-periodAnnotation (Number in seconds)Overrides the Pod's terminationGracePeriodSeconds (defaults to 60 if a pre-stop command is defined) to give cleanup commands time to finish.
nogoo9/workspace-portAnnotation (Number)The port inside the container to proxy traffic to. Defaults to DEFAULT_WORKSPACE_PORT or 3000.
nogoo9/workspace-pathAnnotation (String)The default URL subpath mapping for the workspace web interface (defaults to /).
nogoo9/workspace-typeAnnotation (String)The format specification of the main entry point (e.g. iframe, novnc).
nogoo9/preview-pathAnnotation (String)The default folder or file subpath to render in the UI files preview tab.
nogoo9/preview-typeAnnotation (String)Fallback preview rendering mode for the preview tab (e.g. markdown, html).
nogoo9/api.<api-name>.portAnnotation (Number)Defines an additional HTTP service port exposed by the workspace.
nogoo9/api.<api-name>.visibilityAnnotation (String)Specifies access visibility for the custom API endpoint. Supported values: private (accessible only by the workspace owner), internal (accessible by any logged-in user), admin (accessible by the owner or users with the admin scope and role), scope:<scope_name> (accessible by users possessing the specified OIDC scope), role:<role_name> (accessible by users possessing the specified user role), or a comma-separated list of allowed user subjects.
nogoo9/api.<api-name>.pathAnnotation (String)Defines the subpath routing prefix for this specific API (e.g. /terminal).
nogoo9/api.<api-name>.descAnnotation (String)A short description of this additional API, shown in the UI interface.
nogoo9/api.<api-name>.methodAnnotation (String)Comma-separated list of supported HTTP methods (e.g. GET,POST, *, defaults to any method).
nogoo9/api.<api-name>.refreshAnnotation (Duration)Sets the refresh frequency for custom stats/activity or other mini API views in the dashboard cards (e.g. 10s, 1m, or init to query only once on startup).
nogoo9/api.stats.refreshAnnotation (Duration)Explicitly configures the reload frequency for the reserved stats API metrics on the workspace dashboard card (e.g., 10s, 30s, init).
nogoo9/api.last_activity.refreshAnnotation (Duration)Explicitly configures the reload frequency for the reserved last_activity epoch timestamp API on the workspace dashboard card (e.g., 30s, 1m, init).

📦 Programmatic SDK & API Proxy Services

@nogoo9/no-crd provides a complete programmatic SDK and dynamic cluster routing proxy to allow developers to build custom pod orchestrators and route workspace traffic natively.

1. Composable Programmatic SDK

You can import @nogoo9/no-crd in your Bun, Deno, or Node.js codebase to control pod sandboxes and templates programmatically, bypassing the MCP HTTP server.

import { KubeConfig } from "@kubernetes/client-node";
import { 
  initK8sContext, 
  spawnWorkspace, 
  stopWorkspace, 
  listWorkspaces 
} from "@nogoo9/no-crd";

// 1. Initialize Kubernetes API Context (optionally pass custom configuration)
const kc = new KubeConfig();
kc.loadFromDefault();
const ctx = initK8sContext(kc);

// 2. Spawn a workspace sandbox from a template
const spawnResult = await spawnWorkspace(ctx, {
  id: "agent-session-42",
  templateRef: "nogoo9/default-agent-workspace",
  context: {
    "S3_BUCKET": "my-bucket",
    "S3_FOLDER": "session-42"
  }
});
console.log(`Spawned pod: ${spawnResult.podName}`);

// 3. List active workspaces running in the namespace
const list = await listWorkspaces(ctx, {
  namespace: "nogoo9"
});
console.log(`Active workspaces count: ${list.workspaces.length}`);

// 4. Terminate the workspace sandbox
await stopWorkspace(ctx, {
  id: "agent-session-42"
});

2. Workspace Routing Proxy (Experimental)

[!WARNING] The workspace routing proxy and JWT authentication engine are experimental and likely to change in the next version.

The server includes a built-in reverse proxy routing service. HTTP requests targeting: http://<mcp-server-host>/route/<workspace-id>/<subpath> are dynamically proxied directly to the running workspace pod's IP address inside the cluster.

If AUTH_ENABLED is true:

  • Token Bootstrapping & Path-Scoped Cookies: Since standard browser navigations (links, iframes) cannot transmit custom HTTP headers, the client passes the active JWT via a ?token= query parameter on initial redirect. The proxy validates it and issues a secure, path-scoped cookie (nocr_token), allowing subsequent resource requests (JS, CSS, images, WebSockets) to authenticate seamlessly without URL parameters.
  • Direct Access Redirect (SSO): Accessing a workspace URL directly without active credentials redirects you to the main dashboard's login screen. Once logged in, the dashboard automatically routes you back to the target workspace URL with a fresh bootstrap token.
  • Resource Ownership Verification: The workspace pod's nogoo9/user-sub label must match the JWT's subject claim, preventing unauthorized access to other users' workspaces.
  • Proxy target port: Inside the workspace pod defaults to 3000 or can be overridden via pod annotation nogoo9/workspace-port or the DEFAULT_WORKSPACE_PORT environment variable.
  • Multi-Port / Custom API Routing: You can expose and route additional APIs inside the pod (e.g., a web terminal or secondary service) by defining custom annotations in the template (e.g., nogoo9/api.terminal.port: "7681", nogoo9/api.terminal.path: "/terminal"). The proxy will dynamically handle subpath routing and method checks.
  • A stateless signed session cookie (nocr_sess) is minted on first successful JWT validation, enabling workspace traffic to survive short-lived token expiry. (Available from v0.4.0) See ADR-002 and ADR-003 for design details.

For a detailed breakdown of the redirection lifecycle, Keycloak configuration, and JWT claims, see the SSO & OIDC Integration Guide.

3. OAuth Resource Discovery (RFC 9728)

Exposes the standardized metadata endpoint GET /.well-known/oauth-protected-resource returning:

  • Supported authorization servers.
  • Token format specifications.
  • Required scopes.

This allows client interfaces (and MCP clients) to automatically discover security requirements and handle dynamic OAuth authentication flows.

4. Embedded Web UI & Dashboard Themes

When the server runs in HTTP/SSE transport mode, the visual React Pod Manager UI Dashboard is served directly at root / (e.g. http://localhost:3000/).

  • Dashboard Themes: The UI includes a system/light/dark toggle and supports custom visual themes.
  • Three-Source Theme Merge Engine: CSS stylesheets are dynamically scanned and merged from:
    1. Kubernetes ConfigMap (THEMES_CONFIGMAP environment variable).
    2. Custom Local Directory (THEMES_DIR environment variable, defaults to themes/).
    3. Built-In Catalog (pre-baked styles: Dracula, Nord, Stripe, Slack, Vercel, Apple, Superhuman, Notion, and Antigravity).

Duplicate theme IDs are resolved according to priority: ConfigMap > Local Directory > Built-In Catalog. For detailed customization guidelines and CSS templates, see the Dashboard Themes & Branding Guide.


🔌 API Reference (MCP Tools & Resources)

Pod Tools

  • list_pods: Retrieve a summary of pods in the namespace. Filters by labelSelector, fieldSelector, and limit.
  • get_pod: Fetch full Kubernetes API JSON payload for a target pod name.
  • create_pod: Create a custom pod with direct container/volume specifications.
  • patch_pod: Apply a Strategic Merge Patch to modify labels, annotations, or container resource limits dynamically.
  • delete_pod: Terminate a pod with optional gracePeriodSeconds.
  • get_pod_logs: Fetch logs for a container with options like tailLines, sinceSeconds, timestamps, limitBytes, and previous.
  • list_namespaces: List all namespaces accessible with current credentials.
  • list_registry_images: List catalog images from the configured REGISTRY_URL.

Pod Template Tools

Manage preconfigured pod specifications stored as standard Kubernetes ConfigMaps (labeled nogoo9/pod-template=true).

  • list_templates: Show available templates.
  • get_template: Get the raw pod template spec.
  • create_template: Store a new pod template spec.
  • update_template: Update labels, annotations, or specs on an existing template.
  • delete_template: Delete a template.
  • create_pod_from_template: Spawn a pod using a template, applying container overrides (environment variables, commands, resources) and top-level overrides.

Agent Workspace (Spawner) Tools

Specially designed for AI agents to safely spawn and clean up their own workspace sandboxes.

  • list_workspaces: List active agent workspaces (with JWT/owner mapping support).
  • spawn_workspace: Spawn a workspace sandbox pod. Features:
    • Context Validation (nogoo9/required-context): Requires the caller to supply critical env variables (e.g. API keys) before spawning.
    • Init Containers (nogoo9/init-image / nogoo9/init-command): Initialize workspace directories/files before main containers start.
    • Pre-Stop Hooks (nogoo9/pre-stop-command): Run custom cleanup commands (e.g., commit/sync code to git or S3) upon termination.
    • IAM Role Mapping (nogoo9/iam-role-arn): Dynamically provisions AWS EKS IAM Role service accounts.
  • stop_workspace: Clean up and terminate the workspace pod.

Utilities

  • current_namespace: Returns active namespace and access mode.

MCP Resources

  • pod-template://{namespace}/{name}: Exposes stored pod templates directly as read-only MCP resources.
  • ui://nogoo9/app: Exposes the embedded React/web UI app (if UI_ENABLED=true and built). When the server runs in HTTP/SSE transport mode, the UI is also served directly at / or /ui (e.g. http://localhost:3000/) and automatically falls back to standard HTTP JSON-RPC calls when loaded outside a postMessage-compatible MCP host (such as in a standard browser tab or the MCP Inspector).

🏗️ Architecture

  ┌───────────────────────┐
  │   AI Agent / Client   │
  └───────────┬───────────┘
              │ (Stdio or SSE Transport)
              ▼
  ┌───────────────────────┐
  │      MCP Server       │ <── (Queries ConfigMaps for specs)
  └───────────┬───────────┘
              │ (Kubernetes API - CoreV1)
              ▼
  ┌──────────────────────────────────────────┐
  │            Kubernetes Cluster            │
  │  ┌────────────────────────────────────┐  │
  │  │         Target Namespace           │  │
  │  │  ┌──────────┐ ┌──────────┐ ┌────┐  │  │
  │  │  │ Agent    │ │ Custom   │ │    │  │  │
  │  │  │ Sandbox  │ │ Workload │ │... │  │  │
  │  │  │ Pod      │ │ Pod      │ │    │  │  │
  │  │  └──────────┘ └──────────┘ └────┘  │  │
  │  └────────────────────────────────────┘  │
  └──────────────────────────────────────────┘

The server interacts directly with the Kubernetes API using @kubernetes/client-node. By using standard Pod and ConfigMap resources, the setup is highly scalable, requires no cluster operator installs, and easily adheres to strict enterprise namespace-level security policies.


🛠️ Development

We use Moon for toolchain management and task running, and Biome for formatting and linting.

Prerequisites

  • Bun 1.3.11+
  • Node.js 22.14.0+
  • Moon 2.1.3+
  • k3d (for local Kubernetes cluster)

Setup Environment

# Install dependencies
bun install

# Auto-fix code formatting and linting via Biome
bun run format

# Run TypeScript compilation checks
bun run typecheck

Running Tests

# Run unit tests
moon run mcp:test

# Run full spawner workspace lifecycle tests (requires local k3d)
bun run test:lifecycle

Local Cluster Testing (k3d)

Bootstrap a local k3d Kubernetes cluster complete with a local registry, built-in mock S3, and Traefik:

# Spin up development cluster
moon run k3d:bootstrap

# Rebuild, push, and deploy MCP server to the cluster
moon run mcp:deploy

# Tear down the cluster
moon run k3d:teardown

📄 License

This project is licensed under the Apache License 2.0. See LICENSE for details.

Featured
CodeRabbit
CodeRabbit
AI writes the code. CodeRabbit catches the slop.
Try For Free →
Keep your Mac awake
Keep your Mac awake
Keep your Mac awake while Claude Code and 40+ AI agents run. Sleeps when they're idle.
One time payment $9 →
Context.devContext.dev
Context.dev
Integrate web data into your AI product. One API to scrape website & brand data.
Get API Key Now →
Make your agent a DeFi expert
Make your agent a DeFi expert
Agent, run crypto. Access onchain data & trade routes via 1inch.
Install now →
Make money from your Skills
Make money from your Skills
On Capafy, your Skill runs online 24/7 as an agent product, and you get paid every time someone uses it.
Start earning →
AppSignal
AppSignal
Monitor with ease. Code with confidence.
Start Free Trial →

Configuration

KUBECONFIG

Path to the Kubernetes API credentials configuration file

BASE_URL

Hosting URL subpath prefix for gateways and reverse proxies

STATELESS

Disable in-memory session tracking for stateless execution

TLS_CERT

Local file path containing TLS public certificate (HTTPS)

TLS_KEYsecret

Local file path containing TLS private key (HTTPS)

TLS_CA

Local file path containing trusted client Certificate Authority

NODE_TLS_REJECT_UNAUTHORIZED

Set to '0' to allow connection to unverified TLS endpoints

REGISTRY_URL

Default container registry for workspace image resolution

TEMPLATES_DIR

Local filesystem directory containing custom YAML/JSON templates

BUILTIN_TEMPLATES

Enable loading of standard pre-configured templates (default: true)

AUTH_ENABLED

Enforce JWT verification and user tenant isolation (default: false)

JWT_VERIFICATION_REQUIRED

Set to 'false' to skip OIDC cryptographic signature checks

JWT_SECRETsecret

HMAC-SHA symmetric secret key to sign/verify JWT tokens

JWT_PUBLIC_KEYsecret

PEM public key to verify asymmetric OIDC signatures

JWKS_URI

Discovery URI to fetch keys from OIDC provider dynamically

INTROSPECTION_ENDPOINT

RFC 7662 compliant token introspection validation endpoint

OAUTH_CLIENT_ID

Client identifier for OAuth2 authentication flows

OAUTH_CLIENT_SECRETsecret

Client secret credentials used for token introspection

JWT_AUDIENCE

Target audience check value for incoming OIDC tokens

AUTH_ISSUER

Expected token issuer authority check value (e.g. Keycloak)

AUTH_SUB_JSONPATH

JSONPath pattern to extract user identity subject from token

AUTH_ADMIN_ROLE

Bypass role name that grants admin access (default: nogoo9-admin)

PROXY_SESSION_TTL

Active lifetime in seconds for signed proxy session cookies

PROXY_SESSION_SECRETsecret

Secret key for session cookie signing

Categories
AI & LLM ToolsCloud & Infrastructure
Registryactive
Package@nogoo9/no-crd
TransportSTDIO
AuthRequired
UpdatedJun 10, 2026
View on GitHub

Related AI & LLM Tools MCP Servers

View all →
SkillFM LLM Cost Optimizer

io.github.ericm1018/skillfm-llm-cost-optimizer-openai-anthropic-usage

LLM cost optimizer for OpenAI, Anthropic, token usage, BYOK, and SkillFM Beacon audits.
Llm Orchestration Agent

io.github.mikerawsonnz/llm-orchestration-agent

Run a prompt through a LangChain (system + human) chain over Gemini on Vertex AI; optional LangSmith
Authenticated Llm Agent

io.github.mikerawsonnz/authenticated-llm-agent

JWT-gated LLM gateway: authenticate (bcrypt/JWT), then run a LangChain-on-Vertex Gemini completion.
Copilot Memory MCP

labforgedev/copilot-memory-mcp

Persistent semantic memory for AI agents using local ChromaDB vector search. No cloud required.
1
Agent Prompt Injection Firewall Mcp

csoai-org/agent-prompt-injection-firewall-mcp

The WAF for agents. Pattern-based + heuristic firewall scans prompts, RAG documents, tool argume...
Authenticated Multi Llm Agent

io.github.mikerawsonnz/authenticated-multi-llm-agent

Google-OAuth-gated LLM gateway: verify a Google ID token, then run a Gemini (Vertex AI) completion f