Connectors · MSP & PSA
Portainer MCP server for AI agents.
actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Portainer and the rest of your systems. It gives your agent 308 Portainer actions (153 reads, 104 writes and 51 that wait for a confirmation) and holds the Portainer credential itself, so the agent never does. It paces Portainer's limits and records every call.
100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.
claude mcp add --transport http actionlake https://connect.actionlake.com/mcpdo { action: "portainer.users.list", intent: "check which Portainer account is connected"}# List users · read · 1 upstream call- 308actionsin one signed file
- 153readlook, never change
- 104writecreate and update
- 51wait for a yesdestructive, confirmed first
Set up
Connect Portainer in three steps.
- 01
Add actionlake to Claude.
Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.
https://connect.actionlake.com/mcp - 02
Connect Portainer.
API key. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead. actionlake stores what you paste write-only, sealed under your tenant's key.
api_keyPortainer access token (ptr_...), sent as X-API-KeyhostWhere your Portainer lives: your host
account { op: "connections.requirements", service: "portainer" } # free: exactly what to paste, and what is found for you - 03
Make the first call. Check before a write.
Ask in plain words; Claude picks the action. Before anything changes,
checkvalidates the call and prices it, for free.do { action: "portainer.users.list" }# list users · read · 1 upstream callcheck { action: "portainer.users.create", input: { … } }# free: inputs, permissions, cost and confirmations, nothing sent
Portainer at a glance
- Sign-in
- API key. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead.
- You provide
api_key- Setup fields
host- Limits we pace to
- 20 calls a second, per connection
- API covered
- Portainer CE API 2.45.3 (OpenAPI 3.0.0) plus the Docker Engine API through Portainer's Docker proxy, at your Portainer instance's API base URL, which you enter when connecting
- Built from
- Portainer's documentation, read 23 October 2026api-docs.portainer.ioapi-docs.portainer.iodocs.docker.com
- Service file
- Version 1.0.0, signed (Ed25519)
- Cached reads
- 148 of 153 reads, for up to 5 minutes; a write clears what it affects
- Shared entities
- 5, so ask can line Portainer up with your other systems
- Data
- Processed and stored in Sydney, Australia. No US region yet
Capabilities
What an AI agent can do in Portainer.
308 actions in 27 areas. Every one carries its effect, so a key can allow the reads and hold the rest.
- 153readlook, never change
- 104writecreate and update
- 51destructivewait for a confirmation
Kubernetes
10663 read · 26 write · 17 destructive
Get a list of namespaces · Create a namespace · Get a list of kubernetes Jobs · Get namespace details
Docker engine
4320 read · 13 write · 10 destructive
List Swarm services · List volumes · Create a volume · List networks
Stacks
203 read · 15 write · 2 destructive
List stacks · Inspect a stack · Remove a stack · Update a stack
Endpoints
175 read · 8 write · 4 destructive
Create a new environment(endpoint) · List environments(endpoints) · List Registries on environment · Fetch docker pull limits
Gitops
1410 read · 3 write · 1 destructive
Preview the content of target file in the git repository · List the workflows using a GitOps source · Create a Git source · List all GitOps sources
Users
137 read · 4 write · 2 destructive
List users · Inspect the current user user · Create a new user · Inspect a user
Edge jobs
105 read · 3 write · 2 destructive
Create an EdgeJob from a text · Fetch EdgeJobs list · Fetch the list of tasks on an EdgeJob · Fetch a file of an EdgeJob
Helm
105 read · 3 write · 2 destructive
Get a historical list of releases · Install Helm Chart · List Helm Releases · Create a user helm repository
19 more areas · 75 actions
- Custom templates 8
- Edge stacks 8
- Endpoint groups 7
- Registries 7
- Edge groups 5
- System 5
- Team memberships 5
- Teams 5
- Webhooks 5
- Docker 3
- Resource controls 3
- Settings 3
- Tags 3
- SSL 2
- Templates 2
- Ldap 1
- Motd 1
- Roles 1
- Status 1
Top actions
The Portainer API, shaped for agents.
The ids your agent types, what each does, and the one name it shares with other systems. 68 of Portainer's 69 action names are shared with at least one other connector, so an agent learns them once.
| Action | What it does | Effect | Same name in |
|---|---|---|---|
portainer.users.listList users | List users | read | identity.user.list474 connectors |
portainer.teams.listList teams | List teams | read | identity.group.list262 connectors |
portainer.users.current_user_inspectInspect the current user user | Inspect the current user user | read | identity.current_user.get307 connectors |
portainer.users.createCreate a new user | Create a new user | write | identity.user.create262 connectors |
portainer.teams.createCreate a new team | Create a new team | write | identity.group.create205 connectors |
portainer.roles.listList roles | List roles | read | identity.role.list184 connectors |
portainer.kubernetes.get_namespacesGet a list of namespaces | Get a list of namespaces | read | infra.namespace.list3 connectors |
portainer.users.deleteRemove a user | Remove a user | destructive | identity.user.delete253 connectors |
portainer.kubernetes.create_namespaceCreate a namespace | Create a namespace | write | infra.namespace.create3 connectors |
portainer.users.generate_api_keyGenerate an API key for a user | Generate an API key for a user | write | identity.api_key.create100 connectors |
portainer.users.get_api_keysGet all API keys for a user | Get all API keys for a user | read | identity.api_key.list96 connectors |
portainer.kubernetes.get_jobsGet a list of kubernetes Jobs | Get a list of kubernetes Jobs | read | infra.job.list12 connectors |
Try it
Prompts to paste into Claude.
Each one names the Portainer actions it will call, so you know what it reads and what it changes before you send it.
- Readread
Who has access in Portainer? List every user and their role.
calls
portainer.users.list - Writewrite
Create a new user in Portainer. Show me exactly what you will send before you save it.
calls
portainer.users.create
Governance for Portainer
Destructive actions wait for a yes.
51 Portainer actions are destructive. The first 10:
- Remove a user
portainer.users.delete - Remove a team
portainer.teams.delete - Remove an api-key associated to a user
portainer.users.remove_api_key - Remove a volume
portainer.docker_engine.volumes_remove - Remove a Swarm service
portainer.docker_engine.services_remove - Delete a Kubernetes deployment
portainer.kubernetes.delete_deployment - Remove a network
portainer.docker_engine.networks_remove - Remove a stack
portainer.stacks.delete - Remove a container
portainer.docker_engine.containers_remove - Delete a ConfigMap
portainer.kubernetes.delete_config_map
A destructive action runs only with confirm: true. Under the human policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.
Remove a user?
intent: the user asked me to remove a user
account { op: "keys.create", name: "portainer-agent", allowed_actions: ["portainer.*"], cap_calls: 2000, confirm_policy: "human_for_writes", approval_rules: [ { match: "portainer.users.delete", approver: "[email protected]" }, { match: "portainer.teams.delete", approver: "[email protected]" }, { match: "portainer.users.remove_api_key", approver: "[email protected]" } ]}Cost
What Portainer costs on actionlake.
Every Portainer action is one upstream call, the only thing actionlake bills. Searching, check, cost, account and any call Portainer refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
- 1upstream call per actionall 308 Portainer actions
- 308actions pageeach page of a long list is one call
- 148reads can be cacheda cache hit costs nothing
- 100,000calls a month, freepaid plans from US$49 a month for 250,000
Action index
Every Portainer action.
308 actions by area: the id your agent calls, what it does, and its effect.
Kubernetes106
portainer.kubernetes.create_config_mapCreate a ConfigMapwriteportainer.kubernetes.create_deploymentCreate a Kubernetes deploymentwriteportainer.kubernetes.create_ingressCreate an Ingresswriteportainer.kubernetes.create_namespaceCreate a namespacewriteportainer.kubernetes.create_persistent_volume_claimCreate a PersistentVolumeClaimwriteportainer.kubernetes.create_secretCreate a Secretwriteportainer.kubernetes.create_serviceCreate a servicewriteportainer.kubernetes.delete_cluster_role_bindingsDelete cluster role bindingsdestructiveportainer.kubernetes.delete_cluster_rolesDelete cluster rolesdestructiveportainer.kubernetes.delete_config_mapDelete a ConfigMapdestructiveportainer.kubernetes.delete_cron_jobsDelete Cron Jobsdestructiveportainer.kubernetes.delete_deploymentDelete a Kubernetes deploymentdestructiveportainer.kubernetes.delete_ingressesDelete one or more Ingressesdestructiveportainer.kubernetes.delete_jobsDelete Jobsdestructiveportainer.kubernetes.delete_namespaceDelete kubernetes namespacesdestructiveportainer.kubernetes.delete_persistent_volume_claimsDelete PersistentVolumeClaimsdestructiveportainer.kubernetes.delete_persistent_volumesDelete PersistentVolumesdestructiveportainer.kubernetes.delete_podDelete a kubernetes poddestructiveportainer.kubernetes.delete_role_bindingsDelete role bindingsdestructiveportainer.kubernetes.delete_rolesDelete rolesdestructiveportainer.kubernetes.delete_secretDelete a Secretdestructiveportainer.kubernetes.delete_service_accountsDelete service accountsdestructiveportainer.kubernetes.delete_servicesDelete servicesdestructiveportainer.kubernetes.delete_storage_classesDelete StorageClassesdestructiveportainer.kubernetes.describe_resourceGet a description of a kubernetes resourcereadportainer.kubernetes.drain_nodeDrain a Kubernetes nodewriteportainer.kubernetes.dry_run_manifestsValidate Kubernetes manifests without applying themreadportainer.kubernetes.get_all_applicationsGet a list of applications across all namespaces in the cluster. If the nodeName is provided, it will return the applicareadportainer.kubernetes.get_all_applications_countGet Applications countreadportainer.kubernetes.get_all_cluster_ingressesGet kubernetes ingresses at the cluster levelreadportainer.kubernetes.get_all_cluster_ingresses_countGet Ingresses countreadportainer.kubernetes.get_all_cluster_role_bindingsGet a list of kubernetes cluster role bindingsreadportainer.kubernetes.get_all_cluster_rolesGet a list of kubernetes cluster rolesreadportainer.kubernetes.get_all_config_mapsGet a list of ConfigMapsreadportainer.kubernetes.get_all_config_maps_countGet ConfigMaps countreadportainer.kubernetes.get_all_deploymentsGet Kubernetes deploymentsreadportainer.kubernetes.get_all_eventsGets kubernetes eventsreadportainer.kubernetes.get_all_ingress_controllersGet a list of ingress controllersreadportainer.kubernetes.get_all_ingressesGet a list of Ingressesreadportainer.kubernetes.get_all_persistent_volume_claimsGet all PersistentVolumeClaimsreadportainer.kubernetes.get_all_persistent_volumesGet all PersistentVolumes in the clusterreadportainer.kubernetes.get_all_podsGet Kubernetes podsreadportainer.kubernetes.get_all_services_countGet services countreadportainer.kubernetes.get_all_storage_classesGet all StorageClassesreadportainer.kubernetes.get_all_volumesGet Kubernetes volumes within the given Portainer environmentreadportainer.kubernetes.get_all_volumes_countGet the total number of kubernetes volumes within the given Portainer environment.readportainer.kubernetes.get_applications_resourcesGet the total resource requests and limits of all applicationsreadportainer.kubernetes.get_configGenerate a kubeconfig filereadportainer.kubernetes.get_config_mapGet a ConfigMapreadportainer.kubernetes.get_cron_jobsGet a list of kubernetes Cron Jobsreadportainer.kubernetes.get_dashboardGet the dashboard summary datareadportainer.kubernetes.get_deploymentGet a Kubernetes deploymentreadportainer.kubernetes.get_deployments_for_namespaceGet Kubernetes deployments within a namespacereadportainer.kubernetes.get_events_for_namespaceGets kubernetes events for namespacereadportainer.kubernetes.get_ingressGet an Ingress by namereadportainer.kubernetes.get_ingress_classesGet Kubernetes ingress classesreadportainer.kubernetes.get_ingress_controllers_by_namespaceGet a list ingress controllers by namespacereadportainer.kubernetes.get_jobsGet a list of kubernetes Jobsreadportainer.kubernetes.get_max_resource_limitsGet max CPU and memory limits of all nodes within k8s clusterreadportainer.kubernetes.get_metrics_for_all_nodesGet a list of nodes with their live metricsreadportainer.kubernetes.get_metrics_for_all_podsGet a list of pods with their live metricsreadportainer.kubernetes.get_metrics_for_nodeGet live metrics for a nodereadportainer.kubernetes.get_metrics_for_podGet live metrics for a podreadportainer.kubernetes.get_namespaceGet namespace detailsreadportainer.kubernetes.get_namespacesGet a list of namespacesreadportainer.kubernetes.get_namespaces_countGet the total number of kubernetes namespaces within the given Portainer environment.readportainer.kubernetes.get_nodesGet Kubernetes cluster nodesreadportainer.kubernetes.get_nodes_limitsGet CPU and memory limits of all nodes within k8s clusterreadportainer.kubernetes.get_persistent_volumeGet a specific PersistentVolumereadportainer.kubernetes.get_persistent_volume_claimGet a specific PersistentVolumeClaimreadportainer.kubernetes.get_persistent_volume_claims_in_namespaceGet PersistentVolumeClaims in a namespacereadportainer.kubernetes.get_pods_for_namespaceGet Kubernetes pods within a namespacereadportainer.kubernetes.get_rbac_statusCheck if RBAC is enabledreadportainer.kubernetes.get_replica_setsGet Kubernetes replica sets within a namespacereadportainer.kubernetes.get_resource_quotasGet Kubernetes resource quotas within a namespacereadportainer.kubernetes.get_role_bindingsGet a list of kubernetes role bindingsreadportainer.kubernetes.get_rolesGet a list of kubernetes rolesreadportainer.kubernetes.get_secretGet a Secretreadportainer.kubernetes.get_secretsGet a list of Secretsreadportainer.kubernetes.get_secrets_countGet Secrets countreadportainer.kubernetes.get_service_accountGet a kubernetes service accountreadportainer.kubernetes.get_service_accountsGet a list of kubernetes service accountsreadportainer.kubernetes.get_servicesGet a list of servicesreadportainer.kubernetes.get_services_by_namespaceGet a list of services for a given namespacereadportainer.kubernetes.get_storage_classGet a specific StorageClassreadportainer.kubernetes.get_versionGet the Kubernetes cluster version and Portainer-relevant capabilitiesreadportainer.kubernetes.get_volumeGet a Kubernetes volume within the given Portainer environmentreadportainer.kubernetes.get_volumes_in_namespaceGet Kubernetes volumes within a namespace in the given Portainer environmentreadportainer.kubernetes.namespaces_toggle_systemToggle the system state for a namespacewriteportainer.kubernetes.patch_deploymentAnnotate a Kubernetes deploymentwriteportainer.kubernetes.resize_persistent_volume_claimResize a PersistentVolumeClaimwriteportainer.kubernetes.restart_podRestart all containers in a Kubernetes podwriteportainer.kubernetes.rollback_deploymentRoll a Kubernetes deployment backwriteportainer.kubernetes.scale_deploymentScale a Kubernetes deploymentwriteportainer.kubernetes.set_default_storage_classSet a StorageClass as defaultwriteportainer.kubernetes.update_config_mapUpdate a ConfigMapwriteportainer.kubernetes.update_deploymentUpdate a Kubernetes deploymentwriteportainer.kubernetes.update_ingressUpdate an Ingresswriteportainer.kubernetes.update_ingress_controllersUpdate (block/unblock) ingress controllerswriteportainer.kubernetes.update_ingress_controllers_by_namespaceUpdate (block/unblock) ingress controllers by namespacewriteportainer.kubernetes.update_namespaceUpdate a namespacewriteportainer.kubernetes.update_namespace_deprecatedUpdate a namespacewriteportainer.kubernetes.update_persistent_volume_reclaim_policyUpdate reclaim policy of a PersistentVolumewriteportainer.kubernetes.update_secretUpdate a Secretwriteportainer.kubernetes.update_serviceUpdate a servicewriteportainer.kubernetes.update_service_account_image_pull_secretsUpdate image pull secrets for a service accountwrite
Docker engine43
portainer.docker_engine.containers_changesList filesystem changes in a containerreadportainer.docker_engine.containers_createCreate a containerwriteportainer.docker_engine.containers_inspectInspect a containerreadportainer.docker_engine.containers_killSend a signal to (kill) a containerwriteportainer.docker_engine.containers_listList containersreadportainer.docker_engine.containers_pausePause a containerwriteportainer.docker_engine.containers_pruneDelete all stopped containersdestructiveportainer.docker_engine.containers_removeRemove a containerdestructiveportainer.docker_engine.containers_renameRename a containerwriteportainer.docker_engine.containers_restartRestart a containerdestructiveportainer.docker_engine.containers_startStart a containerwriteportainer.docker_engine.containers_statsGet a one-shot resource usage snapshot of a containerreadportainer.docker_engine.containers_stopStop a containerwriteportainer.docker_engine.containers_topList processes running inside a containerreadportainer.docker_engine.containers_unpauseUnpause a containerwriteportainer.docker_engine.containers_updateUpdate a container's resource limits and restart policywriteportainer.docker_engine.images_historyGet the layer history of an imagereadportainer.docker_engine.images_inspectInspect an imagereadportainer.docker_engine.images_listList imagesreadportainer.docker_engine.images_pruneDelete unused imagesdestructiveportainer.docker_engine.images_removeRemove an imagedestructiveportainer.docker_engine.images_tagTag an imagewriteportainer.docker_engine.infoGet system-wide information about the Docker hostreadportainer.docker_engine.networks_connectConnect a container to a networkwriteportainer.docker_engine.networks_createCreate a networkwriteportainer.docker_engine.networks_disconnectDisconnect a container from a networkwriteportainer.docker_engine.networks_inspectInspect a networkreadportainer.docker_engine.networks_listList networksreadportainer.docker_engine.networks_pruneDelete unused networksdestructiveportainer.docker_engine.networks_removeRemove a networkdestructiveportainer.docker_engine.nodes_listList Swarm nodesreadportainer.docker_engine.services_inspectInspect a Swarm servicereadportainer.docker_engine.services_listList Swarm servicesreadportainer.docker_engine.services_removeRemove a Swarm servicedestructiveportainer.docker_engine.swarm_inspectInspect the Swarmreadportainer.docker_engine.system_dfGet Docker disk usage (images, containers, volumes, build cache)readportainer.docker_engine.tasks_listList Swarm tasksreadportainer.docker_engine.versionGet the Docker Engine versionreadportainer.docker_engine.volumes_createCreate a volumewriteportainer.docker_engine.volumes_inspectInspect a volumereadportainer.docker_engine.volumes_listList volumesreadportainer.docker_engine.volumes_pruneDelete unused volumesdestructiveportainer.docker_engine.volumes_removeRemove a volumedestructive
Stacks20
portainer.stacks.associateAssociate an orphaned stack to a new environment(endpoint)writeportainer.stacks.create_docker_standalone_repositoryDeploy a new compose stack from repositorywriteportainer.stacks.create_docker_standalone_stringDeploy a new compose stack from a textwriteportainer.stacks.create_docker_swarm_repositoryDeploy a new swarm stack from a git repositorywriteportainer.stacks.create_docker_swarm_stringDeploy a new swarm stack from a textwriteportainer.stacks.create_kubernetes_fileDeploy a new kubernetes stack from a filewriteportainer.stacks.create_kubernetes_gitDeploy a new kubernetes stack from a git repositorywriteportainer.stacks.create_kubernetes_urlDeploy a new kubernetes stack from an urlwriteportainer.stacks.deleteRemove a stackdestructiveportainer.stacks.delete_kubernetes_by_nameRemove Kubernetes stacks by namedestructiveportainer.stacks.file_inspectRetrieve the content of the Stack file for the specified stackreadportainer.stacks.git_redeployRedeploy a stackwriteportainer.stacks.inspectInspect a stackreadportainer.stacks.listList stacksreadportainer.stacks.migrateMigrate a stack to another environment(endpoint)writeportainer.stacks.startStarts a stopped Stackwriteportainer.stacks.stopStop a running Stackwriteportainer.stacks.updateUpdate a stackwriteportainer.stacks.update_gitUpdate a stack's Git configswriteportainer.stacks.webhook_invokeWebhook for triggering stack updates from gitwrite
Endpoints17
portainer.endpoints.association_deleteDe-association an edge environment(endpoint)destructiveportainer.endpoints.createCreate a new environment(endpoint)writeportainer.endpoints.deleteRemove an environmentdestructiveportainer.endpoints.delete_batchRemove multiple environmentsdestructiveportainer.endpoints.delete_batch_deprecatedRemove multiple environmentsdestructiveportainer.endpoints.dockerhub_statusFetch docker pull limitsreadportainer.endpoints.force_update_serviceForce update a docker servicewriteportainer.endpoints.inspectInspect an environment(endpoint)readportainer.endpoints.listList environments(endpoints)readportainer.endpoints.registries_listList Registries on environmentreadportainer.endpoints.registry_accessUpdate registry access for environmentwriteportainer.endpoints.settings_updateUpdate settings for an environment(endpoint)writeportainer.endpoints.snapshotSnapshots an environment(endpoint)writeportainer.endpoints.snapshotsSnapshot all environments(endpoints)writeportainer.endpoints.summary_countsGet environment summary countsreadportainer.endpoints.updateUpdate an environment(endpoint)writeportainer.endpoints.update_relationsUpdate relations for a list of environmentswrite
Gitops14
portainer.gitops.git_operation_repo_file_previewPreview the content of target file in the git repositoryreadportainer.gitops.source_getGet a GitOps source by IDreadportainer.gitops.source_workflows_listList the workflows using a GitOps sourcereadportainer.gitops.sources_create_gitCreate a Git sourcewriteportainer.gitops.sources_deleteDelete a sourcedestructiveportainer.gitops.sources_listList all GitOps sourcesreadportainer.gitops.sources_summarySummarize GitOps source status countsreadportainer.gitops.sources_testTest a Git source connectionreadportainer.gitops.sources_test_by_idTest the connection of a stored sourcereadportainer.gitops.sources_update_accessUpdate a GitOps source's access controlwriteportainer.gitops.sources_update_gitUpdate a Git sourcewriteportainer.gitops.workflow_getGet a GitOps workflow by IDreadportainer.gitops.workflows_listList all GitOps workflowsreadportainer.gitops.workflows_summarySummarize GitOps workflow status countsread
Users13
portainer.users.admin_checkCheck administrator account existencereadportainer.users.createCreate a new userwriteportainer.users.current_user_inspectInspect the current user userreadportainer.users.deleteRemove a userdestructiveportainer.users.effective_access_inspectInspect a user's effective access on every environmentreadportainer.users.generate_api_keyGenerate an API key for a userwriteportainer.users.get_api_keysGet all API keys for a userreadportainer.users.inspectInspect a userreadportainer.users.listList usersreadportainer.users.memberships_inspectInspect a user membershipsreadportainer.users.remove_api_keyRemove an api-key associated to a userdestructiveportainer.users.updateUpdate a userwriteportainer.users.update_passwordUpdate password for a userwrite
Edge jobs10
portainer.edge_jobs.create_stringCreate an EdgeJob from a textwriteportainer.edge_jobs.deleteDelete an EdgeJobdestructiveportainer.edge_jobs.fileFetch a file of an EdgeJobreadportainer.edge_jobs.inspectInspect an EdgeJobreadportainer.edge_jobs.listFetch EdgeJobs listreadportainer.edge_jobs.task_logs_inspectFetch the log for a specifc task on an EdgeJobreadportainer.edge_jobs.tasks_clearClear the log for a specifc task on an EdgeJobdestructiveportainer.edge_jobs.tasks_collectCollect the log for a specifc task on an EdgeJobwriteportainer.edge_jobs.tasks_listFetch the list of tasks on an EdgeJobreadportainer.edge_jobs.updateUpdate an EdgeJobwrite
Helm10
portainer.helm.deleteDelete Helm Releasedestructiveportainer.helm.getGet a helm releasereadportainer.helm.get_historyGet a historical list of releasesreadportainer.helm.installInstall Helm Chartwriteportainer.helm.listList Helm Releasesreadportainer.helm.repo_searchSearch Helm Chartsreadportainer.helm.rollbackRollback a helm releasewriteportainer.helm.user_repositories_listList a users helm repositoriesreadportainer.helm.user_repository_createCreate a user helm repositorywriteportainer.helm.user_repository_deleteDelete a users helm repositoryiesdestructive
Custom templates8
portainer.custom_templates.create_repositoryCreate a custom templatewriteportainer.custom_templates.create_stringCreate a custom templatewriteportainer.custom_templates.deleteRemove a templatedestructiveportainer.custom_templates.fileGet Template stack file content.readportainer.custom_templates.git_fetchFetch the latest config file content based on custom template's git repository configurationwriteportainer.custom_templates.inspectInspect a custom templatereadportainer.custom_templates.listList available custom templatesreadportainer.custom_templates.updateUpdate a templatewrite
Edge stacks8
portainer.edge_stacks.create_repositoryCreate an EdgeStack from a git repositorywriteportainer.edge_stacks.create_stringCreate an EdgeStack from a textwriteportainer.edge_stacks.deleteDelete an EdgeStackdestructiveportainer.edge_stacks.fileFetches the stack file for an EdgeStackreadportainer.edge_stacks.inspectInspect an EdgeStackreadportainer.edge_stacks.listFetches the list of EdgeStacksreadportainer.edge_stacks.status_updateUpdate an EdgeStack statuswriteportainer.edge_stacks.updateUpdate an EdgeStackwrite
Endpoint groups7
portainer.endpoint_groups.add_endpointAdd an environment(endpoint) to an environment(endpoint) groupwriteportainer.endpoint_groups.createCreate an Environment(Endpoint) Groupwriteportainer.endpoint_groups.deleteRemove an environment(endpoint) groupdestructiveportainer.endpoint_groups.delete_endpointRemoves environment(endpoint) from an environment(endpoint) groupdestructiveportainer.endpoint_groups.inspectInspect an Environment(Endpoint) groupreadportainer.endpoint_groups.listList Environment(Endpoint) groupsreadportainer.endpoint_groups.updateUpdate an environment(endpoint) groupwrite
Registries7
portainer.registries.configureConfigures a registrywriteportainer.registries.createCreate a new registrywriteportainer.registries.deleteRemove a registrydestructiveportainer.registries.inspectInspect a registryreadportainer.registries.listList Registriesreadportainer.registries.pingTest registry connectionreadportainer.registries.updateUpdate a registrywrite
Edge groups5
portainer.edge_groups.createCreate an EdgeGroupwriteportainer.edge_groups.deleteDeletes an EdgeGroupdestructiveportainer.edge_groups.inspectInspects an EdgeGroupreadportainer.edge_groups.listList EdgeGroupsreadportainer.edge_groups.updateUpdates an EdgeGroupwrite
System5
portainer.system.infoRetrieve system inforeadportainer.system.nodes_countRetrieve the count of nodesreadportainer.system.statusCheck Portainer statusreadportainer.system.upgradeUpgrade Portainer to BEwriteportainer.system.versionCheck for portainer updatesread
Team memberships5
portainer.team_memberships.createCreate a new team membershipwriteportainer.team_memberships.deleteRemove a team membershipdestructiveportainer.team_memberships.listList team membershipsreadportainer.team_memberships.team_membershipsList team membershipsreadportainer.team_memberships.updateUpdate a team membershipwrite
Teams5
portainer.teams.createCreate a new teamwriteportainer.teams.deleteRemove a teamdestructiveportainer.teams.inspectInspect a teamreadportainer.teams.listList teamsreadportainer.teams.updateUpdate a teamwrite
Webhooks5
portainer.webhooks.createCreate a webhookwriteportainer.webhooks.deleteDelete a webhookdestructiveportainer.webhooks.executeExecute a webhookwriteportainer.webhooks.listList webhooksreadportainer.webhooks.updateUpdate a webhookwrite
Docker3
portainer.docker.container_gpus_inspectFetch container gpus datareadportainer.docker.dashboardGet counters for the dashboardreadportainer.docker.images_listFetch imagesread
Resource controls3
portainer.resource_controls.createCreate a new resource controlwriteportainer.resource_controls.deleteRemove a resource controldestructiveportainer.resource_controls.updateUpdate a resource controlwrite
Settings3
portainer.settings.inspectRetrieve Portainer settingsreadportainer.settings.publicRetrieve Portainer public settingsreadportainer.settings.updateUpdate Portainer settingswrite
Tags3
portainer.tags.createCreate a new tagwriteportainer.tags.deleteRemove a tagdestructiveportainer.tags.listList tagsread
SSL2
portainer.ssl.inspectInspect the ssl settingsreadportainer.ssl.updateUpdate the ssl settingswrite
Templates2
portainer.templates.fileGet a template's filereadportainer.templates.listList available templatesread
Ldap1
portainer.ldap.checkTest LDAP connectivityread
Motd1
portainer.motd.motdFetches the message of the dayread
Roles1
portainer.roles.listList rolesread
Status1
portainer.status.inspectCheck Portainer statusread
Questions
The Portainer MCP server, answered.
Is there a Portainer MCP server for Claude?
Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 308 Portainer actions across kubernetes, docker engine, stacks and endpoints, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Portainer.
What do I need to connect Portainer?
Portainer access token (ptr_...), sent as X-API-Key. Plus your host. The free call account { op: "connections.requirements", service: "portainer" } lists exactly what to paste.
Can an AI agent delete or change things in Portainer?
Only if its key allows it, and only with an explicit confirmation. 51 Portainer actions are destructive, including remove a user, remove a team and remove an api-key associated to a user. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.
Will an AI agent use up my Portainer API limit?
actionlake paces every call to the limits in the Portainer service file: 20 calls a second per connection. Repeated reads are answered from cache (148 Portainer actions can be), which never reaches Portainer.
What does a Portainer action cost?
One upstream call, the only unit actionlake bills. A list that pages bills one call per page (308 Portainer actions page). Cache hits, searches, dry runs and calls Portainer refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.
Which Portainer API does it cover?
The Portainer CE API 2.45.3 (OpenAPI 3.0.0) plus the Docker Engine API through Portainer's Docker proxy at your Portainer instance's API base URL, which you enter when connecting. It is built from Portainer's documentation as read on 23 October 2026. 308 actions in 27 areas, each one in the signed service file (version 1.0.0).
Does actionlake keep my Portainer data, and where?
actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to 5 minutes, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Portainer credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.
Which AI clients can use it?
Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.
Give your agent Portainer today.
Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.