Gatewerk
OfficialEnables CrewAI agents to submit review requests and receive human decisions via the Gatewerk Python SDK.
Enables LangChain agents to submit review requests and receive human decisions via the Gatewerk Python SDK.
Enables LangGraph agents to submit review requests and receive human decisions via the Gatewerk Python SDK.
Integrates with Make via REST API and webhooks, allowing scenarios to create review requests and handle decisions.
Integrates with n8n via REST API and webhooks, allowing workflows to create review requests and handle decisions.
Enables the OpenAI Agents SDK to submit review requests and receive human decisions via the Gatewerk TypeScript or Python SDK.
Enables the Vercel AI SDK to submit review requests and receive human decisions via the Gatewerk TypeScript SDK.
Integrates with Zapier via REST API and webhooks, allowing workflows to create review requests and handle decisions.
Gatewerk
The open source review layer for AI agents.
One inbox where your agents' actions stop and wait for a person. Review the exact payload, edit it, decide. Every decision on the record.
Your AI agent drafts an email, generates a report, or initiates a transaction. Before it reaches the real world, a human reviews it in a structured form, edits what needs fixing, and sends the decision back. The agent learns from what humans changed.
Works with any agent framework. Self hosted. Open source (AGPL-3.0; client SDKs are Apache-2.0). See LICENSING.md.
Why Gatewerk?
Your agents act for you: they send the proposals, run the campaigns, handle the invoices, write the replies. Before an action leaves the building, a human should decide. Gatewerk is the review layer between your agents and the real world. Human judgment enters the pipeline, exactly where you choose.
Structured review forms: not just "approve/deny", but rich templates with editable fields.
Feedback memory: agents query past decisions to improve over time
Self hosted: your server, your data, no SaaS dependency
Protocol first: works with any agent framework via REST API, TypeScript/Python SDKs, or MCP
Related MCP server: MIDAS
Use Cases
Before Sending
Email drafts, customer support replies, Slack messages, SMS campaigns, outreach to candidates, proposals to clients
Before Executing
Code deployments, database migrations, financial transactions, infrastructure changes, API calls to third-party services
Before Publishing
Blog posts, social media content, ad campaigns, product listings, documentation updates, press releases, reports
Before Approving
Expense reports, refund requests, access permissions, contract terms, insurance claims, purchase orders
Between the gates, agents can also bring you the judgment calls: classify the edge case, pick the path, resolve the exception. Gatewerk makes human judgment callable: agents ask a structured question, you answer typed, and the pipeline continues.
How It Works
sequenceDiagram
participant Agent
participant API as Gatewerk API
participant Reviewer as Reviewer Dashboard
participant Webhook as Agent via webhook
Agent->>API: POST /reviews (template + payload)
API->>Reviewer: Review appears in inbox
Reviewer->>API: Approve / Reject / Edit
API->>Webhook: Decision + edited payload
Webhook->>Agent: Deliver decision
Agent->>API: GET /feedback (learn from past decisions)Works With Any Agent Framework
Gatewerk is protocol-first, not framework-specific. Your agent framework already has a way to make HTTP calls or use MCP: that's all you need.
Framework | Integration Path |
LangChain / LangGraph | Python SDK |
CrewAI | Python SDK |
AutoGen / Semantic Kernel | Python SDK |
OpenAI Agents SDK | TypeScript or Python SDK |
Vercel AI SDK | TypeScript SDK |
Claude / Cursor / Windsurf | MCP Server |
n8n / Make / Zapier | REST API + Webhooks (n8n community node published as |
Dify | REST API |
Custom agents | REST API, TypeScript SDK, Python SDK, or MCP |
A review, not a yes/no ping
Without a review layer, every agent grows its own approval hack: a Slack button here, a weekend dashboard there, a shared sheet nobody audits. You end up building the same thing over and over, once per workflow. Gatewerk is that layer built once, properly:
Structured forms: Reviewers see rich templates with text, markdown, JSON, images, not a yes/no dialog
Edit in place: Reviewers fix the agent's output directly, not just reject it
Built for more than one human: chains route multi-step approvals, reviews are claimed and reassigned, and the record shows exactly who decided what
Feedback loop: Agents query past decisions via API to improve over time
Suggested vs Approved: Every field tracks what the agent proposed vs what the human approved, so agents learn exactly what changed
Audit everything: HMAC-signed immutable log of every action, included free
Your infrastructure: Self-hosted, open source (AGPL-3.0), no vendor lock-in
Quick Start
1. Start Gatewerk
Docker is the supported path. quickstart.sh writes a .env with freshly generated secrets, pulls the published images, applies migrations, seeds demo data, and waits until the API is healthy.
git clone https://github.com/gatewerk/gatewerk.git
cd gatewerk
./scripts/quickstart.shDashboard: http://localhost:8880
API: http://localhost:3100
Requirements: Docker and openssl. Nothing else. The images are multi-arch, so amd64 and arm64 both pull prebuilt.
To compile the images from this checkout instead of pulling them, run ./scripts/quickstart.sh --build.
To run the API and dashboard from source with pnpm and hot reload, see Contributing.
2. Log in and create an API key
Open the dashboard and log in with the seed admin account:
Email:
admin@gatewerk.localPassword:
admin123
On first login the dashboard will prompt you to change the password: pick something secure.
The seed script (packages/db/src/seed.ts) also creates a default project, 6 starter templates (Proposal Review, Email Review, Code Deploy, Content Approval, Expense Report, Customer Reply), and a default API key. The raw key is printed once, by the seed container. Read it back with:
docker compose logs gatewerk-seedSave that key if you want to skip the next step. It starts with gwk_.
To create a fresh API key from the dashboard, navigate to Settings → Project → API Keys, click New, scope it for your agent, and copy the value. The raw key is shown only once. Use it wherever you see YOUR_API_KEY below.
3. Create a Template
Templates define what gets reviewed. Create one via the dashboard or API:
curl -X POST http://localhost:3100/api/v1/templates \
-H "Authorization: Bearer YOUR_API_KEY" \
-H "Content-Type: application/json" \
-d '{
"slug": "quickstart-email-review",
"name": "Email Review",
"instructions": "Check tone and accuracy before approving.",
"fields": [
{ "name": "subject", "type": "text", "label": "Subject", "editable": true },
{ "name": "body", "type": "markdown", "label": "Body", "editable": true },
{ "name": "recipient", "type": "text", "label": "To", "readonly": true }
],
"actions": ["approve", "reject", "request_changes"],
"default_priority": "normal",
"timeout_seconds": 86400,
"timeout_action": "expire",
"auto_approve": false
}'The three action types are approve, reject, and request_changes (non-terminal, requires reviewer feedback). Inline editing happens automatically on any field with "editable": true, there is no separate "edit" action. Actions can also be declared as { type, label, value } objects for custom button labels.
4. Send a Review Request
Both SDKs and the MCP server are published. Install them with npm install gatewerk, pip install gatewerk, or npx @gatewerk/mcp. No build from source required.
The two mechanisms for delivering decisions back to your agent are distinct:
callback_url(per-review, used below): a one-shot HTTP destination attached to a single review. Fires the three event types documented in step 5.Project-level webhooks (in Settings → Webhooks): event subscriptions that fire across all reviews in a project. Use these when you have one agent/service receiving decisions for many reviews.
Pick one, or use both. The payload shape is identical.
TypeScript:
import { createClient } from "gatewerk";
const gw = createClient({
apiKey: "gwk_...",
url: "http://localhost:3100",
});
const { data, error } = await gw.reviews.create({
template: "quickstart-email-review",
payload: {
subject: "Q1 Report",
body: "Revenue grew 23% YoY...",
recipient: "ceo@company.com",
},
callback_url: "https://example.com/webhook",
priority: "high",
});Python:
from gatewerk import create_client
gw = create_client(api_key="gwk_...", url="http://localhost:3100")
review = gw.reviews.create(
template="quickstart-email-review",
payload={
"subject": "Q1 Report",
"body": "Revenue grew 23% YoY...",
"recipient": "ceo@company.com",
},
callback_url="https://example.com/webhook",
priority="high",
)MCP (for Claude, Cursor, Windsurf, etc.):
{
"mcpServers": {
"gatewerk": {
"command": "npx",
"args": ["@gatewerk/mcp"],
"env": {
"GATEWERK_URL": "http://localhost:3100",
"GATEWERK_API_KEY": "gwk_..."
}
}
}
}5. Receive the Decision
When a reviewer acts on a review, Gatewerk POSTs one of three event types to your callback_url:
review.decided: reviewer approved or rejected (terminal; may include edits)review.retried: reviewer requested changes and sent feedback (non-terminal; your agent regenerates and submits a new version)review.expired: timeout reached with no decision (terminal)
Example review.decided payload:
{
"type": "review.decided",
"review_id": "gw_rev_abc123",
"decision": "edited",
"decided_at": "2026-03-11T10:30:00Z",
"was_edited": true,
"suggested_value": { "subject": "Q1 Report", "body": "Revenue grew 23% YoY..." },
"approved_value": { "subject": "Q1 2026 Report", "body": "Revenue: $4.2M (+23% YoY)..." },
"reviewer": "alice@company.com",
"feedback": "Improved title and added specific numbers",
"action_value": "approve",
"action_label": "Approve",
"auto_approved": false
}The decision field is one of approved | rejected | edited | retried | expired. action_value and action_label carry the exact button the reviewer clicked (useful for custom action labels). auto_approved: true indicates the review was auto-approved by template config rather than a human.
Action → decision mapping:
Reviewer action (template action type) | Resulting |
|
|
|
|
|
|
|
|
timeout reached, no decision |
|
Retry round-trip (for review.retried): your agent receives feedback → regenerates output → calls PUT /api/v1/reviews/:id with the new payload → review returns to the reviewer's inbox as a new version.
Requests are signed with HMAC-SHA256. Two signature headers are sent on every delivery:
X-Webhook-Signature: sha256=<hex>: v1 legacy envelope,hex = HMAC(body, secret). Simple to verify; does not prevent replay.X-Webhook-Signature-V2: t=<unix-seconds>,v1=<hex>: v2 replay-safe envelope,hex = HMAC(\${t}.${body}`, secret). Verifyt` is within your freshness window (commonly ±300s), then recompute the hex and constant-time compare.
Receivers that care about replay protection should parse v2, enforce a freshness check on t, and compare against v1 within the v2 header. Receivers who only need authenticity may stay on v1 indefinitely: the v1 header is unchanged since v1.0.
Other headers: X-Webhook-Event (event type), X-Webhook-Id (stable idempotency key across retries; use it for receiver-side dedup), X-Request-Id (correlation). Deliveries retry with exponential backoff; after 5 failures the delivery is marked failed.
6. Learn from Feedback
Agents query past decisions to improve:
const { data } = await gw.feedback.query({
template: "quickstart-email-review",
outcome: "edited",
limit: 10,
});
// data.data contains past reviews with suggested vs approved values
// Use this to improve future outputsFeatures
Feature | Description |
Review Templates | Schema-driven forms with text, markdown, JSON, image, number, boolean, select fields |
Rich Actions | Three action types ( |
Feedback Memory | Agents query historical decisions via API |
Webhook Notifications | Event-driven webhooks with HMAC-SHA256 signing |
Audit Trail | HMAC-signed immutable log of every action |
Priority Routing | Low / normal / high / critical with visual indicators |
Timeout Policies | Auto-approve, auto-reject, or expire after deadline |
Review Versioning | Agent submits updated versions after retry feedback |
Chains | Multi-step approvals: each step is its own review, assigned to a user, a role, or an external signer |
Decisions by link | Share one review by expiring link; a client or outside counsel decides with no account and no seat |
Team inbox | Invite teammates with roles; claim, release, and reassign reviews so ownership is always explicit |
MCP Server | Works with Claude, Cursor, Windsurf, and any MCP-compatible agent |
TypeScript SDK |
|
Python SDK |
|
Self-Hosted |
|
Architecture
apps/
api/ — Express API (REST endpoints, webhook delivery, timeout worker)
web-next/ — React dashboard (review inbox, forms, settings, metrics)
packages/
db/ — Drizzle ORM (PostgreSQL schema)
sdk-ts/ — TypeScript SDK (npm: gatewerk)
sdk-py/ — Python SDK (pip: gatewerk)
mcp/ — MCP server (npx @gatewerk/mcp)
n8n-nodes-gatewerk/ — n8n community node (npm: n8n-nodes-gatewerk)
shared/ — HRP protocol types, ID generator, error classes
docker/ — Dockerfiles, nginx, composeAPI Overview
All resources use prefixed IDs (gw_rev_, gw_tpl_, gw_prj_) and consistent response envelopes.
Core endpoints:
Method | Endpoint | Description |
|
| Create a review request |
|
| List reviews (filterable) |
|
| Get review details |
|
| Submit a decision, body: |
|
| Request retry with feedback |
|
| Update review (new version) |
|
| Query past decisions |
|
| List/create/update/delete templates |
|
| Query audit log |
|
| Review metrics |
Management endpoints (dashboard session auth):
Method | Endpoint | Description |
|
| CRUD + rotate API keys |
|
| CRUD project-level webhook subscriptions |
|
| CRUD notification channels |
|
| Reveal + rotate HMAC signing secret |
|
| Invite + manage team members |
Full OpenAPI spec at /api/v1/openapi.json. Postman collection at /api/v1/postman.json.
Configuration
Key environment variables (see .env.example for the full list, including log level, rate limits, media storage paths, and cloud-mode toggles):
Variable | Default | Description |
|
| PostgreSQL connection string |
|
| Secret for webhook HMAC signing. Rotate via |
|
| Secret for reviewer session tokens |
|
| CORS origin for the dashboard |
|
| API server port |
Fixed defaults (not env-configurable today):
Review timeout:
86400s(24h) default, configurable per template (timeout_seconds).Webhook retries: 5 attempts with exponential backoff; terminal failure marks the delivery failed. (Alert notifications fire only for failed
review.vetoedandreview.confirmeddeliveries, where a lost decision has agent-side consequences.)Payload size limit: 1 MB per webhook delivery; larger bodies are truncated with
review_urlincluded.
HRP Protocol
Gatewerk implements the Human Review Protocol (HRP): an open specification for agent-to-human communication. The protocol defines how agents request reviews, how humans respond, and how decisions flow back.
Read the draft spec: docs/protocol/hrp-v1.md
Philosophy
Work done for humans is decided by humans.
Agents draft, execute, route, and carry. That is the operational load, and agents should take as much of it as you trust them with. The decision, and the ownership that comes with it, stays human. Gatewerk is the review layer where a human decides before an agent's action reaches the world.
Three commitments follow:
Framework and platform agnostic. The belief is about humans and decisions, not about any AI vendor or stack. Gatewerk works with every agent framework and depends on none.
Open source. An audit trail you cannot inspect is marketing. The record of your judgment lives on your infrastructure, under a license that keeps it open.
Decision points designed by a human and decided by a human. You choose where judgment enters the pipeline, and you exercise it. A human decides, never a model.
The full doctrine: docs/philosophy.md.
Licensing
The server and dashboard are AGPL-3.0-only; the client SDKs are Apache-2.0; ee/ is proprietary. Self-hosting for your own use is unrestricted. See LICENSING.md.
Contributing
We are not yet accepting external contributions to the AGPL-licensed server; issues and discussion are very welcome.
Running from source gives you hot reload on both the API and the dashboard. Postgres still comes from Docker; everything else runs on your machine.
# Development setup
git clone https://github.com/gatewerk/gatewerk.git
cd gatewerk
cp .env.example .env
pnpm install
docker compose -f docker/docker-compose.dev.yml up -d # PostgreSQL only
ln -sf ../../.env apps/api/.env # Share root .env with the packages that
ln -sf ../../.env packages/db/.env # need it: API server and drizzle-kit
pnpm --filter @gatewerk/db run push # Apply schema
cd packages/db && bun run src/seed.ts && cd ../.. # Seed demo data and print an API key
pnpm run dev # Start API + dashboardDashboard: http://localhost:5174
API: http://localhost:3100
Tests: pnpm -r test
The empty ee/ directory
ee/ is a git submodule pointing at a private repository that holds the
commercial hosted-service code. After a normal git clone it is an empty
directory, and that is the expected state.
You do not need it. Everything above (install, typecheck, lint, tests, both
Docker images) is built and tested without it, and CI runs that way on every
push so it stays true. Do not run git clone --recurse-submodules; the
submodule is private, so that will just fail on authentication.
License
The server and dashboard are AGPL-3.0-only. Client SDKs (sdk-ts, sdk-py, mcp, n8n-nodes-gatewerk) are Apache-2.0. The ee/ submodule is proprietary and lives in a separate private repository. See LICENSING.md for details.
Leveraged Claude Code.
Available Tools
18 toolsgatewerk_create_noteA
Create a note. api_key callers MUST set is_shared=true (or omit; default is true) — private notes are session-only. Notes can be pinned to one or more review/template/chain_run targets via attachments[].
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | Note body (Markdown supported) | |
| tags | No | Tags for categorization (e.g., ['risk', 'follow-up']) | |
| is_shared | No | Whether the note is visible to other reviewers. Default true. api_key subjects MUST leave true (private notes are session-only). | |
| project_id | No | Project ID. session callers must pass; api_key callers may omit (server resolves from the key). | |
| attachments | No | Targets to pin this note to on creation |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses key behavioral traits like session-only private notes and mandatory is_shared for api_key callers, but omits return values, potential errors, or permission requirements.
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 concise and front-loaded: three short sentences covering purpose, critical constraint, and attachment capability. Every sentence adds value with no redundancy.
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?
For a create tool with no output schema, the description explains the core functionality and key constraints but does not mention the return value or error handling. It is adequate but leaves some gaps.
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 coverage is 100% with detailed descriptions for all parameters. The description adds a summary of constraints but does not go beyond the schema's already thorough parameter documentation.
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 'Create a note' and adds distinguishing details about shared vs. private notes and attachment targets, differentiating it from sibling tools like list_notes. The verb and resource are specific.
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?
The description provides essential usage context, such as api_key callers needing is_shared=true and the ability to pin notes via attachments, but it does not explicitly mention when to use this tool over alternatives or any exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_create_reviewA
Submit a review request for human oversight. Returns the created review with its ID and status.
| Name | Required | Description | Default |
|---|---|---|---|
| payload | Yes | Data fields matching the template schema. Call gatewerk_list_templates first to discover the field names and types for your chosen template. | |
| timeout | No | Auto-expiry policy | |
| assignee | No | Assign to specific reviewer (email) | |
| metadata | No | Arbitrary metadata for agent context | |
| priority | No | Review priority | |
| template | Yes | Template slug (e.g., 'email-review', 'code-deploy') | |
| callback_url | No | Webhook URL to receive the review decision. Optional — agents using MCP often don't have a webhook and can poll gatewerk_get_review or wait for tool re-invocation. | |
| idempotency_key | No | Unique key scoped to the project. A second call with the same key returns the existing review instead of creating a duplicate. Useful for LangGraph node replays and agent retries. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It discloses that the tool creates a review request and returns its ID and status, and that it is for human oversight. However, it does not mention potential side effects, asynchronous behavior, or that the review may require polling. The schema covers idempotency and timeout, but the description itself adds only minimal context.
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 two short sentences with no filler, front-loading the core action and return value. It is appropriately concise and easy to parse.
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 the tool's complexity (8 parameters, nested objects, idempotency, timeout, callbacks) and no output schema, the description is too brief. It does not explain the typical review workflow (e.g., list templates, create, then get/decide) or what happens after submission. The schema helps, but the description alone does not orient the agent sufficiently.
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?
All 8 parameters have schema descriptions (100% coverage), so the baseline is 3. The tool description adds no parameter-specific information; it only states the return value. The schema already provides rich context such as calling list_templates for payload fields.
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 verb 'Submit' with resource 'review request' and purpose 'human oversight'. It distinguishes from sibling tools by implying creation vs querying/acting (e.g., get_review, decide_review).
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?
The description implies usage when human oversight is needed, but it does not explicitly mention when to use this tool versus alternatives. It lacks exclusions or references to related workflow steps like polling with get_review. The schema mentions calling list_templates first, but the description itself provides no such guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_create_templateA
Define a new review template with form fields and available actions.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Human-readable template name | |
| slug | Yes | URL-safe identifier (lowercase, hyphens, e.g., 'invoice-approval') | |
| fields | Yes | Form fields for the review | |
| actions | Yes | Available actions (e.g., ['approve', 'reject', 'edit']) | |
| description | No | What this template is used for | |
| default_priority | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, and the description does not disclose any behavioral traits such as whether duplicate slugs are overwritten, validation rules, or side effects of creation. This leaves the agent without information about the operational consequences.
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 single, front-loaded sentence with no filler or redundant detail. It communicates the core purpose efficiently.
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?
Despite the schema covering parameters well, the description lacks context about the creation process, potential errors, return values, or implications of nested field structures. For a create tool with 6 parameters and no annotations, the description is too brief to be fully complete.
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 83%, so the schema already documents most parameters. The description only mentions 'form fields and available actions', which adds no new semantics beyond what the schema provides.
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 uses a specific verb 'Define' with a clear resource ('new review template') and mentions key contents ('form fields and available actions'). This clearly distinguishes it from siblings like gatewerk_update_template and gatewerk_list_templates.
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?
The phrase 'Define a new review template' clearly indicates this is for creating a new template, providing clear context. However, it does not explicitly state when not to use it or name alternative tools like update_template for modifications.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_decide_reviewA
[Deprecated; use gatewerk_take_review_action for templates with custom actions] Submit a decision on a pending review. Supports approve, reject, edit (with modified payload), or retry (request changes with feedback).
| Name | Required | Description | Default |
|---|---|---|---|
| decision | Yes | Decision outcome | |
| feedback | No | Feedback or reason for decision | |
| reviewer | No | Reviewer identity (auto-filled from GATEWERK_REVIEWER if set) | |
| review_id | Yes | Review ID to decide on | |
| prompt_edit | No | Suggested prompt improvement for the agent | |
| edited_payload | No | Modified payload (required for 'edited' decision) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are present, so the description carries the full burden. It discloses the deprecated status and high-level behaviors (approve, reject, edit with modified payload, retry with feedback), but omits side effects, permissions, and response handling. This adds some context beyond the schema but not complete behavioral disclosure.
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 single compact sentence with a deprecation prefix. It is highly concise, front-loads the critical warning, and every phrase contributes meaning.
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?
The tool has 6 parameters, a nested object, and no output schema, yet the description provides only a high-level overview and a redirect to the successor. Deprecation mitigates the need for full detail, but for an active tool this would be incomplete. It does not explain return values or error behavior.
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 coverage is 100% with detailed parameter descriptions. The tool description adds only slight mapping between decision types and parameters (e.g., 'retry' implies feedback), but this is also inferable from the schema. The description provides no substantive extra parameter meaning.
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 submits a decision on a pending review and enumerates the supported decision types (approve, reject, edit, retry). The deprecation prefix explicitly names the successor tool, gatewerk_take_review_action, distinguishing it from siblings.
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?
The deprecation notice provides explicit guidance to use gatewerk_take_review_action for templates with custom actions, which is a clear when-to-use alternative. It lacks further context on legacy usage, but for a deprecated tool this is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_delete_templateA
Remove a template. Existing reviews using this template are not affected.
| Name | Required | Description | Default |
|---|---|---|---|
| template_id | Yes | Template ID to delete (gw_tpl_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It adds the key behavioral detail that existing reviews using the template are not affected, which is valuable context for a delete operation. However, it does not mention irreversibility, permissions, or response behavior.
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 consists of two short sentences, the first stating the action and the second a caveat. No unnecessary words are present.
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 the simple single-parameter delete operation, the description covers the main functional purpose and the critical side-effect regarding existing reviews. It could mention irreversibility, but the provided information is sufficient 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 fully documents the single parameter template_id with its format (gw_tpl_...). The description does not add additional semantic detail beyond the schema, so a baseline of 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 uses the specific verb 'Remove' with the resource 'a template', making the action unambiguous. It also states that existing reviews are unaffected, which distinguishes this from potential related operations on templates.
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?
The description does not explicitly state when to use this tool over alternatives like gatewerk_update_template or gatewerk_create_template. The usage is implied by the tool name and sibling context, but no direct guidance or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_get_chain_for_reviewA
Get chain context for a review. Returns the parent chain run plus current_step_number — useful to discover whether a review is part of a chain and what step it represents. Returns 404 if the review is not part of a chain.
| Name | Required | Description | Default |
|---|---|---|---|
| review_id | Yes | Review ID (gw_rev_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It discloses the return payload (parent chain run plus current step) and the 404 error condition for non-chain reviews. For a simple read-only getter, this is adequate, though it does not mention authentication or rate limits.
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 two sentences, front-loaded with the core purpose, and contains zero filler. Every sentence adds value: the first defines the operation, the second explains the return value and error behavior.
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?
For a simple one-parameter getter with no output schema, the description is complete: it states what is returned, the error case, and the primary use case. No critical operational details are missing, and the low complexity means this level of detail is fully sufficient.
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% coverage for the single parameter (review_id) with a clear description 'Review ID (gw_rev_...)'. The tool description adds no extra semantic detail about the parameter, but the schema is sufficient, so the baseline of 3 applies.
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 uses a specific verb+resource construction: 'Get chain context for a review,' clearly distinguishing it from siblings like get_review (which retrieves review details) and get_chain_run (which retrieves chain details). It further clarifies what is returned (parent chain run plus current_step_number), leaving no ambiguity about its purpose.
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?
The description states the intended use case ('useful to discover whether a review is part of a chain and what step it represents'), providing clear context. However, it does not explicitly name alternative tools or provide exclusion conditions, so it stops short of full when/when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_get_chain_runA
Fetch a chain run by ID. Returns the run's status, mode, rejection_policy, and the full steps[] array (each with review_id, status, and dependency wiring).
| Name | Required | Description | Default |
|---|---|---|---|
| chain_run_id | Yes | Chain run ID (gw_chain_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Since no annotations are provided, the description carries the full burden. It transparently discloses the return structure (status, mode, rejection_policy, steps[] with review_id, status, dependency wiring), which goes beyond the schema. It does not mention error behavior or permissions, but for a read operation this is adequate.
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 two concise sentences, front-loaded with the action and followed by return details. Every word adds value, with no redundancy or filler.
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?
For a simple one-parameter getter, the description explains the return payload well, compensating for the lack of an output schema. It lacks explicit differentiation from similarly named siblings, but the fundamental retrieval context is complete.
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% and the parameter chain_run_id is documented with type and format hint (gw_chain_...). The description does not add extra semantics, but with full schema coverage the baseline of 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 uses a specific verb ('Fetch') and resource ('chain run by ID'), clearly stating what the tool does. It distinguishes from sibling tools like gatewerk_get_chain_for_review and gatewerk_get_review by focusing on the chain run ID lookup.
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?
No guidance is given on when to use this tool versus alternatives. The description only states the action and return information, leaving the agent to infer usage from the name with no exclusions or alternative recommendations.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_get_reviewA
Get full review details by ID, including payload, status, decision, feedback, and template metadata (field labels, types, editable flags, and available actions). Use this to present structured review forms in conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| review_id | Yes | Review ID (gw_rev_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Without annotations, the description carries the behavioral burden. The verb 'Get' implies a read-only operation, and the listed contents plus the presentation use case clarify that no mutation occurs. It does not explicitly address auth or errors, but these are less critical for a one-ID getter.
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 compact: one sentence stating scope and contents, one sentence giving a use case. No redundant phrases or filler.
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?
For a tool with one parameter and no output schema, the description provides a good overview of return contents and a practical use case. It could detail response structure more, but the enumerated elements offer adequate context for invocation.
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 fully documents the single 'review_id' parameter with a format hint (gw_rev_...). The description does not add further parameter semantics beyond referring to it as 'by ID', so the baseline 3 applies.
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's function: 'Get full review details by ID' and enumerates the included elements (payload, status, decision, feedback, template metadata). This distinguishes it from sibling tools like query_feedback or list_review_actions, which likely target subsets.
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?
Includes explicit usage instruction: 'Use this to present structured review forms in conversation.' This indicates the intended scenario, though it does not mention exclusions or specific alternatives. The sibling tool names imply specialized alternatives, so the guidance is sufficient.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_get_statsA
View review metrics: total count, breakdown by status/decision, average review time, per-template counts, and daily trend (last 30 days).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of disclosing safety and behavior. 'View' implies a read-only operation, but it is not explicitly stated as non-destructive. The description does describe the output behavior (metrics) but omits any caveats like timezone handling, status limitations, or whether the data is pre-aggregated or computed on demand.
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 single, concise sentence (about 25 words) that front-loads the purpose ('View review metrics') and then lists the specific metrics in a clear, scannable sequence. Every word earns its place, and there is no redundant information.
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?
For a zero-parameter, read-only stats tool with no output schema, the description provides a sufficient overview of the return content. It lists all the metric dimensions, which is enough for an agent to know what to expect. It does not specify the exact response shape or edge cases, but given the tool's simplicity, it is nearly complete.
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 tool has zero parameters, and the schema coverage is trivially 100% (empty object). Per the rubric, 0 params baseline is 4. There are no parameter details needed, so the description does not need to add any param semantics beyond what the empty schema already communicates.
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 specifies the tool's function with a specific verb ('View') and resource ('review metrics'), and enumerates the exact metrics returned (total count, breakdown, average time, per-template counts, daily trend). This distinguishes it from sibling tools that handle individual reviews, templates, or actions.
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?
The description implies the tool is for aggregated overview rather than detailed individual data, but it does not explicitly state when to use it over alternatives like list_reviews or get_review. There are no exclusions or alternative tool mentions, so the usage context is only implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_list_notesA
List notes visible to the caller within a project. Filter by author, tags, target (attached_to_kind + attached_to_id), shared/private, or has_attachments. Supports cursor pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| tags | No | Filter to notes that include any of these tags | |
| limit | No | Max results per page | |
| cursor | No | Pagination cursor from a prior response | |
| author_id | No | Filter to notes by a specific author | |
| is_shared | No | Filter shared (true) or private (false) | |
| project_id | Yes | Project ID to scope the listing | |
| attached_to_id | No | Filter to notes pinned to this specific target ID | |
| has_attachments | No | Filter notes that have/lack attachments | |
| attached_to_kind | No | Filter to notes pinned to this target kind |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses that only notes visible to the caller are returned and supports cursor pagination, which are useful behaviors. However, it does not explicitly state read-only safety, permissions, or response shape, leaving some gaps.
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?
Two concise sentences: first states the core purpose and scope, second enumerates filters and pagination. Every word contributes, with no redundancy or 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?
Given 9 parameters and no output schema, the description covers the main usage (filters + pagination) and clarifies the tool's scope. It omits return value structure and ordering, but for a list tool this is a reasonable trade-off given schema descriptions.
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 coverage is 100%, so baseline is 3. The description adds semantic grouping (e.g., 'target' as attached_to_kind + attached_to_id) and lists filter categories, which goes beyond the schema's individual parameter descriptions.
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's verb ('List') and resource ('notes visible to the caller within a project'). It also lists filters and pagination, which distinguishes it from sibling listing tools like list_reviews and list_templates.
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 implies when to use this tool (to list notes with optional filters) but does not explicitly state when not to use it or name alternatives. The context is clear enough for an agent to select it for note-listing tasks.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_list_review_actionsA
Introspect the configurable actions available on a review's template. Returns the review's canonical TemplateActionConfig[] (action.id, label, kind, decision_value, enabled_for_status, requires_feedback, confirmation, expose_to_recipient, style, description, webhook_event). Use before gatewerk_take_review_action to choose a valid action_id.
| Name | Required | Description | Default |
|---|---|---|---|
| review_id | Yes | Review ID (gw_rev_...) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden for behavior. It discloses the non-mutating nature via the verb 'Introspect' and specifies the exact return structure (canonical TemplateActionConfig[] and its fields). While it doesn't explicitly mention authorization or side effects, the introspective verb and detailed output description provide significant behavioral context.
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 two concise sentences. The first states the primary purpose; the second lists the return fields and provides a critical usage hint. Every sentence earns its place, and the structure is front-loaded with the core function.
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 the tool's simplicity (one parameter, no nested objects, no output schema) and the absence of annotations, the description is quite complete. It explains the return shape in detail (the field list) and gives usage context relative to a sibling tool. Minor gaps exist (no explicit statement of read-only, no error or authorization notes), but for an introspection tool, the description covers the essential aspects.
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 schema already fully documents the single parameter review_id with a description ('Review ID (gw_rev_...)'). The description in the tool adds some context by referring to 'a review's template', but doesn't add syntax or additional meaning beyond the schema. With 100% schema coverage, 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 uses the specific verb 'Introspect' and clearly states the resource ('the configurable actions available on a review's template'). It distinguishes itself from sibling tools by explicitly mentioning its relationship to gatewerk_take_review_action, making its purpose unmistakable.
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?
The description provides explicit usage guidance: 'Use before gatewerk_take_review_action to choose a valid action_id.' This tells the agent exactly when to invoke it and how it relates to an alternative/aspect of a subsequent tool, satisfying the when-to-use criterion and highlighting a precondition.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_list_reviewsA
List reviews with optional filters. Returns paginated list of reviews.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 20) | |
| offset | No | Pagination offset | |
| status | No | Filter by status | |
| assignee | No | Filter by assignee | |
| priority | No | Filter by priority | |
| template | No | Filter by template slug |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries full behavioral burden. It discloses that the tool returns a paginated list, which is useful, but it does not mention default limits, error behavior, or any side effects. Since this is a read-only list operation, the lack of destructive behavior is implied, but not explicitly stated.
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 two short sentences, front-loaded with the main purpose. Every word is informative and there is no redundancy or filler.
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 the tool's simplicity (list with optional filters), the description is mostly complete: it states the action, mentions filters and pagination. The high schema coverage fills in the parameter details, and no output schema exists, so describing the return as a paginated list is sufficient. However, it could briefly enumerate the filter fields for quick reference without relying solely on the schema.
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 schema already documents all six parameters. The description adds only the generic phrase 'optional filters', which does not add meaning beyond the schema. Baseline 3 is appropriate as the schema does the heavy lifting.
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 lists reviews, using the specific verb 'List' and resource 'reviews'. It also mentions optional filters and pagination, which differentiates it from sibling tools like get_review (single item) and list_review_actions (different resource).
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?
The description implies usage for browsing reviews with filters, but it does not explicitly state when to use this tool versus alternatives, nor does it mention any exclusions or prerequisites. It is clear enough for a simple list operation but lacks the explicit guidance seen in high-quality tools.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_list_templatesA
Discover available review templates. Returns all templates with their fields and actions.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden of behavioral disclosure. It clearly states the tool returns all templates with their fields and actions, implying a read-only operation with no side effects. It does not mention auth or rate limits, but for a simple list operation this is adequate.
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 two short sentences, front-loaded with the main action and followed by output details. Every word earns its place, with no unnecessary fluff or repetition.
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?
For a simple zero-parameter list tool, the description is complete. It explains what is returned (all templates with fields and actions) and is consistent with the tool's name and siblings. No output schema exists, but the description sufficiently conveys the return value's scope and content.
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 tool has zero parameters, so the schema covers everything. The description adds context about the output (fields and actions), which is useful. The baseline for zero parameters is 4, and the description meets that baseline without needing parameter details.
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 identifies the tool as retrieving review templates, using a specific verb ('Discover') and resource ('review templates'), and explicitly states it returns all templates with their fields and actions. This distinguishes it from sibling tools like list_reviews or list_notes.
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?
The description implies the tool should be used when you need to see available review templates, but it does not explicitly contrast with alternatives or note when not to use it. For a zero-parameter list tool, the intended usage is reasonably clear, but no explicit guidance or exclusions are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_query_auditA
Query the audit trail. Returns timestamped log of all actions (reviews created, decisions made, templates changed).
| Name | Required | Description | Default |
|---|---|---|---|
| to | No | End date (ISO 8601) | |
| from | No | Start date (ISO 8601) | |
| actor | No | Filter by actor — reviewer email, or 'api_key:<id>' identifier | |
| limit | No | Max results (default 20) | |
| action | No | Filter by action (e.g., 'review.created', 'review.decided') | |
| offset | No | Pagination offset | |
| resource_id | No | Filter by specific resource ID | |
| resource_type | No | Filter by resource type (e.g., 'review', 'template', 'note', 'chain_run') |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must carry the transparency burden. It does disclose that results are a timestamped log and gives examples of logged actions, but it does not mention read-only behavior, ordering, pagination, or any side effects. This is acceptable but not rich.
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 single, front-loaded sentence with no filler. It clearly conveys the core purpose and a couple of illustrative examples without waste.
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?
The tool has 8 optional parameters and no output schema, so the description needs to provide enough context. It states what is returned and the types of actions, but it omits return shape, pagination behavior, and ordering. This is adequate for a simple query tool but leaves gaps.
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%, and the schema already provides meaningful descriptions for all 8 parameters, including examples and actor identifier syntax. The description adds no parameter-specific meaning, so the baseline of 3 applies.
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 queries the audit trail and specifies the resource (audit trail) and what it returns (timestamped log of actions). It is distinct from sibling tools, none of which are audit-trail specific.
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?
The description implicitly tells when to use it (when you need the audit trail), but it does not provide explicit when-not-to-use guidance or mention alternatives. No exclusions are stated, so it meets the 'implied usage' level.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_query_feedbackA
Query past review decisions for learning. Returns decided reviews with original payload, edits, and feedback.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Max results (default 10) | |
| offset | No | Pagination offset | |
| outcome | No | Filter by decision (approved, rejected, edited) | |
| template | No | Filter by template slug |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It explicitly describes the return content ('decided reviews with original payload, edits, and feedback') and the action 'Query' implies a read-only operation. It does not discuss pagination or side effects, but for a query tool the provided detail is adequate.
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 single sentence, front-loaded with the action and purpose. Every word contributes to understanding the tool, with no redundancy or filler.
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?
For a read-only query tool with four well-documented optional parameters, the description is functionally complete. It clearly explains what is returned and the learning purpose. The absence of an output schema is mitigated by the description's summary of return contents. It could mention ordering or filter hints, but the schema covers filters.
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 applies. The tool description adds no additional meaning to the parameters themselves; it only mentions the overall return content, which does not elaborate on limit, offset, outcome, or template filters.
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 queries past review decisions and specifies the return contents: original payload, edits, and feedback. This distinguishes it from sibling tools like get_review or query_audit, which have different data scopes.
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?
The phrase 'for learning' implies an intended use case, but there is no explicit mention of when to use this tool over alternatives or when not to. No sibling tool names are referenced, leaving the guidance implicit rather than explicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_start_chain_runB
Start a chain run from a definition + initial payload. Returns the chain run object including the first step's review_id (step_1_review_id) so agents can pass it to reviewers.
| Name | Required | Description | Default |
|---|---|---|---|
| metadata | No | Arbitrary metadata for agent context | |
| definition | Yes | Chain definition (version 1.0) | |
| callback_url | No | Optional webhook URL for chain events | |
| initial_payload | Yes | Payload merged into the first step's review |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden of behavioral disclosure. While it discloses the return object and a key field (step_1_review_id), it does not explain side effects (e.g., the chain starts executing, reviewers may be notified), asynchronous behavior, validation failures, or idempotency. This is a thin disclosure for a state-changing operation.
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 single sentence, well-front-loaded with the action and purpose, with no unnecessary words. It covers the essential who, what, and why efficiently, making it easy for an agent to parse.
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?
The tool is highly complex with nested definitions, but the description gives only minimal context. It mentions the return value but does not explain overall chain execution semantics, error cases, or how to interpret the run object. With no output schema and high complexity, the description leaves significant gaps for an agent unfamiliar with the domain.
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 schema already documents all parameter meanings and the baseline is 3. The description does not add any parameter details beyond what the schema provides; it only restates that 'definition' and 'initial_payload' are used. Therefore, no additional value is contributed above the schema.
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 identifies the action ('Start'), the target resource ('a chain run'), and the required inputs ('definition + initial payload'). It also states the primary return value (step_1_review_id) and its purpose (passing to reviewers), which distinguishes it from sibling tools like get_chain_run or get_chain_for_review.
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?
The description implies when this tool is used (to initiate a chain run and obtain the first review ID) but does not explicitly mention alternatives or when not to use it. It lacks exclusionary guidance, such as pointing to get_chain_run for status checks or get_chain_for_review for reverse lookups, so it only meets the 'implied usage' bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_take_review_actionA
Invoke a configurable action on a review. Supersedes gatewerk_decide_review for templates with custom actions. Built-in action_ids: 'approve', 'reject', 'request_changes', 'cancel_iteration'. Custom action_ids are template-specific — use gatewerk_list_review_actions to introspect available actions. Supports both session and api-key (agent) authentication.
| Name | Required | Description | Default |
|---|---|---|---|
| version | No | Optimistic-concurrency guard for edited_payload submissions | |
| feedback | No | Required for actions with requires_feedback=true; optional otherwise | |
| action_id | Yes | Action identifier as configured on the template | |
| review_id | Yes | Review ID (gw_rev_...) | |
| edited_payload | No | Modified payload (for edit-on-approve flows) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the burden. It adds context about built-in vs custom actions and authentication methods, but does not disclose side effects, state changes, reversibility, or permission requirements. This is partial but not comprehensive.
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?
Four sentences are dense and purposeful, front-loading the core action and then layering usage distinctions, action_id guidance, and auth support. No wasted words.
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?
The description covers selection, alternatives, action ID resolution, and auth. It lacks response format or error behavior, but given the schema richness and sibling context, it is adequately complete for an agent to select and invoke the tool.
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 coverage is 100%, but the description enriches action_id by enumerating built-in values and pointing to introspection for custom ones. It also confirms feedback is conditional and version acts as a concurrency guard, adding value beyond the schema.
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 it invokes a configurable action on a review, with a specific verb and resource. It distinguishes from siblings by noting it supersedes gatewerk_decide_review for custom-action templates and lists built-in action IDs.
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 (templates with custom actions) and directs to gatewerk_list_review_actions for custom action IDs. It also mentions the alternative (decide_review) is superseded, providing clear guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
gatewerk_update_templateB
Modify an existing template's name, fields, actions, or priority.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| fields | No | ||
| actions | No | ||
| description | No | ||
| template_id | Yes | Template ID (gw_tpl_...) | |
| default_priority | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure. It states 'Modify' but does not explain whether the operation is a partial update or full replacement, whether unspecified fields are preserved, or what side effects may occur. It also does not mention any validation, permissions, or potential destructive aspects, leaving significant behavioral ambiguity for a mutation tool.
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 single sentence that is direct and waste-free, clearly enumerating the modifiable aspects without unnecessary elaboration. It is appropriately sized for the tool's simplicity.
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 six parameters, no output schema, and no annotations, the description is too brief to be contextually complete. It does not explain how the update behaves (e.g., whether fields replace or append), what the response looks like, or any constraints. The description leaves critical operational details unaddressed, making it inadequate for reliable invocation.
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 only 17% (only template_id has a description), so the description must compensate. It mentions name, fields, actions, and priority, but uses 'priority' while the schema parameter is 'default_priority', and it omits the 'description' parameter entirely. The description adds little semantic value beyond what the schema already shows, failing to clarify the meaning or format of the fields.
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 action ('Modify') and the resource ('an existing template'), and enumerates the fields that can be updated (name, fields, actions, or priority). This distinguishes it from sibling tools like gatewerk_create_template and gatewerk_delete_template, making the purpose unambiguous.
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?
The phrase 'an existing template' implies it is for updates rather than creation, providing some contextual guidance. However, it does not explicitly state when to choose this over alternatives, nor does it mention any prerequisites or exclusions. The usage is implied but not clearly contrasted with sibling update tools.
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.
18 tool updates
- First observed
gatewerk_create_note - First observed
gatewerk_create_review - First observed
gatewerk_create_template - First observed
gatewerk_decide_review - First observed
gatewerk_delete_template - First observed
gatewerk_get_chain_for_review - First observed
gatewerk_get_chain_run - First observed
gatewerk_get_review - First observed
gatewerk_get_stats - First observed
gatewerk_list_notes - First observed
gatewerk_list_review_actions - First observed
gatewerk_list_reviews - First observed
gatewerk_list_templates - First observed
gatewerk_query_audit - First observed
gatewerk_query_feedback - First observed
gatewerk_start_chain_run - First observed
gatewerk_take_review_action - First observed
gatewerk_update_template
TDQS
Scored across 18 tools
Each tool targets a distinct resource or operation: templates, reviews, actions, chain runs, notes, audit, and stats. The only potential overlap between decide_review and take_review_action is explicitly resolved by the deprecation note on decide_review, and the action introspection tool provides a clear guide. Even closely related tools (query_feedback vs get_review vs list_reviews) serve clearly different purposes—learning, detail, and listing.
All tools follow the consistent `gatewerk_<verb>_<noun>` pattern, with verbs like list, get, create, update, delete, query, start, take. There is no mixing of camelCase or inconsistent verb styles. The use of list vs get vs query is semantically consistent (collections, singles, and search-like queries respectively).
At 18 tools, the server is slightly above the typical 3-15 range, but the domain (review workflows with templates, actions, chains, notes, audit, and stats) justifies a broad surface. Each tool has a clear purpose, and none feel redundant. The count is manageable, especially with good naming and disambiguation.
The tool set covers the core review lifecycle completely: template CRUD, review creation/listing/detail/actions, chain run management, and audit/statistics. Minor gaps exist—notes lack update/delete, and templates lack a dedicated get-by-id (though list serves that need). Overall, no dead ends and all primary workflows can be executed.
Maintenance
Related MCP Connectors
Expert review for AI agents. On-chain proof of human review.
Pre-execution governance for AI agents. Deterministic PASS/FAIL/REVIEW verdicts, replayable proof.
Human-owned review for agent plans, rendered documents, Forms, research, and live previews.
Human-in-the-loop for AI coding agents — ask questions, get approvals via Slack.
Related MCP Servers
- AlicenseAqualityCmaintenanceOpen-source permission control plane for AI agents — scan, enforce, and audit every tool call with code-level policies that prompt injection can't bypass.1419Business Source 1.1
- AlicenseNot gradedqualityCmaintenanceLocal-first AI agent for approval-gated automation and verifiable LLM workflows.1MIT
- AlicenseAqualityAmaintenanceHuman-in-the-loop approval gateway for agent tool calls: agents request, policies decide, humans approve via Slack/Discord/web — with an OWASP-LLM-Top-10-tagged audit trail. Self-hostable.1018 npm33MIT
- AlicenseAqualityAmaintenanceHuman-in-the-loop approval inbox for AI agents: an agent proposes an action (send email, post comment, run a command), a human approves, rejects, or edits it from a web, mobile, or Slack/Discord/Telegram inbox, and the agent only runs on approval. Full audit trail, self-hostable (MIT).85MIT