Koskamo

ShipDapp MCP

ShipDapp MCP enables AI agents to scaffold, build, deploy, and monitor Dockerized applications on the decentralized Akash Network. It supports authentication via API keys or Solana wallet SIWS, allowing agents to manage deployments and fund hosting vaults directly.

Endpoint and access

No sign-in to connect and list tools. Individual tools may still need a vendor account, credentials, or permissions; check the documented prerequisites.

ShipDapp MCP logo, by ShipDappCommunity listingLegacy SSENo sign-inEndpoint checked 2026-11-01Published by ShipDapp
You need:Generate a key in your account, add it to MCP client headers
MCP endpoint (Legacy SSE)
https://api.shipdapp.com/api/mcp/sse
Vendor documentation

What you can do with it

  • Scaffold apps using AI coding assistants
  • Deploy Dockerized apps to Akash devnet
  • Monitor running containers
  • Authenticate agents via API key or Solana wallet

Source and maintenance

Community listingRegistry 0.2.0
Maintenance checked

Protocol and capabilities

Server
shipdapp-mcp-server 0.2.0
MCP protocol
2025-06-18
Tools
16 advertised
Resources
Not advertised
Resource templates
Not advertised
Prompts
2 advertised
Server-advertised capabilities
{
  "tools": {
    "listChanged": true
  },
  "prompts": {
    "listChanged": true
  }
}

Tools

16 advertised

get_auth_challenge
Advertised by the server during the last successful anonymous check.

CALL THIS FIRST before deploy/build tools ONLY if you are NOT using a ShipDapp API key in MCP client headers. Returns a Sign-In-With-Solana message for local wallet signing.

get_auth_challenge input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "walletAddress"
  ],
  "properties": {
    "walletAddress": {
      "type": "string",
      "description": "Solana wallet public key (base58), e.g. from ~/.config/solana/id.json"
    }
  }
}
authenticate
Advertised by the server during the last successful anonymous check.

CALL THIS IMMEDIATELY AFTER get_auth_challenge. Submit the base58 signature of the challenge message to unlock the session. All deploy/build/status tools require authentication — do not call them until this succeeds.

authenticate input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "walletAddress",
    "signature"
  ],
  "properties": {
    "signature": {
      "type": "string",
      "description": "Base58 ed25519 signature of challengeMessage, signed locally off-chain"
    },
    "walletAddress": {
      "type": "string",
      "description": "Same wallet address used in get_auth_challenge"
    }
  }
}
get_usage_limits
Advertised by the server during the last successful anonymous check.

CALL THIS AFTER A GUARDRAIL BLOCK or before planning multiple deploys. Returns your wallet's deployment quotas and current usage (active apps, hourly build/deploy counts). Use to understand why deploy_app was rejected and what to do next (close_app or wait).

get_usage_limits input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
list_templates
Advertised by the server during the last successful anonymous check.

CALL THIS WHEN STARTING A NEW APP or when you need a templateId for deploy_app/build_image. Returns available templates (e.g. webapp-static = frontend SPA, framework-agnostic). Optional starter via includeFiles=true is React+Vite+Tailwind — not required. Production start uses serve -s dist in the starter. Prefer list_template_files + validate_upload before deploy_app. Upload your complete project as-is (mergeMode=strict never injects Tailwind/PostCSS).

list_templates input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {
    "appName": {
      "type": "string",
      "description": "Substituted into template files like index.html title (default: my-app)"
    },
    "includeFiles": {
      "type": "boolean",
      "default": false,
      "description": "Set true when bootstrapping a new project — returns scaffold files to write to disk"
    }
  }
}
list_template_files
Advertised by the server during the last successful anonymous check.

CALL THIS BEFORE deploy_app to see required vs optional paths. Required is minimal (package.json + index.html); component filenames are not fixed — validate_upload checks that the HTML entry's imports resolve.

list_template_files input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "templateId"
  ],
  "properties": {
    "appName": {
      "type": "string",
      "description": "Optional — only affects scaffold content, not path lists"
    },
    "templateId": {
      "type": "string",
      "description": "From list_templates (e.g. webapp-static)"
    }
  }
}
validate_upload
Advertised by the server during the last successful anonymous check.

DRY-RUN before deploy_app/update_app/build_image. Checks file count, bytes, missing required paths, template-default fills, and placeholder garbage — without starting a Cloud Build. Call this when unsure the files map is complete.

validate_upload input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "templateId",
    "files"
  ],
  "properties": {
    "files": {
      "type": "object",
      "description": "Same files map you would pass to deploy_app",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "appName": {
      "type": "string"
    },
    "mergeMode": {
      "enum": [
        "strict",
        "scaffold"
      ],
      "type": "string",
      "default": "strict",
      "description": "strict (default): reject missing required files and placeholder garbage. scaffold: fill omitted scaffold files from template defaults (emits warnings)."
    },
    "templateId": {
      "type": "string",
      "description": "From list_templates (e.g. webapp-static)"
    }
  }
}
build_image
Advertised by the server during the last successful anonymous check.

USE ONLY when you want to build a container image WITHOUT creating a deployment. For normal shipping, prefer deploy_app instead (build + deploy in one step). Call this if you need to verify the image builds successfully before deploying, or if you plan to deploy the image manually later. After calling, poll get_build_status until SUCCESS. Prefer validate_upload first.

build_image input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "appName",
    "templateId",
    "files"
  ],
  "properties": {
    "files": {
      "type": "object",
      "description": "Complete local project files (path → content). Must include required paths (see list_template_files). Omit package-lock.json. Test with npm run build locally first.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "appName": {
      "type": "string",
      "description": "Application name — becomes part of the Artifact Registry image tag"
    },
    "mergeMode": {
      "enum": [
        "strict",
        "scaffold"
      ],
      "type": "string",
      "default": "strict",
      "description": "strict (default): reject missing required files and placeholder garbage. scaffold: fill omitted scaffold files from template defaults (emits warnings)."
    },
    "templateId": {
      "type": "string",
      "description": "From list_templates (e.g. webapp-static). Required — provides build defaults."
    },
    "buildCommand": {
      "type": "string",
      "description": "Override template default (webapp-static: npm run build)"
    },
    "startCommand": {
      "type": "string",
      "description": "Override template default (webapp-static production: npm start → serve -s dist)"
    },
    "dockerfileContent": {
      "type": "string",
      "description": "Only if you need a custom Dockerfile instead of buildpacks"
    }
  }
}
get_build_status
Advertised by the server during the last successful anonymous check.

Optional debug tool for Cloud Build progress. Prefer polling get_app_status(deploymentId) after deploy_app/update_app — the server auto-promotes BUILDING → Akash deploy when the build succeeds. Use this when you only have a buildId (e.g. after build_image) or need build-level detail. On FAILURE, returns failureSummary and buildLogTail when available.

get_build_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "buildId"
  ],
  "properties": {
    "buildId": {
      "type": "string",
      "description": "buildId from build_image, deploy_app, or file-based update_app response"
    },
    "deploymentId": {
      "type": "string",
      "description": "Optional. If omitted and this build belongs to a BUILDING deployment, the server still auto-starts Akash deploy on SUCCESS."
    }
  }
}
deploy_app
Advertised by the server during the last successful anonymous check.

PRIMARY SOURCE DEPLOY TOOL — call when the app is built/tested locally and ready to ship. Prefer validate_upload first. Uploads files + templateId (mergeMode=strict by default: upload-as-is — never injects starter Tailwind/PostCSS/React files; requires package.json + index.html and that the HTML entry's local imports resolve). Framework-agnostic SPA. Returns uploadSummary + warnings. Next: poll get_app_status until ACTIVE and httpReady=true, then share proxyUri. Apps are unlisted by default (live URL still works); pass listOnStore=true or call set_app_listing to appear on the App Store. Omit package-lock.json. Use deploy_image for prebuilt images. See prompt deploy_app_guide.

deploy_app input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "appName",
    "templateId",
    "files"
  ],
  "properties": {
    "port": {
      "type": "number",
      "description": "Container listen port (webapp-static default: 3000)"
    },
    "files": {
      "type": "object",
      "description": "Complete local project files including all required paths (list_template_files). Omit package-lock.json. Must pass local npm run build first.",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "appName": {
      "type": "string",
      "description": "Unique app name used for the image tag and My Apps"
    },
    "imageUrl": {
      "type": "string",
      "description": "Preview/thumbnail URL for the app card in the store"
    },
    "mergeMode": {
      "enum": [
        "strict",
        "scaffold"
      ],
      "type": "string",
      "default": "strict",
      "description": "strict (default): reject missing required files and placeholder garbage. scaffold: fill omitted scaffold files from template defaults (emits warnings)."
    },
    "templateId": {
      "type": "string",
      "description": "From list_templates (e.g. webapp-static). Must match how the app was scaffolded."
    },
    "description": {
      "type": "string",
      "description": "Short description shown on the app listing when listed"
    },
    "listOnStore": {
      "type": "boolean",
      "description": "If true, list this app on the public App Store. Default false (unlisted; proxyUri still works)."
    },
    "buildCommand": {
      "type": "string",
      "description": "Override template build command if needed"
    },
    "startCommand": {
      "type": "string",
      "description": "Override production start (webapp-static default: npm start → serve -s dist). Do not use vite preview for production."
    },
    "dockerfileContent": {
      "type": "string",
      "description": "Custom Dockerfile — omit to use Google Cloud Buildpacks"
    }
  }
}
deploy_image
Advertised by the server during the last successful anonymous check.

CALL THIS WHEN YOU ALREADY HAVE A PUBLIC DOCKER/OCI IMAGE and want to deploy it to devnet without uploading source files or running Cloud Build. Requires dockerImage + appName. Use deploy_app instead when the agent has local source files and wants ShipDapp to build the image. Guardrails apply: max active deployments, daily limit, duplicate appName blocked, hourly deploy rate limit, cooldown. Returns deploymentId, network=devnet, dockerImage. Apps are unlisted by default; pass listOnStore=true or call set_app_listing to appear on the App Store. Next step: poll get_app_status until ACTIVE and share proxyUri.

deploy_image input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "appName",
    "dockerImage"
  ],
  "properties": {
    "port": {
      "type": "number",
      "description": "Container listen port (default: 3000)"
    },
    "appName": {
      "type": "string",
      "description": "Unique app name shown in My Apps"
    },
    "imageUrl": {
      "type": "string",
      "description": "Preview/thumbnail URL for the app card in the store"
    },
    "description": {
      "type": "string",
      "description": "Short description shown on the app listing when listed"
    },
    "dockerImage": {
      "type": "string",
      "description": "Public container image URI, e.g. ghcr.io/acme/my-app:latest or docker.io/library/nginx:alpine"
    },
    "listOnStore": {
      "type": "boolean",
      "description": "If true, list this app on the public App Store. Default false (unlisted; proxyUri still works)."
    },
    "startCommand": {
      "type": "string",
      "description": "Optional command override if the image needs one"
    }
  }
}
update_app
Advertised by the server during the last successful anonymous check.

CALL THIS WHEN AN APP IS ALREADY DEPLOYED and you want to push new code or change config. Pass files + templateId to rebuild (same strict upload rules as deploy_app — prefer validate_upload first), OR pass dockerImage alone to redeploy an existing image. Do NOT use deploy_app for updates. Blocked while status is DEPLOYING — wait and poll get_app_status. After calling, poll until ACTIVE and httpReady=true.

update_app input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "deploymentId"
  ],
  "properties": {
    "port": {
      "type": "number",
      "description": "Change container port (optional)"
    },
    "files": {
      "type": "object",
      "description": "New local files — triggers a cloud rebuild before redeploying",
      "propertyNames": {
        "type": "string"
      },
      "additionalProperties": {
        "type": "string"
      }
    },
    "appName": {
      "type": "string",
      "description": "Rename the app (optional)"
    },
    "mergeMode": {
      "enum": [
        "strict",
        "scaffold"
      ],
      "type": "string",
      "default": "strict",
      "description": "strict (default): reject missing required files and placeholder garbage. scaffold: fill omitted scaffold files from template defaults (emits warnings)."
    },
    "templateId": {
      "type": "string",
      "description": "Required when files is provided — same template used originally"
    },
    "description": {
      "type": "string",
      "description": "Update the app description (optional)"
    },
    "dockerImage": {
      "type": "string",
      "description": "Pre-built image URI — use instead of files when image is already built"
    },
    "buildCommand": {
      "type": "string"
    },
    "deploymentId": {
      "type": "string",
      "description": "Existing deployment ID from deploy_app or list_apps"
    },
    "startCommand": {
      "type": "string"
    }
  }
}
get_app_status
Advertised by the server during the last successful anonymous check.

PRIMARY STATUS POLL after deploy_app, update_app, or deploy_image. Poll every 10–20s until status is ACTIVE and httpReady is true (then share proxyUri), or FAILED (read lastError / buildLogTail). ACTIVE alone can still mean HTTP 503 while the process starts — wait for httpReady. On FAILED, buildLogTail may be attached automatically.

get_app_status input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "deploymentId"
  ],
  "properties": {
    "deploymentId": {
      "type": "string",
      "description": "deploymentId from deploy_app response, or pick from list_apps"
    }
  }
}
list_apps
Advertised by the server during the last successful anonymous check.

CALL THIS to see all your deployed apps (listed and unlisted), find a deploymentId, or check which apps are ACTIVE vs DEPLOYING. Use before update_app, set_app_listing, or close_app when you don't know the deploymentId.

list_apps input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "properties": {}
}
set_app_listing
Advertised by the server during the last successful anonymous check.

CALL THIS to list or unlist an existing app on the public App Store. Unlisted apps stay reachable via proxyUri if you know the URL. Use list_apps to find deploymentId. Does not change the live deployment.

set_app_listing input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "deploymentId",
    "listed"
  ],
  "properties": {
    "listed": {
      "type": "boolean",
      "description": "true = appear on App Store; false = unlisted (private from discovery)"
    },
    "deploymentId": {
      "type": "string",
      "description": "deploymentId from deploy_app, deploy_image, or list_apps"
    }
  }
}
close_app
Advertised by the server during the last successful anonymous check.

CALL THIS WHEN PERMANENTLY SHUTTING DOWN an app — stops the Akash lease, frees resources, and marks the deployment DELETED. This is irreversible for that deploymentId. Use list_apps first if you don't know the ID. Do NOT use this for updates — use update_app instead.

close_app input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "deploymentId"
  ],
  "properties": {
    "deploymentId": {
      "type": "string",
      "description": "deploymentId to tear down (from deploy_app, get_app_status, or list_apps)"
    }
  }
}
get_logs
Advertised by the server during the last successful anonymous check.

CALL THIS WHEN SOMETHING WENT WRONG or you need to debug. type=build + buildId: after FAILURE — returns failureSummary and inline buildLogTail when Cloud Logging is available (else logUrl). type=runtime: container stdout/stderr from Akash when ACTIVE; on provider HTTP errors, returns a clear message plus lastError fallback. Runtime logs are NOT available until the deployment has an Akash lease.

get_logs input schema
{
  "type": "object",
  "$schema": "http://json-schema.org/draft-07/schema#",
  "required": [
    "deploymentId"
  ],
  "properties": {
    "tail": {
      "type": "number",
      "description": "Max approximate log lines for runtime logs (default 500)"
    },
    "type": {
      "enum": [
        "build",
        "runtime"
      ],
      "type": "string",
      "default": "runtime",
      "description": "build = GCB build logs (needs buildId). runtime = live container logs (needs ACTIVE deployment)"
    },
    "buildId": {
      "type": "string",
      "description": "Required when type=build — from deploy_app or build_image response"
    },
    "deploymentId": {
      "type": "string",
      "description": "deploymentId from deploy_app or list_apps"
    }
  }
}

Prompts

2 advertised

deploy_app_guide — Deploy App to Akash

Advertised by the server during the last successful anonymous check.

Use when the user wants to deploy a new app to devnet. Walks through: auth → list_templates → local dev → deploy_app → poll status → go live.

appName
Application name
templateId
Template id (default webapp-static)
monitor_app — Monitor Deployment

Advertised by the server during the last successful anonymous check.

Use when the user asks about deployment progress, live URL, or errors. Polls get_app_status and get_logs.

deploymentId
Deployment ID (required)

Resources

Not advertised

No resource definitions available.

30-day availability

Aggregated from read-only remote checks; this is not a tool-execution or security guarantee.

Successful checks
1 of 1 (100%)
Average latency
2043 ms
95th percentile latency
2043 ms

Maintenance history

Public check and source-refresh events. Editorial and ownership records remain private.

  • · probe · passed · 2043 ms · metadata changed · 16 tool(s), 2 prompt(s)

Connect from your client

Each snippet registers the same endpoint; pick the client you use.

This server is operated by the named third party. Listing and endpoint checks are not an endorsement or a security audit. Review the operator's permissions, terms, and data handling before connecting. How listings are checked and corrected.

Claude Code

Run this once in a terminal. It registers the remote server. Use --scope project to write .mcp.json for the repo.
Claude Code configuration
claude mcp add --transport sse shipdapp-mcp https://api.shipdapp.com/api/mcp/sse

Cline

Merge this into cline_mcp_settings.json (Cline → MCP Servers → Configure).
Cline configuration
{
  "mcpServers": {
    "shipdapp-mcp": {
      "type": "sse",
      "url": "https://api.shipdapp.com/api/mcp/sse",
      "disabled": false
    }
  }
}

Gemini CLI

Run this once. It writes .gemini/settings.json in the current project; pass --scope user for ~/.gemini/settings.json.
Gemini CLI configuration
gemini mcp add --transport sse shipdapp-mcp https://api.shipdapp.com/api/mcp/sse

Let your agent find its tools

Find servers like ShipDapp MCP from your agent. Add Koskamo once to search the index for endpoints, access requirements, and client setup. Public discovery needs no key.