Skip to content

13. Plugin Permissions Matrix

1. Goals

Provide a permission–capability–risk–default-policy reference table for reuse by UI copy and validation.

2. Matrix

PermissionRiskAllowed API / capabilityDefault policyNotes
ui.panellowOpen the plugin panelGranted at installNeeded by almost all UI plugins
ui.themelowcontributes.themes CSS is loaded and offered in SettingsGranted at installCSS is sanitized by the host; it cannot script
clipboard.readmediumclipboard.readTextConfirm on first useMay read sensitive information
clipboard.writemediumclipboard.writeTextConfirm on first usePrevents clipboard pollution
notifylowui.notify, ui.getNotificationPermission, ui.requestNotificationPermission, ui.showNativeNotificationCan be granted by defaultNative delivery is OS-controlled; avoid notification-spam abuse
fs.read.workspacemediumfs.readText / fs.globConfirm on first useWorkspace only
fs.write.workspacehighfs.writeTextConfirm each time or per sessionHigh risk
fs.delete.workspacehighfs.removeConfirm each time or per sessionNon-recursive; workspace root is protected
agent.tool.registerhighRegister an agent toolConfirm at installTool execution is audited separately
agent.prompt.injecthighInject a system prompt; activates contributes.skillsDeny by default / strong confirmationEasily leads to behavior hijacking
net.fetchhighnet.fetchDeny by defaultMust show target-domain policy (later)
shell.openExternalmediumOpen external linkConfirm on first usePrevents phishing links
mcp.server.localhighSpawn a transport: "stdio" MCP server declared in the manifestDeny by defaultRuns a local executable; its tools reach the agent
mcp.server.remotehighConnect a transport: "http" MCP serverDeny by defaultSends tool arguments to a third-party endpoint
background.servicemediumStart contributes.services and keep the plugin process residentConfirm at installSupervised with backoff; visible on the Plugins page
bus.publishmediumbus.publish to declared topicsConfirm at installOther plugins can act on the message
bus.subscribemediumbus.subscribe to declared patternsConfirm at installCan observe another plugin's messages

3. Permission dependencies

  • ui.panel is required to load a panel entry
  • agent.tool.register is required to contribute agentTools
  • When fs.write.workspace is present, it is recommended to also declare fs.read.workspace
  • A contribution whose permission is missing fails manifest validation (themes, mcpServers, services, bus); skills is the exception and is skipped at load time instead (see 02-plugin-manifest-schema.md §7)

3A. Plan operating-state rule

Every agentTools contribution is denied in Plan, regardless of this matrix's risk or default policy. agent.tool.register authorizes registration for Agent, not visibility in Plan. The host returns PLUGIN_DISABLED_IN_PLAN for a direct Plan call and records the denial. Plugin tools become eligible only after the same Agent is approved into Agent mode.

4. Permission display copy

English is the primary copy. The zh-CN column holds the localized example strings.

PermissionEnglish copyzh-CN example
fs.read.workspaceRead files in the current project读取当前项目文件
fs.write.workspaceModify files in the current project修改当前项目文件
fs.delete.workspaceDelete files in the current project删除当前项目文件
notifyShow in-app and native notifications显示应用内和系统通知
agent.tool.registerProvide executable tools to the AI Agent向 AI Agent 提供可执行工具
agent.prompt.injectAdjust agent instructions调整智能体指令
net.fetchAccess the network访问网络
shell.openExternalOpen external links打开外部链接
ui.themeProvide a theme提供主题
mcp.server.localRun a local MCP server运行本地 MCP 服务
mcp.server.remoteReach a remote MCP server连接远端 MCP 服务
background.serviceKeep a background service running保持后台服务运行
bus.publishSend messages to other plugins向其他插件发送消息
bus.subscribeReceive messages from other plugins接收其他插件的消息

5. Adding permissions on upgrade

If new permissions appear on upgrade:

  1. Compute the diff
  2. Force user confirmation
  3. If not confirmed, cancel the upgrade or disable the new capabilities (canceling the upgrade is recommended)

6. Runtime check pseudocode

ts
assertPermission(pluginId, perm) {
 if (!granted(pluginId, perm)) throw ERROR_PERMISSION_DENIED
}

Every Host API entry point must assert first.

7. Acceptance

  1. Unauthorized API calls fail
  2. Permission copy is visible in the install UI
  3. Upgrades that add permissions prompt the user

Built for local-first development.