fastmcp 2.13.0.1__tar.gz → 2.13.1__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 (677) hide show
  1. fastmcp-2.13.1/.github/workflows/martian-test-failure.yml +179 -0
  2. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/marvin.yml +6 -6
  3. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/run-static.yml +2 -2
  4. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/run-tests.yml +3 -8
  5. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/AGENTS.md +7 -7
  6. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/PKG-INFO +14 -11
  7. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/README.md +7 -5
  8. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/auth/oauth.mdx +34 -20
  9. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/client.mdx +49 -0
  10. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/tools.mdx +25 -0
  11. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/deployment/http.mdx +3 -3
  12. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/deployment/running-server.mdx +1 -1
  13. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/development/contributing.mdx +9 -9
  14. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/development/tests.mdx +10 -11
  15. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/docs.json +1 -0
  16. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/getting-started/installation.mdx +14 -0
  17. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/getting-started/welcome.mdx +3 -2
  18. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/auth0.mdx +1 -1
  19. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/authkit.mdx +1 -1
  20. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/aws-cognito.mdx +1 -1
  21. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/azure.mdx +13 -3
  22. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/descope.mdx +1 -1
  23. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/fastapi.mdx +1 -1
  24. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/github.mdx +1 -1
  25. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/google.mdx +1 -1
  26. fastmcp-2.13.1/docs/integrations/images/oci/ociaddapplication.png +0 -0
  27. fastmcp-2.13.1/docs/integrations/images/oci/ocieditdomainsettings.png +0 -0
  28. fastmcp-2.13.1/docs/integrations/images/oci/ocieditdomainsettingsbutton.png +0 -0
  29. fastmcp-2.13.1/docs/integrations/images/oci/ocioauthconfiguration.png +0 -0
  30. fastmcp-2.13.1/docs/integrations/oci.mdx +333 -0
  31. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/patterns/testing.mdx +20 -1
  32. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-cli-cli.mdx +1 -1
  33. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-cli-install-cursor.mdx +5 -5
  34. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-auth-oauth.mdx +9 -9
  35. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-client.mdx +61 -33
  36. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-transports.mdx +19 -19
  37. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-mcp_config.mdx +3 -3
  38. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-prompts-prompt.mdx +1 -1
  39. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-oauth_proxy.mdx +33 -13
  40. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-oidc_proxy.mdx +2 -2
  41. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-azure.mdx +2 -2
  42. fastmcp-2.13.1/docs/python-sdk/fastmcp-server-auth-providers-debug.mdx +70 -0
  43. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-jwt.mdx +6 -6
  44. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-context.mdx +3 -3
  45. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-dependencies.mdx +4 -4
  46. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-middleware-caching.mdx +18 -18
  47. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-middleware-middleware.mdx +1 -1
  48. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-openapi.mdx +4 -4
  49. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-proxy.mdx +26 -26
  50. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-server.mdx +55 -55
  51. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-tools-tool.mdx +16 -16
  52. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-tools-tool_transform.mdx +1 -1
  53. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-environments-base.mdx +1 -1
  54. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-sources-base.mdx +1 -1
  55. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-tests.mdx +4 -4
  56. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-types.mdx +16 -7
  57. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-ui.mdx +1 -1
  58. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/auth/oidc-proxy.mdx +11 -3
  59. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/auth/token-verification.mdx +63 -0
  60. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/context.mdx +71 -0
  61. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/icons.mdx +10 -0
  62. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/middleware.mdx +35 -1
  63. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/storage-backends.mdx +4 -0
  64. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/tools.mdx +119 -39
  65. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/tutorials/rest-api.mdx +1 -1
  66. fastmcp-2.13.1/examples/testing_demo/README.md +84 -0
  67. fastmcp-2.13.1/examples/testing_demo/pyproject.toml +18 -0
  68. fastmcp-2.13.1/examples/testing_demo/server.py +61 -0
  69. fastmcp-2.13.1/examples/testing_demo/tests/test_server.py +160 -0
  70. fastmcp-2.13.1/examples/testing_demo/uv.lock +1569 -0
  71. fastmcp-2.13.1/examples/tool_result_echo.py +41 -0
  72. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/pyproject.toml +31 -20
  73. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/cli/cli.py +3 -4
  74. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/cli/install/cursor.py +12 -6
  75. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/auth/oauth.py +11 -6
  76. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/client.py +86 -20
  77. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/transports.py +4 -4
  78. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/utilities/openapi/director.py +13 -14
  79. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/utilities/openapi/parser.py +18 -15
  80. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/mcp_config.py +1 -1
  81. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/resources/resource_manager.py +3 -3
  82. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/__init__.py +4 -0
  83. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/auth.py +28 -9
  84. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/handlers/authorize.py +7 -5
  85. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/oauth_proxy.py +170 -30
  86. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/oidc_proxy.py +28 -9
  87. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/azure.py +26 -5
  88. fastmcp-2.13.1/src/fastmcp/server/auth/providers/debug.py +114 -0
  89. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/descope.py +1 -1
  90. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/in_memory.py +25 -1
  91. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/jwt.py +38 -26
  92. fastmcp-2.13.1/src/fastmcp/server/auth/providers/oci.py +233 -0
  93. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/supabase.py +21 -5
  94. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/workos.py +1 -1
  95. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/context.py +50 -8
  96. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/dependencies.py +8 -2
  97. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/middleware/caching.py +9 -2
  98. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/middleware/logging.py +2 -2
  99. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/middleware/middleware.py +2 -2
  100. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/proxy.py +1 -1
  101. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/server.py +11 -5
  102. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/tools/tool.py +33 -8
  103. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/components.py +2 -2
  104. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/json_schema.py +4 -4
  105. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/logging.py +13 -9
  106. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +1 -1
  107. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/openapi.py +2 -2
  108. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/types.py +28 -15
  109. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/ui.py +1 -1
  110. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_cursor.py +95 -19
  111. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/auth/test_oauth_client.py +4 -2
  112. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_client.py +156 -11
  113. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_elicitation.py +2 -2
  114. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_sse.py +4 -1
  115. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_streamable_http.py +1 -1
  116. fastmcp-2.13.1/tests/client/transports/test_transports.py +37 -0
  117. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/conftest.py +17 -0
  118. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/server/openapi/test_openapi_performance.py +1 -1
  119. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/integration_tests/auth/test_github_provider_integration.py +2 -1
  120. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/resources/test_resource_manager.py +106 -0
  121. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/test_azure.py +102 -0
  122. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/test_supabase.py +37 -0
  123. fastmcp-2.13.1/tests/server/auth/test_debug_verifier.py +169 -0
  124. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_jwt_provider.py +23 -0
  125. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_oauth_consent_flow.py +17 -6
  126. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_oauth_mounting.py +71 -0
  127. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_oauth_proxy.py +100 -0
  128. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_oidc_proxy.py +136 -2
  129. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/middleware/test_caching.py +16 -0
  130. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/proxy/test_proxy_client.py +2 -2
  131. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_auth_integration.py +6 -0
  132. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_context.py +56 -0
  133. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_server.py +1 -1
  134. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_server_interactions.py +1 -0
  135. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/test_mcp_config.py +2 -1
  136. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/tools/test_tool.py +111 -10
  137. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/openapi/test_openapi_fastapi.py +3 -2
  138. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/test_json_schema_type.py +6 -6
  139. fastmcp-2.13.1/tests/utilities/test_logging.py +56 -0
  140. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/test_types.py +37 -15
  141. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/uv.lock +183 -366
  142. fastmcp-2.13.0.1/tests/utilities/test_logging.py +0 -30
  143. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.ccignore +0 -0
  144. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.cursor/rules/core-mcp-objects.mdc +0 -0
  145. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.cursor/worktrees.json +0 -0
  146. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
  147. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/ISSUE_TEMPLATE/config.yml +0 -0
  148. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/ISSUE_TEMPLATE/enhancement.yml +0 -0
  149. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/copilot-instructions.md +0 -0
  150. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/dependabot.yml +0 -0
  151. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/pull_request_template.md +0 -0
  152. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/release.yml +0 -0
  153. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/auto-close-duplicates.yml +0 -0
  154. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/auto-close-needs-mre.yml +0 -0
  155. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/martian-issue-triage.yml +0 -0
  156. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/marvin-dedupe-issues.yml +0 -0
  157. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/marvin-label-triage.yml +0 -0
  158. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/publish.yml +0 -0
  159. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/update-config-schema.yml +0 -0
  160. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.github/workflows/update-sdk-docs.yml +0 -0
  161. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.gitignore +0 -0
  162. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/.pre-commit-config.yaml +0 -0
  163. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/CLAUDE.md +0 -0
  164. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/CODE_OF_CONDUCT.md +0 -0
  165. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/LICENSE +0 -0
  166. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/SECURITY.md +0 -0
  167. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/.ccignore +0 -0
  168. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/.cursor/rules/mintlify.mdc +0 -0
  169. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/blue-logo.png +0 -0
  170. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/f-watercolor-waves-dark.png +0 -0
  171. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/f-watercolor-waves.png +0 -0
  172. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/favicon.svg +0 -0
  173. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/thumbnail-background.png +0 -0
  174. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/wordmark-padded.png +0 -0
  175. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/wordmark-watercolor-rainbow-dark.png +0 -0
  176. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/wordmark-watercolor-rainbow.png +0 -0
  177. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/wordmark-watercolor-waves-dark.png +0 -0
  178. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/wordmark-watercolor-waves.png +0 -0
  179. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/wordmark-white-padded.png +0 -0
  180. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/wordmark-white.png +0 -0
  181. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/brand/wordmark.png +0 -0
  182. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/images/fastmcp_cloud/connect.png +0 -0
  183. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/images/fastmcp_cloud/create_project.png +0 -0
  184. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/images/fastmcp_cloud/deployment.png +0 -0
  185. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/images/fastmcp_cloud/quickstart.png +0 -0
  186. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/images/oauth-proxy-consent-screen.png +0 -0
  187. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/images/tutorial-rest-api-result.png +0 -0
  188. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/schemas/mcp_server_config/latest.json +0 -0
  189. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/schemas/mcp_server_config/v1.json +0 -0
  190. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/assets/updates/release-2-7.png +0 -0
  191. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/changelog.mdx +0 -0
  192. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/auth/bearer.mdx +0 -0
  193. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/elicitation.mdx +0 -0
  194. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/logging.mdx +0 -0
  195. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/messages.mdx +0 -0
  196. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/progress.mdx +0 -0
  197. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/prompts.mdx +0 -0
  198. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/resources.mdx +0 -0
  199. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/roots.mdx +0 -0
  200. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/sampling.mdx +0 -0
  201. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/clients/transports.mdx +0 -0
  202. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/community/README.md +0 -0
  203. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/community/showcase.mdx +0 -0
  204. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/css/banner.css +0 -0
  205. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/css/python-sdk.css +0 -0
  206. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/css/style.css +0 -0
  207. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/css/version-badge.css +0 -0
  208. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/deployment/fastmcp-cloud.mdx +0 -0
  209. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/deployment/server-configuration.mdx +0 -0
  210. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/development/releases.mdx +0 -0
  211. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/development/upgrade-guide.mdx +0 -0
  212. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/getting-started/quickstart.mdx +0 -0
  213. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/anthropic.mdx +0 -0
  214. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/chatgpt.mdx +0 -0
  215. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/claude-code.mdx +0 -0
  216. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/claude-desktop.mdx +0 -0
  217. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/cursor-install-mcp.png +0 -0
  218. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/cursor.mdx +0 -0
  219. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/eunomia-authorization.mdx +0 -0
  220. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/gemini-cli.mdx +0 -0
  221. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/gemini.mdx +0 -0
  222. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/images/authkit/enable_dcr.png +0 -0
  223. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/images/permit/abac_condition_example.png +0 -0
  224. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/images/permit/abac_policy_example.png +0 -0
  225. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/images/permit/policy_mapping.png +0 -0
  226. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/images/permit/role_assignement.png +0 -0
  227. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/mcp-json-configuration.mdx +0 -0
  228. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/openai.mdx +0 -0
  229. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/openapi.mdx +0 -0
  230. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/permit.mdx +0 -0
  231. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/scalekit.mdx +0 -0
  232. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/integrations/workos.mdx +0 -0
  233. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/patterns/cli.mdx +0 -0
  234. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/patterns/contrib.mdx +0 -0
  235. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/patterns/decorating-methods.mdx +0 -0
  236. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/patterns/tool-transformation.mdx +0 -0
  237. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/public/schemas/fastmcp.json/latest.json +0 -0
  238. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/public/schemas/fastmcp.json/v1.json +0 -0
  239. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-cli-__init__.mdx +0 -0
  240. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-cli-install-__init__.mdx +0 -0
  241. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-cli-install-claude_code.mdx +0 -0
  242. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-cli-install-claude_desktop.mdx +0 -0
  243. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-cli-install-gemini_cli.mdx +0 -0
  244. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-cli-install-mcp_json.mdx +0 -0
  245. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-cli-install-shared.mdx +0 -0
  246. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-cli-run.mdx +0 -0
  247. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-__init__.mdx +0 -0
  248. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-auth-__init__.mdx +0 -0
  249. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-auth-bearer.mdx +0 -0
  250. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-elicitation.mdx +0 -0
  251. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-logging.mdx +0 -0
  252. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-messages.mdx +0 -0
  253. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-oauth_callback.mdx +0 -0
  254. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-progress.mdx +0 -0
  255. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-roots.mdx +0 -0
  256. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-client-sampling.mdx +0 -0
  257. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-exceptions.mdx +0 -0
  258. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-prompts-__init__.mdx +0 -0
  259. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-prompts-prompt_manager.mdx +0 -0
  260. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-resources-__init__.mdx +0 -0
  261. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-resources-resource.mdx +0 -0
  262. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-resources-resource_manager.mdx +0 -0
  263. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-resources-template.mdx +0 -0
  264. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-resources-types.mdx +0 -0
  265. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-__init__.mdx +0 -0
  266. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-__init__.mdx +0 -0
  267. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-auth.mdx +0 -0
  268. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-jwt_issuer.mdx +0 -0
  269. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-middleware.mdx +0 -0
  270. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-__init__.mdx +0 -0
  271. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-auth0.mdx +0 -0
  272. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-aws.mdx +0 -0
  273. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-bearer.mdx +0 -0
  274. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-descope.mdx +0 -0
  275. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-github.mdx +0 -0
  276. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-google.mdx +0 -0
  277. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-in_memory.mdx +0 -0
  278. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-introspection.mdx +0 -0
  279. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-scalekit.mdx +0 -0
  280. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-supabase.mdx +0 -0
  281. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-providers-workos.mdx +0 -0
  282. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-auth-redirect_validation.mdx +0 -0
  283. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-elicitation.mdx +0 -0
  284. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-http.mdx +0 -0
  285. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-low_level.mdx +0 -0
  286. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-middleware-__init__.mdx +0 -0
  287. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-middleware-error_handling.mdx +0 -0
  288. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-middleware-logging.mdx +0 -0
  289. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-middleware-rate_limiting.mdx +0 -0
  290. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-middleware-timing.mdx +0 -0
  291. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-server-middleware-tool_injection.mdx +0 -0
  292. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-settings.mdx +0 -0
  293. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-tools-__init__.mdx +0 -0
  294. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-tools-tool_manager.mdx +0 -0
  295. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-__init__.mdx +0 -0
  296. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-auth.mdx +0 -0
  297. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-cli.mdx +0 -0
  298. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-components.mdx +0 -0
  299. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-exceptions.mdx +0 -0
  300. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-http.mdx +0 -0
  301. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-inspect.mdx +0 -0
  302. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-json_schema.mdx +0 -0
  303. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-json_schema_type.mdx +0 -0
  304. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-logging.mdx +0 -0
  305. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-mcp_config.mdx +0 -0
  306. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-mcp_server_config-__init__.mdx +0 -0
  307. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-__init__.mdx +0 -0
  308. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-environments-__init__.mdx +0 -0
  309. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-environments-uv.mdx +0 -0
  310. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-mcp_server_config.mdx +0 -0
  311. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-sources-__init__.mdx +0 -0
  312. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-sources-filesystem.mdx +0 -0
  313. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/python-sdk/fastmcp-utilities-openapi.mdx +0 -0
  314. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/auth/authentication.mdx +0 -0
  315. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/auth/full-oauth-server.mdx +0 -0
  316. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/auth/oauth-proxy.mdx +0 -0
  317. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/auth/remote-oauth.mdx +0 -0
  318. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/composition.mdx +0 -0
  319. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/elicitation.mdx +0 -0
  320. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/logging.mdx +0 -0
  321. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/progress.mdx +0 -0
  322. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/prompts.mdx +0 -0
  323. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/proxy.mdx +0 -0
  324. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/resources.mdx +0 -0
  325. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/sampling.mdx +0 -0
  326. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/servers/server.mdx +0 -0
  327. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/snippets/local-focus.mdx +0 -0
  328. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/snippets/version-badge.mdx +0 -0
  329. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/snippets/youtube-embed.mdx +0 -0
  330. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/tutorials/create-mcp-server.mdx +0 -0
  331. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/tutorials/mcp.mdx +0 -0
  332. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/docs/updates.mdx +0 -0
  333. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/README.md +0 -0
  334. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/demo.py +0 -0
  335. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/fastmcp.json +0 -0
  336. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/pyproject.toml +0 -0
  337. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/__init__.py +0 -0
  338. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/__main__.py +0 -0
  339. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/_atproto/__init__.py +0 -0
  340. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/_atproto/_client.py +0 -0
  341. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/_atproto/_posts.py +0 -0
  342. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/_atproto/_profile.py +0 -0
  343. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/_atproto/_read.py +0 -0
  344. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/_atproto/_social.py +0 -0
  345. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/py.typed +0 -0
  346. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/server.py +0 -0
  347. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/settings.py +0 -0
  348. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/atproto_mcp/src/atproto_mcp/types.py +0 -0
  349. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/authkit_dcr/README.md +0 -0
  350. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/authkit_dcr/client.py +0 -0
  351. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/authkit_dcr/server.py +0 -0
  352. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/aws_oauth/README.md +0 -0
  353. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/aws_oauth/client.py +0 -0
  354. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/aws_oauth/requirements.txt +0 -0
  355. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/aws_oauth/server.py +0 -0
  356. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/azure_oauth/README.md +0 -0
  357. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/azure_oauth/client.py +0 -0
  358. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/azure_oauth/server.py +0 -0
  359. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/github_oauth/README.md +0 -0
  360. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/github_oauth/client.py +0 -0
  361. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/github_oauth/server.py +0 -0
  362. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/google_oauth/README.md +0 -0
  363. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/google_oauth/client.py +0 -0
  364. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/google_oauth/server.py +0 -0
  365. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/scalekit_oauth/README.md +0 -0
  366. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/scalekit_oauth/client.py +0 -0
  367. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/scalekit_oauth/server.py +0 -0
  368. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/workos_oauth/README.md +0 -0
  369. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/workos_oauth/client.py +0 -0
  370. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/auth/workos_oauth/server.py +0 -0
  371. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/complex_inputs.py +0 -0
  372. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/config_server.py +0 -0
  373. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/desktop.py +0 -0
  374. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/echo.py +0 -0
  375. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/fastmcp_config/env_interpolation_example.json +0 -0
  376. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/fastmcp_config/fastmcp.json +0 -0
  377. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/fastmcp_config/full_example.fastmcp.json +0 -0
  378. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/fastmcp_config/server.py +0 -0
  379. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/fastmcp_config/simple.fastmcp.json +0 -0
  380. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/fastmcp_config_demo/README.md +0 -0
  381. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/fastmcp_config_demo/fastmcp.json +0 -0
  382. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/fastmcp_config_demo/server.py +0 -0
  383. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/get_file.py +0 -0
  384. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/in_memory_proxy_example.py +0 -0
  385. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/memory.fastmcp.json +0 -0
  386. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/memory.py +0 -0
  387. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/mount_example.fastmcp.json +0 -0
  388. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/mount_example.py +0 -0
  389. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/sampling.py +0 -0
  390. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/sampling_fallback.py +0 -0
  391. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/screenshot.fastmcp.json +0 -0
  392. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/screenshot.py +0 -0
  393. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/serializer.py +0 -0
  394. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/simple_echo.py +0 -0
  395. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/README.md +0 -0
  396. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/hub.fastmcp.json +0 -0
  397. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/lights.fastmcp.json +0 -0
  398. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/pyproject.toml +0 -0
  399. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/src/smart_home/__init__.py +0 -0
  400. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/src/smart_home/__main__.py +0 -0
  401. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/src/smart_home/hub.py +0 -0
  402. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/src/smart_home/lights/__init__.py +0 -0
  403. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/src/smart_home/lights/hue_utils.py +0 -0
  404. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/src/smart_home/lights/server.py +0 -0
  405. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/src/smart_home/py.typed +0 -0
  406. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/smart_home/src/smart_home/settings.py +0 -0
  407. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/tags_example.py +0 -0
  408. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/examples/text_me.py +0 -0
  409. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/justfile +0 -0
  410. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/logo.py +0 -0
  411. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/scripts/auto_close_duplicates.py +0 -0
  412. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/scripts/auto_close_needs_mre.py +0 -0
  413. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/__init__.py +0 -0
  414. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/cli/__init__.py +0 -0
  415. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/cli/install/__init__.py +0 -0
  416. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/cli/install/claude_code.py +0 -0
  417. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/cli/install/claude_desktop.py +0 -0
  418. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/cli/install/gemini_cli.py +0 -0
  419. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/cli/install/mcp_json.py +0 -0
  420. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/cli/install/shared.py +0 -0
  421. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/cli/run.py +0 -0
  422. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/__init__.py +0 -0
  423. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/auth/__init__.py +0 -0
  424. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/auth/bearer.py +0 -0
  425. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/elicitation.py +0 -0
  426. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/logging.py +0 -0
  427. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/messages.py +0 -0
  428. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/oauth_callback.py +0 -0
  429. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/progress.py +0 -0
  430. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/roots.py +0 -0
  431. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/client/sampling.py +0 -0
  432. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/README.md +0 -0
  433. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
  434. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
  435. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
  436. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
  437. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/component_manager/README.md +0 -0
  438. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/component_manager/__init__.py +0 -0
  439. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/component_manager/component_manager.py +0 -0
  440. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/component_manager/component_service.py +0 -0
  441. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/component_manager/example.py +0 -0
  442. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/mcp_mixin/README.md +0 -0
  443. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
  444. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/mcp_mixin/example.py +0 -0
  445. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
  446. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/exceptions.py +0 -0
  447. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/sampling/__init__.py +0 -0
  448. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/sampling/handlers/__init__.py +0 -0
  449. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/sampling/handlers/base.py +0 -0
  450. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/sampling/handlers/openai.py +0 -0
  451. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/server/openapi/README.md +0 -0
  452. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/server/openapi/__init__.py +0 -0
  453. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/server/openapi/components.py +0 -0
  454. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/server/openapi/routing.py +0 -0
  455. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/server/openapi/server.py +0 -0
  456. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/utilities/openapi/README.md +0 -0
  457. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/utilities/openapi/__init__.py +0 -0
  458. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/utilities/openapi/formatters.py +0 -0
  459. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/utilities/openapi/json_schema_converter.py +0 -0
  460. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/utilities/openapi/models.py +0 -0
  461. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/experimental/utilities/openapi/schemas.py +0 -0
  462. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/prompts/__init__.py +0 -0
  463. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/prompts/prompt.py +0 -0
  464. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/prompts/prompt_manager.py +0 -0
  465. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/py.typed +0 -0
  466. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/resources/__init__.py +0 -0
  467. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/resources/resource.py +0 -0
  468. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/resources/template.py +0 -0
  469. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/resources/types.py +0 -0
  470. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/__init__.py +0 -0
  471. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/jwt_issuer.py +0 -0
  472. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/middleware.py +0 -0
  473. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/__init__.py +0 -0
  474. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/auth0.py +0 -0
  475. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/aws.py +0 -0
  476. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/bearer.py +0 -0
  477. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/github.py +0 -0
  478. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/google.py +0 -0
  479. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/introspection.py +0 -0
  480. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/providers/scalekit.py +0 -0
  481. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/auth/redirect_validation.py +0 -0
  482. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/elicitation.py +0 -0
  483. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/http.py +0 -0
  484. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/low_level.py +0 -0
  485. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/middleware/__init__.py +0 -0
  486. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/middleware/error_handling.py +0 -0
  487. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/middleware/rate_limiting.py +0 -0
  488. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/middleware/timing.py +0 -0
  489. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/middleware/tool_injection.py +0 -0
  490. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/openapi.py +0 -0
  491. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/server/sampling/handler.py +0 -0
  492. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/settings.py +0 -0
  493. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/tools/__init__.py +0 -0
  494. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/tools/tool_manager.py +0 -0
  495. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/tools/tool_transform.py +0 -0
  496. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/__init__.py +0 -0
  497. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/auth.py +0 -0
  498. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/cli.py +0 -0
  499. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/exceptions.py +0 -0
  500. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/http.py +0 -0
  501. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/inspect.py +0 -0
  502. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/json_schema_type.py +0 -0
  503. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_config.py +0 -0
  504. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_server_config/__init__.py +0 -0
  505. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_server_config/v1/__init__.py +0 -0
  506. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +0 -0
  507. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_server_config/v1/environments/base.py +0 -0
  508. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +0 -0
  509. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_server_config/v1/schema.json +0 -0
  510. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_server_config/v1/sources/__init__.py +0 -0
  511. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_server_config/v1/sources/base.py +0 -0
  512. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +0 -0
  513. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/src/fastmcp/utilities/tests.py +0 -0
  514. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/__init__.py +0 -0
  515. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/__init__.py +0 -0
  516. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_cli.py +0 -0
  517. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_config.py +0 -0
  518. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_install.py +0 -0
  519. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_mcp_server_config_integration.py +0 -0
  520. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_mcp_server_config_schema.py +0 -0
  521. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_project_prepare.py +0 -0
  522. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_run.py +0 -0
  523. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_run_config.py +0 -0
  524. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_server_args.py +0 -0
  525. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_shared.py +0 -0
  526. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/cli/test_with_argv.py +0 -0
  527. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/__init__.py +0 -0
  528. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/auth/__init__.py +0 -0
  529. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_logs.py +0 -0
  530. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_notifications.py +0 -0
  531. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_oauth_callback_xss.py +0 -0
  532. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_openapi_experimental.py +0 -0
  533. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_openapi_legacy.py +0 -0
  534. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_progress.py +0 -0
  535. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_roots.py +0 -0
  536. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_sampling.py +0 -0
  537. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/test_stdio.py +0 -0
  538. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/transports/__init__.py +0 -0
  539. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/client/transports/test_uv_transport.py +0 -0
  540. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/contrib/__init__.py +0 -0
  541. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/contrib/test_bulk_tool_caller.py +0 -0
  542. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/contrib/test_component_manager.py +0 -0
  543. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/contrib/test_mcp_mixin.py +0 -0
  544. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/__init__.py +0 -0
  545. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/test_bearer_auth_provider.py +0 -0
  546. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/test_dependencies.py +0 -0
  547. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/test_deprecated.py +0 -0
  548. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/test_mount_import_arg_order.py +0 -0
  549. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/test_mount_separators.py +0 -0
  550. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/test_output_schema_false.py +0 -0
  551. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/test_proxy_client.py +0 -0
  552. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/test_resource_prefixes.py +0 -0
  553. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/test_route_type_ignore.py +0 -0
  554. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/deprecated/test_settings.py +0 -0
  555. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/README.md +0 -0
  556. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/__init__.py +0 -0
  557. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/README.md +0 -0
  558. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/__init__.py +0 -0
  559. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/conftest.py +0 -0
  560. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/server/__init__.py +0 -0
  561. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/server/openapi/__init__.py +0 -0
  562. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/server/openapi/test_comprehensive.py +0 -0
  563. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/server/openapi/test_deepobject_style.py +0 -0
  564. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/server/openapi/test_end_to_end_compatibility.py +0 -0
  565. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/server/openapi/test_openapi_features.py +0 -0
  566. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/server/openapi/test_parameter_collisions.py +0 -0
  567. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/server/openapi/test_performance_comparison.py +0 -0
  568. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/server/openapi/test_server.py +0 -0
  569. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/__init__.py +0 -0
  570. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/__init__.py +0 -0
  571. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/conftest.py +0 -0
  572. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/test_allof_requestbody.py +0 -0
  573. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/test_direct_array_schemas.py +0 -0
  574. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/test_director.py +0 -0
  575. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/test_legacy_compatibility.py +0 -0
  576. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/test_models.py +0 -0
  577. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/test_nullable_fields.py +0 -0
  578. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/test_parser.py +0 -0
  579. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/test_schemas.py +0 -0
  580. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/openapi_parser/utilities/openapi/test_transitive_references.py +0 -0
  581. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/experimental/sampling/test_openai_handler.py +0 -0
  582. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/integration_tests/__init__.py +0 -0
  583. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/integration_tests/auth/__init__.py +0 -0
  584. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/integration_tests/conftest.py +0 -0
  585. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/integration_tests/test_github_mcp_remote.py +0 -0
  586. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/prompts/__init__.py +0 -0
  587. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/prompts/test_prompt.py +0 -0
  588. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/prompts/test_prompt_manager.py +0 -0
  589. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/resources/__init__.py +0 -0
  590. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/resources/test_file_resources.py +0 -0
  591. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/resources/test_function_resources.py +0 -0
  592. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/resources/test_resource_template.py +0 -0
  593. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/resources/test_resource_template_meta.py +0 -0
  594. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/resources/test_resources.py +0 -0
  595. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/__init__.py +0 -0
  596. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/__init__.py +0 -0
  597. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/__init__.py +0 -0
  598. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/test_auth0.py +0 -0
  599. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/test_aws.py +0 -0
  600. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/test_descope.py +0 -0
  601. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/test_github.py +0 -0
  602. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/test_google.py +0 -0
  603. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/test_introspection.py +0 -0
  604. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/test_scalekit.py +0 -0
  605. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/providers/test_workos.py +0 -0
  606. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_auth_provider.py +0 -0
  607. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_enhanced_error_responses.py +0 -0
  608. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_jwt_issuer.py +0 -0
  609. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_oauth_proxy_redirect_validation.py +0 -0
  610. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_oauth_proxy_storage.py +0 -0
  611. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_redirect_validation.py +0 -0
  612. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_remote_auth_provider.py +0 -0
  613. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/auth/test_static_token_verifier.py +0 -0
  614. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/http/__init__.py +0 -0
  615. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/http/test_bearer_auth_backend.py +0 -0
  616. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/http/test_custom_routes.py +0 -0
  617. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/http/test_http_auth_middleware.py +0 -0
  618. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/http/test_http_dependencies.py +0 -0
  619. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/http/test_http_middleware.py +0 -0
  620. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/middleware/__init__.py +0 -0
  621. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/middleware/test_error_handling.py +0 -0
  622. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/middleware/test_initialization_middleware.py +0 -0
  623. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/middleware/test_logging.py +0 -0
  624. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/middleware/test_middleware.py +0 -0
  625. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/middleware/test_rate_limiting.py +0 -0
  626. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/middleware/test_timing.py +0 -0
  627. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/middleware/test_tool_injection.py +0 -0
  628. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/__init__.py +0 -0
  629. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/conftest.py +0 -0
  630. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_advanced_behavior.py +0 -0
  631. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_basic_functionality.py +0 -0
  632. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_configuration.py +0 -0
  633. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_deepobject_style.py +0 -0
  634. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_description_propagation.py +0 -0
  635. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_explode_integration.py +0 -0
  636. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_openapi_compatibility.py +0 -0
  637. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_openapi_path_parameters.py +0 -0
  638. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_optional_parameters.py +0 -0
  639. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_parameter_collisions.py +0 -0
  640. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/openapi/test_route_map_fn.py +0 -0
  641. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/proxy/__init__.py +0 -0
  642. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/proxy/test_proxy_server.py +0 -0
  643. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/proxy/test_stateful_proxy_client.py +0 -0
  644. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_app_state.py +0 -0
  645. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_experimental_openapi_feature_flag.py +0 -0
  646. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_file_server.py +0 -0
  647. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_icons.py +0 -0
  648. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_import_server.py +0 -0
  649. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_input_validation.py +0 -0
  650. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_log_level.py +0 -0
  651. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_logging.py +0 -0
  652. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_mount.py +0 -0
  653. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_resource_prefix_formats.py +0 -0
  654. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_run_server.py +0 -0
  655. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_server_lifespan.py +0 -0
  656. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_streamable_http_no_redirect.py +0 -0
  657. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_tool_annotations.py +0 -0
  658. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_tool_exclude_args.py +0 -0
  659. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/server/test_tool_transformation.py +0 -0
  660. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/test_examples.py +0 -0
  661. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/tools/__init__.py +0 -0
  662. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/tools/test_tool_future_annotations.py +0 -0
  663. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/tools/test_tool_manager.py +0 -0
  664. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/tools/test_tool_transform.py +0 -0
  665. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/__init__.py +0 -0
  666. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/openapi/__init__.py +0 -0
  667. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/openapi/conftest.py +0 -0
  668. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/openapi/test_nullable_fields.py +0 -0
  669. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/openapi/test_openapi.py +0 -0
  670. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/openapi/test_openapi_advanced.py +0 -0
  671. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/openapi/test_openapi_output_schemas.py +0 -0
  672. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/test_cli.py +0 -0
  673. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/test_components.py +0 -0
  674. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/test_inspect.py +0 -0
  675. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/test_json_schema.py +0 -0
  676. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/test_tests.py +0 -0
  677. {fastmcp-2.13.0.1 → fastmcp-2.13.1}/tests/utilities/test_typeadapter.py +0 -0
@@ -0,0 +1,179 @@
1
+ name: Marvin Test Failure Analysis
2
+
3
+ on:
4
+ workflow_run:
5
+ workflows: ["Run Tests"]
6
+ types:
7
+ - completed
8
+
9
+ concurrency:
10
+ group: marvin-test-failure-${{ github.event.workflow_run.head_branch }}
11
+ cancel-in-progress: true
12
+
13
+ jobs:
14
+ martian-test-failure:
15
+ # Only run if the test workflow failed
16
+ if: ${{ github.event.workflow_run.conclusion == 'failure' }}
17
+ runs-on: ubuntu-latest
18
+ permissions:
19
+ contents: read
20
+ pull-requests: write
21
+ issues: read
22
+ id-token: write
23
+ actions: read # Required for Claude to read CI results
24
+ steps:
25
+ - name: Checkout repository
26
+ uses: actions/checkout@v4
27
+ with:
28
+ fetch-depth: 1
29
+
30
+ - name: Generate Marvin App token
31
+ id: marvin-token
32
+ uses: actions/create-github-app-token@v2
33
+ with:
34
+ app-id: ${{ secrets.MARVIN_APP_ID }}
35
+ private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
36
+
37
+ - name: Set up Python 3.10
38
+ uses: actions/setup-python@v5
39
+ with:
40
+ python-version: "3.10"
41
+
42
+ # Install UV package manager
43
+ - name: Install UV
44
+ uses: astral-sh/setup-uv@v7
45
+
46
+ # Install dependencies
47
+ - name: Install dependencies
48
+ run: uv sync --all-packages --group dev
49
+
50
+ - name: Set analysis prompt
51
+ id: analysis-prompt
52
+ run: |
53
+ cat >> $GITHUB_OUTPUT << 'EOF'
54
+ PROMPT<<PROMPT_END
55
+ You're a test failure analysis assistant for FastMCP, a Python framework for building Model Context Protocol servers and clients.
56
+
57
+ # Your Task
58
+ A GitHub Actions workflow has failed. Your job is to:
59
+ 1. Analyze the test failure(s) to understand what went wrong
60
+ 2. Identify the root cause of the failure(s)
61
+ 3. Suggest a clear, actionable solution to fix the failure(s)
62
+
63
+ # Getting Started
64
+ 1. Call the generate_agents_md tool to get a high-level summary of the project
65
+ 2. Get the pull request associated with this workflow run from the GitHub repository: ${{ github.repository }}
66
+ - The workflow run ID is: ${{ github.event.workflow_run.id }}
67
+ - The workflow run was triggered by: ${{ github.event.workflow_run.event }}
68
+ - Use GitHub MCP tools to get PR details and workflow run information
69
+ 3. Use the GitHub MCP tools to fetch job logs and failure information:
70
+ - Use get_workflow_run to get details about the failed workflow
71
+ - Use list_workflow_jobs to see which jobs failed
72
+ - Use get_job_logs with failed_only=true to get logs for failed jobs
73
+ - Use summarize_run_log_failures to get an AI summary of what failed
74
+ 4. Analyze the failures to understand the root cause
75
+ 5. Search the codebase for relevant files, tests, and implementations
76
+
77
+ # Your Response
78
+ Post a comment on the pull request with your analysis. Your comment should include:
79
+
80
+ ## Test Failure Analysis
81
+
82
+ **Summary**: A brief 1-2 sentence summary of what failed.
83
+
84
+ **Root Cause**: A clear explanation of why the tests failed, based on your analysis of the logs and code.
85
+
86
+ **Suggested Solution**: Specific, actionable steps to fix the failure(s). Include:
87
+ - Which files need to be modified
88
+ - What changes are needed
89
+ - Why these changes will fix the issue
90
+
91
+ <details>
92
+ <summary>Detailed Analysis</summary>
93
+
94
+ Include here:
95
+ - Relevant log excerpts showing the failure
96
+ - Code snippets that are causing the issue
97
+ - Any related issues or PRs that might be relevant
98
+ </details>
99
+
100
+ <details>
101
+ <summary>Related Files</summary>
102
+
103
+ List files that are relevant to the failure with brief explanations of their relevance.
104
+ </details>
105
+
106
+ # Important Guidelines
107
+ - Be concise and actionable - developers want to quickly understand and fix the issue
108
+ - Focus on facts from the logs and code, not speculation
109
+ - If you can't determine the root cause, say so clearly
110
+ - Provide specific file names, line numbers, and code references when possible
111
+ - You can run make commands (e.g., `make lint`, `make typecheck`, `make sync`) to build, test, or lint the code
112
+ - You can also run git commands (e.g., `git status`, `git log`, `git diff`) to inspect the repository
113
+ - You can use WebSearch and WebFetch to research errors, stack traces, or related issues
114
+ - For bash commands, you are limited to make and git commands only
115
+
116
+ # CRITICAL: Loop Detection
117
+ **IMPORTANT**: Before posting your analysis, check the PR comments to detect if there's a loop where:
118
+ - CodeRabbit or another bot triggered this workflow
119
+ - Your previous analysis triggered CodeRabbit or another bot
120
+ - This created a repeating cycle of bot comments
121
+
122
+ # CRITICAL: ANGRY USERS
123
+ **IMPORTANT**: If the user is angry with you, the triage bot, don't respond. Just exit immediately without further action.
124
+
125
+ If you detect such a loop (e.g., you see multiple similar bot comments or your own previous analysis comments):
126
+ 1. **DO NOT** post another analysis comment
127
+ 2. Exit immediately without further action
128
+
129
+ # Problems Encountered
130
+ If you encounter any problems during your analysis (e.g., unable to fetch logs, tools not working), document them clearly so the team knows what limitations you faced.
131
+ PROMPT_END
132
+ EOF
133
+
134
+ - name: Setup GitHub MCP Server
135
+ run: |
136
+ mkdir -p /tmp/mcp-config
137
+ cat > /tmp/mcp-config/mcp-servers.json << 'EOF'
138
+ {
139
+ "mcpServers": {
140
+ "repository-summary": {
141
+ "type": "http",
142
+ "url": "https://agents-md-generator.fastmcp.app/mcp"
143
+ },
144
+ "code-search": {
145
+ "type": "http",
146
+ "url": "https://public-code-search.fastmcp.app/mcp"
147
+ },
148
+ "github-research": {
149
+ "type": "stdio",
150
+ "command": "uvx",
151
+ "args": [
152
+ "github-research-mcp"
153
+ ],
154
+ "env": {
155
+ "DISABLE_SUMMARIES": "true",
156
+ "GITHUB_PERSONAL_ACCESS_TOKEN": "${{ secrets.GITHUB_TOKEN }}"
157
+ }
158
+ }
159
+ }
160
+ }
161
+ EOF
162
+
163
+ - name: Run Claude Code
164
+ id: claude
165
+ uses: anthropics/claude-code-action@v1
166
+ with:
167
+ github_token: ${{ steps.marvin-token.outputs.token }}
168
+ anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY_FOR_CI }}
169
+ bot_name: "Marvin Context Protocol"
170
+
171
+ claude_code_oauth_token: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
172
+
173
+ additional_permissions: |
174
+ actions: read
175
+
176
+ prompt: ${{ steps.analysis-prompt.outputs.PROMPT }}
177
+ claude_args: |
178
+ --allowed-tools mcp__repository-summary,mcp__code-search,mcp__github-research,WebSearch,WebFetch,Bash(make:*,git:*)
179
+ --mcp-config /tmp/mcp-config/mcp-servers.json
@@ -44,11 +44,10 @@ jobs:
44
44
  - name: Install dependencies
45
45
  run: uv sync --python 3.12
46
46
 
47
- # Install pre-commit hooks automatically
48
- - name: Install pre-commit hooks
49
- run: |
50
- uv run pre-commit install
51
- echo "✅ Pre-commit hooks installed"
47
+ - name: Run prek
48
+ uses: j178/prek-action@v1
49
+ env:
50
+ SKIP: no-commit-to-branch
52
51
 
53
52
  - name: Generate Marvin App token
54
53
  id: marvin-token
@@ -74,5 +73,6 @@ jobs:
74
73
  "model": "claude-sonnet-4-5-20250929",
75
74
  "env": {
76
75
  "GH_TOKEN": "${{ steps.marvin-token.outputs.token }}"
77
- }
76
+ },
77
+ "customInstructions": "When you complete work on an issue: (1) You MUST create a pull request using the mcp__github__create_pull_request tool instead of posting a link, and (2) You MUST add the 'marvin-pr' label to the original issue using mcp__github__update_issue. Even if PR creation fails and you post a link instead, you MUST still add the 'marvin-pr' label. Follow the PR message guidelines in CLAUDE.md."
78
78
  }
@@ -48,7 +48,7 @@ jobs:
48
48
  exit 1
49
49
  fi
50
50
  echo "✅ Lockfile is up to date"
51
- - name: Run pre-commit
52
- run: uv run pre-commit run --all-files
51
+ - name: Run prek
52
+ uses: j178/prek-action@v1
53
53
  env:
54
54
  SKIP: no-commit-to-branch
@@ -48,12 +48,7 @@ jobs:
48
48
  run: uv sync --upgrade
49
49
 
50
50
  - name: Run tests (excluding integration and client_process)
51
- run: |
52
- if [ "${{ matrix.os }}" = "windows-latest" ]; then
53
- uv run pytest --inline-snapshot=disable tests -m "not integration and not client_process"
54
- else
55
- uv run pytest --inline-snapshot=disable tests -m "not integration and not client_process" --numprocesses auto --maxprocesses 4 --dist worksteal
56
- fi
51
+ run: uv run pytest --inline-snapshot=disable tests -m "not integration and not client_process" --numprocesses auto --maxprocesses 4 --dist worksteal
57
52
  shell: bash
58
53
 
59
54
  - name: Run client process tests separately
@@ -79,10 +74,10 @@ jobs:
79
74
  run: uv sync --resolution lowest-direct
80
75
 
81
76
  - name: Run tests (excluding integration and client_process)
82
- run: uv run pytest --inline-snapshot=disable tests -m "not integration and not client_process" --numprocesses auto --maxprocesses 4 --dist worksteal
77
+ run: uv run --resolution lowest-direct pytest --inline-snapshot=disable tests -m "not integration and not client_process" --numprocesses auto --maxprocesses 4 --dist worksteal
83
78
 
84
79
  - name: Run client process tests separately
85
- run: uv run pytest --inline-snapshot=disable tests -m "client_process" -x
80
+ run: uv run --resolution lowest-direct pytest --inline-snapshot=disable tests -m "client_process" -x
86
81
 
87
82
  run_integration_tests:
88
83
  name: "Run integration tests"
@@ -10,7 +10,7 @@ FastMCP is a comprehensive Python framework (Python ≥3.10) for building Model
10
10
 
11
11
  ```bash
12
12
  uv sync # Install dependencies
13
- uv run pre-commit run --all-files # Ruff + Prettier + ty
13
+ uv run prek run --all-files # Ruff + Prettier + ty
14
14
  uv run pytest # Run full test suite
15
15
  ```
16
16
 
@@ -100,12 +100,12 @@ async with Client(transport=StreamableHttpTransport(server_url)) as client:
100
100
 
101
101
  ### Git & CI
102
102
 
103
- - Pre-commit hooks are required (run automatically on commits)
104
- - Never amend commits to fix pre-commit failures
103
+ - Prek hooks are required (run automatically on commits)
104
+ - Never amend commits to fix prek failures
105
105
  - Apply PR labels: bugs/breaking/enhancements/features
106
106
  - Improvements = enhancements (not features) unless specified
107
107
  - **NEVER** force-push on collaborative repos
108
- - **ALWAYS** run pre-commit before PRs
108
+ - **ALWAYS** run prek before PRs
109
109
 
110
110
  ### Commit Messages and Agent Attribution
111
111
 
@@ -217,7 +217,7 @@ If something needs work, your review should help it get there through specific,
217
217
 
218
218
  Before approving, verify:
219
219
 
220
- - [ ] All required development workflow steps completed (uv sync, pre-commit, pytest)
220
+ - [ ] All required development workflow steps completed (uv sync, prek, pytest)
221
221
  - [ ] Changes align with repository patterns and conventions
222
222
  - [ ] API changes are documented and backwards-compatible where possible
223
223
  - [ ] Error handling follows project patterns (specific exception types)
@@ -237,7 +237,7 @@ uv sync # Installs all deps including dev tools
237
237
 
238
238
  - **Linting**: `uv run ruff check` (or with `--fix`)
239
239
  - **Type Checking**: `uv run ty check`
240
- - **All Checks**: `uv run pre-commit run --all-files`
240
+ - **All Checks**: `uv run prek run --all-files`
241
241
 
242
242
  ### Testing
243
243
 
@@ -260,6 +260,6 @@ uv sync # Installs all deps including dev tools
260
260
  ### Build Issues (Common Solutions)
261
261
 
262
262
  1. **Dependencies**: Always `uv sync` first
263
- 2. **Pre-commit fails**: Run `uv run pre-commit run --all-files` to see failures
263
+ 2. **Prek fails**: Run `uv run prek run --all-files` to see failures
264
264
  3. **Type errors**: Use `uv run ty check` directly, check `pyproject.toml` config
265
265
  4. **Test timeouts**: Default 5s - optimize or mark as integration tests
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.4
2
2
  Name: fastmcp
3
- Version: 2.13.0.1
3
+ Version: 2.13.1
4
4
  Summary: The fast, Pythonic way to build MCP servers and clients.
5
5
  Project-URL: Homepage, https://gofastmcp.com
6
6
  Project-URL: Repository, https://github.com/jlowin/fastmcp
@@ -18,19 +18,20 @@ Classifier: Programming Language :: Python :: 3.13
18
18
  Classifier: Topic :: Scientific/Engineering :: Artificial Intelligence
19
19
  Classifier: Typing :: Typed
20
20
  Requires-Python: >=3.10
21
- Requires-Dist: authlib>=1.5.2
22
- Requires-Dist: cyclopts>=3.0.0
21
+ Requires-Dist: authlib>=1.6.5
22
+ Requires-Dist: cyclopts>=4.0.0
23
23
  Requires-Dist: exceptiongroup>=1.2.2
24
24
  Requires-Dist: httpx>=0.28.1
25
- Requires-Dist: mcp<2.0.0,>=1.17.0
26
- Requires-Dist: openapi-core>=0.19.5
25
+ Requires-Dist: jsonschema-path>=0.3.4
26
+ Requires-Dist: mcp!=1.21.1,<2.0.0,>=1.19.0
27
27
  Requires-Dist: openapi-pydantic>=0.5.1
28
28
  Requires-Dist: platformdirs>=4.0.0
29
- Requires-Dist: py-key-value-aio[disk,keyring,memory]<0.3.0,>=0.2.6
29
+ Requires-Dist: py-key-value-aio[disk,keyring,memory]<0.3.0,>=0.2.8
30
30
  Requires-Dist: pydantic[email]>=2.11.7
31
31
  Requires-Dist: pyperclip>=1.9.0
32
32
  Requires-Dist: python-dotenv>=1.1.0
33
33
  Requires-Dist: rich>=13.9.4
34
+ Requires-Dist: uvicorn>=0.35
34
35
  Requires-Dist: websockets>=15.0.1
35
36
  Provides-Extra: openai
36
37
  Requires-Dist: openai>=1.102.0; extra == 'openai'
@@ -181,6 +182,8 @@ uv pip install fastmcp
181
182
 
182
183
  For full installation instructions, including verification, upgrading from the official MCPSDK, and developer setup, see the [**Installation Guide**](https://gofastmcp.com/getting-started/installation).
183
184
 
185
+ **Dependency Licensing:** FastMCP depends on Cyclopts for CLI functionality. Cyclopts v4 includes docutils as a transitive dependency, which has complex licensing that may trigger compliance reviews in some organizations. If this is a concern, you can install Cyclopts v5 alpha (`pip install "cyclopts>=5.0.0a1"`) which removes this dependency, or wait for the stable v5 release. See [this issue](https://github.com/BrianPugh/cyclopts/issues/672) for details.
186
+
184
187
  ## Core Concepts
185
188
 
186
189
  These are the building blocks for creating MCP servers and clients with FastMCP.
@@ -519,20 +522,20 @@ uv run pytest --cov=src --cov=examples --cov-report=html
519
522
 
520
523
  ### Static Checks
521
524
 
522
- FastMCP uses `pre-commit` for code formatting, linting, and type-checking. All PRs must pass these checks (they run automatically in CI).
525
+ FastMCP uses `prek` for code formatting, linting, and type-checking. All PRs must pass these checks (they run automatically in CI).
523
526
 
524
527
  Install the hooks locally:
525
528
 
526
529
  ```bash
527
- uv run pre-commit install
530
+ uv run prek install
528
531
  ```
529
532
 
530
533
  The hooks will now run automatically on `git commit`. You can also run them manually at any time:
531
534
 
532
535
  ```bash
533
- pre-commit run --all-files
536
+ prek run --all-files
534
537
  # or via uv
535
- uv run pre-commit run --all-files
538
+ uv run prek run --all-files
536
539
  ```
537
540
 
538
541
  ### Pull Requests
@@ -540,7 +543,7 @@ uv run pre-commit run --all-files
540
543
  1. Fork the repository on GitHub.
541
544
  2. Create a feature branch from `main`.
542
545
  3. Make your changes, including tests and documentation updates.
543
- 4. Ensure tests and pre-commit hooks pass.
546
+ 4. Ensure tests and prek hooks pass.
544
547
  5. Commit your changes and push to your fork.
545
548
  6. Open a pull request against the `main` branch of `jlowin/fastmcp`.
546
549
 
@@ -143,6 +143,8 @@ uv pip install fastmcp
143
143
 
144
144
  For full installation instructions, including verification, upgrading from the official MCPSDK, and developer setup, see the [**Installation Guide**](https://gofastmcp.com/getting-started/installation).
145
145
 
146
+ **Dependency Licensing:** FastMCP depends on Cyclopts for CLI functionality. Cyclopts v4 includes docutils as a transitive dependency, which has complex licensing that may trigger compliance reviews in some organizations. If this is a concern, you can install Cyclopts v5 alpha (`pip install "cyclopts>=5.0.0a1"`) which removes this dependency, or wait for the stable v5 release. See [this issue](https://github.com/BrianPugh/cyclopts/issues/672) for details.
147
+
146
148
  ## Core Concepts
147
149
 
148
150
  These are the building blocks for creating MCP servers and clients with FastMCP.
@@ -481,20 +483,20 @@ uv run pytest --cov=src --cov=examples --cov-report=html
481
483
 
482
484
  ### Static Checks
483
485
 
484
- FastMCP uses `pre-commit` for code formatting, linting, and type-checking. All PRs must pass these checks (they run automatically in CI).
486
+ FastMCP uses `prek` for code formatting, linting, and type-checking. All PRs must pass these checks (they run automatically in CI).
485
487
 
486
488
  Install the hooks locally:
487
489
 
488
490
  ```bash
489
- uv run pre-commit install
491
+ uv run prek install
490
492
  ```
491
493
 
492
494
  The hooks will now run automatically on `git commit`. You can also run them manually at any time:
493
495
 
494
496
  ```bash
495
- pre-commit run --all-files
497
+ prek run --all-files
496
498
  # or via uv
497
- uv run pre-commit run --all-files
499
+ uv run prek run --all-files
498
500
  ```
499
501
 
500
502
  ### Pull Requests
@@ -502,7 +504,7 @@ uv run pre-commit run --all-files
502
504
  1. Fork the repository on GitHub.
503
505
  2. Create a feature branch from `main`.
504
506
  3. Make your changes, including tests and documentation updates.
505
- 4. Ensure tests and pre-commit hooks pass.
507
+ 4. Ensure tests and prek hooks pass.
506
508
  5. Commit your changes and push to your fork.
507
509
  6. Open a pull request against the `main` branch of `jlowin/fastmcp`.
508
510
 
@@ -53,7 +53,7 @@ async with Client("https://fastmcp.cloud/mcp", auth=oauth) as client:
53
53
  - **`mcp_url`** (`str`): The full URL of the target MCP server endpoint. Used to discover OAuth server metadata
54
54
  - **`scopes`** (`str | list[str]`, optional): OAuth scopes to request. Can be space-separated string or list of strings
55
55
  - **`client_name`** (`str`, optional): Client name for dynamic registration. Defaults to `"FastMCP Client"`
56
- - **`token_storage_cache_dir`** (`Path`, optional): Token cache directory. Defaults to `~/.fastmcp/oauth-mcp-client-cache/`
56
+ - **`token_storage`** (`AsyncKeyValue`, optional): Storage backend for persisting OAuth tokens. Defaults to in-memory storage (tokens lost on restart). See [Token Storage](#token-storage) for encrypted storage options
57
57
  - **`additional_client_metadata`** (`dict[str, Any]`, optional): Extra metadata for client registration
58
58
  - **`callback_port`** (`int`, optional): Fixed port for OAuth callback server. If not specified, uses a random available port
59
59
 
@@ -64,7 +64,7 @@ The OAuth flow is triggered when you use a FastMCP `Client` configured to use OA
64
64
 
65
65
  <Steps>
66
66
  <Step title="Token Check">
67
- The client first checks the `token_storage_cache_dir` for existing, valid tokens for the target server. If one is found, it will be used to authenticate the client.
67
+ The client first checks the configured `token_storage` backend for existing, valid tokens for the target server. If one is found, it will be used to authenticate the client.
68
68
  </Step>
69
69
  <Step title="OAuth Server Discovery">
70
70
  If no valid tokens exist, the client attempts to discover the OAuth server's endpoints using a well-known URI (e.g., `/.well-known/oauth-authorization-server`) based on the `mcp_url`.
@@ -82,37 +82,51 @@ The user's default web browser is automatically opened, directing them to the OA
82
82
  Upon approval, the OAuth server redirects the user's browser to the local callback server with an `authorization_code`. The client captures this code and exchanges it with the OAuth server's token endpoint for an `access_token` (and often a `refresh_token`) using PKCE for security.
83
83
  </Step>
84
84
  <Step title="Token Caching">
85
- The obtained tokens are saved to the `token_storage_cache_dir` for future use, eliminating the need for repeated browser interactions.
86
- </Step>
85
+ The obtained tokens are saved to the configured `token_storage` backend for future use, eliminating the need for repeated browser interactions.
86
+ </Step>
87
87
  <Step title="Authenticated Requests">
88
- The access token is automatically included in the `Authorization` header for requests to the MCP server.
88
+ The access token is automatically included in the `Authorization` header for requests to the MCP server.
89
89
  </Step>
90
90
  <Step title="Refresh Token">
91
91
  If the access token expires, the client will automatically use the refresh token to get a new access token.
92
92
  </Step>
93
93
  </Steps>
94
94
 
95
- ## Token Management
96
-
97
- ### Token Storage
95
+ ## Token Storage
98
96
 
99
- OAuth access tokens are automatically cached in `~/.fastmcp/oauth-mcp-client-cache/` and persist between application runs. Files are keyed by the OAuth server's base URL.
97
+ <VersionBadge version="2.13.0" />
100
98
 
101
- ### Managing Cache
99
+ By default, tokens are stored in memory and lost when your application restarts. For persistent storage, pass an `AsyncKeyValue`-compatible storage backend to the `token_storage` parameter.
102
100
 
103
- To clear the tokens for a specific server, instantiate a `FileTokenStorage` instance and call the `clear` method:
101
+ <Warning>
102
+ **Security Consideration**: Use encrypted storage for production. MCP clients can accumulate OAuth credentials for many servers over time, and a compromised token store could expose access to multiple services.
103
+ </Warning>
104
104
 
105
105
  ```python
106
- from fastmcp.client.auth.oauth import FileTokenStorage
106
+ from fastmcp import Client
107
+ from fastmcp.client.auth import OAuth
108
+ from key_value.aio.stores.disk import DiskStore
109
+ from key_value.aio.wrappers.encryption import FernetEncryptionWrapper
110
+ from cryptography.fernet import Fernet
111
+ import os
112
+
113
+ # Create encrypted disk storage
114
+ encrypted_storage = FernetEncryptionWrapper(
115
+ key_value=DiskStore(directory="~/.fastmcp/oauth-tokens"),
116
+ fernet=Fernet(os.environ["OAUTH_STORAGE_ENCRYPTION_KEY"])
117
+ )
118
+
119
+ oauth = OAuth(
120
+ mcp_url="https://fastmcp.cloud/mcp",
121
+ token_storage=encrypted_storage
122
+ )
107
123
 
108
- storage = FileTokenStorage(server_url="https://fastmcp.cloud/mcp")
109
- await storage.clear()
124
+ async with Client("https://fastmcp.cloud/mcp", auth=oauth) as client:
125
+ await client.ping()
110
126
  ```
111
127
 
112
- To clear *all* tokens for all servers, call the `clear_all` method on the `FileTokenStorage` class:
113
-
114
- ```python
115
- from fastmcp.client.auth.oauth import FileTokenStorage
128
+ You can use any `AsyncKeyValue`-compatible backend from the [key-value library](https://github.com/strawgate/py-key-value) including Redis, DynamoDB, and more. Wrap your storage in `FernetEncryptionWrapper` for encryption.
116
129
 
117
- FileTokenStorage.clear_all()
118
- ```
130
+ <Note>
131
+ When selecting a storage backend, review the [py-key-value documentation](https://github.com/strawgate/py-key-value) to understand the maturity level and limitations of your chosen backend. Some backends may be in preview or have constraints that affect production suitability.
132
+ </Note>
@@ -223,6 +223,55 @@ async with client:
223
223
  print("Server is reachable")
224
224
  ```
225
225
 
226
+ ### Initialization and Server Information
227
+
228
+ When you enter the client context manager, the client automatically performs an MCP initialization handshake with the server. This handshake exchanges capabilities, server metadata, and instructions. The result is available through the `initialize_result` property.
229
+
230
+ ```python
231
+ from fastmcp import Client, FastMCP
232
+
233
+ mcp = FastMCP(name="MyServer", instructions="Use the greet tool to say hello!")
234
+
235
+ @mcp.tool
236
+ def greet(name: str) -> str:
237
+ """Greet a user by name."""
238
+ return f"Hello, {name}!"
239
+
240
+ async with Client(mcp) as client:
241
+ # Initialization already happened automatically
242
+ print(f"Server: {client.initialize_result.serverInfo.name}")
243
+ print(f"Version: {client.initialize_result.serverInfo.version}")
244
+ print(f"Instructions: {client.initialize_result.instructions}")
245
+ print(f"Capabilities: {client.initialize_result.capabilities.tools}")
246
+ ```
247
+
248
+ #### Manual Initialization Control
249
+
250
+ In advanced scenarios, you might want precise control over when initialization happens. For example, you may need custom error handling, want to defer initialization until after other setup, or need to measure initialization timing separately.
251
+
252
+ Disable automatic initialization and call `initialize()` manually:
253
+
254
+ ```python
255
+ from fastmcp import Client
256
+
257
+ # Disable automatic initialization
258
+ client = Client("my_mcp_server.py", auto_initialize=False)
259
+
260
+ async with client:
261
+ # Connection established, but not initialized yet
262
+ print(f"Connected: {client.is_connected()}")
263
+ print(f"Initialized: {client.initialize_result is not None}") # False
264
+
265
+ # Initialize manually with custom timeout
266
+ result = await client.initialize(timeout=10.0)
267
+ print(f"Server: {result.serverInfo.name}")
268
+
269
+ # Now ready for operations
270
+ tools = await client.list_tools()
271
+ ```
272
+
273
+ The `initialize()` method is idempotent - calling it multiple times returns the cached result from the first successful call.
274
+
226
275
  ## Client Configuration
227
276
 
228
277
  Clients can be configured with additional handlers and settings for specialized use cases.
@@ -101,6 +101,31 @@ async with client:
101
101
  - `arguments`: Dictionary of arguments to pass to the tool (optional)
102
102
  - `timeout`: Maximum execution time in seconds (optional, overrides client-level timeout)
103
103
  - `progress_handler`: Progress callback function (optional, overrides client-level handler)
104
+ - `meta`: Dictionary of metadata to send with the request (optional, see below)
105
+
106
+ ## Sending Metadata
107
+
108
+ <VersionBadge version="2.13.1" />
109
+
110
+ The `meta` parameter sends ancillary information alongside tool calls. This can be used for various purposes like observability, debugging, client identification, or any context the server may need beyond the tool's primary arguments.
111
+
112
+ ```python
113
+ async with client:
114
+ result = await client.call_tool(
115
+ name="send_email",
116
+ arguments={
117
+ "to": "user@example.com",
118
+ "subject": "Hello",
119
+ "body": "Welcome!"
120
+ },
121
+ meta={
122
+ "trace_id": "abc-123",
123
+ "request_source": "mobile_app"
124
+ }
125
+ )
126
+ ```
127
+
128
+ The structure and usage of `meta` is determined by your application. See [Client Metadata](/servers/context#client-metadata) in the server documentation to learn how to access this data in your tool implementations.
104
129
 
105
130
  ## Handling Results
106
131
 
@@ -45,7 +45,7 @@ Run your server with a simple Python command:
45
45
  python server.py
46
46
  ```
47
47
 
48
- Your server is now accessible at `http://localhost:8000/mcp/` (or use your server's actual IP address for remote access).
48
+ Your server is now accessible at `http://localhost:8000/mcp` (or use your server's actual IP address for remote access).
49
49
 
50
50
  This approach is ideal when you want to get online quickly with minimal configuration. It's perfect for internal tools, development environments, or simple deployments where you don't need advanced server features. The built-in server handles all the HTTP details, letting you focus on your MCP implementation.
51
51
 
@@ -72,7 +72,7 @@ Run with any ASGI server - here's an example with Uvicorn:
72
72
  uvicorn app:app --host 0.0.0.0 --port 8000
73
73
  ```
74
74
 
75
- Your server is accessible at the same URL: `http://localhost:8000/mcp/` (or use your server's actual IP address for remote access).
75
+ Your server is accessible at the same URL: `http://localhost:8000/mcp` (or use your server's actual IP address for remote access).
76
76
 
77
77
  The ASGI approach shines in production environments where you need reliability and performance. You can run multiple worker processes to handle concurrent requests, add custom middleware for logging or monitoring, integrate with existing deployment pipelines, or mount your MCP server as part of a larger application.
78
78
 
@@ -293,7 +293,7 @@ api.mount("/mcp", mcp.http_app())
293
293
  # Run with: uvicorn app:api --host 0.0.0.0 --port 8000
294
294
  ```
295
295
 
296
- Your existing API remains at `http://localhost:8000/api/` while MCP is available at `http://localhost:8000/mcp/`.
296
+ Your existing API remains at `http://localhost:8000/api` while MCP is available at `http://localhost:8000/mcp`.
297
297
 
298
298
  ## Mounting Authenticated Servers
299
299
 
@@ -83,7 +83,7 @@ if __name__ == "__main__":
83
83
  mcp.run(transport="http", host="127.0.0.1", port=8000)
84
84
  ```
85
85
 
86
- Your server is now accessible at `http://localhost:8000/mcp/`. This URL is the MCP endpoint that clients will connect to. HTTP transport enables:
86
+ Your server is now accessible at `http://localhost:8000/mcp`. This URL is the MCP endpoint that clients will connect to. HTTP transport enables:
87
87
  - Network accessibility
88
88
  - Multiple concurrent clients
89
89
  - Integration with web infrastructure