BriefGate
Server Details
Client intake for AI agents: request files, texts, choices and credentials from a client, chase missing items automatically, get notified when complete. Hosted Streamable HTTP endpoint with OAuth 2.1 (PKCE, dynamic client registration); the same tools as the @briefgate/mcp npm package.
- Status
- Healthy
- Uptime
- 48.9% over 27 days
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
TDQS
Scored across 13 tools
Each tool targets a distinct resource and action: creation, update, listing, retrieval, and management of intakes, items, recipients, folders, and webhooks are cleanly separated. There is no ambiguity between get_intake_status and get_intake_results, or between update_intake and update_item.
Every tool follows the same verb_noun snake_case pattern (e.g., define_intake, get_intake_results, create_folder, send_chase). While define_intake could arguably be create_intake, the verb choice is intentional and uniform across the entire set.
13 tools is well within the ideal 3-15 range for a specialized intake-management server. Each tool addresses a distinct operational need without bloat or redundancy.
The lifecycle is well covered: creation, monitoring, retrieval, revision, reminders, and recipient/webhook management are all present. The only notable gap is the absence of a delete/archive tool for intakes, though the domain may intentionally avoid destructive operations via the API.
Available Tools
13 toolsadd_itemsAdd items to an intakeAInspect
Add new items to an already-sent intake — for example, when you realise mid-project that you also need a favicon, social media assets, or additional credentials.
The client is notified about the new items. Existing items and their submitted values are not affected. Returns the updated intake object.
Items must follow the same key/type/label rules as define_intake (snake_case keys, type-specific constraints).
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | New items to add. Same schema as define_intake items. | |
| intake_id | Yes | Intake ID returned by define_intake. |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | No | |
| status | No | |
| folder_id | No | |
| follow_up | No | How to learn this intake is done — present unless a webhook already covers it. Mirrors FollowUpAdvice in client.ts. |
| intake_id | No | |
| portal_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false (mutation), destructiveHint=false (not destructive), and idempotentHint=false. The description adds important behavioral details: the client is notified, existing items are untouched, and returns the updated intake. It doesn't mention potential side effects like rate limits, but the client notification is a key behavioral trait not captured in annotations.
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 three short paragraphs: one for purpose with examples, one for behavioral notes, and one for validation rules. It is front-loaded with the core purpose, and every sentence adds value without unnecessary 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?
For a mutation tool with 2 parameters and an output schema, the description is mostly complete. It specifies the items schema references another tool, mentions notification and non-impact on existing items, and returns the updated intake. The only minor gap is not detailing validation failure behavior (e.g., partial additions), but the output schema and schema coverage mitigate this.
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 the schema fully documents the parameters and their properties. The description adds minimal extra meaning beyond referencing 'same rules as define_intake' and the snake_case key requirement, but since the schema covers it, a baseline 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the verb ('Add') and resource ('items to an intake'), and specifies the exact use case: adding items after an intake has been sent, with examples. It distinguishes itself from siblings like update_intake and define_intake by focusing on post-send additions.
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 explicitly says when to use this tool: when you need to add items to an already-sent intake, and gives concrete examples. It also implicitly differentiates from define_intake (for initial definition) and update_item (for modifying existing items) by stating existing items are not affected.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_folderCreate a folderAInspect
Create a new folder to group intakes, e.g. one per client.
Call list_folders first and reuse a matching folder — only create one when none of the existing folders fits. Fails with folder_exists if a folder with this name already exists; use list_folders to find it instead.
Returns the created folder { id, name, sort_order, intake_count, created_at }.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Folder name, e.g. the client's or project's name. Must be unique in your account. |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| name | No | |
| created_at | No | |
| sort_order | No | |
| intake_count | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, the description discloses the duplicate-name error condition, the uniqueness requirement, and the exact return payload. This gives the agent clear expectations about side effects and failure 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?
Every sentence earns its place: purpose, usage guidance, error condition, and return value. The most important routing instruction is front-loaded, and the description is compact without being vague.
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 single-parameter creation tool with annotations and an output schema, the description covers the essential context: when to create, what happens on duplicates, and what the response contains. Nothing needed to invoke it correctly is missing.
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 documents the 'name' parameter with uniqueness and examples, so coverage is 100%. The description adds the grouping use case but does not materially improve parameter understanding 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 the tool creates a new folder to group intakes, with a concrete example ('one per client'). It distinguishes this tool from list_folders by framing creation as the fallback when no existing folder fits.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly instructs the agent to call list_folders first, reuse a matching folder, and only create when none matches. It also names the duplicate error and directs the agent back to list_folders, leaving no ambiguity about when to use this tool.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
define_intakeCreate client intakeAIdempotentInspect
Create a new client intake request — a branded portal where the client submits logos, copy, files, credentials, and other assets. BriefGate sends the invite email and chases the client automatically until all items are collected.
Call this once at the start of a project, after you know what assets you need. Returns { intake_id, portal_url, status, follow_up }. Save intake_id — you need it for all follow-up calls.
AFTER CREATING AN INTAKE, SET UP HOW YOU WILL LEARN IT IS DONE. Nothing pushes to you on its own: MCP is request/response, so the server cannot wake you when the client finishes. Creating the intake and never checking again is the common failure — the completed work then sits in the portal until a human happens to look. The returned follow_up block tells you which of the two mechanisms applies:
follow_up.recommended = "webhook" — the account already has an endpoint; deliveries will arrive there and you need do nothing further.
follow_up.recommended = "schedule" — no endpoint is registered. If you control a service that can receive public HTTPS, register one with manage_webhook. Otherwise tell the user to set up a recurring check (cron, a systemd timer, a scheduled task in their agent host) that calls get_intake_status every follow_up.schedule.every_hours hours until follow_up.schedule.until, and offer to configure it for them.
Example: { "project_name": "Website for John Finance", "client": { "email": "john@example.com", "name": "John", "language": "cs" }, "due_date": "2026-08-15", "branding": { "accent_color": "#1B2A4A", "sender_name": "Radim" }, "items": [ { "key": "logo", "type": "image", "label": "Company logo", "constraints": { "formats": ["svg","png"], "min_width": 512 } }, { "key": "hero_copy", "type": "longtext", "label": "Homepage headline (2–3 sentences)", "constraints": { "max_chars": 400 } }, { "key": "wp_admin", "type": "secret", "label": "WordPress admin credentials" }, { "key": "photos", "type": "file_list", "label": "Photos (5–10 images)", "constraints": { "formats": ["jpg","png","heic"], "min_count": 5, "max_count": 15 } } ] }
Item types: text, longtext, file, file_list, image, color_list, select (one of options[]), multiselect (several of options[]; min_count/max_count in constraints), boolean, url, secret (encrypted; the value is shown only on the first retrieval), structured (requires schema with JSON Schema).
DECISIONS — questions for the account holder, not the client. An item with assignee="owner" and type select/multiselect is a question only the account holder can answer ("does the discounted plan cost 19 or 29?"). It can carry an optional "proposed" answer, e.g. proposed = { value: "19", rationale: "matches the competitor we benchmarked" }, which is stored separately from the account holder's answer and clearly labelled as a proposal.
get_intake_results returns the current answer with meta..decided_by: "owner" when the account holder answered in the dashboard, "agent_proposal" while only the proposal exists. A proposal cannot be confirmed through this API; only the account holder answers it. Item keys must be snake_case (e.g. "logo", "hero_copy", "ga4_id") — they become property names in get_intake_results.
| Name | Required | Description | Default |
|---|---|---|---|
| send | No | Whether to send the invite email immediately. Default: true. Set to false to create a draft and call /v1/intakes/:id/send later. | |
| items | Yes | List of assets to collect. Each item has key, type, label, and optional constraints. | |
| client | Yes | Client contact details. | |
| branding | No | Override account-level branding for this intake. | |
| due_date | No | Deadline in YYYY-MM-DD format. Shown in the portal and used to escalate chase cadence. | |
| template | No | Template slug to pre-populate items (e.g. "restaurant-website", "consulting-firm"). | |
| folder_id | No | Put this intake in an existing folder from list_folders instead of leaving it unfiled. Folders group intakes by client or project — reuse one for a returning client rather than creating a duplicate with create_folder. | |
| retention | No | How long BriefGate keeps this intake after it is finished. Default: purged 90 days after the client completes. Use mode "on_delivery" when the intake holds anything sensitive (credentials, personal photos): the contents are then removed shortly after YOU collect them with get_intake_results, because at that point you already have the files and there is no reason for a copy to sit on our server. An intake you never collect still expires on the day count, so this can only ever delete data earlier, never later. Example: { "mode": "on_delivery" } — or { "mode": "days", "days": 7 } to just shorten the window. | |
| email_copy | No | Your own subject and intro lines, overriding the built-in translation for this intake. Placeholders: {sender}, {project}, {client}, {count}, {minutes}, {due}. An unknown placeholder is rejected rather than rendered literally to the client. Layout, button and footer stay as they are. | |
| client_brief | No | Free-text brief shown to the client at the top of the portal, above the requested items — information from you to them: an offer, instructions, or context for why you are asking for these items. Up to 5000 characters. Documents attached to the brief go through the REST endpoint POST /v1/intakes/:id/brief/files (dashboard or REST — not available through this MCP tool set). | |
| project_name | Yes | Human-readable project name shown in the invite email and portal heading. | |
| chase_at_time | No | Local time of day to send reminders at, "HH:MM" in the client's timezone (e.g. "07:00"). Anchors the cadence to a clock time instead of counting from the invite, and needs an interval measured in whole days. Naming a time deliberately overrides quiet hours, so "07:00" stays 07:00. | |
| max_reminders | No | Reminders to send before the intake is marked stalled and handed back to you (default 3). An integer from 1 to 1000, or the string "unlimited" to keep reminding until the client finishes. Raise it for a rapid cadence, which would otherwise exhaust three attempts in minutes. A bounce or spam complaint always cancels the remaining reminders, whatever this is set to. | |
| chase_interval | No | How often to remind, only with chase_schedule="custom". Pair with chase_interval_unit. Defaults to every 3 days when omitted. The interval must work out to at least 5 minutes and at most 90 days. | |
| chase_schedule | No | Automated reminder cadence. default=T+2d,T+5d,T+9d,weekly. gentle=T+3d,T+8d,biweekly. aggressive=T+1d,T+3d,T+5d,every-other-day. custom=every chase_interval chase_interval_unit. off=no auto reminders. | |
| auto_approve_hours | No | Hours after submission before an item is auto-approved without agent review. Default: 72. Set to 0 to require explicit approval. | |
| chase_interval_unit | No | Unit for chase_interval. Defaults to "days". | |
| respect_quiet_hours | No | Hold reminders to the client's 08:00-19:00 local window (default true). A cadence of minutes or hours pauses overnight and resumes in the morning; set false to send around the clock. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| notices | No | Cadence caveats, present only when chase_schedule="custom" makes them relevant. |
| follow_up | No | How to learn this intake is done — present unless a webhook already covers it. Mirrors FollowUpAdvice in client.ts. |
| intake_id | No | |
| portal_url | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, the description reveals important side effects: the invite email is sent, BriefGate chases the client automatically, and nothing pushes back because MCP is request/response. It also warns about the common failure of never checking, explains the follow_up block, and even flags the blank-name pitfall ('Hello,' to someone being asked for their admin password).
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 long, but the length is largely justified by 18 parameters, nested objects, and complex lifecycle behavior. It is front-loaded with the core purpose, then uses titled blocks and a concrete example; some content slightly repeats schema details, so it is not perfectly lean.
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?
Covers creation, the returned contract, follow-up setup, item and assignee semantics, naming constraints, and failure modes. An output schema exists, so the description does not need to enumerate return fields beyond the key { intake_id, portal_url, status, follow_up } shape. Nothing an agent needs to decide whether, when, or how to call it is missing.
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 covers 100% of parameters, but the description adds substantial meaning beyond it: a full example intake, snake_case key rule, semantics for each item type, assignee='owner' behavior, proposal/decided_by flow, retention nuances, and chase cadence details. This materially improves an agent's ability to construct correct requests.
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?
States 'Create a new client intake request — a branded portal where the client submits logos, copy, files, credentials, and other assets' with a specific verb, resource, and outcome. The create-vs-manage distinction is clear from 'Call this once at the start of a project' and from the sibling tool names like update_intake and add_items.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly says to call this once at the project start after the needed assets are known, and gives detailed post-create guidance on setting up follow-up via webhook or schedule. It does not explicitly name alternatives like update_intake for modifying an existing intake, so exclusion guidance is implied rather than fully stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_intake_resultsCollect intake resultsADestructiveInspect
Retrieve the typed submitted values from a client intake.
Files are returned as signed download URLs that expire after 24 hours.
Secrets (type=secret, e.g. passwords, API keys) are decrypted and included only in the first retrieval. Later calls return first_reveal: false in meta and omit the value, so the user should be ready to receive a secret before this tool is called on an intake that contains one.
Use only_new=true to get only items submitted since the last call (useful in webhook-driven workflows). Use include_pending=true to also return partially filled items.
Returns { results: { : }, meta: { : { type, status, submitted_at, first_reveal? } } }.
For a DECISION item (assignee=owner, type select/multiselect), results holds the current answer and meta..decided_by is "owner" (answered by the account holder) or "agent_proposal" (only a proposal exists). Proposals are returned even without include_pending. A proposal does not bump revision, so only_new returns decisions the account holder has answered or changed since the last call.
| Name | Required | Description | Default |
|---|---|---|---|
| only_new | No | Return only items submitted or updated since the previous get_intake_results call. Default: false. | |
| intake_id | Yes | Intake ID returned by define_intake. | |
| include_pending | No | Include items not yet submitted (useful for partial progress checks). Default: false. |
Output Schema
| Name | Required | Description |
|---|---|---|
| meta | Yes | Keyed the same as results. |
| status | Yes | |
| results | Yes | Keyed by this intake's own item keys. A value's shape depends on that item's type. |
| intake_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations flag destructiveHint=true, readOnlyHint=false, and idempotentHint=false, and the description explains exactly why: secrets are decrypted and included only on the first call, later calls omit the value with first_reveal: false; files expire after 24 hours; and proposals are returned without include_pending yet don't bump revision, so they don't trigger only_new. This is rich behavioral disclosure fully consistent with the annotations.
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 lengthy but well-structured: the purpose is front-loaded, and each paragraph addresses one distinct concern (files, secrets, flags, return shape, decision items). The explicit 'Returns { results ... }' block is partially redundant given the stated output schema, but every sentence carries distinct, non-fluff information that an agent needs.
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 this much behavioral nuance — one-time secret reveal, signed URL expiry, and the interplay of proposals with only_new — the description covers the full calling surface: return shape, parameter effects, side effects, and edge cases like decided_by being 'owner' versus 'agent_proposal.' Nothing an agent needs to call it correctly is missing.
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 a baseline of 3 applies. The description adds real meaning beyond the schema: it explains only_new's 'since the last call' semantics and the revision/proposal nuance that affects it, and clarifies include_pending as partial-progress inclusion. intake_id is already self-explanatory from the schema, so the added value is concentrated but meaningful.
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 opening line 'Retrieve the typed submitted values from a client intake' uses a specific verb and resource, and it clearly distinguishes the tool from siblings like get_intake_status (status vs. values) and list_intakes. The remainder of the description reinforces exactly what data the tool returns (results plus meta), leaving no ambiguity about its core function.
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 gives concrete usage context: only_new is positioned 'useful in webhook-driven workflows,' include_pending is for 'partial progress checks,' and a precondition warns the user to be ready to receive a secret. However, it never names an alternative sibling or states when not to use this tool (e.g., versus get_intake_status), so explicit tool-routing guidance is missing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_intake_statusCheck intake progressARead-onlyIdempotentInspect
Check the completion status of a client intake — which items are submitted, pending, or need revision; the history of automated chase emails sent; and when the client last opened the portal.
Use this to decide whether to send a manual reminder (send_chase), request a revision (request_revision), or fetch results (get_intake_results). Returns per-item status and chase history.
This is also the call a scheduled check should make when no webhook is registered — see follow_up in the define_intake response for the cadence. When status becomes "completed", fetch the results with get_intake_results and carry on with the work that was waiting on them.
| Name | Required | Description | Default |
|---|---|---|---|
| intake_id | Yes | Intake ID returned by define_intake (e.g. "in_8f3k"). |
Output Schema
| Name | Required | Description |
|---|---|---|
| items | Yes | |
| chases | Yes | |
| status | Yes | |
| due_date | No | |
| progress | Yes | |
| intake_id | No | |
| client_brief | No | The brief shown to the client above the requested items, if one is set. |
| client_last_seen | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, and destructiveHint=false, so the safety profile is covered. The description adds meaningful context beyond that: it mentions the tool returns chase history and last-open time, and it specifies the scheduled-check behavior ('This is also the call a scheduled check should make when no webhook is registered'). This enriches the agent's understanding without contradicting annotations.
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 efficiently written, with the core purpose in the first sentence and usage guidance following. It is front-loaded and each sentence earns its place, though there is slight redundancy in restating 'Returns per-item status and chase history' after already listing those items. Overall, it is compact and well-organized.
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 a single parameter and an output schema, the description covers purpose, usage scenarios, and the scheduled-check exception. It references the defining tool (define_intake) and the result tool (get_intake_results), giving the agent a clear workflow. The only minor gap is that it doesn't describe pagination or volume limits, but that is likely covered by the output schema and the tool's simplicity.
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 description does not add new parameter information. It only restates that intake_id comes from define_intake, which is already in the schema. The baseline of 3 for high coverage applies, as the description does not need to compensate for missing schema 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 opens with a specific verb ('Check the completion status of a client intake') and enumerates the exact information returned (submitted/pending/revision status, chase email history, last portal open). It also names sibling tools to route selection, distinguishing it from get_intake_results, send_chase, and request_revision.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly states when to use this tool versus alternatives: 'Use this to decide whether to send a manual reminder (send_chase), request a revision (request_revision), or fetch results (get_intake_results).' It also provides a specific scheduled-check scenario with the cadence source ('follow_up in the define_intake response') and the follow-up action when status completes. No ambiguity.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_foldersList foldersARead-onlyIdempotentInspect
List the folders in your account, used to group intakes by client or project.
Call this before create_folder or before setting folder_id on define_intake, update_intake, or list_intakes — reuse an existing folder for a returning client instead of creating a duplicate.
Returns { folders: [{ id, name, sort_order, intake_count, created_at }] }.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| folders | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint, so the safety profile is covered. The description adds the return structure (folders array with fields) and the reuse context, which goes beyond annotations. No contradictions. A 4 is appropriate because the description contributes useful behavioral context on top of annotations.
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 three sentences, front-loaded with the purpose and immediately followed by usage guidance and return format. No fluff, every sentence earns its place. The structure is efficient and easy to scan.
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, parameterless read-only tool with an output schema, the description covers the purpose, usage timing, return structure, and even provides a reason to call it. Nothing an agent needs to invoke it correctly is missing. The description is complete and self-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 tool has zero parameters, so there is nothing to describe. Schema coverage is trivially 100%. The baseline for 0 params is 4, and the description does not need to add parameter information since none exist. It correctly omits any param 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 states it lists folders used for grouping intakes by client/project, with a specific verb and resource. It distinguishes itself from siblings by naming when to call it (before create_folder, etc.) and why (reuse existing folder). This fully clarifies the tool's purpose and differentiates it from alternatives.
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 explicitly instructs when to use the tool: 'Call this before create_folder or before setting folder_id on define_intake, update_intake, or list_intakes.' It also provides an anti-pattern (avoid creating duplicates) and names the alternative action (reuse existing folder). This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_intakesList intakesARead-onlyIdempotentInspect
List all intakes in your account, optionally filtered by status, client email, folder, or a text search.
Use this to get an overview of active projects, find a specific intake by the client's email when you have lost the intake_id, check how many intakes are currently in progress, or see what's in a folder from list_folders.
Returns { intakes: [...], total } where each intake includes intake_id, project_name, status, created_at, due_date, folder_id, and portal_url.
| Name | Required | Description | Default |
|---|---|---|---|
| q | No | Free-text search: matches a substring of project name, client name, or client email. | |
| limit | No | Maximum number of results (1–100). Default: 20. | |
| offset | No | Pagination offset. Default: 0. | |
| status | No | Filter by intake status. Omit to return all. | |
| folder_id | No | Filter by folder, using an id from list_folders. Pass the literal string "none" to see only intakes that are not in any folder. | |
| client_email | No | Filter by client email address. |
Output Schema
| Name | Required | Description |
|---|---|---|
| total | Yes | |
| intakes | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already carry readOnlyHint, openWorldHint, idempotentHint, and destructiveHint, so the description does not need to repeat those traits. It adds useful behavioral context by specifying account scope, optional filtering, and the exact response envelope with the fields included in each intake.
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 well structured and front-loaded: operation and filters first, then use cases, then return shape. The use-case sentence is slightly longer than strictly necessary, but each listed scenario earns its place by clarifying when an agent should call this tool.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a list tool with six optional filters and zero required parameters, this description is complete: it states the operation, gives decision triggers, names the related list_folders tool, and documents the response shape. Annotations cover the safety and idempotency profile, so the agent has enough to call it correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema has 100% parameter description coverage, including details like q substring matching, limit range, folder_id 'none' semantics, and default values. The description only summarizes the filter categories and adds no new parameter-level meaning, so 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 first sentence clearly states the operation ('List all intakes in your account') and the filter dimensions available ('status, client email, folder, or a text search'). The return-shape sentence reinforces that this is a list-level tool, distinguishing it from single-intake siblings like get_intake_status and get_intake_results.
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 second paragraph gives concrete use cases: overviewing active projects, finding an intake by client email when intake_id is lost, counting in-progress intakes, and inspecting a folder from list_folders. It does not explicitly tell the agent when not to use this tool or route to single-intake alternatives, but the context is clear enough to guide selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_recipientsManage intake recipientsADestructiveInspect
Add, remove, or reinstate a person who receives an intake's invite and reminders, alongside or instead of the primary client.
action="add" invites another address the same way also_notify does at define_intake time — its own message, its own bounce state; pass name to address it by name. action="remove" stops future reminders to that address. action="reinstate" is for a bounce that was wrong — the person did get the e-mail — and clears the bounce flag so reminders resume; if that address was the only one still being chased, the schedule is re-planned from now.
Fails if the address is not on the intake, or — for reinstate — if it never bounced in the first place.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | Their name, used to address their copy. Only used with action="add". | |
| Yes | The recipient's e-mail address. | ||
| action | Yes | What to do with the address. | |
| intake_id | Yes | Intake ID returned by define_intake. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description reveals important side effects beyond the annotations: it stops future reminders, clears the bounce flag, re-plans the schedule if the reinstated address was the only one being chased, and fails under specific conditions. This gives the agent a much clearer picture of what mutating the recipient list entails.
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 front-loaded with the overall purpose, then unpacks each action in turn, and ends with failure conditions. There is no filler or repetition of schema text; every sentence contributes a distinct fact needed to choose and invoke an action.
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?
With an output schema present and annotations already signaling mutation, destructiveness, and idempotency, the description covers all operational essentials: action semantics, parameter roles, error conditions, and schedule re-planning. An agent has enough to call the tool correctly without additional inference.
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 parameters are already documented. The description adds useful semantic detail by explaining what each action actually does to the recipient and when name is relevant, which goes beyond the schema's brief field 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 opening sentence names the resource (intake recipients) and the three operations (add, remove, reinstate), making the tool's purpose specific. It also distinguishes this from creation-time recipient setup by referencing 'also_notify does at define_intake time', so an agent understands this manages recipients after intake creation.
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?
Each action is tied to a concrete scenario: add invites, remove stops reminders, and reinstate clears a wrong bounce. The reference to define_intake's also_notify gives context for when this tool is the right post-creation choice, though it stops short of explicitly saying 'do not use for initial recipient setup'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
manage_webhookManage webhook endpointsADestructiveInspect
Register, list, or remove a webhook endpoint so BriefGate pushes intake events to your service instead of you polling for them.
Use this ONLY if you control a service that can receive public HTTPS requests. An agent running in a terminal cannot — for that case do not register anything and check on a schedule with get_intake_status instead. A registered endpoint that cannot receive produces failing deliveries and a false impression that the work is being watched.
action="create" returns a signing "secret" exactly once. The receiving service needs it to verify the signature on every delivery (verifyWebhookSignature from @briefgate/mcp/webhook), and it cannot be shown again. If it is ever exposed, there is no rotation in place — delete the endpoint and create a new one, which issues a fresh secret.
Events: intake.completed (all required items in — the one to act on), item.submitted (a single item arrived), client.viewed (the client opened the portal), chase.bounced (a reminder failed to deliver), intake.overdue (the due date passed with required items outstanding — the one to act on when work is blocked), intake.stalled (fires only when the intake sets max_reminders; without it this event never arrives).
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | HTTPS endpoint to deliver to. Required for action="create". | |
| action | Yes | What to do. "list" needs no other argument. | |
| events | No | Events to receive. Required for action="create". For "tell me when the client is done", this is ["intake.completed"]. | |
| format | No | Payload shape. "raw" (default) is the signed BriefGate envelope; "slack" and "discord" post a message those services render directly. | |
| webhook_id | No | Endpoint to remove. Required for action="delete". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description goes well beyond the annotations. It discloses that the signing secret is returned exactly once and cannot be shown again, that there is no rotation, and that the remedy is to delete and recreate. It also explains event semantics, including that intake.stalled only fires when max_reminders is set. This is rich behavioral context that annotations alone do not provide.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is well-structured with clear paragraphs for usage, secret handling, and events. It is longer than average, but every sentence carries important information. The front-loading of the core purpose and the explicit usage condition is effective. Slight deduction for the event list being somewhat dense, but it earns its place.
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 (5 params, 3 actions, 6 events, security implications), the description covers all critical aspects: when to use, what the secret is, event semantics, and action-specific parameter requirements. The output schema exists, so return values don't need explanation. Nothing essential is missing for an agent to invoke this tool correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3. The description adds value by explaining the action-specific requirements (url required for create, webhook_id for delete), the meaning of the events array with a concrete example (["intake.completed"]), and the format options. It doesn't fully document every parameter's edge cases, but it meaningfully supplements 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 opens with a specific verb and resource ('Register, list, or remove a webhook endpoint') and immediately states the purpose: pushing intake events instead of polling. It clearly distinguishes itself from sibling tools like get_intake_status by naming the alternative and the condition that selects it.
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 explicitly says when to use this tool ('ONLY if you control a service that can receive public HTTPS requests') and when not to ('An agent running in a terminal cannot — for that case do not register anything and check on a schedule with get_intake_status instead'). It also warns about the consequence of misuse (failing deliveries and false impression). This is exemplary usage guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_revisionRequest a revisionAInspect
Ask the client to resubmit a specific item with a note explaining what is wrong.
Use this after reviewing get_intake_results and finding an item that does not meet requirements — for example a blurry logo, copy that is too long, or a broken URL. The client is notified automatically and the item status moves to needs_revision.
Returns { status: "revision_requested", item_key }.
| Name | Required | Description | Default |
|---|---|---|---|
| note | Yes | Plain-language explanation shown to the client (e.g. "Logo is blurry — we need at least 512 px wide in SVG or PNG with a transparent background"). | |
| item_key | Yes | The key of the item to revise (e.g. "logo", "hero_copy"). | |
| intake_id | Yes | Intake ID returned by define_intake. |
Output Schema
| Name | Required | Description |
|---|---|---|
| status | No | |
| item_key | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses the key behavioral side effects: the client is notified automatically and the item status moves to needs_revision, and it returns a specific object { status: 'revision_requested', item_key }. These details go beyond the annotations, which only indicate non-read-only, non-idempotent, non-destructive, and open-world behavior. The description also implies a write operation that cannot be idempotent, which aligns with annotations.
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 brief and front-loaded: the first sentence states the core action, the second gives usage context with examples, and the third reports the return value. No extraneous content; every sentence carries essential 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?
The description covers purpose, when to use, side effects, and return value. With the output schema already available and all parameters documented, this is sufficient for an agent to correctly invoke the tool in the expected workflow.
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 describes all three required parameters (intake_id, item_key, note) with explanations, achieving 100% coverage. The description's examples (e.g., blurry logo, copy too long) illustrate usage but do not add new semantic constraints beyond what the schema provides, so it earns the baseline score.
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 action: asking the client to resubmit a specific item with an explanatory note. It provides concrete examples of what constitutes a revision-worthy item (blurry logo, overlong copy, broken URL), which helps the agent understand the intent. However, it does not explicitly differentiate from sibling tools like update_item, relying on the distinct verb 'request revision' rather than naming alternatives.
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 explicitly states when to use the tool: after reviewing get_intake_results and finding an item that does not meet requirements. It also notes the automatic client notification and status change to needs_revision. This gives clear usage context, but it doesn't provide when-not conditions or mention alternative tools such as update_item for direct edits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_chaseSend a reminderAInspect
Send a manual reminder to the client outside the automatic schedule.
Use when a deadline is approaching and the client has not responded to automatic reminders, or when you want to send an SMS after email attempts have failed. The automatic chase schedule continues after this call — this is an extra nudge, not a replacement.
Returns { sent: true }.
| Name | Required | Description | Default |
|---|---|---|---|
| channel | No | Delivery channel. Email is the only one offered. | |
| intake_id | Yes | Intake ID returned by define_intake. |
Output Schema
| Name | Required | Description |
|---|---|---|
| sent | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With annotations indicating it is not read-only (readOnlyHint=false), not idempotent, and not destructive, the description adds value by noting that the automatic schedule continues after this call, preventing the agent from thinking it disables automation. It also discloses the return value, though the output schema already provides that. The description doesn't mention potential side effects like duplicate reminders, but with the annotations, the bar is lower, and 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 concise with three sentences, front-loading the core purpose and usage context. It includes the return value in the last sentence, which is efficiently placed. No redundant information; every sentence contributes to understanding.
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 moderate complexity, the description covers purpose, usage, behavioral notes, and return value. The output schema already documents parameters and return type, so no further detail is needed. It could mention that channel is always 'email' but that's in the schema; the description is complete enough.
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 documents both parameters: channel is an enum limited to 'email', and intake_id references define_intake. The description does not add additional meaning beyond that, but since schema coverage is 100%, the baseline of 3 is appropriate. No further explanation is needed.
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 (send), the resource (reminder), and the context (manual nudge outside automatic schedule). It distinguishes itself from automatic reminders and from sibling tools like update_intake or get_intake_status, so an agent can confidently select it for this specific action.
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 specifies when to use: when a deadline is approaching and the client has not responded, or when SMS is needed after email failures. It also clarifies that the automatic schedule continues, so the agent knows this is an extra nudge, not a replacement. This directly guides decision-making among alternatives.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_intakeEdit intake settingsAInspect
Change settings on an intake that has already been sent — project name, due date, reminder cadence, quiet hours, which folder it's in, the client brief, or the client's name, phone, language, and timezone.
Use this instead of deleting and recreating the intake when a deadline moves or the chase cadence needs to change. If any of chase_schedule, chase_interval, chase_interval_unit, chase_at_time, max_reminders, respect_quiet_hours, due_date, or client.timezone is included, every pending reminder is cancelled and the schedule is re-planned from now — reminders already sent still count toward max_reminders. Raising max_reminders (or setting it to "unlimited") past the number already sent on a stalled intake reactivates it and resumes chasing.
The client's e-mail address cannot be changed here — the portal link and login are bound to it. Use manage_recipients to add, remove, or reinstate an address.
folder_id moves the intake to a different folder (an id from list_folders); set it to null to remove the intake from any folder. It never touches the chase schedule.
client_brief replaces the free-text brief shown to the client above the requested items; set it to null to clear it. Documents attached to the brief are managed via the dashboard or the REST endpoint POST /v1/intakes/:id/brief/files, not through this tool.
Fails if the intake is archived. At least one field must be given. Returns the full, updated intake object.
| Name | Required | Description | Default |
|---|---|---|---|
| client | No | Client fields to change. Email cannot be changed here — use manage_recipients. | |
| due_date | No | Deadline in YYYY-MM-DD format. null clears it. | |
| folder_id | No | Move this intake to a different folder, using an id from list_folders. null removes it from any folder. | |
| intake_id | Yes | Intake ID returned by define_intake. | |
| owner_note | No | Private note, never shown to the client. null clears it. | |
| client_brief | No | Free-text brief shown to the client at the top of the portal, above the requested items — information from you to them: an offer, instructions, or context. Up to 5000 characters. null clears it. Documents attached to the brief go through the REST endpoint POST /v1/intakes/:id/brief/files (dashboard or REST — not available through this MCP tool set). | |
| project_name | No | Human-readable project name shown to the client. | |
| chase_at_time | No | Anchor reminders to this 24-hour local time in the client's timezone (e.g. "07:00"), overriding quiet hours. null clears it. | |
| max_reminders | No | Cap on reminder attempts (1-1000), or "unlimited". Raising this above the number already sent reactivates a stalled intake. | |
| chase_interval | No | How often to remind, only meaningful with chase_schedule="custom". Pair with chase_interval_unit. | |
| chase_schedule | No | Automated reminder cadence. default=T+2d,T+5d,T+9d,weekly. gentle=T+3d,T+8d,biweekly. aggressive=T+1d,T+3d,T+5d,every-other-day. custom=every chase_interval chase_interval_unit. off=no auto reminders. | |
| chase_interval_unit | No | Unit for chase_interval. | |
| respect_quiet_hours | No | Whether reminders pause outside 08:00-19:00 in the client's timezone. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations, it discloses critical side effects: including certain fields cancels all pending reminders and re-plans the schedule, raising max_reminders reactivates a stalled intake, and folder_id never touches the chase schedule. It also explains the email limitation and document attachment route, giving an agent accurate expectations.
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 long but every sentence carries operational value, and the main purpose is front-loaded before the caveats. It efficiently packs usage guidance, exclusions, side effects, and failure conditions without 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 tool with 13 parameters, nested objects, and significant side effects, the description covers input requirements, when to use alternatives, error conditions, and special cases like archived intakes and stalled reminders. The output schema exists, so not describing the return value is acceptable.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3, but the description adds cross-parameter behavior not visible in the schema: the reminder re-planning trigger, max_reminders reactivation semantics, and null-clearing behavior for folder_id and client_brief. This adds genuine meaning beyond the 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 uses a specific verb and resource ('Change settings on an intake that has already been sent') and enumerates exactly which fields can be modified. It clearly distinguishes itself from siblings like define_intake and manage_recipients by stating what this tool can and cannot do.
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 to use this instead of deleting and recreating an intake when deadlines or chase cadence change, and it names manage_recipients as the alternative for changing the client email. It also gives constraints: fails if archived and at least one field must be provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_itemEdit an itemADestructiveInspect
Change one item on an intake that is already with the client — its type, label, hint, whether it is required, and which file formats it accepts.
Reach for this when the field turns out to be the wrong shape: you asked for an image and the client only has their logo as a PDF, or what you asked for as a line of text is really a file. Widening the accepted formats or switching the type unblocks them without adding a duplicate item and waiving the original.
The item key cannot be changed — results come back under it, so renaming would break whatever reads them. Add a new item instead.
If the client has already answered and the change would make their answer invalid, the call fails and nothing is touched. Repeat it with discard_submitted_value: true to clear the answer and ask them again. A change that leaves their answer valid (a new label, a wider limit) never discards anything.
| Name | Required | Description | Default |
|---|---|---|---|
| help | No | Hint under the label. null clears it. | |
| type | No | ||
| label | No | Human-readable label shown to the client. | |
| options | No | ||
| pattern | No | ||
| item_key | Yes | Key of the item to change. | |
| required | No | ||
| intake_id | Yes | Intake ID returned by define_intake. | |
| constraints | No | Same shape as define_intake, e.g. { "formats": ["svg","png","pdf"] }. null clears all constraints. | |
| discard_submitted_value | No | Go ahead even though it throws away what the client already sent. Only set this after the call has failed once for that reason. |
Output Schema
| Name | Required | Description |
|---|---|---|
| item | No | |
| discarded_submitted_value | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations' destructiveHint, the description discloses critical behavior: item keys are immutable because results are keyed by them, invalidating a submitted answer fails the call without side effects, and only discard_submitted_value: true clears the answer. This gives the agent a clear mental model of failure modes and idempotency.
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 front-loaded with the core purpose, then builds context through usage scenarios, a hard constraint, and failure semantics. Every paragraph serves a distinct function with no 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 destructive 10-parameter mutation tool, the description covers the essential operational context: when to use it, what cannot change, how invalidations behave, and how to force a resubmission. The output schema covers return values, so nothing critical is missing.
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?
With 60% schema coverage, the description adds meaningful semantics for type switching, required flags, accepted formats, and the discard_submitted_value escape hatch. It does not elaborate on options or pattern, but the description significantly strengthens understanding of the key mutation parameters.
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 opens with a specific verb and resource: 'Change one item on an intake that is already with the client' and enumerates exactly which attributes can change (type, label, hint, required, accepted formats). This clearly distinguishes it from siblings like add_items and update_intake.
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 gives concrete when-to-use guidance ('Reach for this when the field turns out to be the wrong shape'), explains the alternative approach ('Add a new item instead' when the key must change), and details the discard_submitted_value workflow after a failed call. No ambiguity remains about when this tool is appropriate.
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.
12 tool updates
- Changed
add_items10 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / follow_up / additionalPropertiesRemoved value: -false - removed
Output schema / properties / follow_up / properties / schedule / additionalPropertiesRemoved value: -false - removed
Output schema / properties / follow_up / properties / schedule / requiredRemoved value: -[ - "check_with", - "every_hours", - "until" -] - removed
Output schema / properties / follow_up / properties / webhook / additionalPropertiesRemoved value: -false - removed
Output schema / properties / follow_up / properties / webhook / requiredRemoved value: -[ - "active_endpoints", - "events", - "register_with" -] - removed
Output schema / properties / follow_up / requiredRemoved value: -[ - "recommended", - "reason", - "webhook", - "schedule" -] - removed
Output schema / properties / items / items / additionalPropertiesRemoved value: -false - removed
Output schema / properties / items / items / requiredRemoved value: -[ - "key", - "status" -] - removed
Output schema / requiredRemoved value: -[ - "intake_id", - "portal_url", - "status", - "items" -]
- Changed
create_folder3 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / created_at / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Output schema / requiredRemoved value: -[ - "id", - "name", - "sort_order", - "intake_count", - "created_at" -]
- Changed
define_intake8 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / follow_up / additionalPropertiesRemoved value: -false - removed
Output schema / properties / follow_up / properties / schedule / additionalPropertiesRemoved value: -false - removed
Output schema / properties / follow_up / properties / schedule / requiredRemoved value: -[ - "check_with", - "every_hours", - "until" -] - removed
Output schema / properties / follow_up / properties / webhook / additionalPropertiesRemoved value: -false - removed
Output schema / properties / follow_up / properties / webhook / requiredRemoved value: -[ - "active_endpoints", - "events", - "register_with" -] - removed
Output schema / properties / follow_up / requiredRemoved value: -[ - "recommended", - "reason", - "webhook", - "schedule" -] - removed
Output schema / requiredRemoved value: -[ - "intake_id", - "portal_url", - "status" -]
- Changed
get_intake_results2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - changed
Output schema / properties / meta / additionalProperties / properties / submitted_at / typePrevious value: -"string"New value: +[ + "string", + "null" +]
- Changed
get_intake_status10 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / chases / items / additionalPropertiesRemoved value: -false - changed
Output schema / properties / chases / items / properties / sent_at / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / chases / items / requiredPrevious value: -[ - "channel", - "sent_at", - "status", - "attempt_no" -]New value: +[ + "channel", + "status", + "attempt_no" +] - changed
Output schema / properties / client_last_seen / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / due_date / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Output schema / properties / items / items / additionalPropertiesRemoved value: -false - changed
Output schema / properties / items / items / properties / submitted_at / typePrevious value: -"string"New value: +[ + "string", + "null" +] - removed
Output schema / properties / progress / additionalPropertiesRemoved value: -false - changed
Output schema / requiredPrevious value: -[ - "intake_id", - "status", - "progress", - "items", - "chases" -]New value: +[ + "status", + "progress", + "items", + "chases" +]
- Changed
list_folders3 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / folders / items / additionalPropertiesRemoved value: -false - changed
Output schema / properties / folders / items / properties / created_at / typePrevious value: -"string"New value: +[ + "string", + "null" +]
- Changed
list_intakes5 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / properties / intakes / items / additionalPropertiesRemoved value: -false - changed
Output schema / properties / intakes / items / properties / created_at / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / intakes / items / properties / due_date / typePrevious value: -"string"New value: +[ + "string", + "null" +] - changed
Output schema / properties / intakes / items / requiredPrevious value: -[ - "intake_id", - "project_name", - "client_email", - "status", - "created_at", - "portal_url" -]New value: +[ + "intake_id", + "project_name", + "status", + "created_at", + "portal_url" +]
- Changed
manage_recipients1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": true, - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "bounced_at": { - "type": "null" - }, - "email": { - "type": "string" - }, - "still_chasing": { - "type": "boolean" - } - }, - "required": [ - "email", - "bounced_at", - "still_chasing" - ], - "type": "object" - } -]New value: +[ + { + "additionalProperties": true, + "type": "object" + }, + { + "properties": { + "bounced_at": { + "type": "null" + }, + "email": { + "type": "string" + }, + "still_chasing": { + "type": "boolean" + } + }, + "type": "object" + } +]
- Changed
manage_webhook1 field changed- changed
Output schema / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "created_at": { - "type": "string" - }, - "events": { - "items": { - "type": "string" - }, - "type": "array" - }, - "format": { - "type": "string" - }, - "id": { - "type": "string" - }, - "note": { - "type": "string" - }, - "secret": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "url", - "events", - "format", - "active", - "created_at", - "secret", - "note" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "webhooks": { - "items": { - "additionalProperties": false, - "properties": { - "active": { - "type": "boolean" - }, - "created_at": { - "type": "string" - }, - "events": { - "items": { - "type": "string" - }, - "type": "array" - }, - "format": { - "type": "string" - }, - "id": { - "type": "string" - }, - "url": { - "type": "string" - } - }, - "required": [ - "id", - "url", - "events", - "format", - "active", - "created_at" - ], - "type": "object" - }, - "type": "array" - } - }, - "required": [ - "webhooks" - ], - "type": "object" - }, - { - "additionalProperties": false, - "properties": { - "deleted": { - "enum": [ - true - ], - "type": "boolean" - } - }, - "required": [ - "deleted" - ], - "type": "object" - } -]New value: +[ + { + "properties": { + "active": { + "type": "boolean" + }, + "created_at": { + "type": "string" + }, + "events": { + "items": { + "type": "string" + }, + "type": "array" + }, + "format": { + "type": "string" + }, + "id": { + "type": "string" + }, + "note": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + { + "properties": { + "webhooks": { + "items": { + "properties": { + "active": { + "type": "boolean" + }, + "created_at": { + "type": "string" + }, + "events": { + "items": { + "type": "string" + }, + "type": "array" + }, + "format": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "type": "object" + }, + "type": "array" + } + }, + "type": "object" + }, + { + "properties": { + "deleted": { + "enum": [ + true + ], + "type": "boolean" + } + }, + "type": "object" + } +]
- Changed
request_revision2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / requiredRemoved value: -[ - "status", - "item_key" -]
- Changed
send_chase2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / requiredRemoved value: -[ - "sent" -]
- Changed
update_item2 fields changed- removed
Output schema / additionalPropertiesRemoved value: -false - removed
Output schema / requiredRemoved value: -[ - "item" -]
15 tool updates
- Changed
add_items1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "folder_id": { + "type": [ + "string", + "null" + ] + }, + "follow_up": { + "additionalProperties": false, + "description": "How to learn this intake is done — present unless a webhook already covers it. Mirrors FollowUpAdvice in client.ts.", + "properties": { + "reason": { + "type": "string" + }, + "recommended": { + "enum": [ + "webhook", + "schedule" + ], + "type": "string" + }, + "schedule": { + "additionalProperties": false, + "properties": { + "check_with": { + "type": "string" + }, + "every_hours": { + "type": "number" + }, + "until": { + "type": "string" + } + }, + "required": [ + "check_with", + "every_hours", + "until" + ], + "type": "object" + }, + "webhook": { + "additionalProperties": false, + "properties": { + "active_endpoints": { + "type": "number" + }, + "events": { + "items": { + "type": "string" + }, + "type": "array" + }, + "register_with": { + "type": "string" + } + }, + "required": [ + "active_endpoints", + "events", + "register_with" + ], + "type": "object" + } + }, + "required": [ + "recommended", + "reason", + "webhook", + "schedule" + ], + "type": "object" + }, + "intake_id": { + "type": "string" + }, + "items": { + "items": { + "additionalProperties": false, + "properties": { + "key": { + "type": "string" + }, + "status": { + "enum": [ + "pending", + "submitted", + "needs_revision", + "approved" + ], + "type": "string" + } + }, + "required": [ + "key", + "status" + ], + "type": "object" + }, + "type": "array" + }, + "portal_url": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "sent", + "in_progress", + "completed", + "archived" + ], + "type": "string" + } + }, + "required": [ + "intake_id", + "portal_url", + "status", + "items" + ], + "type": "object" +}
- Added
create_folder - Changed
define_intake3 fields changed- added
Input schema / properties / client_briefAdded value: +{ + "description": "Free-text brief shown to the client at the top of the portal, above the requested items — information from you to them: an offer, instructions, or context for why you are asking for these items. Up to 5000 characters. Documents attached to the brief go through the REST endpoint POST /v1/intakes/:id/brief/files (dashboard or REST — not available through this MCP tool set).", + "maxLength": 5000, + "type": "string" +} - added
Input schema / properties / folder_idAdded value: +{ + "description": "Put this intake in an existing folder from list_folders instead of leaving it unfiled. Folders group intakes by client or project — reuse one for a returning client rather than creating a duplicate with create_folder.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "follow_up": { + "additionalProperties": false, + "description": "How to learn this intake is done — present unless a webhook already covers it. Mirrors FollowUpAdvice in client.ts.", + "properties": { + "reason": { + "type": "string" + }, + "recommended": { + "enum": [ + "webhook", + "schedule" + ], + "type": "string" + }, + "schedule": { + "additionalProperties": false, + "properties": { + "check_with": { + "type": "string" + }, + "every_hours": { + "type": "number" + }, + "until": { + "type": "string" + } + }, + "required": [ + "check_with", + "every_hours", + "until" + ], + "type": "object" + }, + "webhook": { + "additionalProperties": false, + "properties": { + "active_endpoints": { + "type": "number" + }, + "events": { + "items": { + "type": "string" + }, + "type": "array" + }, + "register_with": { + "type": "string" + } + }, + "required": [ + "active_endpoints", + "events", + "register_with" + ], + "type": "object" + } + }, + "required": [ + "recommended", + "reason", + "webhook", + "schedule" + ], + "type": "object" + }, + "intake_id": { + "type": "string" + }, + "notices": { + "description": "Cadence caveats, present only when chase_schedule=\"custom\" makes them relevant.", + "items": { + "type": "string" + }, + "type": "array" + }, + "portal_url": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "sent", + "in_progress", + "completed", + "archived" + ], + "type": "string" + } + }, + "required": [ + "intake_id", + "portal_url", + "status" + ], + "type": "object" +}
- Changed
get_intake_results1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "intake_id": { + "type": "string" + }, + "meta": { + "additionalProperties": { + "additionalProperties": true, + "properties": { + "decided_by": { + "description": "Only present for an assignee=owner decision item.", + "enum": [ + "owner", + "agent_proposal" + ], + "type": "string" + }, + "first_reveal": { + "description": "Only present for type=secret: true on the call that reveals the plaintext value, false after.", + "type": "boolean" + }, + "status": { + "enum": [ + "pending", + "submitted", + "needs_revision", + "approved" + ], + "type": "string" + }, + "submitted_at": { + "type": "string" + }, + "type": { + "enum": [ + "text", + "longtext", + "file", + "file_list", + "image", + "color_list", + "select", + "multiselect", + "boolean", + "url", + "secret", + "structured" + ], + "type": "string" + } + }, + "required": [ + "type", + "status" + ], + "type": "object" + }, + "description": "Keyed the same as results.", + "type": "object" + }, + "results": { + "additionalProperties": true, + "description": "Keyed by this intake's own item keys. A value's shape depends on that item's type.", + "type": "object" + }, + "status": { + "enum": [ + "draft", + "sent", + "in_progress", + "completed", + "archived" + ], + "type": "string" + } + }, + "required": [ + "intake_id", + "status", + "results", + "meta" + ], + "type": "object" +}
- Changed
get_intake_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "chases": { + "items": { + "additionalProperties": false, + "properties": { + "attempt_no": { + "type": "number" + }, + "channel": { + "type": "string" + }, + "sent_at": { + "type": "string" + }, + "status": { + "type": "string" + } + }, + "required": [ + "channel", + "sent_at", + "status", + "attempt_no" + ], + "type": "object" + }, + "type": "array" + }, + "client_brief": { + "description": "The brief shown to the client above the requested items, if one is set.", + "type": "string" + }, + "client_last_seen": { + "type": "string" + }, + "due_date": { + "type": "string" + }, + "intake_id": { + "type": "string" + }, + "items": { + "items": { + "additionalProperties": false, + "properties": { + "key": { + "type": "string" + }, + "label": { + "type": "string" + }, + "status": { + "enum": [ + "pending", + "submitted", + "needs_revision", + "approved" + ], + "type": "string" + }, + "submitted_at": { + "type": "string" + } + }, + "required": [ + "key", + "status", + "label" + ], + "type": "object" + }, + "type": "array" + }, + "progress": { + "additionalProperties": false, + "properties": { + "submitted": { + "type": "number" + }, + "total": { + "type": "number" + } + }, + "required": [ + "submitted", + "total" + ], + "type": "object" + }, + "status": { + "enum": [ + "draft", + "sent", + "in_progress", + "completed", + "archived" + ], + "type": "string" + } + }, + "required": [ + "intake_id", + "status", + "progress", + "items", + "chases" + ], + "type": "object" +}
- Added
list_folders - Changed
list_intakes3 fields changed- added
Input schema / properties / folder_idAdded value: +{ + "description": "Filter by folder, using an id from list_folders. Pass the literal string \"none\" to see only intakes that are not in any folder.", + "type": "string" +} - added
Input schema / properties / qAdded value: +{ + "description": "Free-text search: matches a substring of project name, client name, or client email.", + "type": "string" +} - changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "intakes": { + "items": { + "additionalProperties": false, + "properties": { + "client_email": { + "type": "string" + }, + "created_at": { + "type": "string" + }, + "due_date": { + "type": "string" + }, + "folder_id": { + "type": [ + "string", + "null" + ] + }, + "intake_id": { + "type": "string" + }, + "portal_url": { + "type": "string" + }, + "project_name": { + "type": "string" + }, + "status": { + "enum": [ + "draft", + "sent", + "in_progress", + "completed", + "archived" + ], + "type": "string" + } + }, + "required": [ + "intake_id", + "project_name", + "client_email", + "status", + "created_at", + "portal_url" + ], + "type": "object" + }, + "type": "array" + }, + "total": { + "type": "number" + } + }, + "required": [ + "intakes", + "total" + ], + "type": "object" +}
- Removed
login - Removed
logout - Added
manage_recipients - Changed
manage_webhook1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "anyOf": [ + { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "created_at": { + "type": "string" + }, + "events": { + "items": { + "type": "string" + }, + "type": "array" + }, + "format": { + "type": "string" + }, + "id": { + "type": "string" + }, + "note": { + "type": "string" + }, + "secret": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "events", + "format", + "active", + "created_at", + "secret", + "note" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "webhooks": { + "items": { + "additionalProperties": false, + "properties": { + "active": { + "type": "boolean" + }, + "created_at": { + "type": "string" + }, + "events": { + "items": { + "type": "string" + }, + "type": "array" + }, + "format": { + "type": "string" + }, + "id": { + "type": "string" + }, + "url": { + "type": "string" + } + }, + "required": [ + "id", + "url", + "events", + "format", + "active", + "created_at" + ], + "type": "object" + }, + "type": "array" + } + }, + "required": [ + "webhooks" + ], + "type": "object" + }, + { + "additionalProperties": false, + "properties": { + "deleted": { + "enum": [ + true + ], + "type": "boolean" + } + }, + "required": [ + "deleted" + ], + "type": "object" + } + ], + "type": "object" +}
- Changed
request_revision1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "item_key": { + "type": "string" + }, + "status": { + "enum": [ + "revision_requested" + ], + "type": "string" + } + }, + "required": [ + "status", + "item_key" + ], + "type": "object" +}
- Changed
send_chase1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "sent": { + "enum": [ + true + ], + "type": "boolean" + } + }, + "required": [ + "sent" + ], + "type": "object" +}
- Added
update_intake - Changed
update_item1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "additionalProperties": false, + "properties": { + "discarded_submitted_value": { + "type": "boolean" + }, + "item": { + "additionalProperties": true, + "type": "object" + } + }, + "required": [ + "item" + ], + "type": "object" +}
11 tool updates
- First observed
add_items - First observed
define_intake - First observed
get_intake_results - First observed
get_intake_status - First observed
list_intakes - First observed
login - First observed
logout - First observed
manage_webhook - First observed
request_revision - First observed
send_chase - First observed
update_item
Publisher details
- Operator
- Radim Sekera, Czech sole trader (OSVČ) trading as BriefGate, IČO 04217764 · Publisher source
- Operator website
- https://briefgate.dev
- Vendor relationship
- First-party · Publisher source
- Documentation
- https://briefgate.dev/docs/mcp
- Trust center
- https://briefgate.dev/docs/security
- Restrictions
- Requires a BriefGate account; clients sign in via OAuth 2.1 with dynamic client registration (no custom OAuth app). Free plan: 1 active intake, up to 10 items per intake, 60 API requests/hour; secrets vault, revisions and SMS require a paid plan. · Publisher source
Related MCP Connectors
Hosted AI agents and workflows with app OAuth, human approval gates, and a run ledger.
Zero-setup MCP gateway securely connecting AI to your tools with authentication and workflows
btlabs Core MCP endpoint: site content and brand data for AI agents. OAuth or API key.
Hosted MCP server with managed OAuth for 15+ toolkits: Google Workspace, Fitbit, Oura, Kalshi, etc.
Related MCP Servers
- AlicenseBqualityCmaintenanceShared workspace your AI agents write to. CMMN case management with 184+ MCP tools: cases, tasks, event-driven CMMN workflows with sentries, persistent memory with semantic search, billing and invoicing. OAuth or token auth; cloud-hosted remote MCP endpoint.10024 npmMIT

Proofable MCPofficial
AlicenseNot gradedqualityBmaintenanceEnables AI agents to manage identity, permissions, secrets, and verifiable proofs through a hosted MCP server, letting clients sign in and check what an agent may do before it acts.23 npmApache 2.0- FlicenseNot gradedqualityDmaintenanceHosted remote MCP for AI agent browser approval. Provides structured tools for page approval workflows, session management, and audit receipts.-
- AlicenseNot gradedqualityAmaintenanceServer-enforced workflow discipline for AI agents. An MCP server providing persistent work items, dependency graphs, quality gates, and actor attribution. Schemas define what agents must produce — the server blocks the call if they don't. Works with any MCP-compatible client.206MIT
Glama MCP Gateway
Add one secure layer between your agents and this server.