Hermes Agent

Python agent CLI, desktop app and gateway from Nous Research. The second client here on the mcp Python SDK and the counterpart to fast-agent on it: same library, opposite protocol-era default. Hermes leads with the initialize handshake and probes server/discover only when a server rejects it. One MCP client serves every surface.

At a glance

Registry id hermes-agent
Vendor Nous Research
Category cli
Platforms windows, macos, linux
Licence MIT
Source https://github.com/NousResearch/hermes-agent
Home https://github.com/NousResearch/hermes-agent
Wire names hermes-agent, hermes-probe, hermes
SDK mcp 2.3.0 · declares ==2.3.0 · official Python SDK · unpatched
Prefers 2025-11-25
Speaks 2024-11-05, 2025-03-26, 2025-06-18, 2025-11-25, 2026-07-28
Source last updated 2026-11-09
Last read 2026-11-09
Probed 0.23.0+689.ga9ff979 (see below)

Capabilities

Capability Status Known by At
Transports
  ↳ stdio ● full read 2025-11-25
  ↳ streamableHttp ● full read 2025-11-25
  ↳ sse ● full read 2025-11-25
Authentication
  ↳ oauth ● full read 2025-11-25
  ↳ headers ● full read 2025-11-25
Tools ● full read 2025-11-25
  ↳ listChanged ● full read 2025-11-25
  ↳ result ● full read 2025-11-25
    ↳ content ● full read ⇧ 2025-11-25
    ↳ structuredContent ◐ partial read ⇧ 2025-11-25
    ↳ _meta ◐ partial read ⇧ 2025-11-25
Resources ● full read 2025-11-25
  ↳ listChanged ○ unsupported read 2025-11-25
  ↳ subscribe ○ unsupported read 2025-11-25
Prompts ● full read 2025-11-25
  ↳ listChanged ○ unsupported read 2025-11-25
Completions ○ unsupported read 2025-11-25
Sampling ● full read, declared 2025-11-25
  ↳ tools ◐ partial read, declared 2025-11-25
Elicitation ◐ partial read, declared 2025-11-25
  ↳ form ◐ partial read, declared 2025-11-25
  ↳ url ○ unsupported read, declared 2025-11-25
Roots ○ unsupported read, declared 2025-11-25
Logging ◐ partial read 2025-11-25
Instructions ○ unsupported read 2025-11-25
Icons — not recorded
Tasks ○ unsupported read 2025-11-25
JSON Schema — not recorded
Extensions — not recorded
Beyond the spec
  ↳ modelInitiatedResourceRead ● full read 2025-11-25
  ↳ toolDescriptionScrubbing ◐ partial read 2025-11-25
  ↳ deferredToolLoading ● full read 2025-11-25
  ↳ resultSpillover ● full read 2025-11-25
  ↳ sessionRecovery ● full read 2025-11-25
  ↳ nonMcpEndpointDetection ● full read 2025-11-25
  ↳ eventsExtension ◐ partial read 2025-11-25
  ↳ trustTiers ● full read 2025-11-25
  ↳ declaredToolCosts ● full read 2025-11-25
  ↳ lazyServerStart ● full read 2025-11-25

● full ◐ partial ○ unsupported · untested — not recorded ⇧ rests on the parent capability's evidence

Not recorded means nobody has looked, which is not the same claim as unsupported. Under tools.result, full means the field reaches the model on the default conversational path, partial means it does under a condition the notes name, and unsupported means it never does.

What the table flattens

Verified by the probe

85 records from the live probe (probe/), client version 0.23.0+689.ga9ff979. Each row is one run against the instrumented fixture server with the model mocked; the verdict says which fixture fields reached the model. Glyphs: […] content, {…} structuredContent, ⟨…⟩ the whole envelope, "…" a placeholder. The scenario link opens the record; the raw captures sit next to it. Overlay: data/verified/hermes-agent.json.

Scenario Config Run At Version Verdict
apps.visibility
app_only default http 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
app_only default stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
app_only legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
app_only stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
app_only tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
tools.result._meta
meta_only default http 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text, _meta reached the model)
meta_only default stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text, _meta reached the model)
meta_only legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text, _meta reached the model)
meta_only stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] content only (1x, as text, _meta reached the model)
meta_only tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text, _meta reached the model)
with_meta default http 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text, _meta reached the model)
with_meta default stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text, _meta reached the model)
with_meta legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text, _meta reached the model)
with_meta stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text, _meta reached the model)
with_meta tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text, _meta reached the model)
tools.result.audience
audience_user default http 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
audience_user default stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
audience_user legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
audience_user stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
audience_user tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
tools.result.content
empty_object default http 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_empty_object">\nThe following co"
empty_object default stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_empty_object">\nThe following co"
empty_object legacy stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_empty_object">\nThe following co"
empty_object stateless stdio 2026-07-28 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_empty_object">\nThe following co"
empty_object tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_empty_object">\nThe following co"
large default http 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
large default stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
large legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
large stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] content only (1x, as text)
large tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
no_content_key default http 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_no_content_key">\nThe following "
no_content_key default stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_no_content_key">\nThe following "
no_content_key legacy stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_no_content_key">\nThe following "
no_content_key stateless stdio 2026-07-28 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_no_content_key">\nThe following "
no_content_key tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_no_content_key">\nThe following "
tools.result.isError
is_error default http 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
is_error default stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
is_error legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
is_error stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] content only (1x, as text)
is_error tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
tools.result.media
with_image default http 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
with_image default stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
with_image legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
with_image stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
with_image tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
tools.result.outputSchema
schema_match default http 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
schema_match default stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
schema_match legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
schema_match stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
schema_match tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
schema_mismatch default http 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_schema_mismatch">\nThe following"
schema_mismatch default stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_schema_mismatch">\nThe following"
schema_mismatch legacy stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_schema_mismatch">\nThe following"
schema_mismatch stateless stdio 2026-07-28 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_schema_mismatch">\nThe following"
schema_mismatch tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_schema_mismatch">\nThe following"
tools.result.structuredContent
mirror default http 2025-11-25 0.23.0+689.ga9ff979 payload once (as text)
mirror default stdio 2025-11-25 0.23.0+689.ga9ff979 payload once (as text)
mirror legacy stdio 2025-11-25 0.23.0+689.ga9ff979 payload once (as text)
mirror stateless stdio 2026-07-28 0.23.0+689.ga9ff979 payload once (as text)
mirror tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 payload once (as text)
sc_empty default http 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_empty default stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_empty legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_empty stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_empty tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_null default http 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_null default stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_null legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_null stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_null tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_string default http 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_sc_string">\nThe following conte"
sc_string default stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_sc_string">\nThe following conte"
sc_string legacy stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_sc_string">\nThe following conte"
sc_string stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] content only (1x, as text)
sc_string tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 "…" client error text, no fixture field: "<untrusted_tool_result source="mcp__probe__probe_sc_string">\nThe following conte"
structured_only default http 2025-11-25 0.23.0+689.ga9ff979 {…} structuredContent only (1x, as text)
structured_only default stdio 2025-11-25 0.23.0+689.ga9ff979 {…} structuredContent only (1x, as text)
structured_only legacy stdio 2025-11-25 0.23.0+689.ga9ff979 {…} structuredContent only (1x, as text)
structured_only stateless stdio 2026-07-28 0.23.0+689.ga9ff979 {…} structuredContent only (1x, as text)
structured_only tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 {…} structuredContent only (1x, as text)
summary_and_data default http 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
summary_and_data default stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
summary_and_data legacy stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
summary_and_data stateless stdio 2026-07-28 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)
summary_and_data tool-search-off stdio 2025-11-25 0.23.0+689.ga9ff979 […] and {…} (content 1x, structuredContent 1x, as text)

Where the evidence disagrees

Research notes

Provenance

Read at 9dcf7714 on 2026-11-09, from main of https://github.com/NousResearch/hermes-agent.git. That commit was authored 2026-11-09.

SDK. mcp==2.3.0 exactly, resolving to 2.3.0 in uv.lock alongside mcp-types 2.3.0, with no [tool.uv] source override and no vendored fork. Unlike every other client read here, the SDK is not a base dependency. It is declared identically under the mcp and computer-use extras and the dev dependency group. The runtime lazy install the August read found is gone: tools/lazy_deps.py is now a retired shim, and install repair syncs the mcp extra when mcp_servers is configured and the SDK is missing. The import is deferred behind _ensure_mcp_sdk, so a session with no MCP servers configured never pays for it. Every version decision on the live path is the SDK's: Hermes names no revision of its own and picks an era instead. The revisions it names itself are 2025-03-26, in a fallback constant and the non-MCP-endpoint probe frame, and 2025-06-18, in the desktop-app liveness probe.

Paths read:

Source is not vendored. To reproduce any claim above, check out that commit in the client's repository.


Generated from data/clients.json, data/verified/hermes-agent.json by scripts/build-cards.js. Edit the registry, rerun the probe or the ingest, not this file.