---
title: "Portainer MCP server for AI agents - actionlake"
description: "Give Claude 308 Portainer actions through one MCP server: kubernetes, docker engine, stacks. Your agent never holds the credential. 100,000 calls a month free."
canonical: https://actionlake.com/connectors/portainer
updated: 2026-10-23
---

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.

[Connect Portainer free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

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/mcp`

the first call

```
do {
  action: "portainer.users.list",
  intent: "check which Portainer account is connected"
}
# List users · read · 1 upstream call
```

- 308 actions in one signed file
- 153 read look, never change
- 104 write create and update
- 51 wait for a yes destructive, confirmed first

Set up

## Connect Portainer in three steps.

1. 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`
2. 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_key` Portainer access token (ptr_...), sent as X-API-Key
   - `host` Where your Portainer lives: your host
   ```
   account { op: "connections.requirements", service: "portainer" }
   # free: exactly what to paste, and what is found for you
   ```
3. 03
   ### Make the first call. Check before a write.
   Ask in plain words; Claude picks the action. Before anything changes, `check` validates the call and prices it, for free.
   ```
   do    { action: "portainer.users.list" }
   # list users · read · 1 upstream call
   check { 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 2026[api-docs.portainer.io](https://api-docs.portainer.io/versions/ce/2.45.3/openapi.yaml) [api-docs.portainer.io](https://api-docs.portainer.io/?edition=ce) [docs.docker.com](https://docs.docker.com/reference/api/engine/)

**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.

- **153** read look, never change
- **104** write create and update
- **51** destructive wait for a confirmation

1. ### Kubernetes
   106
   63 read · 26 write · 17 destructive
   Get a list of namespaces · Create a namespace · Get a list of kubernetes Jobs · Get namespace details
2. ### Docker engine
   43
   20 read · 13 write · 10 destructive
   List Swarm services · List volumes · Create a volume · List networks
3. ### Stacks
   20
   3 read · 15 write · 2 destructive
   List stacks · Inspect a stack · Remove a stack · Update a stack
4. ### Endpoints
   17
   5 read · 8 write · 4 destructive
   Create a new environment(endpoint) · List environments(endpoints) · List Registries on environment · Fetch docker pull limits
5. ### Gitops
   14
   10 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
6. ### Users
   13
   7 read · 4 write · 2 destructive
   List users · Inspect the current user user · Create a new user · Inspect a user
7. ### Edge jobs
   10
   5 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
8. ### Helm
   10
   5 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.list` List users | List users | read | `identity.user.list` 474 connectors |
| `portainer.teams.list` List teams | List teams | read | `identity.group.list` 262 connectors |
| `portainer.users.current_user_inspect` Inspect the current user user | Inspect the current user user | read | `identity.current_user.get` 307 connectors |
| `portainer.users.create` Create a new user | Create a new user | write | `identity.user.create` 262 connectors |
| `portainer.teams.create` Create a new team | Create a new team | write | `identity.group.create` 205 connectors |
| `portainer.roles.list` List roles | List roles | read | `identity.role.list` 184 connectors |
| `portainer.kubernetes.get_namespaces` Get a list of namespaces | Get a list of namespaces | read | `infra.namespace.list` 3 connectors |
| `portainer.users.delete` Remove a user | Remove a user | destructive | `identity.user.delete` 253 connectors |
| `portainer.kubernetes.create_namespace` Create a namespace | Create a namespace | write | `infra.namespace.create` 3 connectors |
| `portainer.users.generate_api_key` Generate an API key for a user | Generate an API key for a user | write | `identity.api_key.create` 100 connectors |
| `portainer.users.get_api_keys` Get all API keys for a user | Get all API keys for a user | read | `identity.api_key.list` 96 connectors |
| `portainer.kubernetes.get_jobs` Get a list of kubernetes Jobs | Get a list of kubernetes Jobs | read | `infra.job.list` 12 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.

1. Read read
   Who has access in Portainer? List every user and their role.
   calls `portainer.users.list`
2. Write write
   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.

do portainer.users.delete confirm_policy: **human**

Remove a user?

**intent:** the user asked me to remove a user

run suspended · waiting for a named person · key _portainer-agent_ cannot confirm itself

In the console, or from an emailed signed link.

a key for this connector

```
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: "lead@example.com" },
    { match: "portainer.teams.delete", approver: "lead@example.com" },
    { match: "portainer.users.remove_api_key", approver: "lead@example.com" }
  ]
}
```

Illustrative. Scoped to Portainer only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

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.

- 1 upstream call per action all 308 Portainer actions
- 308 actions page each page of a long list is one call
- 148 reads can be cached a cache hit costs nothing
- 100,000 calls a month, free paid plans from US$49 a month for 250,000

[See pricing](https://actionlake.com/pricing)

Action index

## Every Portainer action.

308 actions by area: the id your agent calls, what it does, and its effect.

**Kubernetes 106**

- `portainer.kubernetes.create_config_map` Create a ConfigMap write
- `portainer.kubernetes.create_deployment` Create a Kubernetes deployment write
- `portainer.kubernetes.create_ingress` Create an Ingress write
- `portainer.kubernetes.create_namespace` Create a namespace write
- `portainer.kubernetes.create_persistent_volume_claim` Create a PersistentVolumeClaim write
- `portainer.kubernetes.create_secret` Create a Secret write
- `portainer.kubernetes.create_service` Create a service write
- `portainer.kubernetes.delete_cluster_role_bindings` Delete cluster role bindings destructive
- `portainer.kubernetes.delete_cluster_roles` Delete cluster roles destructive
- `portainer.kubernetes.delete_config_map` Delete a ConfigMap destructive
- `portainer.kubernetes.delete_cron_jobs` Delete Cron Jobs destructive
- `portainer.kubernetes.delete_deployment` Delete a Kubernetes deployment destructive
- `portainer.kubernetes.delete_ingresses` Delete one or more Ingresses destructive
- `portainer.kubernetes.delete_jobs` Delete Jobs destructive
- `portainer.kubernetes.delete_namespace` Delete kubernetes namespaces destructive
- `portainer.kubernetes.delete_persistent_volume_claims` Delete PersistentVolumeClaims destructive
- `portainer.kubernetes.delete_persistent_volumes` Delete PersistentVolumes destructive
- `portainer.kubernetes.delete_pod` Delete a kubernetes pod destructive
- `portainer.kubernetes.delete_role_bindings` Delete role bindings destructive
- `portainer.kubernetes.delete_roles` Delete roles destructive
- `portainer.kubernetes.delete_secret` Delete a Secret destructive
- `portainer.kubernetes.delete_service_accounts` Delete service accounts destructive
- `portainer.kubernetes.delete_services` Delete services destructive
- `portainer.kubernetes.delete_storage_classes` Delete StorageClasses destructive
- `portainer.kubernetes.describe_resource` Get a description of a kubernetes resource read
- `portainer.kubernetes.drain_node` Drain a Kubernetes node write
- `portainer.kubernetes.dry_run_manifests` Validate Kubernetes manifests without applying them read
- `portainer.kubernetes.get_all_applications` Get a list of applications across all namespaces in the cluster. If the nodeName is provided, it will return the applica read
- `portainer.kubernetes.get_all_applications_count` Get Applications count read
- `portainer.kubernetes.get_all_cluster_ingresses` Get kubernetes ingresses at the cluster level read
- `portainer.kubernetes.get_all_cluster_ingresses_count` Get Ingresses count read
- `portainer.kubernetes.get_all_cluster_role_bindings` Get a list of kubernetes cluster role bindings read
- `portainer.kubernetes.get_all_cluster_roles` Get a list of kubernetes cluster roles read
- `portainer.kubernetes.get_all_config_maps` Get a list of ConfigMaps read
- `portainer.kubernetes.get_all_config_maps_count` Get ConfigMaps count read
- `portainer.kubernetes.get_all_deployments` Get Kubernetes deployments read
- `portainer.kubernetes.get_all_events` Gets kubernetes events read
- `portainer.kubernetes.get_all_ingress_controllers` Get a list of ingress controllers read
- `portainer.kubernetes.get_all_ingresses` Get a list of Ingresses read
- `portainer.kubernetes.get_all_persistent_volume_claims` Get all PersistentVolumeClaims read
- `portainer.kubernetes.get_all_persistent_volumes` Get all PersistentVolumes in the cluster read
- `portainer.kubernetes.get_all_pods` Get Kubernetes pods read
- `portainer.kubernetes.get_all_services_count` Get services count read
- `portainer.kubernetes.get_all_storage_classes` Get all StorageClasses read
- `portainer.kubernetes.get_all_volumes` Get Kubernetes volumes within the given Portainer environment read
- `portainer.kubernetes.get_all_volumes_count` Get the total number of kubernetes volumes within the given Portainer environment. read
- `portainer.kubernetes.get_applications_resources` Get the total resource requests and limits of all applications read
- `portainer.kubernetes.get_config` Generate a kubeconfig file read
- `portainer.kubernetes.get_config_map` Get a ConfigMap read
- `portainer.kubernetes.get_cron_jobs` Get a list of kubernetes Cron Jobs read
- `portainer.kubernetes.get_dashboard` Get the dashboard summary data read
- `portainer.kubernetes.get_deployment` Get a Kubernetes deployment read
- `portainer.kubernetes.get_deployments_for_namespace` Get Kubernetes deployments within a namespace read
- `portainer.kubernetes.get_events_for_namespace` Gets kubernetes events for namespace read
- `portainer.kubernetes.get_ingress` Get an Ingress by name read
- `portainer.kubernetes.get_ingress_classes` Get Kubernetes ingress classes read
- `portainer.kubernetes.get_ingress_controllers_by_namespace` Get a list ingress controllers by namespace read
- `portainer.kubernetes.get_jobs` Get a list of kubernetes Jobs read
- `portainer.kubernetes.get_max_resource_limits` Get max CPU and memory limits of all nodes within k8s cluster read
- `portainer.kubernetes.get_metrics_for_all_nodes` Get a list of nodes with their live metrics read
- `portainer.kubernetes.get_metrics_for_all_pods` Get a list of pods with their live metrics read
- `portainer.kubernetes.get_metrics_for_node` Get live metrics for a node read
- `portainer.kubernetes.get_metrics_for_pod` Get live metrics for a pod read
- `portainer.kubernetes.get_namespace` Get namespace details read
- `portainer.kubernetes.get_namespaces` Get a list of namespaces read
- `portainer.kubernetes.get_namespaces_count` Get the total number of kubernetes namespaces within the given Portainer environment. read
- `portainer.kubernetes.get_nodes` Get Kubernetes cluster nodes read
- `portainer.kubernetes.get_nodes_limits` Get CPU and memory limits of all nodes within k8s cluster read
- `portainer.kubernetes.get_persistent_volume` Get a specific PersistentVolume read
- `portainer.kubernetes.get_persistent_volume_claim` Get a specific PersistentVolumeClaim read
- `portainer.kubernetes.get_persistent_volume_claims_in_namespace` Get PersistentVolumeClaims in a namespace read
- `portainer.kubernetes.get_pods_for_namespace` Get Kubernetes pods within a namespace read
- `portainer.kubernetes.get_rbac_status` Check if RBAC is enabled read
- `portainer.kubernetes.get_replica_sets` Get Kubernetes replica sets within a namespace read
- `portainer.kubernetes.get_resource_quotas` Get Kubernetes resource quotas within a namespace read
- `portainer.kubernetes.get_role_bindings` Get a list of kubernetes role bindings read
- `portainer.kubernetes.get_roles` Get a list of kubernetes roles read
- `portainer.kubernetes.get_secret` Get a Secret read
- `portainer.kubernetes.get_secrets` Get a list of Secrets read
- `portainer.kubernetes.get_secrets_count` Get Secrets count read
- `portainer.kubernetes.get_service_account` Get a kubernetes service account read
- `portainer.kubernetes.get_service_accounts` Get a list of kubernetes service accounts read
- `portainer.kubernetes.get_services` Get a list of services read
- `portainer.kubernetes.get_services_by_namespace` Get a list of services for a given namespace read
- `portainer.kubernetes.get_storage_class` Get a specific StorageClass read
- `portainer.kubernetes.get_version` Get the Kubernetes cluster version and Portainer-relevant capabilities read
- `portainer.kubernetes.get_volume` Get a Kubernetes volume within the given Portainer environment read
- `portainer.kubernetes.get_volumes_in_namespace` Get Kubernetes volumes within a namespace in the given Portainer environment read
- `portainer.kubernetes.namespaces_toggle_system` Toggle the system state for a namespace write
- `portainer.kubernetes.patch_deployment` Annotate a Kubernetes deployment write
- `portainer.kubernetes.resize_persistent_volume_claim` Resize a PersistentVolumeClaim write
- `portainer.kubernetes.restart_pod` Restart all containers in a Kubernetes pod write
- `portainer.kubernetes.rollback_deployment` Roll a Kubernetes deployment back write
- `portainer.kubernetes.scale_deployment` Scale a Kubernetes deployment write
- `portainer.kubernetes.set_default_storage_class` Set a StorageClass as default write
- `portainer.kubernetes.update_config_map` Update a ConfigMap write
- `portainer.kubernetes.update_deployment` Update a Kubernetes deployment write
- `portainer.kubernetes.update_ingress` Update an Ingress write
- `portainer.kubernetes.update_ingress_controllers` Update (block/unblock) ingress controllers write
- `portainer.kubernetes.update_ingress_controllers_by_namespace` Update (block/unblock) ingress controllers by namespace write
- `portainer.kubernetes.update_namespace` Update a namespace write
- `portainer.kubernetes.update_namespace_deprecated` Update a namespace write
- `portainer.kubernetes.update_persistent_volume_reclaim_policy` Update reclaim policy of a PersistentVolume write
- `portainer.kubernetes.update_secret` Update a Secret write
- `portainer.kubernetes.update_service` Update a service write
- `portainer.kubernetes.update_service_account_image_pull_secrets` Update image pull secrets for a service account write

**Docker engine 43**

- `portainer.docker_engine.containers_changes` List filesystem changes in a container read
- `portainer.docker_engine.containers_create` Create a container write
- `portainer.docker_engine.containers_inspect` Inspect a container read
- `portainer.docker_engine.containers_kill` Send a signal to (kill) a container write
- `portainer.docker_engine.containers_list` List containers read
- `portainer.docker_engine.containers_pause` Pause a container write
- `portainer.docker_engine.containers_prune` Delete all stopped containers destructive
- `portainer.docker_engine.containers_remove` Remove a container destructive
- `portainer.docker_engine.containers_rename` Rename a container write
- `portainer.docker_engine.containers_restart` Restart a container destructive
- `portainer.docker_engine.containers_start` Start a container write
- `portainer.docker_engine.containers_stats` Get a one-shot resource usage snapshot of a container read
- `portainer.docker_engine.containers_stop` Stop a container write
- `portainer.docker_engine.containers_top` List processes running inside a container read
- `portainer.docker_engine.containers_unpause` Unpause a container write
- `portainer.docker_engine.containers_update` Update a container's resource limits and restart policy write
- `portainer.docker_engine.images_history` Get the layer history of an image read
- `portainer.docker_engine.images_inspect` Inspect an image read
- `portainer.docker_engine.images_list` List images read
- `portainer.docker_engine.images_prune` Delete unused images destructive
- `portainer.docker_engine.images_remove` Remove an image destructive
- `portainer.docker_engine.images_tag` Tag an image write
- `portainer.docker_engine.info` Get system-wide information about the Docker host read
- `portainer.docker_engine.networks_connect` Connect a container to a network write
- `portainer.docker_engine.networks_create` Create a network write
- `portainer.docker_engine.networks_disconnect` Disconnect a container from a network write
- `portainer.docker_engine.networks_inspect` Inspect a network read
- `portainer.docker_engine.networks_list` List networks read
- `portainer.docker_engine.networks_prune` Delete unused networks destructive
- `portainer.docker_engine.networks_remove` Remove a network destructive
- `portainer.docker_engine.nodes_list` List Swarm nodes read
- `portainer.docker_engine.services_inspect` Inspect a Swarm service read
- `portainer.docker_engine.services_list` List Swarm services read
- `portainer.docker_engine.services_remove` Remove a Swarm service destructive
- `portainer.docker_engine.swarm_inspect` Inspect the Swarm read
- `portainer.docker_engine.system_df` Get Docker disk usage (images, containers, volumes, build cache) read
- `portainer.docker_engine.tasks_list` List Swarm tasks read
- `portainer.docker_engine.version` Get the Docker Engine version read
- `portainer.docker_engine.volumes_create` Create a volume write
- `portainer.docker_engine.volumes_inspect` Inspect a volume read
- `portainer.docker_engine.volumes_list` List volumes read
- `portainer.docker_engine.volumes_prune` Delete unused volumes destructive
- `portainer.docker_engine.volumes_remove` Remove a volume destructive

**Stacks 20**

- `portainer.stacks.associate` Associate an orphaned stack to a new environment(endpoint) write
- `portainer.stacks.create_docker_standalone_repository` Deploy a new compose stack from repository write
- `portainer.stacks.create_docker_standalone_string` Deploy a new compose stack from a text write
- `portainer.stacks.create_docker_swarm_repository` Deploy a new swarm stack from a git repository write
- `portainer.stacks.create_docker_swarm_string` Deploy a new swarm stack from a text write
- `portainer.stacks.create_kubernetes_file` Deploy a new kubernetes stack from a file write
- `portainer.stacks.create_kubernetes_git` Deploy a new kubernetes stack from a git repository write
- `portainer.stacks.create_kubernetes_url` Deploy a new kubernetes stack from an url write
- `portainer.stacks.delete` Remove a stack destructive
- `portainer.stacks.delete_kubernetes_by_name` Remove Kubernetes stacks by name destructive
- `portainer.stacks.file_inspect` Retrieve the content of the Stack file for the specified stack read
- `portainer.stacks.git_redeploy` Redeploy a stack write
- `portainer.stacks.inspect` Inspect a stack read
- `portainer.stacks.list` List stacks read
- `portainer.stacks.migrate` Migrate a stack to another environment(endpoint) write
- `portainer.stacks.start` Starts a stopped Stack write
- `portainer.stacks.stop` Stop a running Stack write
- `portainer.stacks.update` Update a stack write
- `portainer.stacks.update_git` Update a stack's Git configs write
- `portainer.stacks.webhook_invoke` Webhook for triggering stack updates from git write

**Endpoints 17**

- `portainer.endpoints.association_delete` De-association an edge environment(endpoint) destructive
- `portainer.endpoints.create` Create a new environment(endpoint) write
- `portainer.endpoints.delete` Remove an environment destructive
- `portainer.endpoints.delete_batch` Remove multiple environments destructive
- `portainer.endpoints.delete_batch_deprecated` Remove multiple environments destructive
- `portainer.endpoints.dockerhub_status` Fetch docker pull limits read
- `portainer.endpoints.force_update_service` Force update a docker service write
- `portainer.endpoints.inspect` Inspect an environment(endpoint) read
- `portainer.endpoints.list` List environments(endpoints) read
- `portainer.endpoints.registries_list` List Registries on environment read
- `portainer.endpoints.registry_access` Update registry access for environment write
- `portainer.endpoints.settings_update` Update settings for an environment(endpoint) write
- `portainer.endpoints.snapshot` Snapshots an environment(endpoint) write
- `portainer.endpoints.snapshots` Snapshot all environments(endpoints) write
- `portainer.endpoints.summary_counts` Get environment summary counts read
- `portainer.endpoints.update` Update an environment(endpoint) write
- `portainer.endpoints.update_relations` Update relations for a list of environments write

**Gitops 14**

- `portainer.gitops.git_operation_repo_file_preview` Preview the content of target file in the git repository read
- `portainer.gitops.source_get` Get a GitOps source by ID read
- `portainer.gitops.source_workflows_list` List the workflows using a GitOps source read
- `portainer.gitops.sources_create_git` Create a Git source write
- `portainer.gitops.sources_delete` Delete a source destructive
- `portainer.gitops.sources_list` List all GitOps sources read
- `portainer.gitops.sources_summary` Summarize GitOps source status counts read
- `portainer.gitops.sources_test` Test a Git source connection read
- `portainer.gitops.sources_test_by_id` Test the connection of a stored source read
- `portainer.gitops.sources_update_access` Update a GitOps source's access control write
- `portainer.gitops.sources_update_git` Update a Git source write
- `portainer.gitops.workflow_get` Get a GitOps workflow by ID read
- `portainer.gitops.workflows_list` List all GitOps workflows read
- `portainer.gitops.workflows_summary` Summarize GitOps workflow status counts read

**Users 13**

- `portainer.users.admin_check` Check administrator account existence read
- `portainer.users.create` Create a new user write
- `portainer.users.current_user_inspect` Inspect the current user user read
- `portainer.users.delete` Remove a user destructive
- `portainer.users.effective_access_inspect` Inspect a user's effective access on every environment read
- `portainer.users.generate_api_key` Generate an API key for a user write
- `portainer.users.get_api_keys` Get all API keys for a user read
- `portainer.users.inspect` Inspect a user read
- `portainer.users.list` List users read
- `portainer.users.memberships_inspect` Inspect a user memberships read
- `portainer.users.remove_api_key` Remove an api-key associated to a user destructive
- `portainer.users.update` Update a user write
- `portainer.users.update_password` Update password for a user write

**Edge jobs 10**

- `portainer.edge_jobs.create_string` Create an EdgeJob from a text write
- `portainer.edge_jobs.delete` Delete an EdgeJob destructive
- `portainer.edge_jobs.file` Fetch a file of an EdgeJob read
- `portainer.edge_jobs.inspect` Inspect an EdgeJob read
- `portainer.edge_jobs.list` Fetch EdgeJobs list read
- `portainer.edge_jobs.task_logs_inspect` Fetch the log for a specifc task on an EdgeJob read
- `portainer.edge_jobs.tasks_clear` Clear the log for a specifc task on an EdgeJob destructive
- `portainer.edge_jobs.tasks_collect` Collect the log for a specifc task on an EdgeJob write
- `portainer.edge_jobs.tasks_list` Fetch the list of tasks on an EdgeJob read
- `portainer.edge_jobs.update` Update an EdgeJob write

**Helm 10**

- `portainer.helm.delete` Delete Helm Release destructive
- `portainer.helm.get` Get a helm release read
- `portainer.helm.get_history` Get a historical list of releases read
- `portainer.helm.install` Install Helm Chart write
- `portainer.helm.list` List Helm Releases read
- `portainer.helm.repo_search` Search Helm Charts read
- `portainer.helm.rollback` Rollback a helm release write
- `portainer.helm.user_repositories_list` List a users helm repositories read
- `portainer.helm.user_repository_create` Create a user helm repository write
- `portainer.helm.user_repository_delete` Delete a users helm repositoryies destructive

**Custom templates 8**

- `portainer.custom_templates.create_repository` Create a custom template write
- `portainer.custom_templates.create_string` Create a custom template write
- `portainer.custom_templates.delete` Remove a template destructive
- `portainer.custom_templates.file` Get Template stack file content. read
- `portainer.custom_templates.git_fetch` Fetch the latest config file content based on custom template's git repository configuration write
- `portainer.custom_templates.inspect` Inspect a custom template read
- `portainer.custom_templates.list` List available custom templates read
- `portainer.custom_templates.update` Update a template write

**Edge stacks 8**

- `portainer.edge_stacks.create_repository` Create an EdgeStack from a git repository write
- `portainer.edge_stacks.create_string` Create an EdgeStack from a text write
- `portainer.edge_stacks.delete` Delete an EdgeStack destructive
- `portainer.edge_stacks.file` Fetches the stack file for an EdgeStack read
- `portainer.edge_stacks.inspect` Inspect an EdgeStack read
- `portainer.edge_stacks.list` Fetches the list of EdgeStacks read
- `portainer.edge_stacks.status_update` Update an EdgeStack status write
- `portainer.edge_stacks.update` Update an EdgeStack write

**Endpoint groups 7**

- `portainer.endpoint_groups.add_endpoint` Add an environment(endpoint) to an environment(endpoint) group write
- `portainer.endpoint_groups.create` Create an Environment(Endpoint) Group write
- `portainer.endpoint_groups.delete` Remove an environment(endpoint) group destructive
- `portainer.endpoint_groups.delete_endpoint` Removes environment(endpoint) from an environment(endpoint) group destructive
- `portainer.endpoint_groups.inspect` Inspect an Environment(Endpoint) group read
- `portainer.endpoint_groups.list` List Environment(Endpoint) groups read
- `portainer.endpoint_groups.update` Update an environment(endpoint) group write

**Registries 7**

- `portainer.registries.configure` Configures a registry write
- `portainer.registries.create` Create a new registry write
- `portainer.registries.delete` Remove a registry destructive
- `portainer.registries.inspect` Inspect a registry read
- `portainer.registries.list` List Registries read
- `portainer.registries.ping` Test registry connection read
- `portainer.registries.update` Update a registry write

**Edge groups 5**

- `portainer.edge_groups.create` Create an EdgeGroup write
- `portainer.edge_groups.delete` Deletes an EdgeGroup destructive
- `portainer.edge_groups.inspect` Inspects an EdgeGroup read
- `portainer.edge_groups.list` List EdgeGroups read
- `portainer.edge_groups.update` Updates an EdgeGroup write

**System 5**

- `portainer.system.info` Retrieve system info read
- `portainer.system.nodes_count` Retrieve the count of nodes read
- `portainer.system.status` Check Portainer status read
- `portainer.system.upgrade` Upgrade Portainer to BE write
- `portainer.system.version` Check for portainer updates read

**Team memberships 5**

- `portainer.team_memberships.create` Create a new team membership write
- `portainer.team_memberships.delete` Remove a team membership destructive
- `portainer.team_memberships.list` List team memberships read
- `portainer.team_memberships.team_memberships` List team memberships read
- `portainer.team_memberships.update` Update a team membership write

**Teams 5**

- `portainer.teams.create` Create a new team write
- `portainer.teams.delete` Remove a team destructive
- `portainer.teams.inspect` Inspect a team read
- `portainer.teams.list` List teams read
- `portainer.teams.update` Update a team write

**Webhooks 5**

- `portainer.webhooks.create` Create a webhook write
- `portainer.webhooks.delete` Delete a webhook destructive
- `portainer.webhooks.execute` Execute a webhook write
- `portainer.webhooks.list` List webhooks read
- `portainer.webhooks.update` Update a webhook write

**Docker 3**

- `portainer.docker.container_gpus_inspect` Fetch container gpus data read
- `portainer.docker.dashboard` Get counters for the dashboard read
- `portainer.docker.images_list` Fetch images read

**Resource controls 3**

- `portainer.resource_controls.create` Create a new resource control write
- `portainer.resource_controls.delete` Remove a resource control destructive
- `portainer.resource_controls.update` Update a resource control write

**Settings 3**

- `portainer.settings.inspect` Retrieve Portainer settings read
- `portainer.settings.public` Retrieve Portainer public settings read
- `portainer.settings.update` Update Portainer settings write

**Tags 3**

- `portainer.tags.create` Create a new tag write
- `portainer.tags.delete` Remove a tag destructive
- `portainer.tags.list` List tags read

**SSL 2**

- `portainer.ssl.inspect` Inspect the ssl settings read
- `portainer.ssl.update` Update the ssl settings write

**Templates 2**

- `portainer.templates.file` Get a template's file read
- `portainer.templates.list` List available templates read

**Ldap 1**

- `portainer.ldap.check` Test LDAP connectivity read

**Motd 1**

- `portainer.motd.motd` Fetches the message of the day read

**Roles 1**

- `portainer.roles.list` List roles read

**Status 1**

- `portainer.status.inspect` Check Portainer status read

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.

## More connectors like Portainer

Shares the most action names with

- [authentik 15](https://actionlake.com/connectors/authentik)
- [Outline 14](https://actionlake.com/connectors/outline)
- [NetBox 14](https://actionlake.com/connectors/netbox)
- [Delinea Secret Server 13](https://actionlake.com/connectors/delinea-secret-server)
- [Commvault Cloud 11](https://actionlake.com/connectors/commvault-cloud)
- [Cato Networks SASE 10](https://actionlake.com/connectors/cato-networks-sase)

Joins with, on shared entities

- [Rubrik Security Cloud 4](https://actionlake.com/connectors/rubrik-security-cloud)
- [Cloudflare 4](https://actionlake.com/connectors/cloudflare)
- [Spacelift 4](https://actionlake.com/connectors/spacelift)
- [Unleash 4](https://actionlake.com/connectors/unleash)
- [TimeCamp 4](https://actionlake.com/connectors/timecamp)
- [iManage Work 4](https://actionlake.com/connectors/imanage-work)

Browse

- [All MSP & PSA connectors](https://actionlake.com/connectors/category/msp-and-psa)
- [All connectors](https://actionlake.com/connectors)
- [How actionlake compares](https://actionlake.com/compare)

actionlake is independent. It is not made or endorsed by Portainer; the name is the vendor's own. Counts are from the Portainer service file, version 1.0.0.

## Give your agent Portainer today.

[Connect Portainer free](https://actionlake.com/console?start=sandbox) [See pricing](https://actionlake.com/pricing)

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.

---

Source: https://actionlake.com/connectors/portainer
More: https://actionlake.com/llms.txt
