dockerhub-api 0.5.0__tar.gz → 1.3.1__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (100) hide show
  1. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/LICENSE +1 -1
  2. dockerhub_api-1.3.1/MANIFEST.in +4 -0
  3. dockerhub_api-1.3.1/PKG-INFO +531 -0
  4. dockerhub_api-1.3.1/README.md +503 -0
  5. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/__init__.py +36 -16
  6. dockerhub_api-1.3.1/dockerhub_api/__main__.py +4 -0
  7. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_access_tokens.py +1 -1
  8. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_audit_logs.py +1 -1
  9. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_auth.py +2 -2
  10. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_base.py +91 -55
  11. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_groups.py +2 -2
  12. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_org_access_tokens.py +1 -1
  13. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_orgs.py +2 -2
  14. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_registry.py +3 -3
  15. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_registry_base.py +117 -50
  16. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_repositories.py +1 -1
  17. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_scim.py +1 -1
  18. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_scout.py +1 -1
  19. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api_client.py +3 -3
  20. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/auth.py +230 -99
  21. dockerhub_api-1.3.1/dockerhub_api/connectors/__init__.py +0 -0
  22. dockerhub_api-1.3.1/dockerhub_api/connectors/mcp_source_presets.json +18 -0
  23. dockerhub_api-1.3.1/dockerhub_api/connectors/tool_schema_fingerprints.json +8 -0
  24. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/dockerhub_input_models.py +1 -1
  25. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/dockerhub_response_models.py +1 -1
  26. dockerhub_api-1.3.1/dockerhub_api/kg_ingest.py +228 -0
  27. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp/__init__.py +5 -3
  28. dockerhub_api-1.3.1/dockerhub_api/mcp/mcp_admin.py +53 -0
  29. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_audit.py +3 -3
  30. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_auth.py +3 -3
  31. dockerhub_api-1.3.1/dockerhub_api/mcp/mcp_kg.py +94 -0
  32. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_org.py +3 -3
  33. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_registry.py +7 -7
  34. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_repos.py +3 -3
  35. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_scim.py +4 -4
  36. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_scout.py +4 -4
  37. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_teams.py +3 -3
  38. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp_server.py +44 -40
  39. dockerhub_api-1.3.1/dockerhub_api/ontology/__init__.py +7 -0
  40. dockerhub_api-1.3.1/dockerhub_api/ontology/certification.json +36 -0
  41. dockerhub_api-1.3.1/dockerhub_api/ontology/dockerhub.ttl +142 -0
  42. dockerhub_api-1.3.1/dockerhub_api/ontology/fixtures/records.json +20 -0
  43. dockerhub_api-1.3.1/dockerhub_api/ontology/mappings/source.yaml +20 -0
  44. dockerhub_api-1.3.1/dockerhub_api/ontology/migrations/manifest.json +6 -0
  45. dockerhub_api-1.3.1/dockerhub_api/ontology/shapes/connector.shacl.ttl +144 -0
  46. dockerhub_api-1.3.1/dockerhub_api/prompts/__init__.py +0 -0
  47. dockerhub_api-1.3.1/dockerhub_api/skills/__init__.py +0 -0
  48. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-api-operations/SKILL.md +33 -0
  49. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-api-operations/agents/openai.yaml +4 -0
  50. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-api-operations/references/catalog.md +7 -0
  51. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-image-registry-scout/SKILL.md +107 -0
  52. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-image-registry-scout/WORKFLOW.md +93 -0
  53. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-org-administration/SKILL.md +105 -0
  54. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-org-administration/WORKFLOW.md +91 -0
  55. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-repository-management/SKILL.md +111 -0
  56. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-repository-management/WORKFLOW.md +97 -0
  57. dockerhub_api-1.3.1/dockerhub_api.egg-info/PKG-INFO +531 -0
  58. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api.egg-info/SOURCES.txt +25 -3
  59. dockerhub_api-1.3.1/dockerhub_api.egg-info/entry_points.txt +11 -0
  60. dockerhub_api-1.3.1/dockerhub_api.egg-info/requires.txt +15 -0
  61. dockerhub_api-1.3.1/pyproject.toml +78 -0
  62. dockerhub_api-1.3.1/requirements.txt +3 -0
  63. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_api_repositories.py +1 -1
  64. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_api_wrapper.py +1 -1
  65. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_auth.py +1 -1
  66. dockerhub_api-1.3.1/tests/test_dockerhub_a2a_validation.py +19 -0
  67. dockerhub_api-1.3.1/tests/test_dockerhub_mcp_validation.py +167 -0
  68. dockerhub_api-1.3.1/tests/test_identity_namespace_scoping.py +78 -0
  69. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_init_dynamics.py +1 -5
  70. dockerhub_api-1.3.1/tests/test_kg_ingest.py +155 -0
  71. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_rate_limit.py +1 -1
  72. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_startup.py +0 -13
  73. dockerhub_api-0.5.0/MANIFEST.in +0 -4
  74. dockerhub_api-0.5.0/PKG-INFO +0 -282
  75. dockerhub_api-0.5.0/README.md +0 -252
  76. dockerhub_api-0.5.0/dockerhub_api/__main__.py +0 -4
  77. dockerhub_api-0.5.0/dockerhub_api/agent_server.py +0 -92
  78. dockerhub_api-0.5.0/dockerhub_api/main_agent.json +0 -14
  79. dockerhub_api-0.5.0/dockerhub_api/mcp/mcp_admin.py +0 -45
  80. dockerhub_api-0.5.0/dockerhub_api.egg-info/PKG-INFO +0 -282
  81. dockerhub_api-0.5.0/dockerhub_api.egg-info/entry_points.txt +0 -3
  82. dockerhub_api-0.5.0/dockerhub_api.egg-info/requires.txt +0 -18
  83. dockerhub_api-0.5.0/pyproject.toml +0 -60
  84. dockerhub_api-0.5.0/requirements.txt +0 -3
  85. dockerhub_api-0.5.0/tests/test_concept_parity.py +0 -34
  86. dockerhub_api-0.5.0/tests/test_dockerhub_a2a_validation.py +0 -30
  87. dockerhub_api-0.5.0/tests/test_dockerhub_mcp_validation.py +0 -261
  88. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/api/__init__.py +0 -0
  89. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api/mcp_config.json +0 -0
  90. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api.egg-info/dependency_links.txt +0 -0
  91. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/dockerhub_api.egg-info/top_level.txt +0 -0
  92. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/setup.cfg +0 -0
  93. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_api_audit.py +0 -0
  94. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_api_org.py +0 -0
  95. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_api_registry.py +0 -0
  96. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_api_scim.py +0 -0
  97. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_api_scout.py +0 -0
  98. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_api_teams.py +0 -0
  99. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_api_tokens.py +0 -0
  100. {dockerhub_api-0.5.0 → dockerhub_api-1.3.1}/tests/test_models.py +0 -0
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2026 Audel Rouhi
3
+ Copyright (c) 2026 Project Maintainers
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
@@ -0,0 +1,4 @@
1
+ include LICENSE
2
+ include README.md
3
+ include requirements.txt
4
+ recursive-include dockerhub_api *.py *.json *.md *.yaml *.yml
@@ -0,0 +1,531 @@
1
+ Metadata-Version: 2.4
2
+ Name: dockerhub-api
3
+ Version: 1.3.1
4
+ Summary: Docker Hub API + MCP Server
5
+ Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
+ License: MIT
7
+ Classifier: Development Status :: 5 - Production/Stable
8
+ Classifier: License :: OSI Approved :: MIT License
9
+ Classifier: Environment :: Console
10
+ Classifier: Operating System :: POSIX :: Linux
11
+ Classifier: Programming Language :: Python :: 3
12
+ Requires-Python: <3.15,>=3.12
13
+ Description-Content-Type: text/markdown
14
+ License-File: LICENSE
15
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.5
16
+ Requires-Dist: httpx>=0.28.1
17
+ Requires-Dist: python-dotenv>=1.2.4
18
+ Provides-Extra: mcp
19
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.5; extra == "mcp"
20
+ Provides-Extra: all
21
+ Requires-Dist: dockerhub-api[mcp]>=1.0.1; extra == "all"
22
+ Provides-Extra: test
23
+ Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
24
+ Requires-Dist: pytest>=9.1.1; extra == "test"
25
+ Requires-Dist: pytest-asyncio>=1.4.0; extra == "test"
26
+ Requires-Dist: pytest-cov>=7.1.0; extra == "test"
27
+ Dynamic: license-file
28
+
29
+ # Dockerhub Api
30
+ ## CLI or API | MCP
31
+
32
+ ![PyPI - Version](https://img.shields.io/pypi/v/dockerhub-api)
33
+ ![MCP Server](https://badge.mcpx.dev?type=server 'MCP Server')
34
+ ![PyPI - Downloads](https://img.shields.io/pypi/dd/dockerhub-api)
35
+ ![GitHub Repo stars](https://img.shields.io/github/stars/Knuckles-Team/dockerhub-api)
36
+ ![PyPI - License](https://img.shields.io/pypi/l/dockerhub-api)
37
+ ![GitHub last commit (by committer)](https://img.shields.io/github/last-commit/Knuckles-Team/dockerhub-api)
38
+ ![GitHub issues](https://img.shields.io/github/issues/Knuckles-Team/dockerhub-api)
39
+ ![GitHub top language](https://img.shields.io/github/languages/top/Knuckles-Team/dockerhub-api)
40
+ ![GitHub repo size](https://img.shields.io/github/repo-size/Knuckles-Team/dockerhub-api)
41
+ ![PyPI - Wheel](https://img.shields.io/pypi/wheel/dockerhub-api)
42
+ ![PyPI - Implementation](https://img.shields.io/pypi/implementation/dockerhub-api)
43
+
44
+ *Version: 1.3.1*
45
+
46
+ > **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
47
+ > Docker Hub platform are maintained in [docs/](docs/index.md).
48
+
49
+ ---
50
+
51
+ ## Table of Contents
52
+
53
+ - [Overview](#overview)
54
+ - [Key Features](#key-features)
55
+ - [Installation](#installation)
56
+ - [Usage](#usage)
57
+ - [Python API / CLI](#python-api--cli)
58
+ - [MCP](#mcp)
59
+ - [Agent (A2A)](#agent-a2a)
60
+ - [Environment Variables](#environment-variables)
61
+ - [Deployment](#deployment)
62
+ - [Safety Model](#safety-model)
63
+ - [Concepts](#concepts)
64
+ - [License](#license)
65
+
66
+ ---
67
+
68
+ ## Overview
69
+
70
+ **Dockerhub Api** is a production-grade Agent and Model Context Protocol (MCP) server
71
+ that wraps the official **Docker Hub API v2** (`https://hub.docker.com`): repositories
72
+ and tags, immutable tags, personal and organization access tokens, organization
73
+ members/settings/invites, teams, audit logs, and SCIM 2.0 provisioning — plus the
74
+ **Registry HTTP API v2** (`registry-1.docker.io`: manifests, blobs, digests,
75
+ multi-arch inspection, OCI referrers, and gated push/remove) and **Docker Scout**
76
+ (`api.scout.docker.com`: CVE/SBOM/policy intelligence).
77
+
78
+ ---
79
+
80
+ ## Key Features
81
+
82
+ - **Consolidated Action-Routed MCP Tools:** Nine togglable tool modules
83
+ (`hub_auth`, `hub_repos`, `hub_org`, `hub_teams`, `hub_audit`, `hub_scim`,
84
+ `hub_admin`, `hub_registry`, `hub_scout`) minimize token overhead in LLM contexts.
85
+ - **Three API surfaces, one package:** the Hub *management* API, the *Registry v2*
86
+ image API (its own host + per-repository scoped-token auth), and *Docker Scout*
87
+ — each with the same uniform envelope, redaction, and gating.
88
+ - **JWT Auth Lifecycle:** Short-lived bearer minted from `POST /v2/auth/token`
89
+ (password, PAT `dckr_pat_*`, or org access token), cached and refreshed before
90
+ expiry, with one transparent re-mint on 401.
91
+ - **Rate-Limit Telemetry:** `X-RateLimit-*` headers surfaced in every result;
92
+ HTTP 429 retried with bounded `Retry-After` backoff.
93
+ - **Safety by Default:** Removes and org-settings writes are gated behind
94
+ `DOCKERHUB_ALLOW_DESTRUCTIVE` (default `False`); secrets are redacted from tool
95
+ results (plaintext tokens appear exactly once — on creation). Repository creation
96
+ stays enabled: it is the primary release-provisioning use case.
97
+ - **Integrated Graph Agent:** Built-in Pydantic AI agent (`dockerhub-agent`) with
98
+ A2A and AG-UI web interfaces.
99
+ - **Native Telemetry & Tracing:** Out-of-the-box OpenTelemetry exports and Langfuse
100
+ tracing via agent-connector-sdk.
101
+
102
+ ---
103
+
104
+ ## Installation
105
+
106
+ ```bash
107
+ pip install dockerhub-api # API client only
108
+ pip install "dockerhub-api[mcp]" # + MCP server
109
+ pip install "dockerhub-api[all]" # everything
110
+ ```
111
+
112
+ | Extra | Adds |
113
+ |---|---|
114
+ | `mcp` | FastMCP server (`dockerhub-mcp`) via `agent-connector-sdk` |
115
+ | `agent` | Pydantic-AI A2A agent (`dockerhub-agent`) + Logfire via `agent-connector-sdk` |
116
+ | `all` | `mcp` + `agent` |
117
+ | `test` | pytest toolchain for development |
118
+
119
+ ```bash
120
+ # Connector-focused MCP server (includes the shared graph engine)
121
+ uv pip install "dockerhub-api[mcp]"
122
+
123
+ # Agent runtime (adds model orchestration to the shared graph engine)
124
+
125
+ # Everything (development)
126
+ uv pip install "dockerhub-api[all]" # or: python -m pip install "dockerhub-api[all]"
127
+ ```
128
+
129
+ ### Container images (`:mcp`)
130
+
131
+ One multi-stage `docker/Dockerfile` builds the MCP-only image (`--target mcp`):
132
+
133
+ | Image tag | Build target | Contents | Entrypoint |
134
+ |-----------|--------------|----------|------------|
135
+ | `example/dockerhub-api:mcp` | `--target mcp` | `dockerhub-api[mcp]` — **connector-focused**, includes `epistemic-graph[full]`; no model-orchestration stack | `dockerhub-mcp` |
136
+
137
+ ```bash
138
+ docker build --target mcp -t example/dockerhub-api:mcp docker/ # connector-focused MCP server
139
+ ```
140
+
141
+ agent (`immutable agent digest`) with a co-located `:mcp` sidecar.
142
+
143
+ ### Knowledge-graph database (`epistemic-graph`)
144
+
145
+ Agent Connector SDK core dependency (`epistemic-graph[full]`). The `[mcp]` extra keeps
146
+ deployments can use the bundled engine. For production or shared state, run
147
+ **epistemic-graph as a dedicated database service** and configure the runtime to use it.
148
+ Deployment recipes (single-node + Raft HA), connection configuration, and architecture
149
+ diagrams are documented in the
150
+ [epistemic-graph deployment guide](https://knuckles-team.github.io/epistemic-graph/deployment/).
151
+
152
+ ---
153
+
154
+ ## Usage
155
+
156
+ ### Python API / CLI
157
+
158
+ ```python
159
+ from dockerhub_api.auth import get_client
160
+
161
+ api = get_client() # reads DOCKERHUB_URL / DOCKER_HUB_USER / DOCKER_HUB_TOKEN
162
+
163
+ repos = api.get_repositories(namespace="acme", ordering="-last_updated")
164
+ api.create_repository(namespace="acme", name="release-images", is_private=True)
165
+ tags = api.get_repository_tags(namespace="acme", repository="release-images")
166
+ print(api.rate_limit) # latest X-RateLimit-* snapshot
167
+ ```
168
+
169
+ Every client method returns a uniform envelope:
170
+ `{"status_code": int, "data": ..., "rate_limit": {"limit", "remaining", "reset"}}`.
171
+
172
+ ### MCP
173
+
174
+ #### Available MCP Tools
175
+
176
+ _Auto-generated — do not edit (synced by the `mcp-readme-table` pre-commit hook)._
177
+
178
+ <!-- MCP-TOOLS-TABLE:START -->
179
+
180
+ #### Condensed action-routed tools (default — `MCP_TOOL_MODE=condensed`)
181
+
182
+ | MCP Tool | Toggle Env Var | Description |
183
+ |----------|----------------|-------------|
184
+ | `hub_admin` | `ADMINTOOL` | Client diagnostics: 'rate_limit' returns the latest |
185
+ | `hub_audit` | `AUDITTOOL` | Read a Docker Hub account's audit trail: 'logs' lists events |
186
+ | `hub_auth` | `AUTHTOOL` | Manage Docker Hub authentication, personal access tokens (PATs), |
187
+ | `dockerhub_ingest_repositories` | `KGTOOL` | Natively ingest repositories into the epistemic-graph as typed :Repository/:ContainerImage nodes. |
188
+ | `hub_org` | `ORGTOOL` | Manage a Docker Hub organization: settings (restricted images), |
189
+ | `hub_registry` | `REGISTRYTOOL` | Docker Registry v2 image operations (``registry-1.docker.io``): |
190
+ | `hub_repos` | `REPOSTOOL` | Manage Docker Hub repositories: list/create/inspect repositories, |
191
+ | `hub_scim` | `SCIMTOOL` | Docker Hub SCIM 2.0: service discovery (ServiceProviderConfig, |
192
+ | `hub_scout` | `SCOUTTOOL` | Docker Scout image intelligence (``api.scout.docker.com``): |
193
+ | `hub_teams` | `TEAMSTOOL` | Manage Docker Hub organization groups (teams) and their members. |
194
+
195
+ #### Verbose 1:1 API-mapped tools (`MCP_TOOL_MODE=verbose` or `both`)
196
+
197
+ <details>
198
+ <summary>54 per-operation tools — one per public API method (click to expand)</summary>
199
+
200
+ | MCP Tool | Toggle Env Var | Description |
201
+ |----------|----------------|-------------|
202
+ | `dockerhub_add_group_member` | `GROUPSTOOL` | Add a username to a group. |
203
+ | `dockerhub_assign_repository_group` | `REPOSITORIESTOOL` | Grant a team (group) ``read``/``write``/``admin`` on a repository. |
204
+ | `dockerhub_bulk_invite` | `ORGSTOOL` | Invite many users/emails at once (``POST /v2/invites/bulk``). |
205
+ | `dockerhub_check_repository` | `REPOSITORIESTOOL` | HEAD existence check for a repository. |
206
+ | `dockerhub_check_repository_tag` | `REPOSITORIESTOOL` | HEAD existence check for one tag. |
207
+ | `dockerhub_check_repository_tags` | `REPOSITORIESTOOL` | HEAD check: does the repository have any tags? |
208
+ | `dockerhub_create_access_token` | `ACCESS_TOKENSTOOL` | Create a personal access token. |
209
+ | `dockerhub_create_auth_token` | `AUTHTOOL` | Mint a short-lived JWT bearer from an identifier + secret. |
210
+ | `dockerhub_create_group` | `GROUPSTOOL` | Create a group (team) in an organization. |
211
+ | `dockerhub_create_org_access_token` | `ORG_ACCESS_TOKENSTOOL` | Create an organization access token. |
212
+ | `dockerhub_create_repository` | `REPOSITORIESTOOL` | Create an image repository in a namespace. |
213
+ | `dockerhub_create_scim_user` | `SCIMTOOL` | Provision a SCIM user. |
214
+ | `dockerhub_delete_access_token` | `ACCESS_TOKENSTOOL` | Delete a personal access token. Destructive — gated. |
215
+ | `dockerhub_delete_group` | `GROUPSTOOL` | Delete a group. Destructive — gated. |
216
+ | `dockerhub_delete_invite` | `ORGSTOOL` | Cancel an invite. Destructive — gated. |
217
+ | `dockerhub_delete_org_access_token` | `ORG_ACCESS_TOKENSTOOL` | Delete an organization access token. Destructive — gated. |
218
+ | `dockerhub_export_org_members` | `ORGSTOOL` | Export the member list as CSV (``GET /members/export``). |
219
+ | `dockerhub_get_access_token` | `ACCESS_TOKENSTOOL` | Get one personal access token by UUID. |
220
+ | `dockerhub_get_access_tokens` | `ACCESS_TOKENSTOOL` | List the personal access tokens of the authenticated user. |
221
+ | `dockerhub_get_audit_log_actions` | `AUDIT_LOGSTOOL` | List the audit-log action names available for a namespace. |
222
+ | `dockerhub_get_audit_logs` | `AUDIT_LOGSTOOL` | List audit-log events for a namespace. |
223
+ | `dockerhub_get_group` | `GROUPSTOOL` | Get one group. |
224
+ | `dockerhub_get_group_members` | `GROUPSTOOL` | List a group's members. |
225
+ | `dockerhub_get_groups` | `GROUPSTOOL` | List an organization's groups (teams). |
226
+ | `dockerhub_get_org_access_token` | `ORG_ACCESS_TOKENSTOOL` | Get one organization access token by id. |
227
+ | `dockerhub_get_org_access_tokens` | `ORG_ACCESS_TOKENSTOOL` | List an organization's access tokens. |
228
+ | `dockerhub_get_org_invites` | `ORGSTOOL` | List an organization's pending invites. |
229
+ | `dockerhub_get_org_members` | `ORGSTOOL` | List organization members (filter by search/type/role; paginated). |
230
+ | `dockerhub_get_org_settings` | `ORGSTOOL` | Get an organization's settings (restricted images policy). |
231
+ | `dockerhub_get_repositories` | `REPOSITORIESTOOL` | List a namespace's repositories (name filter + ordering enum). |
232
+ | `dockerhub_get_repository` | `REPOSITORIESTOOL` | Get one repository. |
233
+ | `dockerhub_get_repository_tag` | `REPOSITORIESTOOL` | Get one tag. |
234
+ | `dockerhub_get_repository_tags` | `REPOSITORIESTOOL` | List a repository's tags (paginated). |
235
+ | `dockerhub_get_scim_resource_type` | `SCIMTOOL` | Get one SCIM ResourceType by name. |
236
+ | `dockerhub_get_scim_resource_types` | `SCIMTOOL` | List the SCIM ResourceTypes. |
237
+ | `dockerhub_get_scim_schema` | `SCIMTOOL` | Get one SCIM Schema by id (URN). |
238
+ | `dockerhub_get_scim_schemas` | `SCIMTOOL` | List the SCIM Schemas. |
239
+ | `dockerhub_get_scim_service_provider_config` | `SCIMTOOL` | Get the SCIM ServiceProviderConfig. |
240
+ | `dockerhub_get_scim_user` | `SCIMTOOL` | Get one SCIM user by id. |
241
+ | `dockerhub_get_scim_users` | `SCIMTOOL` | List SCIM users (``startIndex``/``count``/``filter``/``sortBy``/``sortOrder``). |
242
+ | `dockerhub_login` | `AUTHTOOL` | Authenticate via the legacy login endpoint. |
243
+ | `dockerhub_patch_group` | `GROUPSTOOL` | Partially update a group (``PATCH``). |
244
+ | `dockerhub_remove_group_member` | `GROUPSTOOL` | Remove a username from a group. Destructive — gated. |
245
+ | `dockerhub_remove_org_member` | `ORGSTOOL` | Remove a member from the organization. Destructive — gated. |
246
+ | `dockerhub_replace_scim_user` | `SCIMTOOL` | Replace a SCIM user resource (``PUT``). |
247
+ | `dockerhub_resend_invite` | `ORGSTOOL` | Resend an invite (``PATCH /v2/invites/{id}/resend``). |
248
+ | `dockerhub_two_factor_login` | `AUTHTOOL` | Complete a 2FA login with the TOTP code (``POST /v2/users/2fa-login``). |
249
+ | `dockerhub_update_access_token` | `ACCESS_TOKENSTOOL` | Patch a personal access token's label and/or active state. |
250
+ | `dockerhub_update_group` | `GROUPSTOOL` | Replace a group's details (``PUT``). |
251
+ | `dockerhub_update_immutable_tags` | `REPOSITORIESTOOL` | Patch a repository's immutable-tags settings. |
252
+ | `dockerhub_update_org_access_token` | `ORG_ACCESS_TOKENSTOOL` | Patch an organization access token. |
253
+ | `dockerhub_update_org_member` | `ORGSTOOL` | Set a member's org role (``owner``, ``editor``, or ``member``). |
254
+ | `dockerhub_update_org_settings` | `ORGSTOOL` | Replace an organization's settings. Destructive — gated. |
255
+ | `dockerhub_verify_immutable_tags` | `REPOSITORIESTOOL` | Verify immutable-tag rules without applying them. |
256
+
257
+ </details>
258
+
259
+ _9 action-routed tool(s) (default) · 54 verbose 1:1 tool(s). Each is enabled unless its `<DOMAIN>TOOL` toggle is set false; `MCP_TOOL_MODE` selects the surface (`condensed` default · `verbose` 1:1 · `both`). Auto-generated — do not edit._
260
+ <!-- MCP-TOOLS-TABLE:END -->
261
+
262
+ ### MCP Configuration Examples
263
+
264
+ <!-- MCP-CONFIG-EXAMPLES:START -->
265
+
266
+ > **Install the connector-focused `[mcp]` extra.** Examples use `dockerhub-api[mcp]` to add
267
+ > FastMCP / FastAPI through `agent-connector-sdk`; the required Agent Connector SDK core
268
+ > still carries `epistemic-graph[full]`. The `[agent-runtime]` extra additionally
269
+ > enables model orchestration.
270
+
271
+ #### stdio Transport (local IDEs — Cursor, Claude Desktop, VS Code)
272
+
273
+ ```json
274
+ {
275
+ "mcpServers": {
276
+ "dockerhub-mcp": {
277
+ "command": "uvx",
278
+ "args": [
279
+ "--from",
280
+ "dockerhub-api[mcp]",
281
+ "dockerhub-mcp"
282
+ ],
283
+ "env": {
284
+ "MCP_TOOL_MODE": "intent",
285
+ "ADMINTOOL": "True",
286
+ "AUDITTOOL": "True",
287
+ "AUTHTOOL": "True",
288
+ "DOCKERHUB_ALLOW_DESTRUCTIVE": "False",
289
+ "DOCKERHUB_TLS_PROFILE": "system",
290
+ "DOCKERHUB_TOKEN": "dckr_pat_your_personal_access_token",
291
+ "DOCKERHUB_URL": "https://hub.docker.com",
292
+ "DOCKERHUB_USERNAME": "your_dockerhub_username",
293
+ "DOCKER_REGISTRY_AUTH_URL": "https://auth.docker.io/token",
294
+ "DOCKER_REGISTRY_URL": "https://registry-1.docker.io",
295
+ "DOCKER_SCOUT_URL": "https://api.scout.docker.com",
296
+ "KGTOOL": "True",
297
+ "ORGTOOL": "True",
298
+ "REGISTRYTOOL": "True",
299
+ "REPOSTOOL": "True",
300
+ "SCIMTOOL": "True",
301
+ "SCOUTTOOL": "True",
302
+ "TEAMSTOOL": "True"
303
+ }
304
+ }
305
+ }
306
+ }
307
+ ```
308
+
309
+ Runtime references require an alias-aware launcher such as Arbora. Other
310
+ launchers must omit those entries and inject the resolved values through their
311
+ own runtime secret boundary.
312
+
313
+ #### Streamable-HTTP Transport (networked / production)
314
+
315
+ ```json
316
+ {
317
+ "mcpServers": {
318
+ "dockerhub-mcp": {
319
+ "command": "uvx",
320
+ "args": [
321
+ "--from",
322
+ "dockerhub-api[mcp]",
323
+ "dockerhub-mcp",
324
+ "--transport",
325
+ "streamable-http",
326
+ "--port",
327
+ "8000"
328
+ ],
329
+ "env": {
330
+ "TRANSPORT": "streamable-http",
331
+ "HOST": "127.0.0.1",
332
+ "PORT": "8000",
333
+ "MCP_TOOL_MODE": "intent",
334
+ "ADMINTOOL": "True",
335
+ "AUDITTOOL": "True",
336
+ "AUTHTOOL": "True",
337
+ "DOCKERHUB_ALLOW_DESTRUCTIVE": "False",
338
+ "DOCKERHUB_TLS_PROFILE": "system",
339
+ "DOCKERHUB_TOKEN": "dckr_pat_your_personal_access_token",
340
+ "DOCKERHUB_URL": "https://hub.docker.com",
341
+ "DOCKERHUB_USERNAME": "your_dockerhub_username",
342
+ "DOCKER_REGISTRY_AUTH_URL": "https://auth.docker.io/token",
343
+ "DOCKER_REGISTRY_URL": "https://registry-1.docker.io",
344
+ "DOCKER_SCOUT_URL": "https://api.scout.docker.com",
345
+ "KGTOOL": "True",
346
+ "ORGTOOL": "True",
347
+ "REGISTRYTOOL": "True",
348
+ "REPOSTOOL": "True",
349
+ "SCIMTOOL": "True",
350
+ "SCOUTTOOL": "True",
351
+ "TEAMSTOOL": "True"
352
+ }
353
+ }
354
+ }
355
+ }
356
+ ```
357
+
358
+ Alternatively, connect to a pre-deployed Streamable-HTTP instance by `url`:
359
+
360
+ ```json
361
+ {
362
+ "mcpServers": {
363
+ "dockerhub-mcp": {
364
+ "url": "http://localhost:8000/dockerhub-mcp/mcp"
365
+ }
366
+ }
367
+ }
368
+ ```
369
+
370
+ Run a reviewed container image as a least-privilege stdio child (no
371
+ listener or published port):
372
+
373
+ ```bash
374
+ docker run -i --rm \
375
+ --read-only \
376
+ --cap-drop=ALL \
377
+ --security-opt=no-new-privileges \
378
+ --pids-limit=256 \
379
+ --tmpfs /tmp:rw,noexec,nosuid,nodev,size=64m \
380
+ -e TRANSPORT=stdio \
381
+ -e MCP_TOOL_MODE=intent \
382
+ -e ADMINTOOL=True \
383
+ -e AUDITTOOL=True \
384
+ -e AUTHTOOL=True \
385
+ -e DOCKERHUB_ALLOW_DESTRUCTIVE=False \
386
+ -e DOCKERHUB_TLS_PROFILE=system \
387
+ -e DOCKERHUB_TOKEN=dckr_pat_your_personal_access_token \
388
+ -e DOCKERHUB_URL=https://hub.docker.com \
389
+ -e DOCKERHUB_USERNAME=your_dockerhub_username \
390
+ -e DOCKER_REGISTRY_AUTH_URL=https://auth.docker.io/token \
391
+ -e DOCKER_REGISTRY_URL=https://registry-1.docker.io \
392
+ -e DOCKER_SCOUT_URL=https://api.scout.docker.com \
393
+ -e KGTOOL=True \
394
+ -e ORGTOOL=True \
395
+ -e REGISTRYTOOL=True \
396
+ -e REPOSTOOL=True \
397
+ -e SCIMTOOL=True \
398
+ -e SCOUTTOOL=True \
399
+ -e TEAMSTOOL=True \
400
+ registry.example.invalid/dockerhub-api@sha256:<digest> dockerhub-mcp
401
+ ```
402
+
403
+ For containerized network HTTP, supply an authenticated TLS ingress (or
404
+ direct server TLS), exact `MCP_ALLOWED_HOSTS`, and an exact trusted-proxy
405
+ CIDR policy through the operator-owned deployment profile. The generator
406
+ does not emit an unauthenticated non-loopback listener.
407
+
408
+ _Auto-generated from the code-read env surface (`MCP_TOOL_MODE` + package vars) — do not edit._
409
+ <!-- MCP-CONFIG-EXAMPLES:END -->
410
+
411
+ <!-- BEGIN GENERATED: additional-deployment-options -->
412
+ ### Additional Deployment Options
413
+
414
+ `dockerhub-api` can run as a local stdio process or container, or behind a remote
415
+ network boundary. The
416
+ [Deployment guide](https://knuckles-team.github.io/dockerhub-api/deployment/) carries
417
+ the detailed transport contract.
418
+
419
+ - **Local container** — launch a reviewed immutable image as a least-privilege
420
+ stdio child with no listener or published port.
421
+ - **Remote URL** — connect through an operator-supplied authenticated HTTPS
422
+ ingress. Keep its URL, outbound identity references, trust profile, and exact
423
+ `MCP_ALLOWED_HOSTS` in `AgentConfig`.
424
+ <!-- END GENERATED: additional-deployment-options -->
425
+
426
+ ## Safety Model
427
+
428
+ | Operation class | Default | Override |
429
+ |---|---|---|
430
+ | Reads (repos, tags, members, logs, SCIM) | allowed | — |
431
+ | Repository create / immutable-tag config / invites / role updates | allowed | — |
432
+ | Removes (PATs, OATs, groups, members, invites) | **blocked** | `DOCKERHUB_ALLOW_DESTRUCTIVE=True` |
433
+ | Org-settings writes (`PUT /v2/orgs/{org}/settings`) | **blocked** | `DOCKERHUB_ALLOW_DESTRUCTIVE=True` |
434
+
435
+ ---
436
+
437
+ ## Concepts
438
+
439
+ The concept registry (`CONCEPT:DH-OS.governance.hub-x`) is documented in
440
+ [docs/concepts.md](docs/concepts.md).
441
+
442
+ ## License
443
+
444
+ MIT — see [LICENSE](LICENSE).
445
+
446
+
447
+
448
+ <!-- GOVERNED-CAPABILITY:START -->
449
+ ## Governed capability contract
450
+
451
+ This package ships a compact canonical skill surface with specialist procedures
452
+ kept as referenced workflows. The current MCP tools, skill metadata,
453
+ `connector_manifest.yml`, ontology, mappings, shapes, fixtures, migrations,
454
+ tool-schema fingerprints, and certification metadata form one versioned
455
+ capability contract. Validate them together; do not rely on stale tool names or
456
+ historical per-task skill wrappers.
457
+
458
+ Runtime endpoints, credentials, certificate trust, tenant identity, retention,
459
+ and observability policy are deployment inputs and are never packaged values.
460
+ See [Configuration, trust, and privacy](docs/configuration.md) before enabling a
461
+ network transport, connector ingestion, Arbora delegation, or trace export.
462
+ <!-- GOVERNED-CAPABILITY:END -->
463
+
464
+ ## Environment Variables
465
+
466
+ <!-- ENV-VARS-TABLE:START -->
467
+
468
+ #### Package environment variables
469
+
470
+ | Variable | Example | Description |
471
+ |----------|---------|-------------|
472
+ | `HOST` | `0.0.0.0` | |
473
+ | `PORT` | `8000` | |
474
+ | `TRANSPORT` | `stdio` | options: stdio, streamable-http, sse |
475
+ | `FASTMCP_LOG_LEVEL` | `ERROR` | |
476
+ | `NO_COLOR` | `1` | |
477
+ | `TERM` | `dumb` | forced to "dumb" by the server to disable ANSI/color output |
478
+ | `ENABLE_OTEL` | `True` | |
479
+ | `OTEL_EXPORTER_OTLP_ENDPOINT` | `http://localhost:8080/api/public/otel` | |
480
+ | `OTEL_EXPORTER_OTLP_PUBLIC_KEY` | secret-injected | |
481
+ | `OTEL_EXPORTER_OTLP_SECRET_KEY` | secret-injected | |
482
+ | `OTEL_EXPORTER_OTLP_PROTOCOL` | `http/protobuf` | |
483
+ | `EUNOMIA_TYPE` | `none` | options: none, embedded, remote |
484
+ | `EUNOMIA_POLICY_FILE` | `mcp_policies.json` | |
485
+ | `EUNOMIA_REMOTE_URL` | `http://eunomia-server:8000` | |
486
+ | `DOCKER_HUB_USER` | — | Official hub-tool credential names (primary): |
487
+ | `DOCKER_HUB_TOKEN` | secret-injected | |
488
+ | `DOCKERHUB_URL` | `https://hub.docker.com` | Fallback aliases: DOCKERHUB_USERNAME / DOCKERHUB_TOKEN / DOCKERHUB_JWT |
489
+ | `DOCKERHUB_USERNAME` | `your_dockerhub_username` | |
490
+ | `DOCKERHUB_TOKEN` | secret-injected | password, PAT, or org access token |
491
+ | `DOCKERHUB_JWT` | — | optional pre-minted bearer (overrides the above) |
492
+ | `DOCKERHUB_TLS_PROFILE` | `system` | Named outbound TLS policy from AgentConfig. Use a reference for runtime-only trust material; peer and hostname verification remain mandatory. |
493
+ | `DOCKERHUB_TLS_PROFILE_REF` | — | |
494
+ | `DOCKER_REGISTRY_URL` | `https://registry-1.docker.io` | |
495
+ | `DOCKER_REGISTRY_AUTH_URL` | `https://auth.docker.io/token` | token-service realm; auto-discovered from the 401 challenge |
496
+ | `DOCKER_SCOUT_URL` | `https://api.scout.docker.com` | |
497
+ | `DOCKERHUB_ALLOW_DESTRUCTIVE` | `False` | |
498
+ | `AUTHTOOL` | `True` | |
499
+ | `REPOSTOOL` | `True` | |
500
+ | `ORGTOOL` | `True` | |
501
+ | `TEAMSTOOL` | `True` | |
502
+ | `AUDITTOOL` | `True` | |
503
+ | `SCIMTOOL` | `True` | |
504
+ | `ADMINTOOL` | `True` | |
505
+ | `REGISTRYTOOL` | `True` | |
506
+ | `SCOUTTOOL` | `True` | |
507
+ | `KGTOOL` | `True` | |
508
+
509
+ #### Inherited agent-connector-sdk variables (apply to every connector)
510
+
511
+ | Variable | Example | Description |
512
+ |----------|---------|-------------|
513
+ | `MCP_TOOL_MODE` | `intent` | Tool surface: `intent` \| `condensed` \| `verbose` \| `both` |
514
+ | `MCP_ENABLED_TOOLS` | — | Comma-separated tool allow-list |
515
+ | `MCP_DISABLED_TOOLS` | — | Comma-separated tool deny-list |
516
+ | `MCP_ENABLED_TAGS` | — | Comma-separated tag allow-list |
517
+ | `MCP_DISABLED_TAGS` | — | Comma-separated tag deny-list |
518
+ | `MCP_CLIENT_AUTH` | — | Outbound MCP child auth: `oidc-client-credentials` \| `basic` \| `none` |
519
+ | `OIDC_CLIENT_ID` | — | OIDC client id (service-account auth) |
520
+ | `OIDC_CLIENT_SECRET_REF` | `secret://identity/oidc-client-secret` | Runtime secret reference for the OIDC service account |
521
+ | `MCP_BASIC_AUTH_USERNAME` | — | HTTP Basic username (`MCP_CLIENT_AUTH=basic`) |
522
+ | `MCP_BASIC_AUTH_PASSWORD_REF` | `secret://identity/mcp-basic-password` | Runtime secret reference for HTTP Basic auth (`MCP_CLIENT_AUTH=basic`) |
523
+ | `DEBUG` | `False` | Verbose logging |
524
+ | `PYTHONUNBUFFERED` | `1` | Unbuffered stdout (recommended in containers) |
525
+ | `MCP_URL` | `http://localhost:8000/mcp` | URL of the MCP server the agent connects to |
526
+ | `PROVIDER` | `openai` | LLM provider for the agent |
527
+ | `MODEL_ID` | `gpt-4o` | Model id for the agent |
528
+ | `ENABLE_WEB_UI` | `True` | Serve the AG-UI web interface |
529
+
530
+ _36 package + 16 inherited variable(s). Auto-generated from `.env.example` + the shared agent-connector-sdk set — do not edit._
531
+ <!-- ENV-VARS-TABLE:END -->