fastapi-startkit 0.29.0__tar.gz → 0.30.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.
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/PKG-INFO +1 -1
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/pyproject.toml +1 -1
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/__init__.py +25 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/argument.py +20 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/prompt.py +45 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/protocol.py +143 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/providers/__init__.py +0 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/providers/mcp_provider.py +19 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/request.py +19 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/resource.py +32 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/response.py +30 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/server.py +79 -0
- fastapi_startkit-0.30.0/src/fastapi_startkit/mcp/tool.py +54 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/.DS_Store +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/application.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/carbon/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/carbon/carbon.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/config/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/config/app.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/Configuration.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/config.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/helpers.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/providers/ConfigurationProvider.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/providers/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/application.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/can_override_config.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/can_override_default_options.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/command.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/publish_command.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/container/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/container/container.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/environment/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/environment/environment.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/exceptions.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/handler.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Broadcast.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Cache.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Config.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Config.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Dump.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Dump.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Facade.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Gate.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Gate.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Hash.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Hash.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Loader.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Loader.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Mail.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Mail.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Notification.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Notification.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Queue.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Queue.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/RateLimiter.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/RateLimiter.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Request.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Request.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Response.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Response.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Session.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Session.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Url.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Url.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/View.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/View.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Vite.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Vite.pyi +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/commands/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/commands/serve_command.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/config/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/config/fastapi.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/exceptions.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/providers/fastapi_provider.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/requests/model.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/routers/router.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/testing/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/fastapi/testing/test_case.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/helpers/app.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/helpers/dataclass.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/constant.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/context.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/inertia.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/middleware.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/props/props.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/inertia/provider.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/loader/Loader.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/loader/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/ChannelFactory.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/BaseChannel.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/DailyChannel.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/MultiBaseChannel.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/SingleChannel.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/SlackChannel.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/StackChannel.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/SyslogChannel.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/TerminalChannel.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/channels/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/config/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/config/channels.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/config/logging.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/BaseDriver.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogSingleDriver.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogSlackDriver.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogSyslogDriver.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/LogTerminalDriver.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/drivers/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/factory.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/file.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/handler.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/listeners.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/logger.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/managers/LoggingManager.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/managers/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/providers/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/logging/providers/log_provider.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/collection/Collection.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/collection/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/DBMigrateCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/DBSeedCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeMigrationCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeModelDocstringCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeObserverCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MakeSeedCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateFreshCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRefreshCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateResetCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateRollbackCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/MigrateStatusCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/ShellCommand.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_migration.stub +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/create_seed.stub +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/model.stub +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/observer.stub +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/commands/stubs/table_migration.stub +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/config/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/config/config.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/config/database.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/connection.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/factory.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/manager.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/mysql_connection.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/postgres_connection.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/connections/sqlite_connection.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/exceptions.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/expressions/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/expressions/expressions.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/facades/DB.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/facades/Schema.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/facades/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/factory/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/factory/factory.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/helpers/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/helpers/misc.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/migrations/Migration.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/migrations/Migrator.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/migrations/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/MigrationModel.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/attribute.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/builder.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/caster.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/fields.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/model.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/observer.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/pivot.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/registry.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/models/relationship.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/observers/ObservesEvents.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/observers/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/BasePaginator.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/LengthAwarePaginator.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/SimplePaginator.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/pagination/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/providers/DatabaseProvider.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/providers/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/EagerLoadMixin.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/EagerRelation.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/BaseGrammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/MSSQLGrammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/MySQLGrammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/PostgresGrammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/SQLiteGrammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/grammars/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/MSSQLPostProcessor.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/MySQLPostProcessor.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/PostgresPostProcessor.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/SQLitePostProcessor.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/processors/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/query/support.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/BaseRelationship.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsTo.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/BelongsToMany.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasMany.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasManyThrough.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasOne.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/HasOneThrough.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphMany.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphOne.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphTo.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/MorphToMany.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/relationships/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Blueprint.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Column.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/ColumnDiff.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Constraint.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/ForeignKeyConstraint.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Index.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/Table.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/TableDiff.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MSSQLPlatform.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/MySQLPlatform.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/Platform.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/PostgresPlatform.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/SQLitePlatform.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/platforms/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/schema/schema.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/seeds/Seeder.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/seeds/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/stubs/create-migration.html +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/stubs/table-migration.html +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/testing/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm/testing/transaction.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/.gitignore +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/CACHEDIR.TAG +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/README.md +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/lastfailed +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/.pytest_cache/v/cache/nodeids +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/config/database.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/config.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/exceptions.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/factories/Factory.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/factories/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/schema/Schema.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/BaseScope.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeleteScope.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/SoftDeletesMixin.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyMixin.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/UUIDPrimaryKeyScope.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/scopes/scope.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/BaseTestCaseSelectGrammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/Database.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/TestCase.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/testing/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/User.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/connections/test_base_connections.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/eagers/test_eager.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/models/test_models.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/builder/test_mssql_query_builder_relationships.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_delete_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_insert_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_qmark.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_select_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/grammar/test_mssql_update_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mssql/schema/test_mssql_schema_builder_alter.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_mysql_builder_transaction.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_query_builder_scopes.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/builder/test_transactions.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/connections/test_mysql_connection_selects.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_delete_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_insert_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_qmark.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_select_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/grammar/test_mysql_update_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_accessors_and_mutators.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/model/test_model.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_belongs_to_many.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_many_through.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_has_one_through.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/relationships/test_relationships.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/schema/test_mysql_schema_builder_alter.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_global_scopes.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_can_use_scopes.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/mysql/scopes/test_soft_delete.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_query_builder.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/builder/test_postgres_transaction.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_delete_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_insert_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_select_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/grammar/test_update_grammar.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/relationships/test_postgres_relationships.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/postgres/schema/test_postgres_schema_builder_alter.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/scopes/test_default_global_scopes.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/seeds/test_seeds.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/masoniteorm.backup/tests/utils.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/providers/Provider.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/providers/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/providers/app_provider.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/config/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/config/storage.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/data/mime.types +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/fake.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/local.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/drivers/s3.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/file.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/filestream.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/helper.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/providers/provider.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/storage/storage.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/support/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/support/collection.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/support/string.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/testing/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/testing/test_case.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/utils/structures.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/__init__.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/config/vite.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/exceptions.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/providers/provider.py +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/package.json +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/resources/css/app.css +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/resources/js/app.ts +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/templates/index.html +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/tsconfig.json +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/stubs/vite.config.ts +0 -0
- {fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/vite/vite.py +0 -0
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
"""FastAPI Startkit MCP module.
|
|
2
|
+
|
|
3
|
+
Provides class-based building blocks for Model Context Protocol (MCP) servers
|
|
4
|
+
that can be mounted directly on any FastAPI application.
|
|
5
|
+
"""
|
|
6
|
+
|
|
7
|
+
from .argument import Argument
|
|
8
|
+
from .prompt import Prompt
|
|
9
|
+
from .request import JsonRpcRequest
|
|
10
|
+
from .resource import Resource
|
|
11
|
+
from .response import Response
|
|
12
|
+
from .server import Server
|
|
13
|
+
from .tool import Tool
|
|
14
|
+
from .providers.mcp_provider import McpProvider
|
|
15
|
+
|
|
16
|
+
__all__ = [
|
|
17
|
+
"Argument",
|
|
18
|
+
"JsonRpcRequest",
|
|
19
|
+
"McpProvider",
|
|
20
|
+
"Prompt",
|
|
21
|
+
"Resource",
|
|
22
|
+
"Response",
|
|
23
|
+
"Server",
|
|
24
|
+
"Tool",
|
|
25
|
+
]
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
"""Argument dataclass for MCP prompt arguments."""
|
|
2
|
+
|
|
3
|
+
from dataclasses import dataclass, field
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
@dataclass
|
|
8
|
+
class Argument:
|
|
9
|
+
"""Represents a single argument accepted by a Prompt."""
|
|
10
|
+
|
|
11
|
+
name: str
|
|
12
|
+
description: Optional[str] = field(default=None)
|
|
13
|
+
required: bool = field(default=False)
|
|
14
|
+
|
|
15
|
+
def to_json(self) -> dict:
|
|
16
|
+
"""Serialise to MCP-compatible JSON."""
|
|
17
|
+
data: dict = {"name": self.name, "required": self.required}
|
|
18
|
+
if self.description is not None:
|
|
19
|
+
data["description"] = self.description
|
|
20
|
+
return data
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
"""Abstract base class for MCP prompts."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
from .argument import Argument
|
|
7
|
+
from .response import Response
|
|
8
|
+
|
|
9
|
+
|
|
10
|
+
class Prompt(ABC):
|
|
11
|
+
"""Base class for MCP prompts.
|
|
12
|
+
|
|
13
|
+
Subclasses must set ``name`` and implement ``handle()``.
|
|
14
|
+
Override ``arguments()`` to declare accepted arguments.
|
|
15
|
+
Override ``should_register()`` to conditionally skip registration.
|
|
16
|
+
"""
|
|
17
|
+
|
|
18
|
+
name: str
|
|
19
|
+
description: Optional[str] = None
|
|
20
|
+
title: Optional[str] = None
|
|
21
|
+
|
|
22
|
+
def arguments(self) -> list[Argument]:
|
|
23
|
+
"""Return the list of arguments this prompt accepts."""
|
|
24
|
+
return []
|
|
25
|
+
|
|
26
|
+
def should_register(self) -> bool:
|
|
27
|
+
"""Return False to prevent this prompt from being registered."""
|
|
28
|
+
return True
|
|
29
|
+
|
|
30
|
+
@abstractmethod
|
|
31
|
+
async def handle(self, arguments: dict) -> Response:
|
|
32
|
+
"""Render the prompt with the given arguments and return a Response."""
|
|
33
|
+
raise NotImplementedError
|
|
34
|
+
|
|
35
|
+
def to_json(self) -> dict:
|
|
36
|
+
"""Serialise to the MCP prompts/list format."""
|
|
37
|
+
data: dict = {"name": self.name}
|
|
38
|
+
if self.description is not None:
|
|
39
|
+
data["description"] = self.description
|
|
40
|
+
if self.title is not None:
|
|
41
|
+
data["title"] = self.title
|
|
42
|
+
args = self.arguments()
|
|
43
|
+
if args:
|
|
44
|
+
data["arguments"] = [arg.to_json() for arg in args]
|
|
45
|
+
return data
|
|
@@ -0,0 +1,143 @@
|
|
|
1
|
+
"""Internal JSON-RPC 2.0 dispatcher for MCP."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Optional, TYPE_CHECKING
|
|
4
|
+
|
|
5
|
+
if TYPE_CHECKING:
|
|
6
|
+
from .server import Server
|
|
7
|
+
|
|
8
|
+
|
|
9
|
+
MCP_PROTOCOL_VERSION = "2024-11-05"
|
|
10
|
+
|
|
11
|
+
|
|
12
|
+
class Protocol:
|
|
13
|
+
"""Dispatches JSON-RPC 2.0 method calls to MCP handlers.
|
|
14
|
+
|
|
15
|
+
Handles the following methods:
|
|
16
|
+
- initialize
|
|
17
|
+
- tools/list
|
|
18
|
+
- tools/call
|
|
19
|
+
- prompts/list
|
|
20
|
+
- prompts/get
|
|
21
|
+
- resources/list
|
|
22
|
+
- resources/read
|
|
23
|
+
"""
|
|
24
|
+
|
|
25
|
+
def __init__(self, server: "Server") -> None:
|
|
26
|
+
self._server = server
|
|
27
|
+
|
|
28
|
+
# ------------------------------------------------------------------
|
|
29
|
+
# Public dispatch entry point
|
|
30
|
+
# ------------------------------------------------------------------
|
|
31
|
+
|
|
32
|
+
async def dispatch(self, method: str, params: Optional[dict], request_id: Any) -> dict:
|
|
33
|
+
"""Dispatch a JSON-RPC method and return a full JSON-RPC response dict."""
|
|
34
|
+
handler = {
|
|
35
|
+
"initialize": self._initialize,
|
|
36
|
+
"tools/list": self._tools_list,
|
|
37
|
+
"tools/call": self._tools_call,
|
|
38
|
+
"prompts/list": self._prompts_list,
|
|
39
|
+
"prompts/get": self._prompts_get,
|
|
40
|
+
"resources/list": self._resources_list,
|
|
41
|
+
"resources/read": self._resources_read,
|
|
42
|
+
}.get(method)
|
|
43
|
+
|
|
44
|
+
if handler is None:
|
|
45
|
+
return self._error(request_id, -32601, f"Method not found: {method}")
|
|
46
|
+
|
|
47
|
+
try:
|
|
48
|
+
result = await handler(params or {})
|
|
49
|
+
return {"jsonrpc": "2.0", "id": request_id, "result": result}
|
|
50
|
+
except Exception as exc: # pragma: no cover
|
|
51
|
+
return self._error(request_id, -32000, str(exc))
|
|
52
|
+
|
|
53
|
+
# ------------------------------------------------------------------
|
|
54
|
+
# Handlers
|
|
55
|
+
# ------------------------------------------------------------------
|
|
56
|
+
|
|
57
|
+
async def _initialize(self, params: dict) -> dict:
|
|
58
|
+
server = self._server
|
|
59
|
+
result: dict = {
|
|
60
|
+
"protocolVersion": MCP_PROTOCOL_VERSION,
|
|
61
|
+
"serverInfo": {"name": server.name, "version": "1.0"},
|
|
62
|
+
"capabilities": {
|
|
63
|
+
"tools": {"listChanged": False},
|
|
64
|
+
"prompts": {"listChanged": False},
|
|
65
|
+
"resources": {"listChanged": False},
|
|
66
|
+
},
|
|
67
|
+
}
|
|
68
|
+
if getattr(server, "description", None):
|
|
69
|
+
result["description"] = server.description
|
|
70
|
+
if getattr(server, "instructions", None):
|
|
71
|
+
result["instructions"] = server.instructions
|
|
72
|
+
return result
|
|
73
|
+
|
|
74
|
+
async def _tools_list(self, params: dict) -> dict:
|
|
75
|
+
tools = self._server.tools() or []
|
|
76
|
+
return {"tools": [t().to_json() for t in tools]}
|
|
77
|
+
|
|
78
|
+
async def _tools_call(self, params: dict) -> dict:
|
|
79
|
+
name = params.get("name")
|
|
80
|
+
arguments = params.get("arguments") or {}
|
|
81
|
+
tools = self._server.tools() or []
|
|
82
|
+
for tool_cls in tools:
|
|
83
|
+
tool = tool_cls()
|
|
84
|
+
if tool.name == name:
|
|
85
|
+
response = await tool.handle(arguments)
|
|
86
|
+
return {"content": response.to_content()}
|
|
87
|
+
return self._error_result(-32602, f"Tool not found: {name}")
|
|
88
|
+
|
|
89
|
+
async def _prompts_list(self, params: dict) -> dict:
|
|
90
|
+
prompts = self._server.prompts() or []
|
|
91
|
+
registered = [p().to_json() for p in prompts if p().should_register()]
|
|
92
|
+
return {"prompts": registered}
|
|
93
|
+
|
|
94
|
+
async def _prompts_get(self, params: dict) -> dict:
|
|
95
|
+
name = params.get("name")
|
|
96
|
+
arguments = params.get("arguments") or {}
|
|
97
|
+
prompts = self._server.prompts() or []
|
|
98
|
+
for prompt_cls in prompts:
|
|
99
|
+
prompt = prompt_cls()
|
|
100
|
+
if prompt.name == name and prompt.should_register():
|
|
101
|
+
response = await prompt.handle(arguments)
|
|
102
|
+
messages = [{"role": "user", "content": item} for item in response.to_content()]
|
|
103
|
+
return {"messages": messages}
|
|
104
|
+
return self._error_result(-32602, f"Prompt not found: {name}")
|
|
105
|
+
|
|
106
|
+
async def _resources_list(self, params: dict) -> dict:
|
|
107
|
+
resources = self._server.resources() or []
|
|
108
|
+
return {"resources": [r().to_json() for r in resources]}
|
|
109
|
+
|
|
110
|
+
async def _resources_read(self, params: dict) -> dict:
|
|
111
|
+
uri = params.get("uri")
|
|
112
|
+
resources = self._server.resources() or []
|
|
113
|
+
for resource_cls in resources:
|
|
114
|
+
resource = resource_cls()
|
|
115
|
+
if resource.uri == uri:
|
|
116
|
+
content = await resource.read()
|
|
117
|
+
return {
|
|
118
|
+
"contents": [
|
|
119
|
+
{
|
|
120
|
+
"uri": resource.uri,
|
|
121
|
+
"mimeType": resource.mime_type,
|
|
122
|
+
"text": content,
|
|
123
|
+
}
|
|
124
|
+
]
|
|
125
|
+
}
|
|
126
|
+
return self._error_result(-32602, f"Resource not found: {uri}")
|
|
127
|
+
|
|
128
|
+
# ------------------------------------------------------------------
|
|
129
|
+
# Helpers
|
|
130
|
+
# ------------------------------------------------------------------
|
|
131
|
+
|
|
132
|
+
@staticmethod
|
|
133
|
+
def _error(request_id: Any, code: int, message: str) -> dict:
|
|
134
|
+
return {
|
|
135
|
+
"jsonrpc": "2.0",
|
|
136
|
+
"id": request_id,
|
|
137
|
+
"error": {"code": code, "message": message},
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
@staticmethod
|
|
141
|
+
def _error_result(code: int, message: str) -> dict:
|
|
142
|
+
"""Return an error payload as a *result* (for tool/prompt/resource not found)."""
|
|
143
|
+
return {"error": {"code": code, "message": message}}
|
|
File without changes
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
from fastapi_startkit.providers import Provider
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
class McpProvider(Provider):
|
|
5
|
+
"""Provider that bootstraps the MCP component for fastapi-startkit.
|
|
6
|
+
|
|
7
|
+
Register it alongside ``FastAPIProvider`` to make MCP available in
|
|
8
|
+
your application::
|
|
9
|
+
|
|
10
|
+
app = Application(providers=[FastAPIProvider, McpProvider])
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
provider_key = "mcp"
|
|
14
|
+
|
|
15
|
+
def register(self) -> None:
|
|
16
|
+
"""Register MCP bindings into the container."""
|
|
17
|
+
|
|
18
|
+
def boot(self) -> None:
|
|
19
|
+
"""Boot the MCP component."""
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
"""JSON-RPC 2.0 request model."""
|
|
2
|
+
|
|
3
|
+
from typing import Any, Optional, Union
|
|
4
|
+
|
|
5
|
+
from pydantic import BaseModel
|
|
6
|
+
|
|
7
|
+
|
|
8
|
+
class JsonRpcRequest(BaseModel):
|
|
9
|
+
"""Represents a JSON-RPC 2.0 request or notification."""
|
|
10
|
+
|
|
11
|
+
jsonrpc: str = "2.0"
|
|
12
|
+
method: str
|
|
13
|
+
params: Optional[dict[str, Any]] = None
|
|
14
|
+
id: Optional[Union[str, int]] = None
|
|
15
|
+
|
|
16
|
+
@property
|
|
17
|
+
def is_notification(self) -> bool:
|
|
18
|
+
"""Return True when the request has no id (i.e. it is a notification)."""
|
|
19
|
+
return self.id is None
|
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
"""Abstract base class for MCP resources."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import Optional
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Resource(ABC):
|
|
8
|
+
"""Base class for MCP resources.
|
|
9
|
+
|
|
10
|
+
Subclasses must set ``uri`` and ``name``, and implement ``read()``.
|
|
11
|
+
"""
|
|
12
|
+
|
|
13
|
+
uri: str
|
|
14
|
+
name: str
|
|
15
|
+
description: Optional[str] = None
|
|
16
|
+
mime_type: str = "text/plain"
|
|
17
|
+
|
|
18
|
+
@abstractmethod
|
|
19
|
+
async def read(self, **kwargs) -> str:
|
|
20
|
+
"""Return the resource content as a string."""
|
|
21
|
+
raise NotImplementedError
|
|
22
|
+
|
|
23
|
+
def to_json(self) -> dict:
|
|
24
|
+
"""Serialise to the MCP resources/list format."""
|
|
25
|
+
data: dict = {
|
|
26
|
+
"uri": self.uri,
|
|
27
|
+
"name": self.name,
|
|
28
|
+
"mimeType": self.mime_type,
|
|
29
|
+
}
|
|
30
|
+
if self.description is not None:
|
|
31
|
+
data["description"] = self.description
|
|
32
|
+
return data
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
"""Response wrapper for MCP tool and prompt outputs."""
|
|
2
|
+
|
|
3
|
+
import json
|
|
4
|
+
from typing import Any
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
class Response:
|
|
8
|
+
"""Wraps tool/prompt output into MCP content format."""
|
|
9
|
+
|
|
10
|
+
def __init__(self, content: list[dict]) -> None:
|
|
11
|
+
self._content = content
|
|
12
|
+
|
|
13
|
+
@classmethod
|
|
14
|
+
def text(cls, value: str) -> "Response":
|
|
15
|
+
"""Create a plain-text response."""
|
|
16
|
+
return cls([{"type": "text", "text": value}])
|
|
17
|
+
|
|
18
|
+
@classmethod
|
|
19
|
+
def structure(cls, data: dict[str, Any]) -> "Response":
|
|
20
|
+
"""Create a structured (resource-type) response."""
|
|
21
|
+
return cls([{"type": "resource", "resource": {"text": json.dumps(data), "mimeType": "application/json"}}])
|
|
22
|
+
|
|
23
|
+
@classmethod
|
|
24
|
+
def empty(cls) -> "Response":
|
|
25
|
+
"""Create an empty response with no content."""
|
|
26
|
+
return cls([])
|
|
27
|
+
|
|
28
|
+
def to_content(self) -> list[dict]:
|
|
29
|
+
"""Return the raw content list."""
|
|
30
|
+
return self._content
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
"""MCP Server base class."""
|
|
2
|
+
|
|
3
|
+
from typing import Optional, Type
|
|
4
|
+
|
|
5
|
+
from fastapi import APIRouter, Request
|
|
6
|
+
from fastapi.responses import JSONResponse, Response as StarletteResponse
|
|
7
|
+
|
|
8
|
+
from .protocol import Protocol
|
|
9
|
+
from .request import JsonRpcRequest
|
|
10
|
+
from .tool import Tool
|
|
11
|
+
from .prompt import Prompt
|
|
12
|
+
from .resource import Resource
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
class Server:
|
|
16
|
+
"""Base class for MCP servers.
|
|
17
|
+
|
|
18
|
+
Subclasses must set ``name`` and override ``tools()``, ``prompts()``,
|
|
19
|
+
and/or ``resources()`` to register capabilities.
|
|
20
|
+
|
|
21
|
+
Usage::
|
|
22
|
+
|
|
23
|
+
class MyServer(Server):
|
|
24
|
+
name = "my-server"
|
|
25
|
+
|
|
26
|
+
def tools(self):
|
|
27
|
+
return [AddTool]
|
|
28
|
+
|
|
29
|
+
server = MyServer()
|
|
30
|
+
app.include_router(server.router("/mcp"))
|
|
31
|
+
"""
|
|
32
|
+
|
|
33
|
+
name: str
|
|
34
|
+
description: Optional[str] = None
|
|
35
|
+
instructions: Optional[str] = None
|
|
36
|
+
|
|
37
|
+
def tools(self) -> Optional[list[Type[Tool]]]:
|
|
38
|
+
"""Return a list of Tool classes to register, or None."""
|
|
39
|
+
return None
|
|
40
|
+
|
|
41
|
+
def prompts(self) -> Optional[list[Type[Prompt]]]:
|
|
42
|
+
"""Return a list of Prompt classes to register, or None."""
|
|
43
|
+
return None
|
|
44
|
+
|
|
45
|
+
def resources(self) -> Optional[list[Type[Resource]]]:
|
|
46
|
+
"""Return a list of Resource classes to register, or None."""
|
|
47
|
+
return None
|
|
48
|
+
|
|
49
|
+
def router(self, prefix: str = "/mcp") -> APIRouter:
|
|
50
|
+
"""Build and return a FastAPI APIRouter for this server.
|
|
51
|
+
|
|
52
|
+
The router exposes:
|
|
53
|
+
- ``POST {prefix}`` — JSON-RPC 2.0 endpoint
|
|
54
|
+
- ``GET {prefix}`` — returns 405 with ``Allow: POST``
|
|
55
|
+
"""
|
|
56
|
+
protocol = Protocol(self)
|
|
57
|
+
api_router = APIRouter(prefix=prefix)
|
|
58
|
+
|
|
59
|
+
@api_router.post("")
|
|
60
|
+
async def handle_post(request: Request) -> StarletteResponse:
|
|
61
|
+
body = await request.json()
|
|
62
|
+
rpc = JsonRpcRequest(**body)
|
|
63
|
+
|
|
64
|
+
if rpc.is_notification:
|
|
65
|
+
# Fire-and-forget: dispatch but return 202 immediately
|
|
66
|
+
await protocol.dispatch(rpc.method, rpc.params, rpc.id)
|
|
67
|
+
return StarletteResponse(status_code=202)
|
|
68
|
+
|
|
69
|
+
result = await protocol.dispatch(rpc.method, rpc.params, rpc.id)
|
|
70
|
+
return JSONResponse(content=result)
|
|
71
|
+
|
|
72
|
+
@api_router.get("")
|
|
73
|
+
async def handle_get() -> StarletteResponse:
|
|
74
|
+
return StarletteResponse(
|
|
75
|
+
status_code=405,
|
|
76
|
+
headers={"Allow": "POST"},
|
|
77
|
+
)
|
|
78
|
+
|
|
79
|
+
return api_router
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
"""Abstract base class for MCP tools."""
|
|
2
|
+
|
|
3
|
+
from abc import ABC, abstractmethod
|
|
4
|
+
from typing import Optional, Type
|
|
5
|
+
|
|
6
|
+
from pydantic import BaseModel
|
|
7
|
+
|
|
8
|
+
from .response import Response
|
|
9
|
+
|
|
10
|
+
|
|
11
|
+
class Tool(ABC):
|
|
12
|
+
"""Base class for MCP tools.
|
|
13
|
+
|
|
14
|
+
Subclasses must set ``name`` and ``description``, and implement ``handle()``.
|
|
15
|
+
Optionally override ``schema()`` to declare the input schema and
|
|
16
|
+
``output_schema()`` to declare the output schema.
|
|
17
|
+
"""
|
|
18
|
+
|
|
19
|
+
name: str
|
|
20
|
+
description: str
|
|
21
|
+
|
|
22
|
+
def schema(self) -> Optional[Type[BaseModel]]:
|
|
23
|
+
"""Return a Pydantic BaseModel subclass describing the input, or None."""
|
|
24
|
+
return None
|
|
25
|
+
|
|
26
|
+
def output_schema(self) -> Optional[Type[BaseModel]]:
|
|
27
|
+
"""Return a Pydantic BaseModel subclass describing the output, or None."""
|
|
28
|
+
return None
|
|
29
|
+
|
|
30
|
+
@abstractmethod
|
|
31
|
+
async def handle(self, arguments: dict) -> Response:
|
|
32
|
+
"""Execute the tool with the given arguments and return a Response."""
|
|
33
|
+
raise NotImplementedError
|
|
34
|
+
|
|
35
|
+
def to_json(self) -> dict:
|
|
36
|
+
"""Serialise to the MCP tools/list format."""
|
|
37
|
+
input_schema: dict
|
|
38
|
+
schema_cls = self.schema()
|
|
39
|
+
if schema_cls is not None:
|
|
40
|
+
input_schema = schema_cls.model_json_schema()
|
|
41
|
+
else:
|
|
42
|
+
input_schema = {"type": "object", "properties": {}}
|
|
43
|
+
|
|
44
|
+
data: dict = {
|
|
45
|
+
"name": self.name,
|
|
46
|
+
"description": self.description,
|
|
47
|
+
"inputSchema": input_schema,
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
output_schema_cls = self.output_schema()
|
|
51
|
+
if output_schema_cls is not None:
|
|
52
|
+
data["outputSchema"] = output_schema_cls.model_json_schema()
|
|
53
|
+
|
|
54
|
+
return data
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/__init__.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/config.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/configuration/helpers.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/__init__.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/application.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/console/publish_command.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/container/__init__.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/container/container.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/environment/__init__.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/environment/environment.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/__init__.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/exceptions.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/exceptions/handler.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Broadcast.py
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Notification.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Notification.pyi
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/RateLimiter.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/RateLimiter.pyi
RENAMED
|
File without changes
|
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Request.pyi
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Response.py
RENAMED
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Response.pyi
RENAMED
|
File without changes
|
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/Session.pyi
RENAMED
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
|
File without changes
|
{fastapi_startkit-0.29.0 → fastapi_startkit-0.30.0}/src/fastapi_startkit/facades/__init__.py
RENAMED
|
File without changes
|