SDK for building, validating, signing, and packaging Nutria plugins
Project description
nutria-plugin SDK
SDK for building, validating, signing, and packaging Nutria plugins.
This release also supports declarative admin extensions, allowing plugins to expose safe, host-rendered operator views inside ChatBotNutralia. It also defines declarative admin flows for safe, host-rendered operator workflows such as QR/device-code login without shipping frontend code.
Install
pip install nutria-plugin
# or with uv
uv add nutria-plugin
Quickstart
1. Scaffold a new plugin
nutria-plugin new my-workspace-plugin --name "My Workspace Plugin"
This creates:
my-workspace-plugin/
plugin.json # manifest — edit this
README.md
connections/ # one JSON file per connection
skills/ # SKILL.md files
context_docs/ # Markdown docs injected into persona prompts
specs/ # OpenAPI/WSDL specs
hooks/hooks.json # declarative hooks
settings.schema.json # config schema shown in admin UI
2. Edit plugin.json
{
"schema_version": "1.0",
"id": "my-workspace-plugin",
"name": "My Workspace Plugin",
"version": "0.1.0",
"description": "Connects Nutria to My Workspace tool",
"author": "Your Name",
"runtime_types": ["declarative_api"],
"required_secrets": ["API_KEY"],
"remote_endpoints": ["https://api.myworkspace.com"]
}
3. Validate
nutria-plugin validate .
# OK
4. Pack
nutria-plugin pack . --output my-workspace-plugin-0.1.0.zip
# Packed: my-workspace-plugin-0.1.0.zip
5. Sign (optional)
Generate a key pair once:
nutria-plugin keygen --out my-signing-key
# Private key: my-signing-key.pem
# Public key: my-signing-key.pub.pem
Sign before packing:
nutria-plugin sign plugin.json --key my-signing-key.pem
nutria-plugin pack . --output my-workspace-plugin-0.1.0.zip
Or sign during pack:
nutria-plugin pack . --key my-signing-key.pem --output my-workspace-plugin-0.1.0.zip
Configure the Nutria instance to trust your public key:
export NUTRIA_PLUGIN_TRUSTED_KEYS='["-----BEGIN PUBLIC KEY-----\n..."]'
Python API
from nutria_plugin import (
PluginManifest,
load_plugin_bundle,
extract_plugin_bundle,
validate_zip,
scaffold_plugin,
pack_plugin,
validate_plugin_dir,
generate_keypair,
sign_manifest,
verify_manifest,
SignatureStatus,
)
# Parse a manifest
manifest = PluginManifest.from_file(Path("plugin.json"))
# Load from ZIP bytes
manifest = load_plugin_bundle(zip_bytes)
# Extract to disk
manifest = extract_plugin_bundle(zip_bytes, target_dir)
# Sign and verify
private_pem, public_pem = generate_keypair()
sig = sign_manifest(manifest.model_dump(), private_pem)
status = verify_manifest(manifest.model_dump())
assert status == SignatureStatus.VERIFIED
Plugin ZIP format
| Path | Description |
|---|---|
plugin.json |
Manifest (required) |
README.md |
Human-readable description |
connections/*.json |
Connection definitions |
skills/<name>/SKILL.md |
Skill instructions |
context_docs/*.md |
Docs injected into persona prompts |
specs/openapi.json |
OpenAPI spec (for openapi_bridge runtime) |
specs/service.wsdl |
WSDL spec (for soap_bridge runtime) |
hooks/hooks.json |
Declarative hooks |
settings.schema.json |
JSON Schema for configuration |
assets/icon.png |
Plugin icon |
Admin frontend extensions
Plugins can declare host-rendered admin UI extensions through
plugin.json -> admin_extensions.
These extensions are:
- declared in plugin metadata
- rendered by the Nutria host
- safer than shipping arbitrary frontend code
See docs/admin-extensions.md for the full contract.
Admin flows
Plugins can declare host-rendered operator workflows through
plugin.json -> admin_flows. Use this for non-secret interactive setup such as
QR pairing, OAuth/device-code login, or phone-code verification.
See docs/admin-flows.md for the flow contract.
Security rules
- No executable files (
.py,.js,.sh, etc.) allowed in the ZIP. - No hidden files or directories.
- No absolute paths or path traversal in ZIP entries.
- Maximum bundle size: 20 MB.
- Secrets are never stored in the ZIP — they are configured after install.
Runtime types
| Value | Description |
|---|---|
remote_mcp |
Plugin connects to a separately deployed MCP server |
declarative_api |
Plugin uses declarative connection JSON files (no server needed) |
openapi_bridge |
Nutria auto-generates tools from an OpenAPI/Swagger spec |
soap_bridge |
Nutria auto-generates tools from a WSDL/SOAP spec |
License
MIT
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file nutria_plugin-0.0.1.6b0.tar.gz.
File metadata
- Download URL: nutria_plugin-0.0.1.6b0.tar.gz
- Upload date:
- Size: 73.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
58baf6e44a5741f11d2bfec100d33f67b06f299d8a93e5237e6c489390b3f79b
|
|
| MD5 |
96fabdd99d5543a11432b4855a8606e3
|
|
| BLAKE2b-256 |
99dca7e9848087b82a972bf68ee5f98d0a88892a44a699e9e66eb24f9a6495f8
|
Provenance
The following attestation bundles were made for nutria_plugin-0.0.1.6b0.tar.gz:
Publisher:
publish.yml on AlRos14/nutria-plugin-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nutria_plugin-0.0.1.6b0.tar.gz -
Subject digest:
58baf6e44a5741f11d2bfec100d33f67b06f299d8a93e5237e6c489390b3f79b - Sigstore transparency entry: 1474410773
- Sigstore integration time:
-
Permalink:
AlRos14/nutria-plugin-sdk@7ae3f8ce08bdff3cf5b5450757ee6f174b8e346b -
Branch / Tag:
refs/tags/v0.0.1.6b - Owner: https://github.com/AlRos14
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7ae3f8ce08bdff3cf5b5450757ee6f174b8e346b -
Trigger Event:
push
-
Statement type:
File details
Details for the file nutria_plugin-0.0.1.6b0-py3-none-any.whl.
File metadata
- Download URL: nutria_plugin-0.0.1.6b0-py3-none-any.whl
- Upload date:
- Size: 17.0 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
24a11498db93700af2b50a017f42afe62282ac258434db4f85b6457ef7272668
|
|
| MD5 |
e36eca3dd479fd90f5a334db751fb0ee
|
|
| BLAKE2b-256 |
a5e970011d7b49c225d1e11c69dc52345657103253dcc3e4c918688c4a6fac59
|
Provenance
The following attestation bundles were made for nutria_plugin-0.0.1.6b0-py3-none-any.whl:
Publisher:
publish.yml on AlRos14/nutria-plugin-sdk
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
nutria_plugin-0.0.1.6b0-py3-none-any.whl -
Subject digest:
24a11498db93700af2b50a017f42afe62282ac258434db4f85b6457ef7272668 - Sigstore transparency entry: 1474410809
- Sigstore integration time:
-
Permalink:
AlRos14/nutria-plugin-sdk@7ae3f8ce08bdff3cf5b5450757ee6f174b8e346b -
Branch / Tag:
refs/tags/v0.0.1.6b - Owner: https://github.com/AlRos14
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@7ae3f8ce08bdff3cf5b5450757ee6f174b8e346b -
Trigger Event:
push
-
Statement type: