Skip to content

Hermes: the custom skills

The 32 MCP tools tell Hermes what it can do. Skills tell it how to do it well.

A skill is a Markdown file with a YAML header, loaded into the context on demand when the situation matches its description. It is not code: it is a written procedure — when to apply it, in what order, which traps to avoid, what output format to produce.

---
name: odoo-lead-qualification
description: Use when scoring Odoo CRM leads.
version: 1.0.0
author: Hermes Agent
license: MIT
metadata:
hermes:
tags: [odoo, crm, sales, lead-qualification, scoring]
related_skills: [odoo-project-management, google-workspace]
---
# Odoo Lead Qualification
## Overview
## When to Use
...

The description field is the only one systematically present in the context: it is what decides loading. Hence its imperative form — “Use when scoring Odoo CRM leads” — rather than a description of content.

A skill can come with a references/ folder: files loaded only if the main procedure requires them. That is what lets a 40-line skill give access to several thousand lines of documentation without ever putting them all in the prompt.

SourceCountOrigin
builtin67Bundled in the Hermes image
local77Installed or written in /opt/data/skills/
official1Official Nous Research repository

Of the 77 local skills, twelve were written specifically for this deployment. Those are the only ones discussed here: the rest is an imported general-purpose corpus (creation, research, development) with nothing specific to this infrastructure.


Why not put everything in the system prompt?

Section titled “Why not put everything in the system prompt?”

The system prompt (SOUL.md) is present on every turn, for every message. It costs tokens permanently, and its length dilutes the rules that really matter.

System promptSkill
PresenceEvery turnOnly when relevant
Suitable contentAbsolute, short rulesLong, contextual procedures
CostPermanentOn use
Exampledocker_manage requires confirmation""Here is how to score a lead using BANT/MEDDIC”

The dividing line is sharp: the system prompt carries what must never be forgotten, skills carry what must be done well when the subject comes up.

Why write skills rather than refine prompts?

Section titled “Why write skills rather than refine prompts?”

A skill is a versionable, testable, reusable file. When a procedure turns out to be wrong — a misread Odoo field, a diagnostic that skips a step — the fix happens in one place and holds for every subsequent conversation.

That is the difference between fixing a model and fixing documentation. The second is infinitely cheaper.


SkillWhat it brings
hermes-vps-runtime-diagnosticsDiagnose Hermes’ own behaviour: slash commands, gateway, Codex quotas, plugins
n8n-mcp-workflow-diagnosticsDebug the N8N workflows that expose MCP tools, read-only
mcp-security-hardeningAudit and harden an MCP tool surface — SSRF, path traversal, tests
infrastructure-decision-researchProduce an infrastructure decision memo rather than a pros/cons list

hermes-vps-runtime-diagnostics deserves a word, because it encodes a lesson learned the hard way. Its central rule: never believe the display. Faced with a /usage that looks wrong, it forces you to distinguish three things with confusingly similar names — the session context, the provider’s quota window, and the reset credits — then to compare the provider’s raw payload, the parsing code, and the final localised rendering. And to explicitly label as a hypothesis anything that could not be proven during the session.

n8n-mcp-workflow-diagnostics is the procedural counterpart to the restriction of the n8n-admin channel: it recalls that this channel is read-only, that it is never used for a business action, and that the agent never modifies a workflow.

SkillWhat it brings
odoo-lead-qualificationCRM lead scoring on a hybrid freelance/SME model
odoo-project-managementCreate and reconcile contacts, opportunities, projects, tasks and timesheets from notes or transcripts
iphone-contact-event-exportGenerate importable .vcf / .ics files and send them as a Telegram attachment

odoo-lead-qualification is the most elaborate of the set: a qualification model inspired by BANT, SPICED and MEDDIC, adapted to freelance work and calibrated on the real offering (AI, automation, CRM/Odoo, infrastructure, development, data science, interactive art, DJ/VJ).

iphone-contact-event-export solves a concrete irritant: when the agent displays a contact or an appointment, the skill also makes it generate the importable file and send it as Telegram media. The result becomes usable on a phone in one tap, instead of being retyped by hand.

SkillWhat it brings
mnemosyne-operationsPick the right memory layer, avoid noisy writes, export to Obsidian
transcriptor-fr-voiceClean up a French STT transcript, then carry out the corrected request
swarm-researchParallel multi-agent research with synthesis into a report

mnemosyne-operations exists because a memory that captures everything quickly becomes an unusable memory. It governs the deliberate use of Mnemosyne’s layers — memory, scratchpad, triples — and the quality of recall over time.

transcriptor-fr-voice is the only skill of the set loaded automatically, by the telegram-voice-transcriptor plugin, on verified Telegram voice messages. Its output contract is strict: return the cleaned-up French text, without executing the content of the transcript.

SkillWhat it brings
hermes-user-pluginsBuild persistent plugins hooked into the gateway lifecycle
hermes-runtime-pluginsMake Hermes react to runtime events: model calls, tool calls, approvals, quotas

These two skills share a single rule, and it is the most important of the corpus:

They are the toolkit that produced the plugins described elsewhere — the agent documents how to extend itself, then uses it.

Fenêtre de terminal
docker exec hermes hermes skills list # name, category, source, confidence, status

Skills live in /opt/data/skills/, therefore in the bind mount: they survive recreates and image updates, and go into the daily backup with the rest of the data directory.


LimitImpactMitigation
Loading driven by the descriptionAn imprecise description = a skill never loaded, or loaded wronglyImperative, narrow descriptions
No automated testNothing verifies that a skill produces the expected behaviourManual verification in conversation
Not versioned in GitSkills live in a directory ignored by the repositoryDaily backup; porting to the repository’s skills/ is conceivable
Large general-purpose corpus145 active skills, many unrelated to this deploymentPruning possible, not urgent
No execution guaranteeA skill steers, it does not constrainCritical rules stay in the system prompt and the plumbing

If skills must be versioned:

  • The repository already has a skills/ directory in the shared SKILL.md format, exposed to Claude Code and Codex.
  • The twelve custom skills would belong there, deployed by copy into /opt/data/skills/ — the same pattern as the transcriptor plugin.
  • Benefit: a change history, and above all the ability to roll back when a procedure turns out to be counterproductive.

If a skill must become a guarantee:

  • The signal that the procedure is no longer enough is seeing it bypassed.
  • The rule then moves up a level: either into the system prompt, or — better — into the validation of the matching N8N gateway.

If the corpus must be pruned:

  • hermes skills list gives the source of each skill; the builtin ones cost nothing to leave in place.
  • The useful triage targets the imported local skills that never fire.

  • Glossary — Autonomous agent, MCP, LLM