mcphub-server 3.3.0__tar.gz → 3.4.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.
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/PKG-INFO +3 -3
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/README.md +2 -2
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/dashboard/routes.py +41 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/endpoints/config.py +3 -4
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/plugin_visibility.py +1 -1
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/settings.py +2 -2
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/site_api.py +20 -15
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/service.html +25 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/sites/add.html +15 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/mcphub_server.egg-info/PKG-INFO +3 -3
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/mcphub_server.egg-info/SOURCES.txt +1 -2
- mcphub_server-3.4.0/plugins/openpanel/__init__.py +11 -0
- mcphub_server-3.4.0/plugins/openpanel/client.py +640 -0
- mcphub_server-3.4.0/plugins/openpanel/handlers/__init__.py +48 -0
- mcphub_server-3.4.0/plugins/openpanel/handlers/clients.py +191 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/openpanel/handlers/events.py +87 -15
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/openpanel/handlers/export.py +111 -326
- mcphub_server-3.4.0/plugins/openpanel/handlers/profiles.py +186 -0
- mcphub_server-3.4.0/plugins/openpanel/handlers/projects.py +177 -0
- mcphub_server-3.4.0/plugins/openpanel/handlers/reports.py +88 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/openpanel/handlers/system.py +3 -33
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/openpanel/plugin.py +30 -59
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/pyproject.toml +1 -1
- mcphub_server-3.4.0/tests/test_openpanel_plugin.py +767 -0
- mcphub_server-3.3.0/plugins/openpanel/__init__.py +0 -14
- mcphub_server-3.3.0/plugins/openpanel/client.py +0 -1028
- mcphub_server-3.3.0/plugins/openpanel/handlers/__init__.py +0 -44
- mcphub_server-3.3.0/plugins/openpanel/handlers/clients.py +0 -252
- mcphub_server-3.3.0/plugins/openpanel/handlers/dashboards.py +0 -467
- mcphub_server-3.3.0/plugins/openpanel/handlers/funnels.py +0 -388
- mcphub_server-3.3.0/plugins/openpanel/handlers/profiles.py +0 -451
- mcphub_server-3.3.0/plugins/openpanel/handlers/projects.py +0 -344
- mcphub_server-3.3.0/plugins/openpanel/handlers/reports.py +0 -537
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/LICENSE +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/admin_utils.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/api_keys.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/audit_log.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/auth.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/config_snippets.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/context.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/dashboard/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/dashboard/auth.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/database.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/encryption.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/endpoints/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/endpoints/factory.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/endpoints/middleware.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/endpoints/registry.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/health.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/i18n.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/middleware/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/oauth/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/oauth/client_registry.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/oauth/csrf.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/oauth/pkce.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/oauth/schemas.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/oauth/server.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/oauth/storage.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/oauth/token_manager.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/project_manager.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/rate_limiter.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/site_manager.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/base.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/404.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/api-keys/list.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/audit-logs/list.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/auth-login.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/base.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/connect.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/health/index.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/health/projects-partial.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/index.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/login.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/oauth-clients/list.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/partials/head_assets.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/profile.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/projects/detail.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/projects/list.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/services_list.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/settings/index.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/sites/edit.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/sites/list.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/dashboard/user-oauth-clients.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/oauth/authorize.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/templates/oauth/error.html +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/tool_generator.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/tool_registry.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/user_auth.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/user_endpoints.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/core/user_keys.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/mcphub_server.egg-info/dependency_links.txt +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/mcphub_server.egg-info/entry_points.txt +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/mcphub_server.egg-info/requires.txt +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/mcphub_server.egg-info/top_level.txt +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/client.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/handlers/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/handlers/databases.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/handlers/documents.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/handlers/functions.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/handlers/messaging.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/handlers/storage.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/handlers/system.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/handlers/teams.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/handlers/users.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/appwrite/plugin.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/base.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/client.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/handlers/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/handlers/access.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/handlers/automation.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/handlers/collections.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/handlers/content.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/handlers/dashboards.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/handlers/files.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/handlers/items.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/handlers/system.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/handlers/users.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/directus/plugin.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/client.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/handlers/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/handlers/issues.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/handlers/pull_requests.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/handlers/repositories.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/handlers/users.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/handlers/webhooks.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/plugin.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/schemas/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/schemas/common.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/schemas/issue.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/schemas/pull_request.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/schemas/repository.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/schemas/user.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/gitea/schemas/webhook.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/client.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/handlers/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/handlers/credentials.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/handlers/executions.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/handlers/projects.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/handlers/system.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/handlers/tags.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/handlers/users.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/handlers/variables.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/handlers/workflows.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/n8n/plugin.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/openpanel/handlers/utils.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/supabase/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/supabase/client.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/supabase/handlers/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/supabase/handlers/admin.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/supabase/handlers/auth.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/supabase/handlers/database.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/supabase/handlers/functions.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/supabase/handlers/storage.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/supabase/handlers/system.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/supabase/plugin.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/woocommerce/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/woocommerce/plugin.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/client.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/comments.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/coupons.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/customers.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/media.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/menus.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/orders.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/posts.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/products.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/reports.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/seo.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/site.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/taxonomy.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/users.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/handlers/wp_cli.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/plugin.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/plugin_old_backup.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/schemas/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/schemas/common.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/schemas/media.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/schemas/order.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/schemas/post.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/schemas/product.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/schemas/seo.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress/wp_cli.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress_advanced/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress_advanced/handlers/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress_advanced/handlers/bulk.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress_advanced/handlers/database.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress_advanced/handlers/system.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress_advanced/plugin.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress_advanced/schemas/__init__.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress_advanced/schemas/bulk.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress_advanced/schemas/database.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/plugins/wordpress_advanced/schemas/system.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/server.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/server_multi.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/setup.cfg +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_admin_system.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_api_keys.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_auth.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_auth_logic.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_config_snippets.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_dashboard.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_database.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_dynamic_endpoints_integration.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_encryption.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_f3_admin_stats.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_f3_last_tested.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_f3_service_pages.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_oauth_basic_auth.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_oauth_client_registry.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_oauth_integration.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_oauth_pkce.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_oauth_resource.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_oauth_revoke.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_oauth_schemas.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_oauth_storage.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_oauth_token_manager.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_plugin_visibility.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_rate_limiter.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_site_api.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_site_manager.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_tenant_isolation.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_tool_registry.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_user_auth.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_user_endpoints.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_user_keys.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_woocommerce_plugin.py +0 -0
- {mcphub_server-3.3.0 → mcphub_server-3.4.0}/tests/test_wordpress_plugin.py +0 -0
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcphub-server
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.4.0
|
|
4
4
|
Summary: AI-native management hub for WordPress, WooCommerce, and self-hosted services via Model Context Protocol (MCP)
|
|
5
5
|
Author-email: MCP Hub <contact@mcphub.dev>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -161,14 +161,14 @@ You should see the login page. Log in with your `MASTER_API_KEY` or via **GitHub
|
|
|
161
161
|
|
|
162
162
|
### Try It Now (No Setup Required)
|
|
163
163
|
|
|
164
|
-
**Don't want to self-host?**
|
|
164
|
+
**Don't want to self-host?** Use the hosted instance at **[mcp.example.com](https://mcp.example.com)**:
|
|
165
165
|
|
|
166
166
|
1. Log in with **GitHub** or **Google**
|
|
167
167
|
2. Add your sites via the dashboard (My Sites → Add Service)
|
|
168
168
|
3. Go to **Connect** page — generate config for your AI client
|
|
169
169
|
4. Copy-paste the config into Claude Desktop, VS Code, or Claude Code
|
|
170
170
|
|
|
171
|
-
Your personal MCP endpoint: `https://mcp.
|
|
171
|
+
Your personal MCP endpoint: `https://mcp.example.com/u/{your-user-id}/{alias}/mcp`
|
|
172
172
|
|
|
173
173
|
---
|
|
174
174
|
|
|
@@ -112,14 +112,14 @@ You should see the login page. Log in with your `MASTER_API_KEY` or via **GitHub
|
|
|
112
112
|
|
|
113
113
|
### Try It Now (No Setup Required)
|
|
114
114
|
|
|
115
|
-
**Don't want to self-host?**
|
|
115
|
+
**Don't want to self-host?** Use the hosted instance at **[mcp.example.com](https://mcp.example.com)**:
|
|
116
116
|
|
|
117
117
|
1. Log in with **GitHub** or **Google**
|
|
118
118
|
2. Add your sites via the dashboard (My Sites → Add Service)
|
|
119
119
|
3. Go to **Connect** page — generate config for your AI client
|
|
120
120
|
4. Copy-paste the config into Claude Desktop, VS Code, or Claude Code
|
|
121
121
|
|
|
122
|
-
Your personal MCP endpoint: `https://mcp.
|
|
122
|
+
Your personal MCP endpoint: `https://mcp.example.com/u/{your-user-id}/{alias}/mcp`
|
|
123
123
|
|
|
124
124
|
---
|
|
125
125
|
|
|
@@ -3292,6 +3292,46 @@ async def get_service_page_data(plugin_type: str) -> dict | None:
|
|
|
3292
3292
|
|
|
3293
3293
|
from core.plugin_visibility import is_plugin_public
|
|
3294
3294
|
|
|
3295
|
+
# Per-plugin descriptions and notes
|
|
3296
|
+
service_descriptions = {
|
|
3297
|
+
"openpanel": {
|
|
3298
|
+
"en": (
|
|
3299
|
+
"OpenPanel product analytics management. "
|
|
3300
|
+
"Supports event tracking, data export, analytics reports, "
|
|
3301
|
+
"and project/client management via public REST APIs. "
|
|
3302
|
+
"Works with both self-hosted and cloud (openpanel.dev) instances."
|
|
3303
|
+
),
|
|
3304
|
+
"fa": (
|
|
3305
|
+
"مدیریت آنالیتیکس محصول OpenPanel. "
|
|
3306
|
+
"پشتیبانی از ردیابی رویداد، خروجی داده، گزارشهای آنالیتیکس، "
|
|
3307
|
+
"و مدیریت پروژه/کلاینت از طریق APIهای عمومی REST. "
|
|
3308
|
+
"هم نسخه خودمیزبان و هم نسخه cloud (openpanel.dev) پشتیبانی میشود."
|
|
3309
|
+
),
|
|
3310
|
+
"notes_en": [
|
|
3311
|
+
"<strong>Site URL must be the API URL</strong>, not the dashboard URL. "
|
|
3312
|
+
"Cloud: <code>https://api.openpanel.dev</code> — "
|
|
3313
|
+
"Self-hosted: your API service URL (e.g., <code>https://analytics.example.com</code>).",
|
|
3314
|
+
"Client must have <strong>root</strong> mode for full access (tracking + export + manage). "
|
|
3315
|
+
"Use <strong>read</strong> mode for analytics only, or <strong>write</strong> mode for tracking only.",
|
|
3316
|
+
"If you have WordPress, install the <a href='/static/plugins/openpanel-self-hosted.zip' "
|
|
3317
|
+
"class='text-primary-400 hover:underline'>OpenPanel WordPress plugin</a> "
|
|
3318
|
+
"to automatically send analytics data to your OpenPanel instance.",
|
|
3319
|
+
],
|
|
3320
|
+
"notes_fa": [
|
|
3321
|
+
"<strong>آدرس سایت باید آدرس API باشد</strong>، نه داشبورد. "
|
|
3322
|
+
"نسخه Cloud: <code>https://api.openpanel.dev</code> — "
|
|
3323
|
+
"خودمیزبان: آدرس سرویس API شما (مثلاً <code>https://analytics.example.com</code>).",
|
|
3324
|
+
"برای دسترسی کامل، کلاینت باید حالت <strong>root</strong> داشته باشد. "
|
|
3325
|
+
"از حالت <strong>read</strong> برای آنالیتیکس و <strong>write</strong> برای ردیابی استفاده کنید.",
|
|
3326
|
+
"اگر وردپرس دارید، افزونه <a href='/static/plugins/openpanel-self-hosted.zip' "
|
|
3327
|
+
"class='text-primary-400 hover:underline'>OpenPanel WordPress</a> "
|
|
3328
|
+
"را نصب کنید تا دادههای آنالیتیکس بهصورت خودکار به OpenPanel ارسال شود.",
|
|
3329
|
+
],
|
|
3330
|
+
},
|
|
3331
|
+
}
|
|
3332
|
+
|
|
3333
|
+
desc_data = service_descriptions.get(plugin_type, {})
|
|
3334
|
+
|
|
3295
3335
|
return {
|
|
3296
3336
|
"plugin_type": plugin_type,
|
|
3297
3337
|
"display_name": display_name,
|
|
@@ -3299,6 +3339,7 @@ async def get_service_page_data(plugin_type: str) -> dict | None:
|
|
|
3299
3339
|
"tools_count": len(tools),
|
|
3300
3340
|
"credential_fields": credential_fields,
|
|
3301
3341
|
"is_public": is_plugin_public(plugin_type),
|
|
3342
|
+
"description": desc_data,
|
|
3302
3343
|
}
|
|
3303
3344
|
|
|
3304
3345
|
|
|
@@ -249,16 +249,15 @@ ENDPOINT_CONFIGS = {
|
|
|
249
249
|
},
|
|
250
250
|
max_tools=80,
|
|
251
251
|
),
|
|
252
|
-
# OpenPanel endpoint - Product Analytics (
|
|
252
|
+
# OpenPanel endpoint - Product Analytics (42 tools) - Phase H
|
|
253
253
|
EndpointType.OPENPANEL: EndpointConfig(
|
|
254
254
|
path="/openpanel",
|
|
255
255
|
name="OpenPanel Analytics",
|
|
256
|
-
description="OpenPanel product analytics
|
|
256
|
+
description="OpenPanel self-hosted product analytics (events, export, insights, project/client management)",
|
|
257
257
|
endpoint_type=EndpointType.OPENPANEL,
|
|
258
258
|
plugin_types=["openpanel"],
|
|
259
259
|
require_master_key=False,
|
|
260
260
|
allowed_scopes={"read", "write", "admin"},
|
|
261
|
-
# Blacklist system and admin tools
|
|
262
261
|
tool_blacklist={
|
|
263
262
|
"manage_api_keys_create",
|
|
264
263
|
"manage_api_keys_delete",
|
|
@@ -266,7 +265,7 @@ ENDPOINT_CONFIGS = {
|
|
|
266
265
|
"oauth_register_client",
|
|
267
266
|
"oauth_revoke_client",
|
|
268
267
|
},
|
|
269
|
-
max_tools=
|
|
268
|
+
max_tools=50,
|
|
270
269
|
),
|
|
271
270
|
# Appwrite endpoint - Backend-as-a-Service (100 tools) - Phase I
|
|
272
271
|
EndpointType.APPWRITE: EndpointConfig(
|
|
@@ -15,7 +15,7 @@ Usage:
|
|
|
15
15
|
import os
|
|
16
16
|
|
|
17
17
|
# Default plugins available to public (OAuth) users
|
|
18
|
-
DEFAULT_PUBLIC_PLUGINS = {"wordpress", "woocommerce", "supabase"}
|
|
18
|
+
DEFAULT_PUBLIC_PLUGINS = {"wordpress", "woocommerce", "supabase", "openpanel"}
|
|
19
19
|
|
|
20
20
|
|
|
21
21
|
def _parse_plugins(val: str) -> set[str]:
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Usage:
|
|
4
4
|
from core.settings import get_setting
|
|
5
5
|
|
|
6
|
-
enabled = await get_setting("ENABLED_PLUGINS", "wordpress,woocommerce,supabase")
|
|
6
|
+
enabled = await get_setting("ENABLED_PLUGINS", "wordpress,woocommerce,supabase,openpanel")
|
|
7
7
|
max_sites = int(await get_setting("MAX_SITES_PER_USER", "10"))
|
|
8
8
|
"""
|
|
9
9
|
|
|
@@ -17,7 +17,7 @@ _cached_plugins: set[str] | None = None
|
|
|
17
17
|
|
|
18
18
|
# Default values for all managed settings
|
|
19
19
|
SETTING_DEFAULTS: dict[str, str] = {
|
|
20
|
-
"ENABLED_PLUGINS": "wordpress,woocommerce,supabase",
|
|
20
|
+
"ENABLED_PLUGINS": "wordpress,woocommerce,supabase,openpanel",
|
|
21
21
|
"MAX_SITES_PER_USER": "10",
|
|
22
22
|
"USER_RATE_LIMIT_PER_MIN": "30",
|
|
23
23
|
"USER_RATE_LIMIT_PER_HR": "500",
|
|
@@ -157,7 +157,7 @@ PLUGIN_CREDENTIAL_FIELDS: dict[str, list[dict[str, Any]]] = {
|
|
|
157
157
|
"label": "Client ID",
|
|
158
158
|
"type": "text",
|
|
159
159
|
"required": True,
|
|
160
|
-
"hint": "OpenPanel
|
|
160
|
+
"hint": "OpenPanel Dashboard → Settings → Clients → Create client with 'root' mode for full access",
|
|
161
161
|
},
|
|
162
162
|
{
|
|
163
163
|
"name": "client_secret",
|
|
@@ -166,6 +166,21 @@ PLUGIN_CREDENTIAL_FIELDS: dict[str, list[dict[str, Any]]] = {
|
|
|
166
166
|
"required": True,
|
|
167
167
|
"hint": "Generated with your Client ID",
|
|
168
168
|
},
|
|
169
|
+
{
|
|
170
|
+
"name": "project_id",
|
|
171
|
+
"label": "Project ID",
|
|
172
|
+
"type": "text",
|
|
173
|
+
"required": False,
|
|
174
|
+
"hint": "From dashboard URL: dashboard.openpanel.dev/{org}/{project-id}/ — sets default for Export & Insights tools",
|
|
175
|
+
},
|
|
176
|
+
{
|
|
177
|
+
"name": "organization_id",
|
|
178
|
+
"label": "Organization ID",
|
|
179
|
+
"type": "text",
|
|
180
|
+
"required": False,
|
|
181
|
+
"hint": "From dashboard URL: dashboard.openpanel.dev/{org}/{project-id}/",
|
|
182
|
+
"advanced": True,
|
|
183
|
+
},
|
|
169
184
|
],
|
|
170
185
|
"appwrite": [
|
|
171
186
|
{
|
|
@@ -215,7 +230,7 @@ _HEALTH_ENDPOINTS: dict[str, dict[str, Any]] = {
|
|
|
215
230
|
"gitea": {"path": "/api/v1/user", "method": "GET"},
|
|
216
231
|
"n8n": {"path": "/healthz", "method": "GET"},
|
|
217
232
|
"supabase": {"path": "/rest/v1/", "method": "GET"},
|
|
218
|
-
"openpanel": {"path": "/
|
|
233
|
+
"openpanel": {"path": "/healthcheck", "method": "GET"},
|
|
219
234
|
"appwrite": {"path": "/v1/health", "method": "GET"},
|
|
220
235
|
"directus": {"path": "/server/health", "method": "GET"},
|
|
221
236
|
}
|
|
@@ -342,23 +357,13 @@ async def validate_site_connection(
|
|
|
342
357
|
elif plugin_type == "directus":
|
|
343
358
|
headers["Authorization"] = f"Bearer {credentials.get('token', '')}"
|
|
344
359
|
elif plugin_type == "openpanel":
|
|
345
|
-
|
|
346
|
-
|
|
360
|
+
headers["openpanel-client-id"] = credentials.get("client_id", "")
|
|
361
|
+
headers["openpanel-client-secret"] = credentials.get("client_secret", "")
|
|
347
362
|
|
|
348
363
|
try:
|
|
349
364
|
timeout = aiohttp.ClientTimeout(total=15)
|
|
350
365
|
async with aiohttp.ClientSession(timeout=timeout) as session:
|
|
351
|
-
if method == "POST"
|
|
352
|
-
async with session.post(
|
|
353
|
-
check_url,
|
|
354
|
-
json={
|
|
355
|
-
"clientId": credentials.get("client_id", ""),
|
|
356
|
-
"clientSecret": credentials.get("client_secret", ""),
|
|
357
|
-
},
|
|
358
|
-
) as resp:
|
|
359
|
-
status_code = resp.status
|
|
360
|
-
resp_text = await resp.text()
|
|
361
|
-
elif method == "POST":
|
|
366
|
+
if method == "POST":
|
|
362
367
|
async with session.post(check_url, headers=headers) as resp:
|
|
363
368
|
status_code = resp.status
|
|
364
369
|
resp_text = await resp.text()
|
|
@@ -31,6 +31,31 @@
|
|
|
31
31
|
</a>
|
|
32
32
|
</div>
|
|
33
33
|
|
|
34
|
+
<!-- Description & Notes -->
|
|
35
|
+
{% if service.description %}
|
|
36
|
+
<div class="bg-white dark:bg-gray-800 rounded-xl border border-gray-200 dark:border-gray-700 p-6">
|
|
37
|
+
{% if lang == 'fa' and service.description.fa %}
|
|
38
|
+
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed" dir="rtl">{{ service.description.fa }}</p>
|
|
39
|
+
{% elif service.description.en %}
|
|
40
|
+
<p class="text-sm text-gray-600 dark:text-gray-300 leading-relaxed">{{ service.description.en }}</p>
|
|
41
|
+
{% endif %}
|
|
42
|
+
|
|
43
|
+
{% set notes_key = 'notes_fa' if lang == 'fa' else 'notes_en' %}
|
|
44
|
+
{% if service.description[notes_key] %}
|
|
45
|
+
<ul class="mt-4 space-y-2{% if lang == 'fa' %} text-right{% endif %}" {% if lang == 'fa' %}dir="rtl"{% endif %}>
|
|
46
|
+
{% for note in service.description[notes_key] %}
|
|
47
|
+
<li class="flex items-start gap-2 text-sm text-gray-500 dark:text-gray-400">
|
|
48
|
+
<svg class="w-4 h-4 text-primary-400 mt-0.5 flex-shrink-0" fill="none" stroke="currentColor" viewBox="0 0 24 24">
|
|
49
|
+
<path stroke-linecap="round" stroke-linejoin="round" stroke-width="2" d="M13 16h-1v-4h-1m1-4h.01M21 12a9 9 0 11-18 0 9 9 0 0118 0z"/>
|
|
50
|
+
</svg>
|
|
51
|
+
<span>{{ note|safe }}</span>
|
|
52
|
+
</li>
|
|
53
|
+
{% endfor %}
|
|
54
|
+
</ul>
|
|
55
|
+
{% endif %}
|
|
56
|
+
</div>
|
|
57
|
+
{% endif %}
|
|
58
|
+
|
|
34
59
|
<!-- Overview Cards -->
|
|
35
60
|
<div class="grid grid-cols-1 md:grid-cols-3 gap-6">
|
|
36
61
|
<!-- Tools Count -->
|
|
@@ -37,6 +37,7 @@
|
|
|
37
37
|
<label class="block text-sm font-medium text-gray-700 dark:text-gray-300 mb-2">{{ t.site_url }}</label>
|
|
38
38
|
<input type="url" id="url" name="url" required placeholder="https://example.com"
|
|
39
39
|
class="w-full bg-gray-50 dark:bg-gray-700 border border-gray-300 dark:border-gray-600 rounded-lg px-4 py-2.5 text-gray-900 dark:text-white placeholder-gray-400 dark:placeholder-gray-500 focus:ring-2 focus:ring-blue-500 focus:border-transparent">
|
|
40
|
+
<p id="url-hint" class="text-xs text-gray-500 dark:text-gray-400 mt-1 hidden"></p>
|
|
40
41
|
</div>
|
|
41
42
|
|
|
42
43
|
<!-- Alias -->
|
|
@@ -73,9 +74,23 @@
|
|
|
73
74
|
<script>
|
|
74
75
|
const pluginFields = {{ plugin_fields_json| safe }};
|
|
75
76
|
|
|
77
|
+
const urlHints = {
|
|
78
|
+
'openpanel': 'OpenPanel API URL — Cloud: https://api.openpanel.dev | Self-hosted: your API service URL (e.g., https://analytics.example.com)',
|
|
79
|
+
'supabase': 'Your Supabase project URL (e.g., https://xxxxx.supabase.co)',
|
|
80
|
+
};
|
|
81
|
+
|
|
76
82
|
function updateFields() {
|
|
77
83
|
const ptype = document.getElementById('plugin_type').value;
|
|
78
84
|
const container = document.getElementById('credential-fields');
|
|
85
|
+
const urlHintEl = document.getElementById('url-hint');
|
|
86
|
+
|
|
87
|
+
// Update URL hint
|
|
88
|
+
if (urlHints[ptype]) {
|
|
89
|
+
urlHintEl.textContent = urlHints[ptype];
|
|
90
|
+
urlHintEl.classList.remove('hidden');
|
|
91
|
+
} else {
|
|
92
|
+
urlHintEl.classList.add('hidden');
|
|
93
|
+
}
|
|
79
94
|
|
|
80
95
|
if (!ptype || !pluginFields[ptype]) {
|
|
81
96
|
container.innerHTML = '<label class="block text-sm font-medium text-gray-700 dark:text-gray-300">{{ t.credentials }}</label><p class="text-sm text-gray-500 dark:text-gray-400">{{ t.select_plugin }}</p>';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
Metadata-Version: 2.4
|
|
2
2
|
Name: mcphub-server
|
|
3
|
-
Version: 3.
|
|
3
|
+
Version: 3.4.0
|
|
4
4
|
Summary: AI-native management hub for WordPress, WooCommerce, and self-hosted services via Model Context Protocol (MCP)
|
|
5
5
|
Author-email: MCP Hub <contact@mcphub.dev>
|
|
6
6
|
License-Expression: MIT
|
|
@@ -161,14 +161,14 @@ You should see the login page. Log in with your `MASTER_API_KEY` or via **GitHub
|
|
|
161
161
|
|
|
162
162
|
### Try It Now (No Setup Required)
|
|
163
163
|
|
|
164
|
-
**Don't want to self-host?**
|
|
164
|
+
**Don't want to self-host?** Use the hosted instance at **[mcp.example.com](https://mcp.example.com)**:
|
|
165
165
|
|
|
166
166
|
1. Log in with **GitHub** or **Google**
|
|
167
167
|
2. Add your sites via the dashboard (My Sites → Add Service)
|
|
168
168
|
3. Go to **Connect** page — generate config for your AI client
|
|
169
169
|
4. Copy-paste the config into Claude Desktop, VS Code, or Claude Code
|
|
170
170
|
|
|
171
|
-
Your personal MCP endpoint: `https://mcp.
|
|
171
|
+
Your personal MCP endpoint: `https://mcp.example.com/u/{your-user-id}/{alias}/mcp`
|
|
172
172
|
|
|
173
173
|
---
|
|
174
174
|
|
|
@@ -133,10 +133,8 @@ plugins/openpanel/client.py
|
|
|
133
133
|
plugins/openpanel/plugin.py
|
|
134
134
|
plugins/openpanel/handlers/__init__.py
|
|
135
135
|
plugins/openpanel/handlers/clients.py
|
|
136
|
-
plugins/openpanel/handlers/dashboards.py
|
|
137
136
|
plugins/openpanel/handlers/events.py
|
|
138
137
|
plugins/openpanel/handlers/export.py
|
|
139
|
-
plugins/openpanel/handlers/funnels.py
|
|
140
138
|
plugins/openpanel/handlers/profiles.py
|
|
141
139
|
plugins/openpanel/handlers/projects.py
|
|
142
140
|
plugins/openpanel/handlers/reports.py
|
|
@@ -212,6 +210,7 @@ tests/test_oauth_revoke.py
|
|
|
212
210
|
tests/test_oauth_schemas.py
|
|
213
211
|
tests/test_oauth_storage.py
|
|
214
212
|
tests/test_oauth_token_manager.py
|
|
213
|
+
tests/test_openpanel_plugin.py
|
|
215
214
|
tests/test_plugin_visibility.py
|
|
216
215
|
tests/test_rate_limiter.py
|
|
217
216
|
tests/test_site_api.py
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"""
|
|
2
|
+
OpenPanel Plugin - Product Analytics Management.
|
|
3
|
+
|
|
4
|
+
Self-hosted OpenPanel management through public REST APIs (42 tools).
|
|
5
|
+
Event tracking, data export, analytics, project & client management.
|
|
6
|
+
"""
|
|
7
|
+
|
|
8
|
+
from plugins.openpanel.client import OpenPanelClient
|
|
9
|
+
from plugins.openpanel.plugin import OpenPanelPlugin
|
|
10
|
+
|
|
11
|
+
__all__ = ["OpenPanelPlugin", "OpenPanelClient"]
|