adcp 2.18.0__py3-none-any.whl → 3.0.0__py3-none-any.whl

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 (245) hide show
  1. adcp/ADCP_VERSION +1 -1
  2. adcp/__init__.py +6 -14
  3. adcp/__main__.py +94 -51
  4. adcp/adagents.py +91 -19
  5. adcp/client.py +865 -0
  6. adcp/protocols/a2a.py +84 -0
  7. adcp/protocols/base.py +101 -0
  8. adcp/protocols/mcp.py +87 -1
  9. adcp/server/__init__.py +49 -0
  10. adcp/server/base.py +368 -0
  11. adcp/server/content_standards.py +561 -0
  12. adcp/server/governance.py +491 -0
  13. adcp/server/mcp_tools.py +471 -0
  14. adcp/server/proposal.py +334 -0
  15. adcp/server/sponsored_intelligence.py +444 -0
  16. adcp/types/__init__.py +111 -23
  17. adcp/types/_ergonomic.py +35 -18
  18. adcp/types/_generated.py +419 -44
  19. adcp/types/aliases.py +13 -20
  20. adcp/types/base.py +1 -1
  21. adcp/types/generated_poc/adagents.py +103 -6
  22. adcp/types/generated_poc/content_standards/__init__.py +3 -0
  23. adcp/types/generated_poc/content_standards/artifact.py +208 -0
  24. adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
  25. adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
  26. adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
  27. adcp/types/generated_poc/content_standards/content_standards.py +66 -0
  28. adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
  29. adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
  30. adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
  31. adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
  32. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
  33. adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
  34. adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
  35. adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
  36. adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
  37. adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
  38. adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
  39. adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
  40. adcp/types/generated_poc/core/activation_key.py +1 -1
  41. adcp/types/generated_poc/core/assets/audio_asset.py +1 -1
  42. adcp/types/generated_poc/core/assets/css_asset.py +1 -1
  43. adcp/types/generated_poc/core/assets/daast_asset.py +1 -1
  44. adcp/types/generated_poc/core/assets/html_asset.py +1 -1
  45. adcp/types/generated_poc/core/assets/image_asset.py +1 -1
  46. adcp/types/generated_poc/core/assets/javascript_asset.py +1 -1
  47. adcp/types/generated_poc/core/assets/text_asset.py +1 -1
  48. adcp/types/generated_poc/core/assets/url_asset.py +1 -1
  49. adcp/types/generated_poc/core/assets/vast_asset.py +1 -1
  50. adcp/types/generated_poc/core/assets/video_asset.py +1 -1
  51. adcp/types/generated_poc/core/assets/webhook_asset.py +1 -1
  52. adcp/types/generated_poc/core/async_response_data.py +1 -1
  53. adcp/types/generated_poc/core/brand_manifest.py +68 -5
  54. adcp/types/generated_poc/core/brand_manifest_ref.py +1 -1
  55. adcp/types/generated_poc/core/context.py +1 -1
  56. adcp/types/generated_poc/core/creative_asset.py +8 -7
  57. adcp/types/generated_poc/core/creative_assignment.py +1 -1
  58. adcp/types/generated_poc/core/creative_filters.py +4 -14
  59. adcp/types/generated_poc/core/creative_manifest.py +1 -1
  60. adcp/types/generated_poc/core/creative_policy.py +1 -1
  61. adcp/types/generated_poc/core/delivery_metrics.py +1 -1
  62. adcp/types/generated_poc/core/deployment.py +1 -1
  63. adcp/types/generated_poc/core/destination.py +1 -1
  64. adcp/types/generated_poc/core/error.py +1 -1
  65. adcp/types/generated_poc/core/ext.py +1 -1
  66. adcp/types/generated_poc/core/format.py +6 -5
  67. adcp/types/generated_poc/core/format_id.py +1 -1
  68. adcp/types/generated_poc/core/frequency_cap.py +1 -1
  69. adcp/types/generated_poc/core/identifier.py +27 -0
  70. adcp/types/generated_poc/core/mcp_webhook_payload.py +1 -1
  71. adcp/types/generated_poc/core/measurement.py +1 -1
  72. adcp/types/generated_poc/core/media_buy.py +1 -1
  73. adcp/types/generated_poc/core/media_buy_features.py +29 -0
  74. adcp/types/generated_poc/core/offering.py +80 -0
  75. adcp/types/generated_poc/core/package.py +1 -1
  76. adcp/types/generated_poc/core/performance_feedback.py +1 -1
  77. adcp/types/generated_poc/core/placement.py +1 -1
  78. adcp/types/generated_poc/core/pricing_option.py +8 -14
  79. adcp/types/generated_poc/core/product.py +1 -1
  80. adcp/types/generated_poc/core/product_allocation.py +48 -0
  81. adcp/types/generated_poc/core/product_filters.py +72 -7
  82. adcp/types/generated_poc/core/promoted_offerings.py +12 -21
  83. adcp/types/generated_poc/core/promoted_products.py +1 -1
  84. adcp/types/generated_poc/core/property.py +1 -1
  85. adcp/types/generated_poc/core/property_id.py +1 -1
  86. adcp/types/generated_poc/core/property_list_ref.py +26 -0
  87. adcp/types/generated_poc/core/property_tag.py +1 -1
  88. adcp/types/generated_poc/core/proposal.py +64 -0
  89. adcp/types/generated_poc/core/protocol_envelope.py +1 -1
  90. adcp/types/generated_poc/core/publisher_property_selector.py +1 -1
  91. adcp/types/generated_poc/core/push_notification_config.py +1 -1
  92. adcp/types/generated_poc/core/reporting_capabilities.py +1 -1
  93. adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  94. adcp/types/generated_poc/core/response.py +1 -1
  95. adcp/types/generated_poc/core/signal_filters.py +1 -1
  96. adcp/types/generated_poc/core/start_timing.py +4 -4
  97. adcp/types/generated_poc/core/sub_asset.py +1 -1
  98. adcp/types/generated_poc/core/targeting.py +55 -14
  99. adcp/types/generated_poc/creative/list_creative_formats_request.py +1 -1
  100. adcp/types/generated_poc/creative/list_creative_formats_response.py +1 -1
  101. adcp/types/generated_poc/creative/preview_creative_request.py +1 -1
  102. adcp/types/generated_poc/creative/preview_creative_response.py +3 -2
  103. adcp/types/generated_poc/creative/preview_render.py +1 -1
  104. adcp/types/generated_poc/enums/adcp_domain.py +3 -1
  105. adcp/types/generated_poc/enums/asset_content_type.py +1 -1
  106. adcp/types/generated_poc/enums/auth_scheme.py +1 -1
  107. adcp/types/generated_poc/enums/available_metric.py +1 -1
  108. adcp/types/generated_poc/enums/channels.py +18 -8
  109. adcp/types/generated_poc/enums/co_branding_requirement.py +1 -1
  110. adcp/types/generated_poc/enums/creative_action.py +1 -1
  111. adcp/types/generated_poc/enums/creative_agent_capability.py +1 -1
  112. adcp/types/generated_poc/enums/creative_sort_field.py +1 -1
  113. adcp/types/generated_poc/enums/creative_status.py +2 -1
  114. adcp/types/generated_poc/enums/daast_tracking_event.py +1 -1
  115. adcp/types/generated_poc/enums/daast_version.py +1 -1
  116. adcp/types/generated_poc/enums/delivery_type.py +1 -1
  117. adcp/types/generated_poc/enums/dimension_unit.py +1 -1
  118. adcp/types/generated_poc/enums/feed_format.py +1 -1
  119. adcp/types/generated_poc/enums/feedback_source.py +1 -1
  120. adcp/types/generated_poc/enums/format_category.py +1 -1
  121. adcp/types/generated_poc/enums/format_id_parameter.py +1 -1
  122. adcp/types/generated_poc/enums/frequency_cap_scope.py +1 -1
  123. adcp/types/generated_poc/enums/geo_level.py +14 -0
  124. adcp/types/generated_poc/enums/history_entry_type.py +1 -1
  125. adcp/types/generated_poc/enums/http_method.py +1 -1
  126. adcp/types/generated_poc/enums/identifier_types.py +1 -1
  127. adcp/types/generated_poc/enums/javascript_module_type.py +1 -1
  128. adcp/types/generated_poc/enums/landing_page_requirement.py +1 -1
  129. adcp/types/generated_poc/enums/markdown_flavor.py +1 -1
  130. adcp/types/generated_poc/enums/media_buy_status.py +1 -1
  131. adcp/types/generated_poc/enums/metric_type.py +1 -1
  132. adcp/types/generated_poc/enums/metro_system.py +15 -0
  133. adcp/types/generated_poc/enums/notification_type.py +1 -1
  134. adcp/types/generated_poc/enums/pacing.py +1 -1
  135. adcp/types/generated_poc/enums/postal_system.py +19 -0
  136. adcp/types/generated_poc/enums/preview_output_format.py +1 -1
  137. adcp/types/generated_poc/enums/pricing_model.py +1 -1
  138. adcp/types/generated_poc/enums/property_type.py +2 -1
  139. adcp/types/generated_poc/enums/publisher_identifier_types.py +1 -1
  140. adcp/types/generated_poc/enums/reporting_frequency.py +1 -1
  141. adcp/types/generated_poc/enums/signal_catalog_type.py +1 -1
  142. adcp/types/generated_poc/enums/sort_direction.py +1 -1
  143. adcp/types/generated_poc/enums/task_status.py +1 -1
  144. adcp/types/generated_poc/enums/task_type.py +7 -1
  145. adcp/types/generated_poc/enums/update_frequency.py +1 -1
  146. adcp/types/generated_poc/enums/url_asset_type.py +1 -1
  147. adcp/types/generated_poc/enums/validation_mode.py +1 -1
  148. adcp/types/generated_poc/enums/vast_tracking_event.py +1 -1
  149. adcp/types/generated_poc/enums/vast_version.py +1 -1
  150. adcp/types/generated_poc/enums/webhook_response_type.py +1 -1
  151. adcp/types/generated_poc/enums/webhook_security_method.py +1 -1
  152. adcp/types/generated_poc/extensions/__init__.py +3 -0
  153. adcp/types/generated_poc/extensions/extension_meta.py +58 -0
  154. adcp/types/generated_poc/media_buy/build_creative_request.py +1 -1
  155. adcp/types/generated_poc/media_buy/build_creative_response.py +1 -1
  156. adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +1 -1
  157. adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +1 -1
  158. adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +1 -1
  159. adcp/types/generated_poc/media_buy/create_media_buy_request.py +54 -26
  160. adcp/types/generated_poc/media_buy/create_media_buy_response.py +1 -1
  161. adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +1 -1
  162. adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +1 -1
  163. adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +1 -1
  164. adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +1 -1
  165. adcp/types/generated_poc/media_buy/get_products_async_response_working.py +1 -1
  166. adcp/types/generated_poc/media_buy/get_products_request.py +18 -3
  167. adcp/types/generated_poc/media_buy/get_products_response.py +14 -2
  168. adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +1 -1
  169. adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +2 -2
  170. adcp/types/generated_poc/media_buy/list_creative_formats_request.py +1 -1
  171. adcp/types/generated_poc/media_buy/list_creative_formats_response.py +1 -1
  172. adcp/types/generated_poc/media_buy/list_creatives_request.py +2 -2
  173. adcp/types/generated_poc/media_buy/list_creatives_response.py +7 -10
  174. adcp/types/generated_poc/media_buy/package_request.py +15 -6
  175. adcp/types/generated_poc/media_buy/package_update.py +119 -0
  176. adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +1 -1
  177. adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +1 -1
  178. adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +1 -1
  179. adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +1 -1
  180. adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +1 -1
  181. adcp/types/generated_poc/media_buy/sync_creatives_request.py +1 -1
  182. adcp/types/generated_poc/media_buy/sync_creatives_response.py +1 -1
  183. adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +1 -1
  184. adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +1 -1
  185. adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +1 -1
  186. adcp/types/generated_poc/media_buy/update_media_buy_request.py +20 -108
  187. adcp/types/generated_poc/media_buy/update_media_buy_response.py +1 -1
  188. adcp/types/generated_poc/pricing_options/cpc_option.py +35 -10
  189. adcp/types/generated_poc/pricing_options/cpcv_option.py +35 -10
  190. adcp/types/generated_poc/pricing_options/{cpm_auction_option.py → cpm_option.py} +23 -19
  191. adcp/types/generated_poc/pricing_options/cpp_option.py +39 -16
  192. adcp/types/generated_poc/pricing_options/cpv_option.py +37 -18
  193. adcp/types/generated_poc/pricing_options/flat_rate_option.py +45 -39
  194. adcp/types/generated_poc/pricing_options/{vcpm_auction_option.py → vcpm_option.py} +23 -14
  195. adcp/types/generated_poc/property/__init__.py +3 -0
  196. adcp/types/generated_poc/property/base_property_source.py +86 -0
  197. adcp/types/generated_poc/property/create_property_list_request.py +43 -0
  198. adcp/types/generated_poc/property/create_property_list_response.py +27 -0
  199. adcp/types/generated_poc/property/delete_property_list_request.py +22 -0
  200. adcp/types/generated_poc/property/delete_property_list_response.py +21 -0
  201. adcp/types/generated_poc/property/feature_requirement.py +42 -0
  202. adcp/types/generated_poc/property/get_property_list_request.py +34 -0
  203. adcp/types/generated_poc/property/get_property_list_response.py +61 -0
  204. adcp/types/generated_poc/property/list_property_lists_request.py +29 -0
  205. adcp/types/generated_poc/property/list_property_lists_response.py +39 -0
  206. adcp/types/generated_poc/property/property_error.py +33 -0
  207. adcp/types/generated_poc/property/property_feature.py +22 -0
  208. adcp/types/generated_poc/property/property_feature_definition.py +80 -0
  209. adcp/types/generated_poc/property/property_list.py +62 -0
  210. adcp/types/generated_poc/property/property_list_changed_webhook.py +51 -0
  211. adcp/types/generated_poc/property/property_list_filters.py +47 -0
  212. adcp/types/generated_poc/property/update_property_list_request.py +46 -0
  213. adcp/types/generated_poc/property/update_property_list_response.py +21 -0
  214. adcp/types/generated_poc/protocol/__init__.py +3 -0
  215. adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  216. adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  217. adcp/types/generated_poc/protocols/adcp_extension.py +18 -5
  218. adcp/types/generated_poc/signals/activate_signal_request.py +1 -1
  219. adcp/types/generated_poc/signals/activate_signal_response.py +1 -1
  220. adcp/types/generated_poc/signals/get_signals_request.py +1 -1
  221. adcp/types/generated_poc/signals/get_signals_response.py +1 -1
  222. adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  223. adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  224. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  225. adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  226. adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  227. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  228. adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  229. adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  230. adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  231. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  232. adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  233. adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  234. adcp/utils/format_assets.py +5 -5
  235. adcp/utils/preview_cache.py +2 -2
  236. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/METADATA +1 -1
  237. adcp-3.0.0.dist-info/RECORD +264 -0
  238. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/WHEEL +1 -1
  239. adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  240. adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  241. adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  242. adcp-2.18.0.dist-info/RECORD +0 -195
  243. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/entry_points.txt +0 -0
  244. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/licenses/LICENSE +0 -0
  245. {adcp-2.18.0.dist-info → adcp-3.0.0.dist-info}/top_level.txt +0 -0
adcp/protocols/a2a.py CHANGED
@@ -593,3 +593,87 @@ class A2AAdapter(ProtocolAdapter):
593
593
  agent_id=self.agent_config.id,
594
594
  agent_uri=self.agent_config.agent_uri,
595
595
  ) from e
596
+
597
+ # ========================================================================
598
+ # V3 Protocol Methods - Protocol Discovery
599
+ # ========================================================================
600
+
601
+ async def get_adcp_capabilities(self, params: dict[str, Any]) -> TaskResult[Any]:
602
+ """Get AdCP capabilities from the agent."""
603
+ return await self._call_a2a_tool("get_adcp_capabilities", params)
604
+
605
+ # ========================================================================
606
+ # V3 Protocol Methods - Content Standards
607
+ # ========================================================================
608
+
609
+ async def create_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
610
+ """Create content standards configuration."""
611
+ return await self._call_a2a_tool("create_content_standards", params)
612
+
613
+ async def get_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
614
+ """Get content standards configuration."""
615
+ return await self._call_a2a_tool("get_content_standards", params)
616
+
617
+ async def list_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
618
+ """List content standards configurations."""
619
+ return await self._call_a2a_tool("list_content_standards", params)
620
+
621
+ async def update_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
622
+ """Update content standards configuration."""
623
+ return await self._call_a2a_tool("update_content_standards", params)
624
+
625
+ async def calibrate_content(self, params: dict[str, Any]) -> TaskResult[Any]:
626
+ """Calibrate content against standards."""
627
+ return await self._call_a2a_tool("calibrate_content", params)
628
+
629
+ async def validate_content_delivery(self, params: dict[str, Any]) -> TaskResult[Any]:
630
+ """Validate content delivery against standards."""
631
+ return await self._call_a2a_tool("validate_content_delivery", params)
632
+
633
+ async def get_media_buy_artifacts(self, params: dict[str, Any]) -> TaskResult[Any]:
634
+ """Get artifacts associated with a media buy."""
635
+ return await self._call_a2a_tool("get_media_buy_artifacts", params)
636
+
637
+ # ========================================================================
638
+ # V3 Protocol Methods - Sponsored Intelligence
639
+ # ========================================================================
640
+
641
+ async def si_get_offering(self, params: dict[str, Any]) -> TaskResult[Any]:
642
+ """Get sponsored intelligence offering."""
643
+ return await self._call_a2a_tool("si_get_offering", params)
644
+
645
+ async def si_initiate_session(self, params: dict[str, Any]) -> TaskResult[Any]:
646
+ """Initiate sponsored intelligence session."""
647
+ return await self._call_a2a_tool("si_initiate_session", params)
648
+
649
+ async def si_send_message(self, params: dict[str, Any]) -> TaskResult[Any]:
650
+ """Send message in sponsored intelligence session."""
651
+ return await self._call_a2a_tool("si_send_message", params)
652
+
653
+ async def si_terminate_session(self, params: dict[str, Any]) -> TaskResult[Any]:
654
+ """Terminate sponsored intelligence session."""
655
+ return await self._call_a2a_tool("si_terminate_session", params)
656
+
657
+ # ========================================================================
658
+ # V3 Protocol Methods - Governance (Property Lists)
659
+ # ========================================================================
660
+
661
+ async def create_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
662
+ """Create a property list for governance."""
663
+ return await self._call_a2a_tool("create_property_list", params)
664
+
665
+ async def get_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
666
+ """Get a property list with optional resolution."""
667
+ return await self._call_a2a_tool("get_property_list", params)
668
+
669
+ async def list_property_lists(self, params: dict[str, Any]) -> TaskResult[Any]:
670
+ """List property lists."""
671
+ return await self._call_a2a_tool("list_property_lists", params)
672
+
673
+ async def update_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
674
+ """Update a property list."""
675
+ return await self._call_a2a_tool("update_property_list", params)
676
+
677
+ async def delete_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
678
+ """Delete a property list."""
679
+ return await self._call_a2a_tool("delete_property_list", params)
adcp/protocols/base.py CHANGED
@@ -188,3 +188,104 @@ class ProtocolAdapter(ABC):
188
188
  Implementations should close any open connections, clients, or other resources.
189
189
  """
190
190
  pass
191
+
192
+ # ========================================================================
193
+ # V3 Protocol Methods - Protocol Discovery
194
+ # ========================================================================
195
+
196
+ @abstractmethod
197
+ async def get_adcp_capabilities(self, params: dict[str, Any]) -> TaskResult[Any]:
198
+ """Get AdCP capabilities from the agent."""
199
+ pass
200
+
201
+ # ========================================================================
202
+ # V3 Protocol Methods - Content Standards
203
+ # ========================================================================
204
+
205
+ @abstractmethod
206
+ async def create_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
207
+ """Create content standards configuration."""
208
+ pass
209
+
210
+ @abstractmethod
211
+ async def get_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
212
+ """Get content standards configuration."""
213
+ pass
214
+
215
+ @abstractmethod
216
+ async def list_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
217
+ """List content standards configurations."""
218
+ pass
219
+
220
+ @abstractmethod
221
+ async def update_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
222
+ """Update content standards configuration."""
223
+ pass
224
+
225
+ @abstractmethod
226
+ async def calibrate_content(self, params: dict[str, Any]) -> TaskResult[Any]:
227
+ """Calibrate content against standards."""
228
+ pass
229
+
230
+ @abstractmethod
231
+ async def validate_content_delivery(self, params: dict[str, Any]) -> TaskResult[Any]:
232
+ """Validate content delivery against standards."""
233
+ pass
234
+
235
+ @abstractmethod
236
+ async def get_media_buy_artifacts(self, params: dict[str, Any]) -> TaskResult[Any]:
237
+ """Get artifacts associated with a media buy."""
238
+ pass
239
+
240
+ # ========================================================================
241
+ # V3 Protocol Methods - Sponsored Intelligence
242
+ # ========================================================================
243
+
244
+ @abstractmethod
245
+ async def si_get_offering(self, params: dict[str, Any]) -> TaskResult[Any]:
246
+ """Get sponsored intelligence offering."""
247
+ pass
248
+
249
+ @abstractmethod
250
+ async def si_initiate_session(self, params: dict[str, Any]) -> TaskResult[Any]:
251
+ """Initiate sponsored intelligence session."""
252
+ pass
253
+
254
+ @abstractmethod
255
+ async def si_send_message(self, params: dict[str, Any]) -> TaskResult[Any]:
256
+ """Send message in sponsored intelligence session."""
257
+ pass
258
+
259
+ @abstractmethod
260
+ async def si_terminate_session(self, params: dict[str, Any]) -> TaskResult[Any]:
261
+ """Terminate sponsored intelligence session."""
262
+ pass
263
+
264
+ # ========================================================================
265
+ # V3 Protocol Methods - Governance (Property Lists)
266
+ # ========================================================================
267
+
268
+ @abstractmethod
269
+ async def create_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
270
+ """Create a property list for governance."""
271
+ pass
272
+
273
+ @abstractmethod
274
+ async def get_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
275
+ """Get a property list with optional resolution."""
276
+ pass
277
+
278
+ @abstractmethod
279
+ async def list_property_lists(self, params: dict[str, Any]) -> TaskResult[Any]:
280
+ """List property lists."""
281
+ pass
282
+
283
+ @abstractmethod
284
+ async def update_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
285
+ """Update a property list."""
286
+ pass
287
+
288
+ @abstractmethod
289
+ async def delete_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
290
+ """Delete a property list."""
291
+ pass
adcp/protocols/mcp.py CHANGED
@@ -136,7 +136,9 @@ class MCPAdapter(ProtocolAdapter):
136
136
  and ("cancel scope" in exc_str or "async context" in exc_str)
137
137
  ) or (
138
138
  # HTTP errors during cleanup (if httpx is available)
139
- HTTPX_AVAILABLE and HTTPStatusError is not None and isinstance(exc, HTTPStatusError)
139
+ HTTPX_AVAILABLE
140
+ and HTTPStatusError is not None
141
+ and isinstance(exc, HTTPStatusError)
140
142
  )
141
143
 
142
144
  if is_known_cleanup_error:
@@ -515,3 +517,87 @@ class MCPAdapter(ProtocolAdapter):
515
517
  async def close(self) -> None:
516
518
  """Close the MCP session and clean up resources."""
517
519
  await self._cleanup_failed_connection("during close")
520
+
521
+ # ========================================================================
522
+ # V3 Protocol Methods - Protocol Discovery
523
+ # ========================================================================
524
+
525
+ async def get_adcp_capabilities(self, params: dict[str, Any]) -> TaskResult[Any]:
526
+ """Get AdCP capabilities from the agent."""
527
+ return await self._call_mcp_tool("get_adcp_capabilities", params)
528
+
529
+ # ========================================================================
530
+ # V3 Protocol Methods - Content Standards
531
+ # ========================================================================
532
+
533
+ async def create_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
534
+ """Create content standards configuration."""
535
+ return await self._call_mcp_tool("create_content_standards", params)
536
+
537
+ async def get_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
538
+ """Get content standards configuration."""
539
+ return await self._call_mcp_tool("get_content_standards", params)
540
+
541
+ async def list_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
542
+ """List content standards configurations."""
543
+ return await self._call_mcp_tool("list_content_standards", params)
544
+
545
+ async def update_content_standards(self, params: dict[str, Any]) -> TaskResult[Any]:
546
+ """Update content standards configuration."""
547
+ return await self._call_mcp_tool("update_content_standards", params)
548
+
549
+ async def calibrate_content(self, params: dict[str, Any]) -> TaskResult[Any]:
550
+ """Calibrate content against standards."""
551
+ return await self._call_mcp_tool("calibrate_content", params)
552
+
553
+ async def validate_content_delivery(self, params: dict[str, Any]) -> TaskResult[Any]:
554
+ """Validate content delivery against standards."""
555
+ return await self._call_mcp_tool("validate_content_delivery", params)
556
+
557
+ async def get_media_buy_artifacts(self, params: dict[str, Any]) -> TaskResult[Any]:
558
+ """Get artifacts associated with a media buy."""
559
+ return await self._call_mcp_tool("get_media_buy_artifacts", params)
560
+
561
+ # ========================================================================
562
+ # V3 Protocol Methods - Sponsored Intelligence
563
+ # ========================================================================
564
+
565
+ async def si_get_offering(self, params: dict[str, Any]) -> TaskResult[Any]:
566
+ """Get sponsored intelligence offering."""
567
+ return await self._call_mcp_tool("si_get_offering", params)
568
+
569
+ async def si_initiate_session(self, params: dict[str, Any]) -> TaskResult[Any]:
570
+ """Initiate sponsored intelligence session."""
571
+ return await self._call_mcp_tool("si_initiate_session", params)
572
+
573
+ async def si_send_message(self, params: dict[str, Any]) -> TaskResult[Any]:
574
+ """Send message in sponsored intelligence session."""
575
+ return await self._call_mcp_tool("si_send_message", params)
576
+
577
+ async def si_terminate_session(self, params: dict[str, Any]) -> TaskResult[Any]:
578
+ """Terminate sponsored intelligence session."""
579
+ return await self._call_mcp_tool("si_terminate_session", params)
580
+
581
+ # ========================================================================
582
+ # V3 Protocol Methods - Governance (Property Lists)
583
+ # ========================================================================
584
+
585
+ async def create_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
586
+ """Create a property list for governance."""
587
+ return await self._call_mcp_tool("create_property_list", params)
588
+
589
+ async def get_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
590
+ """Get a property list with optional resolution."""
591
+ return await self._call_mcp_tool("get_property_list", params)
592
+
593
+ async def list_property_lists(self, params: dict[str, Any]) -> TaskResult[Any]:
594
+ """List property lists."""
595
+ return await self._call_mcp_tool("list_property_lists", params)
596
+
597
+ async def update_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
598
+ """Update a property list."""
599
+ return await self._call_mcp_tool("update_property_list", params)
600
+
601
+ async def delete_property_list(self, params: dict[str, Any]) -> TaskResult[Any]:
602
+ """Delete a property list."""
603
+ return await self._call_mcp_tool("delete_property_list", params)
@@ -0,0 +1,49 @@
1
+ """ADCP Server Framework.
2
+
3
+ Provides base classes and adapters for building ADCP-compliant servers/agents.
4
+ Supports selective protocol implementation via protocol-specific adapters.
5
+
6
+ Examples:
7
+ # Content Standards agent (stubs media buy operations)
8
+ from adcp.server import ContentStandardsHandler, create_mcp_tools
9
+
10
+ class MyContentHandler(ContentStandardsHandler):
11
+ async def create_content_standards(self, request):
12
+ # Implement your logic
13
+ pass
14
+
15
+ # Register with MCP server
16
+ tools = create_mcp_tools(MyContentHandler())
17
+ """
18
+
19
+ from __future__ import annotations
20
+
21
+ from adcp.server.base import (
22
+ ADCPHandler,
23
+ NotImplementedResponse,
24
+ ToolContext,
25
+ not_supported,
26
+ )
27
+ from adcp.server.content_standards import ContentStandardsHandler
28
+ from adcp.server.governance import GovernanceHandler
29
+ from adcp.server.mcp_tools import MCPToolSet, create_mcp_tools
30
+ from adcp.server.proposal import ProposalBuilder, ProposalNotSupported
31
+ from adcp.server.sponsored_intelligence import SponsoredIntelligenceHandler
32
+
33
+ __all__ = [
34
+ # Base classes
35
+ "ADCPHandler",
36
+ "ToolContext",
37
+ "NotImplementedResponse",
38
+ "not_supported",
39
+ # Protocol handlers
40
+ "ContentStandardsHandler",
41
+ "GovernanceHandler",
42
+ "SponsoredIntelligenceHandler",
43
+ # Proposal helpers
44
+ "ProposalBuilder",
45
+ "ProposalNotSupported",
46
+ # MCP integration
47
+ "MCPToolSet",
48
+ "create_mcp_tools",
49
+ ]