About gatekeeper
gatekeeper is an MCP server that connects MCP clients to Runestone Gatekeeper, placing shell, file-write, and HTTP calls behind policy controls. Calls can be allowed, denied, or held for human approval, with audit records.
Key features
- 01Policy-check tool calls
- 02Support human approval
- 03Record audit information
- 04Offer shell, file, and HTTP tools
- 05Treat unexpected responses as failures
Use cases
- 01Restrict an agent's shell commands
- 02Require approval for file writes
- 03Control and audit HTTP requests
- 04Call other tools through Gatekeeper
MCP support
The MCP server forwards client tool calls to a running Gatekeeper and places policy checks, approval outcomes, and auditing in the call path. It connects over stdio and does not execute actions independently.
Configuration
Local server config is the same for every client. Copy it into your client’s MCP config file.
npx -y @runestone-labs/gatekeeper-mcpGATEKEEPER_ROLEPolicy role this server presents to Gatekeeper for every call. Required.GATEKEEPER_URLBase URL of the Gatekeeper server. Default http://127.0.0.1:3847.GATEKEEPER_AGENT_NAMEAgent name recorded in Gatekeeper audit logs. Default mcp-client.GATEKEEPER_RUN_IDOptional run-correlation id so calls count toward one per-run budget.Local servers need a runtime on your machine (e.g. Node.js 18+). Config file locations differ by client; see your client’s docs.
Tools
5Saved tool list · updated 2w ago
| Parameter | Type | Required | Description |
|---|---|---|---|
| cwd | string | No | Working directory. |
| command | string | Yes | The shell command to run. |
| timeoutMs | integer | No | Per-call timeout in ms. |
Details
From the project READMERunestone Gatekeeper — MCP Server
An MCP server that lets any MCP client (Claude Desktop, Claude Code, Cursor, …) run real tool calls — shell, file writes, HTTP, or any Gatekeeper tool — only through Runestone Gatekeeper. Every call is policy-checked, may require human approval, and is audited. The model never touches your systems directly; Gatekeeper sits in front.
MCP client (LLM) ──tools/call──▶ gatekeeper-mcp ──policy-gated──▶ Gatekeeper ──▶ shell / files / HTTP
Requirements
A running Gatekeeper server (see the repo root). This package is just the MCP front door; it does nothing on its own.
Install / configure
It runs over stdio. Add it to your MCP client config, e.g. Claude Desktop
(claude_desktop_config.json):
{
"mcpServers": {
"gatekeeper": {
"command": "npx",
"args": ["-y", "@runestone-labs/gatekeeper-mcp"],
"env": {
"GATEKEEPER_URL": "http://127.0.0.1:3847",
"GATEKEEPER_ROLE": "openclaw"
}
}
}
}
| Env | Required | Default | Meaning |
|---|---|---|---|
GATEKEEPER_ROLE | yes | — | The policy role this server presents to Gatekeeper for every call. |
GATEKEEPER_URL | no | http://127.0.0.1:3847 | Gatekeeper base URL. |
GATEKEEPER_AGENT_NAME | no | mcp-client | Name recorded in audit logs. |
Shared approvals for unattended agents
Local Gatekeeper and this MCP integration are free. Need a teammate to handle approvals while your agents run unattended? We're testing Gatekeeper Team at $49/month, for up to five members and five instances. The proposed Cloud service would coordinate a held action, a teammate's approval or denial, and a record of the outcome. Cloud is planned, not publicly available, and no payment is collected during this test. Only actions actually routed through Gatekeeper are covered; installing the MCP server does not cover a client's other tools.
See the proposed workflow and share your team's needs. The form also lets you optionally report a first real routed action or return use on a later day. These are manual self-reports, not verified external activation. Don't send commands or raw audit logs; this test adds no automatic usage reporting to the MCP server.
Tools
| Tool | Gatekeeper tool | Use |
|---|---|---|
shell_exec | shell.exec | Run a shell command. |
files_write | files.write | Write a file. |
http_request | http.request | HTTP GET/POST (egress-policed). |
gatekeeper_call | (any) | Generic escape hatch — call any Gatekeeper tool (e.g. memory.query) by name. |
gatekeeper_health | — | Check the Gatekeeper server is reachable. |
Every gated call returns one of:
- allow → the tool output.
- deny → an error result explaining why (the call did not run).
- approve → an error result saying a human must approve it in Gatekeeper; the call did not run.
Security model
This server is a policy boundary, so it is deliberately strict:
- Identity is pinned server-side. Role comes from
GATEKEEPER_ROLE; origin is fixed tomodel_inferredand taint tomcp_client. The MCP client cannot set or override actor / role / origin / taint / capability tokens via tool arguments — there is no code path from a tool argument to any of those. - Fail closed. A deny, a pending approval, or any malformed/unexpected Gatekeeper response is surfaced as an error — never as a successful result.
- No endpoint traversal. Generic tool names are validated as strict dotted
identifiers;
../, slashes, and the like are rejected before any request. - No leakage. The Gatekeeper URL and anything resembling a credential are scrubbed from error messages before they reach the client.
These invariants are covered by an adversarial test suite (src/*.test.ts).
Distribution
Published to npm as @runestone-labs/gatekeeper-mcp and listed on the MCP
Registry as io.github.runestone-labs/gatekeeper (see server.json). The MCP
Registry is in preview.
License
Apache-2.0
Comments
New to MCP?
From what the protocol is to installing your first server, these answers cover most first questions.
An open protocol that defines how AI applications connect to external tools and data in a uniform way. Clients talk to the model; MCP servers provide tools, resources and prompt templates. They exchange standard messages, so one server can be reused by many clients.