dockerhub-api 1.0.1__tar.gz → 1.3.2__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.
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/LICENSE +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/PKG-INFO +163 -99
- dockerhub_api-1.0.1/dockerhub_api.egg-info/PKG-INFO → dockerhub_api-1.3.2/README.md +150 -114
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/__init__.py +36 -16
- dockerhub_api-1.3.2/dockerhub_api/__main__.py +4 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_access_tokens.py +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_audit_logs.py +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_auth.py +2 -2
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_base.py +91 -55
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_groups.py +2 -2
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_org_access_tokens.py +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_orgs.py +2 -2
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_registry.py +3 -3
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_registry_base.py +117 -50
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_repositories.py +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_scim.py +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/api_client_scout.py +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api_client.py +3 -3
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/auth.py +224 -92
- dockerhub_api-1.3.2/dockerhub_api/connectors/mcp_source_presets.json +18 -0
- dockerhub_api-1.3.2/dockerhub_api/connectors/tool_schema_fingerprints.json +8 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/dockerhub_input_models.py +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/dockerhub_response_models.py +1 -1
- dockerhub_api-1.3.2/dockerhub_api/kg_ingest.py +228 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp/__init__.py +5 -3
- dockerhub_api-1.3.2/dockerhub_api/mcp/mcp_admin.py +53 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp/mcp_audit.py +3 -3
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp/mcp_auth.py +3 -3
- dockerhub_api-1.3.2/dockerhub_api/mcp/mcp_kg.py +94 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp/mcp_org.py +3 -3
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp/mcp_registry.py +7 -7
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp/mcp_repos.py +3 -3
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp/mcp_scim.py +4 -4
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp/mcp_scout.py +4 -4
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp/mcp_teams.py +3 -3
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp_server.py +27 -10
- dockerhub_api-1.3.2/dockerhub_api/ontology/__init__.py +7 -0
- dockerhub_api-1.3.2/dockerhub_api/ontology/certification.json +36 -0
- dockerhub_api-1.3.2/dockerhub_api/ontology/dockerhub.ttl +142 -0
- dockerhub_api-1.3.2/dockerhub_api/ontology/fixtures/records.json +20 -0
- dockerhub_api-1.3.2/dockerhub_api/ontology/mappings/source.yaml +20 -0
- dockerhub_api-1.3.2/dockerhub_api/ontology/migrations/manifest.json +6 -0
- dockerhub_api-1.3.2/dockerhub_api/ontology/shapes/connector.shacl.ttl +144 -0
- dockerhub_api-1.3.2/dockerhub_api/skills/__init__.py +0 -0
- dockerhub_api-1.3.2/dockerhub_api/skills/dockerhub-api-operations/SKILL.md +33 -0
- dockerhub_api-1.3.2/dockerhub_api/skills/dockerhub-api-operations/agents/openai.yaml +4 -0
- dockerhub_api-1.3.2/dockerhub_api/skills/dockerhub-api-operations/references/catalog.md +7 -0
- dockerhub_api-1.3.2/dockerhub_api/skills/dockerhub-image-registry-scout/SKILL.md +107 -0
- dockerhub_api-1.3.2/dockerhub_api/skills/dockerhub-image-registry-scout/WORKFLOW.md +93 -0
- dockerhub_api-1.3.2/dockerhub_api/skills/dockerhub-org-administration/SKILL.md +105 -0
- dockerhub_api-1.3.2/dockerhub_api/skills/dockerhub-org-administration/WORKFLOW.md +91 -0
- dockerhub_api-1.3.2/dockerhub_api/skills/dockerhub-repository-management/SKILL.md +111 -0
- dockerhub_api-1.3.2/dockerhub_api/skills/dockerhub-repository-management/WORKFLOW.md +97 -0
- dockerhub_api-1.0.1/README.md → dockerhub_api-1.3.2/dockerhub_api.egg-info/PKG-INFO +178 -84
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api.egg-info/SOURCES.txt +24 -5
- dockerhub_api-1.3.2/dockerhub_api.egg-info/entry_points.txt +14 -0
- dockerhub_api-1.3.2/dockerhub_api.egg-info/requires.txt +15 -0
- dockerhub_api-1.3.2/pyproject.toml +82 -0
- dockerhub_api-1.3.2/requirements.txt +3 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_api_repositories.py +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_api_wrapper.py +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_auth.py +1 -1
- dockerhub_api-1.3.2/tests/test_dockerhub_a2a_validation.py +19 -0
- dockerhub_api-1.3.2/tests/test_dockerhub_mcp_validation.py +167 -0
- dockerhub_api-1.3.2/tests/test_fleet_name.py +53 -0
- dockerhub_api-1.3.2/tests/test_identity_namespace_scoping.py +78 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_init_dynamics.py +1 -5
- dockerhub_api-1.3.2/tests/test_kg_ingest.py +155 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_rate_limit.py +1 -1
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_startup.py +0 -13
- dockerhub_api-1.0.1/dockerhub_api/__main__.py +0 -4
- dockerhub_api-1.0.1/dockerhub_api/agent_server.py +0 -92
- dockerhub_api-1.0.1/dockerhub_api/main_agent.json +0 -18
- dockerhub_api-1.0.1/dockerhub_api/mcp/mcp_admin.py +0 -45
- dockerhub_api-1.0.1/dockerhub_api/prompts/main_agent.json +0 -18
- dockerhub_api-1.0.1/dockerhub_api/skills/dockerhub-starter/SKILL.md +0 -19
- dockerhub_api-1.0.1/dockerhub_api.egg-info/entry_points.txt +0 -9
- dockerhub_api-1.0.1/dockerhub_api.egg-info/requires.txt +0 -18
- dockerhub_api-1.0.1/pyproject.toml +0 -66
- dockerhub_api-1.0.1/requirements.txt +0 -3
- dockerhub_api-1.0.1/tests/test_concept_parity.py +0 -34
- dockerhub_api-1.0.1/tests/test_dockerhub_a2a_validation.py +0 -30
- dockerhub_api-1.0.1/tests/test_dockerhub_mcp_validation.py +0 -261
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/MANIFEST.in +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/api/__init__.py +0 -0
- {dockerhub_api-1.0.1/dockerhub_api/prompts → dockerhub_api-1.3.2/dockerhub_api/connectors}/__init__.py +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api/mcp_config.json +0 -0
- {dockerhub_api-1.0.1/dockerhub_api/skills → dockerhub_api-1.3.2/dockerhub_api/prompts}/__init__.py +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api.egg-info/dependency_links.txt +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/dockerhub_api.egg-info/top_level.txt +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/setup.cfg +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_api_audit.py +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_api_org.py +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_api_registry.py +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_api_scim.py +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_api_scout.py +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_api_teams.py +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_api_tokens.py +0 -0
- {dockerhub_api-1.0.1 → dockerhub_api-1.3.2}/tests/test_models.py +0 -0
|
@@ -1,35 +1,33 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dockerhub-api
|
|
3
|
-
Version: 1.
|
|
4
|
-
Summary: Docker Hub API + MCP Server
|
|
5
|
-
Author-email:
|
|
3
|
+
Version: 1.3.2
|
|
4
|
+
Summary: Docker Hub API + MCP Server
|
|
5
|
+
Author-email: Project Maintainers <maintainers@users.noreply.github.com>
|
|
6
6
|
License: MIT
|
|
7
7
|
Classifier: Development Status :: 5 - Production/Stable
|
|
8
8
|
Classifier: License :: OSI Approved :: MIT License
|
|
9
9
|
Classifier: Environment :: Console
|
|
10
10
|
Classifier: Operating System :: POSIX :: Linux
|
|
11
11
|
Classifier: Programming Language :: Python :: 3
|
|
12
|
-
Requires-Python: <3.15,>=3.
|
|
12
|
+
Requires-Python: <3.15,>=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist: agent-
|
|
16
|
-
Requires-Dist: httpx>=0.
|
|
17
|
-
Requires-Dist: python-dotenv>=1.
|
|
15
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.11
|
|
16
|
+
Requires-Dist: httpx>=0.28.1
|
|
17
|
+
Requires-Dist: python-dotenv>=1.2.4
|
|
18
18
|
Provides-Extra: mcp
|
|
19
|
-
Requires-Dist: agent-
|
|
20
|
-
Provides-Extra: agent
|
|
21
|
-
Requires-Dist: agent-utilities[agent,logfire]>=1.0.0; extra == "agent"
|
|
19
|
+
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.11; extra == "mcp"
|
|
22
20
|
Provides-Extra: all
|
|
23
|
-
Requires-Dist: dockerhub-api[
|
|
21
|
+
Requires-Dist: dockerhub-api[mcp]>=1.0.1; extra == "all"
|
|
24
22
|
Provides-Extra: test
|
|
25
|
-
Requires-Dist: pytest-xdist>=3.
|
|
26
|
-
Requires-Dist: pytest; extra == "test"
|
|
27
|
-
Requires-Dist: pytest-asyncio; extra == "test"
|
|
28
|
-
Requires-Dist: pytest-cov; 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"
|
|
29
27
|
Dynamic: license-file
|
|
30
28
|
|
|
31
29
|
# Dockerhub Api
|
|
32
|
-
## CLI or API | MCP
|
|
30
|
+
## CLI or API | MCP
|
|
33
31
|
|
|
34
32
|

|
|
35
33
|

|
|
@@ -43,10 +41,9 @@ Dynamic: license-file
|
|
|
43
41
|

|
|
44
42
|

|
|
45
43
|
|
|
46
|
-
*Version: 1.
|
|
44
|
+
*Version: 1.3.2*
|
|
47
45
|
|
|
48
46
|
> **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
|
|
49
|
-
> interfaces, the integrated A2A agent server, and guidance on the backing
|
|
50
47
|
> Docker Hub platform are maintained in [docs/](docs/index.md).
|
|
51
48
|
|
|
52
49
|
---
|
|
@@ -75,7 +72,7 @@ that wraps the official **Docker Hub API v2** (`https://hub.docker.com`): reposi
|
|
|
75
72
|
and tags, immutable tags, personal and organization access tokens, organization
|
|
76
73
|
members/settings/invites, teams, audit logs, and SCIM 2.0 provisioning — plus the
|
|
77
74
|
**Registry HTTP API v2** (`registry-1.docker.io`: manifests, blobs, digests,
|
|
78
|
-
multi-arch inspection, OCI referrers, and gated push/
|
|
75
|
+
multi-arch inspection, OCI referrers, and gated push/remove) and **Docker Scout**
|
|
79
76
|
(`api.scout.docker.com`: CVE/SBOM/policy intelligence).
|
|
80
77
|
|
|
81
78
|
---
|
|
@@ -93,14 +90,14 @@ multi-arch inspection, OCI referrers, and gated push/delete) and **Docker Scout*
|
|
|
93
90
|
expiry, with one transparent re-mint on 401.
|
|
94
91
|
- **Rate-Limit Telemetry:** `X-RateLimit-*` headers surfaced in every result;
|
|
95
92
|
HTTP 429 retried with bounded `Retry-After` backoff.
|
|
96
|
-
- **Safety by Default:**
|
|
93
|
+
- **Safety by Default:** Removes and org-settings writes are gated behind
|
|
97
94
|
`DOCKERHUB_ALLOW_DESTRUCTIVE` (default `False`); secrets are redacted from tool
|
|
98
95
|
results (plaintext tokens appear exactly once — on creation). Repository creation
|
|
99
96
|
stays enabled: it is the primary release-provisioning use case.
|
|
100
97
|
- **Integrated Graph Agent:** Built-in Pydantic AI agent (`dockerhub-agent`) with
|
|
101
98
|
A2A and AG-UI web interfaces.
|
|
102
99
|
- **Native Telemetry & Tracing:** Out-of-the-box OpenTelemetry exports and Langfuse
|
|
103
|
-
tracing via agent-
|
|
100
|
+
tracing via agent-connector-sdk.
|
|
104
101
|
|
|
105
102
|
---
|
|
106
103
|
|
|
@@ -109,54 +106,48 @@ multi-arch inspection, OCI referrers, and gated push/delete) and **Docker Scout*
|
|
|
109
106
|
```bash
|
|
110
107
|
pip install dockerhub-api # API client only
|
|
111
108
|
pip install "dockerhub-api[mcp]" # + MCP server
|
|
112
|
-
pip install "dockerhub-api[agent]" # + A2A agent server
|
|
113
109
|
pip install "dockerhub-api[all]" # everything
|
|
114
110
|
```
|
|
115
111
|
|
|
116
112
|
| Extra | Adds |
|
|
117
113
|
|---|---|
|
|
118
|
-
| `mcp` | FastMCP server (`dockerhub-mcp`) via `agent-
|
|
119
|
-
| `agent` | Pydantic-AI A2A agent (`dockerhub-agent`) + Logfire via `agent-
|
|
114
|
+
| `mcp` | FastMCP server (`dockerhub-mcp`) via `agent-connector-sdk` |
|
|
115
|
+
| `agent` | Pydantic-AI A2A agent (`dockerhub-agent`) + Logfire via `agent-connector-sdk` |
|
|
120
116
|
| `all` | `mcp` + `agent` |
|
|
121
117
|
| `test` | pytest toolchain for development |
|
|
122
118
|
|
|
123
119
|
```bash
|
|
124
|
-
# MCP server
|
|
120
|
+
# Connector-focused MCP server (includes the shared graph engine)
|
|
125
121
|
uv pip install "dockerhub-api[mcp]"
|
|
126
122
|
|
|
127
|
-
#
|
|
128
|
-
uv pip install "dockerhub-api[agent]"
|
|
123
|
+
# Agent runtime (adds model orchestration to the shared graph engine)
|
|
129
124
|
|
|
130
125
|
# Everything (development)
|
|
131
126
|
uv pip install "dockerhub-api[all]" # or: python -m pip install "dockerhub-api[all]"
|
|
132
127
|
```
|
|
133
128
|
|
|
134
|
-
### Container images (`:mcp`
|
|
129
|
+
### Container images (`:mcp`)
|
|
135
130
|
|
|
136
|
-
One multi-stage `docker/Dockerfile` builds
|
|
131
|
+
One multi-stage `docker/Dockerfile` builds the MCP-only image (`--target mcp`):
|
|
137
132
|
|
|
138
133
|
| Image tag | Build target | Contents | Entrypoint |
|
|
139
134
|
|-----------|--------------|----------|------------|
|
|
140
|
-
| `
|
|
141
|
-
| `knucklessg1/dockerhub-api:latest` | `--target agent` (default) | `dockerhub-api[agent]` — **full** agent runtime + epistemic-graph engine | `dockerhub-agent` |
|
|
135
|
+
| `example/dockerhub-api:mcp` | `--target mcp` | `dockerhub-api[mcp]` — **connector-focused**, includes `epistemic-graph[full]`; no model-orchestration stack | `dockerhub-mcp` |
|
|
142
136
|
|
|
143
137
|
```bash
|
|
144
|
-
docker build --target mcp -t
|
|
145
|
-
docker build --target agent -t knucklessg1/dockerhub-api:latest docker/ # full agent
|
|
138
|
+
docker build --target mcp -t example/dockerhub-api:mcp docker/ # connector-focused MCP server
|
|
146
139
|
```
|
|
147
140
|
|
|
148
|
-
`
|
|
149
|
-
agent (`:latest`) with a co-located `:mcp` sidecar.
|
|
141
|
+
agent (`immutable agent digest`) with a co-located `:mcp` sidecar.
|
|
150
142
|
|
|
151
143
|
### Knowledge-graph database (`epistemic-graph`)
|
|
152
144
|
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
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
|
|
158
150
|
[epistemic-graph deployment guide](https://knuckles-team.github.io/epistemic-graph/deployment/).
|
|
159
|
-
The slim `[mcp]` server does **not** require the database.
|
|
160
151
|
|
|
161
152
|
---
|
|
162
153
|
|
|
@@ -167,12 +158,12 @@ The slim `[mcp]` server does **not** require the database.
|
|
|
167
158
|
```python
|
|
168
159
|
from dockerhub_api.auth import get_client
|
|
169
160
|
|
|
170
|
-
api = get_client()
|
|
161
|
+
api = get_client() # reads DOCKERHUB_URL / DOCKER_HUB_USER / DOCKER_HUB_TOKEN
|
|
171
162
|
|
|
172
163
|
repos = api.get_repositories(namespace="acme", ordering="-last_updated")
|
|
173
164
|
api.create_repository(namespace="acme", name="release-images", is_private=True)
|
|
174
165
|
tags = api.get_repository_tags(namespace="acme", repository="release-images")
|
|
175
|
-
print(api.rate_limit)
|
|
166
|
+
print(api.rate_limit) # latest X-RateLimit-* snapshot
|
|
176
167
|
```
|
|
177
168
|
|
|
178
169
|
Every client method returns a uniform envelope:
|
|
@@ -193,6 +184,7 @@ _Auto-generated — do not edit (synced by the `mcp-readme-table` pre-commit hoo
|
|
|
193
184
|
| `hub_admin` | `ADMINTOOL` | Client diagnostics: 'rate_limit' returns the latest |
|
|
194
185
|
| `hub_audit` | `AUDITTOOL` | Read a Docker Hub account's audit trail: 'logs' lists events |
|
|
195
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. |
|
|
196
188
|
| `hub_org` | `ORGTOOL` | Manage a Docker Hub organization: settings (restricted images), |
|
|
197
189
|
| `hub_registry` | `REGISTRYTOOL` | Docker Registry v2 image operations (``registry-1.docker.io``): |
|
|
198
190
|
| `hub_repos` | `REPOSTOOL` | Manage Docker Hub repositories: list/create/inspect repositories, |
|
|
@@ -271,11 +263,10 @@ _9 action-routed tool(s) (default) · 54 verbose 1:1 tool(s). Each is enabled un
|
|
|
271
263
|
|
|
272
264
|
<!-- MCP-CONFIG-EXAMPLES:START -->
|
|
273
265
|
|
|
274
|
-
> **Install the
|
|
275
|
-
>
|
|
276
|
-
>
|
|
277
|
-
>
|
|
278
|
-
> full `[agent]` extra only when you need the integrated Pydantic AI agent.
|
|
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.
|
|
279
270
|
|
|
280
271
|
#### stdio Transport (local IDEs — Cursor, Claude Desktop, VS Code)
|
|
281
272
|
|
|
@@ -290,20 +281,19 @@ _9 action-routed tool(s) (default) · 54 verbose 1:1 tool(s). Each is enabled un
|
|
|
290
281
|
"dockerhub-mcp"
|
|
291
282
|
],
|
|
292
283
|
"env": {
|
|
293
|
-
"MCP_TOOL_MODE": "
|
|
284
|
+
"MCP_TOOL_MODE": "intent",
|
|
294
285
|
"ADMINTOOL": "True",
|
|
295
286
|
"AUDITTOOL": "True",
|
|
296
287
|
"AUTHTOOL": "True",
|
|
297
288
|
"DOCKERHUB_ALLOW_DESTRUCTIVE": "False",
|
|
298
|
-
"
|
|
289
|
+
"DOCKERHUB_TLS_PROFILE": "system",
|
|
299
290
|
"DOCKERHUB_TOKEN": "dckr_pat_your_personal_access_token",
|
|
300
291
|
"DOCKERHUB_URL": "https://hub.docker.com",
|
|
301
292
|
"DOCKERHUB_USERNAME": "your_dockerhub_username",
|
|
302
|
-
"DOCKER_HUB_TOKEN": "",
|
|
303
|
-
"DOCKER_HUB_USER": "",
|
|
304
293
|
"DOCKER_REGISTRY_AUTH_URL": "https://auth.docker.io/token",
|
|
305
294
|
"DOCKER_REGISTRY_URL": "https://registry-1.docker.io",
|
|
306
295
|
"DOCKER_SCOUT_URL": "https://api.scout.docker.com",
|
|
296
|
+
"KGTOOL": "True",
|
|
307
297
|
"ORGTOOL": "True",
|
|
308
298
|
"REGISTRYTOOL": "True",
|
|
309
299
|
"REPOSTOOL": "True",
|
|
@@ -316,6 +306,10 @@ _9 action-routed tool(s) (default) · 54 verbose 1:1 tool(s). Each is enabled un
|
|
|
316
306
|
}
|
|
317
307
|
```
|
|
318
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
|
+
|
|
319
313
|
#### Streamable-HTTP Transport (networked / production)
|
|
320
314
|
|
|
321
315
|
```json
|
|
@@ -334,22 +328,21 @@ _9 action-routed tool(s) (default) · 54 verbose 1:1 tool(s). Each is enabled un
|
|
|
334
328
|
],
|
|
335
329
|
"env": {
|
|
336
330
|
"TRANSPORT": "streamable-http",
|
|
337
|
-
"HOST": "
|
|
331
|
+
"HOST": "127.0.0.1",
|
|
338
332
|
"PORT": "8000",
|
|
339
|
-
"MCP_TOOL_MODE": "
|
|
333
|
+
"MCP_TOOL_MODE": "intent",
|
|
340
334
|
"ADMINTOOL": "True",
|
|
341
335
|
"AUDITTOOL": "True",
|
|
342
336
|
"AUTHTOOL": "True",
|
|
343
337
|
"DOCKERHUB_ALLOW_DESTRUCTIVE": "False",
|
|
344
|
-
"
|
|
338
|
+
"DOCKERHUB_TLS_PROFILE": "system",
|
|
345
339
|
"DOCKERHUB_TOKEN": "dckr_pat_your_personal_access_token",
|
|
346
340
|
"DOCKERHUB_URL": "https://hub.docker.com",
|
|
347
341
|
"DOCKERHUB_USERNAME": "your_dockerhub_username",
|
|
348
|
-
"DOCKER_HUB_TOKEN": "",
|
|
349
|
-
"DOCKER_HUB_USER": "",
|
|
350
342
|
"DOCKER_REGISTRY_AUTH_URL": "https://auth.docker.io/token",
|
|
351
343
|
"DOCKER_REGISTRY_URL": "https://registry-1.docker.io",
|
|
352
344
|
"DOCKER_SCOUT_URL": "https://api.scout.docker.com",
|
|
345
|
+
"KGTOOL": "True",
|
|
353
346
|
"ORGTOOL": "True",
|
|
354
347
|
"REGISTRYTOOL": "True",
|
|
355
348
|
"REPOSTOOL": "True",
|
|
@@ -374,54 +367,60 @@ Alternatively, connect to a pre-deployed Streamable-HTTP instance by `url`:
|
|
|
374
367
|
}
|
|
375
368
|
```
|
|
376
369
|
|
|
377
|
-
|
|
370
|
+
Run a reviewed container image as a least-privilege stdio child (no
|
|
371
|
+
listener or published port):
|
|
378
372
|
|
|
379
373
|
```bash
|
|
380
|
-
docker run -
|
|
381
|
-
--
|
|
382
|
-
-
|
|
383
|
-
-
|
|
384
|
-
-
|
|
385
|
-
|
|
386
|
-
-e
|
|
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 \
|
|
387
382
|
-e ADMINTOOL=True \
|
|
388
383
|
-e AUDITTOOL=True \
|
|
389
384
|
-e AUTHTOOL=True \
|
|
390
385
|
-e DOCKERHUB_ALLOW_DESTRUCTIVE=False \
|
|
391
|
-
-e
|
|
386
|
+
-e DOCKERHUB_TLS_PROFILE=system \
|
|
392
387
|
-e DOCKERHUB_TOKEN=dckr_pat_your_personal_access_token \
|
|
393
388
|
-e DOCKERHUB_URL=https://hub.docker.com \
|
|
394
389
|
-e DOCKERHUB_USERNAME=your_dockerhub_username \
|
|
395
|
-
-e DOCKER_HUB_TOKEN="" \
|
|
396
|
-
-e DOCKER_HUB_USER="" \
|
|
397
390
|
-e DOCKER_REGISTRY_AUTH_URL=https://auth.docker.io/token \
|
|
398
391
|
-e DOCKER_REGISTRY_URL=https://registry-1.docker.io \
|
|
399
392
|
-e DOCKER_SCOUT_URL=https://api.scout.docker.com \
|
|
393
|
+
-e KGTOOL=True \
|
|
400
394
|
-e ORGTOOL=True \
|
|
401
395
|
-e REGISTRYTOOL=True \
|
|
402
396
|
-e REPOSTOOL=True \
|
|
403
397
|
-e SCIMTOOL=True \
|
|
404
398
|
-e SCOUTTOOL=True \
|
|
405
399
|
-e TEAMSTOOL=True \
|
|
406
|
-
|
|
400
|
+
registry.example.invalid/dockerhub-api@sha256:<digest> dockerhub-mcp
|
|
407
401
|
```
|
|
408
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
|
+
|
|
409
408
|
_Auto-generated from the code-read env surface (`MCP_TOOL_MODE` + package vars) — do not edit._
|
|
410
409
|
<!-- MCP-CONFIG-EXAMPLES:END -->
|
|
411
410
|
|
|
412
411
|
<!-- BEGIN GENERATED: additional-deployment-options -->
|
|
413
412
|
### Additional Deployment Options
|
|
414
413
|
|
|
415
|
-
`dockerhub-api` can
|
|
416
|
-
|
|
417
|
-
[Deployment guide](https://knuckles-team.github.io/dockerhub-api/deployment/)
|
|
418
|
-
|
|
419
|
-
**local container / uv**, and **remote URL**:
|
|
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.
|
|
420
418
|
|
|
421
|
-
- **Local container
|
|
422
|
-
|
|
423
|
-
- **Remote URL** — connect
|
|
424
|
-
|
|
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`.
|
|
425
424
|
<!-- END GENERATED: additional-deployment-options -->
|
|
426
425
|
|
|
427
426
|
## Safety Model
|
|
@@ -430,14 +429,14 @@ consumed from a **remote deployment**. The
|
|
|
430
429
|
|---|---|---|
|
|
431
430
|
| Reads (repos, tags, members, logs, SCIM) | allowed | — |
|
|
432
431
|
| Repository create / immutable-tag config / invites / role updates | allowed | — |
|
|
433
|
-
|
|
|
432
|
+
| Removes (PATs, OATs, groups, members, invites) | **blocked** | `DOCKERHUB_ALLOW_DESTRUCTIVE=True` |
|
|
434
433
|
| Org-settings writes (`PUT /v2/orgs/{org}/settings`) | **blocked** | `DOCKERHUB_ALLOW_DESTRUCTIVE=True` |
|
|
435
434
|
|
|
436
435
|
---
|
|
437
436
|
|
|
438
437
|
## Concepts
|
|
439
438
|
|
|
440
|
-
The concept registry (`CONCEPT:
|
|
439
|
+
The concept registry (`CONCEPT:DH-OS.governance.hub-x`) is documented in
|
|
441
440
|
[docs/concepts.md](docs/concepts.md).
|
|
442
441
|
|
|
443
442
|
## License
|
|
@@ -445,23 +444,88 @@ The concept registry (`CONCEPT:HUB-1.x`) is documented in
|
|
|
445
444
|
MIT — see [LICENSE](LICENSE).
|
|
446
445
|
|
|
447
446
|
|
|
448
|
-
<!-- BEGIN agent-os-genesis-deploy (generated; do not edit between markers) -->
|
|
449
|
-
|
|
450
|
-
## Deploy with `agent-os-genesis`
|
|
451
|
-
|
|
452
|
-
This package can be provisioned for you — skill-guided — by the **`agent-os-genesis`**
|
|
453
|
-
universal skill (its *single-package deploy mode*): it picks your install method, seeds
|
|
454
|
-
secrets to OpenBao/Vault (or `.env`), trusts your enterprise CA, registers the MCP
|
|
455
|
-
server, and verifies it — the same machinery that stands up the whole Agent OS, narrowed
|
|
456
|
-
to just this package. Ask your agent to **"deploy `dockerhub-api` with agent-os-genesis"**.
|
|
457
|
-
|
|
458
|
-
| Install mode | Command |
|
|
459
|
-
|------|---------|
|
|
460
|
-
| Bare-metal, prod (PyPI) | `uvx dockerhub-mcp` · or `uv tool install dockerhub-api` |
|
|
461
|
-
| Bare-metal, dev (editable) | `uv pip install -e ".[all]"` · or `pip install -e ".[all]"` |
|
|
462
|
-
| Container, prod | deploy `knucklessg1/dockerhub-api:latest` via docker-compose / swarm / podman / podman-compose / kubernetes |
|
|
463
|
-
| Container, dev (editable) | deploy `docker/compose.dev.yml` (source-mounted at `/src`; edits live on restart) |
|
|
464
|
-
|
|
465
|
-
Secrets are read-existing + seeded via `vault_sync` — you are only prompted for what's missing.
|
|
466
447
|
|
|
467
|
-
<!--
|
|
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 -->
|