Hermes Toolkit MCP
A safety-first MCP operations cockpit for Hermes Agent installations, exposing typed, evidence-producing management primitives.
README
Hermes Toolkit MCP
Hermes Toolkit MCP is a safety-first MCP operations cockpit for Hermes Agent installations. It exposes typed, evidence-producing management primitives rather than a generic proxy for every Hermes tool or an untyped “ask Hermes” bridge.
Experimental: the no-config default exposes the owner-tier surface for local development. Review the policy model and configure
policy.mode: read_onlyor narrower feature gates before connecting it to an installation you care about.
The project is maintained on a best-effort basis. See CONTRIBUTING.md for development guidance and SECURITY.md for private vulnerability reporting.
Framework decision
The package uses the official Python mcp SDK as the protocol baseline (mcp>=1.9,<2). The stdio server keeps stdout reserved for MCP protocol frames; diagnostics belong on stderr or in bounded artifacts. FastMCP is intentionally not used in this vertical slice because the plan calls for explicit control over policy gates, result envelopes, artifact receipts, and stdout/stderr behavior.
Implemented MCP tools
| Tier | Tools |
|---|---|
| M1 read-only | hermes_status_overview, hermes_detect_install, hermes_toolkit_info, hermes_profiles_list, hermes_config_summary |
| M2a API docs | hermes_api_docs_list, hermes_api_docs_read, hermes_kanban_api_docs_list, hermes_kanban_api_docs_read |
| M2c Hermes API metadata | hermes_api_models_list, hermes_api_capabilities_get, hermes_api_health, hermes_api_health_detailed, hermes_api_skills_list, hermes_api_toolsets_list |
| M2c Hermes API calls | hermes_api_chat_completions, hermes_api_responses_create, hermes_api_responses_get, hermes_api_responses_delete, hermes_api_runs_start, hermes_api_runs_get, hermes_api_runs_events, hermes_api_runs_stop, hermes_api_runs_approval, hermes_api_jobs_list, hermes_api_jobs_create, hermes_api_jobs_get, hermes_api_jobs_update, hermes_api_jobs_delete, hermes_api_jobs_pause, hermes_api_jobs_resume, hermes_api_jobs_run |
| M2c Kanban API metadata | hermes_kanban_board_get, hermes_kanban_task_get, hermes_kanban_workers_active, hermes_kanban_run_get, hermes_kanban_run_inspect, hermes_kanban_profiles_list, hermes_kanban_orchestration_get, hermes_kanban_config_get |
| M2c Kanban API calls | hermes_kanban_task_create, hermes_kanban_task_update, hermes_kanban_tasks_bulk_update, hermes_kanban_task_comment_create, hermes_kanban_link_create, hermes_kanban_link_delete, hermes_kanban_task_specify, hermes_kanban_task_decompose, hermes_kanban_profile_update, hermes_kanban_orchestration_update, hermes_kanban_dispatch_nudge |
| M2d smoke / M3 eval / M4-M5 diagnostics | hermes_api_smoke, hermes_eval_suites_list, hermes_eval_run, hermes_eval_start, hermes_job_status, hermes_job_cancel, hermes_deploy_guard_check, hermes_config_compare_surfaces, hermes_deploy_repair_plan, hermes_gateway_status, hermes_log_tail |
| M6 skill workflow | hermes_skills_list, hermes_skill_read, hermes_skill_eval_start, hermes_skill_patch_proposal |
| M7 fallback | hermes_agent_ask_fallback |
| M8 mutation | hermes_skill_patch_apply, hermes_config_patch_apply, hermes_gateway_restart, hermes_deploy_repair_apply |
Goals
- Provide a curated MCP server for Hermes management and diagnostics.
- Treat this package as experimental local tooling: the no-config default exposes all implemented feature tiers, while operators can set
policy.mode: read_onlyor lower gates explicitly for conservative deployments. - Model policy tiers, tool metadata, redaction, path containment, API route-table controls, and artifact receipts before live calls.
- Produce structured evidence and private artifacts for non-trivial operations.
- Prefer typed wrappers and documented route tables over generic fallback tools.
- Keep
hermes_agent_ask_fallbackvisibly last resort: it is optional, gated byapi_callpolicy plus live/model/tool/external-side-effect gates, and should never be the primary workflow.
Non-goals and default denials for M1/M2a/M2b/M2c/M2d/M3/M4/M5/M6/M7/M8
- No user-facing raw Hermes API fallback MCP tool is provided; M2b only adds the reusable internal client/route-table substrate and M2c exposes the first typed API wrapper.
- No global nullable-schema rewrite or compatibility normalizer is implemented; the consuming client's schema-adapter defect remains a vendor/external-lane issue unless explicitly fixed in an editable client repository and accepted by review.
- No network refresh is performed during normal API docs tool or resource calls; M2a uses a bundled snapshot of the official API server docs.
- No non-loopback chat-completions smoke is enabled by policy alone; M2c targets mocked/local loopback endpoints unless the operator separately enables the non-local opt-in env var.
- No live eval run happens merely because tools are visible; M3 permits dry/structural suites without model calls and requires
live_eval=trueplusHERMES_TOOLKIT_MCP_ALLOW_LIVE_EVAL=1for non-dry suites. - No deploy repair is applied by the M4/M5 guard tools: they do not fetch, switch branches, merge, restart services, write config, or mutate live checkouts.
- No skill write is applied by the M6 skill workflow tools: reads are bounded, eval start only writes eval artifacts, and patch proposals write proposal artifacts only.
- The MCP server does not implicitly migrate launchers or credential sources, publish packages, push repositories, or post public issues; those remain explicit operator actions outside its typed tool calls.
- M8 mutation tools are visible in the experimental default surface, but each apply path still requires exact-scope hashes, a confirmation nonce, private backups/receipts, and configured command hashes for owner actions.
- No package publication, git push/merge/rewrite, third-party tracker write, or unconfigured service mutation is performed implicitly.
- No generic “all Hermes tools” proxy is provided.
- No
hermes_api_request_fallbacktool is exposed; route-table raw fallback remains denied until every route has explicit risk classification and denial tests. - No unrestricted shell/file bridge is exposed.
- No secrets or raw environment values are printed.
Package layout
M1 contains bootstrap/safety primitives plus the first read-only MCP discovery tools:
config.py— typed YAML/env-loaded configuration model.policy.py— canonical policy lattice and per-tool metadata decisions.redaction.py— central redaction primitives.paths.py— path containment and symlink escape checks.artifacts.py— private artifact writer and manifest schema.api_client.py— M2b fail-closed Hermes API route table, typed-wrapper authorization,httpxclient, and redacted request/result/response receipts.chat_completions.py— M2c typedhermes_api_chat_completionsrequest validation and mocked/local API wrapper.evals.py— M3 eval-suite listing, dry/live gate enforcement, synchronous/asynchronous eval jobs, and request/result/summary/stdout/stderr/report artifacts.diagnostics.py— M4/M5 read-only deploy guard, config comparison, gateway status/log tail diagnostics, proposal-only repair plans, and gated API smoke.skills.py— M6 skill list/read/eval-start wrappers, linked-file containment, and proposal-only skill patch artifacts.mutations.py— M8 gated mutation apply tools for exact-scope skill/config patches, configured gateway restarts, and configured deploy repair commands.discovery.py— read-only Hermes/toolkit/profile/config discovery helpers.api_docs.pyandsnapshots/hermes-api-server.md— bundled official API server docs index, resources, source provenance, and planned wrapper mapping.server.py— official SDK stdio MCP server with registration-time and call-time policy enforcement.docs/tool-contracts.md— MCP tool/resource contracts and safety metadata.
Quick start
uv run hermes-toolkit-mcp --help
uv run hermes-toolkit-mcp --config examples/read-only.yaml config-check --json
npx --yes mcporter list --stdio "uv run hermes-toolkit-mcp" --schema --json
npx --yes mcporter call --stdio "uv run hermes-toolkit-mcp" --output json hermes_detect_install
uv run pytest
Running uv run hermes-toolkit-mcp with no subcommand starts the stdio MCP server. Use --help or config-check for terminal-friendly output.
M1 read-only tools
hermes_status_overviewhermes_detect_installhermes_toolkit_info(reports degraded verdict/warnings when eval paths are denied or missing)hermes_profiles_listhermes_config_summary
All five tools register with read-only/idempotent MCP annotations, min_tier=read_only, no live-call/model-spend/agent-tool/external-side-effect flags, and no mutation/destructive flags. The same policy metadata is checked at registration time and call time.
M2a API docs resources and tools
M2a adds the documentation half of the Hermes API track without making live API, model, tool, or network calls during normal MCP operations:
hermes_api_docs_list— lists bundledhermes-docs://api-server/*resources, section slugs, snapshot provenance, and planned API wrapper mapping.hermes_api_docs_read— reads one bundled section by slug or resource URI; defaults to the full snapshot.- MCP resources under
hermes-docs://api-server/*, includingfull,overview, endpoint sections such aspost-v1-chat-completions, and operational sections such asauthenticationandconfiguration.
The snapshot is curated from the official source URL https://hermes-agent.nousresearch.com/docs/user-guide/features/api-server, records snapshot timestamp/version metadata, and replaces example credential-looking values with placeholders. These docs surfaces register at min_tier=api_docs, remain read-only/idempotent, and are intentionally separate from future prompt-bearing API wrappers.
M2b API route table and client substrate
M2b adds the internal client substrate required before any raw-ish Hermes API fallback can exist. It does not expose a generic API proxy MCP tool. The reusable HermesApiClient wraps httpx behind a fail-closed route table that records method, path pattern, risk flags, minimum policy tier, typed wrapper name, per-route body limits, allowed caller-supplied headers, and fallback permission.
Calls are allowed only when the route is known, the configured policy tier is sufficient, allow_live_api_calls is enabled, and the caller names the matching typed wrapper. Unknown /v1/* routes, explicit unsafe/unwrapped endpoints such as /api/sessions/{id}/chat, raw fallback attempts, arbitrary headers, redirects, non-JSON responses, and oversized bodies fail closed with stable safe error codes.
When a configured API-key environment variable is present, the client adds bearer auth to the outbound request but receipts record only the env-var name and presence boolean. Request/result/response receipt artifacts include hashes, byte counts, bounded redacted previews, route metadata, status/content-type metadata, and never the raw bearer value.
M2c typed Hermes API wrappers
M2c exposes the first prompt-bearing typed API wrapper (hermes_api_chat_completions) plus read-only metadata wrappers for the Hermes API server surface. All API wrappers route through the fail-closed HermesApiClient and write redacted request/result/response receipts.
hermes_api_chat_completions— OpenAI-compatiblePOST /v1/chat/completionswith bounded messages,stream=false, and mocked/local-first non-loopback opt-in.hermes_api_responses_create/hermes_api_responses_get/hermes_api_responses_delete— typed OpenAI Responses API wrappers.hermes_api_runs_start/hermes_api_runs_get/hermes_api_runs_events/hermes_api_runs_stop/hermes_api_runs_approval— typed Runs API wrappers.hermes_api_jobs_list/hermes_api_jobs_create/hermes_api_jobs_get/hermes_api_jobs_update/hermes_api_jobs_delete/hermes_api_jobs_pause/hermes_api_jobs_resume/hermes_api_jobs_run— typed scheduler/cron job wrappers.hermes_api_jobs_listuses concretelimit=25/offset=0defaults, omits prompt bodies from summaries (usehermes_api_jobs_getfor the full definition), records upstream body bytes/hash in receipts, and returns pagination fields plus a 24 KiB item budget/32 KiB final-envelope budget.hermes_api_skills_list—GET /v1/skillsreturning structured skill metadata with optional category/limit/offset filters.hermes_api_toolsets_list—GET /v1/toolsetsreturning structured toolset metadata with optional category/limit/offset filters.hermes_api_models_list,hermes_api_capabilities_get,hermes_api_health,hermes_api_health_detailed— read-only server metadata.
State-changing wrappers register at min_tier=api_call and require the live, model-spend (where applicable), agent-tool, and external-side-effect gates. Read-only metadata wrappers register at min_tier=api_metadata and require live and external-side-effect gates. The experimental no-config default enables those gates; conservative deployments can lower policy.mode or individual gates.
hermes_api_skills_list and hermes_api_toolsets_list are typed GET wrappers. They accept optional category, limit, and offset parameters and are listed in the bundled API docs skills-and-toolsets-discovery section as implemented_typed_wrapper.
M2d protocol smoke, denials, and fallback guardrails
M2d completes the protocol/safety validation layer around the M2 API surfaces:
mcporter list --stdio "uv run hermes-toolkit-mcp" --schema --jsonis the protocol smoke for tool/resource discovery; stdout remains reserved for MCP/JSON protocol output while diagnostics stay off stdout.- The expected API-wrapper sequence reads the bundled docs resource first, for example
hermes-docs://api-server/post-v1-chat-completions, then invokes the typedhermes_api_chat_completionswrapper against a mocked/local endpoint. hermes_api_chat_completionsreturns top-levelrun_idandartifact_dirvalues plus absolute request/result/response receipt artifact paths.- A generic raw
hermes_api_request_fallbackMCP tool remains absent. Internally classified routes still setallow_fallback=false, and raw fallback authorization attempts are denied withRAW_FALLBACK_DENIED. hermes_agent_ask_fallbackremains visibly last resort.runandstartnow requirewhy_no_typed_tool_fits,docs_resource_consulted,typed_wrapper_checked,risk_acknowledgement, andexpected_evidence; the bridge reads the named docs resource and writesdocs-consulted.jsonbefore any backend/API wrapper call.
M3 eval harness integration
M3 wraps the configured Hermes eval harness behind the eval policy tier:
hermes_eval_suites_listlists suite files fromtoolkit.suites_dir, including dry/structural markers and case counts, without executing the harness. Discovery and execution use the same post-symlink configured-path resolver; an external target not inpolicy.allowed_pathsis reported asPATH_DENIEDwith a degraded verdict.hermes_eval_runexecutes one bounded suite synchronously and writes privaterequest.json,result.json,summary.json,stdout.txt,stderr.txt,report.md, andmanifest.jsonartifacts.hermes_eval_startstarts the same run path as an in-process async job;hermes_job_statuspolls it andhermes_job_cancelrequests best-effort cancellation.- Dry/structural suites must declare a top-level or metadata
mcp_dry_run,dry_run,structural, ormode: drymarker. Non-dry suites requirelive_eval=true, all live/model/tool/external policy gates, andHERMES_TOOLKIT_MCP_ALLOW_LIVE_EVAL=1.
M4/M5 deploy guard and gateway/API diagnostics
M4/M5 adds deploy-readiness and runtime-diagnostic surfaces without granting deploy authority:
hermes_deploy_guard_checkis read-only and probes an allowlisted live git worktree for branch, HEAD, cleanliness, and symlink/path-containment failures. It never fetches, switches branches, merges, restarts, or writes config.hermes_config_compare_surfacescompares selected top-level YAML config keys across two allowlisted config files. Secret-like keys are reported by presence only, and output is redacted.hermes_deploy_repair_planis available only atpropose_mutation; it writes privaterepair-plan.jsonandrepair-plan.mdartifacts and explicitly performs no git/service/config mutation.hermes_gateway_statusreads configured pid/lock/log-path state and process presence when a pid file is configured; it never starts, stops, restarts, or signals a process. It parses plain-decimal and Hermes 0.18.2 JSON PID files; malformed, stale, unreadable, missing, or denied states surfacedegradedorblockedwith a warning rather than a silentpass.hermes_log_tailtails only configuredhermes.gateway.allowed_log_paths, with bounded reads and redaction; arbitrary log paths are denied. An empty allowlist is a valid fail-closed configuration.hermes_api_smokeis gated atapi_callwith all live/model/tool/external gates. It separates endpoint reachability, auth acceptance, model invocation, and assistant-answer evidence, writessmoke-summary.json, and requiresHERMES_TOOLKIT_MCP_ALLOW_LIVE_API_SMOKE=1for non-loopback API bases.
M6 skill workflow support
M6 adds proposal-first skill workflow tools; direct skill mutation is separated into M8 exact-scope apply tools:
hermes_skills_listlists toolkit/home/profile skill directories, frontmatter summaries, and linked files underreferences/,templates/,scripts/, orassets/. Bare calls default tolimit=25, compact summaries, andtotal_count/returned_count/next_offsetpagination fields; projected items stay within a 24 KiB byte budget and the final envelope stays within a 32 KiB target. Usedetail="full"for the rich shape, still subject to the same bounds.hermes_skill_readreads a boundedSKILL.mdor linked file after resolving the skill and linked file under allowed roots and the skill directory.hermes_skill_eval_startvalidates a skill id before starting the existing dry/live-gated eval job path, writing eval artifacts but not skill files.hermes_skill_patch_proposalis available only atpropose_mutation; it writes privateproposal.json,proposal.patch, and manifest artifacts while recordingproposal_only=trueandno_skill_write/no_git_operationnon-actions.
Actual skill writes are performed only by M8 apply tools, which require exact-scope hashes, a matching confirmation nonce, and path-containment checks.
M7 optional fallback bridge
M7 adds hermes_agent_ask_fallback as a last-resort, artifact-producing bridge. It is visible in the experimental default surface, but run and start requests must explain why no typed tool fits, name the bundled docs resource consulted, name the typed wrapper checked, acknowledge risk, and list expected evidence.
M8 gated mutation tools
M8 adds mutation-capable tools. They are visible in the experimental default surface, but execution remains fail-closed unless each exact-scope gate passes:
hermes_skill_patch_applyapplies an exact-scope skill-file patch only withexpected_original_sha256and a confirmation nonce frompolicy.mutation_confirmation_nonce_env.hermes_config_patch_applyapplies an exact-scope config-file patch only with matching file SHA-256, parse validation for YAML/JSON/TOML, and a confirmation nonce.hermes_gateway_restartis owner-tier/destructive and runs only a preconfiguredhermes.mutation_commands.gateway_restartargv list after command-hash and nonce gates pass.hermes_deploy_repair_applyis owner-tier/destructive and runs only a preconfiguredhermes.mutation_commands.deploy_repairargv list against a verifiedrepair-plan.jsonartifact after command-hash, plan-hash, and nonce gates pass.
Every apply path writes a private artifact receipt. File patch tools write private target-adjacent backups and a redacted patch; command tools capture redacted stdout/stderr and never use a shell string.
Fixture contract
Tests use static fake fixtures under tests/fixtures/ and temporary directories from tmp_path. They must not depend on a developer's live home directory, Hermes installation, toolkit checkout, external tracker state, or API server.
License
Hermes Toolkit MCP is licensed under the MIT License.
Recommended Servers
playwright-mcp
A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.
Magic Component Platform (MCP)
An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.
Audiense Insights MCP Server
Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.
VeyraX MCP
Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.
graphlit-mcp-server
The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.
Kagi MCP Server
An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.
E2B
Using MCP to run code via e2b.
Neon Database
MCP server for interacting with Neon Management API and databases
Exa Search
A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.
Qdrant Server
This repository is an example of how to create a MCP server for Qdrant, a vector search engine.