dockerhub-api 1.3.4__tar.gz → 1.3.7__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.3.4/dockerhub_api.egg-info → dockerhub_api-1.3.7}/PKG-INFO +3 -9
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/README.md +0 -2
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/__init__.py +33 -0
- dockerhub_api-1.3.7/dockerhub_api/__main__.py +4 -0
- dockerhub_api-1.3.7/dockerhub_api/connector_sources.py +116 -0
- dockerhub_api-1.3.7/dockerhub_api/mcp_server.py +44 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/certification.json +6 -6
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/mappings/source.yaml +1 -1
- dockerhub_api-1.3.7/dockerhub_api/skills/dockerhub-api-development/SKILL.md +110 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7/dockerhub_api.egg-info}/PKG-INFO +3 -9
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api.egg-info/SOURCES.txt +1 -6
- dockerhub_api-1.3.7/dockerhub_api.egg-info/entry_points.txt +5 -0
- dockerhub_api-1.3.7/dockerhub_api.egg-info/requires.txt +9 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/pyproject.toml +14 -14
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_dockerhub_mcp_validation.py +2 -2
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_fleet_name.py +1 -1
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_init_dynamics.py +0 -2
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_startup.py +0 -2
- dockerhub_api-1.3.4/MANIFEST.in +0 -4
- dockerhub_api-1.3.4/dockerhub_api/__main__.py +0 -4
- dockerhub_api-1.3.4/dockerhub_api/connector_sources.py +0 -192
- dockerhub_api-1.3.4/dockerhub_api/connectors/__init__.py +0 -0
- dockerhub_api-1.3.4/dockerhub_api/mcp_server.py +0 -121
- dockerhub_api-1.3.4/dockerhub_api/prompts/__init__.py +0 -0
- dockerhub_api-1.3.4/dockerhub_api/skills/__init__.py +0 -0
- dockerhub_api-1.3.4/dockerhub_api.egg-info/entry_points.txt +0 -11
- dockerhub_api-1.3.4/dockerhub_api.egg-info/requires.txt +0 -15
- dockerhub_api-1.3.4/requirements.txt +0 -3
- dockerhub_api-1.3.4/tests/test_default_content_surfaces.py +0 -43
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/LICENSE +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/__init__.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_access_tokens.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_audit_logs.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_auth.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_base.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_groups.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_org_access_tokens.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_orgs.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_registry.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_registry_base.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_repositories.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_scim.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_scout.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api_client.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/auth.py +1 -1
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/dockerhub_input_models.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/dockerhub_response_models.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/kg_ingest.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/__init__.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_admin.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_audit.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_auth.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_kg.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_org.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_registry.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_repos.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_scim.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_scout.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_teams.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp_config.json +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/__init__.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/dockerhub.ttl +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/fixtures/records.json +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/migrations/manifest.json +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/shapes/connector.shacl.ttl +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-api-operations/SKILL.md +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-api-operations/agents/openai.yaml +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-api-operations/references/catalog.md +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-image-registry-scout/SKILL.md +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-image-registry-scout/WORKFLOW.md +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-org-administration/SKILL.md +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-org-administration/WORKFLOW.md +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-repository-management/SKILL.md +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-repository-management/WORKFLOW.md +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api.egg-info/dependency_links.txt +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api.egg-info/top_level.txt +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/setup.cfg +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_audit.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_org.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_registry.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_repositories.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_scim.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_scout.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_teams.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_tokens.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_wrapper.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_auth.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_dockerhub_a2a_validation.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_identity_namespace_scoping.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_kg_ingest.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_models.py +0 -0
- {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_rate_limit.py +0 -0
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dockerhub-api
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.7
|
|
4
4
|
Summary: Docker Hub API + MCP Server
|
|
5
|
-
Author-email:
|
|
5
|
+
Author-email: Repository Maintainers <maintainers@knuckles.team>
|
|
6
6
|
License: MIT
|
|
7
7
|
Classifier: Development Status :: 5 - Production/Stable
|
|
8
8
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -12,13 +12,9 @@ Classifier: Programming Language :: Python :: 3
|
|
|
12
12
|
Requires-Python: <3.15,>=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist: agent-connector-sdk[mcp]<
|
|
15
|
+
Requires-Dist: agent-connector-sdk[mcp]<0.6.0,>=0.5.4
|
|
16
16
|
Requires-Dist: httpx>=0.28.1
|
|
17
17
|
Requires-Dist: python-dotenv>=1.2.4
|
|
18
|
-
Provides-Extra: mcp
|
|
19
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.4.1; extra == "mcp"
|
|
20
|
-
Provides-Extra: all
|
|
21
|
-
Requires-Dist: dockerhub-api[mcp]>=1.0.1; extra == "all"
|
|
22
18
|
Provides-Extra: test
|
|
23
19
|
Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
|
|
24
20
|
Requires-Dist: pytest>=9.1.1; extra == "test"
|
|
@@ -41,8 +37,6 @@ Dynamic: license-file
|
|
|
41
37
|

|
|
42
38
|

|
|
43
39
|
|
|
44
|
-
*Version: 1.3.4*
|
|
45
|
-
|
|
46
40
|
> **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
|
|
47
41
|
> Docker Hub platform are maintained in [docs/](docs/index.md).
|
|
48
42
|
|
|
@@ -13,8 +13,6 @@
|
|
|
13
13
|

|
|
14
14
|

|
|
15
15
|
|
|
16
|
-
*Version: 1.3.4*
|
|
17
|
-
|
|
18
16
|
> **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
|
|
19
17
|
> Docker Hub platform are maintained in [docs/](docs/index.md).
|
|
20
18
|
|
|
@@ -98,3 +98,36 @@ def __getattr__(name: str) -> Any:
|
|
|
98
98
|
|
|
99
99
|
def __dir__() -> list[str]:
|
|
100
100
|
return sorted(list(globals().keys()) + __all__)
|
|
101
|
+
|
|
102
|
+
|
|
103
|
+
from agent_connector_sdk.connector import Connector
|
|
104
|
+
|
|
105
|
+
from dockerhub_api.api.api_client_registry import RegistryApi
|
|
106
|
+
from dockerhub_api.api.api_client_scout import ScoutApi
|
|
107
|
+
from dockerhub_api.api_client import Api
|
|
108
|
+
from dockerhub_api.mcp import (
|
|
109
|
+
get_hub_client,
|
|
110
|
+
get_registry_client,
|
|
111
|
+
get_scout_client,
|
|
112
|
+
redact_secrets,
|
|
113
|
+
)
|
|
114
|
+
|
|
115
|
+
connector = Connector(
|
|
116
|
+
api=Api,
|
|
117
|
+
get_client=get_hub_client,
|
|
118
|
+
tools="dockerhub_api.mcp_server",
|
|
119
|
+
instructions="Docker Hub API MCP Server - Manage repositories, tags, access tokens, organizations, teams, audit logs, and SCIM provisioning; plus Registry v2 image operations (manifests, blobs, digests, multi-arch inspect, OCI referrers, gated push/delete) and Docker Scout CVE/SBOM/policy intelligence.",
|
|
120
|
+
verbose_targets=(
|
|
121
|
+
{
|
|
122
|
+
"client_cls": RegistryApi,
|
|
123
|
+
"get_client": get_registry_client,
|
|
124
|
+
"prefix": "dockerhub_registry",
|
|
125
|
+
},
|
|
126
|
+
{
|
|
127
|
+
"client_cls": ScoutApi,
|
|
128
|
+
"get_client": get_scout_client,
|
|
129
|
+
"prefix": "dockerhub_scout",
|
|
130
|
+
},
|
|
131
|
+
),
|
|
132
|
+
result_coercer=redact_secrets,
|
|
133
|
+
)
|
|
@@ -0,0 +1,116 @@
|
|
|
1
|
+
"""Data sources of this connector, declared by tool name (generated by connector-ontology-map migrate).
|
|
2
|
+
|
|
3
|
+
Served live as ``connector://resources``. Regenerate by editing the declarations, not the tools.
|
|
4
|
+
"""
|
|
5
|
+
|
|
6
|
+
# ruff: noqa: E501
|
|
7
|
+
from __future__ import annotations
|
|
8
|
+
|
|
9
|
+
from agent_connector_sdk.ingest.live_declaration import source_meta
|
|
10
|
+
|
|
11
|
+
SOURCES = (
|
|
12
|
+
source_meta(
|
|
13
|
+
tool="dockerhub_get_repositories",
|
|
14
|
+
source_id="dockerhub-repositories",
|
|
15
|
+
record_type="Repository",
|
|
16
|
+
id_field="name",
|
|
17
|
+
cursor_field="last_updated",
|
|
18
|
+
page_param="page",
|
|
19
|
+
page_size_param="page_size",
|
|
20
|
+
pagination="page",
|
|
21
|
+
preset={
|
|
22
|
+
"doc_type": "repository",
|
|
23
|
+
"page_kind": "number",
|
|
24
|
+
"params_style": "args",
|
|
25
|
+
},
|
|
26
|
+
records_path="data.results",
|
|
27
|
+
server="dockerhub-mcp",
|
|
28
|
+
text_field="description",
|
|
29
|
+
title_field="name",
|
|
30
|
+
),
|
|
31
|
+
)
|
|
32
|
+
|
|
33
|
+
SCHEMA_VERSION = 2
|
|
34
|
+
|
|
35
|
+
FIELD_SETS = {
|
|
36
|
+
"fields_1": {
|
|
37
|
+
"architecture": "xsd:string",
|
|
38
|
+
"digest": "xsd:string",
|
|
39
|
+
"imageSize": "xsd:integer",
|
|
40
|
+
"isPrivate": "xsd:boolean",
|
|
41
|
+
"lastPushed": "xsd:string",
|
|
42
|
+
"permission": "xsd:string",
|
|
43
|
+
"pullCount": "xsd:integer",
|
|
44
|
+
"scopes": "xsd:string",
|
|
45
|
+
"starCount": "xsd:integer",
|
|
46
|
+
},
|
|
47
|
+
}
|
|
48
|
+
|
|
49
|
+
SCHEMA_MAPPINGS = {
|
|
50
|
+
"AccessToken": {
|
|
51
|
+
"field_sets": ["fields_1"],
|
|
52
|
+
"ontology_class": None,
|
|
53
|
+
},
|
|
54
|
+
"ContainerImage": {
|
|
55
|
+
"field_sets": ["fields_1"],
|
|
56
|
+
"ontology_class": None,
|
|
57
|
+
},
|
|
58
|
+
"Namespace": {
|
|
59
|
+
"field_sets": ["fields_1"],
|
|
60
|
+
"ontology_class": None,
|
|
61
|
+
},
|
|
62
|
+
"Organization": {
|
|
63
|
+
"field_sets": ["fields_1"],
|
|
64
|
+
"ontology_class": "Namespace",
|
|
65
|
+
},
|
|
66
|
+
"Repository": {
|
|
67
|
+
"field_sets": ["fields_1"],
|
|
68
|
+
"ontology_class": "SoftwareProject",
|
|
69
|
+
},
|
|
70
|
+
"Team": {
|
|
71
|
+
"field_sets": ["fields_1"],
|
|
72
|
+
"ontology_class": "Team",
|
|
73
|
+
},
|
|
74
|
+
"Vulnerability": {
|
|
75
|
+
"field_sets": ["fields_1"],
|
|
76
|
+
"ontology_class": None,
|
|
77
|
+
},
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
RESOURCES = (
|
|
81
|
+
{
|
|
82
|
+
"id_prefix": "accesstoken",
|
|
83
|
+
"label": "Access Token",
|
|
84
|
+
"name": "AccessToken",
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
"id_prefix": "containerimage",
|
|
88
|
+
"label": "Container Image",
|
|
89
|
+
"name": "ContainerImage",
|
|
90
|
+
},
|
|
91
|
+
{
|
|
92
|
+
"id_prefix": "namespace",
|
|
93
|
+
"label": "Docker Hub Namespace",
|
|
94
|
+
"name": "Namespace",
|
|
95
|
+
},
|
|
96
|
+
{
|
|
97
|
+
"id_prefix": "organization",
|
|
98
|
+
"label": "Docker Hub Organization",
|
|
99
|
+
"name": "Organization",
|
|
100
|
+
},
|
|
101
|
+
{
|
|
102
|
+
"id_prefix": "repository",
|
|
103
|
+
"label": "Container Repository",
|
|
104
|
+
"name": "Repository",
|
|
105
|
+
},
|
|
106
|
+
{
|
|
107
|
+
"id_prefix": "team",
|
|
108
|
+
"label": "Team",
|
|
109
|
+
"name": "Team",
|
|
110
|
+
},
|
|
111
|
+
{
|
|
112
|
+
"id_prefix": "vulnerability",
|
|
113
|
+
"label": "Vulnerability",
|
|
114
|
+
"name": "Vulnerability",
|
|
115
|
+
},
|
|
116
|
+
)
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
#!/usr/bin/python
|
|
2
|
+
"""Docker Hub MCP server entry point.
|
|
3
|
+
|
|
4
|
+
CONCEPT:DH-OS.audit.action-routed-mcp-surface — action-routed MCP surface. Registers the consolidated,
|
|
5
|
+
togglable tool modules (hub_auth, hub_repos, hub_org, hub_teams, hub_audit,
|
|
6
|
+
hub_scim, hub_admin, hub_registry, hub_scout) on an agent-connector-sdk FastMCP
|
|
7
|
+
server.
|
|
8
|
+
"""
|
|
9
|
+
|
|
10
|
+
import warnings
|
|
11
|
+
|
|
12
|
+
with warnings.catch_warnings():
|
|
13
|
+
warnings.simplefilter("ignore")
|
|
14
|
+
|
|
15
|
+
warnings.filterwarnings("ignore", message=".*urllib3.*or chardet.*")
|
|
16
|
+
warnings.filterwarnings("ignore", message=".*urllib3.*or charset_normalizer.*")
|
|
17
|
+
|
|
18
|
+
|
|
19
|
+
from dockerhub_api.mcp import (
|
|
20
|
+
register_admin_tools,
|
|
21
|
+
register_audit_tools,
|
|
22
|
+
register_auth_tools,
|
|
23
|
+
register_kg_tools,
|
|
24
|
+
register_org_tools,
|
|
25
|
+
register_registry_tools,
|
|
26
|
+
register_repos_tools,
|
|
27
|
+
register_scim_tools,
|
|
28
|
+
register_scout_tools,
|
|
29
|
+
register_teams_tools,
|
|
30
|
+
)
|
|
31
|
+
|
|
32
|
+
# SDK discovery registers the register_<tag>_tools functions bound in this module.
|
|
33
|
+
__all__ = [
|
|
34
|
+
"register_admin_tools",
|
|
35
|
+
"register_audit_tools",
|
|
36
|
+
"register_auth_tools",
|
|
37
|
+
"register_kg_tools",
|
|
38
|
+
"register_org_tools",
|
|
39
|
+
"register_registry_tools",
|
|
40
|
+
"register_repos_tools",
|
|
41
|
+
"register_scim_tools",
|
|
42
|
+
"register_scout_tools",
|
|
43
|
+
"register_teams_tools",
|
|
44
|
+
]
|
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
{
|
|
2
|
-
"api_version": "
|
|
2
|
+
"api_version": "graphos.io/v1",
|
|
3
3
|
"artifacts": {
|
|
4
|
-
"dockerhub_api/ontology/dockerhub.ttl": "
|
|
4
|
+
"dockerhub_api/ontology/dockerhub.ttl": "263d36a1d975b161eb0e479310dc8fe5ac7c6f8977a053479d8e70707af0d858",
|
|
5
5
|
"dockerhub_api/ontology/fixtures/records.json": "cdf24bdcd53b75daef789c05f93d55ced4ce4a138360a2ff9f1e34c55f8f6da8",
|
|
6
|
-
"dockerhub_api/ontology/mappings/source.yaml": "
|
|
6
|
+
"dockerhub_api/ontology/mappings/source.yaml": "84985121b0fe97a045b04a5c40183d434d3d7ca1bca29202080cb390955545a6",
|
|
7
7
|
"dockerhub_api/ontology/migrations/manifest.json": "81a24f182615e83dc844c6e7f3a211d47705d2bfce4ee45b5c4b24134e64909f",
|
|
8
8
|
"dockerhub_api/ontology/shapes/connector.shacl.ttl": "d42f68bb302d9a9e48fb3687b106416583661c5ac07c8aa7f35ed1622dcdae76"
|
|
9
9
|
},
|
|
@@ -15,11 +15,11 @@
|
|
|
15
15
|
"synthetic_fixture_contract": "passed"
|
|
16
16
|
},
|
|
17
17
|
"compatibility": {
|
|
18
|
-
"
|
|
18
|
+
"agent_utilities": ">=2.5.0,<3",
|
|
19
19
|
"bundle_schema": "2",
|
|
20
20
|
"epistemic_graph": ">=2.27.0,<3"
|
|
21
21
|
},
|
|
22
|
-
"connector": "dockerhub-
|
|
22
|
+
"connector": "dockerhub-api",
|
|
23
23
|
"kind": "ConnectorSourceAttestation",
|
|
24
24
|
"live_certified": false,
|
|
25
25
|
"mode": "offline-source",
|
|
@@ -29,5 +29,5 @@
|
|
|
29
29
|
"signer": "UNSIGNED-PREVIEW",
|
|
30
30
|
"signing_public_key": "",
|
|
31
31
|
"status": "source-validated",
|
|
32
|
-
"validated_at": "2026-
|
|
32
|
+
"validated_at": "2026-10-26T16:04:54Z"
|
|
33
33
|
}
|
|
@@ -0,0 +1,110 @@
|
|
|
1
|
+
---
|
|
2
|
+
name: dockerhub-api-development
|
|
3
|
+
skill_type: skill
|
|
4
|
+
description: >-
|
|
5
|
+
Develop, test, and publish the dockerhub-api connector without breaking its
|
|
6
|
+
typed Docker Hub API contract, packaged content, spec delivery dashboard, or
|
|
7
|
+
governed Pages workflow. Use when changing connector code, docs, skills,
|
|
8
|
+
workflows, or repository-owned specs.
|
|
9
|
+
license: MIT
|
|
10
|
+
tags: [dockerhub, connector, development, testing, pages, specs]
|
|
11
|
+
metadata:
|
|
12
|
+
author: Genius
|
|
13
|
+
version: '0.1.0'
|
|
14
|
+
---
|
|
15
|
+
# Docker Hub API Development
|
|
16
|
+
|
|
17
|
+
Use this skill for changes inside the dockerhub-api package. The connector
|
|
18
|
+
exposes Docker Hub management, registry, Scout, and knowledge-graph operations
|
|
19
|
+
through typed HTTP clients, action-routed MCP tools, an A2A agent, and packaged
|
|
20
|
+
resource content. Keep those surfaces aligned when a change crosses a boundary.
|
|
21
|
+
|
|
22
|
+
## Repository map
|
|
23
|
+
|
|
24
|
+
- dockerhub_api/api/ contains domain client mixins composed into the Api facade.
|
|
25
|
+
- dockerhub_api/auth.py owns JWT minting, caching, refresh, and client setup.
|
|
26
|
+
- dockerhub_api/mcp/ registers domain tools and keeps actions routed through the
|
|
27
|
+
corresponding client method.
|
|
28
|
+
- dockerhub_api/skills/, prompts/, ontology/, and connectors/ are packaged
|
|
29
|
+
resources exposed by the connector entry point.
|
|
30
|
+
- specs/connector-content/ and specs/connector-identity/ are the source
|
|
31
|
+
specifications; their status.json files are generated evidence, never hand
|
|
32
|
+
edited.
|
|
33
|
+
|
|
34
|
+
## Before editing
|
|
35
|
+
|
|
36
|
+
1. Work from a real worktree based on the repository's current origin/main.
|
|
37
|
+
2. Find the owning row under specs/ before adding behavior, and preserve the
|
|
38
|
+
existing CONCEPT: registry when a domain capability is involved.
|
|
39
|
+
3. Trace a changed action from its Pydantic input model through the MCP router,
|
|
40
|
+
client mixin, auth lifecycle, and response envelope. Do not duplicate an
|
|
41
|
+
existing HTTP path.
|
|
42
|
+
4. Keep credentials and external Docker Hub calls out of tests; extend the
|
|
43
|
+
existing MockHub transport and assert the request and redacted result.
|
|
44
|
+
|
|
45
|
+
## Implementation contract
|
|
46
|
+
|
|
47
|
+
- Preserve the dockerhub-mcp connector name and the uniform
|
|
48
|
+
status_code/data/rate_limit response envelope.
|
|
49
|
+
- Keep destructive operations behind DockerHubApiBase._guard_destructive and
|
|
50
|
+
never persist or return bearer tokens except the documented one-time create
|
|
51
|
+
response.
|
|
52
|
+
- Use Pydantic input and response models, action-routed tools, and the shared
|
|
53
|
+
agent-utilities server/agent factories.
|
|
54
|
+
- Add or update a focused test when behavior changes. Cover invalid action or
|
|
55
|
+
parameters and the successful response shape.
|
|
56
|
+
- Keep all package resources under the existing package-data globs so an sdist
|
|
57
|
+
and wheel expose the same skills, prompts, ontology, agent data, and
|
|
58
|
+
connector manifest.
|
|
59
|
+
|
|
60
|
+
## Rapid delivery: the 5-minute contract
|
|
61
|
+
|
|
62
|
+
Specs are already designed. Deliver one small, reviewable change at a time.
|
|
63
|
+
|
|
64
|
+
- Start with one owning requirement and state its proof before editing.
|
|
65
|
+
- Keep a slice to one connector concern: source code, one test seam, one
|
|
66
|
+
workflow/configuration repair, or one substantive skill.
|
|
67
|
+
- Run the smallest relevant tests first, then the repository pre-commit suite
|
|
68
|
+
on the candidate worktree. Fix warnings and failures rather than bypassing a
|
|
69
|
+
hook.
|
|
70
|
+
- Record the exact source and test commands in the commit or review handoff.
|
|
71
|
+
- Never claim a Pages or spec row from a YAML marker alone: the dashboard config,
|
|
72
|
+
generated status records, successful exact-source workflow, and published
|
|
73
|
+
page must agree.
|
|
74
|
+
- Commit only reviewed paths with an explicit path list. Never stage a whole
|
|
75
|
+
shared checkout, credentials, caches, generated logs, or temporary output.
|
|
76
|
+
|
|
77
|
+
## Spec delivery and Pages
|
|
78
|
+
|
|
79
|
+
The canonical Pages caller is .github/workflows/pages.yml. This repository uses
|
|
80
|
+
the docs/ content source, so the caller must pass content_source: docs, enable
|
|
81
|
+
spec_dashboard_enabled, and point spec_dashboard_config at
|
|
82
|
+
.github/spec-dashboard.json. The push path set must include specs/**, the
|
|
83
|
+
dashboard config, and the Pages workflow itself in addition to documentation
|
|
84
|
+
paths. Keep the config versioned and bounded to specs/*/status.json; the
|
|
85
|
+
central renderer owns the HTML layout.
|
|
86
|
+
|
|
87
|
+
Regenerate status evidence with the pipeline hook when a spec changes, inspect
|
|
88
|
+
the resulting diff, and verify that no status row was advanced without a real
|
|
89
|
+
implementation or test receipt. The Pages proof is complete only after the
|
|
90
|
+
published run uses the candidate commit and /spec-delivery/ serves the
|
|
91
|
+
candidate snapshot.
|
|
92
|
+
|
|
93
|
+
## Verification
|
|
94
|
+
|
|
95
|
+
From the repository root:
|
|
96
|
+
|
|
97
|
+
pre-commit run --all-files
|
|
98
|
+
python -m pytest tests -q
|
|
99
|
+
|
|
100
|
+
Prefer focused tests for the touched module while iterating. For Pages changes,
|
|
101
|
+
also run the central dashboard renderer against a task-local output directory
|
|
102
|
+
and verify the config parses, status files are discovered, and the result
|
|
103
|
+
contains the connector content and identity records.
|
|
104
|
+
|
|
105
|
+
## Safety
|
|
106
|
+
|
|
107
|
+
Never commit .env files, tokens, raw Docker Hub identifiers, or generated site
|
|
108
|
+
output. Never make live Docker Hub calls from tests. Preserve destructive
|
|
109
|
+
gating and secret redaction. If a dependency or packaged metadata change is
|
|
110
|
+
necessary, update the lockfile in the same slice and explain why in the review.
|
|
@@ -1,8 +1,8 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: dockerhub-api
|
|
3
|
-
Version: 1.3.
|
|
3
|
+
Version: 1.3.7
|
|
4
4
|
Summary: Docker Hub API + MCP Server
|
|
5
|
-
Author-email:
|
|
5
|
+
Author-email: Repository Maintainers <maintainers@knuckles.team>
|
|
6
6
|
License: MIT
|
|
7
7
|
Classifier: Development Status :: 5 - Production/Stable
|
|
8
8
|
Classifier: License :: OSI Approved :: MIT License
|
|
@@ -12,13 +12,9 @@ Classifier: Programming Language :: Python :: 3
|
|
|
12
12
|
Requires-Python: <3.15,>=3.12
|
|
13
13
|
Description-Content-Type: text/markdown
|
|
14
14
|
License-File: LICENSE
|
|
15
|
-
Requires-Dist: agent-connector-sdk[mcp]<
|
|
15
|
+
Requires-Dist: agent-connector-sdk[mcp]<0.6.0,>=0.5.4
|
|
16
16
|
Requires-Dist: httpx>=0.28.1
|
|
17
17
|
Requires-Dist: python-dotenv>=1.2.4
|
|
18
|
-
Provides-Extra: mcp
|
|
19
|
-
Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.4.1; extra == "mcp"
|
|
20
|
-
Provides-Extra: all
|
|
21
|
-
Requires-Dist: dockerhub-api[mcp]>=1.0.1; extra == "all"
|
|
22
18
|
Provides-Extra: test
|
|
23
19
|
Requires-Dist: pytest-xdist>=3.8.0; extra == "test"
|
|
24
20
|
Requires-Dist: pytest>=9.1.1; extra == "test"
|
|
@@ -41,8 +37,6 @@ Dynamic: license-file
|
|
|
41
37
|

|
|
42
38
|

|
|
43
39
|
|
|
44
|
-
*Version: 1.3.4*
|
|
45
|
-
|
|
46
40
|
> **Documentation** — Installation, deployment, usage across the API, CLI, and MCP
|
|
47
41
|
> Docker Hub platform are maintained in [docs/](docs/index.md).
|
|
48
42
|
|
|
@@ -1,8 +1,6 @@
|
|
|
1
1
|
LICENSE
|
|
2
|
-
MANIFEST.in
|
|
3
2
|
README.md
|
|
4
3
|
pyproject.toml
|
|
5
|
-
requirements.txt
|
|
6
4
|
dockerhub_api/__init__.py
|
|
7
5
|
dockerhub_api/__main__.py
|
|
8
6
|
dockerhub_api/api_client.py
|
|
@@ -32,7 +30,6 @@ dockerhub_api/api/api_client_registry_base.py
|
|
|
32
30
|
dockerhub_api/api/api_client_repositories.py
|
|
33
31
|
dockerhub_api/api/api_client_scim.py
|
|
34
32
|
dockerhub_api/api/api_client_scout.py
|
|
35
|
-
dockerhub_api/connectors/__init__.py
|
|
36
33
|
dockerhub_api/mcp/__init__.py
|
|
37
34
|
dockerhub_api/mcp/mcp_admin.py
|
|
38
35
|
dockerhub_api/mcp/mcp_audit.py
|
|
@@ -51,8 +48,7 @@ dockerhub_api/ontology/fixtures/records.json
|
|
|
51
48
|
dockerhub_api/ontology/mappings/source.yaml
|
|
52
49
|
dockerhub_api/ontology/migrations/manifest.json
|
|
53
50
|
dockerhub_api/ontology/shapes/connector.shacl.ttl
|
|
54
|
-
dockerhub_api/
|
|
55
|
-
dockerhub_api/skills/__init__.py
|
|
51
|
+
dockerhub_api/skills/dockerhub-api-development/SKILL.md
|
|
56
52
|
dockerhub_api/skills/dockerhub-api-operations/SKILL.md
|
|
57
53
|
dockerhub_api/skills/dockerhub-api-operations/agents/openai.yaml
|
|
58
54
|
dockerhub_api/skills/dockerhub-api-operations/references/catalog.md
|
|
@@ -72,7 +68,6 @@ tests/test_api_teams.py
|
|
|
72
68
|
tests/test_api_tokens.py
|
|
73
69
|
tests/test_api_wrapper.py
|
|
74
70
|
tests/test_auth.py
|
|
75
|
-
tests/test_default_content_surfaces.py
|
|
76
71
|
tests/test_dockerhub_a2a_validation.py
|
|
77
72
|
tests/test_dockerhub_mcp_validation.py
|
|
78
73
|
tests/test_fleet_name.py
|
|
@@ -4,37 +4,29 @@ build-backend = "setuptools.build_meta"
|
|
|
4
4
|
|
|
5
5
|
[project]
|
|
6
6
|
name = "dockerhub-api"
|
|
7
|
-
version = "1.3.
|
|
7
|
+
version = "1.3.7"
|
|
8
8
|
description = "Docker Hub API + MCP Server"
|
|
9
9
|
readme = "README.md"
|
|
10
10
|
classifiers = [ "Development Status :: 5 - Production/Stable", "License :: OSI Approved :: MIT License", "Environment :: Console", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3",]
|
|
11
11
|
requires-python = ">=3.12, <3.15"
|
|
12
|
-
dependencies = [ "agent-connector-sdk[mcp]>=0.4
|
|
12
|
+
dependencies = [ "agent-connector-sdk[mcp]>=0.5.4,<0.6.0", "httpx>=0.28.1", "python-dotenv>=1.2.4",]
|
|
13
13
|
[[project.authors]]
|
|
14
|
-
name = "
|
|
15
|
-
email = "maintainers@
|
|
14
|
+
name = "Repository Maintainers"
|
|
15
|
+
email = "maintainers@knuckles.team"
|
|
16
16
|
|
|
17
17
|
[project.license]
|
|
18
18
|
text = "MIT"
|
|
19
19
|
|
|
20
20
|
[project.optional-dependencies]
|
|
21
|
-
mcp = [ "agent-connector-sdk[mcp]>=0.4.1,<1.0.0",]
|
|
22
|
-
all = [ "dockerhub-api[mcp]>=1.0.1",]
|
|
23
21
|
test = [
|
|
24
22
|
"pytest-xdist>=3.8.0", "pytest>=9.1.1", "pytest-asyncio>=1.4.0", "pytest-cov>=7.1.0",]
|
|
25
23
|
|
|
26
24
|
[project.scripts]
|
|
27
|
-
dockerhub-mcp = "
|
|
28
|
-
|
|
29
|
-
[project.entry-points."agent_connector_sdk.skill_providers"]
|
|
30
|
-
dockerhub-api = "dockerhub_api.skills"
|
|
31
|
-
|
|
32
|
-
[project.entry-points."agent_connector_sdk.ontology_providers"]
|
|
33
|
-
dockerhub-api = "dockerhub_api.ontology"
|
|
25
|
+
dockerhub-mcp = "agent_connector_sdk.cli:serve"
|
|
34
26
|
|
|
35
27
|
# The one declared connector identity: the fleet name (SDK-CONNECTOR-CONTROL-R071).
|
|
36
28
|
[project.entry-points."agent_connector_sdk.connector"]
|
|
37
|
-
dockerhub-mcp = "dockerhub_api"
|
|
29
|
+
dockerhub-mcp = "dockerhub_api:connector"
|
|
38
30
|
|
|
39
31
|
[tool.uv.workspace]
|
|
40
32
|
members = ["."]
|
|
@@ -48,6 +40,7 @@ override-dependencies = [
|
|
|
48
40
|
]
|
|
49
41
|
|
|
50
42
|
[tool.ruff]
|
|
43
|
+
extend-exclude = ["tests", "scripts"]
|
|
51
44
|
line-length = 88
|
|
52
45
|
target-version = "py312"
|
|
53
46
|
|
|
@@ -77,3 +70,10 @@ ignore_names = ["request", "config", "cls", "exc_info"]
|
|
|
77
70
|
|
|
78
71
|
[tool.pipelines_hooks.ste]
|
|
79
72
|
exempt = ["specs/*", "specs/**/*"]
|
|
73
|
+
|
|
74
|
+
[tool.pipelines.container]
|
|
75
|
+
debug_apt = ["default-jre", "ripgrep", "tree", "fd-find", "curl", "nano", "build-essential", "cmake", "libssl-dev", "libcurl4-openssl-dev", "pkg-config", "cargo", "rustc"]
|
|
76
|
+
install_extras = {"mcp" = []}
|
|
77
|
+
|
|
78
|
+
[tool.pipelines.codespell]
|
|
79
|
+
ignore_words = ["nd"]
|
|
@@ -50,9 +50,9 @@ def mcp_instance(hub, registry, scout, monkeypatch):
|
|
|
50
50
|
hub_auth_module, "get_scout_client", lambda **_k: make_scout_api(scout)
|
|
51
51
|
)
|
|
52
52
|
monkeypatch.setattr(sys, "argv", ["dockerhub-mcp"])
|
|
53
|
-
from
|
|
53
|
+
from agent_connector_sdk.connector import build_server
|
|
54
54
|
|
|
55
|
-
|
|
55
|
+
_, mcp = build_server("dockerhub_api", command_args=[])
|
|
56
56
|
return mcp
|
|
57
57
|
|
|
58
58
|
|
|
@@ -35,7 +35,7 @@ def _call_connectors(path: Path) -> list[str]:
|
|
|
35
35
|
def test_connector_name_is_the_fleet_name() -> None:
|
|
36
36
|
pyproject = tomllib.loads((ROOT / "pyproject.toml").read_text(encoding="utf-8"))
|
|
37
37
|
assert pyproject["project"]["entry-points"]["agent_connector_sdk.connector"] == {
|
|
38
|
-
FLEET: "dockerhub_api"
|
|
38
|
+
FLEET: "dockerhub_api:connector"
|
|
39
39
|
}
|
|
40
40
|
assert connector_name("dockerhub_api") == FLEET
|
|
41
41
|
for module in sorted(PACKAGE.glob("*.py")):
|
dockerhub_api-1.3.4/MANIFEST.in
DELETED