dockerhub-api 1.0.1__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 (98) hide show
  1. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/LICENSE +1 -1
  2. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/PKG-INFO +163 -99
  3. dockerhub_api-1.0.1/dockerhub_api.egg-info/PKG-INFO → dockerhub_api-1.3.1/README.md +150 -114
  4. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/__init__.py +36 -16
  5. dockerhub_api-1.3.1/dockerhub_api/__main__.py +4 -0
  6. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_access_tokens.py +1 -1
  7. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_audit_logs.py +1 -1
  8. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_auth.py +2 -2
  9. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_base.py +91 -55
  10. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_groups.py +2 -2
  11. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_org_access_tokens.py +1 -1
  12. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_orgs.py +2 -2
  13. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_registry.py +3 -3
  14. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_registry_base.py +117 -50
  15. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_repositories.py +1 -1
  16. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_scim.py +1 -1
  17. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/api_client_scout.py +1 -1
  18. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api_client.py +3 -3
  19. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/auth.py +224 -92
  20. dockerhub_api-1.3.1/dockerhub_api/connectors/mcp_source_presets.json +18 -0
  21. dockerhub_api-1.3.1/dockerhub_api/connectors/tool_schema_fingerprints.json +8 -0
  22. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/dockerhub_input_models.py +1 -1
  23. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/dockerhub_response_models.py +1 -1
  24. dockerhub_api-1.3.1/dockerhub_api/kg_ingest.py +228 -0
  25. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp/__init__.py +5 -3
  26. dockerhub_api-1.3.1/dockerhub_api/mcp/mcp_admin.py +53 -0
  27. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_audit.py +3 -3
  28. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_auth.py +3 -3
  29. dockerhub_api-1.3.1/dockerhub_api/mcp/mcp_kg.py +94 -0
  30. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_org.py +3 -3
  31. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_registry.py +7 -7
  32. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_repos.py +3 -3
  33. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_scim.py +4 -4
  34. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_scout.py +4 -4
  35. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp/mcp_teams.py +3 -3
  36. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp_server.py +27 -10
  37. dockerhub_api-1.3.1/dockerhub_api/ontology/__init__.py +7 -0
  38. dockerhub_api-1.3.1/dockerhub_api/ontology/certification.json +36 -0
  39. dockerhub_api-1.3.1/dockerhub_api/ontology/dockerhub.ttl +142 -0
  40. dockerhub_api-1.3.1/dockerhub_api/ontology/fixtures/records.json +20 -0
  41. dockerhub_api-1.3.1/dockerhub_api/ontology/mappings/source.yaml +20 -0
  42. dockerhub_api-1.3.1/dockerhub_api/ontology/migrations/manifest.json +6 -0
  43. dockerhub_api-1.3.1/dockerhub_api/ontology/shapes/connector.shacl.ttl +144 -0
  44. dockerhub_api-1.3.1/dockerhub_api/skills/__init__.py +0 -0
  45. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-api-operations/SKILL.md +33 -0
  46. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-api-operations/agents/openai.yaml +4 -0
  47. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-api-operations/references/catalog.md +7 -0
  48. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-image-registry-scout/SKILL.md +107 -0
  49. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-image-registry-scout/WORKFLOW.md +93 -0
  50. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-org-administration/SKILL.md +105 -0
  51. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-org-administration/WORKFLOW.md +91 -0
  52. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-repository-management/SKILL.md +111 -0
  53. dockerhub_api-1.3.1/dockerhub_api/skills/dockerhub-repository-management/WORKFLOW.md +97 -0
  54. dockerhub_api-1.0.1/README.md → dockerhub_api-1.3.1/dockerhub_api.egg-info/PKG-INFO +178 -84
  55. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api.egg-info/SOURCES.txt +23 -5
  56. dockerhub_api-1.3.1/dockerhub_api.egg-info/entry_points.txt +11 -0
  57. dockerhub_api-1.3.1/dockerhub_api.egg-info/requires.txt +15 -0
  58. dockerhub_api-1.3.1/pyproject.toml +78 -0
  59. dockerhub_api-1.3.1/requirements.txt +3 -0
  60. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_api_repositories.py +1 -1
  61. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_api_wrapper.py +1 -1
  62. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_auth.py +1 -1
  63. dockerhub_api-1.3.1/tests/test_dockerhub_a2a_validation.py +19 -0
  64. dockerhub_api-1.3.1/tests/test_dockerhub_mcp_validation.py +167 -0
  65. dockerhub_api-1.3.1/tests/test_identity_namespace_scoping.py +78 -0
  66. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_init_dynamics.py +1 -5
  67. dockerhub_api-1.3.1/tests/test_kg_ingest.py +155 -0
  68. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_rate_limit.py +1 -1
  69. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_startup.py +0 -13
  70. dockerhub_api-1.0.1/dockerhub_api/__main__.py +0 -4
  71. dockerhub_api-1.0.1/dockerhub_api/agent_server.py +0 -92
  72. dockerhub_api-1.0.1/dockerhub_api/main_agent.json +0 -18
  73. dockerhub_api-1.0.1/dockerhub_api/mcp/mcp_admin.py +0 -45
  74. dockerhub_api-1.0.1/dockerhub_api/prompts/main_agent.json +0 -18
  75. dockerhub_api-1.0.1/dockerhub_api/skills/dockerhub-starter/SKILL.md +0 -19
  76. dockerhub_api-1.0.1/dockerhub_api.egg-info/entry_points.txt +0 -9
  77. dockerhub_api-1.0.1/dockerhub_api.egg-info/requires.txt +0 -18
  78. dockerhub_api-1.0.1/pyproject.toml +0 -66
  79. dockerhub_api-1.0.1/requirements.txt +0 -3
  80. dockerhub_api-1.0.1/tests/test_concept_parity.py +0 -34
  81. dockerhub_api-1.0.1/tests/test_dockerhub_a2a_validation.py +0 -30
  82. dockerhub_api-1.0.1/tests/test_dockerhub_mcp_validation.py +0 -261
  83. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/MANIFEST.in +0 -0
  84. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/api/__init__.py +0 -0
  85. {dockerhub_api-1.0.1/dockerhub_api/prompts → dockerhub_api-1.3.1/dockerhub_api/connectors}/__init__.py +0 -0
  86. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api/mcp_config.json +0 -0
  87. {dockerhub_api-1.0.1/dockerhub_api/skills → dockerhub_api-1.3.1/dockerhub_api/prompts}/__init__.py +0 -0
  88. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api.egg-info/dependency_links.txt +0 -0
  89. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/dockerhub_api.egg-info/top_level.txt +0 -0
  90. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/setup.cfg +0 -0
  91. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_api_audit.py +0 -0
  92. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_api_org.py +0 -0
  93. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_api_registry.py +0 -0
  94. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_api_scim.py +0 -0
  95. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_api_scout.py +0 -0
  96. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_api_teams.py +0 -0
  97. {dockerhub_api-1.0.1 → dockerhub_api-1.3.1}/tests/test_api_tokens.py +0 -0
  98. {dockerhub_api-1.0.1 → 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
@@ -1,35 +1,33 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: dockerhub-api
3
- Version: 1.0.1
4
- Summary: Docker Hub API + MCP Server + A2A Server
5
- Author-email: Audel Rouhi <knucklessg1@gmail.com>
3
+ Version: 1.3.1
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.11
12
+ Requires-Python: <3.15,>=3.12
13
13
  Description-Content-Type: text/markdown
14
14
  License-File: LICENSE
15
- Requires-Dist: agent-utilities>=1.0.0
16
- Requires-Dist: httpx>=0.27.0
17
- Requires-Dist: python-dotenv>=1.0.0
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
18
  Provides-Extra: mcp
19
- Requires-Dist: agent-utilities[mcp]>=1.0.0; extra == "mcp"
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.5; extra == "mcp"
22
20
  Provides-Extra: all
23
- Requires-Dist: dockerhub-api[agent,logfire,mcp]>=1.0.0; extra == "all"
21
+ Requires-Dist: dockerhub-api[mcp]>=1.0.1; extra == "all"
24
22
  Provides-Extra: test
25
- Requires-Dist: pytest-xdist>=3.6.0; extra == "test"
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 | Agent
30
+ ## CLI or API | MCP
33
31
 
34
32
  ![PyPI - Version](https://img.shields.io/pypi/v/dockerhub-api)
35
33
  ![MCP Server](https://badge.mcpx.dev?type=server 'MCP Server')
@@ -43,10 +41,9 @@ Dynamic: license-file
43
41
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/dockerhub-api)
44
42
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/dockerhub-api)
45
43
 
46
- *Version: 1.0.1*
44
+ *Version: 1.3.1*
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/delete) and **Docker Scout**
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:** Deletes and org-settings writes are gated behind
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-utilities.
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-utilities[mcp]` |
119
- | `agent` | Pydantic-AI A2A agent (`dockerhub-agent`) + Logfire via `agent-utilities[agent,logfire]` |
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 only (recommended for tool hosting — slim deps)
120
+ # Connector-focused MCP server (includes the shared graph engine)
125
121
  uv pip install "dockerhub-api[mcp]"
126
122
 
127
- # Full agent runtime (Pydantic AI + epistemic-graph engine)
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` vs `:agent`)
129
+ ### Container images (`:mcp`)
135
130
 
136
- One multi-stage `docker/Dockerfile` builds two right-sized images, selected by `--target`:
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
- | `knucklessg1/dockerhub-api:mcp` | `--target mcp` | `dockerhub-api[mcp]` — **slim**, no engine/`pydantic-ai`/`dspy`/`llama-index`/`tree-sitter` | `dockerhub-mcp` |
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 knucklessg1/dockerhub-api:mcp docker/ # slim MCP server
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
- `docker/mcp.compose.yml` runs the slim `:mcp` server; `docker/agent.compose.yml` runs the
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
- The **full agent** (`[agent]` / `:latest`) embeds the **epistemic-graph** engine (pulled in
154
- transitively via `agent-utilities[agent]`). For production — or to share one knowledge graph
155
- across multiple agents — run **epistemic-graph as its own database container** and point the
156
- agent at it instead of embedding it. Deployment recipes (single-node + Raft HA), connection
157
- config, and the full database architecture (with diagrams) are documented in the
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() # reads DOCKERHUB_URL / DOCKER_HUB_USER / DOCKER_HUB_TOKEN
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) # latest X-RateLimit-* snapshot
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 slim `[mcp]` extra.** All examples install `dockerhub-api[mcp]` — the
275
- > MCP-server extra that pulls only the FastMCP / FastAPI tooling (`agent-utilities[mcp]`).
276
- > It deliberately **excludes** the heavy agent runtime (`pydantic-ai`, the epistemic-graph
277
- > engine, `dspy`, `llama-index`), so `uvx` / container installs are far smaller. Use the
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": "condensed",
284
+ "MCP_TOOL_MODE": "intent",
294
285
  "ADMINTOOL": "True",
295
286
  "AUDITTOOL": "True",
296
287
  "AUTHTOOL": "True",
297
288
  "DOCKERHUB_ALLOW_DESTRUCTIVE": "False",
298
- "DOCKERHUB_JWT": "",
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": "0.0.0.0",
331
+ "HOST": "127.0.0.1",
338
332
  "PORT": "8000",
339
- "MCP_TOOL_MODE": "condensed",
333
+ "MCP_TOOL_MODE": "intent",
340
334
  "ADMINTOOL": "True",
341
335
  "AUDITTOOL": "True",
342
336
  "AUTHTOOL": "True",
343
337
  "DOCKERHUB_ALLOW_DESTRUCTIVE": "False",
344
- "DOCKERHUB_JWT": "",
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
- Deploying the Streamable-HTTP server via Docker:
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 -d \
381
- --name dockerhub-mcp-mcp \
382
- -p 8000:8000 \
383
- -e TRANSPORT=streamable-http \
384
- -e HOST=0.0.0.0 \
385
- -e PORT=8000 \
386
- -e MCP_TOOL_MODE=condensed \
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 DOCKERHUB_JWT="" \
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
- knucklessg1/dockerhub-api:mcp
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 also run as a **local container** (Docker / Podman / `uv`) or be
416
- consumed from a **remote deployment**. The
417
- [Deployment guide](https://knuckles-team.github.io/dockerhub-api/deployment/) has full, copy-paste
418
- `mcp_config.json` for all four transports — **stdio**, **streamable-http**,
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 / uv** — launch the server from `mcp_config.json` via `uvx`,
422
- `docker run`, or `podman run`, or point at a local streamable-http container by `url`.
423
- - **Remote URL** — connect to a server deployed behind Caddy at
424
- `http://dockerhub-mcp.arpa/mcp` using the `"url"` key.
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
- | Deletes (PATs, OATs, groups, members, invites) | **blocked** | `DOCKERHUB_ALLOW_DESTRUCTIVE=True` |
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:HUB-1.x`) is documented in
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
- <!-- END agent-os-genesis-deploy -->
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 -->