Plugin Manifest

Every plugin requires a plugin.json file at the root of its package. This file declares the plugin’s identity, capabilities, permissions, and UI contributions.

Full Schema

{
  "id": "your-org.your-plugin",
  "name": "My Plugin",
  "description": "A brief description of what your plugin does.",
  "version": "0.1.0",
  "kind": "tool_provider",
  "entrypoint": "main.py",
  "platforms": ["darwin", "linux", "windows"],
  "architectures": ["aarch64", "x86_64"],
  "permissions": [
    { "key": "workspace.read", "title": "Read workspace files" },
    { "key": "events.emit", "title": "Emit plugin events" }
  ],
  "capabilities": [
    "plugin.health",
    "my.custom.method"
  ],
  "ui_contributions": [
    { "slot": "sidebar.item", "icon": "wrench", "label": "My Plugin" },
    { "slot": "page.main", "component": "my-page" }
  ],
  "auth_modes": [],
  "min_desktop_version": "0.1.0",
  "update_channel": "stable"
}

Required Fields

FieldTypeDescription
idstringUnique plugin identifier in reverse-domain format (e.g., your-org.plugin-name). This is the permanent identity of your plugin across all versions.
namestringHuman-readable display name shown in the UI.
versionstringSemantic version (e.g., 1.0.0). Each registry upload must use a unique version.
kindstringPlugin type: "agent_provider" or "tool_provider". Determines how the desktop app renders your plugin’s UI.
entrypointstringPath to the executable or script that the host will spawn. Relative to the plugin install directory.

Optional Fields

FieldTypeDefaultDescription
descriptionstringnullDescription shown in the marketplace and plugin detail views.
platformsstring[]AllTarget operating systems: "darwin", "linux", "windows".
architecturesstring[]AllTarget CPU architectures: "aarch64", "x86_64".
permissionsobject[][]Permissions your plugin needs. Each has a key and optional title.
capabilitiesstring[][]JSON-RPC methods your plugin implements.
ui_contributionsobject[][]UI slots your plugin contributes to. See UI Contributions.
auth_modesstring[][]Authentication methods your plugin supports (e.g., "chatgpt", "api_key").
min_desktop_versionstringnullMinimum desktop app version required.
update_channelstring"stable"Release channel: "stable" or "beta".

Plugin ID Convention

Use reverse-domain notation for your plugin ID:

your-org.plugin-name

Examples:

  • openai.codex (an OpenAI agent plugin)
  • biosimulant.reference-echo (a Biosimulant reference plugin)
  • acme-labs.data-exporter (a third-party tool plugin)
⚠️

The plugin ID is permanent. Changing it creates a new plugin, and existing installations won’t receive updates.

Permissions

Permissions declare what your plugin needs access to. Users can configure approval policies (allow, deny, or prompt) per permission.

Permission KeyDescription
workspace.readRead workspace files and lab configurations
workspace.mutateModify workspace files, models, and lab configurations
command.executionExecute CLI commands on the user’s machine
events.emitEmit events that the desktop app can listen to
"permissions": [
  { "key": "workspace.read", "title": "Read workspace" },
  { "key": "workspace.mutate", "title": "Modify workspace" }
]

The title field is optional and provides a human-readable label shown in the approval UI.

Capabilities

Capabilities list the JSON-RPC methods your plugin implements. This helps the host and other plugins understand what your plugin can do.

"capabilities": [
  "plugin.health",
  "echo.repeat",
  "data.export"
]

Every plugin should implement at least plugin.health and plugin/shutdown. See Runtime & JSON-RPC for the full protocol.

Entrypoint

The entrypoint is the command the host spawns when your plugin is activated. It receives JSON-RPC messages on stdin and writes responses to stdout.

"entrypoint": "main.py"

For compiled binaries, place them in the bin/ directory:

"entrypoint": "bin/my-plugin"

Files under bin/ and runtime/ directories are automatically marked as executable when packaged into a .bsiplugin archive.

The host sets these environment variables before spawning your entrypoint:

VariableDescription
BIOSIMULANT_PLUGIN_INSTALL_DIRAbsolute path to the plugin’s installation directory
BIOSIMULANT_PLUGIN_DATA_DIRAbsolute path to a private writable directory for plugin state
BIOSIMULANT_DESKTOP_VERSIONVersion of the desktop app running the plugin