src/Mcp/) — opt-in via mcp.enabled config flag./ai/studio) and stdio (php artisan mcp:start studio) transports.StudioApiKey for MCP auth with a new _studio.* management-scope namespace (manage_collections, manage_dashboards, manage_filters, manage_api_keys, read_schema).studio://info, studio://field-types, studio://field-types/{key}, studio://panel-types, studio://panel-types/{key}, studio://operators.mcp.enabled).studio-mcp rate limiter (per X-Api-Key, configurable via mcp.http.rate_limit).studio_list_collections, studio_get_collection, studio_create_collection, studio_update_collection, studio_preview_delete_collection, studio_delete_collection, studio_create_field, studio_update_field, studio_preview_delete_field, studio_delete_field, studio_reorder_fields, studio_set_field_options.mcp.confirm_token_ttl).Mcp/Actions/) for collection/field/field-option mutations — framework-agnostic, reusable.StudioMcpExceptionHandler mapping domain exceptions to JSON-RPC error codes per §6 of the design spec.McpSerializer for canonical entity shapes shared across all schema-management tools.ConfirmTokenInvalidException, EavCastConflictException, IntegrityException, StudioNotFoundException — each with mcpCode() and mcpData() for uniform handler calls.mcpCallTool($apiKey, $toolClass, $input) Pest helper for MCP tool tests.SchemaDesignFlowTest) covering create→field→preview→delete flow.studio_query_records, studio_get_record, studio_create_record, studio_update_record, studio_delete_record.studio_list_dashboards, studio_get_dashboard, studio_create_dashboard, studio_update_dashboard, studio_preview_delete_dashboard, studio_delete_dashboard (confirm-token flow).studio_create_panel, studio_update_panel, studio_delete_panel, studio_reorder_panels.studio_list_saved_filters, studio_save_filter (upsert), studio_delete_saved_filter.studio_list_api_keys, studio_get_api_key, studio_create_api_key (returns secret once), studio_revoke_api_key.record(), dashboard(), panel(), savedFilter(), apiKey() shapes.locales.enabled config togglestudio_values table gains a locale column with a composite unique constraint [record_id, field_id, locale], enabling per-locale storage without schema-per-field changesis_translatable toggle in the field editor; non-translatable fields store a single value regardless of localesupported_locales subset and a default_locale for fallback behavior?locale= query param > X-Locale header > session > collection/global defaultlocale() fluent method on the query builder. create(), update(), getRecordData(), and toEloquentQuery() all respect the active locale with automatic fallback to the default locale for missing translationsgetRecordDataWithMeta() returns both data and a fallbacks array indicating which fields are displaying fallback values from the default localegetAllLocaleData() returns translatable fields as nested locale maps ({"en": "Hello", "fr": "Bonjour"}) and non-translatable fields as plain valueslocales.enabled is true?locale= query param or X-Locale header for locale-specific reads/writes; responses include _meta.locale and _meta.fallbacks metadataGET ?all_locales=true returns translatable fields as nested locale objects in a single responselocale, X-Locale, and all_locales parameters with enum dropdowns when multilingual is enabled, plus _meta response schema and locale hints in operation descriptionstranslations JSON column per active locale via StudioField::getTranslatedAttribute()getRecordData() now delegates to getRecordDataWithMeta() internallybuildSnapshot() produces nested locale structures for translatable fieldsshow(), store(), and update() endpoints return JSON responses with _meta locale metadata_meta response schemas when multilingual is enabledspatie/laravel-permission is installed. Each collection gets four granular permissions (viewRecords, createRecord, updateRecord, deleteRecord) under the studio.collection.{slug}.* namespaceStudioCollectionPolicy checks per-collection permissions for view, create, update, and delete operations. StudioApiKeyPolicy and StudioDashboardPolicy enforce global permission checksart/collection-permissions.png showing the per-collection RBAC interfaceStudioPermission enum instead of hardcoded permission stringsfilter-builder-alpine, filter-builder-inline, filter-group-inline, filter-rule-row-inline) for alternative filter UXapi_enabled toggle in the Data Models editor. When enabled, the collection's CRUD endpoints appear in the OpenAPI/Swagger documentation at /docs/api with field-specific request/response schemasStudioDocumentTransformer generates per-collection paths with typed schemas derived from each collection's field definitions, including proper EAV cast mapping (text→string, integer→integer, decimal→number, boolean→boolean, datetime→date-time, json→object)api_enabled column on studio_collections table with migration, model cast, scopeApiEnabled() query scope, and apiEnabled() factory stateFilamentStudioPlugin::boot() set the API config after the service provider's booted() callback had already checked it, preventing routes from registeringapi_path prefix from generated paths to avoid double-prefixed URLs (e.g., /api/api/studio/...) that caused 404s from the Try It buttonStudioApiController::resolveCollection() now rejects requests to collections with api_enabled=false (returns 404)StudioOperationTransformer skips operations that already have the header parameter added by the document transformerauthors, homepage, and support to composer.jsonval_text, val_integer, val_decimal, val_boolean, val_datetime, val_json)afterCollectionCreated, afterFieldAdded, modifyFormSchema, modifyTableColumns, and modifyQuery$CURRENT_USER, $CURRENT_TENANT, $NOW, etc.)spatie/activitylogHow can I help you explore Laravel packages today?