Features Overview β Everything Hermes Can Do
Features Overview β Everything Hermes Can Do β easy-to-understand guide based on official docs (updated 2026-08-09)
Think of Hermes like a well-organized toolbox that grows with you β you start with the essentials, and whenever you need a new tool, you just build it and drop it in.
The Plugin System: Your Custom Toolbox
Hermes has a brilliant plugin system that lets you add custom tools, hooks, and integrations without touching the core code. This is perfect for personal projects, team workflows, or just experimenting.
How It Works in 30 Seconds
Create a folder in ~/.hermes/plugins/ with a simple structure:
~/.hermes/plugins/my-plugin/
βββ plugin.yaml # manifest (name, version)
βββ __init__.py # register() β connects everything
βββ schemas.py # what the AI model sees
βββ tools.py # what actually runs
Start Hermes, and your tools appear right alongside the built-in ones. The model can call them immediately β no extra setup.
A Real Example: Hello World Plugin
Hereβs a complete plugin that adds a hello_world tool and logs every tool call:
~/.hermes/plugins/hello-world/plugin.yaml
name: hello-world
version: "1.0"
description: A minimal example plugin
~/.hermes/plugins/hello-world/__init__.py
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 f'{{"success": true, "greeting": "Hello, {name}!"}}'
# Register the tool
ctx.register_tool(
name="hello_world",
toolset="hello_world",
schema=schema,
handler=handle_hello,
)
# Add a hook to log every tool call
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)
Drop both files into ~/.hermes/plugins/hello-world/, restart Hermes, and youβre done. The model can call hello_world right away, and the hook prints a log line after every tool invocation.
What Plugins Can Do
Hereβs the full menu of capabilities available in your register(ctx) function:
| Capability | How |
|---|---|
| Add tools | ctx.register_tool(name=..., toolset=..., schema=..., handler=...) |
| Add hooks | ctx.register_hook("post_tool_call", callback) |
| Add slash commands | ctx.register_command(name, handler, description) β adds /name in CLI |
Important Notes for Beginners
- Description placement matters: Put the model-facing description in
schema["description"]. The optionalctx.register_tool(description=...)is just registry metadata β it defaults to the schema description, but wonβt override a missing one. Keep them in sync if you use both. - Project plugins are off by default: Plugins in
./.hermes/plugins/are disabled unless you setHERMES_ENABLE_PROJECT_PLUGINS=truebefore starting Hermes. This is a safety feature β only enable for trusted repositories.
Summary & Practical Tip
Hermesβs plugin system is your superpower: build once, reuse forever, and never worry about breaking the core. Start with a tiny plugin (like hello_world) to understand the flow, then expand to real tools your team needs.
Practical tip: Always test your plugin in a sandbox project first, and keep your schema descriptions crystal clear β the AI model relies entirely on them to decide when to use your tools.
π Official Docs
This article is based on the official Hermes Agent documentation:Official docs βΊ user-guide/features/plugins