adcp 2.19.0__tar.gz → 3.0.0__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 (342) hide show
  1. {adcp-2.19.0/src/adcp.egg-info → adcp-3.0.0}/PKG-INFO +1 -1
  2. {adcp-2.19.0 → adcp-3.0.0}/pyproject.toml +1 -1
  3. adcp-3.0.0/src/adcp/ADCP_VERSION +1 -0
  4. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/__init__.py +6 -14
  5. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/__main__.py +94 -51
  6. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/adagents.py +91 -19
  7. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/client.py +865 -0
  8. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/protocols/a2a.py +84 -0
  9. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/protocols/base.py +101 -0
  10. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/protocols/mcp.py +84 -0
  11. adcp-3.0.0/src/adcp/server/__init__.py +49 -0
  12. adcp-3.0.0/src/adcp/server/base.py +368 -0
  13. adcp-3.0.0/src/adcp/server/content_standards.py +561 -0
  14. adcp-3.0.0/src/adcp/server/governance.py +491 -0
  15. adcp-3.0.0/src/adcp/server/mcp_tools.py +471 -0
  16. adcp-3.0.0/src/adcp/server/proposal.py +334 -0
  17. adcp-3.0.0/src/adcp/server/sponsored_intelligence.py +444 -0
  18. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/__init__.py +111 -23
  19. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/_ergonomic.py +35 -14
  20. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/_generated.py +346 -52
  21. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/aliases.py +13 -20
  22. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/base.py +1 -1
  23. adcp-3.0.0/src/adcp/types/generated_poc/adagents.py +504 -0
  24. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/__init__.py +3 -0
  25. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/artifact.py +208 -0
  26. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/artifact_webhook_payload.py +64 -0
  27. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/calibrate_content_request.py +17 -0
  28. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/calibrate_content_response.py +74 -0
  29. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/content_standards.py +66 -0
  30. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/create_content_standards_request.py +97 -0
  31. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/create_content_standards_response.py +52 -0
  32. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/get_content_standards_request.py +21 -0
  33. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/get_content_standards_response.py +43 -0
  34. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/get_media_buy_artifacts_request.py +64 -0
  35. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/get_media_buy_artifacts_response.py +117 -0
  36. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/list_content_standards_request.py +31 -0
  37. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/list_content_standards_response.py +48 -0
  38. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/update_content_standards_request.py +101 -0
  39. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/update_content_standards_response.py +34 -0
  40. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/validate_content_delivery_request.py +59 -0
  41. adcp-3.0.0/src/adcp/types/generated_poc/content_standards/validate_content_delivery_response.py +85 -0
  42. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/activation_key.py +9 -9
  43. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/audio_asset.py +6 -6
  44. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/css_asset.py +3 -3
  45. adcp-3.0.0/src/adcp/types/generated_poc/core/assets/daast_asset.py +71 -0
  46. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/html_asset.py +3 -3
  47. adcp-3.0.0/src/adcp/types/generated_poc/core/assets/image_asset.py +23 -0
  48. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/javascript_asset.py +4 -4
  49. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/text_asset.py +3 -3
  50. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/url_asset.py +4 -4
  51. adcp-3.0.0/src/adcp/types/generated_poc/core/assets/vast_asset.py +73 -0
  52. adcp-3.0.0/src/adcp/types/generated_poc/core/assets/video_asset.py +28 -0
  53. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/webhook_asset.py +10 -10
  54. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/async_response_data.py +3 -3
  55. adcp-3.0.0/src/adcp/types/generated_poc/core/brand_manifest.py +264 -0
  56. adcp-3.0.0/src/adcp/types/generated_poc/core/brand_manifest_ref.py +35 -0
  57. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/context.py +2 -2
  58. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/creative_asset.py +20 -19
  59. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/creative_assignment.py +4 -4
  60. adcp-3.0.0/src/adcp/types/generated_poc/core/creative_filters.py +76 -0
  61. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/creative_manifest.py +3 -3
  62. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/creative_policy.py +5 -5
  63. adcp-3.0.0/src/adcp/types/generated_poc/core/delivery_metrics.py +111 -0
  64. adcp-3.0.0/src/adcp/types/generated_poc/core/deployment.py +86 -0
  65. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/destination.py +12 -12
  66. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/error.py +7 -7
  67. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/ext.py +2 -2
  68. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/format.py +66 -66
  69. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/format_id.py +6 -6
  70. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/frequency_cap.py +3 -3
  71. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/identifier.py +3 -3
  72. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/mcp_webhook_payload.py +11 -11
  73. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/measurement.py +9 -9
  74. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/media_buy.py +8 -8
  75. adcp-3.0.0/src/adcp/types/generated_poc/core/media_buy_features.py +29 -0
  76. adcp-3.0.0/src/adcp/types/generated_poc/core/offering.py +80 -0
  77. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/package.py +9 -9
  78. adcp-3.0.0/src/adcp/types/generated_poc/core/performance_feedback.py +78 -0
  79. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/placement.py +5 -5
  80. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/pricing_option.py +9 -15
  81. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/product.py +21 -21
  82. adcp-3.0.0/src/adcp/types/generated_poc/core/product_allocation.py +48 -0
  83. adcp-3.0.0/src/adcp/types/generated_poc/core/product_filters.py +162 -0
  84. adcp-3.0.0/src/adcp/types/generated_poc/core/promoted_offerings.py +77 -0
  85. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/promoted_products.py +3 -3
  86. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/property.py +10 -10
  87. adcp-3.0.0/src/adcp/types/generated_poc/core/property_id.py +21 -0
  88. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/property_list_ref.py +5 -5
  89. adcp-3.0.0/src/adcp/types/generated_poc/core/property_tag.py +21 -0
  90. adcp-3.0.0/src/adcp/types/generated_poc/core/proposal.py +64 -0
  91. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/protocol_envelope.py +9 -9
  92. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/publisher_property_selector.py +14 -14
  93. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/push_notification_config.py +6 -6
  94. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/reporting_capabilities.py +9 -9
  95. adcp-3.0.0/src/adcp/types/generated_poc/core/reporting_webhook.py +70 -0
  96. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/response.py +5 -5
  97. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/signal_filters.py +6 -6
  98. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/start_timing.py +4 -4
  99. adcp-3.0.0/src/adcp/types/generated_poc/core/sub_asset.py +65 -0
  100. adcp-3.0.0/src/adcp/types/generated_poc/core/targeting.py +94 -0
  101. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/list_creative_formats_request.py +21 -21
  102. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/list_creative_formats_response.py +6 -6
  103. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/preview_creative_request.py +25 -25
  104. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/preview_creative_response.py +29 -29
  105. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/preview_render.py +26 -26
  106. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/adcp_domain.py +5 -5
  107. adcp-3.0.0/src/adcp/types/generated_poc/enums/asset_content_type.py +23 -0
  108. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/auth_scheme.py +3 -3
  109. adcp-3.0.0/src/adcp/types/generated_poc/enums/available_metric.py +19 -0
  110. adcp-3.0.0/src/adcp/types/generated_poc/enums/channels.py +29 -0
  111. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/co_branding_requirement.py +4 -4
  112. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/creative_action.py +6 -6
  113. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/creative_agent_capability.py +5 -5
  114. adcp-3.0.0/src/adcp/types/generated_poc/enums/creative_sort_field.py +16 -0
  115. adcp-3.0.0/src/adcp/types/generated_poc/enums/creative_status.py +15 -0
  116. adcp-3.0.0/src/adcp/types/generated_poc/enums/daast_tracking_event.py +21 -0
  117. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/daast_version.py +3 -3
  118. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/delivery_type.py +3 -3
  119. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/dimension_unit.py +5 -5
  120. adcp-3.0.0/src/adcp/types/generated_poc/enums/feed_format.py +13 -0
  121. adcp-3.0.0/src/adcp/types/generated_poc/enums/feedback_source.py +14 -0
  122. adcp-3.0.0/src/adcp/types/generated_poc/enums/format_category.py +17 -0
  123. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/format_id_parameter.py +3 -3
  124. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/frequency_cap_scope.py +4 -4
  125. adcp-3.0.0/src/adcp/types/generated_poc/enums/geo_level.py +14 -0
  126. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/history_entry_type.py +3 -3
  127. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/http_method.py +3 -3
  128. adcp-3.0.0/src/adcp/types/generated_poc/enums/identifier_types.py +29 -0
  129. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/javascript_module_type.py +4 -4
  130. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/landing_page_requirement.py +4 -4
  131. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/markdown_flavor.py +3 -3
  132. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/media_buy_status.py +5 -5
  133. adcp-3.0.0/src/adcp/types/generated_poc/enums/metric_type.py +18 -0
  134. adcp-3.0.0/src/adcp/types/generated_poc/enums/metro_system.py +15 -0
  135. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/notification_type.py +5 -5
  136. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/pacing.py +4 -4
  137. adcp-3.0.0/src/adcp/types/generated_poc/enums/postal_system.py +19 -0
  138. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/preview_output_format.py +3 -3
  139. adcp-3.0.0/src/adcp/types/generated_poc/enums/pricing_model.py +17 -0
  140. adcp-3.0.0/src/adcp/types/generated_poc/enums/property_type.py +18 -0
  141. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/publisher_identifier_types.py +6 -6
  142. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/reporting_frequency.py +4 -4
  143. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/signal_catalog_type.py +4 -4
  144. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/sort_direction.py +3 -3
  145. adcp-3.0.0/src/adcp/types/generated_poc/enums/task_status.py +19 -0
  146. adcp-3.0.0/src/adcp/types/generated_poc/enums/task_type.py +21 -0
  147. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/update_frequency.py +5 -5
  148. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/url_asset_type.py +4 -4
  149. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/validation_mode.py +3 -3
  150. adcp-3.0.0/src/adcp/types/generated_poc/enums/vast_tracking_event.py +26 -0
  151. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/vast_version.py +6 -6
  152. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/webhook_response_type.py +5 -5
  153. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/webhook_security_method.py +4 -4
  154. adcp-3.0.0/src/adcp/types/generated_poc/extensions/extension_meta.py +58 -0
  155. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/build_creative_request.py +5 -5
  156. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/build_creative_response.py +7 -7
  157. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/create_media_buy_async_response_input_required.py +6 -6
  158. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/create_media_buy_async_response_submitted.py +2 -2
  159. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/create_media_buy_async_response_working.py +6 -6
  160. adcp-3.0.0/src/adcp/types/generated_poc/media_buy/create_media_buy_request.py +144 -0
  161. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/create_media_buy_response.py +8 -8
  162. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_media_buy_delivery_request.py +9 -9
  163. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_media_buy_delivery_response.py +52 -52
  164. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_products_async_response_input_required.py +7 -7
  165. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_products_async_response_submitted.py +3 -3
  166. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_products_async_response_working.py +5 -5
  167. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_products_request.py +14 -5
  168. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/get_products_response.py +12 -6
  169. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/list_authorized_properties_request.py +4 -4
  170. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/list_authorized_properties_response.py +9 -9
  171. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/list_creative_formats_request.py +10 -10
  172. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/list_creative_formats_response.py +6 -6
  173. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/list_creatives_request.py +24 -24
  174. adcp-3.0.0/src/adcp/types/generated_poc/media_buy/list_creatives_response.py +209 -0
  175. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/package_request.py +12 -12
  176. adcp-3.0.0/src/adcp/types/generated_poc/media_buy/package_update.py +119 -0
  177. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/provide_performance_feedback_request.py +20 -20
  178. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/provide_performance_feedback_response.py +7 -7
  179. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/sync_creatives_async_response_input_required.py +6 -6
  180. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/sync_creatives_async_response_submitted.py +2 -2
  181. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/sync_creatives_async_response_working.py +8 -8
  182. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/sync_creatives_request.py +8 -8
  183. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/sync_creatives_response.py +16 -16
  184. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/update_media_buy_async_response_input_required.py +5 -5
  185. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/update_media_buy_async_response_submitted.py +2 -2
  186. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/update_media_buy_async_response_working.py +6 -6
  187. adcp-3.0.0/src/adcp/types/generated_poc/media_buy/update_media_buy_request.py +97 -0
  188. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/update_media_buy_response.py +8 -8
  189. adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/cpc_option.py +68 -0
  190. adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/cpcv_option.py +70 -0
  191. adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/cpm_option.py +62 -0
  192. adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/cpp_option.py +87 -0
  193. adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/cpv_option.py +96 -0
  194. adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/flat_rate_option.py +99 -0
  195. adcp-3.0.0/src/adcp/types/generated_poc/pricing_options/vcpm_option.py +70 -0
  196. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/base_property_source.py +16 -16
  197. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/create_property_list_request.py +5 -5
  198. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/create_property_list_response.py +4 -4
  199. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/delete_property_list_request.py +3 -3
  200. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/delete_property_list_response.py +4 -4
  201. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/feature_requirement.py +8 -8
  202. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/get_property_list_request.py +6 -6
  203. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/get_property_list_response.py +12 -12
  204. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/list_property_lists_request.py +6 -6
  205. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/list_property_lists_response.py +9 -9
  206. adcp-3.0.0/src/adcp/types/generated_poc/property/property_error.py +33 -0
  207. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/property_feature.py +5 -5
  208. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/property_feature_definition.py +19 -19
  209. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/property_list.py +12 -12
  210. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/property_list_changed_webhook.py +12 -12
  211. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/property_list_filters.py +9 -9
  212. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/update_property_list_request.py +9 -9
  213. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/update_property_list_response.py +3 -3
  214. adcp-3.0.0/src/adcp/types/generated_poc/protocol/__init__.py +3 -0
  215. adcp-3.0.0/src/adcp/types/generated_poc/protocol/get_adcp_capabilities_request.py +34 -0
  216. adcp-3.0.0/src/adcp/types/generated_poc/protocol/get_adcp_capabilities_response.py +353 -0
  217. adcp-3.0.0/src/adcp/types/generated_poc/protocols/adcp_extension.py +50 -0
  218. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/signals/activate_signal_request.py +4 -4
  219. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/signals/activate_signal_response.py +7 -7
  220. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/signals/get_signals_request.py +9 -9
  221. adcp-3.0.0/src/adcp/types/generated_poc/signals/get_signals_response.py +58 -0
  222. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/__init__.py +3 -0
  223. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_capabilities.py +102 -0
  224. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_get_offering_request.py +34 -0
  225. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_get_offering_response.py +100 -0
  226. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_identity.py +78 -0
  227. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_request.py +46 -0
  228. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_initiate_session_response.py +44 -0
  229. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_send_message_request.py +58 -0
  230. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_send_message_response.py +101 -0
  231. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_request.py +60 -0
  232. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_terminate_session_response.py +54 -0
  233. adcp-3.0.0/src/adcp/types/generated_poc/sponsored_intelligence/si_ui_element.py +30 -0
  234. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/utils/format_assets.py +5 -5
  235. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/utils/preview_cache.py +2 -2
  236. {adcp-2.19.0 → adcp-3.0.0/src/adcp.egg-info}/PKG-INFO +1 -1
  237. {adcp-2.19.0 → adcp-3.0.0}/src/adcp.egg-info/SOURCES.txt +53 -7
  238. {adcp-2.19.0 → adcp-3.0.0}/tests/test_adagents.py +118 -0
  239. {adcp-2.19.0 → adcp-3.0.0}/tests/test_cli.py +46 -4
  240. {adcp-2.19.0 → adcp-3.0.0}/tests/test_discriminated_unions.py +33 -43
  241. {adcp-2.19.0 → adcp-3.0.0}/tests/test_preview_html.py +3 -5
  242. {adcp-2.19.0 → adcp-3.0.0}/tests/test_public_api.py +21 -21
  243. {adcp-2.19.0 → adcp-3.0.0}/tests/test_response_str.py +41 -41
  244. adcp-3.0.0/tests/test_server_framework.py +524 -0
  245. {adcp-2.19.0 → adcp-3.0.0}/tests/test_type_aliases.py +29 -24
  246. {adcp-2.19.0 → adcp-3.0.0}/tests/test_type_coercion.py +15 -12
  247. adcp-3.0.0/tests/test_version_interop.py +326 -0
  248. adcp-2.19.0/src/adcp/ADCP_VERSION +0 -1
  249. adcp-2.19.0/src/adcp/types/generated_poc/adagents.py +0 -497
  250. adcp-2.19.0/src/adcp/types/generated_poc/core/assets/daast_asset.py +0 -71
  251. adcp-2.19.0/src/adcp/types/generated_poc/core/assets/image_asset.py +0 -23
  252. adcp-2.19.0/src/adcp/types/generated_poc/core/assets/vast_asset.py +0 -73
  253. adcp-2.19.0/src/adcp/types/generated_poc/core/assets/video_asset.py +0 -28
  254. adcp-2.19.0/src/adcp/types/generated_poc/core/brand_manifest.py +0 -201
  255. adcp-2.19.0/src/adcp/types/generated_poc/core/brand_manifest_ref.py +0 -35
  256. adcp-2.19.0/src/adcp/types/generated_poc/core/creative_filters.py +0 -86
  257. adcp-2.19.0/src/adcp/types/generated_poc/core/delivery_metrics.py +0 -111
  258. adcp-2.19.0/src/adcp/types/generated_poc/core/deployment.py +0 -86
  259. adcp-2.19.0/src/adcp/types/generated_poc/core/performance_feedback.py +0 -78
  260. adcp-2.19.0/src/adcp/types/generated_poc/core/product_filters.py +0 -97
  261. adcp-2.19.0/src/adcp/types/generated_poc/core/promoted_offerings.py +0 -86
  262. adcp-2.19.0/src/adcp/types/generated_poc/core/property_id.py +0 -21
  263. adcp-2.19.0/src/adcp/types/generated_poc/core/property_tag.py +0 -21
  264. adcp-2.19.0/src/adcp/types/generated_poc/core/sub_asset.py +0 -65
  265. adcp-2.19.0/src/adcp/types/generated_poc/core/targeting.py +0 -53
  266. adcp-2.19.0/src/adcp/types/generated_poc/enums/asset_content_type.py +0 -23
  267. adcp-2.19.0/src/adcp/types/generated_poc/enums/available_metric.py +0 -19
  268. adcp-2.19.0/src/adcp/types/generated_poc/enums/channels.py +0 -19
  269. adcp-2.19.0/src/adcp/types/generated_poc/enums/creative_sort_field.py +0 -16
  270. adcp-2.19.0/src/adcp/types/generated_poc/enums/creative_status.py +0 -14
  271. adcp-2.19.0/src/adcp/types/generated_poc/enums/daast_tracking_event.py +0 -21
  272. adcp-2.19.0/src/adcp/types/generated_poc/enums/feed_format.py +0 -13
  273. adcp-2.19.0/src/adcp/types/generated_poc/enums/feedback_source.py +0 -14
  274. adcp-2.19.0/src/adcp/types/generated_poc/enums/format_category.py +0 -17
  275. adcp-2.19.0/src/adcp/types/generated_poc/enums/identifier_types.py +0 -29
  276. adcp-2.19.0/src/adcp/types/generated_poc/enums/metric_type.py +0 -18
  277. adcp-2.19.0/src/adcp/types/generated_poc/enums/pricing_model.py +0 -17
  278. adcp-2.19.0/src/adcp/types/generated_poc/enums/property_type.py +0 -17
  279. adcp-2.19.0/src/adcp/types/generated_poc/enums/standard_format_ids.py +0 -45
  280. adcp-2.19.0/src/adcp/types/generated_poc/enums/task_status.py +0 -19
  281. adcp-2.19.0/src/adcp/types/generated_poc/enums/task_type.py +0 -21
  282. adcp-2.19.0/src/adcp/types/generated_poc/enums/vast_tracking_event.py +0 -26
  283. adcp-2.19.0/src/adcp/types/generated_poc/extensions/extension_meta.py +0 -50
  284. adcp-2.19.0/src/adcp/types/generated_poc/media_buy/create_media_buy_request.py +0 -116
  285. adcp-2.19.0/src/adcp/types/generated_poc/media_buy/list_creatives_response.py +0 -212
  286. adcp-2.19.0/src/adcp/types/generated_poc/media_buy/update_media_buy_request.py +0 -193
  287. adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpc_option.py +0 -43
  288. adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpcv_option.py +0 -45
  289. adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpm_auction_option.py +0 -58
  290. adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpm_fixed_option.py +0 -43
  291. adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpp_option.py +0 -64
  292. adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/cpv_option.py +0 -77
  293. adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/flat_rate_option.py +0 -93
  294. adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/vcpm_auction_option.py +0 -61
  295. adcp-2.19.0/src/adcp/types/generated_poc/pricing_options/vcpm_fixed_option.py +0 -47
  296. adcp-2.19.0/src/adcp/types/generated_poc/property/list_property_features_request.py +0 -25
  297. adcp-2.19.0/src/adcp/types/generated_poc/property/list_property_features_response.py +0 -24
  298. adcp-2.19.0/src/adcp/types/generated_poc/property/property_error.py +0 -33
  299. adcp-2.19.0/src/adcp/types/generated_poc/protocols/adcp_extension.py +0 -53
  300. adcp-2.19.0/src/adcp/types/generated_poc/signals/get_signals_response.py +0 -58
  301. {adcp-2.19.0 → adcp-3.0.0}/LICENSE +0 -0
  302. {adcp-2.19.0 → adcp-3.0.0}/MANIFEST.in +0 -0
  303. {adcp-2.19.0 → adcp-3.0.0}/README.md +0 -0
  304. {adcp-2.19.0 → adcp-3.0.0}/setup.cfg +0 -0
  305. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/config.py +0 -0
  306. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/exceptions.py +0 -0
  307. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/protocols/__init__.py +0 -0
  308. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/py.typed +0 -0
  309. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/simple.py +0 -0
  310. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/testing/__init__.py +0 -0
  311. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/testing/test_helpers.py +0 -0
  312. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/coercion.py +0 -0
  313. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/core.py +0 -0
  314. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/__init__.py +0 -0
  315. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/__init__.py +0 -0
  316. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/core/assets/__init__.py +0 -0
  317. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/creative/__init__.py +0 -0
  318. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/enums/__init__.py +0 -0
  319. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/extensions/__init__.py +0 -0
  320. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/media_buy/__init__.py +0 -0
  321. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/pricing_options/__init__.py +0 -0
  322. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/property/__init__.py +0 -0
  323. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/protocols/__init__.py +0 -0
  324. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/types/generated_poc/signals/__init__.py +0 -0
  325. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/utils/__init__.py +0 -0
  326. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/utils/operation_id.py +0 -0
  327. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/utils/response_parser.py +0 -0
  328. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/validation.py +0 -0
  329. {adcp-2.19.0 → adcp-3.0.0}/src/adcp/webhooks.py +0 -0
  330. {adcp-2.19.0 → adcp-3.0.0}/src/adcp.egg-info/dependency_links.txt +0 -0
  331. {adcp-2.19.0 → adcp-3.0.0}/src/adcp.egg-info/entry_points.txt +0 -0
  332. {adcp-2.19.0 → adcp-3.0.0}/src/adcp.egg-info/requires.txt +0 -0
  333. {adcp-2.19.0 → adcp-3.0.0}/src/adcp.egg-info/top_level.txt +0 -0
  334. {adcp-2.19.0 → adcp-3.0.0}/tests/test_client.py +0 -0
  335. {adcp-2.19.0 → adcp-3.0.0}/tests/test_code_generation.py +0 -0
  336. {adcp-2.19.0 → adcp-3.0.0}/tests/test_format_assets.py +0 -0
  337. {adcp-2.19.0 → adcp-3.0.0}/tests/test_format_id_validation.py +0 -0
  338. {adcp-2.19.0 → adcp-3.0.0}/tests/test_helpers.py +0 -0
  339. {adcp-2.19.0 → adcp-3.0.0}/tests/test_protocols.py +0 -0
  340. {adcp-2.19.0 → adcp-3.0.0}/tests/test_response_parser.py +0 -0
  341. {adcp-2.19.0 → adcp-3.0.0}/tests/test_simple_api.py +0 -0
  342. {adcp-2.19.0 → adcp-3.0.0}/tests/test_webhook_handling.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: adcp
3
- Version: 2.19.0
3
+ Version: 3.0.0
4
4
  Summary: Official Python client for the Ad Context Protocol (AdCP)
5
5
  Author-email: AdCP Community <maintainers@adcontextprotocol.org>
6
6
  License: Apache-2.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "adcp"
7
- version = "2.19.0"
7
+ version = "3.0.0"
8
8
  description = "Official Python client for the Ad Context Protocol (AdCP)"
9
9
  authors = [
10
10
  {name = "AdCP Community", email = "maintainers@adcontextprotocol.org"}
@@ -0,0 +1 @@
1
+ 3.0.0-beta.1
@@ -67,11 +67,10 @@ from adcp.types import (
67
67
  # Creative Operations
68
68
  BuildCreativeRequest,
69
69
  BuildCreativeResponse,
70
- # Pricing options (all 9 types for product creation)
70
+ # Pricing options (all types for product creation)
71
71
  CpcPricingOption,
72
72
  CpcvPricingOption,
73
- CpmAuctionPricingOption,
74
- CpmFixedRatePricingOption,
73
+ CpmPricingOption,
75
74
  CppPricingOption,
76
75
  CpvPricingOption,
77
76
  # Media Buy Operations
@@ -121,8 +120,7 @@ from adcp.types import (
121
120
  SyncCreativesResponse,
122
121
  UpdateMediaBuyRequest,
123
122
  UpdateMediaBuyResponse,
124
- VcpmAuctionPricingOption,
125
- VcpmFixedRatePricingOption,
123
+ VcpmPricingOption,
126
124
  aliases,
127
125
  )
128
126
 
@@ -152,9 +150,7 @@ from adcp.types.aliases import (
152
150
  PreviewCreativeManifestRequest,
153
151
  PreviewCreativeStaticResponse,
154
152
  PropertyId,
155
- PropertyIdActivationKey,
156
153
  PropertyTag,
157
- PropertyTagActivationKey,
158
154
  ProvidePerformanceFeedbackErrorResponse,
159
155
  ProvidePerformanceFeedbackSuccessResponse,
160
156
  PublisherPropertiesAll,
@@ -197,7 +193,7 @@ from adcp.webhooks import (
197
193
  get_adcp_signed_headers_for_webhook,
198
194
  )
199
195
 
200
- __version__ = "2.19.0"
196
+ __version__ = "3.0.0"
201
197
 
202
198
 
203
199
  def get_adcp_version() -> str:
@@ -291,14 +287,12 @@ __all__ = [
291
287
  # Pricing-related types
292
288
  "CpcPricingOption",
293
289
  "CpcvPricingOption",
294
- "CpmAuctionPricingOption",
295
- "CpmFixedRatePricingOption",
290
+ "CpmPricingOption",
296
291
  "CppPricingOption",
297
292
  "CpvPricingOption",
298
293
  "FlatRatePricingOption",
299
294
  "PriceGuidance",
300
- "VcpmAuctionPricingOption",
301
- "VcpmFixedRatePricingOption",
295
+ "VcpmPricingOption",
302
296
  # Configuration types
303
297
  "PushNotificationConfig",
304
298
  # Adagents validation
@@ -379,9 +373,7 @@ __all__ = [
379
373
  "PreviewCreativeStaticResponse",
380
374
  "PreviewCreativeInteractiveResponse",
381
375
  "PropertyId",
382
- "PropertyIdActivationKey",
383
376
  "PropertyTag",
384
- "PropertyTagActivationKey",
385
377
  "ProvidePerformanceFeedbackSuccessResponse",
386
378
  "ProvidePerformanceFeedbackErrorResponse",
387
379
  "PublisherPropertiesAll",
@@ -153,26 +153,90 @@ async def execute_tool(
153
153
  print_result(result, json_output)
154
154
 
155
155
 
156
- # Tool dispatch mapping - single source of truth for ADCP methods
157
- # Types are filled at runtime to avoid circular imports
158
- # Special case: list_tools and get_info take no parameters (None means no request type)
159
- TOOL_DISPATCH: dict[str, tuple[str, type | None]] = {
160
- "list_tools": ("list_tools", None), # Protocol introspection - no request type
161
- "get_info": ("get_info", None), # Agent info - no request type
162
- "get_products": ("get_products", None),
163
- "list_creative_formats": ("list_creative_formats", None),
164
- "preview_creative": ("preview_creative", None),
165
- "build_creative": ("build_creative", None),
166
- "sync_creatives": ("sync_creatives", None),
167
- "list_creatives": ("list_creatives", None),
168
- "create_media_buy": ("create_media_buy", None),
169
- "update_media_buy": ("update_media_buy", None),
170
- "get_media_buy_delivery": ("get_media_buy_delivery", None),
171
- "list_authorized_properties": ("list_authorized_properties", None),
172
- "get_signals": ("get_signals", None),
173
- "activate_signal": ("activate_signal", None),
174
- "provide_performance_feedback": ("provide_performance_feedback", None),
175
- }
156
+ # Tool names that don't require request types (protocol introspection)
157
+ _NO_REQUEST_TOOLS = frozenset({"list_tools", "get_info"})
158
+
159
+ # Cached dispatch table (initialized on first use)
160
+ _dispatch_table: dict[str, tuple[str, type | None]] | None = None
161
+
162
+
163
+ def _get_dispatch_table() -> dict[str, tuple[str, type | None]]:
164
+ """Get the tool dispatch table, initializing types on first access.
165
+
166
+ This function fails fast with a clear error if types can't be imported.
167
+ """
168
+ global _dispatch_table
169
+
170
+ if _dispatch_table is not None:
171
+ return _dispatch_table
172
+
173
+ try:
174
+ from adcp.types import _generated as gen
175
+ except ImportError as e:
176
+ raise ImportError(
177
+ f"Failed to load ADCP types. This may indicate a code generation issue. "
178
+ f"Try running 'scripts/generate_types.py' to regenerate types. Error: {e}"
179
+ ) from e
180
+
181
+ _dispatch_table = {
182
+ # Protocol introspection (no request type needed)
183
+ "list_tools": ("list_tools", None),
184
+ "get_info": ("get_info", None),
185
+ # Core catalog
186
+ "get_products": ("get_products", gen.GetProductsRequest),
187
+ "list_creative_formats": ("list_creative_formats", gen.ListCreativeFormatsRequest),
188
+ "preview_creative": ("preview_creative", gen.PreviewCreativeRequest),
189
+ "build_creative": ("build_creative", gen.BuildCreativeRequest),
190
+ "sync_creatives": ("sync_creatives", gen.SyncCreativesRequest),
191
+ "list_creatives": ("list_creatives", gen.ListCreativesRequest),
192
+ # Media buy
193
+ "create_media_buy": ("create_media_buy", gen.CreateMediaBuyRequest),
194
+ "update_media_buy": ("update_media_buy", gen.UpdateMediaBuyRequest),
195
+ "get_media_buy_delivery": ("get_media_buy_delivery", gen.GetMediaBuyDeliveryRequest),
196
+ "list_authorized_properties": (
197
+ "list_authorized_properties",
198
+ gen.ListAuthorizedPropertiesRequest,
199
+ ),
200
+ # Signals
201
+ "get_signals": ("get_signals", gen.GetSignalsRequest),
202
+ "activate_signal": ("activate_signal", gen.ActivateSignalRequest),
203
+ "provide_performance_feedback": (
204
+ "provide_performance_feedback",
205
+ gen.ProvidePerformanceFeedbackRequest,
206
+ ),
207
+ # V3 Protocol Discovery
208
+ "get_adcp_capabilities": ("get_adcp_capabilities", gen.GetAdcpCapabilitiesRequest),
209
+ # V3 Content Standards
210
+ "create_content_standards": (
211
+ "create_content_standards",
212
+ gen.CreateContentStandardsRequest,
213
+ ),
214
+ "get_content_standards": ("get_content_standards", gen.GetContentStandardsRequest),
215
+ "list_content_standards": ("list_content_standards", gen.ListContentStandardsRequest),
216
+ "update_content_standards": (
217
+ "update_content_standards",
218
+ gen.UpdateContentStandardsRequest,
219
+ ),
220
+ "calibrate_content": ("calibrate_content", gen.CalibrateContentRequest),
221
+ "validate_content_delivery": (
222
+ "validate_content_delivery",
223
+ gen.ValidateContentDeliveryRequest,
224
+ ),
225
+ "get_media_buy_artifacts": ("get_media_buy_artifacts", gen.GetMediaBuyArtifactsRequest),
226
+ # V3 Sponsored Intelligence
227
+ "si_get_offering": ("si_get_offering", gen.SiGetOfferingRequest),
228
+ "si_initiate_session": ("si_initiate_session", gen.SiInitiateSessionRequest),
229
+ "si_send_message": ("si_send_message", gen.SiSendMessageRequest),
230
+ "si_terminate_session": ("si_terminate_session", gen.SiTerminateSessionRequest),
231
+ # V3 Governance (Property Lists)
232
+ "create_property_list": ("create_property_list", gen.CreatePropertyListRequest),
233
+ "get_property_list": ("get_property_list", gen.GetPropertyListRequest),
234
+ "list_property_lists": ("list_property_lists", gen.ListPropertyListsRequest),
235
+ "update_property_list": ("update_property_list", gen.UpdatePropertyListRequest),
236
+ "delete_property_list": ("delete_property_list", gen.DeletePropertyListRequest),
237
+ }
238
+
239
+ return _dispatch_table
176
240
 
177
241
 
178
242
  async def _dispatch_tool(client: ADCPClient, tool_name: str, payload: dict[str, Any]) -> Any:
@@ -191,40 +255,14 @@ async def _dispatch_tool(client: ADCPClient, tool_name: str, payload: dict[str,
191
255
  """
192
256
  from pydantic import ValidationError
193
257
 
194
- from adcp.types import _generated as gen
195
258
  from adcp.types.core import TaskResult, TaskStatus
196
259
 
197
- # Lazy initialization of request types (avoid circular imports)
198
- if TOOL_DISPATCH["get_products"][1] is None:
199
- TOOL_DISPATCH["get_products"] = ("get_products", gen.GetProductsRequest)
200
- TOOL_DISPATCH["list_creative_formats"] = (
201
- "list_creative_formats",
202
- gen.ListCreativeFormatsRequest,
203
- )
204
- TOOL_DISPATCH["preview_creative"] = ("preview_creative", gen.PreviewCreativeRequest)
205
- TOOL_DISPATCH["build_creative"] = ("build_creative", gen.BuildCreativeRequest)
206
- TOOL_DISPATCH["sync_creatives"] = ("sync_creatives", gen.SyncCreativesRequest)
207
- TOOL_DISPATCH["list_creatives"] = ("list_creatives", gen.ListCreativesRequest)
208
- TOOL_DISPATCH["create_media_buy"] = ("create_media_buy", gen.CreateMediaBuyRequest)
209
- TOOL_DISPATCH["update_media_buy"] = ("update_media_buy", gen.UpdateMediaBuyRequest)
210
- TOOL_DISPATCH["get_media_buy_delivery"] = (
211
- "get_media_buy_delivery",
212
- gen.GetMediaBuyDeliveryRequest,
213
- )
214
- TOOL_DISPATCH["list_authorized_properties"] = (
215
- "list_authorized_properties",
216
- gen.ListAuthorizedPropertiesRequest,
217
- )
218
- TOOL_DISPATCH["get_signals"] = ("get_signals", gen.GetSignalsRequest)
219
- TOOL_DISPATCH["activate_signal"] = ("activate_signal", gen.ActivateSignalRequest)
220
- TOOL_DISPATCH["provide_performance_feedback"] = (
221
- "provide_performance_feedback",
222
- gen.ProvidePerformanceFeedbackRequest,
223
- )
260
+ # Get dispatch table (initializes types on first access, fails fast on import errors)
261
+ dispatch_table = _get_dispatch_table()
224
262
 
225
263
  # Check if tool exists
226
- if tool_name not in TOOL_DISPATCH:
227
- available = ", ".join(sorted(TOOL_DISPATCH.keys()))
264
+ if tool_name not in dispatch_table:
265
+ available = ", ".join(sorted(dispatch_table.keys()))
228
266
  return TaskResult(
229
267
  status=TaskStatus.FAILED,
230
268
  success=False,
@@ -232,7 +270,7 @@ async def _dispatch_tool(client: ADCPClient, tool_name: str, payload: dict[str,
232
270
  )
233
271
 
234
272
  # Get method and request type
235
- method_name, request_type = TOOL_DISPATCH[tool_name]
273
+ method_name, request_type = dispatch_table[tool_name]
236
274
  method = getattr(client, method_name)
237
275
 
238
276
  # Special case: list_tools and get_info take no parameters and return
@@ -451,6 +489,11 @@ def main() -> None:
451
489
  print(" adcp myagent list_tools")
452
490
  print(' adcp myagent get_products \'{"brief":"TV ads"}\'')
453
491
  print(" adcp https://agent.example.com list_tools")
492
+ print("\nV3 Protocol Examples:")
493
+ print(" adcp myagent get_adcp_capabilities")
494
+ print(" adcp cs-agent calibrate_content '{\"content_standards_id\":\"cs-123\"}'")
495
+ print(" adcp si-agent si_get_offering")
496
+ print(" adcp gov-agent list_property_lists")
454
497
  sys.exit(0)
455
498
 
456
499
  # Handle configuration commands
@@ -280,6 +280,10 @@ def verify_agent_authorization(
280
280
  return False
281
281
 
282
282
 
283
+ # Maximum number of authoritative_location redirects to follow
284
+ MAX_REDIRECT_DEPTH = 5
285
+
286
+
283
287
  async def fetch_adagents(
284
288
  publisher_domain: str,
285
289
  timeout: float = 10.0,
@@ -288,6 +292,11 @@ async def fetch_adagents(
288
292
  ) -> dict[str, Any]:
289
293
  """Fetch and parse adagents.json from publisher domain.
290
294
 
295
+ Follows authoritative_location redirects per the AdCP specification. When a
296
+ publisher's adagents.json contains an authoritative_location field instead of
297
+ authorized_agents, this function fetches the referenced URL to get the actual
298
+ authorization data.
299
+
291
300
  Args:
292
301
  publisher_domain: Domain hosting the adagents.json file
293
302
  timeout: Request timeout in seconds
@@ -297,11 +306,12 @@ async def fetch_adagents(
297
306
  If None, a new client is created for this request.
298
307
 
299
308
  Returns:
300
- Parsed adagents.json data
309
+ Parsed adagents.json data (resolved from authoritative_location if present)
301
310
 
302
311
  Raises:
303
312
  AdagentsNotFoundError: If adagents.json not found (404)
304
- AdagentsValidationError: If JSON is invalid or malformed
313
+ AdagentsValidationError: If JSON is invalid, malformed, or redirects
314
+ exceed maximum depth or form a loop
305
315
  AdagentsTimeoutError: If request times out
306
316
 
307
317
  Notes:
@@ -311,13 +321,67 @@ async def fetch_adagents(
311
321
  # Validate and normalize domain for security
312
322
  publisher_domain = _validate_publisher_domain(publisher_domain)
313
323
 
314
- # Construct URL
324
+ # Construct initial URL
315
325
  url = f"https://{publisher_domain}/.well-known/adagents.json"
316
326
 
327
+ # Track visited URLs to detect loops
328
+ visited_urls: set[str] = set()
329
+
330
+ for depth in range(MAX_REDIRECT_DEPTH + 1):
331
+ # Check for redirect loop
332
+ if url in visited_urls:
333
+ raise AdagentsValidationError(
334
+ f"Circular redirect detected: {url} already visited"
335
+ )
336
+ visited_urls.add(url)
337
+
338
+ data = await _fetch_adagents_url(url, timeout, user_agent, client)
339
+
340
+ # Check if this is a redirect. A response with authoritative_location but no
341
+ # authorized_agents indicates a redirect. If both are present, authorized_agents
342
+ # takes precedence (response is treated as final).
343
+ if "authoritative_location" in data and "authorized_agents" not in data:
344
+ authoritative_url = data["authoritative_location"]
345
+
346
+ # Validate HTTPS requirement
347
+ if not isinstance(authoritative_url, str) or not authoritative_url.startswith(
348
+ "https://"
349
+ ):
350
+ raise AdagentsValidationError(
351
+ f"authoritative_location must be an HTTPS URL, got: {authoritative_url!r}"
352
+ )
353
+
354
+ # Check if we've exceeded max depth
355
+ if depth >= MAX_REDIRECT_DEPTH:
356
+ raise AdagentsValidationError(
357
+ f"Maximum redirect depth ({MAX_REDIRECT_DEPTH}) exceeded"
358
+ )
359
+
360
+ # Follow the redirect
361
+ url = authoritative_url
362
+ continue
363
+
364
+ # We have the final data with authorized_agents (or both fields present,
365
+ # in which case authorized_agents takes precedence)
366
+ return data
367
+
368
+ # Unreachable: loop always exits via return or raise above
369
+ raise AssertionError("Unreachable") # pragma: no cover
370
+
371
+
372
+ async def _fetch_adagents_url(
373
+ url: str,
374
+ timeout: float,
375
+ user_agent: str,
376
+ client: httpx.AsyncClient | None,
377
+ ) -> dict[str, Any]:
378
+ """Fetch and parse adagents.json from a specific URL.
379
+
380
+ This is the core fetch logic, separated to support redirect following.
381
+ """
317
382
  try:
318
383
  # Use provided client or create a new one
319
384
  if client is not None:
320
- # Reuse provided client (connection pooling)
321
385
  response = await client.get(
322
386
  url,
323
387
  headers={"User-Agent": user_agent},
@@ -325,7 +389,6 @@ async def fetch_adagents(
325
389
  follow_redirects=True,
326
390
  )
327
391
  else:
328
- # Create new client for single request
329
392
  async with httpx.AsyncClient() as new_client:
330
393
  response = await new_client.get(
331
394
  url,
@@ -334,9 +397,11 @@ async def fetch_adagents(
334
397
  follow_redirects=True,
335
398
  )
336
399
 
337
- # Process response (same for both paths)
400
+ # Process response
338
401
  if response.status_code == 404:
339
- raise AdagentsNotFoundError(publisher_domain)
402
+ # Extract domain from URL for error message
403
+ parsed = urlparse(url)
404
+ raise AdagentsNotFoundError(parsed.netloc)
340
405
 
341
406
  if response.status_code != 200:
342
407
  raise AdagentsValidationError(
@@ -353,22 +418,29 @@ async def fetch_adagents(
353
418
  if not isinstance(data, dict):
354
419
  raise AdagentsValidationError("adagents.json must be a JSON object")
355
420
 
356
- if "authorized_agents" not in data:
357
- raise AdagentsValidationError("adagents.json must have 'authorized_agents' field")
358
-
359
- if not isinstance(data["authorized_agents"], list):
360
- raise AdagentsValidationError("'authorized_agents' must be an array")
361
-
362
- # Validate mutual exclusivity constraints
363
- try:
364
- validate_adagents(data)
365
- except ValidationError as e:
366
- raise AdagentsValidationError(f"Invalid adagents.json structure: {e}") from e
421
+ # If this has authorized_agents, validate it
422
+ if "authorized_agents" in data:
423
+ if not isinstance(data["authorized_agents"], list):
424
+ raise AdagentsValidationError("'authorized_agents' must be an array")
425
+
426
+ # Validate mutual exclusivity constraints
427
+ try:
428
+ validate_adagents(data)
429
+ except ValidationError as e:
430
+ raise AdagentsValidationError(
431
+ f"Invalid adagents.json structure: {e}"
432
+ ) from e
433
+ elif "authoritative_location" not in data:
434
+ # Neither authorized_agents nor authoritative_location
435
+ raise AdagentsValidationError(
436
+ "adagents.json must have either 'authorized_agents' or 'authoritative_location'"
437
+ )
367
438
 
368
439
  return data
369
440
 
370
441
  except httpx.TimeoutException as e:
371
- raise AdagentsTimeoutError(publisher_domain, timeout) from e
442
+ parsed = urlparse(url)
443
+ raise AdagentsTimeoutError(parsed.netloc, timeout) from e
372
444
  except httpx.RequestError as e:
373
445
  raise AdagentsValidationError(f"Failed to fetch adagents.json: {e}") from e
374
446