fastmcp 2.11.3__tar.gz → 2.12.0__tar.gz
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- fastmcp-2.12.0/.github/pull_request_template.md +28 -0
- fastmcp-2.12.0/.github/workflows/auto-close-duplicates.yml +28 -0
- fastmcp-2.12.0/.github/workflows/marvin-dedupe-issues.yml +80 -0
- fastmcp-2.12.0/.github/workflows/marvin-label-triage.yml +157 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.github/workflows/marvin.yml +23 -4
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.github/workflows/publish.yml +1 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.github/workflows/run-static.yml +5 -21
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.github/workflows/run-tests.yml +7 -5
- fastmcp-2.12.0/.github/workflows/update-config-schema.yml +91 -0
- fastmcp-2.12.0/.github/workflows/update-sdk-docs.yml +74 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.gitignore +6 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.pre-commit-config.yaml +10 -4
- fastmcp-2.12.0/AGENTS.md +251 -0
- fastmcp-2.12.0/CODE_OF_CONDUCT.md +128 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/PKG-INFO +2 -1
- fastmcp-2.12.0/docs/assets/brand/blue-logo.png +0 -0
- fastmcp-2.12.0/docs/assets/brand/card-background.png +0 -0
- fastmcp-2.12.0/docs/assets/brand/logo-wordmark-dark.svg +4 -0
- fastmcp-2.12.0/docs/assets/brand/logo-wordmark.svg +4 -0
- fastmcp-2.12.0/docs/assets/images/fastmcp_cloud/connect.png +0 -0
- fastmcp-2.12.0/docs/assets/images/fastmcp_cloud/create_project.png +0 -0
- fastmcp-2.12.0/docs/assets/images/fastmcp_cloud/deployment.png +0 -0
- fastmcp-2.12.0/docs/assets/images/fastmcp_cloud/quickstart.png +0 -0
- fastmcp-2.12.0/docs/assets/schemas/mcp_server_config/latest.json +348 -0
- fastmcp-2.12.0/docs/assets/schemas/mcp_server_config/v1.json +348 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/changelog.mdx +95 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/sampling.mdx +49 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/tools.mdx +6 -6
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/css/style.css +6 -0
- fastmcp-2.12.0/docs/deployment/fastmcp-cloud.mdx +89 -0
- fastmcp-2.12.0/docs/deployment/running-server.mdx +258 -0
- fastmcp-2.12.0/docs/deployment/self-hosted.mdx +209 -0
- fastmcp-2.12.0/docs/deployment/server-configuration.mdx +640 -0
- fastmcp-2.12.0/docs/deployment/testing.mdx +159 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/docs.json +113 -32
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/getting-started/installation.mdx +2 -2
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/anthropic.mdx +1 -1
- fastmcp-2.11.3/docs/integrations/starlette.mdx → fastmcp-2.12.0/docs/integrations/asgi.mdx +2 -2
- fastmcp-2.12.0/docs/integrations/azure.mdx +250 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/claude-code.mdx +14 -9
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/claude-desktop.mdx +14 -9
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/cursor.mdx +28 -8
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/gemini.mdx +1 -1
- fastmcp-2.12.0/docs/integrations/github.mdx +205 -0
- fastmcp-2.12.0/docs/integrations/google.mdx +215 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/mcp-json-configuration.mdx +17 -7
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/openai.mdx +1 -1
- fastmcp-2.12.0/docs/integrations/workos-oauth.mdx +240 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/patterns/cli.mdx +179 -35
- fastmcp-2.12.0/docs/public/schemas/fastmcp.json/latest.json +361 -0
- fastmcp-2.12.0/docs/public/schemas/fastmcp.json/v1.json +361 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-claude.mdx +3 -3
- fastmcp-2.12.0/docs/python-sdk/fastmcp-cli-cli.mdx +129 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-claude_code.mdx +5 -5
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-claude_desktop.mdx +4 -4
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-cursor.mdx +31 -5
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-mcp_json.mdx +3 -3
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-shared.mdx +5 -3
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-run.mdx +21 -50
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-auth-oauth.mdx +20 -14
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-client.mdx +39 -33
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-sampling.mdx +2 -2
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-transports.mdx +30 -24
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-mcp_config.mdx +19 -19
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-prompts-prompt_manager.mdx +7 -7
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-resources-resource_manager.mdx +10 -10
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-auth.mdx +5 -5
- fastmcp-2.12.0/docs/python-sdk/fastmcp-server-auth-oauth_proxy.mdx +319 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-server-auth-providers-azure.mdx +63 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-server-auth-providers-github.mdx +72 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-server-auth-providers-google.mdx +72 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-providers-jwt.mdx +22 -19
- fastmcp-2.12.0/docs/python-sdk/fastmcp-server-auth-providers-workos.mdx +106 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-server-auth-redirect_validation.mdx +53 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-context.mdx +36 -27
- fastmcp-2.12.0/docs/python-sdk/fastmcp-server-elicitation.mdx +87 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-logging.mdx +18 -6
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-proxy.mdx +7 -7
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-server.mdx +57 -51
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-settings.mdx +1 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-tools-tool.mdx +17 -17
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-tools-tool_manager.mdx +11 -11
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-tools-tool_transform.mdx +13 -13
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-auth.mdx +25 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-cli.mdx +55 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-components.mdx +7 -7
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-inspect.mdx +57 -8
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-logging.mdx +2 -1
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-mcp_config.mdx +28 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-mcp_server_config-__init__.mdx +13 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-__init__.mdx +8 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-environments-__init__.mdx +9 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-environments-base.mdx +43 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-environments-uv.mdx +75 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-mcp_server_config.mdx +235 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-sources-__init__.mdx +8 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-sources-base.mdx +42 -0
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-mcp_server_config-v1-sources-filesystem.mdx +37 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-tests.mdx +6 -4
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-types.mdx +15 -13
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/auth/authentication.mdx +74 -8
- fastmcp-2.12.0/docs/servers/auth/oauth-proxy.mdx +381 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/auth/remote-oauth.mdx +37 -5
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/auth/token-verification.mdx +48 -3
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/composition.mdx +5 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/prompts.mdx +2 -2
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/server.mdx +27 -6
- fastmcp-2.12.0/examples/atproto_mcp/fastmcp.json +11 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/_posts.py +42 -7
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/server.py +1 -6
- fastmcp-2.12.0/examples/auth/azure_oauth/README.md +51 -0
- fastmcp-2.12.0/examples/auth/azure_oauth/client.py +32 -0
- fastmcp-2.12.0/examples/auth/azure_oauth/server.py +40 -0
- fastmcp-2.12.0/examples/auth/github_oauth/README.md +31 -0
- fastmcp-2.12.0/examples/auth/github_oauth/client.py +32 -0
- fastmcp-2.12.0/examples/auth/github_oauth/server.py +36 -0
- fastmcp-2.12.0/examples/auth/google_oauth/README.md +34 -0
- fastmcp-2.12.0/examples/auth/google_oauth/client.py +32 -0
- fastmcp-2.12.0/examples/auth/google_oauth/server.py +38 -0
- fastmcp-2.12.0/examples/auth/workos_oauth/README.md +159 -0
- fastmcp-2.12.0/examples/auth/workos_oauth/client.py +32 -0
- fastmcp-2.12.0/examples/auth/workos_oauth/server.py +38 -0
- fastmcp-2.12.0/examples/fastmcp_config/env_interpolation_example.json +20 -0
- fastmcp-2.12.0/examples/fastmcp_config/fastmcp.json +13 -0
- fastmcp-2.12.0/examples/fastmcp_config/full_example.fastmcp.json +27 -0
- fastmcp-2.12.0/examples/fastmcp_config/server.py +39 -0
- fastmcp-2.12.0/examples/fastmcp_config/simple.fastmcp.json +7 -0
- fastmcp-2.12.0/examples/fastmcp_config_demo/README.md +55 -0
- fastmcp-2.12.0/examples/fastmcp_config_demo/fastmcp.json +14 -0
- fastmcp-2.12.0/examples/fastmcp_config_demo/server.py +70 -0
- fastmcp-2.12.0/examples/memory.fastmcp.json +7 -0
- fastmcp-2.12.0/examples/mount_example.fastmcp.json +4 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/mount_example.py +1 -3
- fastmcp-2.12.0/examples/sampling_fallback.py +34 -0
- fastmcp-2.12.0/examples/screenshot.fastmcp.json +7 -0
- fastmcp-2.12.0/examples/smart_home/hub.fastmcp.json +9 -0
- fastmcp-2.12.0/examples/smart_home/lights.fastmcp.json +9 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/justfile +2 -2
- {fastmcp-2.11.3 → fastmcp-2.12.0}/pyproject.toml +18 -11
- fastmcp-2.12.0/scripts/auto_close_duplicates.py +331 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/__init__.py +5 -4
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/cli/claude.py +22 -18
- fastmcp-2.12.0/src/fastmcp/cli/cli.py +858 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/cli/install/claude_code.py +37 -40
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/cli/install/claude_desktop.py +37 -42
- fastmcp-2.12.0/src/fastmcp/cli/install/cursor.py +347 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/cli/install/mcp_json.py +38 -43
- fastmcp-2.12.0/src/fastmcp/cli/install/shared.py +142 -0
- fastmcp-2.12.0/src/fastmcp/cli/run.py +304 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/auth/oauth.py +69 -13
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/client.py +46 -9
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/oauth_callback.py +91 -91
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/sampling.py +12 -4
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/transports.py +139 -64
- fastmcp-2.12.0/src/fastmcp/experimental/sampling/handlers/__init__.py +3 -0
- fastmcp-2.12.0/src/fastmcp/experimental/sampling/handlers/base.py +21 -0
- fastmcp-2.12.0/src/fastmcp/experimental/sampling/handlers/openai.py +163 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/server/openapi/routing.py +0 -2
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/server/openapi/server.py +0 -2
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/parser.py +5 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/mcp_config.py +40 -20
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/prompts/prompt_manager.py +2 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/resources/resource_manager.py +4 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/auth/__init__.py +2 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/auth/auth.py +2 -1
- fastmcp-2.12.0/src/fastmcp/server/auth/oauth_proxy.py +1047 -0
- fastmcp-2.12.0/src/fastmcp/server/auth/providers/azure.py +270 -0
- fastmcp-2.12.0/src/fastmcp/server/auth/providers/github.py +287 -0
- fastmcp-2.12.0/src/fastmcp/server/auth/providers/google.py +305 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/auth/providers/jwt.py +24 -12
- fastmcp-2.12.0/src/fastmcp/server/auth/providers/workos.py +405 -0
- fastmcp-2.12.0/src/fastmcp/server/auth/redirect_validation.py +65 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/context.py +91 -41
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/elicitation.py +60 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/http.py +3 -3
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/middleware/logging.py +66 -28
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/proxy.py +2 -0
- fastmcp-2.12.0/src/fastmcp/server/sampling/handler.py +19 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/server.py +76 -15
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/settings.py +16 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/tools/tool.py +22 -9
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/tools/tool_manager.py +2 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/tools/tool_transform.py +39 -10
- fastmcp-2.12.0/src/fastmcp/utilities/auth.py +34 -0
- fastmcp-2.12.0/src/fastmcp/utilities/cli.py +235 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/components.py +2 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/inspect.py +166 -37
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/json_schema_type.py +4 -2
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/logging.py +4 -1
- fastmcp-2.12.0/src/fastmcp/utilities/mcp_config.py +57 -0
- fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/__init__.py +25 -0
- fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1/environments/__init__.py +6 -0
- fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1/environments/base.py +30 -0
- fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1/environments/uv.py +306 -0
- fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1/mcp_server_config.py +446 -0
- fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1/schema.json +361 -0
- fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1/sources/base.py +30 -0
- fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1/sources/filesystem.py +216 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/tests.py +7 -2
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/types.py +15 -2
- fastmcp-2.12.0/test_github_oauth.py +21 -0
- fastmcp-2.12.0/test_google_oauth.py +22 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/cli/test_cli.py +101 -156
- fastmcp-2.12.0/tests/cli/test_config.py +444 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/cli/test_cursor.py +12 -7
- fastmcp-2.12.0/tests/cli/test_mcp_server_config_integration.py +290 -0
- fastmcp-2.12.0/tests/cli/test_mcp_server_config_schema.py +149 -0
- fastmcp-2.12.0/tests/cli/test_project_prepare.py +303 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/cli/test_run.py +165 -32
- fastmcp-2.12.0/tests/cli/test_run_config.py +271 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/cli/test_run_with_uv.py +47 -38
- fastmcp-2.12.0/tests/cli/test_server_args.py +139 -0
- fastmcp-2.12.0/tests/cli/test_with_argv.py +91 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/auth/test_oauth_client.py +1 -1
- fastmcp-2.12.0/tests/client/auth/test_oauth_token_expiry.py +152 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_elicitation.py +84 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_sampling.py +26 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_sse.py +1 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_stdio.py +128 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/conftest.py +8 -0
- fastmcp-2.12.0/tests/deprecated/test_dependencies.py +30 -0
- fastmcp-2.12.0/tests/deprecated/test_output_schema_false.py +139 -0
- fastmcp-2.12.0/tests/experimental/sampling/test_openai_handler.py +100 -0
- fastmcp-2.12.0/tests/integration_tests/auth/test_github_provider_integration.py +356 -0
- fastmcp-2.12.0/tests/server/auth/providers/__init__.py +0 -0
- fastmcp-2.12.0/tests/server/auth/providers/test_azure.py +164 -0
- fastmcp-2.12.0/tests/server/auth/providers/test_github.py +240 -0
- fastmcp-2.12.0/tests/server/auth/providers/test_google.py +116 -0
- fastmcp-2.12.0/tests/server/auth/providers/test_workos.py +152 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/auth/test_jwt_provider.py +274 -1
- fastmcp-2.12.0/tests/server/auth/test_oauth_proxy.py +594 -0
- fastmcp-2.12.0/tests/server/auth/test_oauth_proxy_redirect_validation.py +197 -0
- fastmcp-2.12.0/tests/server/auth/test_redirect_validation.py +141 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/auth/test_workos.py +1 -1
- fastmcp-2.12.0/tests/server/http/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/http/test_http_dependencies.py +2 -2
- fastmcp-2.12.0/tests/server/middleware/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/middleware/test_logging.py +295 -48
- fastmcp-2.12.0/tests/server/openapi/__init__.py +0 -0
- fastmcp-2.12.0/tests/server/proxy/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/proxy/test_proxy_server.py +1 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_context.py +7 -7
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_mount.py +131 -6
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_server.py +1 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_server_interactions.py +3 -3
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/test_mcp_config.py +184 -0
- fastmcp-2.12.0/tests/tools/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/tools/test_tool.py +241 -69
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/tools/test_tool_manager.py +42 -1
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/tools/test_tool_transform.py +237 -32
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/openapi/test_openapi.py +262 -205
- fastmcp-2.12.0/tests/utilities/test_cli.py +192 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/test_inspect.py +210 -10
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/test_json_schema.py +1 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/uv.lock +613 -420
- fastmcp-2.11.3/.github/labeler.yml +0 -33
- fastmcp-2.11.3/.github/workflows/labeler.yml +0 -13
- fastmcp-2.11.3/AGENTS.md +0 -134
- fastmcp-2.11.3/docs/deployment/running-server.mdx +0 -323
- fastmcp-2.11.3/docs/patterns/testing.mdx +0 -48
- fastmcp-2.11.3/docs/python-sdk/fastmcp-cli-cli.mdx +0 -80
- fastmcp-2.11.3/docs/python-sdk/fastmcp-server-auth-providers-workos.mdx +0 -48
- fastmcp-2.11.3/docs/python-sdk/fastmcp-server-elicitation.mdx +0 -54
- fastmcp-2.11.3/docs/python-sdk/fastmcp-utilities-cli.mdx +0 -25
- fastmcp-2.11.3/docs/python-sdk/fastmcp-utilities-mcp_config.mdx +0 -28
- fastmcp-2.11.3/src/fastmcp/cli/cli.py +0 -522
- fastmcp-2.11.3/src/fastmcp/cli/install/cursor.py +0 -237
- fastmcp-2.11.3/src/fastmcp/cli/install/shared.py +0 -85
- fastmcp-2.11.3/src/fastmcp/cli/run.py +0 -397
- fastmcp-2.11.3/src/fastmcp/server/auth/providers/workos.py +0 -151
- fastmcp-2.11.3/src/fastmcp/utilities/cli.py +0 -102
- fastmcp-2.11.3/src/fastmcp/utilities/mcp_config.py +0 -28
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.ccignore +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.cursor/rules/core-mcp-objects.mdc +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.github/ISSUE_TEMPLATE/bug.yml +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.github/ISSUE_TEMPLATE/enhancement.yml +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.github/copilot-instructions.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.github/dependabot.yml +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/.github/release.yml +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/CLAUDE.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/LICENSE +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/README.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/README_OPENAPI.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/Windows_Notes.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/.ccignore +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/.cursor/rules/mintlify.mdc +0 -0
- {fastmcp-2.11.3/docs/assets → fastmcp-2.12.0/docs/assets/brand}/favicon.svg +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/assets/images/tutorial-rest-api-result.png +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/assets/updates/release-2-7.png +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/auth/bearer.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/auth/oauth.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/client.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/elicitation.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/logging.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/messages.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/progress.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/prompts.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/resources.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/roots.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/clients/transports.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/community/README.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/community/showcase.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/css/banner.css +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/css/python-sdk.css +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/css/version-badge.css +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/getting-started/quickstart.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/getting-started/welcome.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/authkit.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/chatgpt.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/cursor-install-mcp.png +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/eunomia-authorization.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/fastapi.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/images/authkit/enable_dcr.png +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/images/permit/abac_condition_example.png +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/images/permit/abac_policy_example.png +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/images/permit/policy_mapping.png +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/images/permit/role_assignement.png +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/openapi.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/integrations/permit.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/patterns/contrib.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/patterns/decorating-methods.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/patterns/tool-transformation.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-auth-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-auth-bearer.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-elicitation.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-logging.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-messages.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-oauth_callback.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-progress.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-roots.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-exceptions.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-prompts-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-prompts-prompt.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-resources-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-resources-resource.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-resources-template.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-resources-types.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-providers-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-providers-bearer.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-providers-in_memory.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-registry.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-dependencies.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-http.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-low_level.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-error_handling.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-middleware.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-rate_limiting.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-timing.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-openapi.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-tools-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-__init__.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-exceptions.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-http.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-json_schema.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-json_schema_type.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-openapi.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/auth/full-oauth-server.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/context.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/elicitation.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/logging.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/middleware.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/progress.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/proxy.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/resources.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/sampling.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/servers/tools.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/snippets/local-focus.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/snippets/version-badge.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/snippets/youtube-embed.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/tutorials/create-mcp-server.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/tutorials/mcp.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/tutorials/rest-api.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/docs/updates.mdx +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/README.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/demo.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/pyproject.toml +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/__main__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/_client.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/_profile.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/_read.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/_social.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/py.typed +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/settings.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/types.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/complex_inputs.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/config_server.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/desktop.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/echo.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/get_file.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/in_memory_proxy_example.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/memory.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/sampling.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/screenshot.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/serializer.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/simple_echo.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/README.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/pyproject.toml +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/__main__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/hub.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/lights/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/lights/hue_utils.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/lights/server.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/py.typed +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/settings.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/smart_home/uv.lock +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/tags_example.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/examples/text_me.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/cli/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/cli/install/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/auth/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/auth/bearer.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/elicitation.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/logging.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/messages.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/progress.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/client/roots.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/README.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/component_manager/README.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/component_manager/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/component_manager/component_service.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/component_manager/example.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/exceptions.py +0 -0
- {fastmcp-2.11.3/src/fastmcp/server/auth/providers → fastmcp-2.12.0/src/fastmcp/experimental/sampling}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/server/openapi/README.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/server/openapi/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/server/openapi/components.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/README.md +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/director.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/formatters.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/json_schema_converter.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/models.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/schemas.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/prompts/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/prompts/prompt.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/py.typed +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/resources/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/resources/resource.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/resources/template.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/resources/types.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/__init__.py +0 -0
- {fastmcp-2.11.3/tests → fastmcp-2.12.0/src/fastmcp/server/auth/providers}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/auth/providers/bearer.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/auth/providers/in_memory.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/auth/registry.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/dependencies.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/low_level.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/middleware/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/middleware/error_handling.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/middleware/middleware.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/middleware/rate_limiting.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/middleware/timing.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/server/openapi.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/tools/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/exceptions.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/http.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/json_schema.py +0 -0
- {fastmcp-2.11.3/tests/client → fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1}/__init__.py +0 -0
- {fastmcp-2.11.3/tests/client/auth → fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1/sources}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/src/fastmcp/utilities/openapi.py +0 -0
- {fastmcp-2.11.3/tests/client/transports → fastmcp-2.12.0/tests}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/cli/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/cli/test_install.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/cli/test_shared.py +0 -0
- {fastmcp-2.11.3/tests/experimental → fastmcp-2.12.0/tests/client}/__init__.py +0 -0
- {fastmcp-2.11.3/tests/experimental/openapi_parser → fastmcp-2.12.0/tests/client/auth}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_client.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_logs.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_notifications.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_openapi_experimental.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_openapi_legacy.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_progress.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_roots.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/test_streamable_http.py +0 -0
- {fastmcp-2.11.3/tests/experimental/openapi_parser/server → fastmcp-2.12.0/tests/client/transports}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/client/transports/test_uv_transport.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/contrib/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/contrib/test_bulk_tool_caller.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/contrib/test_component_manager.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/contrib/test_mcp_mixin.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/deprecated/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/deprecated/test_bearer_auth_provider.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/deprecated/test_deprecated.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/deprecated/test_mount_import_arg_order.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/deprecated/test_mount_separators.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/deprecated/test_proxy_client.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/deprecated/test_resource_prefixes.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/deprecated/test_route_type_ignore.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/deprecated/test_settings.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/README.md +0 -0
- {fastmcp-2.11.3/tests/experimental/openapi_parser/utilities → fastmcp-2.12.0/tests/experimental}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/README.md +0 -0
- {fastmcp-2.11.3/tests/integration_tests → fastmcp-2.12.0/tests/experimental/openapi_parser}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/conftest.py +0 -0
- {fastmcp-2.11.3/tests/prompts → fastmcp-2.12.0/tests/experimental/openapi_parser/server}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/server/openapi/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/server/openapi/test_comprehensive.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/server/openapi/test_deepobject_style.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/server/openapi/test_end_to_end_compatibility.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/server/openapi/test_openapi_features.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/server/openapi/test_openapi_performance.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/server/openapi/test_parameter_collisions.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/server/openapi/test_performance_comparison.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/server/openapi/test_server.py +0 -0
- {fastmcp-2.11.3/tests/resources → fastmcp-2.12.0/tests/experimental/openapi_parser/utilities}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/utilities/openapi/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/utilities/openapi/conftest.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/utilities/openapi/test_allof_requestbody.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/utilities/openapi/test_director.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/utilities/openapi/test_legacy_compatibility.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/utilities/openapi/test_models.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/utilities/openapi/test_nullable_fields.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/utilities/openapi/test_parser.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/utilities/openapi/test_schemas.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/experimental/openapi_parser/utilities/openapi/test_transitive_references.py +0 -0
- {fastmcp-2.11.3/tests/server → fastmcp-2.12.0/tests/integration_tests}/__init__.py +0 -0
- {fastmcp-2.11.3/tests/server/http → fastmcp-2.12.0/tests/integration_tests/auth}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/integration_tests/conftest.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/integration_tests/test_github_mcp_remote.py +0 -0
- {fastmcp-2.11.3/tests/server/middleware → fastmcp-2.12.0/tests/prompts}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/prompts/test_prompt.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/prompts/test_prompt_manager.py +0 -0
- {fastmcp-2.11.3/tests/server/openapi → fastmcp-2.12.0/tests/resources}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/resources/test_file_resources.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/resources/test_function_resources.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/resources/test_resource_manager.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/resources/test_resource_template.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/resources/test_resource_template_meta.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/resources/test_resources.py +0 -0
- {fastmcp-2.11.3/tests/server/proxy → fastmcp-2.12.0/tests/server}/__init__.py +0 -0
- {fastmcp-2.11.3/tests/tools → fastmcp-2.12.0/tests/server/auth}/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/auth/test_remote_auth_provider.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/auth/test_static_token_verifier.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/http/test_bearer_auth_backend.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/http/test_custom_routes.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/http/test_http_auth_middleware.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/http/test_http_middleware.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/middleware/test_error_handling.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/middleware/test_middleware.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/middleware/test_rate_limiting.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/middleware/test_timing.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/conftest.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_advanced_behavior.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_basic_functionality.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_configuration.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_deepobject_style.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_description_propagation.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_explode_integration.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_openapi_compatibility.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_openapi_path_parameters.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_optional_parameters.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_parameter_collisions.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/openapi/test_route_map_fn.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/proxy/test_proxy_client.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/proxy/test_stateful_proxy_client.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_app_state.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_auth_integration.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_experimental_openapi_feature_flag.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_file_server.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_import_server.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_logging.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_resource_prefix_formats.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_run_server.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_streamable_http_no_redirect.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_tool_annotations.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_tool_exclude_args.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/server/test_tool_transformation.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/test_examples.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/tools/test_tool_future_annotations.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/openapi/__init__.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/openapi/conftest.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/openapi/test_nullable_fields.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/openapi/test_openapi_advanced.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/openapi/test_openapi_fastapi.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/openapi/test_openapi_output_schemas.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/test_components.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/test_json_schema_type.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/test_logging.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/test_tests.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/test_typeadapter.py +0 -0
- {fastmcp-2.11.3 → fastmcp-2.12.0}/tests/utilities/test_types.py +0 -0
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
## Description
|
|
2
|
+
<!--
|
|
3
|
+
Please provide a clear and concise description of the changes made in this pull request.
|
|
4
|
+
|
|
5
|
+
Using AI to generate code? Please include a note in the description with which AI tool you used.
|
|
6
|
+
-->
|
|
7
|
+
|
|
8
|
+
**Contributors Checklist**
|
|
9
|
+
<!--
|
|
10
|
+
NOTE:
|
|
11
|
+
1. You must create an issue in the repository before making a Pull Request.
|
|
12
|
+
2. You must not create a Pull Request for an issue that is already assigned to someone else.
|
|
13
|
+
|
|
14
|
+
If you do not follow these steps, your Pull Request will be closed without review.
|
|
15
|
+
-->
|
|
16
|
+
|
|
17
|
+
- [ ] My change is related to issue #(issue number)
|
|
18
|
+
- [ ] I have followed the repository's development workflow
|
|
19
|
+
- [ ] I have tested my changes manually and by adding relevant tests
|
|
20
|
+
- [ ] I have performed all required documentation updates
|
|
21
|
+
|
|
22
|
+
**Review Checklist**
|
|
23
|
+
<!-- Your Pull Request will not be reviewed if tests are failing, you have not self-reviewed your changes, or you have not checked all of the following: -->
|
|
24
|
+
|
|
25
|
+
- [ ] I have self-reviewed my changes
|
|
26
|
+
- [ ] My Pull Request is ready for review
|
|
27
|
+
|
|
28
|
+
---
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
name: Auto-close duplicate issues
|
|
2
|
+
description: Auto-closes issues that are duplicates of existing issues
|
|
3
|
+
on:
|
|
4
|
+
schedule:
|
|
5
|
+
- cron: "0 9 * * *" # Run daily at 9 AM UTC
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
|
|
8
|
+
jobs:
|
|
9
|
+
auto-close-duplicates:
|
|
10
|
+
runs-on: ubuntu-latest
|
|
11
|
+
timeout-minutes: 10
|
|
12
|
+
permissions:
|
|
13
|
+
contents: read
|
|
14
|
+
issues: write
|
|
15
|
+
|
|
16
|
+
steps:
|
|
17
|
+
- name: Checkout repository
|
|
18
|
+
uses: actions/checkout@v5
|
|
19
|
+
|
|
20
|
+
- name: Install uv
|
|
21
|
+
uses: astral-sh/setup-uv@v6
|
|
22
|
+
|
|
23
|
+
- name: Auto-close duplicate issues
|
|
24
|
+
run: uv run scripts/auto_close_duplicates.py
|
|
25
|
+
env:
|
|
26
|
+
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
27
|
+
GITHUB_REPOSITORY_OWNER: ${{ github.repository_owner }}
|
|
28
|
+
GITHUB_REPOSITORY_NAME: ${{ github.event.repository.name }}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
name: Marvin Issue Dedupe
|
|
2
|
+
description: Automatically dedupe GitHub issues using Marvin
|
|
3
|
+
on:
|
|
4
|
+
issues:
|
|
5
|
+
types: [opened]
|
|
6
|
+
workflow_dispatch:
|
|
7
|
+
inputs:
|
|
8
|
+
issue_number:
|
|
9
|
+
description: "Issue number to process for duplicate detection"
|
|
10
|
+
required: true
|
|
11
|
+
type: string
|
|
12
|
+
|
|
13
|
+
jobs:
|
|
14
|
+
marvin-dedupe-issues:
|
|
15
|
+
runs-on: ubuntu-latest
|
|
16
|
+
timeout-minutes: 10
|
|
17
|
+
permissions:
|
|
18
|
+
contents: read
|
|
19
|
+
issues: write
|
|
20
|
+
|
|
21
|
+
steps:
|
|
22
|
+
- name: Checkout repository
|
|
23
|
+
uses: actions/checkout@v5
|
|
24
|
+
|
|
25
|
+
- name: Generate Marvin App token
|
|
26
|
+
id: marvin-token
|
|
27
|
+
uses: actions/create-github-app-token@v2
|
|
28
|
+
with:
|
|
29
|
+
app-id: ${{ secrets.MARVIN_APP_ID }}
|
|
30
|
+
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
|
|
31
|
+
|
|
32
|
+
- name: Create dedupe prompt
|
|
33
|
+
run: |
|
|
34
|
+
mkdir -p /tmp/claude-prompts
|
|
35
|
+
cat > /tmp/claude-prompts/dedupe-prompt.txt << 'EOF'
|
|
36
|
+
Find up to 3 likely duplicate issues for GitHub issue ${{ github.repository }}/issues/${{ github.event.issue.number || inputs.issue_number }}.
|
|
37
|
+
|
|
38
|
+
Follow these steps precisely:
|
|
39
|
+
|
|
40
|
+
1. Use the Task tool to check if the GitHub issue (a) is closed, (b) does not need to be deduped (eg. because it is broad product feedback without a specific solution, or positive feedback), or (c) already has a duplicates comment that you made earlier. If so, do not proceed.
|
|
41
|
+
|
|
42
|
+
2. Use the Task tool to view the GitHub issue, and ask the agent to return a summary of the issue
|
|
43
|
+
|
|
44
|
+
3. Then, launch 3 parallel agents using the Task tool to search GitHub for duplicates of this issue, using diverse keywords and search approaches, using the summary from step 2
|
|
45
|
+
|
|
46
|
+
4. Next, feed the results from steps 2 and 3 into another agent using the Task tool, so that it can filter out false positives that are likely not actually duplicates of the original issue. If there are no duplicates remaining, do not proceed.
|
|
47
|
+
|
|
48
|
+
5. Finally, comment back on the issue with a list of up to three duplicate issues (or zero, if there are no likely duplicates). If there are no duplicates, DO NOT COMMENT. Just exit.
|
|
49
|
+
|
|
50
|
+
Notes for your agents:
|
|
51
|
+
- Use `gh` to interact with GitHub, rather than web fetch
|
|
52
|
+
- Do not use other tools, beyond `gh` and Task (eg. don't use other MCP servers, file edit, etc.)
|
|
53
|
+
- Make a todo list first
|
|
54
|
+
|
|
55
|
+
For your comment, follow this format precisely (example with 3 suspected duplicates):
|
|
56
|
+
|
|
57
|
+
---
|
|
58
|
+
Found 3 possible duplicate issues:
|
|
59
|
+
|
|
60
|
+
1. #123: Issue title here
|
|
61
|
+
2. #456: Another issue title
|
|
62
|
+
3. #789: Third issue title
|
|
63
|
+
|
|
64
|
+
This issue will be automatically closed as a duplicate in 3 days.
|
|
65
|
+
|
|
66
|
+
- If your issue is a duplicate, please close it and 👍 the existing issue instead
|
|
67
|
+
- To prevent auto-closure, add a comment or 👎 this comment
|
|
68
|
+
|
|
69
|
+
---
|
|
70
|
+
EOF
|
|
71
|
+
|
|
72
|
+
- name: Run Marvin dedupe command
|
|
73
|
+
uses: anthropics/claude-code-base-action@beta
|
|
74
|
+
with:
|
|
75
|
+
model: claude-3-5-haiku-latest
|
|
76
|
+
prompt_file: /tmp/claude-prompts/dedupe-prompt.txt
|
|
77
|
+
allowed_tools: "Bash(gh issue view:*),Bash(gh search:*),Bash(gh issue list:*),Bash(gh api:*),Bash(gh issue comment:*),Task"
|
|
78
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY_FOR_CI }}
|
|
79
|
+
claude_env: |
|
|
80
|
+
GH_TOKEN: ${{ steps.marvin-token.outputs.token }}
|
|
@@ -0,0 +1,157 @@
|
|
|
1
|
+
name: Marvin Label Triage
|
|
2
|
+
description: Automatically triage GitHub issues and PRs using Marvin
|
|
3
|
+
on:
|
|
4
|
+
issues:
|
|
5
|
+
types: [opened]
|
|
6
|
+
pull_request_target:
|
|
7
|
+
types: [opened]
|
|
8
|
+
workflow_dispatch:
|
|
9
|
+
inputs:
|
|
10
|
+
issue_number:
|
|
11
|
+
description: "Issue or PR number to triage"
|
|
12
|
+
required: true
|
|
13
|
+
type: string
|
|
14
|
+
|
|
15
|
+
concurrency:
|
|
16
|
+
group: triage-${{ github.event.issue.number || github.event.pull_request.number || inputs.issue_number }}
|
|
17
|
+
cancel-in-progress: false
|
|
18
|
+
|
|
19
|
+
jobs:
|
|
20
|
+
triage-issue:
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
timeout-minutes: 10
|
|
23
|
+
permissions:
|
|
24
|
+
contents: read
|
|
25
|
+
issues: write
|
|
26
|
+
pull-requests: write
|
|
27
|
+
|
|
28
|
+
steps:
|
|
29
|
+
- name: Checkout base repository
|
|
30
|
+
uses: actions/checkout@v5
|
|
31
|
+
with:
|
|
32
|
+
repository: ${{ github.repository }}
|
|
33
|
+
ref: ${{ github.event.repository.default_branch }}
|
|
34
|
+
|
|
35
|
+
- name: Generate Marvin App token
|
|
36
|
+
id: marvin-token
|
|
37
|
+
uses: actions/create-github-app-token@v2
|
|
38
|
+
with:
|
|
39
|
+
app-id: ${{ secrets.MARVIN_APP_ID }}
|
|
40
|
+
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
|
|
41
|
+
|
|
42
|
+
- name: Create triage prompt
|
|
43
|
+
run: |
|
|
44
|
+
mkdir -p /tmp/claude-prompts
|
|
45
|
+
cat > /tmp/claude-prompts/triage-prompt.txt << 'EOF'
|
|
46
|
+
You're an issue triage assistant for FastMCP, a Python framework for building Model Context Protocol servers and clients. Your task is to analyze issues/PRs and apply appropriate labels.
|
|
47
|
+
|
|
48
|
+
IMPORTANT: Your ONLY action should be to apply labels using mcp__github__update_issue. DO NOT post any comments.
|
|
49
|
+
|
|
50
|
+
Issue/PR Information:
|
|
51
|
+
- REPO: ${{ github.repository }}
|
|
52
|
+
- NUMBER: ${{ github.event.issue.number || github.event.pull_request.number || inputs.issue_number }}
|
|
53
|
+
- TYPE: ${{ github.event.issue && 'issue' || (github.event.pull_request && 'pull_request') || 'unknown' }}
|
|
54
|
+
|
|
55
|
+
TRIAGE PROCESS:
|
|
56
|
+
|
|
57
|
+
1. Get available labels:
|
|
58
|
+
Run: `gh label list`
|
|
59
|
+
|
|
60
|
+
2. Retrieve issue/PR details using GitHub tools:
|
|
61
|
+
- mcp__github__get_issue: Get the issue/PR details
|
|
62
|
+
- mcp__github__get_issue_comments: Read any discussion
|
|
63
|
+
- If the issue/PR mentions other issues (e.g., "fixes #123", "related to #456"), use mcp__github__get_issue to read those linked issues for additional context
|
|
64
|
+
|
|
65
|
+
3. Analyze and apply labels based on these guidelines:
|
|
66
|
+
|
|
67
|
+
CORE CATEGORIES (apply EXACTLY ONE - these are mutually exclusive):
|
|
68
|
+
- bug: Reports of broken functionality OR PRs that fix bugs
|
|
69
|
+
- enhancement: New functions/endpoints, improvements to existing features, internal tooling, workflow improvements, minor new capabilities
|
|
70
|
+
- feature: ONLY for major headline functionality worthy of a blog post announcement (2-4 per release, never for issues)
|
|
71
|
+
- documentation: Primary change is to user-facing docs, examples, or guides
|
|
72
|
+
|
|
73
|
+
SPECIAL DOCUMENTATION RULES:
|
|
74
|
+
- DO NOT apply "documentation" label if PR only updates auto-generated SDK docs (docs/python-sdk/**)
|
|
75
|
+
- DO apply "documentation" label for significant user-facing documentation changes (guides, examples, API docs)
|
|
76
|
+
- Auto-generated docs updates should get appropriate category label (enhancement, bug, etc.) based on the underlying code changes
|
|
77
|
+
|
|
78
|
+
FEATURE vs ENHANCEMENT guidance:
|
|
79
|
+
- feature: Major systems like new auth systems, MCP composition, proxying MCP servers, major CLI commands that transform workflows
|
|
80
|
+
- enhancement: New functions/endpoints, internal workflows, CI improvements, developer tooling, refactoring, utilities, typical new CLI commands
|
|
81
|
+
- If unsure between feature/enhancement, choose enhancement
|
|
82
|
+
|
|
83
|
+
Note: If a PR fixes a bug, label it "bug" not "enhancement"
|
|
84
|
+
|
|
85
|
+
SPECIAL CATEGORY (can be combined with above):
|
|
86
|
+
- breaking change: Changes that break backward compatibility (in addition to core category)
|
|
87
|
+
|
|
88
|
+
PRIORITY (apply if clearly evident):
|
|
89
|
+
- high-priority: Critical bugs affecting many users, security issues, or blocking core functionality
|
|
90
|
+
- low-priority: Edge cases, nice-to-have improvements, or cosmetic issues
|
|
91
|
+
- Default to no priority label if unclear
|
|
92
|
+
|
|
93
|
+
STATUS (apply if applicable):
|
|
94
|
+
- needs more info: Issue lacks reproduction steps, error messages, or clear description
|
|
95
|
+
- good first issue: ONLY if it's clearly scoped, has obvious solution, and touches limited files
|
|
96
|
+
- invalid: Spam, completely off-topic, or nonsensical (often LLM-generated)
|
|
97
|
+
|
|
98
|
+
AREA LABELS (apply ONLY when thematically central to the issue):
|
|
99
|
+
- cli: Issues primarily about FastMCP CLI commands (run, dev, install)
|
|
100
|
+
- client: Issues primarily about the Client SDK or client-side functionality
|
|
101
|
+
- server: Issues primarily about FastMCP server implementation
|
|
102
|
+
- auth: Authentication is the main concern (Bearer, JWT, OAuth, WorkOS)
|
|
103
|
+
- openapi: OpenAPI integration/parsing is the primary topic
|
|
104
|
+
- http: HTTP transport or networking is the main issue
|
|
105
|
+
- contrib: Specifically about community contributions in src/contrib/
|
|
106
|
+
- tests: Issues primarily about testing infrastructure, CI/CD workflows, or test coverage
|
|
107
|
+
|
|
108
|
+
IMPORTANT LABELING RULES:
|
|
109
|
+
- Be selective - only apply labels that are clearly relevant
|
|
110
|
+
- Don't apply area labels just because a file in that area is mentioned
|
|
111
|
+
- The issue must be PRIMARILY about that area to get the label
|
|
112
|
+
- When in doubt, don't apply the label
|
|
113
|
+
- Apply 2-5 labels total typically (category + maybe priority + maybe 1-2 areas)
|
|
114
|
+
|
|
115
|
+
META LABELS (rarely needed for issues):
|
|
116
|
+
- dependencies: Only for dependabot PRs or issues specifically about package updates
|
|
117
|
+
- DON'T MERGE: Only if PR author explicitly states it's not ready
|
|
118
|
+
|
|
119
|
+
4. Apply selected labels:
|
|
120
|
+
Use mcp__github__update_issue to apply your selected labels
|
|
121
|
+
DO NOT post any comments
|
|
122
|
+
EOF
|
|
123
|
+
|
|
124
|
+
- name: Setup GitHub MCP Server
|
|
125
|
+
run: |
|
|
126
|
+
mkdir -p /tmp/mcp-config
|
|
127
|
+
cat > /tmp/mcp-config/mcp-servers.json << 'EOF'
|
|
128
|
+
{
|
|
129
|
+
"mcpServers": {
|
|
130
|
+
"github": {
|
|
131
|
+
"command": "docker",
|
|
132
|
+
"args": [
|
|
133
|
+
"run",
|
|
134
|
+
"-i",
|
|
135
|
+
"--rm",
|
|
136
|
+
"-e",
|
|
137
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN",
|
|
138
|
+
"ghcr.io/github/github-mcp-server:sha-7aced2b"
|
|
139
|
+
],
|
|
140
|
+
"env": {
|
|
141
|
+
"GITHUB_PERSONAL_ACCESS_TOKEN": "${{ steps.marvin-token.outputs.token }}"
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
EOF
|
|
147
|
+
|
|
148
|
+
- name: Run Marvin for Issue Triage
|
|
149
|
+
uses: anthropics/claude-code-base-action@beta
|
|
150
|
+
with:
|
|
151
|
+
prompt_file: /tmp/claude-prompts/triage-prompt.txt
|
|
152
|
+
allowed_tools: "Bash(gh label list),mcp__github__get_issue,mcp__github__get_issue_comments,mcp__github__update_issue,mcp__github__get_pull_request_files"
|
|
153
|
+
timeout_minutes: "5"
|
|
154
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY_FOR_CI }}
|
|
155
|
+
mcp_config: /tmp/mcp-config/mcp-servers.json
|
|
156
|
+
claude_env: |
|
|
157
|
+
GH_TOKEN: ${{ steps.marvin-token.outputs.token }}
|
|
@@ -4,6 +4,7 @@ on:
|
|
|
4
4
|
issue_comment: { types: [created] }
|
|
5
5
|
pull_request_review_comment: { types: [created] }
|
|
6
6
|
pull_request_review: { types: [submitted] }
|
|
7
|
+
pull_request: { types: [opened, edited] }
|
|
7
8
|
issues: { types: [opened, edited, assigned, labeled] }
|
|
8
9
|
discussion: { types: [created, edited, labeled] }
|
|
9
10
|
discussion_comment: { types: [created] }
|
|
@@ -22,6 +23,7 @@ jobs:
|
|
|
22
23
|
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '/marvin')) ||
|
|
23
24
|
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/marvin')) ||
|
|
24
25
|
(github.event_name == 'pull_request_review' && contains(github.event.review.body, '/marvin')) ||
|
|
26
|
+
(github.event_name == 'pull_request' && contains(github.event.pull_request.body, '/marvin')) ||
|
|
25
27
|
(github.event_name == 'issues' && contains(github.event.issue.body, '/marvin')) ||
|
|
26
28
|
(github.event_name == 'discussion' && contains(github.event.discussion.body, '/marvin')) ||
|
|
27
29
|
(github.event_name == 'discussion_comment' && contains(github.event.comment.body, '/marvin')) ||
|
|
@@ -29,17 +31,34 @@ jobs:
|
|
|
29
31
|
(github.event_name == 'issues' && github.event.action == 'labeled' && github.event.label.name == 'marvin')
|
|
30
32
|
runs-on: ubuntu-latest
|
|
31
33
|
steps:
|
|
32
|
-
- uses: actions/checkout@
|
|
34
|
+
- uses: actions/checkout@v5
|
|
35
|
+
|
|
36
|
+
# Install UV package manager
|
|
37
|
+
- name: Install UV
|
|
38
|
+
uses: astral-sh/setup-uv@v6
|
|
39
|
+
with:
|
|
40
|
+
enable-cache: true
|
|
41
|
+
cache-dependency-glob: "uv.lock"
|
|
42
|
+
|
|
43
|
+
# Install project dependencies
|
|
44
|
+
- name: Install dependencies
|
|
45
|
+
run: uv sync --python 3.12
|
|
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"
|
|
33
52
|
|
|
34
53
|
- name: Generate Marvin App token
|
|
35
54
|
id: marvin-token
|
|
36
|
-
uses: actions/create-github-app-token@
|
|
55
|
+
uses: actions/create-github-app-token@v2
|
|
37
56
|
with:
|
|
38
57
|
app-id: ${{ secrets.MARVIN_APP_ID }}
|
|
39
58
|
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
|
|
40
59
|
|
|
41
60
|
# Marvin Assistant
|
|
42
|
-
- name: Marvin
|
|
61
|
+
- name: Run Marvin
|
|
43
62
|
uses: anthropics/claude-code-action@beta
|
|
44
63
|
with:
|
|
45
64
|
github_token: ${{ steps.marvin-token.outputs.token }}
|
|
@@ -47,6 +66,6 @@ jobs:
|
|
|
47
66
|
mode: tag
|
|
48
67
|
trigger_phrase: "/marvin"
|
|
49
68
|
allowed_bots: "*"
|
|
50
|
-
allowed_tools: "mcp__github__add_issue_comment,mcp__github__create_issue,mcp__github__get_issue,mcp__github__list_issues,mcp__github__search_issues,mcp__github__update_issue,mcp__github__update_issue_comment,mcp__github__create_pull_request,mcp__github__get_pull_request,mcp__github__get_pull_request_comments,mcp__github__get_pull_request_files,mcp__github__get_pull_request_reviews,mcp__github__get_pull_request_status,mcp__github__list_pull_requests,mcp__github__update_pull_request,mcp__github__update_pull_request_branch,mcp__github__update_pull_request_comment,mcp__github__merge_pull_request"
|
|
69
|
+
allowed_tools: "WebSearch,WebFetch,Bash(uv:*),Bash(pre-commit:*),Bash(pytest:*),Bash(ruff:*),Bash(ty:*),Bash(git:*),Bash(gh:*),mcp__github__add_issue_comment,mcp__github__create_issue,mcp__github__get_issue,mcp__github__list_issues,mcp__github__search_issues,mcp__github__update_issue,mcp__github__update_issue_comment,mcp__github__create_pull_request,mcp__github__get_pull_request,mcp__github__get_pull_request_comments,mcp__github__get_pull_request_files,mcp__github__get_pull_request_reviews,mcp__github__get_pull_request_status,mcp__github__list_pull_requests,mcp__github__update_pull_request,mcp__github__update_pull_request_branch,mcp__github__update_pull_request_comment,mcp__github__merge_pull_request"
|
|
51
70
|
additional_permissions: |
|
|
52
71
|
actions: read
|
|
@@ -30,20 +30,16 @@ jobs:
|
|
|
30
30
|
runs-on: ubuntu-latest
|
|
31
31
|
|
|
32
32
|
steps:
|
|
33
|
-
- uses: actions/checkout@
|
|
33
|
+
- uses: actions/checkout@v5
|
|
34
34
|
- name: Install uv
|
|
35
35
|
uses: astral-sh/setup-uv@v6
|
|
36
36
|
with:
|
|
37
37
|
enable-cache: true
|
|
38
38
|
cache-dependency-glob: "uv.lock"
|
|
39
|
-
|
|
40
|
-
uses: actions/setup-python@v5
|
|
41
|
-
with:
|
|
42
|
-
python-version: "3.12"
|
|
39
|
+
|
|
43
40
|
- name: Install dependencies
|
|
44
|
-
run: uv sync
|
|
45
|
-
|
|
46
|
-
uses: extractions/setup-just@v3
|
|
41
|
+
run: uv sync
|
|
42
|
+
|
|
47
43
|
- name: Check lockfile is up to date
|
|
48
44
|
run: |
|
|
49
45
|
if ! uv lock --check; then
|
|
@@ -53,18 +49,6 @@ jobs:
|
|
|
53
49
|
fi
|
|
54
50
|
echo "✅ Lockfile is up to date"
|
|
55
51
|
- name: Run pre-commit
|
|
56
|
-
|
|
52
|
+
run: uv run pre-commit run --all-files
|
|
57
53
|
env:
|
|
58
54
|
SKIP: no-commit-to-branch
|
|
59
|
-
- name: Check SDK documentation is up to date
|
|
60
|
-
run: |
|
|
61
|
-
just api-ref-all > /dev/null 2>&1
|
|
62
|
-
if ! git diff --quiet docs/python-sdk/ docs/docs.json; then
|
|
63
|
-
echo "❌ SDK documentation is out of date!"
|
|
64
|
-
echo "Files that were updated:"
|
|
65
|
-
git diff --name-only docs/python-sdk/ docs/docs.json
|
|
66
|
-
echo ""
|
|
67
|
-
echo "Run 'just api-ref-all' and commit the changes."
|
|
68
|
-
exit 1
|
|
69
|
-
fi
|
|
70
|
-
echo "✅ SDK documentation is up to date"
|
|
@@ -34,7 +34,7 @@ jobs:
|
|
|
34
34
|
timeout-minutes: 5
|
|
35
35
|
|
|
36
36
|
steps:
|
|
37
|
-
- uses: actions/checkout@
|
|
37
|
+
- uses: actions/checkout@v5
|
|
38
38
|
|
|
39
39
|
- name: Install uv
|
|
40
40
|
uses: astral-sh/setup-uv@v6
|
|
@@ -48,10 +48,10 @@ jobs:
|
|
|
48
48
|
run: uv sync --frozen
|
|
49
49
|
|
|
50
50
|
- name: Run tests (excluding integration and client_process)
|
|
51
|
-
run: uv run pytest tests -m "not integration and not client_process"
|
|
51
|
+
run: uv run pytest -v tests -m "not integration and not client_process"
|
|
52
52
|
|
|
53
53
|
- name: Run client process tests separately
|
|
54
|
-
run: uv run pytest tests -m "client_process" -x
|
|
54
|
+
run: uv run pytest -v tests -m "client_process" -x
|
|
55
55
|
|
|
56
56
|
run_integration_tests:
|
|
57
57
|
name: "Run integration tests"
|
|
@@ -59,7 +59,7 @@ jobs:
|
|
|
59
59
|
timeout-minutes: 10
|
|
60
60
|
|
|
61
61
|
steps:
|
|
62
|
-
- uses: actions/checkout@
|
|
62
|
+
- uses: actions/checkout@v5
|
|
63
63
|
|
|
64
64
|
- name: Install uv
|
|
65
65
|
uses: astral-sh/setup-uv@v6
|
|
@@ -73,6 +73,8 @@ jobs:
|
|
|
73
73
|
run: uv sync --frozen
|
|
74
74
|
|
|
75
75
|
- name: Run integration tests
|
|
76
|
-
run: uv run pytest tests -m "integration"
|
|
76
|
+
run: uv run pytest -v tests -m "integration"
|
|
77
77
|
env:
|
|
78
78
|
FASTMCP_GITHUB_TOKEN: ${{ secrets.FASTMCP_GITHUB_TOKEN }}
|
|
79
|
+
FASTMCP_TEST_AUTH_GITHUB_CLIENT_ID: ${{ secrets.FASTMCP_TEST_AUTH_GITHUB_CLIENT_ID }}
|
|
80
|
+
FASTMCP_TEST_AUTH_GITHUB_CLIENT_SECRET: ${{ secrets.FASTMCP_TEST_AUTH_GITHUB_CLIENT_SECRET }}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
name: Update MCPServerConfig Schema
|
|
2
|
+
|
|
3
|
+
# This workflow runs on merges to main to automatically update the config schema
|
|
4
|
+
# by creating a PR when changes are needed.
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: ["main"]
|
|
9
|
+
paths:
|
|
10
|
+
- "src/fastmcp/utilities/mcp_server_config/**"
|
|
11
|
+
- "!src/fastmcp/utilities/mcp_server_config/v1/schema.json" # Exclude the local schema file
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: write
|
|
16
|
+
pull-requests: write
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
update-config-schema:
|
|
20
|
+
timeout-minutes: 5
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v5
|
|
25
|
+
|
|
26
|
+
- name: Generate Marvin App token
|
|
27
|
+
id: marvin-token
|
|
28
|
+
uses: actions/create-github-app-token@v2
|
|
29
|
+
with:
|
|
30
|
+
app-id: ${{ secrets.MARVIN_APP_ID }}
|
|
31
|
+
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
|
|
32
|
+
|
|
33
|
+
- name: Install uv
|
|
34
|
+
uses: astral-sh/setup-uv@v6
|
|
35
|
+
with:
|
|
36
|
+
enable-cache: true
|
|
37
|
+
cache-dependency-glob: "uv.lock"
|
|
38
|
+
|
|
39
|
+
- name: Install dependencies
|
|
40
|
+
run: uv sync --python 3.12
|
|
41
|
+
|
|
42
|
+
- name: Generate config schema
|
|
43
|
+
run: |
|
|
44
|
+
echo "🔄 Generating fastmcp.json schema..."
|
|
45
|
+
|
|
46
|
+
# Generate schema in docs/public for web access
|
|
47
|
+
uv run python -c "
|
|
48
|
+
from fastmcp.utilities.mcp_server_config import generate_schema
|
|
49
|
+
generate_schema('docs/public/schemas/fastmcp.json/latest.json')
|
|
50
|
+
print('✅ Latest schema generated in docs/public')
|
|
51
|
+
"
|
|
52
|
+
|
|
53
|
+
# Also update the v1 schema in docs/public
|
|
54
|
+
uv run python -c "
|
|
55
|
+
from fastmcp.utilities.mcp_server_config import generate_schema
|
|
56
|
+
generate_schema('docs/public/schemas/fastmcp.json/v1.json')
|
|
57
|
+
print('✅ v1 schema generated in docs/public')
|
|
58
|
+
"
|
|
59
|
+
|
|
60
|
+
# Generate schema in the source directory for local development
|
|
61
|
+
uv run python -c "
|
|
62
|
+
from fastmcp.utilities.mcp_server_config import generate_schema
|
|
63
|
+
generate_schema('src/fastmcp/utilities/mcp_server_config/v1/schema.json')
|
|
64
|
+
print('✅ Schema generated in utilities/mcp_server_config/v1/')
|
|
65
|
+
"
|
|
66
|
+
|
|
67
|
+
- name: Create Pull Request
|
|
68
|
+
uses: peter-evans/create-pull-request@v7
|
|
69
|
+
with:
|
|
70
|
+
token: ${{ steps.marvin-token.outputs.token }}
|
|
71
|
+
commit-message: "chore: Update fastmcp.json schema"
|
|
72
|
+
title: "chore: Update fastmcp.json schema"
|
|
73
|
+
body: |
|
|
74
|
+
This PR updates the fastmcp.json schema files to match the current source code.
|
|
75
|
+
|
|
76
|
+
The schema is automatically generated from `src/fastmcp/utilities/mcp_server_config/` to ensure consistency.
|
|
77
|
+
|
|
78
|
+
**Note:** This PR is fully automated and will update itself with any subsequent changes to the schema, or close automatically if the schema becomes up-to-date through other means. Feel free to leave it open until you're ready to merge.
|
|
79
|
+
|
|
80
|
+
🤖 Generated by Marvin
|
|
81
|
+
branch: marvin/update-config-schema
|
|
82
|
+
labels: |
|
|
83
|
+
ignore in release notes
|
|
84
|
+
delete-branch: true
|
|
85
|
+
author: "marvin-context-protocol[bot] <225465937+marvin-context-protocol[bot]@users.noreply.github.com>"
|
|
86
|
+
committer: "marvin-context-protocol[bot] <225465937+marvin-context-protocol[bot]@users.noreply.github.com>"
|
|
87
|
+
|
|
88
|
+
- name: Summary
|
|
89
|
+
run: |
|
|
90
|
+
echo "✅ Config schema generation workflow completed"
|
|
91
|
+
echo "PR will be created if there are changes, or closed if schema is already up to date"
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
name: Update SDK Documentation
|
|
2
|
+
|
|
3
|
+
# This workflow runs on merges to main to automatically update SDK docs
|
|
4
|
+
# by creating a PR when changes are needed.
|
|
5
|
+
|
|
6
|
+
on:
|
|
7
|
+
push:
|
|
8
|
+
branches: ["main"]
|
|
9
|
+
paths:
|
|
10
|
+
- "src/**"
|
|
11
|
+
- "pyproject.toml"
|
|
12
|
+
workflow_dispatch:
|
|
13
|
+
|
|
14
|
+
permissions:
|
|
15
|
+
contents: write
|
|
16
|
+
pull-requests: write
|
|
17
|
+
|
|
18
|
+
jobs:
|
|
19
|
+
update-sdk-docs:
|
|
20
|
+
timeout-minutes: 5
|
|
21
|
+
runs-on: ubuntu-latest
|
|
22
|
+
|
|
23
|
+
steps:
|
|
24
|
+
- uses: actions/checkout@v5
|
|
25
|
+
|
|
26
|
+
- name: Generate Marvin App token
|
|
27
|
+
id: marvin-token
|
|
28
|
+
uses: actions/create-github-app-token@v2
|
|
29
|
+
with:
|
|
30
|
+
app-id: ${{ secrets.MARVIN_APP_ID }}
|
|
31
|
+
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
|
|
32
|
+
|
|
33
|
+
- name: Install uv
|
|
34
|
+
uses: astral-sh/setup-uv@v6
|
|
35
|
+
with:
|
|
36
|
+
enable-cache: true
|
|
37
|
+
cache-dependency-glob: "uv.lock"
|
|
38
|
+
|
|
39
|
+
- name: Install dependencies
|
|
40
|
+
run: uv sync --python 3.12
|
|
41
|
+
|
|
42
|
+
- name: Install just
|
|
43
|
+
uses: extractions/setup-just@v3
|
|
44
|
+
|
|
45
|
+
- name: Generate SDK documentation
|
|
46
|
+
run: |
|
|
47
|
+
echo "🔄 Generating SDK documentation..."
|
|
48
|
+
just api-ref-all
|
|
49
|
+
|
|
50
|
+
- name: Create Pull Request
|
|
51
|
+
uses: peter-evans/create-pull-request@v7
|
|
52
|
+
with:
|
|
53
|
+
token: ${{ steps.marvin-token.outputs.token }}
|
|
54
|
+
commit-message: "chore: Update SDK documentation"
|
|
55
|
+
title: "chore: Update SDK documentation"
|
|
56
|
+
body: |
|
|
57
|
+
This PR updates the auto-generated SDK documentation to reflect the latest source code changes.
|
|
58
|
+
|
|
59
|
+
📚 Documentation is automatically generated from the source code docstrings and type annotations.
|
|
60
|
+
|
|
61
|
+
**Note:** This PR is fully automated and will update itself with any subsequent changes to the SDK, or close automatically if the documentation becomes up-to-date through other means. Feel free to leave it open until you're ready to merge.
|
|
62
|
+
|
|
63
|
+
🤖 Generated by Marvin
|
|
64
|
+
branch: marvin/update-sdk-docs
|
|
65
|
+
labels: |
|
|
66
|
+
ignore in release notes
|
|
67
|
+
delete-branch: true
|
|
68
|
+
author: "marvin-context-protocol[bot] <225465937+marvin-context-protocol[bot]@users.noreply.github.com>"
|
|
69
|
+
committer: "marvin-context-protocol[bot] <225465937+marvin-context-protocol[bot]@users.noreply.github.com>"
|
|
70
|
+
|
|
71
|
+
- name: Summary
|
|
72
|
+
run: |
|
|
73
|
+
echo "✅ SDK documentation generation workflow completed"
|
|
74
|
+
echo "PR will be created if there are changes, or closed if documentation is already up to date"
|
|
@@ -22,14 +22,20 @@ repos:
|
|
|
22
22
|
# Run the formatter.
|
|
23
23
|
- id: ruff-format
|
|
24
24
|
|
|
25
|
-
- repo:
|
|
26
|
-
rev: v0.1.0
|
|
25
|
+
- repo: local
|
|
27
26
|
hooks:
|
|
28
|
-
- id:
|
|
27
|
+
- id: ty
|
|
28
|
+
name: ty check
|
|
29
|
+
entry: uv run ty check
|
|
30
|
+
language: system
|
|
31
|
+
types: [python]
|
|
29
32
|
files: ^src/|^tests/
|
|
33
|
+
pass_filenames: false
|
|
34
|
+
require_serial: true
|
|
30
35
|
|
|
31
36
|
- repo: https://github.com/pre-commit/pre-commit-hooks
|
|
32
|
-
rev:
|
|
37
|
+
rev: v6.0.0
|
|
33
38
|
hooks:
|
|
34
39
|
- id: no-commit-to-branch
|
|
40
|
+
name: prevent commits to main
|
|
35
41
|
args: [--branch, main]
|