consentgate-mcp
Sends Approve/Deny prompts to Telegram for human approval, blocking the agent until the user responds.
Click on "Deploy 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., "@consentgate-mcpRequest approval to transfer $500 to Acme Corp"
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.
consentgate-mcp
A Model Context Protocol server that lets any MCP-capable agent (Claude Desktop, Claude Code, Cursor, custom agents, …) gate its own actions behind a human's consent policy via ConsentGate.
The agent asks before it acts; you stay in control. High-stakes actions can block on an explicit Approve / Deny tap delivered to your Telegram.
Tools
Tool | Blocks? | What it does |
| no | Evaluates an action against your consent rules. Returns |
| yes (≤120s) | Sends an Approve/Deny prompt to your Telegram and blocks until you tap or it times out. Returns |
Both fail closed: anything other than an explicit allow means do not proceed.
Related MCP server: Relay
Prerequisites
A ConsentGate account and an API key → https://consentgate.fyi/dashboard/keys (
cg_…).For
request_approval(interactive approvals): the Pro plan and a linked Telegram account (Dashboard → Telegram → Connect).check_actionworks on any plan.
Configuration
Environment variables:
Var | Required | Default | Notes |
| ✅ | — | Your |
| — |
| Override for self-hosted instances. |
Claude Desktop
Add to claude_desktop_config.json (Settings → Developer → Edit Config):
{
"mcpServers": {
"consentgate": {
"command": "npx",
"args": ["-y", "consentgate-mcp"],
"env": { "CONSENTGATE_API_KEY": "cg_your_key_here" }
}
}
}Claude Code
claude mcp add consentgate --env CONSENTGATE_API_KEY=cg_your_key_here -- npx -y consentgate-mcpGeneric MCP client
Run npx -y consentgate-mcp (stdio transport) with CONSENTGATE_API_KEY in the environment.
Run from source
Until the package is published to npm, point your client at the built file (
node /abs/path/to/mcp/dist/index.js) instead ofnpx consentgate-mcp.
cd mcp
npm install # also builds via the `prepare` script
npm run build # -> dist/index.js
CONSENTGATE_API_KEY=cg_… npm run smoke # lists tools + a live check_actionHow an agent should use it
A good agent policy:
Before performing any action that sends messages, spends money, deletes data, posts publicly, or changes external state, call
check_action. If the result isallow, proceed. Ifdeny, stop. Ifask(or the action is high-stakes), callrequest_approvaland proceed only on an explicitallow.
Example (request_approval):
{
"action": "transfer_funds",
"category": "spending",
"metadata": { "amount": "$500", "to": "Acme Corp" },
"wait_seconds": 90
}
// -> blocks; you tap Approve in Telegram -> { "decision": "allow", "resolved_by": "human" }License
MIT
Available Tools
2 toolscheck_actionCheck an action against the consent policyARead-only
Check whether an action is permitted by the ConsentGate owner's consent policy BEFORE you perform it. Call this for any potentially sensitive, irreversible, or high-impact action — e.g. sending email or messages, posting publicly, spending money, deleting or overwriting files, calling external/destructive APIs, or changing system state. Returns a decision: "allow" (you may proceed), "deny" (do NOT proceed), or "ask" (no rule matched — not approval; use request_approval to get a human decision, or ask the user). This call does not block. FAIL CLOSED: if the result is anything other than "allow", do not perform the action.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The specific action you intend to take, e.g. "send_email", "delete_file", "transfer_funds". | |
| category | Yes | Action category. Built-in categories: email, social_post, message, file_write, file_delete, api_call, spending, calendar, system, custom. Any short label (<=50 chars) is accepted. | |
| metadata | No | Structured details of the action (e.g. recipient, amount, path, url). Used by the owner's rules and shown in any approval prompt. Max 10KB. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses several behavioral traits beyond the annotations: it is non-blocking ('This call does not block.'), fail-closed ('FAIL CLOSED: if the result is anything other than "allow", do not perform the action.'), and clarifies that 'ask' is not approval. These add meaningful context that the readOnlyHint and openWorldHint annotations do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is four sentences long, with each sentence earning its place: purpose, usage examples, return values, and the critical fail-closed instruction. It is front-loaded with the main action and is dense with useful guidance, with no fluff.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Even without an output schema, the description fully explains the return values and their meanings, the non-blocking nature, and the fail-closed behavior. It also handles the 'ask' edge case by directing to request_approval. This is complete for the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides 100% parameter coverage, including examples and built-in categories. The description adds minimal extra parameter meaning, such as that metadata is 'used by the owner's rules,' but does not significantly expand on what the schema already says. Baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool checks whether an action is permitted by the consent policy before performing it. It specifies the verb 'check' and the resource 'consent policy', and differentiates from the sibling tool request_approval by noting that 'ask' is not approval and should use request_approval.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs when to use this tool: 'for any potentially sensitive, irreversible, or high-impact action' with concrete examples. It also provides an explicit alternative for the 'ask' result: 'use request_approval to get a human decision, or ask the user.' This is strong guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_approvalRequest explicit human approval (blocks)A
Request a human's explicit approval for an action and BLOCK until they decide or the timeout elapses. Use for high-stakes actions, or whenever check_action returned "ask". The owner gets an Approve/Deny prompt on Telegram. Returns "allow" ONLY if a human tapped Approve. Returns "deny" on tap-deny, on timeout (fail-closed), or when interactive approvals are unavailable (owner not on Pro, or Telegram not linked — see upgrade_required / telegram_linked). NEVER treat a non-"allow" result as permission.
| Name | Required | Description | Default |
|---|---|---|---|
| action | Yes | The specific action requiring approval, e.g. "send_email", "transfer_funds". | |
| category | Yes | Action category. Built-in categories: email, social_post, message, file_write, file_delete, api_call, spending, calendar, system, custom. Any short label (<=50 chars) is accepted. | |
| metadata | No | Structured details shown to the human in the approval prompt (e.g. recipient, amount, summary). Max 10KB. | |
| wait_seconds | No | How long to block waiting for the human's tap (1-120s). On timeout the result fails closed to "deny". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses extensive behavioral details: blocking behavior, exact return values, fail-closed timeout, unavailable conditions, and a strong safety caveat. This goes well beyond the annotations (readOnlyHint=false, openWorldHint=true) and adds critical context for an agent.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a concise block of information with clear front-loading of the core purpose. Every sentence contributes critical usage or safety information, and the overal length is justified for a safety-critical tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description fully explains return values and edge cases. It covers success (allow), deny conditions, timeout, unavailable scenarios, and safety rules, making it complete for an agent to use correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description does not add extra parameter-specific meaning beyond what the schema already provides; it focuses on overall tool behavior instead.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states exactly what the tool does: request human approval and block until decision or timeout. It clearly distinguishes this from the sibling tool check_action by saying 'Use for high-stakes actions, or whenever check_action returned "ask"'.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool (high-stakes actions, check_action returned ask) and when to avoid treating results as permission. The description also mentions alternatives via the check_action reference, giving clear contextual guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
2 tool updates
v0.1.1- First observed
check_action - First observed
request_approval
TDQS
Scored across 2 tools
check_action and request_approval have clearly distinct purposes: one performs a policy check, the other requests human approval. There is no overlap or ambiguity between them.
Both tools follow the same verb_noun pattern with snake_case: check_action and request_approval. The naming is consistent, descriptive, and predictable.
With only two tools, the set feels minimal but not unreasonable for a focused consent gate. It is borderline according to the calibration, as 1-2 tools tends to be thin, but here the two tools cover the core consent workflow.
The core consent flow is covered: check_action for policy evaluation and request_approval for handling 'ask' results or high-stakes actions. There is no dead end, though a gap exists for managing or viewing the consent policy itself, which is likely configured outside the tool surface.
Maintenance
Related MCP Connectors
MCP enforcement layer that intercepts AI agent actions and blocks rule violations before execution.
- mcpOAuthcom.decionis
Authorize consequential AI agent actions before execution
Zero-secret MCP gateway for AI agents: risk-scored, audited calls with human-in-the-loop approval.
Preventive human-approval write-gate for AI agents: writes commit only after a human approves.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceHuman-in-the-Loop authorization gateway for AI Agents. Securely pause MCP workflows and route high-risk actions to human approvers via Slack or Email.85 npm1MIT
- AlicenseNot gradedqualityBmaintenanceAdds a human-in-the-loop checkpoint to MCP-capable AI coding agents, enabling them to pause and request user feedback before executing actions.10 npm71MIT
- AlicenseNot gradedqualityCmaintenancePauses AI agent execution and routes approval requests to humans via Slack or email, with cryptographically signed proof of the human's decision.18 npmMIT
- AlicenseAqualityAmaintenanceAn MCP server that enables AI agents to pause and request human approval or information via Slack, Telegram, or macOS dialogs before proceeding with actions.215Apache 2.0