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.
Files changed (92) hide show
  1. {dockerhub_api-1.3.4/dockerhub_api.egg-info → dockerhub_api-1.3.7}/PKG-INFO +3 -9
  2. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/README.md +0 -2
  3. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/__init__.py +33 -0
  4. dockerhub_api-1.3.7/dockerhub_api/__main__.py +4 -0
  5. dockerhub_api-1.3.7/dockerhub_api/connector_sources.py +116 -0
  6. dockerhub_api-1.3.7/dockerhub_api/mcp_server.py +44 -0
  7. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/certification.json +6 -6
  8. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/mappings/source.yaml +1 -1
  9. dockerhub_api-1.3.7/dockerhub_api/skills/dockerhub-api-development/SKILL.md +110 -0
  10. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7/dockerhub_api.egg-info}/PKG-INFO +3 -9
  11. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api.egg-info/SOURCES.txt +1 -6
  12. dockerhub_api-1.3.7/dockerhub_api.egg-info/entry_points.txt +5 -0
  13. dockerhub_api-1.3.7/dockerhub_api.egg-info/requires.txt +9 -0
  14. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/pyproject.toml +14 -14
  15. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_dockerhub_mcp_validation.py +2 -2
  16. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_fleet_name.py +1 -1
  17. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_init_dynamics.py +0 -2
  18. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_startup.py +0 -2
  19. dockerhub_api-1.3.4/MANIFEST.in +0 -4
  20. dockerhub_api-1.3.4/dockerhub_api/__main__.py +0 -4
  21. dockerhub_api-1.3.4/dockerhub_api/connector_sources.py +0 -192
  22. dockerhub_api-1.3.4/dockerhub_api/connectors/__init__.py +0 -0
  23. dockerhub_api-1.3.4/dockerhub_api/mcp_server.py +0 -121
  24. dockerhub_api-1.3.4/dockerhub_api/prompts/__init__.py +0 -0
  25. dockerhub_api-1.3.4/dockerhub_api/skills/__init__.py +0 -0
  26. dockerhub_api-1.3.4/dockerhub_api.egg-info/entry_points.txt +0 -11
  27. dockerhub_api-1.3.4/dockerhub_api.egg-info/requires.txt +0 -15
  28. dockerhub_api-1.3.4/requirements.txt +0 -3
  29. dockerhub_api-1.3.4/tests/test_default_content_surfaces.py +0 -43
  30. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/LICENSE +0 -0
  31. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/__init__.py +0 -0
  32. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_access_tokens.py +0 -0
  33. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_audit_logs.py +0 -0
  34. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_auth.py +0 -0
  35. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_base.py +0 -0
  36. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_groups.py +0 -0
  37. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_org_access_tokens.py +0 -0
  38. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_orgs.py +0 -0
  39. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_registry.py +0 -0
  40. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_registry_base.py +0 -0
  41. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_repositories.py +0 -0
  42. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_scim.py +0 -0
  43. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api/api_client_scout.py +0 -0
  44. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/api_client.py +0 -0
  45. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/auth.py +1 -1
  46. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/dockerhub_input_models.py +0 -0
  47. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/dockerhub_response_models.py +0 -0
  48. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/kg_ingest.py +0 -0
  49. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/__init__.py +0 -0
  50. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_admin.py +0 -0
  51. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_audit.py +0 -0
  52. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_auth.py +0 -0
  53. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_kg.py +0 -0
  54. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_org.py +0 -0
  55. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_registry.py +0 -0
  56. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_repos.py +0 -0
  57. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_scim.py +0 -0
  58. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_scout.py +0 -0
  59. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp/mcp_teams.py +0 -0
  60. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/mcp_config.json +0 -0
  61. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/__init__.py +0 -0
  62. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/dockerhub.ttl +0 -0
  63. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/fixtures/records.json +0 -0
  64. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/migrations/manifest.json +0 -0
  65. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/ontology/shapes/connector.shacl.ttl +0 -0
  66. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-api-operations/SKILL.md +0 -0
  67. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-api-operations/agents/openai.yaml +0 -0
  68. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-api-operations/references/catalog.md +0 -0
  69. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-image-registry-scout/SKILL.md +0 -0
  70. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-image-registry-scout/WORKFLOW.md +0 -0
  71. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-org-administration/SKILL.md +0 -0
  72. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-org-administration/WORKFLOW.md +0 -0
  73. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-repository-management/SKILL.md +0 -0
  74. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api/skills/dockerhub-repository-management/WORKFLOW.md +0 -0
  75. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api.egg-info/dependency_links.txt +0 -0
  76. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/dockerhub_api.egg-info/top_level.txt +0 -0
  77. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/setup.cfg +0 -0
  78. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_audit.py +0 -0
  79. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_org.py +0 -0
  80. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_registry.py +0 -0
  81. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_repositories.py +0 -0
  82. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_scim.py +0 -0
  83. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_scout.py +0 -0
  84. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_teams.py +0 -0
  85. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_tokens.py +0 -0
  86. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_api_wrapper.py +0 -0
  87. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_auth.py +0 -0
  88. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_dockerhub_a2a_validation.py +0 -0
  89. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_identity_namespace_scoping.py +0 -0
  90. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_kg_ingest.py +0 -0
  91. {dockerhub_api-1.3.4 → dockerhub_api-1.3.7}/tests/test_models.py +0 -0
  92. {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.4
3
+ Version: 1.3.7
4
4
  Summary: Docker Hub API + MCP Server
5
- Author-email: Project Maintainers <maintainers@users.noreply.github.com>
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]<1.0.0,>=0.4.1
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
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/dockerhub-api)
42
38
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/dockerhub-api)
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
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/dockerhub-api)
14
14
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/dockerhub-api)
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,4 @@
1
+ from agent_connector_sdk import run
2
+
3
+ if __name__ == "__main__":
4
+ run()
@@ -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": "arbora.io/v1",
2
+ "api_version": "graphos.io/v1",
3
3
  "artifacts": {
4
- "dockerhub_api/ontology/dockerhub.ttl": "bd3f4498e3e9463ee4395a5da1d6afcbfc081a1437e1be52437ab4d52e18d55a",
4
+ "dockerhub_api/ontology/dockerhub.ttl": "263d36a1d975b161eb0e479310dc8fe5ac7c6f8977a053479d8e70707af0d858",
5
5
  "dockerhub_api/ontology/fixtures/records.json": "cdf24bdcd53b75daef789c05f93d55ced4ce4a138360a2ff9f1e34c55f8f6da8",
6
- "dockerhub_api/ontology/mappings/source.yaml": "72d333a63cb808bbc9a2f031834fa4c75919b11a8171ad5b347fad61247fa016",
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
- "agent_connector_sdk": ">=2.5.0,<3",
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-mcp",
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-08-26T13:42:55Z"
32
+ "validated_at": "2026-10-26T16:04:54Z"
33
33
  }
@@ -1,5 +1,5 @@
1
1
  schema_version: '1'
2
- connector: dockerhub-api
2
+ connector: dockerhub-mcp
3
3
  ontology_source: dockerhub
4
4
  sync:
5
5
  - preset: dockerhub-repositories
@@ -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.4
3
+ Version: 1.3.7
4
4
  Summary: Docker Hub API + MCP Server
5
- Author-email: Project Maintainers <maintainers@users.noreply.github.com>
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]<1.0.0,>=0.4.1
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
  ![PyPI - Wheel](https://img.shields.io/pypi/wheel/dockerhub-api)
42
38
  ![PyPI - Implementation](https://img.shields.io/pypi/implementation/dockerhub-api)
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/prompts/__init__.py
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
@@ -0,0 +1,5 @@
1
+ [agent_connector_sdk.connector]
2
+ dockerhub-mcp = dockerhub_api:connector
3
+
4
+ [console_scripts]
5
+ dockerhub-mcp = agent_connector_sdk.cli:serve
@@ -0,0 +1,9 @@
1
+ agent-connector-sdk[mcp]<0.6.0,>=0.5.4
2
+ httpx>=0.28.1
3
+ python-dotenv>=1.2.4
4
+
5
+ [test]
6
+ pytest-xdist>=3.8.0
7
+ pytest>=9.1.1
8
+ pytest-asyncio>=1.4.0
9
+ pytest-cov>=7.1.0
@@ -4,37 +4,29 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "dockerhub-api"
7
- version = "1.3.4"
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.1,<1.0.0", "httpx>=0.28.1", "python-dotenv>=1.2.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 = "Project Maintainers"
15
- email = "maintainers@users.noreply.github.com"
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 = "dockerhub_api.mcp_server:mcp_server"
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 dockerhub_api.mcp_server import get_mcp_instance
53
+ from agent_connector_sdk.connector import build_server
54
54
 
55
- mcp, _args, _middlewares, registered = get_mcp_instance()
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")):
@@ -13,5 +13,3 @@ def test_core_symbols_exposed():
13
13
  for symbol in ("Api", "get_client", "TokenManager"):
14
14
  assert symbol in module.__all__
15
15
  assert hasattr(module, symbol)
16
-
17
-
@@ -22,5 +22,3 @@ def test_mcp_server_help():
22
22
  timeout=120,
23
23
  )
24
24
  assert result.returncode == 0
25
-
26
-
@@ -1,4 +0,0 @@
1
- include LICENSE
2
- include README.md
3
- include requirements.txt
4
- recursive-include dockerhub_api *.py *.json *.md *.yaml *.yml
@@ -1,4 +0,0 @@
1
- from dockerhub_api.mcp_server import mcp_server
2
-
3
- if __name__ == "__main__":
4
- mcp_server()