Learn how to register custom resource types that integrate into the App creation flow, participate in privacy scoring, and work with group-based access control.
Resource Provider plugins allow you to register custom resource types that integrate into the App creation flow, participate in privacy scoring, and work with the group-based access control model. This enables plugins to extend the platform’s governance model with new kinds of resources beyond the built-in LLMs, Datasources, and Tools.
By default, Apps in AI Studio bundle three built-in resource types: LLMs, Datasources, and Tools. The Resource Provider capability lets plugins register additional resource types that:
Appear in the Create App form as selectable resources (via a plugin-provided Web Component or a platform-rendered multi-select)
Participate in privacy scoring with the generalized rule: no resource privacy score may exceed the maximum LLM privacy score in the app
Integrate with group-based access control so admins can assign resource instances to groups, and users only see resources available to their groups
Support the community submission workflow so end-users can submit new resource instances for admin review
Propagate to gateways via the config snapshot, so gateway plugins can access resource associations at runtime
Plugin declares resource types via manifest or GetResourceTypeRegistrations() |Platform registers types in DB, shows them in the App Form |Admin assigns instances to Groups (direct mapping, no catalogues) |User creates App -> selects resources from their accessible instances |Platform validates privacy scores + calls plugin's ValidateResourceSelection() |Associations stored in app_plugin_resources join table |Config snapshot includes associations for gateway access
Resource types declared in the manifest are automatically registered when the plugin loads. The GetResourceTypeRegistrations() method provides a runtime fallback and can return additional types not in the manifest.
type ResourceTypeRegistration struct { Slug string // Machine-readable ID (unique per plugin) Name string // Display name in the UI Description string // Help text Icon string // Material icon name or asset path HasPrivacyScore bool // Whether instances carry privacy scores SupportsSubmissions bool // Whether community submissions are supported FormComponent *ResourceFormComponent // Custom Web Component (nil = standard multi-select)}
type ResourceInstance struct { ID string // Plugin-assigned unique identifier Name string // Display name Description string // Optional description PrivacyScore int // 0-100 (only meaningful if type has HasPrivacyScore) Metadata []byte // Opaque JSON included in config snapshots IsActive bool // Whether instance is currently usable}
Security: Do not store secrets, credentials, or PII in the Metadata field. Metadata is propagated to all gateways via config snapshots, cached in database join tables, and may appear in logs or be accessible to other plugins with access to the app configuration.
type ResourceFormComponent struct { Tag string // Web Component custom element tag (e.g., "mcp-server-selector") EntryPoint string // JS asset path relative to plugin root (e.g., "ui/webc/selector.js")}
When HasPrivacyScore is true, each resource instance carries a privacy score (0-100). The platform enforces a generalized rule during app creation and updates:
No resource privacy score may exceed the maximum LLM privacy score in the app.
This applies to both built-in datasources and plugin resources. For example:
Resource
Privacy Score
Result
LLM “GPT-4 Enterprise”
80
Max LLM score = 80
Datasource “Internal DB”
60
OK (60 <= 80)
Plugin resource “MCP Server A”
70
OK (70 <= 80)
Plugin resource “MCP Server B”
90
Rejected (90 > 80)
The plugin sets privacy scores on instances via the PrivacyScore field in ResourceInstance. Admins review and approve these scores through the submission workflow.
Plugin resource instances use direct group mapping instead of the catalogue pattern used by built-in types. This is simpler and sufficient since plugins organize their own resources.
Gateway plugins can access these associations from the app’s config to make routing or authorization decisions. For example, an MCP proxy plugin could check if the requesting app has access to a specific MCP server by examining the plugin_resources field.