immich-api 0.2.2__tar.gz → 0.2.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 (192) hide show
  1. immich_api-0.2.4/.bumpversion.cfg +8 -0
  2. {immich_api-0.2.2 → immich_api-0.2.4}/.pre-commit-config.yaml +0 -12
  3. {immich_api-0.2.2/immich_api.egg-info → immich_api-0.2.4}/PKG-INFO +4 -4
  4. {immich_api-0.2.2 → immich_api-0.2.4}/docker/Dockerfile +1 -1
  5. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/__init__.py +8 -0
  6. immich_api-0.2.4/immich_api/connector_sources.py +123 -0
  7. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/mcp_server.py +9 -2
  8. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/ontology/immich.ttl +1 -1
  9. {immich_api-0.2.2 → immich_api-0.2.4/immich_api.egg-info}/PKG-INFO +4 -4
  10. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api.egg-info/SOURCES.txt +1 -8
  11. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api.egg-info/entry_points.txt +1 -4
  12. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api.egg-info/requires.txt +3 -3
  13. {immich_api-0.2.2 → immich_api-0.2.4}/pyproject.toml +6 -9
  14. {immich_api-0.2.2 → immich_api-0.2.4}/requirements.txt +1 -1
  15. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/bootstrap_environment.py +24 -0
  16. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/generate_immich_content.py +1 -54
  17. {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/status.json +3 -1
  18. {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/status.json +4 -4
  19. {immich_api-0.2.2 → immich_api-0.2.4}/tests/parity_support.py +3 -3
  20. immich_api-0.2.4/tests/test_default_content_surfaces.py +198 -0
  21. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_fleet_name.py +3 -11
  22. immich_api-0.2.4/tests/test_immich_content.py +44 -0
  23. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_kg_ingest.py +0 -30
  24. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_operation_parity.py +75 -11
  25. immich_api-0.2.2/.bumpversion.cfg +0 -12
  26. immich_api-0.2.2/immich_api/connector_manifest.yml +0 -212
  27. immich_api-0.2.2/immich_api/connectors/mcp_source_presets.json +0 -3
  28. immich_api-0.2.2/immich_api/connectors/tool_schema_fingerprints.json +0 -1
  29. immich_api-0.2.2/scripts/generate_tool_schemas.py +0 -100
  30. immich_api-0.2.2/scripts/generated_schema_clones.py +0 -163
  31. immich_api-0.2.2/scripts/verify_generated_schemas.py +0 -111
  32. immich_api-0.2.2/tests/test_default_content_surfaces.py +0 -43
  33. immich_api-0.2.2/tests/test_generated_schema_policy.py +0 -159
  34. immich_api-0.2.2/tests/test_immich_content.py +0 -149
  35. immich_api-0.2.2/tests/test_source_image.py +0 -24
  36. {immich_api-0.2.2 → immich_api-0.2.4}/.config/spec-dashboard.json +0 -0
  37. {immich_api-0.2.2 → immich_api-0.2.4}/.github/workflows/connector-pr.yml +0 -0
  38. {immich_api-0.2.2 → immich_api-0.2.4}/.github/workflows/pages.yml +0 -0
  39. {immich_api-0.2.2 → immich_api-0.2.4}/.github/workflows/pipeline.yml +0 -0
  40. {immich_api-0.2.2 → immich_api-0.2.4}/.github/workflows/scanners.yml +0 -0
  41. {immich_api-0.2.2 → immich_api-0.2.4}/.github/workflows/windows-ci.yml +0 -0
  42. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/provenance.json +0 -0
  43. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/scripts/sync_mkdocs_theme.py +0 -0
  44. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/README.md +0 -0
  45. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-connector-sdk-logo-v1.png +0 -0
  46. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-terminal-ui-logo-v1.png +0 -0
  47. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-utilities-logo-v1.png +0 -0
  48. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/agent-webui-logo-v1.png +0 -0
  49. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/epistemic-graph-logo-v1.png +0 -0
  50. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/geniusbot-logo-v1.png +0 -0
  51. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/brands/graph-os-logo-v1.png +0 -0
  52. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/favicon.svg +0 -0
  53. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/graph-mark.svg +0 -0
  54. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/runtime-architecture.mmd +0 -0
  55. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/assets/runtime-architecture.svg +0 -0
  56. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/base.mkdocs.yml +0 -0
  57. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/extra.css +0 -0
  58. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/glossary.md +0 -0
  59. {immich_api-0.2.2 → immich_api-0.2.4}/.pipeline-theme/templates/mkdocs-theme/overrides/main.html +0 -0
  60. {immich_api-0.2.2 → immich_api-0.2.4}/LICENSE +0 -0
  61. {immich_api-0.2.2 → immich_api-0.2.4}/MANIFEST.in +0 -0
  62. {immich_api-0.2.2 → immich_api-0.2.4}/README.md +0 -0
  63. {immich_api-0.2.2 → immich_api-0.2.4}/docker/debug.Dockerfile +0 -0
  64. {immich_api-0.2.2 → immich_api-0.2.4}/docker/mcp.compose.yml +0 -0
  65. {immich_api-0.2.2 → immich_api-0.2.4}/docker/starship.toml +0 -0
  66. {immich_api-0.2.2 → immich_api-0.2.4}/docs/agent-readiness.json +0 -0
  67. {immich_api-0.2.2 → immich_api-0.2.4}/docs/agent-readiness.schema.json +0 -0
  68. {immich_api-0.2.2 → immich_api-0.2.4}/docs/architecture.md +0 -0
  69. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/agent-connector-sdk-logo-v1.png +0 -0
  70. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/agent-terminal-ui-logo-v1.png +0 -0
  71. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/agent-utilities-logo-v1.png +0 -0
  72. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/agent-webui-logo-v1.png +0 -0
  73. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/epistemic-graph-logo-v1.png +0 -0
  74. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/geniusbot-logo-v1.png +0 -0
  75. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/brands/graph-os-logo-v1.png +0 -0
  76. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/favicon.svg +0 -0
  77. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/graph-mark.svg +0 -0
  78. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/runtime-architecture.mmd +0 -0
  79. {immich_api-0.2.2 → immich_api-0.2.4}/docs/assets/runtime-architecture.svg +0 -0
  80. {immich_api-0.2.2 → immich_api-0.2.4}/docs/capabilities/api.json +0 -0
  81. {immich_api-0.2.2 → immich_api-0.2.4}/docs/capabilities/mcp.json +0 -0
  82. {immich_api-0.2.2 → immich_api-0.2.4}/docs/concepts.md +0 -0
  83. {immich_api-0.2.2 → immich_api-0.2.4}/docs/deployment.md +0 -0
  84. {immich_api-0.2.2 → immich_api-0.2.4}/docs/glossary.md +0 -0
  85. {immich_api-0.2.2 → immich_api-0.2.4}/docs/immich-capabilities.md +0 -0
  86. {immich_api-0.2.2 → immich_api-0.2.4}/docs/index.md +0 -0
  87. {immich_api-0.2.2 → immich_api-0.2.4}/docs/installation.md +0 -0
  88. {immich_api-0.2.2 → immich_api-0.2.4}/docs/openapi-parity.md +0 -0
  89. {immich_api-0.2.2 → immich_api-0.2.4}/docs/overview.md +0 -0
  90. {immich_api-0.2.2 → immich_api-0.2.4}/docs/platform.md +0 -0
  91. {immich_api-0.2.2 → immich_api-0.2.4}/docs/spec-delivery.md +0 -0
  92. {immich_api-0.2.2 → immich_api-0.2.4}/docs/stylesheets/extra.css +0 -0
  93. {immich_api-0.2.2 → immich_api-0.2.4}/docs/usage.md +0 -0
  94. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/__main__.py +0 -0
  95. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/album_metadata.py +0 -0
  96. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/api/__init__.py +0 -0
  97. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/api/api_client_system.py +0 -0
  98. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/auth.py +0 -0
  99. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/connectors/__init__.py +0 -0
  100. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/error_authority.py +0 -0
  101. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/error_rendering.py +0 -0
  102. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/immich_input_models.py +0 -0
  103. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/immich_response_models.py +0 -0
  104. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/kg_ingest.py +0 -0
  105. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/mcp/__init__.py +0 -0
  106. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/mcp/album_sample.py +0 -0
  107. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/mcp_config.json +0 -0
  108. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/ontology/__init__.py +0 -0
  109. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/ontology/schema-provenance.json +0 -0
  110. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/ontology/shapes/immich.ttl +0 -0
  111. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_auth_scheme.py +0 -0
  112. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_contract.json +0 -0
  113. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_execution.py +0 -0
  114. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_inventory.json +0 -0
  115. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_request.py +0 -0
  116. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_response.py +0 -0
  117. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/openapi_runtime.py +0 -0
  118. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/__init__.py +0 -0
  119. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/check_openapi_parity.py +0 -0
  120. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_discovery.py +0 -0
  121. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_parity.py +0 -0
  122. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_provider_evidence.py +0 -0
  123. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_provider_overlay.py +0 -0
  124. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_provider_responses.py +0 -0
  125. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_schema.py +0 -0
  126. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_schema_budget.py +0 -0
  127. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_schema_inputs.py +0 -0
  128. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_schema_types.py +0 -0
  129. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_security.py +0 -0
  130. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_source_parity.py +0 -0
  131. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/openapi_transport_parity.py +0 -0
  132. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/unicode_patterns.py +0 -0
  133. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/parity/unicode_properties.json +0 -0
  134. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/__init__.py +0 -0
  135. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/immich_album_review.json +0 -0
  136. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/immich_asset_metadata.json +0 -0
  137. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/immich_person_record.json +0 -0
  138. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/immich_specialist.json +0 -0
  139. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/prompts/main_agent.json +0 -0
  140. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/skills/__init__.py +0 -0
  141. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/skills/immich-album-review/SKILL.md +0 -0
  142. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/skills/immich-asset-metadata/SKILL.md +0 -0
  143. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/skills/immich-health/SKILL.md +0 -0
  144. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api/skills/immich-person-record/SKILL.md +0 -0
  145. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api.egg-info/dependency_links.txt +0 -0
  146. {immich_api-0.2.2 → immich_api-0.2.4}/immich_api.egg-info/top_level.txt +0 -0
  147. {immich_api-0.2.2 → immich_api-0.2.4}/mkdocs.yml +0 -0
  148. {immich_api-0.2.2 → immich_api-0.2.4}/pytest.ini +0 -0
  149. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/agent_readiness_tck.py +0 -0
  150. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/bootstrap.sh +0 -0
  151. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/bootstrap_sources.py +0 -0
  152. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/check_connector_contract.py +0 -0
  153. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/check_import_safety.py +0 -0
  154. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/check_workspace_source_drift.py +0 -0
  155. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/generate_agent_readiness.py +0 -0
  156. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/measure_operation_parity.py +0 -0
  157. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/reviewed_secret_history.py +0 -0
  158. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/security_sanitizer.py +0 -0
  159. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/select_python.py +0 -0
  160. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/upstream_evidence.py +0 -0
  161. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/verify_api_integration.py +0 -0
  162. {immich_api-0.2.2 → immich_api-0.2.4}/scripts/workspace_sources.py +0 -0
  163. {immich_api-0.2.2 → immich_api-0.2.4}/setup.cfg +0 -0
  164. {immich_api-0.2.2 → immich_api-0.2.4}/specs/README.md +0 -0
  165. {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/plan.md +0 -0
  166. {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/requirements.md +0 -0
  167. {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/spec.md +0 -0
  168. {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/tasks.md +0 -0
  169. {immich_api-0.2.2 → immich_api-0.2.4}/specs/connector-content/test-spec.md +0 -0
  170. {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/plan.md +0 -0
  171. {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/requirements.md +0 -0
  172. {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/spec.md +0 -0
  173. {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/tasks.md +0 -0
  174. {immich_api-0.2.2 → immich_api-0.2.4}/specs/immich-api/test-spec.md +0 -0
  175. {immich_api-0.2.2 → immich_api-0.2.4}/tests/__init__.py +0 -0
  176. {immich_api-0.2.2 → immich_api-0.2.4}/tests/conftest.py +0 -0
  177. {immich_api-0.2.2 → immich_api-0.2.4}/tests/fixtures/native-client-budget.json +0 -0
  178. {immich_api-0.2.2 → immich_api-0.2.4}/tests/fixtures/operation-cases.json +0 -0
  179. {immich_api-0.2.2 → immich_api-0.2.4}/tests/operation_fixtures.py +0 -0
  180. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_album_metadata.py +0 -0
  181. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_api_wrapper.py +0 -0
  182. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_auth.py +0 -0
  183. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_concept_parity.py +0 -0
  184. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_error_authority.py +0 -0
  185. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_immich_mcp_validation.py +0 -0
  186. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_init_dynamics.py +0 -0
  187. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_oauth_redirect_response.py +0 -0
  188. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_openapi_auth_provider.py +0 -0
  189. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_reviewed_secret_history.py +0 -0
  190. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_session_auth_isolation.py +0 -0
  191. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_startup.py +0 -0
  192. {immich_api-0.2.2 → immich_api-0.2.4}/tests/test_upstream_evidence.py +0 -0
@@ -0,0 +1,8 @@
1
+ [bumpversion]
2
+ current_version = 0.2.4
3
+ commit = True
4
+ tag = True
5
+
6
+ [bumpversion:file:pyproject.toml]
7
+ search = version = "{current_version}"
8
+ replace = version = "{new_version}"
@@ -20,12 +20,6 @@ repos:
20
20
  stages: [pre-push]
21
21
  - id: kiss-census
22
22
  stages: [pre-push]
23
- - id: jscpd-differential
24
- entry: python scripts/generated_schema_clones.py differential
25
- stages: [pre-push]
26
- - id: jscpd-census
27
- entry: python scripts/generated_schema_clones.py census
28
- stages: [pre-push]
29
23
  - id: public-surface
30
24
  - id: security-sanitizer
31
25
  - id: secret-history
@@ -72,12 +66,6 @@ repos:
72
66
  language: system
73
67
  pass_filenames: false
74
68
  always_run: true
75
- - id: connector-tool-schemas
76
- name: Live SDK input and output schema contracts
77
- entry: python scripts/generate_tool_schemas.py --check
78
- language: system
79
- pass_filenames: false
80
- always_run: true
81
69
  - id: pytest
82
70
  name: Generated connector contracts
83
71
  entry: python -m pytest tests -q
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: immich-api
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Immich Api API + MCP Server
5
5
  Author: Repository Maintainers
6
6
  License: MIT
@@ -16,11 +16,11 @@ Requires-Dist: rfc3986-validator<0.2,>=0.1.1
16
16
  Requires-Dist: rfc3339-validator<0.2,>=0.1.4
17
17
  Requires-Dist: jsonschema<5,>=4.23
18
18
  Requires-Dist: regex>=2026.9.29
19
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
19
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5
20
20
  Provides-Extra: mcp
21
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
21
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5; extra == "mcp"
22
22
  Provides-Extra: all
23
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "all"
23
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5; extra == "all"
24
24
  Provides-Extra: test
25
25
  Requires-Dist: pytest-xdist>=3.6.0; extra == "test"
26
26
  Requires-Dist: pytest; extra == "test"
@@ -20,7 +20,7 @@ ENV HOST=${HOST} \
20
20
  XDG_CONFIG_HOME=/tmp/.config \
21
21
  XDG_CACHE_HOME=/tmp/.cache
22
22
  # Fixed identity for least-privilege runtime and stable volume ownership.
23
- RUN pip install --only-binary :all: immich-api[mcp]==0.2.2 \
23
+ RUN pip install --only-binary :all: immich-api[mcp]==0.2.3 \
24
24
  && groupadd --system --gid 10001 app \
25
25
  && useradd --system --uid 10001 --gid 10001 --no-create-home \
26
26
  --home-dir /tmp --shell /usr/sbin/nologin app
@@ -52,3 +52,11 @@ for module_name, extra_name in OPTIONAL_MODULES.items():
52
52
  globals()[f"_{extra_name.upper()}_AVAILABLE"] = False
53
53
 
54
54
  __all__.extend(["_MCP_AVAILABLE"])
55
+
56
+
57
+ from agent_connector_sdk.connector import Connector
58
+
59
+ connector = Connector(
60
+ tools="immich_api.mcp",
61
+ instructions="Immich Api API + MCP Server",
62
+ )
@@ -0,0 +1,123 @@
1
+ """Data sources of this connector, declared by tool name (generated by connector-ontology-map migrate).
2
+
3
+ Served live as ``connector://resources``. Regenerate by editing the declarations, not the tools.
4
+ """
5
+
6
+ # ruff: noqa: E501
7
+ from __future__ import annotations
8
+
9
+ from typing import Any
10
+
11
+ CONNECTOR: str = "immich"
12
+
13
+ SOURCES: tuple[Any, ...] = ()
14
+
15
+ SCHEMA_MAPPINGS: dict[str, Any] = {
16
+ "ImmichAlbum": {
17
+ "fields": {
18
+ "immichAlbumAlbumName": "xsd:string",
19
+ "immichAlbumAlbumThumbnailAssetId": "xsd:string",
20
+ "immichAlbumAssetCount": "xsd:integer",
21
+ "immichAlbumCreatedAt": "xsd:dateTime",
22
+ "immichAlbumHasSharedLink": "xsd:boolean",
23
+ "immichAlbumId": "xsd:string",
24
+ "immichAlbumShared": "xsd:boolean",
25
+ "immichAlbumUpdatedAt": "xsd:dateTime",
26
+ },
27
+ "ontology_class": "ImmichAlbum",
28
+ },
29
+ "ImmichAlbumMembership": {
30
+ "fields": {
31
+ "immichAlbumMembershipRole": "xsd:string",
32
+ },
33
+ "ontology_class": "ImmichAlbumMembership",
34
+ },
35
+ "ImmichAsset": {
36
+ "fields": {
37
+ "immichAssetDuration": "xsd:integer",
38
+ "immichAssetFileCreatedAt": "xsd:dateTime",
39
+ "immichAssetHeight": "xsd:integer",
40
+ "immichAssetId": "xsd:string",
41
+ "immichAssetIsArchived": "xsd:boolean",
42
+ "immichAssetIsFavorite": "xsd:boolean",
43
+ "immichAssetIsTrashed": "xsd:boolean",
44
+ "immichAssetOriginalMimeType": "xsd:string",
45
+ "immichAssetType": "xsd:string",
46
+ "immichAssetUpdatedAt": "xsd:dateTime",
47
+ "immichAssetVisibility": "xsd:string",
48
+ "immichAssetWidth": "xsd:integer",
49
+ },
50
+ "ontology_class": "ImmichAsset",
51
+ },
52
+ "ImmichAssetStack": {
53
+ "fields": {
54
+ "immichAssetStackAssetCount": "xsd:integer",
55
+ "immichAssetStackId": "xsd:string",
56
+ "immichAssetStackPrimaryAssetId": "xsd:string",
57
+ },
58
+ "ontology_class": "ImmichAssetStack",
59
+ },
60
+ "ImmichLibrary": {
61
+ "fields": {
62
+ "immichLibraryAssetCount": "xsd:integer",
63
+ "immichLibraryCreatedAt": "xsd:dateTime",
64
+ "immichLibraryId": "xsd:string",
65
+ "immichLibraryName": "xsd:string",
66
+ "immichLibraryUpdatedAt": "xsd:dateTime",
67
+ },
68
+ "ontology_class": "ImmichLibrary",
69
+ },
70
+ "ImmichPersonRecord": {
71
+ "fields": {
72
+ "immichPersonRecordId": "xsd:string",
73
+ "immichPersonRecordIsFavorite": "xsd:boolean",
74
+ "immichPersonRecordIsHidden": "xsd:boolean",
75
+ "immichPersonRecordName": "xsd:string",
76
+ "immichPersonRecordUpdatedAt": "xsd:dateTime",
77
+ },
78
+ "ontology_class": "ImmichPersonRecord",
79
+ },
80
+ "ImmichTag": {
81
+ "fields": {
82
+ "immichTagCreatedAt": "xsd:dateTime",
83
+ "immichTagId": "xsd:string",
84
+ "immichTagName": "xsd:string",
85
+ "immichTagUpdatedAt": "xsd:dateTime",
86
+ },
87
+ "ontology_class": "ImmichTag",
88
+ },
89
+ "ImmichUser": {
90
+ "fields": {
91
+ "immichUserId": "xsd:string",
92
+ "immichUserName": "xsd:string",
93
+ },
94
+ "ontology_class": "ImmichUser",
95
+ },
96
+ }
97
+
98
+ RESOURCES: tuple[dict[str, str], ...] = (
99
+ {
100
+ "name": "ImmichAsset",
101
+ },
102
+ {
103
+ "name": "ImmichAlbum",
104
+ },
105
+ {
106
+ "name": "ImmichPersonRecord",
107
+ },
108
+ {
109
+ "name": "ImmichUser",
110
+ },
111
+ {
112
+ "name": "ImmichLibrary",
113
+ },
114
+ {
115
+ "name": "ImmichAlbumMembership",
116
+ },
117
+ {
118
+ "name": "ImmichTag",
119
+ },
120
+ {
121
+ "name": "ImmichAssetStack",
122
+ },
123
+ )
@@ -1,22 +1,29 @@
1
1
  import sys
2
+ from pathlib import Path
2
3
 
3
4
  from agent_connector_sdk.config import load_config
5
+ from agent_connector_sdk.connector_identity import connector_version
6
+ from agent_connector_sdk.mcp.content import ConnectorContent
4
7
  from agent_connector_sdk.mcp.server import create_mcp_server
5
8
  from agent_connector_sdk.mcp.tool_surface import register_tool_surface
6
9
 
7
10
  from . import mcp as tool_modules
8
11
 
9
- __version__ = "0.1.0"
12
+ __version__ = connector_version("immich_api")
10
13
 
11
14
 
12
15
  def get_mcp_instance(*, command_args=None):
13
16
  """Construct one SDK-governed server and its native package content."""
14
17
  load_config()
18
+ package_version = connector_version("immich_api")
15
19
  args, mcp, middlewares = create_mcp_server(
16
20
  name="Immich Api",
17
- version=__version__,
21
+ version=package_version,
18
22
  instructions="Immich Api API + MCP Server",
19
23
  command_args=command_args,
24
+ content=ConnectorContent.for_package(
25
+ "immich_api", Path(__file__).resolve().parent, package_version
26
+ ),
20
27
  )
21
28
  register_tool_surface(mcp, service="immich-api", tools_module=tool_modules)
22
29
  for middleware in middlewares:
@@ -8,7 +8,7 @@
8
8
 
9
9
  <urn:sha256:7db8383741eeb5c5c8c87a6221cd1cdd1206c8b1190b83363c64223a00bb020b> a prov:Entity ; rdfs:label "Immich 3.2.2 OpenAPI source bytes" .
10
10
 
11
- <http://knuckles.team/kg/immich> a owl:Ontology ; owl:imports <http://knuckles.team/kg> ; prov:wasDerivedFrom <urn:sha256:7db8383741eeb5c5c8c87a6221cd1cdd1206c8b1190b83363c64223a00bb020b> ; rdfs:comment "Selected structural DTO model. No live ingestion or identity equivalence is asserted." .
11
+ <http://knuckles.team/kg/immich> a owl:Ontology ; prov:wasDerivedFrom <urn:sha256:7db8383741eeb5c5c8c87a6221cd1cdd1206c8b1190b83363c64223a00bb020b> ; rdfs:comment "Selected structural DTO model. No live ingestion or identity equivalence is asserted." .
12
12
 
13
13
  :ImmichAsset a owl:Class ; rdfs:comment "Structural projection of AssetResponseDto." ; prov:wasDerivedFrom <urn:sha256:7db8383741eeb5c5c8c87a6221cd1cdd1206c8b1190b83363c64223a00bb020b#/components/schemas/AssetResponseDto> .
14
14
 
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: immich-api
3
- Version: 0.2.2
3
+ Version: 0.2.4
4
4
  Summary: Immich Api API + MCP Server
5
5
  Author: Repository Maintainers
6
6
  License: MIT
@@ -16,11 +16,11 @@ Requires-Dist: rfc3986-validator<0.2,>=0.1.1
16
16
  Requires-Dist: rfc3339-validator<0.2,>=0.1.4
17
17
  Requires-Dist: jsonschema<5,>=4.23
18
18
  Requires-Dist: regex>=2026.9.29
19
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18
19
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5
20
20
  Provides-Extra: mcp
21
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "mcp"
21
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5; extra == "mcp"
22
22
  Provides-Extra: all
23
- Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.3.18; extra == "all"
23
+ Requires-Dist: agent-connector-sdk[mcp]<1.0.0,>=0.5.5; extra == "all"
24
24
  Provides-Extra: test
25
25
  Requires-Dist: pytest-xdist>=3.6.0; extra == "test"
26
26
  Requires-Dist: pytest; extra == "test"
@@ -67,7 +67,7 @@ immich_api/__init__.py
67
67
  immich_api/__main__.py
68
68
  immich_api/album_metadata.py
69
69
  immich_api/auth.py
70
- immich_api/connector_manifest.yml
70
+ immich_api/connector_sources.py
71
71
  immich_api/error_authority.py
72
72
  immich_api/error_rendering.py
73
73
  immich_api/immich_input_models.py
@@ -91,8 +91,6 @@ immich_api.egg-info/top_level.txt
91
91
  immich_api/api/__init__.py
92
92
  immich_api/api/api_client_system.py
93
93
  immich_api/connectors/__init__.py
94
- immich_api/connectors/mcp_source_presets.json
95
- immich_api/connectors/tool_schema_fingerprints.json
96
94
  immich_api/mcp/__init__.py
97
95
  immich_api/mcp/album_sample.py
98
96
  immich_api/ontology/__init__.py
@@ -135,15 +133,12 @@ scripts/check_import_safety.py
135
133
  scripts/check_workspace_source_drift.py
136
134
  scripts/generate_agent_readiness.py
137
135
  scripts/generate_immich_content.py
138
- scripts/generate_tool_schemas.py
139
- scripts/generated_schema_clones.py
140
136
  scripts/measure_operation_parity.py
141
137
  scripts/reviewed_secret_history.py
142
138
  scripts/security_sanitizer.py
143
139
  scripts/select_python.py
144
140
  scripts/upstream_evidence.py
145
141
  scripts/verify_api_integration.py
146
- scripts/verify_generated_schemas.py
147
142
  scripts/workspace_sources.py
148
143
  specs/README.md
149
144
  specs/connector-content/plan.md
@@ -169,7 +164,6 @@ tests/test_concept_parity.py
169
164
  tests/test_default_content_surfaces.py
170
165
  tests/test_error_authority.py
171
166
  tests/test_fleet_name.py
172
- tests/test_generated_schema_policy.py
173
167
  tests/test_immich_content.py
174
168
  tests/test_immich_mcp_validation.py
175
169
  tests/test_init_dynamics.py
@@ -179,7 +173,6 @@ tests/test_openapi_auth_provider.py
179
173
  tests/test_operation_parity.py
180
174
  tests/test_reviewed_secret_history.py
181
175
  tests/test_session_auth_isolation.py
182
- tests/test_source_image.py
183
176
  tests/test_startup.py
184
177
  tests/test_upstream_evidence.py
185
178
  tests/fixtures/native-client-budget.json
@@ -1,5 +1,5 @@
1
1
  [agent_connector_sdk.connector]
2
- immich = immich_api
2
+ immich = immich_api:connector
3
3
 
4
4
  [agent_utilities.ontology_providers]
5
5
  immich-api = immich_api.ontology
@@ -10,8 +10,5 @@ immich-api = immich_api.prompts
10
10
  [agent_utilities.skill_providers]
11
11
  immich-api = immich_api.skills
12
12
 
13
- [agent_utilities.source_connector_providers]
14
- immich-api = immich_api.connectors
15
-
16
13
  [console_scripts]
17
14
  immich-mcp = immich_api.mcp_server:mcp_server
@@ -2,13 +2,13 @@ rfc3986-validator<0.2,>=0.1.1
2
2
  rfc3339-validator<0.2,>=0.1.4
3
3
  jsonschema<5,>=4.23
4
4
  regex>=2026.9.29
5
- agent-connector-sdk[mcp]<1.0.0,>=0.3.18
5
+ agent-connector-sdk[mcp]<1.0.0,>=0.5.5
6
6
 
7
7
  [all]
8
- agent-connector-sdk[mcp]<1.0.0,>=0.3.18
8
+ agent-connector-sdk[mcp]<1.0.0,>=0.5.5
9
9
 
10
10
  [mcp]
11
- agent-connector-sdk[mcp]<1.0.0,>=0.3.18
11
+ agent-connector-sdk[mcp]<1.0.0,>=0.5.5
12
12
 
13
13
  [test]
14
14
  pytest-xdist>=3.6.0
@@ -4,7 +4,7 @@ build-backend = "setuptools.build_meta"
4
4
 
5
5
  [project]
6
6
  name = "immich-api"
7
- version = "0.2.2"
7
+ version = "0.2.4"
8
8
  description = "Immich Api API + MCP Server"
9
9
  readme = "README.md"
10
10
  classifiers = [ "Development Status :: 4 - Beta", "License :: OSI Approved :: MIT License", "Environment :: Console", "Operating System :: POSIX :: Linux", "Programming Language :: Python :: 3",]
@@ -14,7 +14,7 @@ dependencies = [
14
14
  "rfc3339-validator>=0.1.4,<0.2",
15
15
  "jsonschema>=4.23,<5",
16
16
  "regex>=2026.9.29",
17
- "agent-connector-sdk[mcp]>=0.3.18,<1.0.0",
17
+ "agent-connector-sdk[mcp]>=0.5.5,<1.0.0",
18
18
  ]
19
19
  [[project.authors]]
20
20
  name = "Repository Maintainers"
@@ -23,9 +23,9 @@ name = "Repository Maintainers"
23
23
  text = "MIT"
24
24
 
25
25
  [project.optional-dependencies]
26
- mcp = [ "agent-connector-sdk[mcp]>=0.3.18,<1.0.0",]
26
+ mcp = [ "agent-connector-sdk[mcp]>=0.5.5,<1.0.0",]
27
27
  all = [
28
- "agent-connector-sdk[mcp]>=0.3.18,<1.0.0",
28
+ "agent-connector-sdk[mcp]>=0.5.5,<1.0.0",
29
29
  ]
30
30
  test = [
31
31
  "pytest-xdist>=3.6.0", "pytest", "pytest-asyncio", "pytest-cov",]
@@ -46,12 +46,9 @@ immich-api = "immich_api.prompts"
46
46
  [project.entry-points."agent_utilities.ontology_providers"]
47
47
  immich-api = "immich_api.ontology"
48
48
 
49
- [project.entry-points."agent_utilities.source_connector_providers"]
50
- immich-api = "immich_api.connectors"
51
-
52
49
  # The one declared connector identity: the fleet name (SDK-CONNECTOR-CONTROL-R071).
53
50
  [project.entry-points."agent_connector_sdk.connector"]
54
- immich = "immich_api"
51
+ immich = "immich_api:connector"
55
52
 
56
53
  [tool.uv.workspace]
57
54
  members = ["."]
@@ -87,7 +84,7 @@ dev = [
87
84
  ]
88
85
 
89
86
  [tool.setuptools.package-data]
90
- immich_api = [ "openapi_inventory.json", "parity/unicode_properties.json", "openapi_contract.json", "mcp_config.json", "prompts/**", "skills/**", "ontology/**", "connectors/**", "connector_manifest.yml",]
87
+ immich_api = [ "openapi_inventory.json", "parity/unicode_properties.json", "openapi_contract.json", "mcp_config.json", "prompts/**", "skills/**", "ontology/**", "connectors/**", ]
91
88
 
92
89
  [tool.ruff.lint]
93
90
  select = [ "E", "F", "I", "UP", "B",]
@@ -1,3 +1,3 @@
1
1
  jsonschema>=4.23,<5
2
2
  regex>=2026.9.29
3
- agent-connector-sdk>=0.1.0,<1
3
+ agent-connector-sdk>=0.4.1,<1
@@ -45,6 +45,22 @@ def sync_commands(uv, python, bindings, *, root):
45
45
  ]
46
46
 
47
47
 
48
+ def install_project(root, python, uv, *, env):
49
+ """Install editable project metadata without resolving source dependencies."""
50
+ command = [
51
+ uv,
52
+ "pip",
53
+ "install",
54
+ "--python",
55
+ str(python),
56
+ "--no-deps",
57
+ "--editable",
58
+ str(root),
59
+ ]
60
+ subprocess.run(command, cwd=root, env=env, check=True)
61
+ return command
62
+
63
+
48
64
  def add_source_paths(root, python, sources, *, env):
49
65
  purelib = Path(
50
66
  run(
@@ -79,6 +95,10 @@ def inspect_environment(root, python, *, bindings, sources, env):
79
95
  probe = """
80
96
  import importlib, importlib.metadata, json, pathlib, sys
81
97
  expected = json.loads(sys.argv[1])
98
+ project = json.loads(sys.argv[3])
99
+ distribution = importlib.metadata.distribution(project["name"])
100
+ if distribution.version != project["version"]:
101
+ raise ValueError("Installed project metadata differs from reviewed pyproject.toml")
82
102
  prefix = pathlib.Path(sys.prefix).resolve()
83
103
  if prefix != pathlib.Path(sys.argv[2]).resolve():
84
104
  raise ValueError('Unexpected interpreter environment')
@@ -103,6 +123,9 @@ print(json.dumps({'executable': sys.executable, 'python': sys.version, 'source_i
103
123
  probe,
104
124
  json.dumps(expected),
105
125
  str(root / ".ci/connector-venv"),
126
+ json.dumps(
127
+ tomllib.loads((root / "pyproject.toml").read_text())["project"]
128
+ ),
106
129
  ],
107
130
  root=root,
108
131
  env=env,
@@ -189,6 +212,7 @@ def prepare(root, *, uv="uv", github=False):
189
212
  / "connector-venv"
190
213
  / ("Scripts/python.exe" if os.name == "nt" else "bin/python")
191
214
  )
215
+ commands.append(install_project(root, python, uv, env=env))
192
216
  add_source_paths(root, python, sources, env=env)
193
217
  environment = inspect_environment(
194
218
  root, python, bindings=bindings, sources=sources, env=env
@@ -81,7 +81,7 @@ def artifacts():
81
81
  f'<{source}> a prov:Entity ; rdfs:label "Immich 3.2.2 OpenAPI source bytes" .\n',
82
82
  ]
83
83
  ontology.append(
84
- f'<http://knuckles.team/kg/immich> a owl:Ontology ; owl:imports <http://knuckles.team/kg> ; prov:wasDerivedFrom <{source}> ; rdfs:comment "Selected structural DTO model. No live ingestion or identity equivalence is asserted." .\n'
84
+ f'<http://knuckles.team/kg/immich> a owl:Ontology ; prov:wasDerivedFrom <{source}> ; rdfs:comment "Selected structural DTO model. No live ingestion or identity equivalence is asserted." .\n'
85
85
  )
86
86
  shapes = [PREFIXES]
87
87
  resources, mappings, provenance = [], {}, []
@@ -180,58 +180,6 @@ def artifacts():
180
180
  resources.append({"name": class_name, "relations": relations})
181
181
  mappings[class_name] = {"ontology_class": class_name, "fields": fields}
182
182
  ontology_text, shapes_text = "\n".join(ontology), "\n".join(shapes)
183
- manifest = json.loads((PACKAGE / "connector_manifest.yml").read_text())
184
- manifest.update(
185
- {
186
- "resources": resources,
187
- "identity": {
188
- "id_field": {
189
- name: "immich" + name.removeprefix("Immich") + "Id"
190
- for name in mappings
191
- if name != "ImmichAlbumMembership"
192
- },
193
- "title_field": {
194
- "ImmichAlbum": "immichAlbumAlbumName",
195
- "ImmichPersonRecord": "immichPersonRecordName",
196
- "ImmichUser": "immichUserName",
197
- "ImmichLibrary": "immichLibraryName",
198
- "ImmichTag": "immichTagName",
199
- },
200
- "updated_field": {
201
- "ImmichAlbum": "immichAlbumUpdatedAt",
202
- "ImmichAsset": "immichAssetUpdatedAt",
203
- },
204
- },
205
- "schema_mappings": mappings,
206
- "policy": {
207
- "pii_fields": {
208
- "ImmichAlbum": ["immichAlbumAlbumName"],
209
- "ImmichPersonRecord": ["immichPersonRecordName"],
210
- "ImmichUser": ["immichUserName"],
211
- "ImmichTag": ["immichTagName"],
212
- }
213
- },
214
- "provenance": {
215
- "generated_by": "scripts/generate_immich_content.py",
216
- "source_artifacts": [
217
- "openapi_contract.json",
218
- "ontology/schema-provenance.json",
219
- "ontology/immich.ttl",
220
- "ontology/shapes/immich.ttl",
221
- ],
222
- "integrity": {
223
- "algorithm": "sha256",
224
- "hash": hashlib.sha256(ontology_text.encode()).hexdigest(),
225
- },
226
- },
227
- "review_todos": [
228
- "Structural schema declarations are not evidence of live EG capture or semantic identity alignment.",
229
- "Only the bounded album metadata projection is implemented for ingestion; remaining DTO classes are structural declarations.",
230
- "Require explicit source/account binding, existing scoped credentials and a verified EG receipt/readback before enabling ingestion.",
231
- "Ontology integrity is a byte SHA256, not canonical RDF or release certification.",
232
- ],
233
- }
234
- )
235
183
  evidence = {
236
184
  "status": "schema-derived; live ingestion unverified",
237
185
  "source_version": "3.2.2",
@@ -263,7 +211,6 @@ def artifacts():
263
211
  evidence, indent=2, sort_keys=True
264
212
  )
265
213
  + "\n",
266
- PACKAGE / "connector_manifest.yml": json.dumps(manifest, indent=2) + "\n",
267
214
  }
268
215
 
269
216
 
@@ -12,10 +12,12 @@
12
12
  "title": "Default content",
13
13
  "delivery_state": "VERIFIED",
14
14
  "landed_in": [
15
+ "4ea81792f111",
16
+ "5f862f905963",
15
17
  "9c7f32a3d826"
16
18
  ],
17
19
  "verified_by": [
18
- "tests/test_default_content_surfaces.py:15"
20
+ "tests/test_default_content_surfaces.py:17"
19
21
  ]
20
22
  }
21
23
  ]
@@ -68,11 +68,11 @@
68
68
  "47656ecb1833"
69
69
  ],
70
70
  "verified_by": [
71
- "tests/test_generated_schema_policy.py:18",
72
71
  "tests/test_oauth_redirect_response.py:26",
73
- "tests/test_operation_parity.py:31",
72
+ "tests/test_operation_parity.py:34",
74
73
  "tests/test_reviewed_secret_history.py:13",
75
- "tests/test_session_auth_isolation.py:17"
74
+ "tests/test_session_auth_isolation.py:17",
75
+ "tests/test_upstream_evidence.py:14"
76
76
  ]
77
77
  },
78
78
  {
@@ -84,7 +84,7 @@
84
84
  "f155d6a2ee97"
85
85
  ],
86
86
  "verified_by": [
87
- "tests/test_fleet_name.py:35"
87
+ "tests/test_fleet_name.py:34"
88
88
  ]
89
89
  }
90
90
  ]
@@ -61,7 +61,6 @@ async def native_initial_discovery(client):
61
61
 
62
62
  async def native_discovery(client, name):
63
63
  """Verify one complete tool so discovery has its own bounded test budget."""
64
- await asyncio.sleep(0.12)
65
64
  result = await client.call_tool(
66
65
  "search_tools", {"pattern": "^" + re.escape(name) + r"(?:\s|$)"}
67
66
  )
@@ -113,11 +112,12 @@ class DiscoveredClient:
113
112
 
114
113
 
115
114
  @asynccontextmanager
116
- async def isolated_native_client(server, elicitation_handler):
115
+ async def isolated_native_client(server, elicitation_handler, pace=0.22):
117
116
  """Drain outstanding calls and close the protocol before the next provider."""
118
117
  # Each fresh client adds server/discover and result-validation tools/list.
119
118
  # Reserve those two requests at the unchanged SDK limit of 10 requests/s.
120
- await asyncio.sleep(0.22)
119
+ if pace:
120
+ await asyncio.sleep(pace)
121
121
  async with Client(
122
122
  server, elicitation_handler=elicitation_handler, timeout=10
123
123
  ) as native: