Wiki · Features in depth

Plugins

A plugin is third-party code inside the agent — which is why it never starts by itself. What it can do, how to allow it and how it differs from an MCP server.

✅ Verified 17. 10. 2026Source: official documentation →📋 Copy for your AI
🧩
A plugin is third-party code running inside the agent — which is why it never starts by itself. Hermes discovers and lists plugins, but nothing that adds tools or hooks loads until you explicitly allow it. That is the whole security model, and it is worth knowing before you install anything.

What a plugin is

An ordinary folder in ~/.hermes/plugins/ with a manifest and some Python:

~/.hermes/plugins/my-plugin/ ├── plugin.yaml # name, version, description ├── __init__.py # register(ctx) — what the plugin adds ├── schemas.py # what the model sees (tool schemas) └── tools.py # what actually runs

After startup the plugin's tools appear next to the built-in ones and the model can call them right away. The smallest working plugin is two files — plugin.yaml and __init__.py with a register(ctx) function.

What a plugin can do

CapabilityExample use
Add toolsYour company's API as a tool the model can call
Hook into eventsLog every tool call, warn before a command runs
Add slash commands/my-command in chat and in the gateway
Add CLI commandshermes my-plugin something
Bundle skillsThe plugin ships its own skills as plugin:skill
Add a messaging platformA new chat network beside Telegram and Discord
Image, video, terminal or memory backendA different image model or memory store
Approval transportDangerous-step confirmations delivered somewhere other than chat

Permission: nothing runs on its own

A plugin shows up in the listing once it is on disk, but its tools and hooks do not load until you add its name to plugins.enabled in config.yaml:

plugins: enabled: - my-plugin disabled: # optional deny-list — always wins on conflict - noisy-plugin
hermes plugins # overview and toggles (space to check) hermes plugins enable my-plugin hermes plugins disable my-plugin

Watch the exception: gateway hooks in ~/.hermes/hooks/<name>/ are not plugins and are not gated by the allow-list — they run simply by being placed there. Whoever puts files there gets them executed on every start.

Catalog: install by name

Human-reviewed plugins live in a catalog. Installing by name checks out exactly the commit someone reviewed (a pinned SHA), not a branch tip:

hermes plugins install <catalog-name> hermes plugins enable <name> # installing does not enable it
Catalog fieldWhat it means
tierofficial (maintained by NousResearch) or community
shaThe exact 40-hex commit that was reviewed
capabilitiesWhich tools, hooks and environment variables it declares
requires_hermesMinimum Hermes version the plugin needs

Bundled plugins that ship with Hermes (for example disk-cleanup, security-guidance, google_meet, hermes-achievements) are opt-in as well — enabled the same way as any other. The reason is simple: an update must not silently hand you tools you never asked for.

Timeouts worth knowing

SettingDefaultPurpose
clone_timeout_seconds300 sHow long a git fetch of a plugin may take
load_timeout_seconds10 sLoad limit per plugin; slower ones are skipped with a reason
hook_callback_timeout30 sLimit for Python hooks; a timed-out pre-tool hook blocks the tool

Plugin or MCP server?

PluginMCP server
RunsInside the agent processA separate process the agent connects to
Can touch the agentYes — hooks, approvals, memory, platformsNo — it offers tools only
Best forChanging agent behaviour, wiring internal partsThird-party services and APIs with their own lifecycle
RiskHigher — code shares the processLower — isolated process with its own rights

Our rule of thumb: MCP for external services, a plugin for changing the agent. External tools (search, browser, docs) run as MCP servers because they can be restarted and limited separately.

Things to watch

SituationWhat to do
A plugin goes quiet after hermes updateCheck /plugins and the startup log — it may have hit load_timeout_seconds or a version change
A project ships its own ./.hermes/plugins/Project plugins are off; enable them only for trusted repos with HERMES_ENABLE_PROJECT_PLUGINS=true
A plugin blocks somethingA pre_tool_call hook can deny a tool — look in the plugin, not in permissions
You want to try a plugin safelyCreate a new profile and enable it there; production stays untouched (see the profiles page)

Where next

← Back to the wiki