microsoft-agent 2.3.2__tar.gz → 2.3.4__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 (195) hide show
  1. {microsoft_agent-2.3.2/microsoft_agent.egg-info → microsoft_agent-2.3.4}/PKG-INFO +4 -4
  2. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/README.md +1 -1
  3. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/connector_manifest.yml +1 -1
  4. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/_version.py +1 -1
  5. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_other.py +6 -1
  6. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/connectors/tool_schema_fingerprints.json +1 -1
  7. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/graph_file_service.py +17 -44
  8. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/integration_tools.py +9 -3
  9. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/power_platform.py +19 -2
  10. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/universal_print.py +18 -47
  11. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_companion_service.py +9 -8
  12. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_control_plane.py +6 -9
  13. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_runtime.py +33 -6
  14. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4/microsoft_agent.egg-info}/PKG-INFO +4 -4
  15. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/SOURCES.txt +3 -0
  16. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/entry_points.txt +3 -0
  17. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/requires.txt +2 -2
  18. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/pyproject.toml +6 -2
  19. microsoft_agent-2.3.4/tests/test_default_content_surfaces.py +43 -0
  20. microsoft_agent-2.3.4/tests/test_sdk_centralization.py +95 -0
  21. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_transport_migration.py +10 -2
  22. microsoft_agent-2.3.4/tests/test_transport_tls.py +104 -0
  23. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/.env.example +0 -0
  24. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/LICENSE +0 -0
  25. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/MANIFEST.in +0 -0
  26. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/control-plane/README.md +0 -0
  27. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/control-plane/control-plane.sample.json +0 -0
  28. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/control-plane/nginx/windows-control-plane.conf +0 -0
  29. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/control-plane/systemd/microsoft-windows-control-plane.env +0 -0
  30. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/control-plane/systemd/microsoft-windows-control-plane.service +0 -0
  31. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/entra/New-MicrosoftAgentApp.ps1 +0 -0
  32. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/entra/New-WindowsControlPlaneEntraResources.ps1 +0 -0
  33. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/entra/README.md +0 -0
  34. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/entra/permission-profiles.json +0 -0
  35. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/integrations.example.json +0 -0
  36. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/Install-WindowsCompanion.ps1 +0 -0
  37. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/README.md +0 -0
  38. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/Run-WindowsCompanion.ps1 +0 -0
  39. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/Test-WindowsCompanionDeployment.ps1 +0 -0
  40. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/Uninstall-WindowsCompanion.ps1 +0 -0
  41. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/deployment/windows/windows-companion.sample.json +0 -0
  42. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/authentication.md +0 -0
  43. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/concepts.md +0 -0
  44. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/configuration.md +0 -0
  45. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/deployment.md +0 -0
  46. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/enrollment-checklist.md +0 -0
  47. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/index.md +0 -0
  48. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/installation.md +0 -0
  49. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/integrations.md +0 -0
  50. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/office-addin.md +0 -0
  51. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/overview.md +0 -0
  52. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/usage.md +0 -0
  53. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/docs/windows-companion.md +0 -0
  54. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/__init__.py +0 -0
  55. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/__main__.py +0 -0
  56. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/__init__.py +0 -0
  57. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/_graph_models.py +0 -0
  58. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_admin.py +0 -0
  59. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_apps.py +0 -0
  60. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_base.py +0 -0
  61. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_calendar.py +0 -0
  62. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_directory.py +0 -0
  63. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_drive.py +0 -0
  64. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_mail.py +0 -0
  65. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api/api_client_system.py +0 -0
  66. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/api_client.py +0 -0
  67. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/auth.py +0 -0
  68. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/config_cli.py +0 -0
  69. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/connectors/__init__.py +0 -0
  70. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/connectors/mcp_source_presets.json +0 -0
  71. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/credential_adapter.py +0 -0
  72. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/document_service.py +0 -0
  73. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/integration_adapters.py +0 -0
  74. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/integration_auth.py +0 -0
  75. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/integration_config.py +0 -0
  76. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/intune_service.py +0 -0
  77. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/kg_ingest.py +0 -0
  78. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/__init__.py +0 -0
  79. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_admin.py +0 -0
  80. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_agreements.py +0 -0
  81. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_applications.py +0 -0
  82. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_audit.py +0 -0
  83. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_auth.py +0 -0
  84. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_calendar.py +0 -0
  85. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_chat.py +0 -0
  86. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_communications.py +0 -0
  87. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_connections.py +0 -0
  88. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_contacts.py +0 -0
  89. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_devices.py +0 -0
  90. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_directory.py +0 -0
  91. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_domains.py +0 -0
  92. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_education.py +0 -0
  93. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_employee_experience.py +0 -0
  94. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_files.py +0 -0
  95. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_groups.py +0 -0
  96. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_identity.py +0 -0
  97. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_mail.py +0 -0
  98. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_meta.py +0 -0
  99. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_notes.py +0 -0
  100. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_organization.py +0 -0
  101. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_places.py +0 -0
  102. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_policies.py +0 -0
  103. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_print.py +0 -0
  104. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_privacy.py +0 -0
  105. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_reports.py +0 -0
  106. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_search.py +0 -0
  107. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_security.py +0 -0
  108. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_sites.py +0 -0
  109. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_solutions.py +0 -0
  110. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_storage.py +0 -0
  111. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_subscriptions.py +0 -0
  112. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_tasks.py +0 -0
  113. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_teams.py +0 -0
  114. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp/mcp_user.py +0 -0
  115. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp_config.json +0 -0
  116. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/mcp_server.py +0 -0
  117. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/office_bridge.py +0 -0
  118. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/__init__.py +0 -0
  119. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/certification.json +0 -0
  120. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/fixtures/records.json +0 -0
  121. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/mappings/source.yaml +0 -0
  122. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/microsoft.ttl +0 -0
  123. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/migrations/manifest.json +0 -0
  124. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/ontology/shapes/connector.shacl.ttl +0 -0
  125. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/prompts/__init__.py +0 -0
  126. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/prompts/collaboration_specialist.json +0 -0
  127. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/settings.py +0 -0
  128. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/__init__.py +0 -0
  129. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/SKILL.md +0 -0
  130. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/agents/openai.yaml +0 -0
  131. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-agent-operations/references/catalog.md +0 -0
  132. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-calendar-scheduling/SKILL.md +0 -0
  133. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-mail-operations/SKILL.md +0 -0
  134. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/skills/microsoft-teams-messaging/SKILL.md +0 -0
  135. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/tool_policy.py +0 -0
  136. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_companion.py +0 -0
  137. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent/windows_control_plane_service.py +0 -0
  138. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/dependency_links.txt +0 -0
  139. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/microsoft_agent.egg-info/top_level.txt +0 -0
  140. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/mkdocs.yml +0 -0
  141. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/README.md +0 -0
  142. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/manifest.xml +0 -0
  143. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/package-lock.json +0 -0
  144. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/package.json +0 -0
  145. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/public/assets/icon.png.b64 +0 -0
  146. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/public/assets/icon.svg +0 -0
  147. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/public/config.json +0 -0
  148. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/public/styles.css +0 -0
  149. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/public/taskpane.html +0 -0
  150. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/scripts/validate_manifest.py +0 -0
  151. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/src/backend-client.ts +0 -0
  152. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/src/office-bridge.ts +0 -0
  153. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/src/office-operations.ts +0 -0
  154. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/src/taskpane.ts +0 -0
  155. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/src/validation.ts +0 -0
  156. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/tests/backend-client.test.ts +0 -0
  157. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/tests/office-bridge.test.ts +0 -0
  158. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/tests/validation.test.ts +0 -0
  159. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/tsconfig.json +0 -0
  160. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/vitest.config.ts +0 -0
  161. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/office_addin/webpack.config.cjs +0 -0
  162. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/setup.cfg +0 -0
  163. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_api_client_extended.py +0 -0
  164. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_auth.py +0 -0
  165. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_auth_coverage.py +0 -0
  166. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_bug_cx_046_ctx_info_awaited.py +0 -0
  167. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_config_cli.py +0 -0
  168. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_credential_adapter.py +0 -0
  169. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_document_service.py +0 -0
  170. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_generate_code.py +0 -0
  171. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_graph_file_service.py +0 -0
  172. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_graph_reliability.py +0 -0
  173. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_graph_transport.py +0 -0
  174. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_init_dynamics.py +0 -0
  175. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_integration_adapters.py +0 -0
  176. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_integration_auth.py +0 -0
  177. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_integration_config_and_tools.py +0 -0
  178. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_intune_service.py +0 -0
  179. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_kg_ingest.py +0 -0
  180. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_main.py +0 -0
  181. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_mcp_comprehensive.py +0 -0
  182. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_mcp_server.py +0 -0
  183. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_office_bridge.py +0 -0
  184. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_office_manifest.py +0 -0
  185. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_onenote_sharepoint_print.py +0 -0
  186. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_placeholder.py +0 -0
  187. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_power_platform.py +0 -0
  188. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_settings_and_policy.py +0 -0
  189. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_startup.py +0 -0
  190. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_teams_reliability.py +0 -0
  191. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_verify_api_integration.py +0 -0
  192. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_windows_companion.py +0 -0
  193. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_windows_control_plane.py +0 -0
  194. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_windows_control_plane_service.py +0 -0
  195. {microsoft_agent-2.3.2 → microsoft_agent-2.3.4}/tests/test_windows_runtime.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microsoft-agent
3
- Version: 2.3.2
3
+ Version: 2.3.4
4
4
  Summary: Governed Microsoft Graph agent and MCP server
5
5
  Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -11,7 +11,7 @@ Classifier: Programming Language :: Python :: 3
11
11
  Requires-Python: >=3.12
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.6
14
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
15
15
  Requires-Dist: azure-core>=1.41.0
16
16
  Requires-Dist: httpx>=0.28.1
17
17
  Requires-Dist: keyring>=25.7.0
@@ -19,7 +19,7 @@ Requires-Dist: msal>=1.39.0
19
19
  Requires-Dist: msgraph-sdk>=1.64.0
20
20
  Requires-Dist: pydantic>=2.14.1
21
21
  Provides-Extra: mcp
22
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.6; extra == "mcp"
22
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
23
23
  Provides-Extra: documents
24
24
  Requires-Dist: python-docx>=1.2.0; extra == "documents"
25
25
  Requires-Dist: python-pptx>=1.0.2; extra == "documents"
@@ -71,7 +71,7 @@ Dynamic: license-file
71
71
  agent. It uses Agent Connector SDK for MCP, identity propagation, intent delegation,
72
72
  configuration, telemetry, and graph integration.
73
73
 
74
- Current package version: **2.3.2**
74
+ Current package version: **2.3.4**
75
75
 
76
76
  ## Capabilities
77
77
 
@@ -3,7 +3,7 @@
3
3
  agent. It uses Agent Connector SDK for MCP, identity propagation, intent delegation,
4
4
  configuration, telemetry, and graph integration.
5
5
 
6
- Current package version: **2.3.2**
6
+ Current package version: **2.3.4**
7
7
 
8
8
  ## Capabilities
9
9
 
@@ -1,4 +1,4 @@
1
- connector: microsoft-agent
1
+ connector: microsoft-mcp
2
2
  ontology_source: microsoft
3
3
  schema_version: '1'
4
4
  resources:
@@ -1,3 +1,3 @@
1
1
  """Single package version authority."""
2
2
 
3
- __version__ = "2.3.2"
3
+ __version__ = "2.3.4"
@@ -2032,8 +2032,12 @@ class MicrosoftGraphApiOther(MicrosoftGraphApiBase):
2032
2032
  upload_transport: AsyncHttpTransport | None = None,
2033
2033
  ) -> dict[str, Any]:
2034
2034
  """Create, upload, and start one print job without exposing its upload URL."""
2035
- from microsoft_agent.power_platform import HttpxAsyncHttpTransport
2035
+ from microsoft_agent.power_platform import (
2036
+ HttpxAsyncHttpTransport,
2037
+ upload_retry_policy,
2038
+ )
2036
2039
  from microsoft_agent.universal_print import (
2040
+ PRINT_UPLOAD_MAX_RETRIES,
2037
2041
  PrintDocumentSubmission,
2038
2042
  UniversalPrintUploader,
2039
2043
  validate_print_upload_url,
@@ -2088,6 +2092,7 @@ class MicrosoftGraphApiOther(MicrosoftGraphApiBase):
2088
2092
  service="microsoft_graph",
2089
2093
  tls_profile=self.auth_manager.graph_tls_profile,
2090
2094
  tls_profile_ref=self.auth_manager.graph_tls_profile_ref,
2095
+ retry=upload_retry_policy(PRINT_UPLOAD_MAX_RETRIES),
2091
2096
  )
2092
2097
  transport = owned_transport
2093
2098
  uploader = UniversalPrintUploader(transport)
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "algorithm": "agent-connector-sdk:mcp-tool-contract-compat:v2",
3
- "connector": "microsoft-agent",
3
+ "connector": "microsoft-mcp",
4
4
  "schema_version": "1",
5
5
  "tools": {
6
6
  "list_microsoft_ingestion_projection": "828d3116067086b5bfc4aae2794b99f13adb50c15644a3d9eb15bd60ba0ba14b"
@@ -7,7 +7,6 @@ that are multiples of 320 KiB, as required by Graph.
7
7
 
8
8
  from __future__ import annotations
9
9
 
10
- import asyncio
11
10
  import json
12
11
  import re
13
12
  from collections.abc import Mapping
@@ -261,32 +260,23 @@ class GraphFileService:
261
260
  "Content-Range": f"bytes {start}-{end}/{total}",
262
261
  }
263
262
  # The preauthenticated upload URL must not receive the Graph bearer token.
264
- for attempt in range(self.settings.max_retries + 1):
265
- try:
266
- response = await self._transport.request(
267
- "PUT",
268
- upload_url,
269
- headers=headers,
270
- body=fragment,
271
- timeout=self.settings.timeout_seconds,
272
- )
273
- except (OSError, TimeoutError) as exc:
274
- if attempt >= self.settings.max_retries:
275
- raise GraphFileServiceError("Upload transport failed.") from exc
276
- await asyncio.sleep(min(2**attempt, 8))
277
- continue
278
- if response.status_code in {200, 201, 202}:
279
- return response
280
- if (
281
- response.status_code not in {429, 500, 502, 503, 504}
282
- or attempt >= self.settings.max_retries
283
- ):
284
- raise GraphFileServiceError(
285
- "Microsoft Graph rejected an upload fragment.",
286
- status_code=response.status_code,
287
- )
288
- await asyncio.sleep(_retry_delay(response, attempt))
289
- raise GraphFileServiceError("Upload fragment retry limit was exceeded.")
263
+ # The transport's SDK retry policy owns backoff and Retry-After handling.
264
+ try:
265
+ response = await self._transport.request(
266
+ "PUT",
267
+ upload_url,
268
+ headers=headers,
269
+ body=fragment,
270
+ timeout=self.settings.timeout_seconds,
271
+ )
272
+ except (OSError, TimeoutError) as exc:
273
+ raise GraphFileServiceError("Upload transport failed.") from exc
274
+ if response.status_code in {200, 201, 202}:
275
+ return response
276
+ raise GraphFileServiceError(
277
+ "Microsoft Graph rejected an upload fragment.",
278
+ status_code=response.status_code,
279
+ )
290
280
 
291
281
  async def _graph_request(
292
282
  self,
@@ -397,20 +387,3 @@ def _range_start(value: Any) -> int:
397
387
  if not isinstance(value, str) or not re.fullmatch(r"\d+-\d*", value):
398
388
  raise GraphFileServiceError("Graph returned an invalid expected range.")
399
389
  return int(value.partition("-")[0])
400
-
401
-
402
- def _retry_delay(response: HttpResponse, attempt: int) -> float:
403
- raw = next(
404
- (
405
- value
406
- for key, value in response.headers.items()
407
- if key.lower() == "retry-after"
408
- ),
409
- None,
410
- )
411
- try:
412
- return (
413
- min(max(float(raw), 0.0), 30.0) if raw is not None else min(2**attempt, 8)
414
- )
415
- except ValueError:
416
- return min(2**attempt, 8)
@@ -3,10 +3,11 @@
3
3
  from __future__ import annotations
4
4
 
5
5
  from functools import lru_cache
6
- from typing import Any, TypeVar
6
+ from typing import Any, TypeAlias, TypeVar
7
7
  from urllib.parse import urlparse
8
8
  from uuid import UUID
9
9
 
10
+ from agent_connector_sdk.http.retry import RetryPolicy
10
11
  from fastmcp import FastMCP
11
12
  from pydantic import Field
12
13
 
@@ -41,6 +42,7 @@ from microsoft_agent.power_platform import (
41
42
  FlowState,
42
43
  HttpxAsyncHttpTransport,
43
44
  PowerPlatformClient,
45
+ upload_retry_policy,
44
46
  )
45
47
  from microsoft_agent.settings import get_settings
46
48
  from microsoft_agent.windows_companion import (
@@ -52,7 +54,7 @@ from microsoft_agent.windows_companion import (
52
54
  WindowsCompanionClient,
53
55
  )
54
56
 
55
- _ManagedTransport = HttpxAsyncHttpTransport | HttpxCompanionTransport
57
+ _ManagedTransport: TypeAlias = HttpxAsyncHttpTransport | HttpxCompanionTransport
56
58
  _ManagedTransportT = TypeVar("_ManagedTransportT", bound=_ManagedTransport)
57
59
  _managed_transports: list[_ManagedTransport] = []
58
60
 
@@ -95,6 +97,7 @@ def _http_transport(
95
97
  tls_profile: str | None = None,
96
98
  tls_profile_ref: str | None = None,
97
99
  allowed_private_hosts: tuple[str, ...] = (),
100
+ retry: RetryPolicy | None = None,
98
101
  ) -> HttpxAsyncHttpTransport:
99
102
  return _manage_transport(
100
103
  HttpxAsyncHttpTransport(
@@ -102,6 +105,7 @@ def _http_transport(
102
105
  tls_profile=tls_profile,
103
106
  tls_profile_ref=tls_profile_ref,
104
107
  allowed_private_hosts=allowed_private_hosts,
108
+ retry=retry,
105
109
  )
106
110
  )
107
111
 
@@ -125,13 +129,15 @@ def _companion_transport(
125
129
  def _graph_file_service() -> GraphFileService:
126
130
  settings = get_settings()
127
131
  provider = MicrosoftAudienceTokenProvider([GRAPH_AUDIENCE])
132
+ file_settings = GraphFileSettings(graph_base_url=settings.graph_base_url)
128
133
  return GraphFileService(
129
- GraphFileSettings(graph_base_url=settings.graph_base_url),
134
+ file_settings,
130
135
  provider,
131
136
  _http_transport(
132
137
  service="microsoft_graph",
133
138
  tls_profile=settings.graph_tls_profile,
134
139
  tls_profile_ref=settings.graph_tls_profile_ref,
140
+ retry=upload_retry_policy(file_settings.max_retries),
135
141
  ),
136
142
  )
137
143
 
@@ -30,7 +30,7 @@ from agent_connector_sdk.credentials.runtime_references import (
30
30
  )
31
31
  from agent_connector_sdk.http.client import create_http_client
32
32
  from agent_connector_sdk.http.options import HttpClientOptions
33
- from agent_connector_sdk.http.retry import RetryPolicy
33
+ from agent_connector_sdk.http.retry import RETRYABLE_STATUSES, RetryPolicy
34
34
  from agent_connector_sdk.tls.profile import ResolvedTLSProfile
35
35
  from agent_connector_sdk.tls.resolve import resolve_tls_profile
36
36
  from pydantic import (
@@ -112,6 +112,22 @@ class AudienceTokenProvider(Protocol):
112
112
  """Return a bearer token whose ``aud`` claim matches ``audience``."""
113
113
 
114
114
 
115
+ #: Statuses an upload fragment retries; the SDK client applies them to PUT.
116
+ UPLOAD_RETRY_STATUSES = RETRYABLE_STATUSES | {500}
117
+
118
+
119
+ def upload_retry_policy(max_retries: int) -> RetryPolicy:
120
+ """SDK retry policy for resumable upload fragments (``max_retries`` retries)."""
121
+
122
+ return RetryPolicy(
123
+ max_attempts=max_retries + 1,
124
+ backoff_base=1.0,
125
+ max_backoff=8.0,
126
+ max_retry_after=30.0,
127
+ retry_statuses=UPLOAD_RETRY_STATUSES,
128
+ )
129
+
130
+
115
131
  class HttpxAsyncHttpTransport:
116
132
  """Bounded async facade over the shared verified sync HTTP boundary."""
117
133
 
@@ -124,6 +140,7 @@ class HttpxAsyncHttpTransport:
124
140
  allowed_private_hosts: tuple[str, ...] = (),
125
141
  max_response_bytes: int = 16 * 1024 * 1024,
126
142
  client: httpx.Client | None = None,
143
+ retry: RetryPolicy | None = None,
127
144
  ) -> None:
128
145
  if not 1_024 <= max_response_bytes <= 64 * 1024 * 1024:
129
146
  raise ValueError("HTTP response bound is invalid")
@@ -149,7 +166,7 @@ class HttpxAsyncHttpTransport:
149
166
  # Requests carry absolute URLs; the base is never dialed.
150
167
  base_url="https://pinned.invalid",
151
168
  timeout=httpx.Timeout(30.0),
152
- retry=RetryPolicy(max_attempts=1),
169
+ retry=retry or RetryPolicy(max_attempts=1),
153
170
  tls=self._tls,
154
171
  limits=httpx.Limits(
155
172
  max_connections=32,
@@ -8,7 +8,6 @@ Print upload origin and sends bounded sequential byte ranges.
8
8
 
9
9
  from __future__ import annotations
10
10
 
11
- import asyncio
12
11
  import base64
13
12
  import binascii
14
13
  import json
@@ -96,6 +95,10 @@ class PrintDocumentSubmission(BaseModel):
96
95
  return content
97
96
 
98
97
 
98
+ #: Retries the print upload transport applies to a failed range.
99
+ PRINT_UPLOAD_MAX_RETRIES = 3
100
+
101
+
99
102
  class UniversalPrintUploadError(RuntimeError):
100
103
  """Safe upload failure that never contains the preauthenticated URL."""
101
104
 
@@ -113,7 +116,6 @@ class UniversalPrintUploader:
113
116
  *,
114
117
  timeout_seconds: float = 60,
115
118
  chunk_bytes: int = PRINT_UPLOAD_CHUNK_BYTES,
116
- max_retries: int = 3,
117
119
  ) -> None:
118
120
  if not 0 < chunk_bytes < 10 * 1024 * 1024:
119
121
  raise ValueError("Universal Print chunks must be smaller than 10 MiB")
@@ -121,12 +123,9 @@ class UniversalPrintUploader:
121
123
  raise ValueError("Universal Print chunks must be multiples of 320 KiB")
122
124
  if not 0 < timeout_seconds <= 600:
123
125
  raise ValueError("timeout_seconds must be between 0 and 600")
124
- if not 0 <= max_retries <= 8:
125
- raise ValueError("max_retries must be between 0 and 8")
126
126
  self._transport = transport
127
127
  self.timeout_seconds = timeout_seconds
128
128
  self.chunk_bytes = chunk_bytes
129
- self.max_retries = max_retries
130
129
 
131
130
  async def upload(self, upload_url: str, content: bytes) -> dict[str, Any]:
132
131
  """Upload sequential ranges and return final printDocument metadata."""
@@ -192,31 +191,19 @@ class UniversalPrintUploader:
192
191
  "Content-Length": str(len(fragment)),
193
192
  "Content-Range": f"bytes {start}-{end}/{total}",
194
193
  }
195
- for attempt in range(self.max_retries + 1):
196
- try:
197
- response = await self._transport.request(
198
- "PUT",
199
- upload_url,
200
- headers=headers,
201
- body=fragment,
202
- timeout=self.timeout_seconds,
203
- )
204
- except (OSError, TimeoutError) as exc:
205
- if attempt >= self.max_retries:
206
- raise UniversalPrintUploadError(
207
- "Universal Print upload transport failed."
208
- ) from exc
209
- await asyncio.sleep(min(2**attempt, 8))
210
- continue
211
- if response.status_code in {201, 202}:
212
- return response
213
- if (
214
- response.status_code not in {429, 500, 502, 503, 504}
215
- or attempt >= self.max_retries
216
- ):
217
- return response
218
- await asyncio.sleep(_retry_delay(response, attempt))
219
- raise UniversalPrintUploadError("Universal Print retry limit was exceeded.")
194
+ # The transport's SDK retry policy owns backoff and Retry-After handling.
195
+ try:
196
+ return await self._transport.request(
197
+ "PUT",
198
+ upload_url,
199
+ headers=headers,
200
+ body=fragment,
201
+ timeout=self.timeout_seconds,
202
+ )
203
+ except (OSError, TimeoutError) as exc:
204
+ raise UniversalPrintUploadError(
205
+ "Universal Print upload transport failed."
206
+ ) from exc
220
207
 
221
208
 
222
209
  def validate_print_upload_url(value: Any) -> str:
@@ -269,24 +256,8 @@ def _range_start(value: Any) -> int:
269
256
  return int(value.partition("-")[0])
270
257
 
271
258
 
272
- def _retry_delay(response: HttpResponse, attempt: int) -> float:
273
- raw = next(
274
- (
275
- value
276
- for key, value in response.headers.items()
277
- if key.casefold() == "retry-after"
278
- ),
279
- None,
280
- )
281
- try:
282
- return (
283
- min(max(float(raw), 0.0), 30.0) if raw is not None else min(2**attempt, 8)
284
- )
285
- except ValueError:
286
- return min(2**attempt, 8)
287
-
288
-
289
259
  __all__ = [
260
+ "PRINT_UPLOAD_MAX_RETRIES",
290
261
  "MAX_PRINT_DOCUMENT_BYTES",
291
262
  "PRINT_UPLOAD_CHUNK_BYTES",
292
263
  "PRINT_UPLOAD_HOST",
@@ -60,6 +60,7 @@ from microsoft_agent.windows_runtime import (
60
60
  WindowsRuntimeLimits,
61
61
  WindowsServiceManager,
62
62
  WindowsToastNotificationAdapter,
63
+ build_client_tls_context,
63
64
  )
64
65
 
65
66
  try: # Core authentication dependency, guarded for library-only installs.
@@ -241,18 +242,18 @@ def validate_local_service_config(config: WindowsCompanionServiceConfig) -> None
241
242
  certificate_der = ssl.PEM_cert_to_DER_cert(certificate_pem)
242
243
  except ValueError as exc:
243
244
  raise ValueError("Client certificate is not valid PEM") from exc
244
- actual_thumbprint = hashlib.sha1(certificate_der).hexdigest().upper() # noqa: S324
245
+ actual_thumbprint = (
246
+ hashlib.sha1(certificate_der, usedforsecurity=False).hexdigest().upper()
247
+ )
245
248
  if not hmac.compare_digest(actual_thumbprint, certificate.thumbprint):
246
249
  raise ValueError("Client certificate fingerprint does not match configuration")
247
250
  password = _private_key_password(certificate)
248
- context = ssl.create_default_context(
249
- cafile=str(certificate.ca_bundle_path) if certificate.ca_bundle_path else None
250
- )
251
251
  try:
252
- context.load_cert_chain(
253
- certificate.client_certificate_path,
254
- certificate.client_private_key_path,
255
- password=password,
252
+ build_client_tls_context(
253
+ ca_bundle_path=certificate.ca_bundle_path,
254
+ client_certificate_path=certificate.client_certificate_path,
255
+ client_private_key_path=certificate.client_private_key_path,
256
+ private_key_password=password,
256
257
  )
257
258
  except (OSError, ssl.SSLError) as exc:
258
259
  raise ValueError(
@@ -21,7 +21,6 @@ import json
21
21
  import ntpath
22
22
  import os
23
23
  import sqlite3
24
- import ssl
25
24
  from collections.abc import Mapping
26
25
  from datetime import UTC, datetime, timedelta
27
26
  from pathlib import Path
@@ -69,6 +68,7 @@ from microsoft_agent.windows_runtime import (
69
68
  RelayActionDelivery,
70
69
  RelayPollBatch,
71
70
  WindowsRuntimeError,
71
+ build_client_tls_context,
72
72
  )
73
73
 
74
74
  try: # FastAPI is supplied by the MCP/agent runtime extras.
@@ -1235,15 +1235,12 @@ class HttpOutboundRelayTransport(OutboundRelayTransport):
1235
1235
  if not 1024 <= maximum_response_bytes <= 268_435_456:
1236
1236
  raise ValueError("maximum_response_bytes is outside the safe range")
1237
1237
  self._maximum_response_bytes = maximum_response_bytes
1238
- context = ssl.create_default_context(
1239
- cafile=str(ca_bundle_path) if ca_bundle_path else None
1238
+ context = build_client_tls_context(
1239
+ ca_bundle_path=ca_bundle_path,
1240
+ client_certificate_path=client_certificate_path,
1241
+ client_private_key_path=client_private_key_path,
1242
+ private_key_password=private_key_password,
1240
1243
  )
1241
- if client_certificate_path and client_private_key_path:
1242
- context.load_cert_chain(
1243
- certfile=str(client_certificate_path),
1244
- keyfile=str(client_private_key_path),
1245
- password=private_key_password,
1246
- )
1247
1244
  self._opener = build_opener(_NoRedirect(), HTTPSHandler(context=context))
1248
1245
 
1249
1246
  async def poll(
@@ -16,12 +16,14 @@ from __future__ import annotations
16
16
 
17
17
  import asyncio
18
18
  import base64
19
+ import contextlib
19
20
  import hashlib
20
21
  import json
21
22
  import ntpath
22
23
  import os
23
24
  import platform
24
25
  import socket
26
+ import ssl
25
27
  import stat
26
28
  import sys
27
29
  from collections import OrderedDict
@@ -30,6 +32,7 @@ from datetime import UTC, datetime
30
32
  from pathlib import Path, PureWindowsPath
31
33
  from typing import Any, Protocol, TypeVar, runtime_checkable
32
34
 
35
+ from agent_connector_sdk.tls.resolve import resolve_tls_profile
33
36
  from pydantic import BaseModel, ConfigDict, Field, field_validator
34
37
 
35
38
  from microsoft_agent.windows_companion import (
@@ -227,15 +230,11 @@ class PyWin32OfficeAutomation:
227
230
  return {"application": application, "exported": True}
228
231
  finally:
229
232
  if document is not None:
230
- try:
233
+ with contextlib.suppress(Exception): # defensive COM cleanup
231
234
  document.Close(False)
232
- except Exception: # pragma: no cover - defensive COM cleanup
233
- pass
234
235
  if app is not None:
235
- try:
236
+ with contextlib.suppress(Exception): # defensive COM cleanup
236
237
  app.Quit()
237
- except Exception: # pragma: no cover - defensive COM cleanup
238
- pass
239
238
  self._pythoncom.CoUninitialize()
240
239
 
241
240
 
@@ -1303,7 +1302,35 @@ def _installed_windows_software() -> list[dict[str, str]]:
1303
1302
  return sorted(found.values(), key=lambda item: item["name"].casefold())[:500]
1304
1303
 
1305
1304
 
1305
+ def build_client_tls_context(
1306
+ *,
1307
+ ca_bundle_path: str | os.PathLike[str] | None = None,
1308
+ client_certificate_path: str | os.PathLike[str] | None = None,
1309
+ client_private_key_path: str | os.PathLike[str] | None = None,
1310
+ private_key_password: str | None = None,
1311
+ ) -> ssl.SSLContext:
1312
+ """Return the verified client context for the control-plane connection.
1313
+
1314
+ Trust comes from the SDK TLS profile (``resolve_tls_profile``): a per-instance
1315
+ CA bundle is passed through the profile, otherwise the deployment's
1316
+ ``MICROSOFT_*`` trust profile applies. The client certificate is loaded onto
1317
+ that context here because the key password is a runtime value that a profile
1318
+ document may not carry.
1319
+ """
1320
+
1321
+ profile = {"ca_bundle_path": str(ca_bundle_path)} if ca_bundle_path else None
1322
+ context = resolve_tls_profile("microsoft", profile=profile).ssl_context
1323
+ if client_certificate_path and client_private_key_path:
1324
+ context.load_cert_chain(
1325
+ certfile=str(client_certificate_path),
1326
+ keyfile=str(client_private_key_path),
1327
+ password=private_key_password,
1328
+ )
1329
+ return context
1330
+
1331
+
1306
1332
  __all__ = [
1333
+ "build_client_tls_context",
1307
1334
  "ClipboardAdapter",
1308
1335
  "DesktopFlowExecutor",
1309
1336
  "NotificationAdapter",
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: microsoft-agent
3
- Version: 2.3.2
3
+ Version: 2.3.4
4
4
  Summary: Governed Microsoft Graph agent and MCP server
5
5
  Author-email: Project Maintainers <maintainers@users.noreply.github.com>
6
6
  License-Expression: MIT
@@ -11,7 +11,7 @@ Classifier: Programming Language :: Python :: 3
11
11
  Requires-Python: >=3.12
12
12
  Description-Content-Type: text/markdown
13
13
  License-File: LICENSE
14
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.6
14
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
15
15
  Requires-Dist: azure-core>=1.41.0
16
16
  Requires-Dist: httpx>=0.28.1
17
17
  Requires-Dist: keyring>=25.7.0
@@ -19,7 +19,7 @@ Requires-Dist: msal>=1.39.0
19
19
  Requires-Dist: msgraph-sdk>=1.64.0
20
20
  Requires-Dist: pydantic>=2.14.1
21
21
  Provides-Extra: mcp
22
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.6; extra == "mcp"
22
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
23
23
  Provides-Extra: documents
24
24
  Requires-Dist: python-docx>=1.2.0; extra == "documents"
25
25
  Requires-Dist: python-pptx>=1.0.2; extra == "documents"
@@ -71,7 +71,7 @@ Dynamic: license-file
71
71
  agent. It uses Agent Connector SDK for MCP, identity propagation, intent delegation,
72
72
  configuration, telemetry, and graph integration.
73
73
 
74
- Current package version: **2.3.2**
74
+ Current package version: **2.3.4**
75
75
 
76
76
  ## Capabilities
77
77
 
@@ -160,6 +160,7 @@ tests/test_auth_coverage.py
160
160
  tests/test_bug_cx_046_ctx_info_awaited.py
161
161
  tests/test_config_cli.py
162
162
  tests/test_credential_adapter.py
163
+ tests/test_default_content_surfaces.py
163
164
  tests/test_document_service.py
164
165
  tests/test_generate_code.py
165
166
  tests/test_graph_file_service.py
@@ -179,10 +180,12 @@ tests/test_office_manifest.py
179
180
  tests/test_onenote_sharepoint_print.py
180
181
  tests/test_placeholder.py
181
182
  tests/test_power_platform.py
183
+ tests/test_sdk_centralization.py
182
184
  tests/test_settings_and_policy.py
183
185
  tests/test_startup.py
184
186
  tests/test_teams_reliability.py
185
187
  tests/test_transport_migration.py
188
+ tests/test_transport_tls.py
186
189
  tests/test_verify_api_integration.py
187
190
  tests/test_windows_companion.py
188
191
  tests/test_windows_control_plane.py
@@ -1,3 +1,6 @@
1
+ [agent_connector_sdk.connector]
2
+ microsoft-mcp = microsoft_agent
3
+
1
4
  [agent_connector_sdk.ontology_providers]
2
5
  microsoft-agent = microsoft_agent.ontology
3
6
 
@@ -1,4 +1,4 @@
1
- agent-connector-sdk[mcp]<1.0.0,>=0.3.6
1
+ agent-connector-sdk[mcp]<1.0.0,>=0.3.18
2
2
  azure-core>=1.41.0
3
3
  httpx>=0.28.1
4
4
  keyring>=25.7.0
@@ -40,7 +40,7 @@ python-docx>=1.2.0
40
40
  python-pptx>=1.0.2
41
41
 
42
42
  [mcp]
43
- agent-connector-sdk[mcp]<1.0.0,>=0.3.6
43
+ agent-connector-sdk[mcp]<1.0.0,>=0.3.18
44
44
 
45
45
  [test]
46
46
  cryptography>=50.0.2
@@ -14,7 +14,7 @@ classifiers = [
14
14
  "Operating System :: OS Independent",
15
15
  "Programming Language :: Python :: 3",
16
16
  ]
17
- dependencies = [ "agent-connector-sdk[mcp]>=0.3.6,<1.0.0", "azure-core>=1.41.0", "httpx>=0.28.1", "keyring>=25.7.0", "msal>=1.39.0", "msgraph-sdk>=1.64.0", "pydantic>=2.14.1",]
17
+ dependencies = [ "agent-connector-sdk[mcp]>=0.3.18,<1.0.0", "azure-core>=1.41.0", "httpx>=0.28.1", "keyring>=25.7.0", "msal>=1.39.0", "msgraph-sdk>=1.64.0", "pydantic>=2.14.1",]
18
18
  license = "MIT"
19
19
 
20
20
  [[project.authors]]
@@ -22,7 +22,7 @@ name = "Project Maintainers"
22
22
  email = "maintainers@users.noreply.github.com"
23
23
 
24
24
  [project.optional-dependencies]
25
- mcp = [ "agent-connector-sdk[mcp]>=0.3.6,<1.0.0",]
25
+ mcp = [ "agent-connector-sdk[mcp]>=0.3.18,<1.0.0",]
26
26
  documents = ["python-docx>=1.2.0", "python-pptx>=1.0.2"]
27
27
  cloud = ["azure-identity>=1.26.0", "httpx>=0.28.1"]
28
28
  windows = [
@@ -96,6 +96,10 @@ dev = [
96
96
  "ruff>=0.17.1,<1",
97
97
  ]
98
98
 
99
+ # The one declared connector identity: the fleet name (SDK-CONNECTOR-CONTROL-R071).
100
+ [project.entry-points."agent_connector_sdk.connector"]
101
+ microsoft-mcp = "microsoft_agent"
102
+
99
103
  [tool.uv.workspace]
100
104
  members = ["."]
101
105