Enforce AI agent API permissions, approvals and safe retries. Check the setup and audit every call.
Maintain this server? Claim it
Call this server's tools from your browser. Nothing to install.
Requests go through mcptry because browsers can't call most MCP servers directly. Header values are sent to the server for that request only and are never stored or logged.
Tool list from our last check. Connect live to refresh it.
Give one app its own key and the calls it may make. Routes are rules like "GET /orders/:id", "POST /orders", "GET /users/{user}/orders" (per-user), or example calls like "GET /orders/42", which become rules. Returns the app key (shown once).
The app name, e.g. "storefront" or "nightly sync"
Only the calls this app makes, one "METHOD /path" per item
The project admin key (ga_...). Read it from the .env; never print it.
The project id from gate_create_project, e.g. p1a2b3...
Calls per minute for this app (default 60)
This tool isn't marked read-only, so it may change something on the server or in an account you connected.
Give one app its own key and the calls it may make. Routes are rules like "GET /orders/:id", "POST /orders", "GET /users/{user}/orders" (per-user), or example calls like "GET /orders/42", which become rules. Returns the app key (shown once).
| Argument | Type | Description |
|---|---|---|
| name* | string | The app name, e.g. "storefront" or "nightly sync" |
| routes* | array | Only the calls this app makes, one "METHOD /path" per item |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| per_minute | integer | Calls per minute for this app (default 60) |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key",
"name",
"routes"
],
"properties": {
"name": {
"type": "string",
"description": "The app name, e.g. \"storefront\" or \"nightly sync\""
},
"routes": {
"type": "array",
"items": {
"type": "string"
},
"maxItems": 50,
"minItems": 1,
"description": "Only the calls this app makes, one \"METHOD /path\" per item"
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"per_minute": {
"type": "integer",
"maximum": 6000,
"minimum": 1,
"description": "Calls per minute for this app (default 60)"
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Create an approver key for the person who approves held actions (shown once). Give it to that person, never to an agent: once a project has an approver, the admin key can no longer approve.
| Argument | Type | Description |
|---|---|---|
| name* | string | Who approves, e.g. "Dana (support lead)" |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key",
"name"
],
"properties": {
"name": {
"type": "string",
"description": "Who approves, e.g. \"Dana (support lead)\""
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}The most recent calls through the gateway (time, app, matched route, status, reason, duration), newest first, with totals by status and refusal reason. Gate never stores bodies, query values or headers.
| Argument | Type | Description |
|---|---|---|
| app | string | Optional: only this app id (app_...) |
| limit | integer | How many calls (default 20) |
| status | string | Optional: only this HTTP status, e.g. "403" |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key"
],
"properties": {
"app": {
"type": "string",
"description": "Optional: only this app id (app_...)"
},
"limit": {
"type": "integer",
"maximum": 100,
"minimum": 1,
"description": "How many calls (default 20)"
},
"status": {
"type": "string",
"description": "Optional: only this HTTP status, e.g. \"403\""
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Read chained audit rows and their anchors with an HMAC-SHA256 signature. Old rows before genesis are excluded; store_audit=false projects have no chain. Row-id range, up to 10,000 rows per page; follow next_from.
| Argument | Type | Description |
|---|---|---|
| to | integer | |
| from | integer | |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key"
],
"properties": {
"to": {
"type": "integer",
"minimum": 1
},
"from": {
"type": "integer",
"minimum": 1
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Recompute a pasted export chain and project signature; returns intact or broken_at (one-based row position). Does not approve actions or change permissions.
| Argument | Type | Description |
|---|---|---|
| proof* | object | The full signed export from gate_audit_proof |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key",
"proof"
],
"properties": {
"proof": {
"type": "object",
"description": "The full signed export from gate_audit_proof"
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Read actual Gate protection settings before giving an integration production access. Reports observe-only mode, writes without mandatory runs, missing user-token configuration, wildcard grants and approval separation, with evidence, exact remedies and explicit limits. Sends no upstream requests, changes no settings and uses no gateway quota. Configuration-only: not a security certificate or runtime enforcement test.
| Argument | Type | Description |
|---|---|---|
| app | string | Optional: check one active app id (app_...) instead of all active apps |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key"
],
"properties": {
"app": {
"type": "string",
"description": "Optional: check one active app id (app_...) instead of all active apps"
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Put Odile Gate in front of an existing HTTPS API. Returns project_id, admin_key (shown once) and the gateway base URL apps call instead of the API.
| Argument | Type | Description |
|---|---|---|
| name* | string | A name for the project, e.g. "Shop API" |
| upstream* | string | The API base URL, https only, e.g. https://api.example.com/v1 |
| header_name | string | Optional: the secret header your API expects, e.g. Authorization or apikey |
| header_value | string | Optional: its value. Stored encrypted; apps never see it. |
{
"type": "object",
"required": [
"name",
"upstream"
],
"properties": {
"name": {
"type": "string",
"description": "A name for the project, e.g. \"Shop API\""
},
"upstream": {
"type": "string",
"description": "The API base URL, https only, e.g. https://api.example.com/v1"
},
"header_name": {
"type": "string",
"description": "Optional: the secret header your API expects, e.g. Authorization or apikey"
},
"header_value": {
"type": "string",
"description": "Optional: its value. Stored encrypted; apps never see it."
}
},
"additionalProperties": false
}Gate Actions: give one agent session narrow, expiring permission. Actions are rules with {placeholders} bound by scope (e.g. "PATCH /customers/{customer}/tickets/:id" with scope {"customer":"A"}), each with an optional max and approval. Returns a run token (shown once) the agent sends as x-odile-run with its app key. Writes in a run need an Idempotency-Key. Give a write a check ("GET /bookings?idempotency_key={key}") and the agent can settle a lost answer with POST /g/<id>/_gate/recover.
| Argument | Type | Description |
|---|---|---|
| app* | string | The app id (app_...) this run is for |
| label | string | Optional: what the run is for, e.g. "triage ticket 4411" |
| scope | object | Values for the {placeholders}, e.g. {"customer":"A"} |
| actions* | array | Rules, or {rule, max, approval, check} |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| max_calls | integer | Optional: calls allowed in the whole run |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
| ttl_seconds |
Hand a narrower run to another active app in the same project. Uses the parent app key and run token, never the admin key. Scope, expiry, approvals and ancestor budgets stay enforced; maximum depth five.
| Argument | Type | Description |
|---|---|---|
| app* | string | The destination app id |
| label | string | A short label for the delegated job |
| actions* | array | |
| app_key* | string | The parent app key (gk_...) |
| max_calls | integer | |
| run_token* | string | The parent run token (gr_...) |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
| ttl_seconds | integer |
{
"type": "object",
"required": [
"project_id",
"app_key",
"run_token",
"app",
"actions"
],
"properties": {
"app": {
"type": "string",
"description": "The destination app id"
},
"label": {
"type": "string",
"description": "A short label for the delegated job"
},
"actions": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"rule"
],
"properties": {
"max": {
"type": "integer",
"minimum": 1
},
"rule": {
"type": "string"
},
"approval": {
"type": "boolean"
}
}
}
]
},
"maxItems": 50,
"minItems": 1
},
"app_key": {
"type": "string",
"description": "The parent app key (gk_...)"
},
"max_calls": {
"type": "integer",
"maximum": 100000,
"minimum": 1
},
"run_token": {
"type": "string",
"description": "The parent run token (gr_...)"
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
},
"ttl_seconds": {
"type": "integer",
"maximum": 86400,
"minimum": 60
}
},
"additionalProperties": false
}What a Gate refusal means and how to fix it, from the x-gate-refused header value (e.g. route_not_allowed).
| Argument | Type | Description |
|---|---|---|
| reason* | string | The x-gate-refused value |
| recoverable | boolean | Whether the write was granted with a recovery check |
{
"type": "object",
"required": [
"reason"
],
"properties": {
"reason": {
"type": "string",
"description": "The x-gate-refused value"
},
"recoverable": {
"type": "boolean",
"description": "Whether the write was granted with a recovery check"
}
},
"additionalProperties": false
}Read normalized routes and a suggested per-minute limit from an admin-enabled, time-boxed learning session. Records only method, normalized path templates and counts per minute; no query values, raw ids, headers or bodies. Never enables learning or applies rules.
| Argument | Type | Description |
|---|---|---|
| app* | string | The app id |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key",
"app"
],
"properties": {
"app": {
"type": "string",
"description": "The app id"
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Actions waiting for approval (or in another state), with the exact call. Approving is done by a person in the dashboard, not by a tool.
| Argument | Type | Description |
|---|---|---|
| state | string | Default: pending |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key"
],
"properties": {
"state": {
"enum": [
"pending",
"approved",
"rejected",
"executed",
"unknown",
"expired"
],
"type": "string",
"description": "Default: pending"
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}The project's apps with their allowed calls, limits and state.
| Argument | Type | Description |
|---|---|---|
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key"
],
"properties": {
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Read last-24-hour stored call counts by HTTP status and reason, measured duration through response headers (including upstream wait), and separate current-month gateway usage. Project admin only. Audit may be partial: invalid-key sampling and audit-off periods are disclosed. No upstream requests, quota use or policy changes; not a health certificate or performance guarantee.
| Argument | Type | Description |
|---|---|---|
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key"
],
"properties": {
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Read call metadata, approvals and approver names, recovery outcomes and delegated children; no bodies or query values.
| Argument | Type | Description |
|---|---|---|
| before | integer | Older audit events (timeline pages have at most 500 events) |
| run_id* | string | The run id |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key",
"run_id"
],
"properties": {
"before": {
"type": "integer",
"minimum": 1,
"description": "Older audit events (timeline pages have at most 500 events)"
},
"run_id": {
"type": "string",
"description": "The run id"
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Read a run and its delegated descendants without tokens.
| Argument | Type | Description |
|---|---|---|
| run_id* | string | The run id |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key",
"run_id"
],
"properties": {
"run_id": {
"type": "string",
"description": "The run id"
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Make an app need a run: "writes" (every write needs x-odile-run), "all" (every call), or "off".
| Argument | Type | Description |
|---|---|---|
| app* | string | The app id (app_...) |
| mode* | string | |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key",
"app",
"mode"
],
"properties": {
"app": {
"type": "string",
"description": "The app id (app_...)"
},
"mode": {
"enum": [
"off",
"writes",
"all"
],
"type": "string"
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Opt-in JSON response redaction: return only explicit JSON Pointer paths, e.g. /id and /items/*/name. * matches one segment; selecting a container allows its whole subtree. Applies to every upstream response for this app, including errors. Maximum 1 MiB and 5 seconds to read; invalid/non-JSON responses are withheld. No bodies are stored. A withheld reply never reverses an upstream write. null disables filtering. Free and Pro.
| Argument | Type | Description |
|---|---|---|
| app* | string | The app id (app_...) |
| allow* | any | |
| admin_key* | string | The project admin key (ga_...). Read it from the .env; never print it. |
| project_id* | string | The project id from gate_create_project, e.g. p1a2b3... |
{
"type": "object",
"required": [
"project_id",
"admin_key",
"app",
"allow"
],
"properties": {
"app": {
"type": "string",
"description": "The app id (app_...)"
},
"allow": {
"anyOf": [
{
"type": "array",
"items": {
"type": "string",
"maxLength": 256
},
"maxItems": 32,
"minItems": 1
},
{
"type": "null"
}
]
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
}
},
"additionalProperties": false
}Make a Gate project match an odile.yaml: creates the project (if no project_id) and missing apps and approvers, applies run mode, loop and learning settings and alerts. Never revokes or deletes; differences it cannot apply (an app's routes or rate limit) come back as drift. dry_run lists the steps without changing anything. New keys are shown once.
| Argument | Type | Description |
|---|---|---|
| config* | string | The whole odile.yaml (or the same as JSON) as text |
| dry_run | boolean | List the steps without changing anything |
| admin_key | string | Its admin key (ga_...), required with project_id. Read it from the .env; never print it. |
| project_id | string | Optional: an existing project to sync |
{
"type": "object",
"required": [
"config"
],
"properties": {
"config": {
"type": "string",
"description": "The whole odile.yaml (or the same as JSON) as text"
},
"dry_run": {
"type": "boolean",
"description": "List the steps without changing anything"
},
"admin_key": {
"type": "string",
"description": "Its admin key (ga_...), required with project_id. Read it from the .env; never print it."
},
"project_id": {
"type": "string",
"description": "Optional: an existing project to sync"
}
},
"additionalProperties": false
}Parse and check a declarative Gate config (apps, routes, rate limits, run mode, plugins, alerts, approvers) without changing anything. Returns errors with their path, warnings, and the normalized config.
| Argument | Type | Description |
|---|---|---|
| config* | string | The whole odile.yaml (or the same as JSON) as text |
{
"type": "object",
"required": [
"config"
],
"properties": {
"config": {
"type": "string",
"description": "The whole odile.yaml (or the same as JSON) as text"
}
},
"additionalProperties": false
}| integer |
| How long the run lasts (default 3600) |
{
"type": "object",
"required": [
"project_id",
"admin_key",
"app",
"actions"
],
"properties": {
"app": {
"type": "string",
"description": "The app id (app_...) this run is for"
},
"label": {
"type": "string",
"description": "Optional: what the run is for, e.g. \"triage ticket 4411\""
},
"scope": {
"type": "object",
"description": "Values for the {placeholders}, e.g. {\"customer\":\"A\"}",
"additionalProperties": {
"type": "string"
}
},
"actions": {
"type": "array",
"items": {
"anyOf": [
{
"type": "string"
},
{
"type": "object",
"required": [
"rule"
],
"properties": {
"max": {
"type": "integer",
"minimum": 1
},
"rule": {
"type": "string"
},
"check": {
"type": "string",
"description": "For a write: the GET that finds it by key, e.g. \"GET /customers/{customer}/bookings?idempotency_key={key}\"; it must also be a GET action of the run"
},
"approval": {
"type": "boolean"
},
"idempotent": {
"type": "boolean",
"description": "With check: the API dedupes on Idempotency-Key, so a not-found write may be retried"
}
}
}
]
},
"maxItems": 50,
"minItems": 1,
"description": "Rules, or {rule, max, approval, check}"
},
"admin_key": {
"type": "string",
"description": "The project admin key (ga_...). Read it from the .env; never print it."
},
"max_calls": {
"type": "integer",
"minimum": 1,
"description": "Optional: calls allowed in the whole run"
},
"project_id": {
"type": "string",
"description": "The project id from gate_create_project, e.g. p1a2b3..."
},
"ttl_seconds": {
"type": "integer",
"maximum": 86400,
"minimum": 60,
"description": "How long the run lasts (default 3600)"
}
},
"additionalProperties": false
}