enterprise-mcp
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@enterprise-mcpShow me the list of pending change requests."
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Hermes Enterprise Deployment Lab
An MCP surface that a real Hermes Agent build discovers and enumerates, with enforced tool scoping, fail-closed credential handling, separated operator approval, and exactly-once resume proven after a forced failure. Locally, in a customer-shaped lab: a mock enterprise API, a workflow seam, a FastMCP stdio server, and an operator-only approval command.
That is the whole claim. Two things it is specifically not:
The approval identity is a lab assertion, not enterprise authentication. The MCP caller gets only an opaque approval ID. A separate command records an operator identity and releases a time-bound capability whose plaintext is never stored. The demo automates that operator role with a fixture identity; it does not prove a real person's identity or judgment.
No model has ever invoked these tools, and none will. Every call here comes from a script or a test. Hermes's real involvement is discovery and enumeration, which is proven; model-driven invocation is not, and it is not coming.
Both are expanded in What this does not prove.
Run the whole thing in one command:
./scripts/demo.shRun the complete credential-free proof packet with ./scripts/proof.sh. It
runs all 73 tests, inspects the MCP server, parses the Compose topology, and
executes the failure/resume demo. See PROOF.md for exact claim
boundaries.
Status: local proof only — no CI run, no independent second-operator validation, no model invocation, no production identity provider. See What this does not prove — it is deliberately specific, and it is the part worth reading first.
What this proves
Each row names the command that establishes it. If a row has no command, it does not belong in this table.
Claim | Established by |
A real Hermes Agent build connects to this MCP server over stdio and enumerates its tools (discovery only — Hermes does not invoke anything here) |
|
The tool surface Hermes sees is scoped, and changing the scope changes what Hermes sees |
|
An excluded tool is neither listed nor callable |
|
A mutation request returns only an opaque |
|
Only the separate operator path can approve; approver identity is recorded and the plaintext capability is not stored | same file, |
A forged, expired, already-applied, or wrongly bound capability is refused before dispatch | workflow-runner unit tests + MCP end-to-end tests |
A fault injected after commit is survivable: the resume replays instead of re-applying | same file, |
Exactly one side effect exists after failure + resume, then the capability becomes terminal | same test, and |
A read-only credential cannot mutate |
|
Credentials really reach the MCP subprocess — a wrong token actually fails |
|
The server fails closed with no token instead of falling back to a default | same file, |
The workflow runner's audit log records request, named operator grant, capability acceptance, failure, and replay |
|
A clean clone of HEAD reproduces the test suite and the demo |
|
Hermes Agent is an external operator/client, not a Compose service. Proofs use
an isolated HERMES_HOME; they never read or write your live ~/.hermes/config.yaml.
Hermes's role in this repository is discovery and enumeration. It never invokes a
tool here, and no output in this repository was produced by Hermes acting on its
own — the callers are scripts/*.sh and pytest.
Related MCP server: olivetin-mcp
What this does not prove
No LLM has ever chosen or invoked these tools, and none will. Every tool call in this repository is made by a script or a test.
hermes mcp testperforms discovery only; it makes no provider call. Closing this would need a model-driven run (hermes -zwith the toolset narrowed toenterprise_ops) plus the session transcript showing the tool-call event. The owner declined that provider spend on 2026-08-01, so it will not be done. Treat this as a permanent ceiling on the repository, not an open task. What Hermes really did here — and all it did — is discover and enumerate the tool surface over stdio. Nothing in this repository was "run by Hermes" in any other sense.The demo does not prove human identity or judgment. The role boundary is real in code: the MCP surface cannot grant approval, and its request response contains no capability. The demo then invokes the separate operator command with
demo-operator@example.comso the entire arc remains deterministic. In a real deployment that command must sit behind authenticated operator access.The approval store is an unauthenticated JSON file. Anything that can write
APPROVAL_STORE_PATHcan still subvert the lab control. The store keeps only a SHA-256 capability hash, but it is not a transactional or authenticated production authorization service.The audit log is append-only by convention, not tamper-evident. It is a plain
.jsonlfile with no signature or chain hash;run_startedandrun_finishedcarry a null correlation ID; and the enterprise API writes no audit of its own, so a direct write to the API leaves no trace in it."Exactly once" is per approval, not per action. Two approvals for the same
action_idcarry two idempotency keys and produce two records. Nothing deduplicates at the action level.Hermes-side tool filtering is not proven. Hermes has a
tools.includelist, and on 2026-08-01 narrowing it to a single entry still madehermes mcp testprint all three tools, because that command reports the server's advertised surface. The scoping proven here is enforced by this server, not by Hermes.CI has never run. There is no git remote for this repository, so
.github/workflows/ci.ymlhas never executed. The fresh-clone half is proven locally byscripts/fresh-clone-check.sh; the green-badge half is not.No second operator has validated any of this, and none is scheduled.
docs/second-operator-protocol.mdis an unrun protocol — a script nobody has executed — not pending evidence. Its results table is blank because the run has never happened.The guard is a workflow-layer control, not a platform one. A different client holding the write token could call the enterprise API directly and bypass it entirely, leaving no audit record.
Not a production deployment. No OIDC, no Kubernetes, no real identity provider, no cloud/hybrid scale, no real customer data. One deterministic incident fixture (
INC-2026-0042). The "mutation" is a record in an in-memory store inside the lab API.Docker is unverified. Podman is the supported container runtime here.
The arc
Hermes / script ──stdio──► enterprise-mcp ──Bearer+Idempotency-Key──► enterprise-api
│ ▲ │
│ approval_id │ └──────────────► audit log
▼ │
approval store ◄── operator command --approver <identity>
│ │
└─ one-time capability (plaintext never persisted)Scoped discovery — the default allowlist exposes read/plan tools only.
Read + plan —
propose_incident_planreturns runbook steps with stableaction_ids andapproval_requiredflags.Request blocked —
apply_incident_planwithout a capability writes nothing and returns onlypending_approvalplus an opaqueapproval_id.Operator grant —
python -m workflow_runner.approval_operator approve <approval_id> --approver <identity>records the approver and returns the expiring capability once; only its hash is persisted.Forced failure — with
ENTERPRISE_INJECT_FAILURE=error_after_committhe API commits the record and then returns 500. The caller seesupstream_5xxand resume instructions.Resume — the same capability replays the same idempotency key; the API returns the original record with
replayed: true.Exactly once + terminal — the store holds one record and another use of the applied capability is rejected without dispatch.
Fresh-clone setup
Prerequisites: Python 3.11, 3.12, or 3.13. Not 3.14 — pydantic-core has no
wheel for it and its vendored PyO3 tops out at 3.13, so a source build fails.
Podman and the Hermes CLI are optional and only needed for the container and
Hermes proofs.
git clone <repo-url> hermes-enterprise-deployment-lab
cd hermes-enterprise-deployment-lab
cp .env.example .env
python3 -m venv .venv
.venv/bin/pip install -r requirements-dev.txt \
-r workflow-runner/requirements.txt \
-r enterprise-mcp/requirements.txt
.venv/bin/python -m pytest -q
./scripts/demo.sh # the whole arc; boots its own API, no containers neededContainer and Hermes proofs:
podman machine start # once, if the default machine is stopped
podman compose up -d --build
./scripts/smoke.sh # containerized workflow-runner receipt
ENTERPRISE_API_URL=http://127.0.0.1:8080 ./scripts/mcp-smoke.sh
ENTERPRISE_API_URL=http://127.0.0.1:8080 ./scripts/hermes-tool-filter-proof.sh
podman compose down -vworkflow-runner is a run-to-completion container that exits 0 by design; some
compose providers report that as a failure under --wait.
Protocol-only smoke (CI mode)
MCP_SMOKE_PROTOCOL_ONLY=1 ./scripts/mcp-smoke.shRuns the FastMCP inspect/list/call proof without the Hermes CLI. Full local smoke requires Hermes and fails closed when it is absent.
Configuration
Variable | Meaning |
| Read scope. Required — there is no default; the server exits 2 without it |
| Write scope. Absent means the server cannot mutate |
| Tool allowlist. Unset = read/plan only; |
| Deterministic fault: |
| Lifetime of a pending/approved request; default 900 seconds |
| Where the audit trail and approval store live |
MCP stdio does not inherit your environment. The SDK forwards only
HOME, LOGNAME, PATH, SHELL, USER. Anything else must be passed
explicitly via env= on the stdio transport or the Hermes env: block. This
repository got that wrong once and the failure was silent — see
ADR 004.
Hermes MCP config (isolated)
Never merge this into ~/.hermes/config.yaml.
export ENTERPRISE_API_TOKEN=lab-read-token
export HERMES_HOME=/tmp/hermes-mcp-lab
mkdir -p "$HERMES_HOME"
{
echo "_config_version: 9"
./scripts/emit-hermes-mcp-config.sh "$PWD" all
} > "$HERMES_HOME/config.yaml"
hermes mcp test enterprise_opsThe second argument is the server-side allowlist. Example shape:
config/hermes-mcp-example.yaml.
Fixture tokens
Local lab only — non-secret test data, documented in .env.example:
ENTERPRISE_API_TOKEN=lab-read-token
ENTERPRISE_API_WRITE_TOKEN=lab-write-tokenMCP tool surface
Tool | Mutating | Behavior |
| no | Health/readiness, correlation ID, whether a write credential is present |
| no | Incident + runbook with per-dependency call evidence |
| no | Plan receipt; consequential steps carry |
| yes | Requests or consumes a separately granted, expiring capability; idempotent execution of one runbook step. Opt-in via the allowlist |
Documentation
Document | Contents |
Components, proof layers, threat boundary | |
Operator commands and troubleshooting | |
Why stdio MCP | |
| Historical two-call guard and credential/scoping decision |
Superseding separated approval state machine and resume semantics | |
Unrun protocol — a script for a validator who does not exist yet, not pending evidence | |
Controlling spec |
Milestones
Milestone | Status |
M1 Green local deployment | Green |
M2 Identity/integration boundary | Partial — two static bearer scopes; no OIDC, no connector pagination/retry |
M3 Agent workflow (MCP + Hermes discovery) | Partial, permanently — discovery and scoping proven with the real Hermes CLI; model-driven invocation will not be attempted (provider spend declined 2026-08-01) |
M4 Separated approval, idempotency, resume, audit | Partial — role separation, expiry, terminal consumption, and ambiguous-failure resume are green locally. Identity is a caller-supplied fixture string and the audit is not tamper-evident |
M5 CI green from a fresh clone | Red — no remote; the workflow has never run |
Known limitations and roadmap
Everything here is a deliberate, recorded gap. Nothing in this list is in progress.
Item | State | Note |
Production approval identity/policy integration | Not implemented | The operator command records a supplied identity but does not authenticate it. |
Model-driven tool invocation | Declined, 2026-08-01 | Provider spend declined. Permanent; this repository will never demonstrate it. |
Second-operator validation | Unrun |
|
CI run | Never executed | No git remote exists. |
Action-level deduplication | Not implemented | "Exactly once" is per approval, not per action. |
Approval consumption and expiry | Implemented locally |
|
Authenticated approval store | Not implemented | Plain JSON at |
Enterprise-API-side audit | Not implemented | A direct write to the API leaves no trace. |
Approval boundary that remains
The local implementation now returns only an opaque request ID, grants through
a distinct operator command, records the supplied identity, hashes the stored
capability, enforces expiry/binding/terminal state, and preserves safe resume
after a post-commit ambiguity. It still does not authenticate that identity
or protect the JSON store from a local writer. Productionizing it would replace
the operator command and file store with an IdP-backed approval service and a
transactional audit store. Full text: docs/architecture.md.
License
MIT — see LICENSE. Security notes: SECURITY.md.
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Related MCP Servers
- AlicenseAqualityDmaintenanceAn MCP server that exposes tools for issuing scoped agent credentials, delegating narrower child credentials, handling approvals, revoking task trees, and retrieving audit trails and evidence packets.141Apache 2.0
- AlicenseAqualityDmaintenanceA hardened MCP server that exposes OliveTin actions as tools with built-in human-in-the-loop approval for destructive operations.181MIT
- Alicense-qualityCmaintenanceMCP server for investigating cloud incidents and managing approvals. Provides read-only tools to list incidents, investigate incidents, and list approvals, keeping remediation behind human approval.MIT
- AlicenseAqualityCmaintenanceA compact MCP server demonstrating explicit tool boundaries, least-privilege discovery, execution-time authorization, destructive-action confirmation, and metadata-only audit logs using a local note store.3MIT
Related MCP Connectors
Remote MCP for A2A caller identity, scope policy, verdict receipts, and audit history.
A paid remote MCP for CLI tool MCP, built to return verdicts, receipts, usage logs, and audit-ready
A paid remote MCP for hosted MCP server, built to return verdicts, receipts, usage logs, and audit-r
Latest Blog Posts
- Who's Calling? MCP Hosts Are an Identity Blind Spot (And the Spec Knows It)By Om-Shree-0709 on .mcpAgent IdentityOAuth 2.1
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/dbett4/hermes-enterprise-deployment-lab'
If you have feedback or need assistance with the MCP directory API, please join our Discord server