cloud-mcp
Enables running DigitalOcean CLI (doctl) commands, allowing management of DigitalOcean resources like droplets, databases, and more.
Integrates with HashiCorp Vault as an external secrets vault for securely storing and retrieving provider credentials and configuration.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@cloud-mcplist AWS S3 buckets in my account"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
cloud-mcp
A Node.js skeleton for wrapping multiple cloud CLIs behind one command surface.
What this gives you
Unified CLI entrypoint (
cloud-wrap)Provider pass-through commands for AWS, GCP, Azure, OCI, Alibaba, DigitalOcean, IBM Cloud, Tencent Cloud, and Huawei Cloud
Config file support to override command paths and inject environment variables
Vault abstraction for storing provider attributes with optional external replacement
MCP stdio server that registers provider tools and command runners
Structured logging and safe command execution with inherited stdio
Related MCP server: mcp_server_for_claudes_toolbox
Quick start
npm install
npm run bootstrap:clis
npm start -- list
npm start -- aws sts get-caller-identity
npm start -- oci iam region list
npm start -- alibaba ecs DescribeInstances
npm run mcpRepository-local CLI layout
This project can keep provider CLI entrypoints under mcp/<provider>/bin.
mcp/aws/bin/awsmcp/gcp/bin/gcloudmcp/azure/bin/azmcp/oci/bin/ocimcp/alibaba/bin/aliyunmcp/digitalocean/bin/doctlmcp/ibmcloud/bin/ibmcloudmcp/tencent/bin/tcclimcp/huawei/bin/hcloud
Run the bootstrap command to create links from your installed CLIs into this structure:
npm run bootstrap:clisOr pull and install all CLIs directly into the structure:
npm run install:clisThis installer covers AWS, GCP, Azure, OCI, Alibaba, DigitalOcean, IBM Cloud, and Tencent Cloud directly. Huawei Cloud is wired through the same provider interface, but the public huaweicloudcli Python package referenced by older installer versions is not available; set HUAWEI_CLI_BIN to a supported hcloud-compatible binary to enable Huawei command execution.
At runtime, provider resolution order is:
mcp/<provider>/bin/<cli>when present<PROVIDER>_CLI_BINenvironment overrideCLI from
PATH
If neither HUAWEI_CLI_BIN nor hcloud on PATH is available during npm run install:clis, a placeholder mcp/huawei/bin/hcloud is created that fails with an explicit setup message instead of breaking the image build.
Shared command limits live in mcp/cloud-command-limits.json.
Current repository default (mcp/cloud-command-limits.json) is permissive for all providers and intentionally includes CLI-style aliases for two sections:
{
"alibaba.*": [],
"aws.*": [],
"az.*": [],
"digitalocean.*": [],
"gcloud.*": [],
"huawei.*": [],
"ibmcloud.*": [],
"oci.*": [],
"tencent.*": []
}At load time this is normalized to canonical provider sections, so az.* becomes azure.* and gcloud.* becomes gcp.* in the effective runtime policy.
External command-limit loading:
CLOUD_COMMAND_LIMITS_SOURCE(optional): load command limits from an external source at startup.Supported values: file path,
file://URL,http://URL,https://URL.
CLOUD_COMMAND_LIMITS_REFRESH_INTERVAL_SECONDS(optional): whenCLOUD_COMMAND_LIMITS_SOURCEis set and this value is> 0, command limits are reloaded on that interval.If refresh fails, the last successfully loaded limits remain active.
PostgreSQL-backed command limits:
Command limits are persisted in PostgreSQL table
cloud_mcp.command_limits.Runtime command validation reads limits from the database before each provider command execution.
On startup, limits are loaded from
mcp/cloud-command-limits.json(orCLOUD_COMMAND_LIMITS_SOURCE) and synced into PostgreSQL.When refresh is enabled, each refresh cycle updates PostgreSQL records from the external source.
Database environment variables:
COMMAND_LIMITS_DATABASE_URL(preferred), orDATABASE_URLCOMMAND_LIMITS_LOCAL_POSTGRES_ENABLED(optional): whentrue|1|yesand no external DB URL is set, auto-uses local postgres URL.COMMAND_LIMITS_LOCAL_POSTGRES_PORT(required when local postgres auto-mode is enabled): local postgres port used to build the DB URL.
If neither database variable is set, command limits run in in-memory mode.
Database resolution order:
Use
COMMAND_LIMITS_DATABASE_URLwhen set.Else use
DATABASE_URLwhen set.Else if
COMMAND_LIMITS_LOCAL_POSTGRES_ENABLED=true|1|yes, requireCOMMAND_LIMITS_LOCAL_POSTGRES_PORTand usepostgres://cloud_mcp:cloud_mcp@127.0.0.1:<port>/cloud_mcp.Else run in-memory mode.
Start local PostgreSQL from repository assets:
export COMMAND_LIMITS_LOCAL_POSTGRES_PORT=5432
docker compose -f docker-compose.postgres.yml up -d
export COMMAND_LIMITS_DATABASE_URL="postgres://cloud_mcp:cloud_mcp@127.0.0.1:5432/cloud_mcp"Standalone migration for existing databases:
psql "$COMMAND_LIMITS_DATABASE_URL" -f db/migrations/002_command_limits_namespace_migration.sqlThis migration creates cloud_mcp.command_limits, copies legacy rows from public.command_limits when present, and ensures default provider-prefix records exist.
Enforced sections are keyed by provider prefix:
aws.*,gcp.*,azure.*,oci.*,alibaba.*,digitalocean.*,ibmcloud.*,tencent.*,huawei.*If a section is an empty array, all commands for that provider are allowed
If a section contains entries, only matching prefixes are allowed
Entries may be written as full prefixes like
aws.s3or shorthand likes3within theaws.*section
Prefix naming note:
Runtime enforcement uses provider names (
aws,gcp,azure,oci,alibaba,digitalocean,ibmcloud,tencent,huawei), not binary names.CLI-style aliases are supported and normalized during load:
gcloud.*maps togcp.*az.*maps toazure.*aliyun.*maps toalibaba.*doctl.*maps todigitalocean.*tccli.*maps totencent.*hcloud.*maps tohuawei.*
If both canonical and alias keys are provided for the same provider, canonical keys win (
gcp.*overgcloud.*,azure.*overaz.*,alibaba.*overaliyun.*,digitalocean.*overdoctl.*,tencent.*overtccli.*,huawei.*overhcloud.*).Recommended mapping is:
aws.*forawsgcp.*forgcloudazure.*forazoci.*forocialibaba.*foraliyundigitalocean.*fordoctlibmcloud.*foribmcloudtencent.*fortcclihuawei.*forhcloud
How to fill out the file:
Allow everything for every cloud:
{
"alibaba.*": [],
"aws.*": [],
"digitalocean.*": [],
"gcp.*": [],
"azure.*": [],
"oci.*": [],
"ibmcloud.*": [],
"tencent.*": [],
"huawei.*": []
}Restrict AWS and GCP, leave Azure and OCI open:
{
"alibaba.*": ["ecs"],
"aws.*": ["s3", "sts.get-caller-identity"],
"gcp.*": ["projects", "compute.instances.list"],
"azure.*": [],
"oci.*": [],
"digitalocean.*": ["compute"],
"ibmcloud.*": [],
"tencent.*": ["cvm"],
"huawei.*": ["ecs"]
}Use full provider-prefixed entries explicitly:
{
"aws.*": ["aws.s3", "aws.sts.get-caller-identity"],
"gcp.*": ["projects", "compute.instances.list"],
"azure.*": [],
"oci.*": ["oci.iam"]
}Lock each provider to a narrow subset:
{
"aws.*": ["ec2.describe-instances", "s3.ls"],
"gcp.*": ["projects.list"],
"azure.*": ["vm", "account.show"],
"oci.*": ["iam.region.list"]
}What the entries mean:
"s3"insideaws.*means any AWS command starting withaws.s3..."sts.get-caller-identity"insideaws.*means onlyaws sts get-caller-identity"projects"insidegcp.*means any GCP command starting withgcp.projects..."oci.iam"insideoci.*means any OCI command starting withoci.iam...
With this file:
aws s3 lsis allowedaws ec2 describe-instancesis deniedall Azure commands are allowed
gcloud projects listis allowedoci iam region listis allowed
Usage
Generic form
npm start -- run <provider> [args...]Examples:
npm start -- run aws s3 ls
npm start -- run gcp projects list
npm start -- run azure account show
npm start -- run oci iam region list
npm start -- run digitalocean compute droplet listProvider shorthands
npm start -- aws s3 ls
npm start -- gcp projects list
npm start -- azure account show
npm start -- oci iam region list
npm start -- tencent cvm DescribeInstancesMCP server
Start MCP with both stdio and HTTP transports (default):
npm run mcp -- --config cloud-wrap.config.jsonRun HTTP-only or stdio-only:
npm run mcp:http -- --config cloud-wrap.config.json
npm run mcp -- --transport stdio --config cloud-wrap.config.jsonHTTP defaults:
MCP_HTTP_HOST=127.0.0.1MCP_HTTP_PORT=3000MCP_HTTP_PATH=/mcpMCP_HTTP_HEALTH_PATH=/healthz
Transport mode:
MCP_TRANSPORT_MODE=stdio|http|both(default:both)
HTTP authentication framework:
MCP_HTTP_AUTH_MODE=none|token|oauth2|both(default:none)Bearer token mode (
tokenorboth):MCP_HTTP_TOKEN_SOURCE=env|vault(default:env)MCP_HTTP_AUTH_TOKENS(comma-separated bearer tokens)Vault source settings (when
MCP_HTTP_TOKEN_SOURCE=vault):MCP_HTTP_VAULT_TOKEN_INDEX_PATH(default:cloud-mcp/http/auth/token-index)MCP_HTTP_VAULT_TOKEN_DEFAULT_USER_ID(default:default)MCP_HTTP_VAULT_TOKEN_REQUIRED_SCOPES(comma-separated, optional)MCP_HTTP_VAULT_TOKEN_REQUIRED_AUDIENCE(comma-separated, optional)MCP_HTTP_VAULT_TOKEN_CACHE_TTL_MS(optional)
OAuth2 introspection mode (
oauth2orboth):MCP_HTTP_OAUTH2_INTROSPECTION_URLMCP_HTTP_OAUTH2_CLIENT_ID(optional)MCP_HTTP_OAUTH2_CLIENT_SECRET(optional)MCP_HTTP_OAUTH2_REQUIRED_SCOPES(comma-separated, optional)MCP_HTTP_OAUTH2_REQUIRED_AUDIENCE(comma-separated, optional)MCP_HTTP_OAUTH2_TIMEOUT_MS(optional)MCP_HTTP_OAUTH2_CACHE_TTL_MS(optional)
HTTP hardening controls:
MCP_HTTP_TRUST_PROXY(optional:true|false)MCP_HTTP_ALLOWED_ORIGINS(comma-separated allowlist)MCP_HTTP_ALLOWED_IPS(comma-separated allowlist)MCP_HTTP_RATE_LIMIT_WINDOW_MS(default:60000)MCP_HTTP_RATE_LIMIT_MAX_REQUESTS(default:60)MCP_HTTP_MAX_BODY_BYTES(default:1048576)
When allowlists are set:
requests outside allowed IPs are rejected with
403requests with disallowed origin/host are rejected with
403per-IP rate limit violations return
429withRetry-After
Example: bearer tokens only
export MCP_HTTP_AUTH_MODE=token
export MCP_HTTP_AUTH_TOKENS="dev-token-1,dev-token-2"
npm run mcp -- --config cloud-wrap.config.jsonExample: Vault-backed bearer token index
export MCP_HTTP_AUTH_MODE=token
export MCP_HTTP_TOKEN_SOURCE=vault
export MCP_HTTP_VAULT_TOKEN_INDEX_PATH="cloud-mcp/http/auth/token-index"
npm run mcp -- --config cloud-wrap.config.jsonVault token index shape (tokens stored by SHA-256 hash, not plaintext):
{
"tokens": {
"<sha256(token)>": {
"userId": "default",
"tokenId": "tok-123",
"active": true,
"scopes": ["mcp:invoke"],
"audience": ["cloud-mcp"],
"expiresAt": "2026-12-31T23:59:59Z"
}
}
}Example: OAuth2 introspection only
export MCP_HTTP_AUTH_MODE=oauth2
export MCP_HTTP_OAUTH2_INTROSPECTION_URL="https://auth.example.com/oauth2/introspect"
export MCP_HTTP_OAUTH2_CLIENT_ID="cloud-mcp"
export MCP_HTTP_OAUTH2_CLIENT_SECRET="replace-me"
export MCP_HTTP_OAUTH2_REQUIRED_SCOPES="mcp:invoke"
npm run mcp -- --config cloud-wrap.config.jsonRegister This MCP In Codex, VS Code, and Claude
Use stdio transport for client registration. Keep this repository path and config path as absolute paths.
Start from a known absolute repo path:
cd /Users/lesterjohn/Documents/GitHub/cloud-mcp
pwdConfirm local launch command works before registering:
npm run mcp -- --transport stdio --config /Users/lesterjohn/Documents/GitHub/cloud-mcp/cloud-wrap.config.jsonRegister in Codex. On macOS, edit
~/.codex/config.tomland add:
[mcp_servers.cloud-mcp]
command = "npm"
args = [
"run",
"mcp",
"--",
"--transport",
"stdio",
"--config",
"/Users/lesterjohn/Documents/GitHub/cloud-mcp/cloud-wrap.config.json"
]
cwd = "/Users/lesterjohn/Documents/GitHub/cloud-mcp"Register in VS Code. Create or update workspace file
.vscode/mcp.jsonwith:
{
"servers": {
"cloud-mcp": {
"command": "npm",
"args": [
"run",
"mcp",
"--",
"--transport",
"stdio",
"--config",
"/Users/lesterjohn/Documents/GitHub/cloud-mcp/cloud-wrap.config.json"
],
"cwd": "/Users/lesterjohn/Documents/GitHub/cloud-mcp"
}
}
}Then reload VS Code window and verify cloud-mcp appears in MCP server list.
Register in Claude Desktop. On macOS, edit
~/Library/Application Support/Claude/claude_desktop_config.jsonand add:
{
"mcpServers": {
"cloud-mcp": {
"command": "npm",
"args": [
"run",
"mcp",
"--",
"--transport",
"stdio",
"--config",
"/Users/lesterjohn/Documents/GitHub/cloud-mcp/cloud-wrap.config.json"
],
"cwd": "/Users/lesterjohn/Documents/GitHub/cloud-mcp"
}
}
}Restart the client app after config changes.
Validate tool registration from the client by calling
discover_toolsfirst, thenlist_providersorrun_providerbased on the returned recommendation.
Notes:
If your client already has config content, merge only the
cloud-mcpserver entry.If your environment needs auth, set env vars before launching the client (
MCP_HTTP_*,MCP_PROVIDER_AUTH_KEY, Vault vars).For remote HTTP integration instead of stdio, run
npm run mcp:httpand register endpointhttp://127.0.0.1:3000/mcpwith the client that supports streamable HTTP MCP.
MCP Tool Reference
The MCP server exposes the following tools. Read-only tools are safe to inspect state; mutating tools change vault, database, or token-index data and should be used carefully.
discover_toolsis read-only. Use it first when you need schema discovery, want a recommendation for which MCP tool fits a task, or need the input schema for a specific tool before calling it.list_providersis read-only. Use it to discover which provider names are currently available before callingget_providerorrun_provider.get_provideris read-only. It returns the stored provider configuration ornullif missing. IfMCP_PROVIDER_AUTH_KEYis set,authorizationKeyis required.set_providermutates vault state and is high-risk because it changes what future CLI calls execute. Use it to register or replace a provider config. The required payload isconfig.command;envdefaults to{};profiles.*.usersis optional and an empty list means any user may use the profile.run_provideris high-risk because it spawns the configured provider CLI and can reach external cloud APIs.argsmust be literal argv segments, not shell text. Use this when the provider name is dynamic.run_<provider>is the provider-specific version ofrun_provider. Use it when the provider is fixed and you want a narrower tool surface.get_command_limitsis read-only. It returns the normalized command-limit policy currently loaded from the database.set_command_limit_sectionmutates the database and then force-pushes the current policy to the selected JSON target. Use supported provider aliases likegcloud,az,aliyun,doctl,tccli, orhcloud; the runtime normalizes them to canonical sections.replace_command_limitsreplaces the entire command-limit policy in the database and then force-pushes the JSON target. The payload must include the canonical sectionsaws.*,gcp.*,azure.*,oci.*,alibaba.*,digitalocean.*,ibmcloud.*,tencent.*, andhuawei.*.push_command_limitsdoes not change the database. It writes the current database-backed policy to the internal file or external source.pushTarget=autoprefers the external source when configured, otherwise the internal file.vault_seed_http_tokengenerates a new bearer token, stores only its SHA-256 hash in the Vault token index, and returns the plaintext token once. Keep the returned token, because it cannot be recovered later.vault_seed_oauth_tokenstores a provided OAuth access token as a SHA-256 hash in the Vault token index and never returns the plaintext token.
Common prerequisites and constraints:
discover_toolsaccepts optionalquery,tool, andlimit. Usetoolfor exact schema lookup andquerywhen you want ranked suggestions.Set
MCP_PROVIDER_AUTH_KEYwhen you want provider vault and token-index admin tools to requireauthorizationKey.scopesandaudienceaccept either a comma-separated string or an array of strings.expiresAtshould be an ISO-8601 timestamp.pathoverrides the Vault token index path when you need a non-default location.Provider CLI resolution still follows the runtime order documented above: repository-local bin,
<PROVIDER>_CLI_BIN, thenPATH.
Example response shapes:
discover_toolsreturnstotalTools,returnedTools, andtools[], where each tool entry includesname,description,risk,recommendation, and JSONinputSchema.vault_seed_http_tokenreturnstoken,tokenHash,tokenId,indexPath, and related entry fields.vault_seed_oauth_tokenreturnstokenHash,tokenId,indexPath, and related entry fields.
Container note
This repository no longer ships a first-party Dockerfile, so it does not provide a built-in container image build path.
If your deployment requires containers, provide your own image definition around the Node entrypoints (node src/mcp.js for MCP mode, node src/index.js for CLI mode) and any cloud CLIs you want available in that runtime.
A sample container definition is available at docker/Containerfile.sample and can be used with either Docker or Podman:
docker build -f docker/Containerfile.sample -t cloud-mcp:local .
podman build -f docker/Containerfile.sample -t cloud-mcp:local .Kubernetes (Helm) sample
A sample Helm chart is available at helm/cloud-mcp.
Build and push an image (Docker or Podman):
docker build -f docker/Containerfile.sample -t ghcr.io/your-org/cloud-mcp:latest .
docker push ghcr.io/your-org/cloud-mcp:latestCopy chart values and edit for your environment:
cp helm/cloud-mcp/values.yaml helm/cloud-mcp/values.local.yamlSet at minimum:
image.repositoryimage.tagenv.VAULT_ADDRsecrets.data.VAULT_TOKENenv.COMMAND_LIMITS_DATABASE_URL(or local-postgres toggle values)
Install or upgrade:
helm upgrade --install cloud-mcp ./helm/cloud-mcp -f helm/cloud-mcp/values.local.yamlVerify:
kubectl rollout status deployment/cloud-mcp-cloud-mcp
kubectl logs deployment/cloud-mcp-cloud-mcp --tail=200Notes:
The chart mounts
cloud-wrap.config.jsonfrom a ConfigMap at/etc/cloud-mcp/cloud-wrap.config.json.VAULT_TOKENandMCP_PROVIDER_AUTH_KEYare provided by Kubernetes Secret (secrets.data).Default container args run MCP mode (
mcp --config /etc/cloud-mcp/cloud-wrap.config.json).
Configuration
Create cloud-wrap.config.json using cloud-wrap.config.example.json as a template.
{
"vault": {
"module": "./external-vault.js",
"options": {}
},
"providers": {
"aws": {
"command": "aws",
"env": {
"AWS_PROFILE": "default"
},
"defaultProfile": "default",
"profileSupport": {
"mode": "env",
"envVar": "AWS_PROFILE"
},
"profiles": {
"default": {
"env": {
"AWS_PROFILE": "default"
},
"users": []
}
}
}
}
}If vault.module is present, the runtime will try to load that module first. The module should expose either createVault, a default factory, or a vault object with the same get/set/snapshot methods as the built-in service. If loading fails, the local in-memory vault is used.
This repo also includes a built-in external HashiCorp Vault adapter at src/core/hashicorpVault.js, mirrored after the akoya-mcp external vault setup. It is auto-selected when either:
VAULT_PROVIDER=externalboth
VAULT_ADDRandVAULT_TOKENare set
Fail-closed behavior: when VAULT_PROVIDER=external and both VAULT_ADDR and VAULT_TOKEN are set, startup fails if the external vault module cannot be loaded or initialized. In this explicit external mode, it does not fall back to local in-memory vault.
CLOUD_WRAP_VAULT_MODULE still takes precedence over all auto-selection logic.
For external vault integrations, these environment variables are forwarded into the external vault options object when set:
VAULT_PROVIDERVAULT_ADDRVAULT_TOKENVAULT_NAMESPACEVAULT_KV_MOUNTVAULT_KV_VERSIONVAULT_SECRET_PATHCOMMAND_LIMITS_LOCAL_POSTGRES_ENABLEDCOMMAND_LIMITS_LOCAL_POSTGRES_PORT
Required vault key contract:
Required environment variables for explicit external mode:
VAULT_PROVIDER=externalVAULT_ADDRVAULT_TOKEN
Required secret key at each provider path:
key name:
providerrequired object fields:
command(string),env(object)optional profile fields:
defaultProfile(string),profiles(map),profileSupport(mode=arg|env, withflagorenvVar)optional per-profile access field:
profiles.<name>.users(string array)
Provider authorization key (when enabled):
set
MCP_PROVIDER_AUTH_KEYto seed vault pathmcp.authorization.providerKeyget_providerandset_providerrequests must includeauthorizationKeymatching that value
When using the built-in external adapter, VAULT_SECRET_PATH is treated as a base path and each cloud CLI provider is stored separately:
${VAULT_SECRET_PATH}/aws${VAULT_SECRET_PATH}/gcp${VAULT_SECRET_PATH}/azure${VAULT_SECRET_PATH}/oci${VAULT_SECRET_PATH}/alibaba${VAULT_SECRET_PATH}/digitalocean${VAULT_SECRET_PATH}/ibmcloud${VAULT_SECRET_PATH}/tencent${VAULT_SECRET_PATH}/huawei
Each provider secret stores one object at key provider containing command, env, and optional profile fields.
Multi-profile provider behavior:
run_providerandrun_<provider>accept optionalprofile.run_providerandrun_<provider>accept optionaluserfor profile access checks.If
profileis provided, runtime appliesprofileSupportto inject profile context via args or env.profiles.<name>.argsandprofiles.<name>.envare merged into execution.profiles.<name>.userscontrols profile access:empty or missing array means profile is available to all users
non-empty array restricts profile use to those users
If
profileis omitted anddefaultProfileis configured, that profile is used.
CLOUD_WRAP_VAULT_MODULE can also be used to override vault.module from config.
For a ready-made external profile, use cloud-wrap.config.external-vault.example.json.
Then run:
npm start -- --config cloud-wrap.config.json aws sts get-caller-identityExtend with additional providers
Add a provider in your config file:
{
"providers": {
"do": {
"command": "doctl",
"env": {
"DIGITALOCEAN_ACCESS_TOKEN": "<token>"
}
}
}
}Then call:
npm start -- run do account getProject structure
src/
index.js # entry point
mcp.js # MCP stdio entry point
program.js # command definitions
core/
context.js # runtime context creation
execute.js # provider CLI spawning
mcp.js # MCP tool registration and server startup
config/
providers.js # built-in provider defaults
loadConfig.js # config loading and validation
utils/
logger.js # pino logger setupThis server cannot be installed
Maintenance
Related MCP Servers
- Alicense-qualityFmaintenanceEnables orchestrating multiple AI CLI agents (Claude Code, Codex, Gemini CLI, Copilot CLI) through a unified MCP interface for task delegation, cross-agent comparison, and specialized tools like code review and debugging.Last updated2814MIT
- Flicense-qualityDmaintenanceExposes a set of CLI tools (test generation, documentation generation, linting, test running, code search) to AI assistants via MCP, allowing them to perform these tasks through natural language.Last updated3
- Flicense-qualityCmaintenanceUnified MCP server for managing cloud resources across AWS, Google Cloud, Azure, and DigitalOcean by wrapping their CLI tools.Last updated

DuploCloud MCP Serverofficial
Alicense-qualityDmaintenanceExposes DuploCloud infrastructure management as MCP tools by dynamically discovering duploctl commands, enabling AI agents to query state and perform auditable actions.Last updatedMIT
Related MCP Connectors
Real-time chat hub for AI agents — Claude Code, Cursor, Cline, Codex over MCP or REST.
Real-time chat hub for AI agents — Claude Code, Cursor, Cline, Codex over MCP or REST.
MCP server for AI agents to plan, verify, and deploy Cloudflare-native apps.
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/LesterAJohn/cloud-mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server