Plugin System β Endless Extensions
Plugin System β Endless Extensions β easy-to-understand guide based on official docs (updated 2026-08-09)
Think of plugins like phone apps for your AI assistant β you donβt rebuild the phone to get a new camera filter; you just install an app. Hermes works the same way: drop in a folder, restart, and your AI gains new powers instantly.
What Is a Plugin, Really?
A plugin is a small package of files that tells Hermes, βHey, I have a new tool for you to use.β You donβt need to touch the core code. Itβs perfect for adding custom tools for yourself, your team, or a single project.
The Magic Folder
All your plugins live in one place:
~/.hermes/plugins/
Inside that folder, each plugin gets its own subfolder. Hereβs the structure:
~/.hermes/plugins/my-plugin/
βββ plugin.yaml # manifest (name, version, description)
βββ __init__.py # register() β wires everything together
βββ schemas.py # tool schemas (what the AI sees)
βββ tools.py # tool handlers (what runs when called)
Your First Plugin in 3 Steps
Letβs build a hello_world tool. Itβs simpler than it looks.
Step 1: Create the manifest β plugin.yaml
name: hello-world
version: "1.0"
description: A minimal example plugin
Step 2: Write the logic β __init__.py
import json
def register(ctx):
# Define what the AI sees
schema = {
"name": "hello_world",
"description": "Returns a friendly greeting for the given name.",
"parameters": {
"type": "object",
"properties": {
"name": {"type": "string", "description": "Name to greet"}
},
"required": ["name"],
},
}
# Define what actually runs
def handle_hello(params, **kwargs):
name = params.get("name", "World")
return json.dumps({"success": True, "greeting": f"Hello, {name}!"})
# Register the tool
ctx.register_tool(name="hello_world", toolset="hello_world",
schema=schema, handler=handle_hello)
Step 3: Drop it in and restart
Put both files in ~/.hermes/plugins/hello-world/, restart Hermes, and your AI can call hello_world immediately.
What Else Can Plugins Do?
The register(ctx) function gives you superpowers:
| Capability | How |
|---|---|
| Add tools | ctx.register_tool(...) |
| Add hooks | ctx.register_hook("post_tool_call", callback) |
| Add slash commands | ctx.register_command(name, handler, description) |
For example, you can log every tool call with a hook:
def on_tool_call(tool_name, params, result):
print(f"[hello-world] tool called: {tool_name}")
ctx.register_hook("post_tool_call", on_tool_call)
A Word of Caution
Project-local plugins (in ./.hermes/plugins/) are disabled by default for safety. Only enable them for trusted repositories by setting:
export HERMES_ENABLE_PROJECT_PLUGINS=true
Summary & Pro Tip
Plugins let you extend Hermes without touching core code β just a folder, a manifest, and a Python file. Start with the hello_world example, then replace the greeting logic with your own API calls or database queries.
Practical tip: Always keep your schema description clear and specific. The AI reads that text to decide when to use your tool β write it like youβre explaining it to a smart friend whoβs never seen it before.
π Official Docs
This article is based on the official Hermes Agent documentation:Official docs βΊ user-guide/features/plugins