fastmcp 2.11.2__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.11.2 → fastmcp-2.12.0}/.github/ISSUE_TEMPLATE/bug.yml +13 -25
- fastmcp-2.12.0/.github/ISSUE_TEMPLATE/enhancement.yml +34 -0
- fastmcp-2.12.0/.github/copilot-instructions.md +1 -0
- 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.12.0/.github/workflows/marvin.yml +71 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/.github/workflows/publish.yml +1 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/.github/workflows/run-static.yml +13 -7
- {fastmcp-2.11.2 → fastmcp-2.12.0}/.github/workflows/run-tests.yml +11 -7
- 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.2 → fastmcp-2.12.0}/.gitignore +11 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/.pre-commit-config.yaml +10 -4
- fastmcp-2.12.0/AGENTS.md +251 -0
- fastmcp-2.12.0/CLAUDE.md +1 -0
- fastmcp-2.12.0/CODE_OF_CONDUCT.md +128 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/PKG-INFO +3 -2
- 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.2 → fastmcp-2.12.0}/docs/changelog.mdx +95 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/logging.mdx +2 -2
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/sampling.mdx +49 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/tools.mdx +6 -6
- {fastmcp-2.11.2 → 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.2 → fastmcp-2.12.0}/docs/docs.json +128 -34
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/getting-started/installation.mdx +2 -2
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/anthropic.mdx +1 -1
- fastmcp-2.11.2/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.2 → fastmcp-2.12.0}/docs/integrations/claude-code.mdx +14 -9
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/claude-desktop.mdx +14 -9
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/cursor.mdx +28 -8
- {fastmcp-2.11.2 → 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.2 → fastmcp-2.12.0}/docs/integrations/mcp-json-configuration.mdx +17 -7
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/openai.mdx +1 -1
- fastmcp-2.12.0/docs/integrations/workos-oauth.mdx +240 -0
- {fastmcp-2.11.2 → 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.2 → 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.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-claude_code.mdx +5 -5
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-claude_desktop.mdx +4 -4
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-cursor.mdx +31 -5
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-mcp_json.mdx +3 -3
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-shared.mdx +5 -3
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-run.mdx +21 -50
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-auth-oauth.mdx +20 -14
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-client.mdx +39 -33
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-logging.mdx +5 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-sampling.mdx +2 -2
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-transports.mdx +31 -25
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-mcp_config.mdx +19 -19
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-prompts-prompt_manager.mdx +7 -7
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-resources-resource_manager.mdx +12 -12
- fastmcp-2.12.0/docs/python-sdk/fastmcp-server-auth-auth.mdx +175 -0
- 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.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-providers-jwt.mdx +17 -14
- 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.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-context.mdx +36 -27
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-dependencies.mdx +16 -3
- fastmcp-2.12.0/docs/python-sdk/fastmcp-server-elicitation.mdx +87 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-http.mdx +14 -24
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-logging.mdx +18 -6
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-proxy.mdx +42 -36
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-server.mdx +62 -50
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-settings.mdx +1 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-tools-tool.mdx +16 -16
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-tools-tool_manager.mdx +11 -11
- {fastmcp-2.11.2 → 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.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-components.mdx +17 -9
- fastmcp-2.12.0/docs/python-sdk/fastmcp-utilities-inspect.mdx +143 -0
- {fastmcp-2.11.2 → 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.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-openapi.mdx +13 -13
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-tests.mdx +6 -4
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-types.mdx +15 -13
- {fastmcp-2.11.2 → 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.2 → fastmcp-2.12.0}/docs/servers/auth/remote-oauth.mdx +37 -5
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/auth/token-verification.mdx +48 -3
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/composition.mdx +11 -5
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/context.mdx +142 -2
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/prompts.mdx +2 -2
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/server.mdx +27 -6
- fastmcp-2.12.0/examples/atproto_mcp/fastmcp.json +11 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/_posts.py +42 -7
- {fastmcp-2.11.2 → 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.2 → 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.2 → fastmcp-2.12.0}/justfile +2 -3
- {fastmcp-2.11.2 → fastmcp-2.12.0}/pyproject.toml +19 -12
- fastmcp-2.12.0/scripts/auto_close_duplicates.py +331 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/__init__.py +5 -4
- {fastmcp-2.11.2 → 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.2 → fastmcp-2.12.0}/src/fastmcp/cli/install/claude_code.py +37 -40
- {fastmcp-2.11.2 → 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.2 → 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.2 → fastmcp-2.12.0}/src/fastmcp/client/auth/oauth.py +69 -13
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/client.py +46 -9
- fastmcp-2.12.0/src/fastmcp/client/logging.py +50 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/oauth_callback.py +91 -91
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/sampling.py +12 -4
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/transports.py +143 -67
- 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.2 → fastmcp-2.12.0}/src/fastmcp/experimental/server/openapi/routing.py +1 -3
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/server/openapi/server.py +10 -25
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/__init__.py +2 -2
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/formatters.py +34 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/models.py +5 -2
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/parser.py +252 -70
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/schemas.py +135 -106
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/mcp_config.py +40 -20
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/prompts/prompt_manager.py +4 -2
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/resources/resource_manager.py +16 -6
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/auth/__init__.py +11 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/auth/auth.py +19 -2
- 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.2 → fastmcp-2.12.0}/src/fastmcp/server/auth/providers/jwt.py +27 -16
- 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.2 → fastmcp-2.12.0}/src/fastmcp/server/auth/registry.py +1 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/context.py +91 -41
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/dependencies.py +32 -2
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/elicitation.py +60 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/http.py +44 -37
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/middleware/logging.py +66 -28
- {fastmcp-2.11.2 → 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.2 → fastmcp-2.12.0}/src/fastmcp/server/server.py +85 -20
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/settings.py +18 -3
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/tools/tool.py +23 -10
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/tools/tool_manager.py +5 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/tools/tool_transform.py +75 -32
- 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.2 → fastmcp-2.12.0}/src/fastmcp/utilities/components.py +21 -5
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/utilities/inspect.py +166 -37
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/utilities/json_schema_type.py +4 -2
- {fastmcp-2.11.2 → 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.2 → fastmcp-2.12.0}/src/fastmcp/utilities/openapi.py +4 -4
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/utilities/tests.py +7 -2
- {fastmcp-2.11.2 → 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.2 → 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.2 → 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.2 → 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.2 → 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.2 → 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.2 → fastmcp-2.12.0}/tests/client/test_elicitation.py +84 -0
- fastmcp-2.12.0/tests/client/test_logs.py +193 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/test_openapi_experimental.py +3 -3
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/test_openapi_legacy.py +3 -3
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/test_sampling.py +26 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/test_sse.py +1 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/test_stdio.py +128 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/test_streamable_http.py +4 -8
- {fastmcp-2.11.2 → 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/README.md +3 -0
- fastmcp-2.12.0/tests/experimental/openapi_parser/README.md +5 -0
- fastmcp-2.12.0/tests/experimental/openapi_parser/conftest.py +11 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/server/openapi/test_end_to_end_compatibility.py +4 -2
- {fastmcp-2.11.2/tests/experimental/server → fastmcp-2.12.0/tests/experimental/openapi_parser/server/openapi}/test_openapi_performance.py +2 -2
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/server/openapi/test_performance_comparison.py +5 -5
- fastmcp-2.12.0/tests/experimental/openapi_parser/utilities/openapi/test_allof_requestbody.py +227 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/utilities/openapi/test_models.py +7 -5
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/utilities/openapi/test_parser.py +129 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/utilities/openapi/test_schemas.py +5 -3
- fastmcp-2.12.0/tests/experimental/openapi_parser/utilities/openapi/test_transitive_references.py +788 -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.11.2 → fastmcp-2.12.0}/tests/resources/test_resource_manager.py +8 -8
- fastmcp-2.12.0/tests/server/auth/__init__.py +0 -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.2 → fastmcp-2.12.0}/tests/server/auth/test_jwt_provider.py +288 -5
- 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.2 → fastmcp-2.12.0}/tests/server/auth/test_remote_auth_provider.py +64 -2
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/auth/test_static_token_verifier.py +26 -3
- {fastmcp-2.11.2 → 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.2 → fastmcp-2.12.0}/tests/server/http/test_bearer_auth_backend.py +1 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/http/test_http_auth_middleware.py +9 -9
- {fastmcp-2.11.2 → 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.2 → 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.2 → fastmcp-2.12.0}/tests/server/proxy/test_proxy_server.py +1 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_context.py +7 -7
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_import_server.py +38 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_mount.py +183 -6
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_server.py +1 -1
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_server_interactions.py +3 -3
- fastmcp-2.12.0/tests/server/test_streamable_http_no_redirect.py +85 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_tool_transformation.py +28 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/test_mcp_config.py +184 -0
- fastmcp-2.12.0/tests/tools/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/tools/test_tool.py +259 -81
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/tools/test_tool_manager.py +44 -3
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/tools/test_tool_transform.py +267 -54
- {fastmcp-2.11.2 → 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.12.0/tests/utilities/test_components.py +438 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/test_inspect.py +210 -10
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/test_json_schema.py +1 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/uv.lock +617 -424
- fastmcp-2.11.2/.github/ISSUE_TEMPLATE/enhancement.yml +0 -38
- fastmcp-2.11.2/.github/labeler.yml +0 -33
- fastmcp-2.11.2/.github/workflows/labeler.yml +0 -13
- fastmcp-2.11.2/AGENTS.md +0 -67
- fastmcp-2.11.2/CLAUDE.md +0 -46
- fastmcp-2.11.2/docs/deployment/running-server.mdx +0 -323
- fastmcp-2.11.2/docs/patterns/http-requests.mdx +0 -87
- fastmcp-2.11.2/docs/patterns/testing.mdx +0 -48
- fastmcp-2.11.2/docs/python-sdk/fastmcp-cli-cli.mdx +0 -80
- fastmcp-2.11.2/docs/python-sdk/fastmcp-server-auth-auth.mdx +0 -124
- fastmcp-2.11.2/docs/python-sdk/fastmcp-server-auth-providers-bearer_env.mdx +0 -22
- fastmcp-2.11.2/docs/python-sdk/fastmcp-server-auth-providers-workos.mdx +0 -58
- fastmcp-2.11.2/docs/python-sdk/fastmcp-server-elicitation.mdx +0 -54
- fastmcp-2.11.2/docs/python-sdk/fastmcp-utilities-cli.mdx +0 -25
- fastmcp-2.11.2/docs/python-sdk/fastmcp-utilities-inspect.mdx +0 -94
- fastmcp-2.11.2/docs/python-sdk/fastmcp-utilities-mcp_config.mdx +0 -28
- fastmcp-2.11.2/src/fastmcp/cli/cli.py +0 -522
- fastmcp-2.11.2/src/fastmcp/cli/install/cursor.py +0 -237
- fastmcp-2.11.2/src/fastmcp/cli/install/shared.py +0 -85
- fastmcp-2.11.2/src/fastmcp/cli/run.py +0 -397
- fastmcp-2.11.2/src/fastmcp/client/logging.py +0 -26
- fastmcp-2.11.2/src/fastmcp/server/auth/providers/workos.py +0 -151
- fastmcp-2.11.2/src/fastmcp/utilities/cli.py +0 -102
- fastmcp-2.11.2/src/fastmcp/utilities/mcp_config.py +0 -28
- fastmcp-2.11.2/tests/client/test_logs.py +0 -90
- {fastmcp-2.11.2 → fastmcp-2.12.0}/.ccignore +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/.cursor/rules/core-mcp-objects.mdc +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/.github/ISSUE_TEMPLATE/config.yml +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/.github/dependabot.yml +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/.github/release.yml +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/LICENSE +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/README.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/README_OPENAPI.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/Windows_Notes.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/.ccignore +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/.cursor/rules/mintlify.mdc +0 -0
- {fastmcp-2.11.2/docs/assets → fastmcp-2.12.0/docs/assets/brand}/favicon.svg +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/assets/images/tutorial-rest-api-result.png +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/assets/updates/release-2-7.png +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/auth/bearer.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/auth/oauth.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/client.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/elicitation.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/messages.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/progress.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/prompts.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/resources.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/roots.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/clients/transports.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/community/README.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/community/showcase.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/css/banner.css +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/css/python-sdk.css +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/css/version-badge.css +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/getting-started/quickstart.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/getting-started/welcome.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/authkit.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/chatgpt.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/cursor-install-mcp.png +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/eunomia-authorization.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/fastapi.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/images/authkit/enable_dcr.png +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/images/permit/abac_condition_example.png +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/images/permit/abac_policy_example.png +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/images/permit/policy_mapping.png +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/images/permit/role_assignement.png +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/openapi.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/integrations/permit.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/patterns/contrib.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/patterns/decorating-methods.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/patterns/tool-transformation.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-cli-install-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-auth-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-auth-bearer.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-elicitation.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-messages.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-oauth_callback.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-progress.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-client-roots.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-exceptions.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-prompts-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-prompts-prompt.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-resources-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-resources-resource.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-resources-template.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-resources-types.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-providers-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-providers-bearer.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-providers-in_memory.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-auth-registry.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-low_level.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-error_handling.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-middleware.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-rate_limiting.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-middleware-timing.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-server-openapi.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-tools-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-__init__.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-exceptions.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-http.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-json_schema.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/python-sdk/fastmcp-utilities-json_schema_type.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/auth/full-oauth-server.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/elicitation.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/logging.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/middleware.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/progress.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/proxy.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/resources.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/sampling.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/servers/tools.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/snippets/local-focus.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/snippets/version-badge.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/snippets/youtube-embed.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/tutorials/create-mcp-server.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/tutorials/mcp.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/tutorials/rest-api.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/docs/updates.mdx +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/README.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/demo.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/pyproject.toml +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/__main__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/_client.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/_profile.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/_read.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/_atproto/_social.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/py.typed +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/settings.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/atproto_mcp/src/atproto_mcp/types.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/complex_inputs.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/config_server.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/desktop.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/echo.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/get_file.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/in_memory_proxy_example.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/memory.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/sampling.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/screenshot.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/serializer.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/simple_echo.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/README.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/pyproject.toml +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/__main__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/hub.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/lights/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/lights/hue_utils.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/lights/server.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/py.typed +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/src/smart_home/settings.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/smart_home/uv.lock +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/tags_example.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/examples/text_me.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/cli/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/cli/install/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/auth/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/auth/bearer.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/elicitation.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/messages.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/progress.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/client/roots.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/README.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/bulk_tool_caller/README.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/bulk_tool_caller/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/bulk_tool_caller/bulk_tool_caller.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/bulk_tool_caller/example.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/component_manager/README.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/component_manager/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/component_manager/component_manager.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/component_manager/component_service.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/component_manager/example.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/mcp_mixin/README.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/mcp_mixin/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/mcp_mixin/example.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/contrib/mcp_mixin/mcp_mixin.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/exceptions.py +0 -0
- {fastmcp-2.11.2/src/fastmcp/server/auth/providers → fastmcp-2.12.0/src/fastmcp/experimental/sampling}/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/server/openapi/README.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/server/openapi/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/server/openapi/components.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/README.md +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/director.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/experimental/utilities/openapi/json_schema_converter.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/prompts/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/prompts/prompt.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/py.typed +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/resources/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/resources/resource.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/resources/template.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/resources/types.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/__init__.py +0 -0
- {fastmcp-2.11.2/tests → fastmcp-2.12.0/src/fastmcp/server/auth/providers}/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/auth/providers/bearer.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/auth/providers/in_memory.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/low_level.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/middleware/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/middleware/error_handling.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/middleware/middleware.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/middleware/rate_limiting.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/middleware/timing.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/server/openapi.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/tools/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/utilities/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/utilities/exceptions.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/utilities/http.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/src/fastmcp/utilities/json_schema.py +0 -0
- {fastmcp-2.11.2/tests/client → fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1}/__init__.py +0 -0
- {fastmcp-2.11.2/tests/client/auth → fastmcp-2.12.0/src/fastmcp/utilities/mcp_server_config/v1/sources}/__init__.py +0 -0
- {fastmcp-2.11.2/tests/client/transports → fastmcp-2.12.0/tests}/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/cli/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/cli/test_install.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/cli/test_shared.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/client}/__init__.py +0 -0
- {fastmcp-2.11.2/tests/experimental/server → fastmcp-2.12.0/tests/client/auth}/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/test_client.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/test_notifications.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/test_progress.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/test_roots.py +0 -0
- {fastmcp-2.11.2/tests/experimental/utilities → fastmcp-2.12.0/tests/client/transports}/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/client/transports/test_uv_transport.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/contrib/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/contrib/test_bulk_tool_caller.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/contrib/test_component_manager.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/contrib/test_mcp_mixin.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/deprecated/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/deprecated/test_bearer_auth_provider.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/deprecated/test_deprecated.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/deprecated/test_mount_import_arg_order.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/deprecated/test_mount_separators.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/deprecated/test_proxy_client.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/deprecated/test_resource_prefixes.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/deprecated/test_route_type_ignore.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/deprecated/test_settings.py +0 -0
- {fastmcp-2.11.2/tests/integration_tests → fastmcp-2.12.0/tests/experimental}/__init__.py +0 -0
- {fastmcp-2.11.2/tests/prompts → fastmcp-2.12.0/tests/experimental/openapi_parser}/__init__.py +0 -0
- {fastmcp-2.11.2/tests/resources → fastmcp-2.12.0/tests/experimental/openapi_parser/server}/__init__.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/server/openapi/__init__.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/server/openapi/test_comprehensive.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/server/openapi/test_deepobject_style.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/server/openapi/test_openapi_features.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/server/openapi/test_parameter_collisions.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/server/openapi/test_server.py +0 -0
- {fastmcp-2.11.2/tests/server → fastmcp-2.12.0/tests/experimental/openapi_parser/utilities}/__init__.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/utilities/openapi/__init__.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/utilities/openapi/conftest.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/utilities/openapi/test_director.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/utilities/openapi/test_legacy_compatibility.py +0 -0
- {fastmcp-2.11.2/tests/experimental → fastmcp-2.12.0/tests/experimental/openapi_parser}/utilities/openapi/test_nullable_fields.py +0 -0
- {fastmcp-2.11.2/tests/server/http → fastmcp-2.12.0/tests/integration_tests}/__init__.py +0 -0
- {fastmcp-2.11.2/tests/server/middleware → fastmcp-2.12.0/tests/integration_tests/auth}/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/integration_tests/conftest.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/integration_tests/test_github_mcp_remote.py +0 -0
- {fastmcp-2.11.2/tests/server/openapi → fastmcp-2.12.0/tests/prompts}/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/prompts/test_prompt.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/prompts/test_prompt_manager.py +0 -0
- {fastmcp-2.11.2/tests/server/proxy → fastmcp-2.12.0/tests/resources}/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/resources/test_file_resources.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/resources/test_function_resources.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/resources/test_resource_template.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/resources/test_resource_template_meta.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/resources/test_resources.py +0 -0
- {fastmcp-2.11.2/tests/tools → fastmcp-2.12.0/tests/server}/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/http/test_custom_routes.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/http/test_http_middleware.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/middleware/test_error_handling.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/middleware/test_middleware.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/middleware/test_rate_limiting.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/middleware/test_timing.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/conftest.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_advanced_behavior.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_basic_functionality.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_configuration.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_deepobject_style.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_description_propagation.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_explode_integration.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_openapi_compatibility.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_openapi_path_parameters.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_optional_parameters.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_parameter_collisions.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/openapi/test_route_map_fn.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/proxy/test_proxy_client.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/proxy/test_stateful_proxy_client.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_app_state.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_auth_integration.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_experimental_openapi_feature_flag.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_file_server.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_logging.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_resource_prefix_formats.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_run_server.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_tool_annotations.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/server/test_tool_exclude_args.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/test_examples.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/tools/test_tool_future_annotations.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/openapi/__init__.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/openapi/conftest.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/openapi/test_nullable_fields.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/openapi/test_openapi_advanced.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/openapi/test_openapi_fastapi.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/openapi/test_openapi_output_schemas.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/test_json_schema_type.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/test_logging.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/test_tests.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/test_typeadapter.py +0 -0
- {fastmcp-2.11.2 → fastmcp-2.12.0}/tests/utilities/test_types.py +0 -0
|
@@ -5,12 +5,12 @@ labels: [bug, pending]
|
|
|
5
5
|
body:
|
|
6
6
|
- type: markdown
|
|
7
7
|
attributes:
|
|
8
|
-
value:
|
|
8
|
+
value: Thanks for contributing to FastMCP! 🙏
|
|
9
9
|
|
|
10
10
|
- type: markdown
|
|
11
11
|
attributes:
|
|
12
12
|
value: |
|
|
13
|
-
|
|
13
|
+
### Before you submit
|
|
14
14
|
|
|
15
15
|
To help us help you, please:
|
|
16
16
|
|
|
@@ -18,7 +18,7 @@ body:
|
|
|
18
18
|
- 🔍 **Check if someone else has already reported this issue** or if it's been fixed on the main branch
|
|
19
19
|
- 📋 **You MUST include a copy/pasteable and properly formatted MRE** (minimal reproducible example) below or your issue may be closed without response
|
|
20
20
|
|
|
21
|
-
Thanks for helping make FastMCP better! 🚀
|
|
21
|
+
Thanks for helping to make FastMCP better! 🚀
|
|
22
22
|
|
|
23
23
|
- type: textarea
|
|
24
24
|
id: description
|
|
@@ -38,17 +38,20 @@ body:
|
|
|
38
38
|
description: >
|
|
39
39
|
If applicable, please provide a self-contained,
|
|
40
40
|
[minimal, reproducible example](https://stackoverflow.com/help/minimal-reproducible-example)
|
|
41
|
-
demonstrating the bug.
|
|
42
|
-
|
|
43
|
-
If possible, your example should be a single-file script. Instead of `.run()`-ing an MCP server, use a `Client` to directly interact with it (`async with Client(mcp) as client: ...`) and demonstrate the issue.
|
|
41
|
+
demonstrating the bug. If possible, your example should be a single-file script.
|
|
44
42
|
|
|
45
43
|
placeholder: |
|
|
44
|
+
import asyncio
|
|
46
45
|
from fastmcp import FastMCP, Client
|
|
47
46
|
|
|
48
47
|
mcp = FastMCP()
|
|
49
48
|
|
|
50
|
-
async
|
|
51
|
-
|
|
49
|
+
async def demo():
|
|
50
|
+
async with Client(mcp) as client:
|
|
51
|
+
... # show the bug here
|
|
52
|
+
|
|
53
|
+
if __name__ == "__main__":
|
|
54
|
+
asyncio.run(demo())
|
|
52
55
|
render: Python
|
|
53
56
|
|
|
54
57
|
- type: textarea
|
|
@@ -56,28 +59,13 @@ body:
|
|
|
56
59
|
attributes:
|
|
57
60
|
label: Version Information
|
|
58
61
|
description: |
|
|
59
|
-
Please
|
|
62
|
+
Please tell us about your FastMCP version, MCP version, Python version, and OS, as well as any other relevant details about your environment.
|
|
60
63
|
|
|
61
|
-
To get
|
|
64
|
+
To get the basic information, run the following command in your terminal and paste the output below:
|
|
62
65
|
|
|
63
66
|
```bash
|
|
64
67
|
fastmcp version --copy
|
|
65
68
|
```
|
|
66
|
-
|
|
67
|
-
*Note: if you're using FastMCP < 2.10.3, run `fastmcp version` instead.*
|
|
68
|
-
|
|
69
|
-
If there is other information that would be helpful, please include it as well.
|
|
70
69
|
render: Text
|
|
71
70
|
validations:
|
|
72
71
|
required: true
|
|
73
|
-
|
|
74
|
-
- type: textarea
|
|
75
|
-
id: additional_context
|
|
76
|
-
attributes:
|
|
77
|
-
label: Additional Context
|
|
78
|
-
description: |
|
|
79
|
-
Add any other context about the problem here. This could include:
|
|
80
|
-
- The full error message and traceback (if applicable)
|
|
81
|
-
- Information about your environment (e.g., virtual environment, installed packages)
|
|
82
|
-
- Steps to reproduce the issue
|
|
83
|
-
- Any recent changes in your code or setup that might be relevant
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
name: 💡 Enhancement Request
|
|
2
|
+
description: Suggest an idea or improvement for FastMCP
|
|
3
|
+
labels: [enhancement, pending]
|
|
4
|
+
|
|
5
|
+
body:
|
|
6
|
+
- type: markdown
|
|
7
|
+
attributes:
|
|
8
|
+
value: Thanks for contributing to FastMCP! 🙏
|
|
9
|
+
|
|
10
|
+
- type: markdown
|
|
11
|
+
attributes:
|
|
12
|
+
value: |
|
|
13
|
+
### Before you submit
|
|
14
|
+
|
|
15
|
+
To help us evaluate your enhancement request:
|
|
16
|
+
|
|
17
|
+
- 🔍 **Check if this has already been requested** - search existing issues first
|
|
18
|
+
- 💭 **Think about the broader impact** - how would this affect other users?
|
|
19
|
+
- 📋 **Consider implementation complexity** - is this a small change or a major feature?
|
|
20
|
+
|
|
21
|
+
Thanks for helping to make FastMCP better! 🚀
|
|
22
|
+
|
|
23
|
+
- type: textarea
|
|
24
|
+
id: description
|
|
25
|
+
attributes:
|
|
26
|
+
label: Enhancement
|
|
27
|
+
description: |
|
|
28
|
+
Please describe the enhancement:
|
|
29
|
+
|
|
30
|
+
- What problem or use case would it solve?
|
|
31
|
+
- How would it improve your workflow or experience with FastMCP?
|
|
32
|
+
- Are there any alternative solutions you've considered?
|
|
33
|
+
validations:
|
|
34
|
+
required: true
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
../AGENTS.md
|
|
@@ -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 }}
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
name: Marvin Context Protocol
|
|
2
|
+
|
|
3
|
+
on:
|
|
4
|
+
issue_comment: { types: [created] }
|
|
5
|
+
pull_request_review_comment: { types: [created] }
|
|
6
|
+
pull_request_review: { types: [submitted] }
|
|
7
|
+
pull_request: { types: [opened, edited] }
|
|
8
|
+
issues: { types: [opened, edited, assigned, labeled] }
|
|
9
|
+
discussion: { types: [created, edited, labeled] }
|
|
10
|
+
discussion_comment: { types: [created] }
|
|
11
|
+
|
|
12
|
+
permissions:
|
|
13
|
+
contents: write
|
|
14
|
+
issues: write
|
|
15
|
+
pull-requests: write
|
|
16
|
+
discussions: write
|
|
17
|
+
actions: read
|
|
18
|
+
id-token: write
|
|
19
|
+
|
|
20
|
+
jobs:
|
|
21
|
+
marvin:
|
|
22
|
+
if: |
|
|
23
|
+
(github.event_name == 'issue_comment' && contains(github.event.comment.body, '/marvin')) ||
|
|
24
|
+
(github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '/marvin')) ||
|
|
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')) ||
|
|
27
|
+
(github.event_name == 'issues' && contains(github.event.issue.body, '/marvin')) ||
|
|
28
|
+
(github.event_name == 'discussion' && contains(github.event.discussion.body, '/marvin')) ||
|
|
29
|
+
(github.event_name == 'discussion_comment' && contains(github.event.comment.body, '/marvin')) ||
|
|
30
|
+
(github.event_name == 'issues' && github.event.action == 'assigned' && github.event.assignee.login == 'Marvin Context Protocol') ||
|
|
31
|
+
(github.event_name == 'issues' && github.event.action == 'labeled' && github.event.label.name == 'marvin')
|
|
32
|
+
runs-on: ubuntu-latest
|
|
33
|
+
steps:
|
|
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"
|
|
52
|
+
|
|
53
|
+
- name: Generate Marvin App token
|
|
54
|
+
id: marvin-token
|
|
55
|
+
uses: actions/create-github-app-token@v2
|
|
56
|
+
with:
|
|
57
|
+
app-id: ${{ secrets.MARVIN_APP_ID }}
|
|
58
|
+
private-key: ${{ secrets.MARVIN_APP_PRIVATE_KEY }}
|
|
59
|
+
|
|
60
|
+
# Marvin Assistant
|
|
61
|
+
- name: Run Marvin
|
|
62
|
+
uses: anthropics/claude-code-action@beta
|
|
63
|
+
with:
|
|
64
|
+
github_token: ${{ steps.marvin-token.outputs.token }}
|
|
65
|
+
anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
|
|
66
|
+
mode: tag
|
|
67
|
+
trigger_phrase: "/marvin"
|
|
68
|
+
allowed_bots: "*"
|
|
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"
|
|
70
|
+
additional_permissions: |
|
|
71
|
+
actions: read
|
|
@@ -30,19 +30,25 @@ 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
|
|
41
|
+
run: uv sync
|
|
42
|
+
|
|
43
|
+
- name: Check lockfile is up to date
|
|
44
|
+
run: |
|
|
45
|
+
if ! uv lock --check; then
|
|
46
|
+
echo "❌ Lockfile is out of date!"
|
|
47
|
+
echo "To update the lockfile, run 'uv lock'."
|
|
48
|
+
exit 1
|
|
49
|
+
fi
|
|
50
|
+
echo "✅ Lockfile is up to date"
|
|
45
51
|
- name: Run pre-commit
|
|
46
|
-
|
|
52
|
+
run: uv run pre-commit run --all-files
|
|
47
53
|
env:
|
|
48
54
|
SKIP: no-commit-to-branch
|
|
@@ -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
|
|
@@ -44,13 +44,14 @@ jobs:
|
|
|
44
44
|
python-version: ${{ matrix.python-version }}
|
|
45
45
|
|
|
46
46
|
- name: Install FastMCP
|
|
47
|
-
run
|
|
47
|
+
# run with frozen to use the current lockfile; static checks will determine if it needs updating
|
|
48
|
+
run: uv sync --frozen
|
|
48
49
|
|
|
49
50
|
- name: Run tests (excluding integration and client_process)
|
|
50
|
-
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"
|
|
51
52
|
|
|
52
53
|
- name: Run client process tests separately
|
|
53
|
-
run: uv run pytest tests -m "client_process" -x
|
|
54
|
+
run: uv run pytest -v tests -m "client_process" -x
|
|
54
55
|
|
|
55
56
|
run_integration_tests:
|
|
56
57
|
name: "Run integration tests"
|
|
@@ -58,7 +59,7 @@ jobs:
|
|
|
58
59
|
timeout-minutes: 10
|
|
59
60
|
|
|
60
61
|
steps:
|
|
61
|
-
- uses: actions/checkout@
|
|
62
|
+
- uses: actions/checkout@v5
|
|
62
63
|
|
|
63
64
|
- name: Install uv
|
|
64
65
|
uses: astral-sh/setup-uv@v6
|
|
@@ -68,9 +69,12 @@ jobs:
|
|
|
68
69
|
python-version: "3.10"
|
|
69
70
|
|
|
70
71
|
- name: Install FastMCP
|
|
71
|
-
run
|
|
72
|
+
# run with frozen to use the current lockfile; static checks will determine if it needs updating
|
|
73
|
+
run: uv sync --frozen
|
|
72
74
|
|
|
73
75
|
- name: Run integration tests
|
|
74
|
-
run: uv run pytest tests -m "integration"
|
|
76
|
+
run: uv run pytest -v tests -m "integration"
|
|
75
77
|
env:
|
|
76
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"
|