Skip to main content

EthisysCore Plugin SDK for Python — build container-hosted plugins

Project description

EthisysCore Python Plugin SDK

ethisyscore-plugin-sdk — Build container-mode plugins with Python 3.11+.

Container plugins run as isolated Docker containers with Dapr sidecars, communicating with the EthisysCore platform via HTTP. Built on FastAPI and Pydantic.

Installation

pip install ethisyscore-plugin-sdk

Quick Start

from ethisyscore_plugin_sdk import (
    PluginBase, PluginHost, PluginManifest, McpToolDefinition,
    ToolResult, PluginContext,
)

class GreeterPlugin(PluginBase):
    @property
    def manifest(self) -> PluginManifest:
        return PluginManifest(
            id="11111111-1111-1111-1111-111111111111",
            name="Greeter Plugin",
            version="1.0.0",
            type="TENANT_APP",
            owner="acme-corp",
            compatible_core_version=">=1.0.0",
            mcp_version="1.0",
            execution_mode="Container",
            mcp_tools=[
                McpToolDefinition(
                    name="greet",
                    description="Say hello",
                    input_schema_json='{"type":"object","properties":{"name":{"type":"string"}},"required":["name"]}'
                )
            ],
        )

    async def on_invoke_tool(self, tool_name: str, args: dict, context: PluginContext) -> ToolResult:
        if tool_name == "greet":
            name = args.get("name", "World")
            return ToolResult(success=True, result_json=f'{{"greeting": "Hello, {name}!"}}')
        return ToolResult(success=False, error=f"Unknown tool: {tool_name}")

if __name__ == "__main__":
    PluginHost(GreeterPlugin()).start()

PluginManifest.id, dependency feature_id, and runtime identity fields (extension_id, organisation_id, tenant_id) are UUID strings. UI contribution IDs remain regular logical strings.

Lifecycle Hooks

All hooks are optional — override only what you need:

async def on_initialize(self, context: PluginContext) -> None     # After platform connects
async def on_enable(self, context: PluginContext) -> None         # Extension enabled for tenant
async def on_disable(self, context: PluginContext) -> None        # Extension disabled
async def on_get_resource(self, uri: str, context: PluginContext) -> ResourceResult
async def on_check_health(self) -> HealthResult                   # Health probe

Platform Services

Available through PluginContext:

# Key-value persistence (per plugin per tenant)
count = (await context.data_store.get("counter")) or 0
await context.data_store.set("counter", count + 1)

# Structured logging (synchronous — no await needed)
context.logger.info("Processing request")
context.logger.error("Something failed")

# Invoke tools from other plugins
result = await context.mcp_client.invoke_tool("other-tool", '{"key": "value"}')

# Publish domain events
await context.publish_event("ItemCreated", {"id": "123"})

Reference Data

Container plugins can consume host-provided reference data through context.reference_data:

employees = await context.reference_data.list("hr", "employees")
employee = await context.reference_data.get("hr", "employees", "e-123")

Type Safety

Protocol-based typing for IDE autocompletion:

  • PluginDataStoreProtocolget(), set(), delete(), exists(), list_keys(), query()
  • PluginLoggerProtocolinfo(), warning(), error(), debug()
  • McpClientProtocolinvoke_tool(tool_name, arguments_json), list_tools(), get_resource(), list_resources()

Manifest fields accept both snake_case and camelCase (Pydantic populate_by_name).

HTTP Endpoints

PluginHost starts a Uvicorn/FastAPI server (port: DAPR_APP_PORT or 8080):

Endpoint Method Purpose
/plugin/initialize POST Platform connects, provides context
/plugin/enable POST Extension enabled for tenant
/plugin/disable POST Extension disabled
/plugin/invoke-tool POST MCP tool invocation
/plugin/get-resource POST MCP resource read
/plugin/health GET Health probe
/plugin/heartbeat GET Liveness check

Environment Variables

Variable Purpose Default
DAPR_APP_PORT Port the plugin listens on 8080
DAPR_HTTP_PORT Dapr sidecar HTTP port 3500
DAPR_API_TOKEN Dapr sidecar auth token

v1 Limitations

Compared to the .NET SDK:

  • Monolithic dispatch — all tools route through on_invoke_tool() (no handler-per-tool classes)
  • No middleware pipeline — no built-in error handling, logging, or validation middleware
  • No DI container — plugins manage their own dependencies

Handler-per-tool, middleware, and DI are planned for v2.

Development

pip install -e ".[dev]"
pytest

Dependencies: fastapi>=0.115.0, uvicorn[standard]>=0.32.0, httpx>=0.27.0, pydantic>=2.10.0

Project details


Release history Release notifications | RSS feed

This version

1.4.0

Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

ethisyscore_plugin_sdk-1.4.0.tar.gz (24.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

ethisyscore_plugin_sdk-1.4.0-py3-none-any.whl (22.9 kB view details)

Uploaded Python 3

File details

Details for the file ethisyscore_plugin_sdk-1.4.0.tar.gz.

File metadata

  • Download URL: ethisyscore_plugin_sdk-1.4.0.tar.gz
  • Upload date:
  • Size: 24.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? Yes
  • Uploaded via: twine/6.1.0 CPython/3.13.13

File hashes

Hashes for ethisyscore_plugin_sdk-1.4.0.tar.gz
Algorithm Hash digest
SHA256 32e1507683c874becab77ede09c90586fa287fd8e54bf5b757c20c80c919fc03
MD5 61c9fd8831e4e01190e6d64efeb1c665
BLAKE2b-256 9cb558fba05619e25df52cd841d177ede58997ebe8b0893eef84dbc7f79a444f

See more details on using hashes here.

Provenance

The following attestation bundles were made for ethisyscore_plugin_sdk-1.4.0.tar.gz:

Publisher: release.yml on ethisysltd/ethisyscore-plugin-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

File details

Details for the file ethisyscore_plugin_sdk-1.4.0-py3-none-any.whl.

File metadata

File hashes

Hashes for ethisyscore_plugin_sdk-1.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 c79301c1e8d55ceda3c3f776ef22a5bb3c1426a114ca39fbebc2b7c415b086eb
MD5 878ed4a6ef4164d62a59bbfbdbf2ee6f
BLAKE2b-256 6ed2225c08dd93f423dc7caa406ddb21c73e4b73217332f1fbd6dfed70e38435

See more details on using hashes here.

Provenance

The following attestation bundles were made for ethisyscore_plugin_sdk-1.4.0-py3-none-any.whl:

Publisher: release.yml on ethisysltd/ethisyscore-plugin-sdk

Attestations: Values shown here reflect the state when the release was signed and may no longer be current.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page