Governance Gateway

io.github.tanishq-ctrlPublished by GitHub account tanishq-ctrlv0.1.1Updated Nov 3, 2026

Deadline-aware governance for AI agents: PII scan always, safety check if it fits the deadline

VerifiedSTDIODesktop onlySecurity & MonitoringAI & ML

Overview

AI-generated overview

Local MCP server that checks text an agent is about to send, store or act on for PII and harmful content, returning allow, redact or block within a deadline.

What you can do
  • Check text before acting on it, getting a verdict of allow, redact or block with reasons, masked text and timing
  • Review governance statistics: verdict counts, mean and p95 lag, share on time, skipped classifier checks
  • List recent decisions with verdict, kinds of personal data found and timing, never the text
  • Consult the decision matrix for a pipeline's deadline, traffic shape, peak factor, detector recall and target
  • Simulate load to compare checking everything against the deadline-aware guard
When to use it
Useful when an agent handles messages, emails, commands or file content that may contain personal data or harmful text and you want a local, deadline-aware check before acting. Also suited to reasoning about whether a pipeline needs adaptive checking or more capacity.
Requirements
Runs locally over stdio as a Python package (governance-gateway) needing Python 3.10 or later and the mcp package; installable with uvx or pip. No accounts, API keys or headers are declared. An optional Claude Code hook uses a local port on 127.0.0.1 and settings such as GSL_HOOK_DEADLINE_MS, GSL_FAIL_OPEN, GSL_ALLOW_EMAIL_DOMAINS and GSL_AUDIT_LOG.
Before you install
The PII scan is pattern-based and misses names and postal addresses; the safety classifier catches roughly 6 in 10 harmful messages and was trained on English, so it is a first line of defence, not a complete safety system. The optional hook sends command, file and URL text to the local gateway and blocks actions when checks cannot run unless GSL_FAIL_OPEN=1 is set. An audit log path can record decisions. Use alongside, not instead of, your organisation's data-protection controls.

Installation

In SourceWeft

  1. Open Governance Gateway in the dashboard and add it to a workspace.
  2. Enable the server for the chats that should use its tools.

Desktop only via STDIO. STDIO servers start a local process, so they need the SourceWeft desktop host.

Other MCP clients

Follow the launch instructions in the repository.

README

governance-gateway

Governance checks that an AI agent runs before it acts, built so they keep up with the agent instead of falling behind it.

Every request gets a format check and a personal-data (PII) scan, which never skip. A safety classifier, which flags toxic text and jailbreak attempts, is the slow, optional check: it runs only if a cheap screen finds the text suspicious and it can still finish before the request's deadline. Under load, a guardrail that checks everything falls behind and its checks finish after the agent has already acted; this one stays on time and never drops the privacy check.

It runs locally as an MCP server, so text never leaves your machine, and works with any MCP client: Claude Desktop, Claude Code, Cursor, VS Code, Gemini CLI and others. In Claude Code an optional hook makes the checks compulsory for every command, file write and web request the agent makes.

Install

With uv nothing needs installing in advance:

bash
uvx governance-gateway --version

Or with pip: pip install governance-gateway, then run governance-gateway. Python 3.10 or later; the only dependency is the mcp package.

Add it to your AI tool

Claude Desktop: in claude_desktop_config.json (Settings > Developer > Edit Config):

json
{  "mcpServers": {    "governance-gateway": { "command": "uvx", "args": ["governance-gateway"] }  }}

Cursor: the same block in ~/.cursor/mcp.json (or .cursor/mcp.json in a project).

Gemini CLI: the same block in ~/.gemini/settings.json.

VS Code (Copilot agent mode): in .vscode/mcp.json:

json
{  "servers": {    "governance-gateway": { "type": "stdio", "command": "uvx", "args": ["governance-gateway"] }  }}

Claude Code:

bash
claude mcp add governance-gateway -- uvx governance-gateway

If you installed with pip, use "command": "governance-gateway" and no args.

Tools

ToolWhat it does
check_message(text, deadline_ms=100)Runs the checks. Returns allow, redact (with the personal data masked) or block, the reasons, whether the screen and the classifier ran, and the timing. Never echoes the text back.
governance_status()Requests so far: verdicts, mean and 95th-percentile lag, share on time, share of classifier checks skipped or screened out.
recent_decisions(limit=20)The latest decisions: verdict, kinds of personal data found, timing. No text.
decision_matrix(...)For a pipeline's deadline, traffic shape, peak-hour factor, detector recall, target and cost share: whether checking everything is enough, adaptive checking is needed, or only more capacity helps.
simulate_load(load, deadline_ms, traffic, seconds)Races "check everything" against the deadline-aware guard on a simulated clock with measured check costs.

Resources: governance://status and governance://policy (which checks run, which are mandatory, and how the gateway decides). All tools are read-only.

Make the checks compulsory in Claude Code

An MCP tool is only called when the agent decides to call it. In Claude Code a PreToolUse hook can run the check before every action instead. The easiest way is the governance-guard plugin, which adds both the server and the hook:

/plugin marketplace add tanishq-ctrl/governance-gateway/plugin install governance-guard@governance-gateway

Or add the hook yourself to ~/.claude/settings.json (or a project's .claude/settings.json):

json
{  "hooks": {    "PreToolUse": [      {        "matcher": "Bash|Write|Edit|MultiEdit|NotebookEdit|WebFetch",        "hooks": [          {            "type": "command",            "command": "uvx",            "args": ["--from", "governance-gateway", "governance-gateway-hook"],            "timeout": 10,            "onFailure": "block"          }        ]      }    ]  }}

The hook sends the text of each action (the command, the file content, the URL) to the running gateway, with a budget of GSL_HOOK_DEADLINE_MS (default 200 ms):

  • harmful or malformed: the action is refused and the agent is told why;
  • personal data found: you are asked whether to allow it;
  • otherwise: nothing changes, and your normal permissions apply.

If the gateway is not running, the hook still runs the personal-data scan itself. If the check cannot run at all, the action is blocked (set GSL_FAIL_OPEN=1 to allow it instead). Addresses at GSL_ALLOW_EMAIL_DOMAINS (default anthropic.com, users.noreply.github.com, example.com) are ignored, so commit trailers pass.

Settings

OptionEnvironmentDefaultMeaning
--cascade on/offGSL_CASCADEonRun the suspicion screen before the classifier
--estimator p90/meanGSL_ESTIMATORp90How the classifier's cost is estimated from recent checks
--workers NGSL_GATEWAY_WORKERS1Workers serving the queue
--audit-log PATHGSL_AUDIT_LOGnoneAppend one JSON line per decision (no text)
--port NGSL_GATEWAY_PORT8737Local port for the hook (127.0.0.1 only)
--no-hook-endpointDo not open the local port

What it detects, and what it does not

  • Personal data: e-mail addresses, telephone numbers and US-style national ID numbers, by pattern. Names, postal addresses and other identifiers are not detected.
  • Harmful text: a TF-IDF and logistic-regression classifier trained on ToxicChat, real prompts to a public chatbot labelled by people. On held-out ToxicChat messages it catches about 6 in 10 harmful messages with a precision of about 0.78; it is a light first line of defence, not a complete safety system, and it was trained on English.
  • The screen passes on 95% of harmful messages in validation and sends about 31% of ordinary traffic to the classifier.

Use it alongside, not instead of, your organisation's own data-protection controls.

Background

The gateway comes from an MSc project that measured how far governance checks fall behind fast automated decisions as load grows. Checking everything collapses at full capacity: on real chatbot traffic it stopped meeting its target at 77% of capacity. The deadline rule held to 1.06, and the screen plus the deadline rule to 1.44, while keeping the privacy check on time.

Prabhu, T. S. (2026). Quantifying "Governance Speed Lag" (GSL) in Agentic AI Ecosystems: A simulation-based framework for self-adaptive real-time data compliance. MSc Data Science project, VIT.

Source and issues

https://github.com/tanishq-ctrl/governance-gateway

Licence

Code: MIT. The bundled models and workload data are derived from ToxicChat and are for non-commercial use only (CC BY-NC 4.0); see LICENSE-DATA.md.

Source: README.md at commit 16b8067

Tools

5

check_message

Check a text before acting on it: format, personal data (always) and safety (if time allows). Returns the verdict ('allow', 'redact' or 'block'), the reasons, the redacted text when personal data was found, whether the safety classifier ran, and the timing against the deadline. The original text is never echoed back.

Parameterstextrequireddeadline_ms

governance_status

Requests handled so far: verdicts, lag (mean, p95), share on time, share skipped.

Takes no parameters.

decision_matrix

Which checking policy a pipeline needs at a given mean load (the project's decision matrix). traffic: 'even', 'random' or 'bursty'. peak_factor: busiest-hour ratio q (1 = steady). recall: the detector's recall with no queue; target: required share caught in time; cost_share: the detector's share of checking cost; load: mean arrivals ÷ capacity.

Parametersloadrecalltargettrafficcost_sharedeadline_mspeak_factor

simulate_load

Race 'check everything' against the deadline-aware guard with measured check costs. traffic: 'steady', 'rush_hour' or 'real_chatbot' (real WildChat timings). Returns, for each guard, the final lag, harmful messages caught in time, the share of PII checks on time and the share of classifier checks skipped.

Parametersloadseedsecondstrafficdeadline_ms

recent_decisions

The latest governance decisions, newest last: source, verdict, kinds of personal data found, whether the classifier ran, and timing. The checked text is never included.

Parameterslimit

Version history

1
  1. v0.1.1LatestOct 29, 2026

Score

80% of the applicable checks met

How complete this listing is, computed from the registry entry, the endpoint and public sources. Not a rating of the server and not a statement that it is safe or working today: reachability is a dated check, and no installs or reviews go into the score.

  • Reached in the last 30 days25 pts
  • Auth declared10 pts

    Declare the credential headers in the registry entry, or keep the endpoint answering the probe so its auth can be classified.

  • Tools listedRequired15 pts
  • DescriptionRequired15 pts
  • Logo10 pts
  • Documentation15 pts
  • License10 pts

    Declare a license in the repository or the registry entry.