πŸ€–HermesBlog
Hermes Feature Guides Β· Part 18/9/2026

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 optional ctx.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 set HERMES_ENABLE_PROJECT_PLUGINS=true before 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