hermes-agent/website/docs/reference
Teknium c8369e37f4 feat(mcp): trust-tier gating for write-capable MCP tools via readOnlyHint
Adds a per-server `trust: full|untrusted` config key
(mcp_servers.<name>.trust). On an untrusted server, every write-capable
tool call — any tool whose discovery-time annotations do not carry
readOnlyHint=True — routes through the existing approval surface
(tools.approval.request_elicitation_consent, same lazy-import +
surface-routing pattern the MCP elicitation handler uses) before the RPC
fires. Denied/cancelled/errored approvals fail closed: the RPC never
runs, including the lazy first-use server spawn.

Design points:
- Classification happens at CALL TIME from metadata captured at
  DISCOVERY (_record_tool_trust_metadata in _register_server_tools and
  the lazy cache-registration path). No toolset/schema mutation, so the
  toolset stays byte-stable and prompt caching is preserved.
- readOnlyHint is a server-supplied HINT: on an untrusted server a lying
  server can at most skip approval for tools it claims read-only — it
  can never widen access. Trust tiering itself is operator config.
- Missing/malformed annotations => write-capable (fail closed).
- Unrecognized trust values => untrusted (fail closed); missing key =>
  full (backward compatible, documented in mcp-config-reference).
- The schema cache now persists readOnlyHint so lazy-registered servers
  gate identically on next startup without spawning.

Tests: tests/tools/test_mcp_trust_gating.py (11 tests, TDD red->green):
approval invoked + accept proceeds, deny/cancel blocks RPC, readOnlyHint
=true skips gate, trusted/unconfigured servers skip gate, explicit
readOnlyHint=false gated, approval exception fails closed, trust
normalization, discovery-time capture (SDK objects and cached dicts).

Ported from: cloudflare-os classifyTool() (Apache-2.0), corroborated by
Claude Cowork (idea-level).
2026-08-07 08:58:32 -07:00
..
_category_.json feat: add documentation website (Docusaurus) 2026-03-05 05:24:55 -08:00
automation-blueprints-catalog.mdx docs: finish Automation Blueprints terminology rebrand (#44470) 2026-06-11 17:22:22 -04:00
cli-commands.md docs: four small accuracy fixes 2026-08-05 21:33:44 +05:30
environment-variables.md fix(gateway): configure turn lease timeout via yaml 2026-08-07 18:23:57 +05:30
faq.md docs: warn against pointing two agents at one Hermes home (memory, profiles, FAQ) 2026-08-05 21:33:44 +05:30
mcp-config-reference.md feat(mcp): trust-tier gating for write-capable MCP tools via readOnlyHint 2026-08-07 08:58:32 -07:00
model-catalog.md feat(model-switch): excluded_providers config to hide providers from /model picker 2026-07-20 03:06:02 -07:00
optional-skills-catalog.md refactor(skills): move polymarket to optional-skills/finance 2026-08-06 11:30:58 -07:00
profile-commands.md docs: accuracy sweep + coverage for 2 months of shipped features 2026-07-29 08:48:05 -07:00
skills-catalog.md refactor(skills): move polymarket to optional-skills/finance 2026-08-06 11:30:58 -07:00
slash-commands.md feat: /refine — run the memory/skill self-improvement review on demand 2026-08-05 22:40:51 -07:00
tools-reference.md docs(reference): document the desktop_ui toolset 2026-08-06 19:35:47 -06:00
toolsets-reference.md docs(reference): document the desktop_ui toolset 2026-08-06 19:35:47 -06:00