Skip to main content
Glama

plugin_push

Push an installed Docker plugin to its registry, using stored credentials and returning progress with error handling.

Instructions

Push an installed plugin to its registry.

The write-side counterpart to plugin_install (which pulls) and the publish step after plugin_create builds a plugin locally: name must already be the registry-qualified name the plugin is installed under, since — unlike image_push — there is no plugin equivalent of image_tag to rename it first, so create it under the target name. The plugin does not need to be enabled. Credentials come from system_login, or from ~/.docker/config.json if the host ran docker login. Does NOT raise when the registry rejects the push: an authentication or quota failure arrives as a final progress record and is surfaced as the error key, so check that key rather than assuming success. Raises RuntimeError if the installed docker-py is too old to expose the internals below, and docker.errors.APIError if the plugin isn't installed.

Bypasses docker-py's Plugin.push()/APIClient.push_plugin(), which cannot work: both POST to /plugins/{name}/pull, a route the Engine does not define (push is /plugins/{name}/push), so they 404 against any daemon. Bug present since the method was written in 2017 and still in docker-py main; it survives because upstream has no test covering it. This calls the correct endpoint through docker-py's private request helpers, in the manner of system_logout's api._auth_configs reach-in, and fails loudly if those internals change shape.

Caveat for ssh:// daemons: docker-py can't cancel an SSH stream, so the timeout_seconds watchdog can't interrupt a push that stalls with the connection still open — the same limitation container_logs carries in follow mode. The call still returns normally once the registry answers or the stream ends.

args: name - Installed plugin name to push, [registry/]author/name:tag; :latest if the tag is omitted. A bare author/name pushes to Docker Hub timeout_seconds - Max wall-clock seconds to wait on the push stream before returning what was collected (default 300); raise it for a large plugin over a slow link returns: dict - {"name", "progress": [], "truncated": bool, "error": str or None} — error is non-None only when the registry reported a failure

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameYes
timeout_secondsNo
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Beyond the annotations (readOnlyHint=false, destructiveHint=false), the description discloses crucial behavior: registry rejections surface as an 'error' key rather than raising, credentials come from system_login or ~/.docker/config.json, the plugin need not be enabled, a docker-py bug is worked around, and SSH daemons have a timeout limitation. This is rich, meaningful behavioral context.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is lengthy and structured in paragraphs, but every sentence earns its place by covering purpose, context, error handling, edge cases, and parameters. It is front-loaded with the main purpose, and while it could be tightened, the detail is justified given the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Despite the absence of an output schema, the description details the return dict structure (name, progress, truncated, error), error semantics, credential requirements, and behavioral caveats. It provides complete context for using and debugging the tool in real-world scenarios.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

With 0% schema description coverage, the description fully compensates by explaining both parameters: 'name' format ([registry/]author/name:tag, :latest omitted, Docker Hub for bare author/name) and 'timeout_seconds' (max wall-clock seconds, default 300). The args section adds meaning the schema lacks.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb+resource statement, 'Push an installed plugin to its registry,' and clearly distinguishes this from plugin_install (pull) and image_push (no plugin equivalent of image_tag). It explicitly defines the tool's scope and relationship to sibling tools, making the purpose unambiguous.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description explicitly frames the tool as the write-side counterpart to plugin_install and the publish step after plugin_create. It also notes the prerequisite that the name must already be registry-qualified, and contrasts with image_push by explaining there is no plugin rename step. This gives clear when-to-use and when-not-to-use guidance.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

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/L337-org/docker-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server