The Bridge
Server Details
Hosted login, teams, billing and feature flags for your SaaS app, set up by your AI assistant.
- Status
- Healthy
- Uptime
- 84.0% over 22 days
- OAuth
- Works in Glama
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- Repository
- thebridgedev/bridge-mcp
- GitHub Stars
- 0
TDQS
Scored across 79 tools
Many tools share overlapping purposes: create_plan vs apply_plan, setup_payments vs connect_stripe, toggle_feature_flag vs update_feature_flag, add_plan_feature vs set_plan_features, and the multiple read tools (get_app/get_auth_config/get_environment_info). The descriptions do an excellent job steering between them, but the volume of near-duplicates means an agent can still misselect among plan, flag, billing, and app-config operations.
Consistent snake_case verb_noun pattern throughout (list_, get_, create_, update_, delete_, add_, remove_, set_, setup_, toggle_, export_, import_, etc.). No mixing of conventions or styles.
79 tools is far beyond the typical 3-15 range and lands in the extreme-mismatch tier (50+). Even for a broad platform-management domain, this surface is large enough to overwhelm tool selection and agent context.
Covers app config, auth/SSO, branding, roles and privileges, tenants and users, plans/prices/quotas/features, feature flags with scheduling and import/export, Stripe setup, API tokens, and diagnostics with login verification. This is essentially full lifecycle coverage across the platform's stated domains, with no obvious CRUD gap.
Available Tools
79 toolsadd_plan_featureAdd Plan FeatureAIdempotentInspect
Add an on/off feature to what a plan includes, or rename one it already has (idempotent by feature key; other features are kept). Arguments: key (plan key), feature (feature key, e.g. "analytics") and name (what customers read, e.g. "Analytics"; defaults to the key). A plan feature is an on/off feature the plan sells; gate it with a feature flag whose rule is bridge:billing.entitlement.<featureKey> eq true, so the flag follows the plan's feature list and never names plans. Something counted (projects, API calls) is a quota instead: set_plan_quota. Use remove_plan_feature to take a feature off a plan. Returns the full plan. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY (see list_plans). | |
| name | No | Display name customers read, e.g. "Analytics". Defaults to the key, or keeps the current name. | |
| feature | Yes | Feature KEY, e.g. "analytics". It becomes the entitlement bridge:billing.entitlement.<key>. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true, destructiveHint=false and readOnlyHint=false, but the description goes further: it discloses that idempotency is keyed on the feature key, that other features are preserved, that the call returns the full plan, and the exact entitlement bridge pattern the plan feature must be gated with. That is genuine added context a mutation tool needs.
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?
Front-loads the core action, then arguments, then the conceptual/entitlement context, then sibling routing; each block is useful, though the 'Arguments:' line partially restates the schema. Slightly long but no sentence is wasted.
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 no output schema, the description supplies the return value ('Returns the full plan'), the idempotency and preservation semantics, and the integration guidance. For a 4-param mutation tool this is complete enough for correct 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 coverage is 100%, so the baseline is 3, but the description adds conceptual linkage the schema lacks: it names the entitlement form bridge:billing.entitlement.<featureKey> and clarifies that 'name' is what customers read versus the key. It mostly echoes schema content (defaults to the key), keeping it from a 5.
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 a specific verb and resource ('Add an on/off feature to what a plan includes, or rename one it already has') and pins the scope precisely, including the dual add/rename behavior. It explicitly distinguishes the resource from siblings by defining a plan feature as an on/off entitlement versus something counted.
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 routes the agent: counted things belong to set_plan_quota, and removing a feature uses remove_plan_feature. It also adds a forward-looking instruction to call get_integration_guide with topic=billing before writing app code, giving clear when-to-use context beyond the tool itself.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
add_redirect_uriAdd Redirect URIAIdempotentInspect
Register ONE OAuth redirect (callback) URI on the Bridge app, preserving every already-registered URI — never replaces the list wholesale. The URL must be absolute http(s), e.g. https://app.example.com/auth/oauth-callback or http://localhost:5173/auth/oauth-callback for local dev. Adding a URL that is already registered succeeds as a no-op (added: false). The first URI registered on an app with no default callback also becomes its default callback. Use this when wiring a new environment or fixing a "redirect_uri mismatch" OAuth error; see get_environment_info for the currently registered list, and remove_redirect_uri to unregister one. Before writing app code that consumes this, call get_integration_guide with topic=auth and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| url | Yes | Absolute http(s) callback URL to register, e.g. http://localhost:5173/auth/oauth-callback. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (readOnly=false, idempotent=true, destructive=false), it discloses that existing URIs are never replaced wholesale, that duplicates succeed as a no-op returning added: false, and that the first URI on an app with no default callback becomes the default — a side effect not visible 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 key non-destructive guarantee is front-loaded and each sentence carries information, though the trailing get_integration_guide instruction slightly lengthens an otherwise dense block.
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 no output schema, the description compensates by describing return semantics (added: false) and the default-callback side effect, and it covers preconditions (absolute http(s)) and related tools, leaving nothing essential unclear.
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, but the description adds meaning by stressing that only ONE URI is registered per call and by giving a local-dev example (http://localhost:5173/...) alongside the production example.
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 names a specific verb and resource (register ONE OAuth redirect URI on the Bridge app) and explicitly states the additive scope, distinguishing it from remove_redirect_uri and list_redirect_uris without requiring the schema.
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 explicit triggers (wiring a new environment, fixing a 'redirect_uri mismatch' error) and routes to named alternatives: get_environment_info for the current list, remove_redirect_uri to unregister, and get_integration_guide for app-side wiring.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
apply_planCreate or Update PlanAIdempotentInspect
Set up or reshape ONE subscription plan in a single call: its name, description, trial, prices, features and quotas together. Creates the plan when the key is new and updates it when it exists, in one write, so a plan is never left half-configured. A new plan needs name, at least one price and, when it charges, trial (true or false); a price above 0 needs currency unless the plan's prices already use exactly one. These are the developer's decisions: when one is missing the tool changes nothing and returns DECISION_NEEDED listing the questions to ask. prices ([{ amount, interval, currency? }]) are upserted by currency + interval and quotas ([{ metric, limit, policy, kind?, source?, priceAmount?, priceCurrency? }]) by metric, with the same rules as set_plan_price and set_plan_quota; features ([{ key, name? }], the on/off features the plan includes) are upserted by key; removePrices ([{ interval, currency? }]), removeQuotas ([metric]) and removeFeatures ([key]) remove the named ones. Anything the call does not mention is kept. Returns the full plan. The CLI's bridge plan apply --spec takes the same JSON. Call list_plan_quotas without a planKey first to reuse the metric names the app already has instead of inventing new ones. Seats: name the limit (e.g. seats), kind gauge, source membership; Bridge counts the workspace's active members, pending invites included. Enforce it where invites happen: the built-in team page with its seat-limit setting, or @RequireQuota on the app's own invite handler. Never a flag or an entitlement. Count usage once, where the action happens: ask the developer whether the action calls their server. If it does, the backend decorator (@RequireQuota) counts it. If it does not, the browser reports it (bridge.usage.report / set) with on the button; that is a complete, first-class setup. Never count one metric in both places. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY. A new key creates the plan; an existing one reshapes it. | |
| name | No | Display name. Required when the plan is new. | |
| trial | No | Whether the plan has a trial period. false removes one. | |
| prices | No | Prices to add or replace, one per currency + interval. A new plan needs at least one. | |
| quotas | No | Quotas to add or replace, one per metric. kind: counter (default) or gauge. If deleting it frees room, it's a gauge and your app counts it; if it happened, it's a counter and Bridge counts it. source: "membership" on a hard gauge makes Bridge count the workspace's active members (seats). | |
| features | No | On/off features the plan includes, added or renamed by key. A plan feature is an on/off feature the plan sells; gate it with a feature flag whose rule is `bridge:billing.entitlement.<featureKey>` eq true, so the flag follows the plan's feature list and never names plans. | |
| trialDays | No | Trial length in days. Required when trial is true. | |
| description | No | Short description shown with the plan. | |
| removePrices | No | Prices to remove, by interval + currency (default: the plan's one currency). | |
| removeQuotas | No | Metric keys whose quotas to remove. | |
| removeFeatures | No | Feature keys to remove from the plan. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations it discloses real behavioral traits: DECISION_NEEDED is returned with the questions to ask when a developer decision is missing, 'anything the call does not mention is kept', and 'Returns the full plan'. The atomic 'never left half-configured' framing and the upsert-by-key rules (currency+interval, metric, key) are not derivable from the annotations. Note the tension with destructiveHint=false given the explicit remove* operations, but these are caller-named, reversible config removals rather than a true contradiction.
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 core purpose and upsert/removal rules are front-loaded in the first few sentences, but the description then drifts into broad integration guidance (seat quotas, @RequireQuota vs browser reporting, QuotaGate) that is tangential to invoking this tool. Information-dense rather than padded, but substantially oversized for a tool definition.
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 12-parameter mutation tool with no output schema, it covers what an agent needs: return value ('the full plan'), the DECISION_NEEDED failure mode, merge semantics for unmentioned fields, and per-collection upsert keys. Annotations cover safety/idempotency and the schema covers field detail, so nothing essential 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 description coverage is 100% and the schema itself is already rich, documenting currency rules, interval enums, quota kind/source and feature key patterns. The description adds the upsert-by-key grouping and the 'same rules as set_plan_price/set_plan_quota' cross-reference, but mostly restates what the schema already carries, 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 opening sentence states a specific verb and resource ('Set up or reshape ONE subscription plan in a single call') and immediately defines the upsert scope: creates on a new key, updates on an existing one. It is clearly differentiated from the many siblings that do a single piece (set_plan_price, set_plan_quota, add_plan_feature, create_plan/update_plan) by being the one-call composite.
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 explicit when-to-use and prerequisite guidance: call list_plan_quotas without a planKey first to reuse existing metric names, and call get_integration_guide with topic=billing before writing consuming app code. It also names the CLI equivalent and routes callers to set_plan_price/set_plan_quota semantics for the nested rules.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
archive_planArchive PlanAIdempotentInspect
Archive a subscription plan: the workspaces on it keep it and keep being billed, but nobody new can choose it — it leaves the plan picker, checkout refuses it, and its Stripe product and prices are archived. Use it to stop selling a plan that workspaces are on (delete_plan refuses those). archived: false brings an archived plan back. Returns how many workspaces are on it. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY (see list_plans). | |
| archived | No | false brings an archived plan back. Default true. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations, it discloses consequential behavior: existing workspaces keep the plan and continue being billed, the plan disappears from the picker, checkout rejects it, and the Stripe product and prices are archived. It also states reversibility via archived: false and that the call returns the number of workspaces on the plan.
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 behavior and then adds usage, reversal, return value, and integration guidance in a dense but purposeful sequence. Every sentence adds actionable context without repetition 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 mutation tool with annotations covering safety and no output schema, the description supplies the important missing context: what changes, what does not change, the alternative tool, the reversal path, and the return count. Nothing an agent would need before invoking it is absent.
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 key and app are already documented in the schema. The description reiterates that archived: false restores a plan but adds no syntax or format detail beyond the schema's own description.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource ('Archive a subscription plan') and details the precise effects: workspaces keep it and remain billed, it leaves the plan picker, checkout refuses it, and Stripe product/prices are archived. It also explicitly distinguishes this from delete_plan, which refuses plans that have workspaces on them.
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 an explicit when-to-use rule ('Use it to stop selling a plan that workspaces are on') and names the alternative delete_plan and why it does not apply. It also documents the reversal path via archived: false and a prerequisite for app code consumers to call get_integration_guide with specific parameters.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
clear_flag_scheduleClear Feature Flag ScheduleAIdempotentInspect
Remove a scheduled state transition from a feature flag, by KEY. The flag keeps whatever state it is in now — clearing a schedule cancels the pending change, it does not roll anything back. Safe to call when no schedule is set. Fails with FLAG_NOT_FOUND when no flag has the given key. Before writing app code that consumes this, call get_integration_guide with topic=feature-flags and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Flag KEY whose schedule to remove. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotentHint=true and destructiveHint=false, but the description adds real value beyond them: clearing cancels a pending change rather than rolling back state, and it names the FLAG_NOT_FOUND failure mode. That error contract is the kind of behavioral detail annotations cannot express.
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?
Front-loads the core action, then semantics, error behavior, and the integration-guide pointer. Every sentence carries weight, though the closing integration-guide instruction is slightly tangential to the call itself.
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 no output schema, the description covers the essential behaviors an agent needs: idempotency, no-rollback semantics, and the failure case. Little is missing for a simple removal operation.
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 both the app and key parameters are already documented in the schema. The description only echoes 'by KEY' and adds no format or edge-case detail beyond it, making the baseline 3 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?
States a specific verb (Remove/Clear) on a specific resource (scheduled state transition on a feature flag) scoped by KEY. It is cleanly distinguishable from set_flag_schedule, its natural opposite, and from toggle/delete 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?
Gives clear context: it is safe to call when no schedule exists, and it points to get_integration_guide before writing consuming app code. It does not explicitly name set_flag_schedule as the alternative for creating a schedule, so it stops short of full when/when-not routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
connect_stripeConnect StripeAIdempotentInspect
Store the app's Stripe API credentials so billing (checkout, subscriptions, the billing portal) works. Arguments: secretKey (the Stripe SECRET key, "sk_live_..." or "sk_test_...") and publishableKey (the Stripe publishable key, "pk_live_..." or "pk_test_..."). Both are found in the Stripe dashboard under Developers > API keys. Ask the user for these — never invent or guess a key. Returns { connected, webhookConfigured } and nothing else: the keys are never echoed back. connected=false means the credentials were stored but Stripe did not confirm them, so re-check the keys. webhookConfigured=false means Stripe events will not reach Bridge; see get_stripe_status. Use get_stripe_status to check the current state without writing. IMPORTANT: this stores the credentials but does NOT enable payments — Stripe stays switched off until setup_payments turns it on. For first-time setup prefer setup_payments, which does both. Use this only to rotate keys on an app where payments are already enabled. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| secretKey | Yes | Stripe secret key (sk_live_... or sk_test_...). Stored, never returned. | |
| publishableKey | Yes | Stripe publishable key (pk_live_... or pk_test_...). Stored, never returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only state non-read-only, idempotent, non-destructive, open-world) by disclosing that keys are never echoed back, the exact semantics of connected=false and webhookConfigured=false, that payments remain disabled until setup_payments runs, and the instruction never to invent keys. This is exactly the extra behavioral context annotations cannot carry.
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?
Front-loaded with the core action and the critical 'does NOT enable payments' caveat, and every sentence carries operational meaning. It is on the long side, but the density is justified rather than padded.
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?
No output schema exists, so the description correctly explains the return shape ({ connected, webhookConfigured }) and what a false value implies, plus the pre-requisite relationship with setup_payments and get_stripe_status. Nothing an agent needs to invoke this safely 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 already 100%, so the baseline is 3, but the description adds real meaning: the key value formats, where in the Stripe dashboard to find them, that both are required, and the instruction to ask the user rather than guess. That is genuine value beyond the schema text.
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 a specific verb and resource ('Store the app's Stripe API credentials') and names the downstream capability it enables (billing, checkout, subscriptions, portal). It clearly separates itself from setup_payments and get_stripe_status, which is exactly what an agent needs to choose among 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?
Explicit when-to-use and when-not: prefer setup_payments for first-time setup, use this only to rotate keys on an app where payments are already enabled, and use get_stripe_status to inspect state without writing. It also routes the agent to get_integration_guide before writing consuming code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_api_tokenCreate API TokenAInspect
Create a new API token for the Bridge app. Arguments: name (required — how the token is identified and revoked later, so make it descriptive and unique), privileges (array of privilege KEYS; defaults to none, and a token with no privileges can do very little — grant only what the consumer needs), expireAt (ISO 8601 date-time; omit for no expiry). The plaintext token is returned ONCE in the response and cannot be retrieved again — hand it to the user and never write it into source code or a committed file. Use revoke_api_token to destroy one. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| name | Yes | Unique, descriptive name, e.g. "ci-deploy". revoke_api_token uses it later. | |
| expireAt | No | ISO 8601 expiry, e.g. "2027-01-31T00:00:00.000Z". Omit for a non-expiring token. | |
| privileges | No | Privilege KEYS to grant. Grant destructive privileges only when explicitly asked. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the safety profile (non-read-only, non-idempotent, non-destructive, closed-world); the description goes well beyond that by disclosing the one-time plaintext return, the impossibility of re-retrieval, the handling warning (never commit the token), and that privileges default to none. These are the operationally decisive traits for a credential-issuing 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?
Front-loaded with purpose and tightly packed with the security warning, sibling routing, and prerequisite — no filler sentences. The single long paragraph with nested parentheticals is dense, though still readable and every clause 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?
With no output schema, the description compensates by describing the return value (plaintext token, shown once) and the follow-up revoke path. Combined with 100% schema coverage, an agent has everything needed to call this correctly and safely.
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, but the description adds real meaning: name is the identifier used later for revocation, privileges default to none and a privilege-less token "can do very little," and expireAt omitted means no expiry. It doesn't restate the ISO 8601 example already in the schema, which keeps it additive rather than redundant.
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?
Opens with a specific verb+resource ("Create a new API token for the Bridge app") and its scope is clearly distinct from the sibling list_api_tokens and revoke_api_token, which it names. An agent can select it without opening the schema.
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 routes to alternatives and prerequisites: "Use revoke_api_token to destroy one" and "Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses." It also gives a granting policy ("grant only what the consumer needs"), so when-to-use is fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_appCreate AppAInspect
Create a new Bridge app in the workspace this connection belongs to, exactly as the dashboard would. Returns its id. It does NOT become the default: pass its id as app, or call use_app. Use a new app for a new environment or product rather than repurposing an existing one — an existing app may have live users, email links and billing attached. Only a connection approved for the whole workspace can create apps. A new app has no sign-in callback address: pass callbackUrl with the one the project uses (its real port), or add it later with add_redirect_uri — until then sign-in fails with NBLOCKS_NO_CALLBACK_URI. Before writing app code that signs users in to the new app, call get_integration_guide with topic=auth and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Display name of the new app, e.g. "Acme (staging)". | |
| callbackUrl | No | Absolute http(s) sign-in callback URL the project uses, e.g. http://localhost:5173/auth/oauth-callback. Registered as the only redirect URI and the default callback. Omit it when the port or path is not known yet. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the basic mutation profile (readOnly=false, destructive=false, idempotent=false). The description goes well beyond them: it discloses the permission prerequisite, that the new app is not the default, that the id is returned, the callbackUrl default-registration behavior, and the concrete failure mode NBLOCKS_NO_CALLBACK_URI when no callback exists.
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?
Front-loads what the tool does and its return value, then layers prerequisites, side effects, and follow-up guidance in descending priority. No sentence is filler; every clause maps to a decision the agent must make.
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?
Although there is no output schema, the description states the return value (the app id). It covers permissions, default-state behavior, required callback setup, and routes the agent to get_integration_guide for the follow-on auth work, leaving no material gap for a create operation.
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, but the description adds meaning the schema does not: callbackUrl is registered as the ONLY redirect URI and default callback, that omitting it is acceptable when the port is unknown, and the downstream sign-in failure if it is missing. It also clarifies how the returned id is consumed elsewhere via the `app` parameter.
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 a specific verb and resource ("Create a new Bridge app in the workspace this connection belongs to") and immediately distinguishes the result from sibling concepts by noting it does NOT become the default, pointing to use_app instead. An agent can differentiate it from list_apps, get_app, update_app and use_app without opening any schema.
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 prescribes when to create a new app versus repurposing an existing one, and gives the reason (live users, email links, billing attached). It names alternatives (pass the id as `app`, or call use_app) and states the prerequisite that only a whole-workspace-approved connection can create apps.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_feature_flagCreate Feature FlagAInspect
Create a new feature flag. Before writing app code that consumes this, call get_integration_guide with topic=feature-flags and the framework the app uses. The result carries warnings when the flag cannot mean what it looks like — switched on while its onValue is false, or a rule on a plan or role the app does not have. A warning never blocks the write; read it and fix the flag. Every gate in app code is a flag: flags are the standard way to control a route, an API endpoint, a feature or a piece of code. A feature a plan sells is also listed on the plan, and the flag's rule points at bridge:billing.entitlement.. Access by who someone is is a rule on a privilege (preferred) or a role; app code never reads a role, privileges, the plan or a plan feature itself. Numbers are plan quotas, not flags; permission on one specific record stays in app code. Full rule: get_integration_guide topic=fit-together. Arguments: key (required — the identifier code reads, e.g. "beta-ui"), description, state (off | on | on-with-rule; defaults to off), valueType (boolean | string | number | json; defaults to boolean), onValue / offValue (the typed values returned in the on / off states — real JSON values, e.g. true, "variant-b", 42, or an object), and rule for state=on-with-rule. A rule is ordered branches of AND-ed conditions, first match wins, else otherwiseValue; the rule argument has the full shape and examples. A feature a plan sells is listed on the plan (add_plan_feature) and the rule points at that list, never at plan names. For who someone is, prefer a privilege rule over a role rule on the role KEY; read the app's real roles with list_roles first. The same rule gives the same answer in the browser and on the NestJS backend. Use update_feature_flag to change an existing flag, and toggle_feature_flag for a quick on/off switch by key.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Flag KEY the app code reads, e.g. "beta-ui". Lower-case with dashes. | |
| rule | No | Structured targeting rule: { branches: [{ conditions: [{ attribute, operator, values }], returnValue }], otherwiseValue, rolloutPct?, groupRef? }. Branches are first-match-wins; conditions in a branch are AND-ed. A feature a plan sells is listed on the plan (add_plan_feature) and the rule points at that list, never at plan names: { "branches": [{ "conditions": [{ "attribute": "bridge:billing.entitlement.analytics", "operator": "eq", "values": [true] }], "returnValue": true }], "otherwiseValue": false }. For who someone is, prefer a privilege rule ({ "attribute": "privileges", "operator": "contains", "values": ["REPORTS_VIEW"] }, which matches that whole key) over a role rule on the role KEY ("user.role" eq "ADMIN"); read the app's real roles with list_roles first. The same rule gives the same answer in the browser and on the NestJS backend. | |
| state | No | Three-state model: off (always offValue), on (always onValue), on-with-rule (evaluate rule). | |
| onValue | No | Value returned when state=on (typed per valueType). | |
| offValue | No | Value returned when state=off (typed per valueType). | |
| valueType | No | Type of the values this flag returns. | |
| description | No | What the flag controls, for the people who manage it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (write, non-destructive, non-idempotent), and the description adds genuinely new behavior: a `warnings` result that never blocks the write, and the guidance to read and fix the flag. It does not disclose auth/permission requirements or creation side effects, but the warning semantics are real value beyond 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?
Purpose and prerequisite are front-loaded, but the middle is bloated with doctrine that is restated in the `rule` schema description (same privilege-vs-role example, same plan-feature guidance, same browser/backend sentence). Sentences earn their place individually but the overall block is longer than needed to select and invoke the 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 an 8-parameter tool with a nested rule object and no output schema, the description supplies the mental model, the prerequisite call, the warning behavior on the result, and the sibling routing. 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 the 3 baseline applies, but the description goes further with argument-level meaning: key example ("beta-ui"), state three-state model, valueType defaults, on/off value typing, and rule semantics (first-match-wins, AND-ed conditions). Much of the rule detail duplicates the schema, but the conceptual framing (privilege vs role, pointing at plan feature lists not plan names) adds interpretable 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?
Opens with a specific verb+resource ("Create a new feature flag") and explicitly routes the agent away from siblings: "Use update_feature_flag to change an existing flag, and toggle_feature_flag for a quick on/off switch by key." An agent can distinguish create vs update vs toggle without inspecting schemas.
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?
States a concrete prerequisite workflow (call get_integration_guide with topic=feature-flags and the framework before writing consuming code) and names the two alternatives with the condition that selects each. It also explains the warning-handling loop after invocation, so both before/after usage is covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_planCreate PlanAInspect
Create a new subscription plan with its first recurring price. Arguments: key (required — stable identifier used in code and billing, e.g. "pro"; flag rules point at the plan's features, not its key), name (required — the display name), amount + interval (the first price; amount 0 for a free or contact-sales tier: a plan with no price can never be assigned to a workspace), currency (ISO code) and trial (true or false), with trialDays when trial is true, and description. Price, interval, currency and trial are the developer's decisions: when one is missing (currency and trial are only needed when amount is above 0) the tool changes nothing and returns DECISION_NEEDED listing the questions to ask. Add more prices (e.g. yearly) with set_plan_price and usage quotas with set_plan_quota, or use apply_plan to create a plan with all its prices and quotas in one call; update_plan changes name, description and trial later. Returns the full plan. Count usage once, where the action happens: ask the developer whether the action calls their server. If it does, the backend decorator (@RequireQuota) counts it. If it does not, the browser reports it (bridge.usage.report / set) with on the button; that is a complete, first-class setup. Never count one metric in both places. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY: short, lower-case and permanent, e.g. "pro". Code and tokens use it; flag rules point at the plan's features instead. | |
| name | Yes | Display name customers see, e.g. "Pro". Can change later. | |
| trial | No | Whether the plan has a free trial. Required when amount is above 0; ask the developer. | |
| amount | No | First recurring price amount. 0 for a free or contact-sales tier. Ask the developer. | |
| currency | No | ISO currency code, e.g. "USD". Required when amount is above 0; ask the developer. | |
| interval | No | Billing recurrence interval. | |
| trialDays | No | Trial length in days. Required when trial is true. | |
| description | No | Short description shown with the plan. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the generic safety profile (non-read-only, non-idempotent, non-destructive). The description adds behavior the agent could not infer: the DECISION_NEEDED no-op path when developer decisions are missing, the 'returns the full plan' outcome, and the quota-counting contract (backend decorator vs browser reporting, never both). That is substantive disclosure beyond structured fields.
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?
Core purpose and alternatives are front-loaded effectively, but the trailing paragraphs on quota counting and the integration guide are lengthy and only loosely tied to invoking create_plan. They add useful ecosystem context but dilute the tool's own call semantics.
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 9-parameter creation tool with no output schema, the description supplies the missing return statement ('Returns the full plan'), the failure mode (DECISION_NEEDED), and the correct follow-up calls. Nothing an agent needs to invoke this correctly is absent.
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 real meaning on top: why key must be stable and that flag rules point at features not the key, that amount 0 is legitimate (free/contact-sales), and the conditional dependency currency/trial are only needed when amount is above 0, which the schema does not express as a rule.
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 a specific verb and resource plus scope ('Create a new subscription plan with its first recurring price'), immediately distinguishing it from siblings like set_plan_price and apply_plan. An agent can tell exactly what state this call leaves behind without opening any schema.
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 routes to alternatives and conditions: add prices via set_plan_price, quotas via set_plan_quota, all-in-one via apply_plan, later edits via update_plan, and pre-work via get_integration_guide. It also states when the tool refuses (missing price/currency/trial decisions), which is real when-not guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_privilegeCreate PrivilegeAInspect
Create a new privilege: a named permission roles can grant. Arguments: key (permanent, upper-case, e.g. "REPORTS_VIEW" — code and flag rules compare it exactly) and description (what it allows). A new privilege is granted by no role until you add it with update_role (pass the full privilege list) or create_role. Same as bridge privilege create. What a role can do is only the app's default setup until you have read it here. Control access with a flag rule on a privilege (preferred) or on the role key, never with a hard-coded role check in app code. A privilege rule matches the whole key: privileges contains "REPORTS_VIEW" does not match REPORTS_VIEW_ALL. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Privilege KEY: permanent, upper-case, e.g. "REPORTS_VIEW". | |
| description | No | What people holding this privilege may do. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare the safety profile (not read-only, not idempotent, not destructive, closed-world), and the description adds genuinely new behavioral facts: the key is permanent, matching compares the whole key exactly ('REPORTS_VIEW' does not match REPORTS_VIEW_ALL), and the privilege starts ungranted. It does not cover permissions or rollback, but adds meaningful state-consequence 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?
Front-loaded with the definition of the resource, followed by argument notes and workflow guidance; every sentence carries information. It is a little sprawling at six sentences, with policy advice mixed into a tool description, but nothing is gratuitous.
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 three-parameter creation tool with no output schema, the description covers creation semantics, the ungranted default state, the follow-up calls needed to actually grant it, and a pointer to the integration guide. Nothing needed 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 description coverage is 100%, so the schema already documents all three parameters, and the baseline is 3. The description adds only marginal value beyond it (key permanence, exact-match comparison), largely restating the schema's example and casing rule.
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 a specific verb and resource and defines what a privilege is ('a named permission roles can grant'), which distinguishes it from create_role, update_privilege and delete_privilege without opening any schema. An agent knows exactly what this call produces.
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 routes the agent: a new privilege is granted by no role until added via update_role (with the full privilege list) or create_role, and it directs consumers to get_integration_guide with topic=team before writing app code. It also states the preferred access-control pattern (flag rule on a privilege) versus the anti-pattern (hard-coded role check).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_roleCreate RoleAInspect
Create a new access role. Arguments: name (display name), key (stable identifier code references, e.g. "ADMIN"), description, privileges (list of privilege KEYS the role grants — see list_roles for the keys existing roles use), and isDefault (make this the role assigned to people added to a workspace without a role named; default false). Use update_role to change an existing role and set_default_role to make an existing role the default. What a role can do is only the app's default setup until you have read it here. Control access with a flag rule on a privilege (preferred) or on the role key, never with a hard-coded role check in app code. A privilege rule matches the whole key: privileges contains "REPORTS_VIEW" does not match REPORTS_VIEW_ALL. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Role KEY: permanent, upper-case, e.g. "EDITOR". Code and flag rules compare it exactly. | |
| name | Yes | Display name, e.g. "Editor". | |
| isDefault | No | Make this the default role for new users (default false). | |
| privileges | No | Privilege keys the role grants (default: none). | |
| description | No | What people with this role do. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-readOnly, non-destructive, non-idempotent, so safety is covered. The description adds real behavioral context: what isDefault actually does, that privilege keys are matched whole (REPORTS_VIEW != REPORTS_VIEW_ALL), and that role capabilities are only defaults until read back. It omits what happens on a duplicate key or invalid privilege, which keeps it from a 5.
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?
Purpose is correctly front-loaded, but the middle drags in integration-architecture advice (flag rules, never hard-coding role checks in app code) that is only tangential to invoking this tool. The parameter listing is a single dense sentence and the piece is longer than the operation warrants.
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 6-parameter mutation tool with no output schema and full schema coverage, the description covers purpose, routing, parameter intent, and downstream integration needs. Only failure modes (duplicate key, unknown privilege) are unaddressed.
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, but the description still adds value: it characterizes privileges as KEYS and points to list_roles for the valid set, restates key as a stable code reference, and clarifies isDefault's default. It does not add syntax beyond the schema, so not a 5.
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?
Opens with a specific verb+resource ("Create a new access role") and immediately separates itself from update_role and set_default_role, so an agent can route correctly without opening a schema. The scope is 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?
Explicitly names the alternatives and the condition that selects them: use update_role for an existing role, set_default_role to promote an existing one. It also routes the agent to list_roles for privilege keys and get_integration_guide before writing consuming code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_tenantCreate TenantAInspect
Create a new tenant (workspace/customer account) in the Bridge app. Arguments: ownerEmail (required — the owner user is created and invited by the platform), name (tenant display name), plan (a plan KEY from list_plans, e.g. "pro" — note this is the key, the same value feature-flag rules compare), locale (ISO 639-1, e.g. "en"). Use invite_user to add more users to the tenant afterwards. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| name | No | Tenant display name. | |
| plan | No | Plan KEY from list_plans (not the plan name). | |
| locale | No | ISO 639-1 locale, e.g. "en". | |
| ownerEmail | Yes | Email of the person who will own the new tenant. Bridge creates and invites them. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (readOnly=false, destructive=false, idempotent=false); the description adds a real behavioral fact those do not encode — the owner user is created and invited as a side effect of this call. It does not say what happens on a duplicate/invalid owner email or what is returned, so 4 rather than 5.
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?
Front-loaded purpose sentence followed by a compact argument list and two follow-up pointers; all sentences carry information. It is slightly list-heavy, but nothing is wasted.
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 non-idempotent creation tool with no output schema, the description covers the resource, the required owner, the side effect of owner creation, and the next-step tooling. It stops short of describing what the call returns or how duplicate tenants are handled.
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 baseline is 3. The description does add genuine meaning for 'plan' (it is the KEY compared by feature-flag rules, not the display name) and for locale, but it omits the 'app' parameter entirely, so the net gain over the schema is modest.
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 a specific verb and resource ('Create a new tenant') and immediately disambiguates the term as 'workspace/customer account' in the Bridge app, which separates it from create_app, create_user, and create_plan in the sibling list.
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?
Gives concrete forward guidance: 'Use invite_user to add more users to the tenant afterwards' and 'Before writing app code that consumes this, call get_integration_guide with topic=team'. It lacks any explicit when-not-to-use or sibling-selection condition (e.g. create_test_user vs. this), so it stops short of a 5.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_test_userCreate Test UserAInspect
Create a test user to prove sign-in works: a generated email and password, in its own workspace named "[test] …" and marked as a test fixture (no plan, no emails sent). Returns the email and the generated password; pass them to verify_login. Test-user sign-ins never count as real ones. On a production Bridge environment, or when the app's Stripe keys are live, the call is refused unless confirm repeats the app's exact name — ask the user first. Same as bridge test-user create. Before writing app code that signs users in, call get_integration_guide with topic=auth and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| confirm | No | Only needed on production or with live Stripe keys: the app's exact name, repeated after the user agreed. Do not supply it on your own initiative. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false): it discloses that no plan is attached, no emails are sent, test sign-ins never count as real ones, and that the call is refused on production/live Stripe unless confirm repeats the exact app name. This is rich, non-obvious 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?
Purpose and return values are front-loaded, and each sentence adds distinct value (return payload, test-fixture semantics, production guard, CLI equivalence, auth-guide routing). It runs long at five sentences, but none is disposable filler, so the length is largely earned.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the description supplies the return values (email and generated password) and their downstream use. It covers the mutation's side effects, the refusal guard, and follow-up calls, leaving nothing an agent needs in order to invoke 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?
Schema coverage is 100%, so both parameters are already documented. The description nonetheless adds meaning: it explains the confirm-trigger condition (production or live Stripe keys) and that confirm is the app's exact name repeated only after user agreement, reinforcing the schema's 'do not supply on your own initiative' note.
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 a specific verb (create) and resource (test user) with exact scope: a generated email/password, its own '[test] …' workspace, marked as a test fixture. This is clearly distinguishable from siblings like invite_user, create_tenant, and get_user, which create or fetch real users/workspaces.
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 routes to alternatives: 'pass them to verify_login' after creation, and 'Before writing app code that signs users in, call get_integration_guide with topic=auth.' It also names the refusal condition on production/live-Stripe and instructs the agent to ask the user first, covering when-not-to-invoke without prompt.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
debug_auth_issueDebug Sign-In IssueARead-onlyIdempotentInspect
When someone cannot sign in: their recent sign-in attempts, newest first, each failure with the reason (WRONG_PASSWORD, USER_NOT_FOUND, NO_PASSWORD_SET, NO_ACTIVE_WORKSPACE, MFA_CODE_INVALID, ORIGIN_NOT_ALLOWED, …), a plain explanation and the fix — plus whether the user exists, has a password and has an active workspace. The reasons are for the app's admins only; the person signing in is always just told the credentials were wrong. Same as bridge event auth-attempts. To reproduce a sign-in yourself, use verify_login.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| user | Yes | The user's email address (or user id). | |
| limit | No | Most attempts to return (default 20). | |
| since | No | How far back: 24h, 7d, 2w or an ISO date. Default: all recorded. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnly/idempotent/non-destructive, so the description's job is to add context — and it does: newest-first ordering, the enumerated reason codes, the fact that reasons are admin-only while the end user is told only that credentials were wrong, and the auto-generated plain explanation and fix per failure. That last point materially changes how an agent should present the output.
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?
Front-loaded trigger, then return shape, then the admin-only caveat, then the sibling pointer — a sensible order with no filler sentences. The middle enumeration of reason codes is long but functional, since those tokens are what the agent will relay.
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?
There is no output schema, so the description must carry the return contract, and it does: attempts, ordering, per-failure reason code plus explanation and fix, and three user-state flags. With all four parameters documented in the schema, an agent has everything needed to call and interpret this 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 description coverage is 100%, so app, user, limit and since are already documented with defaults and bounds in the schema. The description adds no parameter-level detail (e.g. no mention of the since window or the 100 cap), 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?
States a specific verb and resource (debug sign-in) and enumerates the exact payload: recent sign-in attempts, newest first, each with failure reason, explanation and fix, plus user existence/password/workspace facts. It is unmistakably distinct from list_users or get_user, which would be the other way to reach this data.
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 trigger is explicit and front-loaded: 'When someone cannot sign in.' It also routes the agent to the alternative verb by name and condition — 'To reproduce a sign-in yourself, use verify_login' — versus the diagnostic use here. No explicit when-not-to-use case is given, which is the only gap.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_feature_flagDelete Feature FlagADestructiveInspect
Permanently delete a feature flag by its KEY. THIS IS IRREVERSIBLE — the flag, its targeting rule, its schedule and its evaluation history are gone, and any app code still calling the key silently falls back to its hard-coded default. There is no undo and no archive. Requires confirmation: pass confirm set to the exact flag key, and only after the user has explicitly asked for the deletion — do not supply it on your own initiative. Prefer toggle_feature_flag to switch a flag off, which is reversible and is what "turn this off" almost always means. To retire a flag properly, remove the code that reads it first, then delete. dryRun: true previews it first — the flag's state, rule and schedule and what deleting it does — without deleting anything or needing confirm. Fails with FLAG_NOT_FOUND when no flag has the given key. Before writing app code that consumes this, call get_integration_guide with topic=feature-flags and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Flag KEY to delete (see list_feature_flags). | |
| dryRun | No | true previews what the deletion would affect and deletes nothing — no confirm needed. Do this first and show the user the result. Needs the same privilege as the deletion itself. | |
| confirm | No | Repeat the exact key of the resource being deleted, as confirmation. Required to delete; not needed with dryRun. This is a deliberate safety step — do NOT guess it or copy it from a fuzzy match. If you are not certain, list the resources first and ask the user which one they mean. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint/readOnlyHint/idempotentHint, but the description adds the details an agent actually needs: exactly what is destroyed (rule, schedule, evaluation history), the silent fallback to hard-coded defaults, no undo/no archive, the confirmation contract, and the FLAG_NOT_FOUND failure mode.
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?
Front-loaded with the irreversibility warning, which is the right priority for a destructive tool, and every sentence carries actionable content. It runs long and packs multiple concerns (fallback behavior, integration guide pointer, error code) into one block, so it is dense but slightly over-full.
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, no-output-schema tool, the description covers consequences, reversibility, confirmation semantics, dry-run preview, and failure modes — everything an agent needs to call it safely and 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 baseline is 3, but the description adds real meaning: confirm must equal the exact key and must only be supplied after explicit user request (not agent initiative), and dryRun previews without needing confirm. The added constraint on confirm goes beyond the schema text, though per-parameter coverage is otherwise complete.
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?
Opens with a precise verb+resource+scope: 'Permanently delete a feature flag by its KEY.' It clearly distinguishes this from siblings (toggle_feature_flag, update_feature_flag, clear_flag_schedule) by naming the alternative that most callers actually want.
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?
Explicit when-to-use and when-to-prefer-an-alternative: 'Prefer toggle_feature_flag to switch a flag off, which is reversible.' It also prescribes the correct retire sequence (remove consuming code first, then delete) and positions dryRun:true as the required first step.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_planDelete PlanADestructiveInspect
Delete a subscription plan that NO workspace is on; its Stripe product and prices are archived. A plan workspaces are on is REFUSED with PLAN_IN_USE and nothing changes: tell the user how many workspaces are on it and offer the choices — archive_plan (they keep it, nobody new can choose it), or move them with set_tenant_plan, or delete them with delete_tenant, and then delete the plan. REQUIRES CONFIRMATION: call again with confirm set to the exact plan key, only after the user has explicitly agreed — never supply it on your own initiative. dryRun: true previews it first (delete or refuse, and which workspaces are on the plan) without changing anything or needing confirm. Fails with PLAN_NOT_FOUND when no plan has that key. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY (see list_plans). | |
| dryRun | No | true previews what the deletion would affect and deletes nothing — no confirm needed. Do this first and show the user the result. Needs the same privilege as the deletion itself. | |
| confirm | No | Repeat the exact key of the resource being deleted, as confirmation. Required to delete; not needed with dryRun. This is a deliberate safety step — do NOT guess it or copy it from a fuzzy match. If you are not certain, list the resources first and ask the user which one they mean. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (destructiveHint=true, idempotentHint=false): it names what is archived (Stripe product and prices), the exact refusal error and that nothing mutates in that case, the required confirmation flow with the 'never supply it on your own initiative' guardrail, the dryRun preview semantics, and the PLAN_NOT_FOUND failure mode.
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?
Front-loaded with the core action, refusal behavior, and the confirmation gate; every clause carries operational weight. It is long and uses shouted emphasis (NO, REFUSED, REQUIRES CONFIRMATION), but no sentence is filler, so the length is justified for a destructive operation.
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 4-parameter destructive tool with no output schema, the description covers the mutation's side effects, the refusal branch, the two-step confirmation workflow, error codes, and a pointer to get_integration_guide for downstream app code. Nothing an agent needs to invoke this safely 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 the baseline is 3; the description earns one more by supplying the call-ordering semantics (dryRun first, then re-call with confirm set to the exact key) that the schema fields describe only individually. Much of the confirm/dryRun text overlaps the schema descriptions, so it is additive rather than fully novel.
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 a specific verb+resource (delete a subscription plan) and immediately scopes it: only plans NO workspace is on, with the side effect (Stripe product/prices archived). It distinguishes itself from the nearest siblings by naming archive_plan, set_tenant_plan, and delete_tenant as the alternatives in the refusal path.
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?
Gives explicit when-to-use and when-not-to-use: a plan in use is REFUSED with PLAN_IN_USE and nothing changes, and the agent is told exactly which sibling to pick for each user choice (archive_plan, set_tenant_plan, delete_tenant). It also states the required sequence (dryRun first, then confirm) and the prerequisite guide lookup.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_privilegeDelete PrivilegeADestructiveInspect
Permanently delete a privilege, addressed by its key (or id) from list_privileges. THIS IS IRREVERSIBLE — the privilege is removed from every role that grants it, so people holding those roles lose it at their next sign-in, and flag rules and app code that check its key stop matching anyone. The AUTHENTICATED privilege cannot be deleted. Requires confirmation: pass confirm set to the exact privilege key, and only after the user has explicitly asked for the deletion — do not supply it on your own initiative. To take a privilege away from one role only, use update_role instead. dryRun: true previews it first — the privilege and the roles that grant it — without deleting anything or needing confirm. Fails with PRIVILEGE_NOT_FOUND when nothing matches. Same as bridge privilege delete. What a role can do is only the app's default setup until you have read it here. Control access with a flag rule on a privilege (preferred) or on the role key, never with a hard-coded role check in app code. A privilege rule matches the whole key: privileges contains "REPORTS_VIEW" does not match REPORTS_VIEW_ALL. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Privilege id from list_privileges, instead of key. | |
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | No | Privilege KEY from list_privileges, e.g. "REPORTS_VIEW". Pass this or id, not both. | |
| dryRun | No | true previews what the deletion would affect and deletes nothing — no confirm needed. Do this first and show the user the result. Needs the same privilege as the deletion itself. | |
| confirm | No | Repeat the exact key of the resource being deleted, as confirmation. Required to delete; not needed with dryRun. This is a deliberate safety step — do NOT guess it or copy it from a fuzzy match. If you are not certain, list the resources first and ask the user which one they mean. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already flag destructiveHint=true and readOnlyHint=false, but the description goes well beyond them: it explains what is destroyed (the privilege removed from every role, holders lose it at next sign-in, flag rules and app code stop matching), the hard constraint (AUTHENTICATED cannot be deleted), the confirm/idempotency safety contract, and the PRIVILEGE_NOT_FOUND failure mode.
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 core action, irreversibility, and confirm contract are front-loaded well, but the tail drifts into tangential platform guidance about flag rules, hard-coded role checks, and privilege-rule key matching ('REPORTS_VIEW' does not match REPORTS_VIEW_ALL). That material is relevant to the auth model but not to invoking this delete tool, so it dilutes an otherwise tight definition.
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 no output schema, the description still covers effects, permissions needed, error conditions, the reversible preview path, and sibling routing — everything an agent needs to call this destructive tool safely.
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 baseline is 3; the description adds meaning by clarifying that confirm must be the exact resource key and must not be guessed or copied from a fuzzy match, and that dryRun needs no confirm. It stops short of documenting the app parameter's scoping behavior in prose, so it exceeds but does not maximize the dimension.
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 a specific verb and resource ('Permanently delete a privilege') plus the addressing mode (its key, or id, from list_privileges). An agent can immediately distinguish this from create_privilege, update_privilege, and delete_role without opening any schema.
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?
Explicit when-not guidance and an alternative: 'To take a privilege away from one role only, use update_role instead.' It also prescribes the ordering (dryRun first, then confirm only after explicit user request) and the correct remediation path (get_integration_guide with topic=team) for consuming code, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_roleDelete RoleADestructiveInspect
Permanently delete an access role, addressed by its key (or id) from list_roles. THIS IS IRREVERSIBLE. People who hold the role are NOT moved to another one — reassign them first with update_user, or they are left holding a role that no longer exists. Flag rules and app code that check the role key stop matching anyone. The default role and the OWNER role cannot be deleted: to delete the current default, make another role the default with set_default_role first. Requires confirmation: pass confirm set to the exact role key, and only after the user has explicitly asked for the deletion — do not supply it on your own initiative. dryRun: true previews it first — the role and the privileges it grants — without deleting anything or needing confirm. Fails with ROLE_NOT_FOUND when nothing matches. Same as bridge role delete. What a role can do is only the app's default setup until you have read it here. Control access with a flag rule on a privilege (preferred) or on the role key, never with a hard-coded role check in app code. A privilege rule matches the whole key: privileges contains "REPORTS_VIEW" does not match REPORTS_VIEW_ALL. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Role id from list_roles, instead of key. | |
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | No | Role KEY from list_roles, e.g. "EDITOR". Pass this or id, not both. | |
| dryRun | No | true previews what the deletion would affect and deletes nothing — no confirm needed. Do this first and show the user the result. Needs the same privilege as the deletion itself. | |
| confirm | No | Repeat the exact key of the resource being deleted, as confirmation. Required to delete; not needed with dryRun. This is a deliberate safety step — do NOT guess it or copy it from a fuzzy match. If you are not certain, list the resources first and ask the user which one they mean. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, but the description adds critical non-obvious behavior: irreversibility, that holders are NOT migrated, that flag rules and app code checking the key silently stop matching, the confirm gating requirement, and the ROLE_NOT_FOUND failure mode.
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 destructive warning and confirm requirement are front-loaded, which is correct. The trailing guidance on privilege-rule matching, app-code patterns, and get_integration_guide is tangentially related to a delete operation and adds length, though it is well-disclosed.
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 no output schema, five optional params, and a high-risk mutation, the description supplies everything needed: side effects, prerequisites, confirmation protocol, dry-run behavior, and error semantics. An agent can call this correctly without further context.
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, but the description adds semantic nuance beyond the schema — that confirm must reflect an explicit user request rather than agent initiative, and that dryRun needs no confirm. It does not add much on id/key/app beyond what the schema states.
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 a specific verb and resource (permanently delete an access role) and clarifies the addressing mode (key or id from list_roles). It is immediately distinguishable from siblings like create_role, update_role, delete_privilege, and list_roles.
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 covers when-not (default and OWNER roles cannot be deleted; make another default with set_default_role first), prerequisite work (reassign holders with update_user), and the recommended dryRun-first workflow. Alternatives and preconditions are named, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_tenantDelete TenantADestructiveInspect
Delete a tenant and everything scoped to it (its users, subscription and data). This is IRREVERSIBLE and REQUIRES CONFIRMATION: resolve the tenant first, then call again with confirm set to the exact tenant name. Only do so after the user has explicitly agreed to the deletion — never supply the confirmation on your own initiative. Fails without deleting anything when the name matches no tenant (TENANT_NOT_FOUND), matches several (TENANT_AMBIGUOUS), or the confirmation does not match. To remove a single person instead of the whole workspace use remove_user. dryRun: true previews it first — the members, which of them lose their login account, and the side effects — without deleting anything or needing confirm. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| name | Yes | Tenant NAME from list_tenants (a tenant id is accepted as a fallback). | |
| dryRun | No | true previews what the deletion would affect and deletes nothing — no confirm needed. Do this first and show the user the result. Needs the same privilege as the deletion itself. | |
| confirm | No | Repeat the exact key of the resource being deleted, as confirmation. Required to delete; not needed with dryRun. This is a deliberate safety step — do NOT guess it or copy it from a fuzzy match. If you are not certain, list the resources first and ask the user which one they mean. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true and idempotentHint=false, but the description adds substantial behavioral context beyond them: irreversibility, the mandatory two-step confirmation protocol, the specific failure modes (TENANT_NOT_FOUND, TENANT_AMBIGUOUS, confirm mismatch) that all leave data intact, and that dryRun requires the same privilege as the deletion. This is exactly the extra context a destructive tool needs.
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 front-loaded, leading with the destructive scope and irreversibility, then the confirmation ritual, then failure modes, then dryRun, then the sibling alternative. Each sentence carries operational weight; the trailing get_integration_guide pointer is the only mildly tangential element, keeping it just under a 5.
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 mutation with no output schema, the description covers everything an agent needs: the confirmation protocol, dryRun preview semantics, all named error outcomes, the sibling alternative, and even a follow-up tool for app integration. No return-format gap because there is no output schema to describe.
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, but the description adds real meaning: confirm must be 'the exact tenant name' (clarifying the schema's generic 'repeat the exact key'), the confirm/dryRun interaction, and that name resolution happens before confirmation. It stops short of explaining the app param, but the parameter-level workflow semantics go beyond the schema text.
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?
Opens with a specific verb+resource plus the blast radius ('Delete a tenant and everything scoped to it (its users, subscription and data)'), so the agent immediately knows the scope of destruction. It explicitly distinguishes itself from the sibling remove_user ('To remove a single person instead of the whole workspace use remove_user'), which no other sibling needs to be consulted to disambiguate.
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?
Gives an explicit when-to-use sequence: resolve the tenant first, then call again with confirm set to the exact tenant name, and only after the user has explicitly agreed. It also sets a clear exclusion ('never supply the confirmation on your own initiative') and points to dryRun as the safe precursor, so the agent knows both the trigger and the guardrail.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
diagnose_integrationDiagnose IntegrationARead-onlyIdempotentInspect
Check a project's Bridge configuration against the real app and return every concrete difference with its fix: wrong app id, a base URL pointing at another Bridge environment, a callback URL that is not a registered redirect URI, an origin that is not allowed, a missing variable the framework needs, an API key in a browser-bundled variable (VITE_*, NEXT_PUBLIC_*), and whether this environment serves its signing keys. Pass only the Bridge-related variables from the project's .env files. For any secret (BRIDGE_API_KEY or anything named *_KEY / *_SECRET) send a placeholder such as "" — never the real value; only its presence and placement are checked. bridge diagnose does the same from a shell and reads the .env files itself. get_environment_info lists the values each variable should hold; add_redirect_uri and update_app fix what it finds.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| env | Yes | The project's Bridge-related env vars, name → value, e.g. {"VITE_BRIDGE_APP_ID": "…", "VITE_BRIDGE_CALLBACK_URL": "http://localhost:5173/auth/callback"}. Secrets as "<set>", never their value. | |
| framework | No | The framework the project uses. Inferred from the variable names when omitted. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotent/non-destructive, and the description adds genuinely new behavioral constraints: the strict secret-handling rule (send '<set>' for BRIDGE_API_KEY or any *_KEY / *_SECRET, never the real value, since only presence and placement are checked) and the fact that it compares against the live app rather than static config. This is exactly the kind of context annotations cannot express.
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?
Front-loads the purpose in the first clause and keeps every sentence load-bearing, including the enumerated failure modes that justify the tool's breadth. The dense middle paragraph is long, but the detail is functional rather than padding.
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 no output schema, the description still specifies the return shape ('every concrete difference with its fix'), the input contract, and the remediation path via sibling tools. An agent has everything needed to call it correctly and act on the result.
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, but the description adds real meaning: it scopes `env` to Bridge-related variables only and states the placeholder convention for secrets, and it explains that `framework` is inferred when omitted. The `app` parameter's 'omit to use current app' semantics live mostly in the schema, so this stops short of 5.
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 a specific verb and resource ('Check a project's Bridge configuration against the real app') and then enumerates exactly what it detects (wrong app id, base URL pointing at another environment, unregistered callback URL, disallowed origin, missing variable, secret in browser-bundled var, signing-key availability). This makes it trivially distinguishable from siblings like get_environment_info or debug_auth_issue.
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 what to pass ('only the Bridge-related variables from the project's .env files'), names the CLI equivalent (`bridge diagnose` reads .env itself), and routes follow-up work: get_environment_info for expected values, add_redirect_uri and update_app for fixes. When-to-use and alternatives are both covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
evaluate_feature_flagEvaluate Feature FlagARead-onlyIdempotentInspect
Dry-run a feature flag against a synthetic context and explain the verdict. Nothing is written and no eval is recorded — this evaluates the live flag config in-process with the exact evaluator the server and the SDKs use, so the answer matches what the app would see. Use it to check targeting you just wrote before shipping code that depends on it. Arguments: key (required), identity (the stable id the rule buckets on — a user id, tenant id or device key), and attributes (a flat map of the values the rule tests, e.g. { "bridge:billing.entitlement.analytics": true, "privileges": ["REPORTS_VIEW"] }; dotted paths and nested objects both resolve, and roles are their KEYS). Returns the resolved value plus an explanation: which branch matched (or that none did), whether a rolloutPct bucket applied, and the bucket number. IMPORTANT: a rule with rolloutPct < 100 requires an identity; called without one the evaluator returns the safe otherwiseValue instead of bucketing, which is reported explicitly rather than looking like a targeting failure. warnings also names settings that cannot mean what they look like: switched on while the onValue is false, or a rule on a plan or role the app does not have. get_flag shows the rule being evaluated; update_feature_flag changes it.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Flag KEY to evaluate (see list_feature_flags). | |
| identity | No | Stable per-eval identity used for sticky rollout bucketing. REQUIRED for a meaningful answer whenever the rule has rolloutPct < 100. | |
| attributes | No | Attribute values the rule conditions read. Dotted keys ("user.role") and nested objects both work. Values may be strings, numbers, booleans, objects or lists (privileges is a list of privilege keys). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: 'Nothing is written and no eval is recorded,' the evaluator is the same one the server/SDKs use so results match production, and it discloses the rolloutPct<100-without-identity fallback to otherwiseValue plus the `warnings` behavior for misleading settings. None of this is derivable from readOnlyHint/idempotentHint.
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?
Front-loaded with the purpose and the write-safety guarantee, then parameters, then the rolloutPct caveat. It is on the long side and somewhat dense, but nearly every clause carries non-redundant information, so little could be cut without losing behavioral detail.
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 no output schema, the description still describes the return shape (resolved value, which branch matched, whether a bucket applied, the bucket number, and warnings), and covers the identity-required edge case. An agent has everything needed 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?
Schema coverage is already 100%, yet the description adds real meaning: identity is the id the rule buckets on (user/tenant/device), attributes is a flat map with a worked example, dotted paths and nested objects both resolve, and roles are referenced by their KEYS. It also flags the identity-required precondition for partial rollouts.
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?
Opens with a specific verb+resource+scope: 'Dry-run a feature flag against a synthetic context.' It explicitly routes away from siblings, noting get_flag shows the rule and update_feature_flag changes it, so an agent can distinguish it without opening any schema.
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?
States the concrete use case ('check targeting you just wrote before shipping code that depends on it') and contrasts the read-only dry-run against get_flag (inspect) and update_feature_flag (mutate). When-to-use is explicit and the alternatives are named.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
export_feature_flagsExport Feature FlagsARead-onlyIdempotentInspect
Export every feature flag as a portable "flags as code" bundle: { version: 1, flags: [...] }, sorted by key. Each entry carries key, description, state, valueType, onValue/offValue, the full targeting rule and any schedule — everything import_feature_flags needs, and nothing environment-specific (no ids, no eval counters), so the bundle can be committed to a repo or promoted from one environment to another. The format matches the Bridge CLI's bridge flag export, so bundles move between the two. Use list_feature_flags instead when you just want to read the current setup, since that keeps the ids.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered; the description adds genuinely new behavioral context — deterministic key ordering, exclusion of environment-specific data (no ids, no eval counters), and CLI-format compatibility. It does not discuss permissions or rate limits, but for a read-only export those are marginal, so a 4 rather than a 5.
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?
Front-loads the core action and the bundle shape in the first sentence, then spends the remaining sentences on portability guarantees and the sibling alternative. The field enumeration is dense but each clause carries decision-relevant information; only minor trimming is possible.
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?
There is no output schema, so the description carries the return-value burden — and it does, specifying the envelope ({version, flags}), ordering, and per-entry fields, plus what is deliberately omitted. An agent has everything needed to call it and interpret the result.
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 single `app` parameter is fully documented in-schema (including the 'omit to use current app' fallback). The description adds nothing about the parameter, so the baseline 3 applies — the schema does all the work here.
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 a specific verb (export) and resource (feature flags) plus the exact artifact produced — a portable 'flags as code' bundle. It distinguishes itself from both import_feature_flags (the counterpart) and list_feature_flags (the id-preserving reader), so an agent can pick it without opening another schema.
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 names the alternative and the selecting condition: 'Use list_feature_flags instead when you just want to read the current setup, since that keeps the ids.' It also frames import_feature_flags as the round-trip partner, giving the agent a clear when/when-not boundary.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_appGet AppARead-onlyIdempotentInspect
Read the full Bridge app configuration: name, URLs, enabled login methods, registered redirect URIs, default role, plan/billing setup and other app-level settings. Call this first to understand how the app is configured before changing anything or diagnosing auth issues. Narrower reads: get_auth_config for login methods, get_environment_info for the values a project's .env needs, and get_setup_status for what is still missing before going live. Change settings with update_app.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
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 safety is covered. The description adds value beyond them by disclosing the breadth of the read (full app configuration, not a slice) and positioning it as the diagnostic entry point, though it says nothing about response size or auth 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?
Three sentences, each earning its place: scope first, then usage priority plus alternatives, then the mutation counterpart. No filler and the most decision-relevant content is front-loaded.
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 no output schema, the description compensates by enumerating what the read returns, and it routes the agent to siblings for narrower slices. For a single-optional-param read tool this is complete enough to invoke correctly without further exploration.
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?
Only one optional parameter ('app') exists and schema description coverage is 100%, so the schema already explains the id and the omit-to-use-current-default behavior. The description adds no parameter-level detail, which is the expected baseline when the schema does the work.
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 a specific verb and resource ('Read the full Bridge app configuration') and enumerates the concrete contents (name, URLs, login methods, redirect URIs, default role, plan/billing setup). It also explicitly separates itself from the narrower readers get_auth_config, get_environment_info, and get_setup_status.
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?
'Call this first ... before changing anything or diagnosing auth issues' gives an explicit trigger condition, and the description names three narrower alternatives with the condition that selects each. The write counterpart, update_app, is also named, closing the read/write loop.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_auth_configGet Auth ConfigARead-onlyIdempotentInspect
Read the Bridge app's login/auth configuration: which login methods are enabled (password — always available on Bridge, magic link, passkeys, MFA as a second factor, and each social provider: Google, LinkedIn, Azure AD, Apple, GitHub, Facebook) plus the access/refresh token TTLs as configured on the app. Use this when building or debugging login UI/flows — e.g. deciding which login buttons to render or why a provider button is missing. Narrower and login-focused compared to get_app, which returns the entire app object; for redirect URIs and env-var wiring use get_environment_info. Same list as bridge auth methods list.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is covered structurally. The description adds substance beyond that: it lists the concrete config surface (magic link, passkeys, MFA, each social provider, access/refresh TTLs) and the nuance that password is always available on Bridge. It does not state auth/permission requirements, which is the remaining gap.
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?
Front-loaded with the primary purpose and kept to a few sentences, each earning its place by adding scope, usage, or sibling routing. The parenthetical enumeration of five social providers is slightly verbose but genuinely informative rather than 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?
No output schema exists, so the description correctly compensates by enumerating the returned configuration surface. Combined with usage context, alternatives, and sibling disambiguation, an agent has everything needed to select and call 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?
There is a single optional `app` parameter and schema description coverage is 100%, so the schema already documents it fully ('Omit to use the current app'). The description adds no parameter-level detail, which is the expected baseline when the schema carries the load.
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?
Opens with a specific verb+resource ('Read the Bridge app's login/auth configuration') and enumerates exactly what is returned: enabled login methods and token TTLs. It actively differentiates from siblings by naming get_app as the broader alternative and get_environment_info as the redirect/env-var tool.
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?
Gives explicit when-to-use scenarios ('building or debugging login UI/flows — deciding which login buttons to render or why a provider button is missing') and routes to two named alternatives with the conditions that select them. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_brandingGet BrandingARead-onlyIdempotentInspect
Read the current branding of the Bridge-hosted auth pages (login, signup, reset password). Returns the applied values — bgColor, textColor, linkColor, primaryButtonBgColor, primaryButtonTextColor, tertiaryButtonBgColor, tertiaryButtonTextColor, fontFamily, borderRadius, boxShadow — plus customCss (whether a custom stylesheet is uploaded) and defaultValues (the Bridge defaults, so you can tell what has actually been customized). Read this before calling update_branding so you keep the values you are not changing.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
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 genuine context beyond that: it explains what customCss means (whether a stylesheet is uploaded) and that defaultValues lets you distinguish customized from default settings, which is real behavioral insight. It stops short of covering permissions or error behavior, so not a 5.
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 sentences, front-loaded with purpose and then the read-before-write rationale. The long field enumeration is not padding — with no output schema it is the only place the return shape is documented, so every item 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?
With no output schema, the description fully carries the return-value burden by listing the applied color/font values, customCss and defaultValues. Combined with annotations covering the safety profile and a 100%-documented single optional param, an agent has everything needed to call this 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?
There is a single optional parameter (app) and schema description coverage is 100%, so the schema already explains its meaning and the 'omit to use the current app' default. The description adds nothing about the parameter, 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?
States a specific verb and resource ('Read the current branding of the Bridge-hosted auth pages') and scopes it precisely to login/signup/reset password pages, which distinguishes it from the broader app/auth config siblings. It also enumerates the returned fields so the agent knows exactly what this read yields.
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 'Read this before calling update_branding so you keep the values you are not changing,' naming the sibling tool and the condition that selects it. The read-before-write workflow is spelled out rather than left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_environment_infoGet Environment InfoARead-onlyIdempotentInspect
Read the practical wiring facts needed to configure a project against this Bridge app: the app id, Bridge API base URL, registered OAuth redirect URIs, default callback URI, allowed CORS origins, and the canonical env-var NAMES each framework reads (with suggested values where derivable). Use this when scaffolding a project, writing a .env file, or debugging a redirect/CORS mismatch. Env-var names are the ones documented by the Bridge framework plugins and CLI guides: Vite frontends use VITE_BRIDGE_*, Next.js uses NEXT_PUBLIC_BRIDGE_APP_ID, server SDKs use BRIDGE_APP_ID (+ BRIDGE_API_KEY where a management/API key is needed); bridge-angular has no env-var convention (configuration is code-based). The API base URL is the one of the Bridge environment this server runs in, which is the one this app lives in. For login-method setup use get_auth_config; for the full app object use get_app.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: which env-var names each framework reads (VITE_BRIDGE_*, NEXT_PUBLIC_BRIDGE_APP_ID, BRIDGE_APP_ID/BRIDGE_API_KEY), that bridge-angular has no env-var convention, and that the base URL reflects the server's own environment.
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 opening sentence front-loads the return contents and the usage sentence follows immediately. The framework-specific env-var enumeration is long but each clause conveys distinct, actionable information; only minor trimming would be possible.
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 no output schema, the description carries the burden of explaining return values and does so thoroughly by enumerating each returned field, including per-framework env-var names. An agent has everything needed to call and interpret the result.
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?
There is a single optional parameter with 100% schema coverage, and the schema already explains it ('Omit to use the current app'). The description does not add syntax or format detail beyond the schema, 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?
States a specific verb (Read) and enumerates exactly what it returns — app id, API base URL, redirect URIs, callback URI, CORS origins, env-var names — and explicitly differentiates itself from siblings get_auth_config and get_app. An agent can identify this tool without opening any schema.
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?
Gives explicit when-to-use triggers (scaffolding a project, writing a .env, debugging a redirect/CORS mismatch) and routes to alternatives with their distinct purposes: get_auth_config for login-method setup, get_app for the full app object. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_flagGet Feature FlagARead-onlyIdempotentInspect
Read one feature flag by its KEY (e.g. "beta-ui") with everything about it: id, key, description, state (off | on | on-with-rule), valueType (boolean | string | number | json), onValue / offValue, the targeting rule, any scheduled state transition, and where the flag came from (source, triagedAt). Evaluation counts are not available through the API. Use this to confirm a flag key and its targeting before relying on it in code; list_feature_flags shows every flag. Fails with FLAG_NOT_FOUND when no flag has the given key. The result carries warnings when the flag cannot mean what it looks like — switched on while its onValue is false, or a rule on a plan or role the app does not have. A warning never blocks the write; read it and fix the flag.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Flag KEY, e.g. "beta-ui" (see list_feature_flags). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), yet the description adds substantial behavior beyond them: the FLAG_NOT_FOUND failure mode, the absence of evaluation counts through the API, and the semantics of the `warnings` array including the fact that warnings do not block a write. That is genuinely useful non-structural 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?
Front-loaded with the core action and key semantics, then failure/warning behavior. The long field enumeration in the first sentence is slightly list-heavy, but every clause carries information an agent needs, so there is little 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?
With no output schema, the description correctly documents the return payload, the error code on a missing key, and the non-blocking warning behavior. An agent has everything required to call it and interpret results without further sources.
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 both `app` and `key` are already documented in the schema, including the same "beta-ui" example. The description reinforces that lookup is by KEY but adds no syntax or meaning beyond the schema, 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?
Names a specific verb and resource ("Read one feature flag by its KEY") and enumerates exactly what is returned (id, key, state, valueType, onValue/offValue, rule, schedule, source). It explicitly distinguishes itself from list_feature_flags, so an agent can tell the two apart without opening either schema.
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?
States the when: "Use this to confirm a flag key and its targeting before relying on it in code." It also names the alternative and its scope ("list_feature_flags shows every flag"), giving a clear selection rule between the two siblings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_integration_guideGet Integration GuideARead-onlyIdempotentInspect
Read the Bridge integration guide for a topic — the supported, opinionated way to consume Bridge from application code. Call this BEFORE writing or changing app code that reads a feature flag, renders billing or team UI, or wires authentication, and before hand-rolling anything against the SDK: the SDKs ship declarative surfaces for these cases (components, route guards, decorators) and reimplementing them against SDK internals is the most common integration mistake. Per-framework topics (framework REQUIRED): integration (first-time setup) | auth | feature-flags | billing | team | branding. Framework-agnostic MASTER topics (framework is IGNORED — omit it): master, the end-to-end auth integration prompt served by bridge guide, which orchestrates project discovery and then routes to the per-framework guides; flags-master and billing-master, the same orchestration for a flags-only or billing-only integration; mechanisms, how limits, upgrades and customization work; orientation, what Bridge does (the same map get_started returns); fit-together, how roles, plans, limits and flags fit together; integration-success, the message to show the developer when an integration is done. Before setting up flags, roles, plans or limits, read topic=fit-together. Start at topic=master when integrating Bridge into a project for the first time. framework: svelte | react | angular | nextjs | nestjs | express — pass the one the target app actually uses; this server cannot detect it. Returns the guide as markdown plus its source URL. Guidance is a default, not a mandate — follow the user's stated preference when it differs.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| topic | Yes | Which guide to read. Use orientation for what Bridge does, master for a first-time end-to-end integration, flags-master/billing-master for a flags-only or billing-only one, mechanisms for how limits, upgrades and customization work, fit-together for how roles, plans, limits and flags fit together (read it before setting any of those up), integration-success for the message to show when an integration is done. Use feature-flags after changing a flag, billing after changing a plan/price/quota, team after changing roles/tenants/invites, auth after changing login methods, SSO or redirect URIs, branding after changing the app's look. | |
| framework | No | The framework the target application uses. Required for the per-framework topics (integration, auth, feature-flags, billing, team, branding) — the server has no way to infer it from the request. Ignored for the master topics, mechanisms, orientation, fit-together and integration-success, which are framework-agnostic. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds real behavioral context beyond them: it returns markdown plus a source URL, the server cannot detect the framework, master topics ignore the framework and orchestrate routing to per-framework guides, and 'guidance is a default, not a mandate'. This is unusually rich disclosure for a read-only 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?
Front-loaded with purpose and usage, which is good, but the topic catalogue is restated almost verbatim in both the description and the schema enum descriptions, and the paragraph runs long with heavy parenthetical chaining. Information-dense but not efficiently sized.
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?
Complete for a read-only guide lookup: no output schema exists, and the description still discloses the return format (markdown + source URL), the topic taxonomy, the framework requirement rules, and cross-topic sequencing. 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 the baseline is 3, but the description adds meaning the enum list does not: the master-vs-per-framework distinction (framework REQUIRED vs IGNORED), the orchestration role of master/flags-master/billing-master, and the 'pass the one the target app actually uses; this server cannot detect it' constraint on framework.
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 a specific verb and resource ('Read the Bridge integration guide for a topic') and immediately frames its scope as the opinionated consumption path, which distinguishes it from siblings like diagnose_integration or scaffold_flags_integration. An agent can tell what it returns and why it exists without opening the schema.
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 prescribes when to call it ('BEFORE writing or changing app code that reads a feature flag, renders billing or team UI, or wires authentication') and warns against the alternative (hand-rolling against SDK internals). Adds sequencing rules ('Start at topic=master when integrating for the first time', 'read topic=fit-together before setting up flags/roles/plans/limits').
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_planGet PlanARead-onlyIdempotentInspect
Read one subscription plan by its KEY (e.g. "pro"), including prices and per-metric usage quotas. Returns key, name, description, trial settings (trial, trialDays), prices (amount, currency, recurrence interval) and quotas (metric, limit, hard vs metered policy, counter vs gauge kind, per-unit pricing for metered quotas). Use list_plans to discover the keys, list_plan_quotas when you only need the quota array, and get_stripe_status to check that billing is actually wired up. Fails with PLAN_NOT_FOUND when no plan has the given key.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY, e.g. "pro" (see list_plans). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false, and openWorldHint=false, covering the safety profile. The description adds meaningful behavioral context beyond that: it enumerates the returned fields and discloses the specific error condition (PLAN_NOT_FOUND). It stops short of mentioning permissions or rate limits, so it is useful but not exhaustive.
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 purpose and immediately follows with return shape, alternatives, and error behavior. Every sentence earns its place by adding distinct value: lookup scope, return contents, sibling routing, and failure mode. There is no filler 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?
Given there is no output schema, the description appropriately describes the return fields in detail (key, name, prices, quotas, etc.). Combined with the explicit sibling alternatives and error condition, an agent has enough context to invoke this read tool correctly. The 100% schema coverage for parameters and the read-only annotations mean nothing essential 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 description coverage is 100%, so both parameters are already documented in the schema, including the example 'pro' for key and the app fallback behavior. The description restates the key example but adds no new syntactic or semantic detail beyond what the schema provides. A score of 3 is the correct baseline when 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 opens with a precise verb and resource: 'Read one subscription plan by its KEY'. It states the exact lookup scope and what is included (prices and per-metric usage quotas), which distinguishes it from list_plans and get_stripe_status. An agent can identify the operation and its target without opening the schema.
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 names specific alternatives and the conditions that select them: list_plans to discover keys, list_plan_quotas when only the quota array is needed, and get_stripe_status to verify billing wiring. The failure condition PLAN_NOT_FOUND further clarifies behavior. This is explicit when-to-use guidance with no guesswork.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_roleGet RoleARead-onlyIdempotentInspect
Read one access role by its KEY (e.g. "ADMIN"), including the full list of privileges it grants. Returns key, name, description, isDefault (whether new users get this role) and privileges (privilege key + description). Use this to confirm a role key and its privilege keys before gating a route or component on them; list_roles shows every role. Fails with ROLE_NOT_FOUND when no role has the given key.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Role KEY, e.g. "ADMIN" (see list_roles). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false and destructiveHint=false, so safety is covered. The description goes beyond that by disclosing the exact return fields and the ROLE_NOT_FOUND failure mode, though it omits whether the lookup is app-scoped in effect.
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?
Three tight sentences with zero filler: identity, usage routing, and failure mode in that order. The key constraint is front-loaded and every clause carries 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?
There is no output schema, so the description compensates by enumerating the returned fields (key, name, description, isDefault, privileges) and the error case. For a two-parameter read tool, an agent has everything needed to call it and interpret the result.
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 both the app and key parameters are already documented in the schema, including the "ADMIN"-style example. The description reinforces the key semantics but adds no format or case-sensitivity detail beyond what the schema provides, 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?
States a specific verb and resource ("Read one access role by its KEY") plus the scope of what is returned. It explicitly contrasts itself with list_roles, so an agent can distinguish it from the sibling without opening a schema.
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?
Provides an explicit use case ("confirm a role key and its privilege keys before gating a route or component on them") and names the alternative (list_roles) for enumerating all roles. Both the when and the alternative are stated, not implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_server_infoGet Server InfoARead-onlyIdempotentInspect
Report the Bridge MCP server version and how many tools it currently exposes. Your own tool list is a snapshot from when this session connected and may be stale. The surest sign is the bridge-catalogue: line every Bridge result ends with: if it differs from the catalogue your server instructions name, Bridge was updated and the user should reconnect. toolCount is a second check: if the server exposes more tools than you can see, tell the user to reconnect rather than concluding a capability is missing. Takes no arguments and changes nothing. For what Bridge does, call get_started; for which app this connection acts on, list_apps.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive/openWorld=false, and the description correctly reinforces 'changes nothing.' Beyond that it discloses non-obvious behavior: the tool list is a snapshot that may be stale, and the `bridge-catalogue:` line in results is the surest staleness signal. It does not cover error modes or exact return field names, but the added context is meaningful.
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?
Front-loaded with purpose, then staleness detection, then the no-side-effects note, then sibling routing. Dense and mostly waste-free, though the closing alternatives sentence and the toolCount explanation overlap slightly in emphasis.
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 no output schema, the description carries return-value burden and does so at a high level (version, toolCount, the catalogue line). For a trivial zero-side-effect introspection tool this is sufficient; only the exact response shape and the handling of the optional `app` argument remain unstated.
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 optional `app` parameter is fully documented by the schema; the baseline is 3. The description adds nothing about `app` semantics — and its claim 'Takes no arguments' is inaccurate given the optional app parameter, which mildly undercuts rather than helps.
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 a specific verb and resource: report the Bridge MCP server version and exposed tool count. It explicitly distinguishes itself from siblings by naming get_started (what Bridge does) and list_apps (which app the connection acts on), so an agent can route without opening schemas.
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?
Gives a concrete when-to-use condition (diagnosing a stale tool list) and states the remedy (tell the user to reconnect) rather than concluding a capability is missing. It also names two alternative tools for adjacent questions, which is exactly the routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_setup_statusGet Setup StatusARead-onlyIdempotentInspect
Readiness checklist for this app: each item (redirect URIs, default callback, allowed origins, UI URL, sign-in methods and SSO credentials, email sender, Stripe, plans, first real sign-in) says configured, missing or attention, with the next step for each, plus productionNeeds: what must still change before real users arrive. Sign-ins by test users never count as the first real one. Same as bridge setup status. To prove sign-in works, create_test_user then verify_login.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive, not open-world), yet the description adds real behavioral context: the three possible statuses per item ('configured, missing or attention'), the next-step field, the separate `productionNeeds` set, and the non-obvious rule that test-user sign-ins never count as the first real one. That last caveat is genuine behavior an agent could not infer from 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?
Front-loaded with the core purpose, then the item list, then the caveat, then the alternative route — a logical order with no filler sentences. The parenthetical enumeration of checklist items is dense but each element earns its place by telling the agent what to expect in the result.
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?
There is no output schema, so the description carries the return-shape burden and does so: per-item status values, per-item next steps, and a `productionNeeds` block. Combined with a single well-documented parameter and full annotation coverage, nothing an agent needs to call or interpret this tool 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?
Only one optional parameter with 100% schema description coverage, so the schema already documents `app` and the omit-for-current-app default. The description says 'this app' but adds no format, id-source, or override detail beyond the schema. Baseline 3 is appropriate when the schema carries the 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?
States a specific verb+resource (readiness checklist for this app) and enumerates exactly what it covers: redirect URIs, default callback, allowed origins, UI URL, sign-in methods/SSO, email sender, Stripe, plans, first real sign-in. This is clearly distinguishable from siblings like get_started, get_auth_config, get_stripe_status or get_app.
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?
Gives an explicit routing decision for one case: 'To prove sign-in works, create_test_user then verify_login' — telling the agent when a different path is correct. It also notes the CLI equivalence ('Same as `bridge setup status`'). It does not state exclusions against adjacent diagnostics tools (diagnose_integration, debug_auth_issue, get_started), so it stops short of a full when/when-not map.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_startedGet Started with BridgeARead-onlyIdempotentInspect
Start here. What The Bridge does, as a short map to relay to the developer: login, teams and workspaces, roles, payments and plans, feature control, look and feel, going live — each with the question to ask them next and the decision guide that follows it (bridge://guides/decisions/). Call it when you are new to Bridge, when the developer asks what Bridge can do, or before choosing which setup to start. Then read the app as it is today with get_app and get_setup_status. Same content as get_integration_guide topic=orientation. Before setting up flags, roles, plans or limits, read get_integration_guide topic=fit-together. Takes no arguments and changes nothing.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint/idempotentHint/destructiveHint=false, so the safety profile is covered; the description reinforces it with 'takes no arguments and changes nothing.' It adds real value by exposing the resource URI pattern bridge://guides/decisions/<area>, which is not derivable from annotations or the empty schema.
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?
Front-loaded with 'Start here.' and every clause carries routing or content information. The single long em-dash sentence is dense and slightly run-on, and the get_integration_guide cross-reference appears twice, costing a little efficiency.
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 no parameters, no output schema and annotations covering safety, the description fully specifies the return content (the map, per-area question, decision guide path) and the follow-up calls. Nothing an agent needs in order to call and act on 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?
Zero parameters, so the baseline is 4; the description sensibly confirms 'takes no arguments' rather than leaving the agent to infer it. No further parameter meaning is possible or 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 states exactly what the tool returns — an orientation map of Bridge's areas (login, teams, roles, payments, feature control, branding, go-live) with the follow-up question and decision guide for each. It explicitly distinguishes itself from get_integration_guide (same content as topic=orientation) and routes the agent onward to get_app and get_setup_status.
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?
Gives three concrete triggers — new to Bridge, developer asks what Bridge can do, or before choosing a setup path — and adds a sequencing rule ('Then read the app as it is today with get_app and get_setup_status'). It also names the correct alternative (get_integration_guide topic=fit-together) before setting up flags, roles, plans or limits.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_stripe_statusGet Stripe StatusARead-onlyIdempotentInspect
Check whether Stripe is connected to the Bridge app and whether its Stripe webhook works. Returns { connected, webhookConfigured, lastWebhookAt, lastWebhookRejectedAt, lastWebhookRejectionReason, webhookRejectionStreak, webhookRejectionsSustained, setupStatus, setupError }. connected=true means the app has stored Stripe keys and can run checkout, subscriptions and billing portal flows. webhookConfigured=false, setupStatus="failed", or webhookRejectionsSustained=true (rejections in several separate minutes, newer than lastWebhookAt; a single rejection is not a problem) means Stripe events (subscription changes, cancellations, payment failures) are NOT reaching Bridge: checkout still works, but those changes will not sync. To repair, call setup_payments again with the same keys (it re-runs setup and replaces the webhook endpoint), or use "Repair webhook" in the payment settings of the Bridge dashboard. Call this before assuming billing works; if connected is false, use setup_payments to supply the keys. For the plans and prices themselves use list_plans. Never returns a key or secret.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnly, idempotent, non-destructive), and the description goes well beyond it: it defines what connected=true implies for checkout/subscriptions/billing portal, explains that webhook failures do NOT block checkout but break event sync, clarifies that a single rejection is not a problem versus a sustained streak, and guarantees no key or secret is returned.
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?
Front-loaded with the core purpose, then the return shape, then failure semantics and repair path. It is long, but with no output schema the field enumeration earns its place; the dense parenthetical about rejection timing is the only slightly hard-to-parse stretch.
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?
No output schema exists, and the description compensates fully by enumerating every returned field and interpreting the key ones (webhookConfigured, setupStatus, webhookRejectionsSustained). Failure interpretation and the remediation path are both present, so nothing an agent needs to act on the result 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 description coverage is 100% and the single optional 'app' parameter is already documented there (including the list_apps pointer and the omit-to-use-current behavior). The description adds no further parameter syntax or format detail, 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?
States a specific verb and resource ('Check whether Stripe is connected to the Bridge app and whether its Stripe webhook works') and distinguishes itself from setup_payments and list_plans by name. An agent can route correctly without opening the schema.
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 when to call it ('Call this before assuming billing works'), what to do when connected is false ('use setup_payments to supply the keys'), how to repair a broken webhook, and which sibling to use for plans/prices ('For the plans and prices themselves use list_plans'). When, when-not, and alternatives are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_tenantGet TenantARead-onlyIdempotentInspect
Get one tenant by its NAME (as shown by list_tenants; a tenant id is also accepted when the name matches nothing). Returns the full tenant record — plan, locale, logo, mfa, payment status, trial, onboarded, owner and metadata. Fails with TENANT_NOT_FOUND when no tenant carries the name, and with TENANT_AMBIGUOUS when several do.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| name | Yes | Tenant NAME from list_tenants (a tenant id is accepted as a fallback). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent and non-destructive, so the safety profile is covered. The description goes beyond them by disclosing the resolution order for 'name' and two concrete failure modes (TENANT_NOT_FOUND, TENANT_AMBIGUOUS) — genuinely useful behavior that annotations cannot convey. It doesn't mention auth scope, so not a 5.
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 sentences, no filler, with the lookup key and its fallback front-loaded before the return contents and error conditions. Every clause carries information 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?
There is no output schema, and the description compensates by enumerating the returned fields (plan, locale, logo, mfa, payment status, trial, onboarded, owner, metadata) plus the two error outcomes. For a two-parameter read tool with rich annotations, nothing material 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 description coverage is 100%, so the baseline is 3. The description's extra detail is the precise fallback rule (id only used when the name matches nothing), which sharpens but largely restates the schema's own note; 'app' is not discussed in the description at all.
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 a specific verb and resource ('Get one tenant') and pins down the lookup key (NAME, with id as fallback), which immediately distinguishes it from the sibling list_tenants and update_tenant. An agent can tell what it retrieves without opening the schema.
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?
Tells the agent where the required identifier comes from ('as shown by list_tenants') and gives an explicit fallback condition (id accepted when the name matches nothing). It stops short of stating when to prefer this over list_tenants or other single-record getters, so it's clear context rather than 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.
get_userGet UserARead-onlyIdempotentInspect
Get one user of a tenant by EMAIL. Arguments: tenantName (the tenant NAME from list_tenants), email (the user, as shown by list_users). Returns the full user record — role, enabled, onboarded, teams, custom params and the tenant it belongs to. Fails with USER_NOT_FOUND when nobody in the tenant has that email, and USER_AMBIGUOUS when more than one record matches.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| Yes | Email address of the user, as list_users shows it. | ||
| tenantName | Yes | Tenant NAME from list_tenants (a tenant id is accepted as a fallback). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world behavior, so the safety profile is covered. The description adds genuinely new behavioral detail: the shape of the returned record (role, enabled, onboarded, teams, custom params, tenant) and two named failure modes (USER_NOT_FOUND, USER_AMBIGUOUS), including the ambiguity condition.
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?
Purpose is front-loaded in the first clause, followed by argument sourcing, return contents, and error semantics in tight sequence. No filler sentences and every clause carries 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?
With no output schema, the description compensates by naming the returned fields, and it covers the two realistic failure paths. The optional `app` parameter is documented in the schema, so nothing needed to call this tool 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 description coverage is 100%, so all three parameters are already documented, including the id-as-fallback for tenantName. The description restates the two required parameters without adding format or constraint detail beyond the schema, 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?
States a precise verb+resource+key ("Get one user of a tenant by EMAIL"), which unambiguously separates it from list_users, get_tenant, and update_user. The scope (single user, scoped to a tenant, keyed by email) is fully specified in the first sentence.
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 explains where each required argument comes from ("tenantName ... from list_tenants", "email ... as shown by list_users"), which effectively routes the agent through prerequisite list calls. It stops short of stating when to prefer this over alternatives or any exclusions, so it is clear context rather than 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.
import_feature_flagsImport Feature FlagsAIdempotentInspect
Apply a "flags as code" bundle: creates flags that do not exist and updates the ones that do, matched by key. Pass the flags array from export_feature_flags (or from the CLI's bridge flag export — same format). Each rule is validated with the same validator create_feature_flag uses, and the whole payload is checked before anything is written, so a bad rule fails the import instead of half-applying it. Set dryRun: true to see exactly what would be created, updated and left alone — including which fields differ — without touching anything; do that first when importing a bundle you did not just export. This tool NEVER deletes: flags that exist remotely but are absent from the bundle are reported as extraneous for you to remove deliberately with delete_feature_flag. Before writing app code that consumes this, call get_integration_guide with topic=feature-flags and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| flags | Yes | The flag documents to apply: { key, description?, state?, valueType?, onValue?, offValue?, rule?, schedule? }. This is the `flags` array from export_feature_flags. | |
| dryRun | No | true reports the diff and writes nothing. Defaults to false. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (which only declare idempotent/non-destructive/non-readonly) by disclosing atomic pre-write validation, that a bad rule fails the whole import rather than half-applying, that the tool NEVER deletes and instead reports extraneous flags, and what dryRun actually returns (created/updated/left-alone plus field diffs). It does not state auth/permission requirements, but the behavioral picture is unusually complete.
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?
Front-loaded with the core upsert behavior, then layered with validation, dryRun, no-delete, and integration-guide guidance. Five sentences is on the long side, but each one carries distinct, non-redundant information; minor trimming of the get_integration_guide aside would tighten it.
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 complex nested upsert tool with no output schema, the description covers the write model, atomicity, dry-run diff semantics, deletion policy, and cross-tool workflow. An agent has everything needed to invoke it safely and interpret the outcome without an output 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 baseline is 3, but the description adds real meaning beyond the schema: it identifies the exact source and shape of the `flags` payload (the array from export_feature_flags / CLI bridge flag export) and explains dryRun's diff output including which fields differ.
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 a specific verb and resource (apply/import a flags-as-code bundle) and immediately defines the upsert semantics: creates missing flags, updates existing ones, matched by key. This clearly separates it from create_feature_flag, update_feature_flag, and export_feature_flags, which it explicitly names.
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?
Explicit when-to-use guidance: set dryRun first when importing a bundle you did not just export; use delete_feature_flag for extraneous flags rather than this tool; call get_integration_guide before writing app code. It names alternatives and the conditions that select them.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
invite_userInvite UserAInspect
Invite a person into a tenant (a customer workspace) by email: Bridge creates the user and sends the invitation. Arguments: tenantName (the tenant NAME from list_tenants, like the other user tools) or tenantId (its id, e.g. from create_tenant), email (the invitee), role (a role KEY from list_roles, e.g. "ADMIN"), firstName, lastName. The role is the developer's decision: without it the tool invites nobody and returns DECISION_NEEDED offering the app's role keys, never the app's default role silently. Returns the new user. Use create_tenant first when the tenant does not exist yet, and update_user to change the role of someone already in it. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| role | No | Role KEY from list_roles. Ask the developer which role invitees get. | |
| Yes | Email address of the person to invite. | ||
| lastName | No | The invitee's last name. | |
| tenantId | No | Tenant id, e.g. from create_tenant. Pass this or tenantName. | |
| firstName | No | The invitee's first name, shown in the invitation. | |
| tenantName | No | Tenant NAME from list_tenants. Pass this or tenantId. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds real behavior beyond the annotations: it creates the user AND sends an invitation, returns the new user, and discloses a notable quirk (role missing means no invite and a DECISION_NEEDED response listing role keys rather than silently applying a default). It doesn't discuss auth requirements or idempotency, but the annotation already covers idempotentHint.
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?
Dense but front-loaded: the core action leads, followed by argument intent, then prerequisite/follow-up guidance. Nearly every sentence earns its place, though the argument-list and next-step guidance could be tightened slightly.
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 7-param mutation tool with no output schema, it covers the key parameters, prerequisite (create_tenant), alternative (update_user), and return value ('Returns the new user'). The unmentioned 'app' parameter and absence of auth/permission notes are minor 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%, so the baseline is 3, but the description adds meaning: role is a KEY from list_roles and must be the developer's explicit choice, tenantName is the NAME from list_tenants while tenantId comes from create_tenant, and firstName/lastName appear in the invitation. Only the 'app' parameter is left unexplained.
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 a specific verb (invite) and resource (person into a tenant/customer workspace) and clarifies that Bridge creates the user and sends the invitation. It explicitly distinguishes itself from create_tenant and update_user, so an agent can route correctly without opening a schema.
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?
Explicit when/when-not and alternative routing: use create_tenant first when the tenant doesn't exist, update_user to change an existing member's role, and get_integration_guide before writing consuming code. This is exactly the routing guidance an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_api_tokensList API TokensARead-onlyIdempotentInspect
List every API token issued for the Bridge app. Each record includes: id, name, the granted privilege keys, the tenant it is scoped to (when any), expireAt, lastUsedAt and createdAt. The token secrets themselves are NOT returned — they are shown only once, by create_api_token. Use this to check which privileges a token carries (notably whether it may perform destructive operations) and to find the token name revoke_api_token takes.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), but the description adds real value by disclosing that token secrets are NOT returned and are only shown once at creation — a critical behavioral fact. It does not mention pagination or result-size limits for a list operation, which keeps it from a 5.
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?
Three sentences, front-loaded with the action and scope, then the return fields, then the routing guidance. The field enumeration is dense but earns its place given no output schema exists.
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 no output schema, the description compensates by enumerating returned record fields (id, name, privilege keys, tenant scope, expireAt, lastUsedAt, createdAt). Only pagination/ordering behavior is left unstated.
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?
There is one optional parameter with 100% schema description coverage, so the schema fully documents 'app' including the 'omit to use the current app' behavior. The description adds nothing about the parameter; 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?
States a specific verb and resource ('List every API token issued for the Bridge app') and immediately contrasts with create_api_token and revoke_api_token, so an agent can distinguish it from siblings without opening any schema.
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?
Gives explicit when-to-use guidance: check which privileges a token carries (including whether it may perform destructive operations) and find the token name that revoke_api_token requires. It also states the alternative path for secrets (create_api_token).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_appsList AppsARead-onlyIdempotentInspect
List the Bridge apps this connection can work on, with their ids. current: true marks the app a call acts on when it names none. A connection approved for the whole workspace sees every app the workspace owns, including ones created after connecting; a single-app connection sees its one app. Pass an id as the app argument of any other tool to act on that app for one call, or call use_app to change the default.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, so the safety profile is covered. The description adds genuinely useful behavioral context beyond that: the `current: true` marker semantics and how visibility differs between a workspace-approved connection and a single-app connection, including apps created after connecting.
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?
Front-loaded with the verb and resource, then three tight sentences covering the current marker, scope, and next-step usage. Slightly dense with detail but every sentence adds actionable information; 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?
With no output schema and no parameters, the description carries the full burden and does so: it describes the returned list (apps with ids, a current marker) and the visibility model. Nothing an agent needs to interpret the output or proceed 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?
Zero parameters, so baseline is 4. The description compensates well by explaining what the returned ids are for and how to feed them into the `app` argument, adding meaning that an empty schema cannot carry.
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 a specific verb+resource (list apps) and scopes it precisely: 'the Bridge apps this connection can work on, with their ids.' The visibility rules (workspace-wide vs single-app) differentiate it from siblings like get_app, and an agent knows exactly what comes back.
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?
Explains the downstream usage condition clearly: pass an id as the `app` argument of any tool for a single call, or call use_app to change the default. This routes the agent to the right alternative (use_app), though it doesn't state an explicit 'don't use X, use this instead' exclusion beyond that.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_eventsList EventsARead-onlyIdempotentInspect
Query the Bridge app event log — signups, logins, tenant and subscription lifecycle events. Each event has: id, type, tenantId, userId, data (the event payload) and createdAt. All arguments are optional filters: type (exact event type), tenantName (the workspace/tenant NAME — resolved to its id for you), since (a duration like "24h" or "7d", or an ISO date) and limit (max results). Use this to debug what actually happened — e.g. whether a webhook fired or a signup completed — rather than inferring it from state. Fails with TENANT_NOT_FOUND when tenantName matches no tenant (list_tenants shows the names). For why one person cannot sign in, debug_auth_issue explains each failed attempt.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| type | No | Exact event type to filter on. | |
| limit | No | Maximum number of events to return. | |
| since | No | Time filter: a duration like "24h" / "7d", or an ISO date. | |
| tenantName | No | Tenant/workspace name; resolved to the tenant id internally. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description adds genuinely new behavior: the event field set, the TENANT_NOT_FOUND failure mode, and that tenantName is resolved to an id internally. It stops short of ordering, default limit, or pagination behavior, which an agent would benefit from.
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?
Front-loaded with purpose, then return shape, then filters, then debugging guidance and error routing — a logical order. The dense single paragraph with em-dashes and parentheticals is slightly heavy but nearly every clause carries routing or semantic value.
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 filter-list tool with no output schema, the description covers filters, the fields returned, and the one failure mode, so an agent has everything needed 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?
Schema coverage is 100%, so type/since/limit/tenantName are already documented and the description largely restates them. It adds marginal value by noting tenantName is a NAME resolved to an id and by tying tenantName to the TENANT_NOT_FOUND error, but this does not exceed the baseline for full-coverage schemas.
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?
Starts with a specific verb+resource ("Query the Bridge app event log") and immediately scopes it with concrete event categories (signups, logins, lifecycle events). The agent can distinguish it from state-inspection or auth-debugging siblings without opening a schema.
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 frames the when-to-use ("debug what actually happened … rather than inferring it from state") and names alternatives with their triggers: list_tenants for resolving names, debug_auth_issue for sign-in failures. Both the positive case and the exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_feature_flagsList Feature FlagsARead-onlyIdempotentInspect
List every feature flag in the Bridge app with its full targeting rules and state. Each flag includes: key, description, lifecycle state (on/off/conditional), value type and on/off values, the targeting rule tree, any scheduled state transition, and where the flag came from (source), plus warnings on any flag that cannot mean what it looks like. Use this when working with flags — verifying a flag key exists before referencing it in code, or inspecting targeting before relying on a flag. For app-level auth/config use get_app or get_auth_config instead; for project wiring use get_environment_info. Every gate in app code is a flag: flags are the standard way to control a route, an API endpoint, a feature or a piece of code. A feature a plan sells is also listed on the plan, and the flag's rule points at bridge:billing.entitlement.. Access by who someone is is a rule on a privilege (preferred) or a role; app code never reads a role, privileges, the plan or a plan feature itself. Numbers are plan quotas, not flags; permission on one specific record stays in app code. Full rule: get_integration_guide topic=fit-together.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint, idempotentHint, openWorldHint=false, destructiveHint=false, so the safety profile is largely covered. The description adds meaningful context beyond annotations: it documents the per-flag fields returned (including 'warnings' on suspicious flags), notes it lists 'every' flag in the app, and explains edge-case semantics (numbers are plan quotas, permission on a record stays in app code). It doesn't state pagination or limits, which would be useful for a list-all tool, so not a 5.
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 front of the description is tight and useful (purpose, fields, when-to-use, alternatives). However it then drifts into a lengthy conceptual primer about flags vs privileges vs roles vs plans vs quotas, which is better suited to the referenced integration guide than the tool definition, diluting conciseness.
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 list tool with a single optional param, full schema coverage, and no output schema, the description gives enough to call it correctly: what is listed, what each entry contains, and when to choose it over siblings. The only material gap is list behavior (ordering, pagination, size limits).
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?
Only one optional parameter (`app`), and schema description coverage is 100% — the schema already says to omit it to use the current app. The description doesn't add syntax about `app`, but with a single well-documented optional param, the baseline is high; the description's mention of 'the Bridge app' contextualizes scope without repeating 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?
States a specific verb (List) and resource (feature flags), scoped to the 'Bridge app', and enumerates the returned shape (key, description, lifecycle state, value type, targeting rule tree, scheduled transition, source, warnings). This makes it clearly distinct from get_flag (single flag), create_feature_flag, and update_feature_flag.
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 when to use it ('verifying a flag key exists before referencing it in code, or inspecting targeting before relying on a flag') and names alternatives for adjacent jobs: get_app/get_auth_config for app-level auth/config, get_environment_info for project wiring, and get_integration_guide topic=fit-together for the full rule.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_plan_quotasList Plan QuotasARead-onlyIdempotentInspect
List usage-quota metrics with their kind, so your code reports against the exact metric names the plans use instead of guessing them. With planKey (e.g. "pro"): that plan's quotas. Without planKey: every metric configured on any plan, once each, with the plans that limit it. Each quota has: metric (the key your code reports against, e.g. "num.clicks"), kind ("counter" = summed per billing period and reset each period; "gauge" = an absolute value the app sets, never reset — If deleting it frees room, it's a gauge and your app counts it; if it happened, it's a counter and Bridge counts it.), limit (integer; 0 means pure per-unit metered billing from the first unit), policy ("hard" = the cap blocks, "metered" = overage is billed), for metered quotas pricing { amount, currency }, source ("membership" when Bridge counts the workspace's active members, e.g. an app's seats limit; absent when the app reports the metric), and reportWith — how the app keeps the metric current. Use this when wiring quota checks or usage reporting; set_plan_quota changes one. Fails with PLAN_NOT_FOUND when no plan has the given key.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| planKey | No | Plan key. Omit to list every metric across all plans. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, yet the description adds real behavioral detail: the dedup rule ('every metric ... once each, with the plans that limit it'), the semantic meaning of kind counter vs gauge, limit=0 meaning pure metered billing, policy hard vs metered, and the PLAN_NOT_FOUND failure mode. This is substantial context beyond the structured fields.
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?
Purpose and the two modes are front-loaded, and every clause is informative. The dense parenthetical explaining kind and the return-field enumeration make it longer than strictly necessary, but the content largely earns its space.
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?
There is no output schema, so the description properly carries the return-value burden, enumerating each quota field (metric, kind, limit, policy, pricing, source, reportWith) and its meaning, plus the error case. An agent has everything needed to call and interpret it.
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, but the description meaningfully enriches planKey by explaining the shape of results in each presence/absence case and giving an example value ('pro'). The app parameter is not elaborated in the description, but the schema already documents it.
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 a specific verb and resource ('List usage-quota metrics with their kind') and immediately contrasts the two modes: with planKey returns that plan's quotas, without planKey returns every metric deduplicated across plans. It explicitly names the sibling it is not ('set_plan_quota changes one'), so an agent can separate read from write without opening a schema.
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?
Gives clear usage context ('Use this when wiring quota checks or usage reporting') and routes to the mutation alternative (set_plan_quota). It does not state explicit when-not conditions beyond naming the read/write split, so it falls just short of the 5-level 'explicit when/when-not/alternatives' bar.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_plansList PlansARead-onlyIdempotentInspect
List every subscription plan in the Bridge app, with prices, features AND quota properties. Each plan includes: key, name, description, trial settings (trial, trialDays), prices (amount, currency, recurrence interval), features (the on/off features the plan includes, [{ key, name }]) and per-metric usage quotas (metric, limit, hard-cap vs metered policy, counter vs gauge kind, source "membership" when Bridge counts the workspace's active members (seats), and per-unit pricing for metered quotas). Use this for billing, entitlement and quota questions — e.g. which plan key to reference in code, what a plan includes, or what limits a plan enforces. Change a plan's features with add_plan_feature / remove_plan_feature / set_plan_features. To set up or reshape a plan (prices, quotas, trial) in one call use apply_plan. For whether Stripe/payments are enabled at the app level, use get_app. A plan with archived: true was removed while workspaces were on it: they keep it, nobody new can choose it. Remove a plan with delete_plan.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive), so the bar is lower, yet the description adds real behavioral context: the meaning of archived: true (workspaces already on it keep it, nobody new can choose it). It also discloses the returned field structure. It stops short of pagination/size behavior, which keeps it from a 5.
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?
Front-loaded with the core action and scope, and the guidance/alternatives come after. It is dense and somewhat long, with an itemized enumeration of every returned field, but each sentence carries routing or return-shape value rather than 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?
With no output schema, the description shoulders the burden of explaining the return shape and does so thoroughly (keys, trial, prices, features, per-metric quotas with policy/kind/source). Combined with the usage routing, an agent has everything needed 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?
Only one parameter (app) and schema description coverage is 100%, so the schema already documents it ('Omit to use the current app'). The description adds nothing specific about the app parameter, 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?
States a specific verb and resource (list subscription plans in the Bridge app) and immediately names the scope of what is returned: prices, features and quota properties. It is clearly distinguishable from get_plan (singular), list_plan_quotas and the mutation siblings like apply_plan/delete_plan.
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 it ('billing, entitlement and quota questions'), gives concrete triggers (which plan key to reference in code, what a plan includes, what limits it enforces), and names the alternatives for adjacent jobs: add/remove/set_plan_features, apply_plan, get_app, delete_plan.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_privilegesList PrivilegesARead-onlyIdempotentInspect
List every privilege defined for the Bridge app: id, key and description. Privileges are what roles are built from; this also lists privileges no role grants yet. list_roles shows which privileges each role grants. Use this before create_role / update_role, before gating a flag rule on a privilege, or to find the key for update_privilege or delete_privilege. Same as bridge privilege list. What a role can do is only the app's default setup until you have read it here. Control access with a flag rule on a privilege (preferred) or on the role key, never with a hard-coded role check in app code. A privilege rule matches the whole key: privileges contains "REPORTS_VIEW" does not match REPORTS_VIEW_ALL.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly, idempotent, non-destructive, closed-world, so the safety profile is covered. The description adds real behavioral context beyond that: it lists privileges no role grants yet (completeness of the listing), notes that role capability is only the app's default until read here, and warns that a privilege rule matches the whole key ('REPORTS_VIEW' does not match REPORTS_VIEW_ALL').
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?
Purpose and routing are front-loaded, which is good, but the description drifts into app-design guidance not needed to invoke the tool ('never with a hard-coded role check in app code') and a somewhat cryptic line about defaults. Roughly a third of the text does not help an agent select or 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 one-parameter read tool with no output schema, the description covers purpose, return fields, sibling differentiation, and downstream workflow use. 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?
Only one optional parameter (app) and schema description coverage is 100%, so the schema already documents the omit-to-use-current-app behavior. The description adds nothing about the parameter beyond what the schema provides, 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?
States a specific verb and resource ('List every privilege defined for the Bridge app') and enumerates the returned fields (id, key, description). It explicitly separates itself from the closest sibling by noting 'list_roles shows which privileges each role grants.'
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?
Gives explicit trigger conditions and named alternatives: 'Use this before create_role / update_role, before gating a flag rule on a privilege, or to find the key for update_privilege or delete_privilege.' Nothing is left to inference about when this tool is the right pick.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_redirect_urisList Redirect URIsARead-onlyIdempotentInspect
List the OAuth redirect (callback) URIs registered on the Bridge app. Read-only. Call this when diagnosing a "redirect_uri mismatch" login failure — the URL your app sends must appear here EXACTLY, including scheme, port and path. Use add_redirect_uri to register one and remove_redirect_uri to unregister one; both preserve the rest of the list. Before writing app code that consumes this, call get_integration_guide with topic=auth and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only/idempotent/non-destructive, so 'Read-only' is largely redundant, but the description adds genuine behavioral context: the URL must match EXACTLY including scheme, port and path, and that add/remove preserve the rest of the list.
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?
Front-loaded with the core purpose and safety, then usage and cross-references. Every sentence carries information, though it is somewhat dense with multiple distinct instructions packed into one block.
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 single-optional-parameter list tool with no output schema, the description covers purpose, safety, exact-match semantics, related mutations, and the recommended follow-up guide call. Nothing an agent needs 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?
Schema description coverage is 100% and the app parameter is already fully documented in the schema (id source, omit-to-use-current behavior). The description adds no syntax or format detail beyond what the schema provides, 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?
States a specific verb and resource (list OAuth redirect/callback URIs) and immediately scopes it to the Bridge app, distinguishing it from the sibling add_redirect_uri and remove_redirect_uri by naming them.
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?
Gives an explicit when-to-use trigger (diagnosing a redirect_uri mismatch login failure), names the mutation alternatives with their effect on the list, and points to get_integration_guide with a specific topic before writing app code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_rolesList RolesARead-onlyIdempotentInspect
List every access role in the Bridge app with its privileges. Each role includes: id, key, name, description, whether it is the default role for new users, and the privilege KEYS it grants; each privilege's description appears once, in the top-level privileges map (key -> description). The roles a new app starts with (Owner, Admin, Member) are a default suggestion the developer can rename, re-scope or replace: read what each role grants here rather than assuming it from its name. Use this before writing a flag rule that targets a privilege or role, when checking which role to assign a user, or when verifying a privilege key exists. For login-method configuration use get_auth_config; for the whole app object use get_app. What a role can do is only the app's default setup until you have read it here. Control access with a flag rule on a privilege (preferred) or on the role key, never with a hard-coded role check in app code. A privilege rule matches the whole key: privileges contains "REPORTS_VIEW" does not match REPORTS_VIEW_ALL.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safe read-only/idempotent profile, but the description adds real behavioral context beyond them: default roles are merely a suggestion the developer can rename/re-scope, names should not be trusted, and rule matching is whole-key (REPORTS_VIEW does not match REPORTS_VIEW_ALL). It also warns against hard-coded role checks. This is meaningful disclosure; it stops short of full richness (e.g. pagination/ordering) but is well above the annotation baseline.
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?
Front-loaded with the return shape, then usage, then caveats. It is fairly long and dense, but nearly every sentence carries distinct value (return fields, usage triggers, rule-matching gotcha). Could be trimmed slightly without losing content.
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 no output schema, the description fully carries the burden of describing return values, enumerating each role field and explaining the top-level privileges map. It also covers the absence of assumptions and the access-control model, so an agent has everything needed 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?
Schema description coverage is 100% and the single 'app' parameter is fully documented in the schema, so the baseline is 3. The description adds no syntax or format detail for the parameter beyond what the schema already 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?
States a specific verb+resource ('List every access role in the Bridge app with its privileges') and distinguishes itself from siblings by naming get_role-adjacent alternatives such as get_auth_config and get_app. An agent can tell it apart from list_privileges or get_role without opening a schema.
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 enumerates when to use it (before writing a flag rule targeting a privilege/role, when choosing which role to assign a user, when verifying a privilege key exists) and names alternative tools for adjacent needs (get_auth_config, get_app). Both the trigger conditions and the exclusions are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tenantsList TenantsARead-onlyIdempotentInspect
List every tenant (workspace/customer account) in the Bridge app. Each tenant includes: id, name, plan key, locale, logo, mfa, payment status, trial state, onboarded flag, the signup owner and createdAt. Use this to discover tenant names before calling get_tenant, update_tenant, delete_tenant or any of the user tools — those address tenants by NAME, not by id. For the users inside a tenant use list_users.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnly, idempotent, non-destructive). The description adds genuinely useful behavior: the critical name-vs-id addressing rule and the exact fields returned, which matters since no output schema exists. It omits pagination/limit behavior, so not a 5.
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?
Front-loaded with purpose, then return fields, then usage routing. The field enumeration is long but earns its place because there is no output schema. Structure is clean with no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given no output schema, the field list usefully substitutes for return documentation, and annotations cover safety. The only small gap is absence of pagination/volume behavior for a 'list every tenant' call. Otherwise complete for a simple list 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%, so the single 'app' parameter is fully documented in the schema. The description adds no parameter-level detail of its own, which is the expected baseline when the schema does the work.
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 a specific verb+resource+scope: 'List every tenant (workspace/customer account) in the Bridge app.' It even clarifies the domain term 'tenant', and clearly distinguishes itself from get_tenant/list_users by contrast.
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 it: to discover tenant names before calling get_tenant/update_tenant/delete_tenant because those address tenants by NAME, not id. It also routes to the sibling list_users for users within a tenant. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_usersList UsersARead-onlyIdempotentInspect
List the users of one tenant, addressed by tenant NAME (use list_tenants to find it). Each user includes: id, email, username, first/last name, role key, enabled, onboarded, teams, createdAt, lastSeen (any account activity, NOT a login), lastSignIn (account-wide) and lastWorkspaceSignIn (sign-in to THIS workspace). Use this to discover the email addresses the other user tools take. Fails with TENANT_NOT_FOUND or TENANT_AMBIGUOUS when the tenant name does not resolve to exactly one tenant.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| tenantName | Yes | Tenant NAME from list_tenants (a tenant id is accepted as a fallback). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnly/idempotent/non-destructive, and the description goes well beyond them by disambiguating three easily-confused timestamp fields (lastSeen is account activity NOT a login, lastSignIn is account-wide, lastWorkspaceSignIn is this workspace) and by naming the two failure modes (TENANT_NOT_FOUND, TENANT_AMBIGUOUS). That is exactly the kind of interpretation guidance an agent cannot get from structured fields.
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 purpose is front-loaded in the first clause, and every sentence carries substantive information rather than filler. The long enumerated field list makes it slightly dense/run-on, but nothing is wasteful.
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?
There is no output schema, and the description compensates by enumerating the returned fields and their semantics, plus the error conditions. For a two-parameter read-only list tool, an agent has everything needed to call it and interpret the result correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already documented at baseline. The description reinforces that tenantName comes from list_tenants and accepts an id as fallback, but adds no syntax beyond what the schema states, and says nothing about the optional 'app' parameter.
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 a specific verb and resource (list users) scoped to exactly one tenant, and specifies the tenant is addressed by NAME. An agent can immediately distinguish it from get_user, invite_user, and list_tenants without opening any schema.
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 names the prerequisite tool for obtaining the required argument (list_tenants) and gives a concrete downstream motivation: 'discover the email addresses the other user tools take.' It does not explicitly contrast with get_user or say when a single-tenant listing is insufficient, but the context is clear and actionable.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_plan_featureRemove Plan FeatureAIdempotentInspect
Take an on/off feature off a plan by its feature key; other features are kept. Workspaces on the plan lose the entitlement, so a flag gated on bridge:billing.entitlement.<featureKey> turns off for them. Fails with FEATURE_NOT_FOUND when the plan does not include it. Use add_plan_feature to add one and list_plans to see every plan's features. Returns the full plan. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY (see list_plans). | |
| feature | Yes | Feature KEY to take off the plan. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true, destructiveHint=false; the description goes well beyond them by disclosing the downstream consequence (workspaces lose the entitlement and flags gated on `bridge:billing.entitlement.<featureKey>` turn off), the specific error code, and the return shape ('Returns the full plan'). This is exactly the context needed to decide whether to warn a user before invoking.
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 core action is front-loaded, followed by effects, errors, alternatives, and return value, so an agent gets the essentials immediately. It is a dense block of seven clauses and the trailing get_integration_guide instruction is slightly beyond invocation scope, keeping it just short of a 5.
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 no output schema, the description compensates by stating the return value ('the full plan'), the error behavior, the downstream entitlement effect, the sibling alternatives, and the integration-guide prerequisite. Nothing an agent needs to invoke this 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 description coverage is 100% (key, feature, and the optional app param are all documented in-schema), so the baseline of 3 applies. The description confirms that `feature` is matched by feature key and that `key` refers to a plan, but adds no syntax, format, or guidance about the optional `app` override.
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?
Specific verb+resource ('Take an on/off feature off a plan by its feature key') with scope ('other features are kept'). It also names the reciprocal sibling add_plan_feature and list_plans, so an agent can distinguish it from the other plan tools without opening schemas.
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?
Explicit alternatives are given ('Use add_plan_feature to add one and list_plans to see every plan's features'), plus a failure condition (FEATURE_NOT_FOUND) and a prerequisite workflow (call get_integration_guide with topic=billing before writing consuming app code). Both when-to-use and when-not paths are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_plan_priceRemove Plan PriceAIdempotentInspect
Remove a recurring price from a plan, identified by interval (day | week | month | year) and currency (default USD). Fails with PRICE_NOT_FOUND when the plan has no price for that currency + interval; other prices are preserved. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY (see list_plans). | |
| currency | No | ISO currency code, default USD. | |
| interval | Yes | Billing recurrence interval. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds real context on top: the exact error code raised, and that removal is narrowly scoped so sibling prices survive. It does not mention auth or permission requirements, but the added failure and blast-radius detail is substantive.
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?
Front-loaded with the action and its identifiers, then the failure mode, then the cross-tool pointer. Three tight sentences with no filler, though the integration-guide sentence is somewhat tangential to the invocation itself.
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 annotations present and no output schema, the description supplies what is missing: the error case, the preservation guarantee, and the follow-up guide pointer. An agent has enough to call it correctly; only explicit permission or auth prerequisites are absent.
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 key, app, currency, and interval. The description restates the interval enum and the USD default rather than adding new semantics, 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?
States a specific verb (Remove) plus the precise resource slice (a recurring price on a plan) and the two identifying dimensions (interval, currency). It is clearly distinguishable from set_plan_price and from the adjacent remove_plan_feature / remove_plan_quota 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?
Gives a concrete failure condition (PRICE_NOT_FOUND when no price matches currency + interval) and the scope of the change (other prices preserved), which tells the agent what to expect before calling. It also routes the agent to get_integration_guide for downstream app code, though it never explicitly contrasts itself with set_plan_price for the overwrite-vs-remove decision.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_plan_quotaRemove Plan QuotaAIdempotentInspect
Remove a usage quota from a plan by its metric key. Fails with QUOTA_NOT_FOUND when the plan has no quota for that metric; other quotas are preserved. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY (see list_plans). | |
| metric | Yes | Metric KEY of the quota to remove. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, idempotentHint=true and destructiveHint=false, so the description's job is to add context beyond that. It does: it discloses the QUOTA_NOT_FOUND failure mode and the important scoping guarantee that other quotas are preserved, which makes the non-destructive annotation credible rather than surprising.
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?
Three compact sentences that lead with the action, then the failure mode, then the workflow pointer. Nothing is redundant, though the integration-guide sentence is arguably tangential to invoking this tool correctly.
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 no output schema and a fully documented input schema, the description supplies what structured fields cannot: the error contract and the preservation semantics. It omits only minor details such as whether the plan itself or its cached state is affected.
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 all three parameters (app, key, metric) are already documented in-schema as pointers to list_apps and list_plans. The description only echoes 'metric key' and adds no format, defaulting, or scoping detail beyond the schema, so 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?
States a specific verb and resource ('Remove a usage quota from a plan') and pins the addressing key ('by its metric key'). An agent can distinguish this from sibling mutations like set_plan_quota or remove_plan_feature, though the description never names the counterpart tool explicitly.
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?
Gives a concrete precondition for failure (QUOTA_NOT_FOUND when no quota exists for that metric) and a workflow directive to call get_integration_guide with topic=billing before writing app code. It lacks an explicit 'use set_plan_quota instead when you want to change rather than drop a quota' routing statement.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_redirect_uriRemove Redirect URIAIdempotentInspect
Unregister ONE OAuth redirect (callback) URI from the Bridge app, preserving every other registered URI. Fails with REDIRECT_URI_NOT_REGISTERED (listing the currently registered URIs) when the exact URL is not registered — the match is exact, including scheme, port and path. Use add_redirect_uri to register one. Before writing app code that consumes this, call get_integration_guide with topic=auth and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| url | Yes | The registered callback URL to remove, exactly as list_redirect_uris shows it. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses exact-match semantics (scheme, port and path must match), the specific failure mode and error code (REDIRECT_URI_NOT_REGISTERED, which even lists the currently registered URIs), and that all other URIs survive. This is materially richer than the readOnly/destructive/idempotent hints.
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?
Front-loaded with the core action and its non-destructive scoping, followed by failure behavior and cross-references. Dense and largely waste-free, though the trailing get_integration_guide instruction pushes slightly beyond the tool's own semantics.
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 no output schema, the description still covers the success behavior (only the one URI removed), the error path, and the matching rule for both parameters. An agent has everything needed to call this correctly without inspecting siblings.
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, but the description adds real meaning on top: it clarifies that the match is exact including scheme, port and path, and that the value must be exactly what list_redirect_uris shows. It adds nothing for the optional 'app' parameter, keeping it short of a 5.
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 a specific verb (unregister/remove) and resource (ONE OAuth redirect callback URI on the Bridge app) with explicit scope ('preserving every other registered URI'). It is immediately distinguishable from add_redirect_uri and list_redirect_uris.
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?
Names the counterpart tool ('Use add_redirect_uri to register one') and prescribes a companion call (get_integration_guide with topic=auth) before writing consuming code. It gives clear context for when to reach for it, but never states an explicit when-not or prerequisite condition (e.g. required permissions).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
remove_userRemove UserADestructiveInspect
Remove a user from a tenant, revoking their access to it. This is IRREVERSIBLE and REQUIRES CONFIRMATION: resolve the user first, then call again with confirm set to the exact email address — and only after the user has explicitly agreed to the removal. If access should merely be suspended, call update_user with enabled=false instead, which can be undone. Fails without removing anything when the tenant or email does not resolve to exactly one record, or the confirmation does not match. dryRun: true previews it first — whether their login account goes too (it does when this is their only workspace) and whether they are the last owner — without removing anything or needing confirm. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| Yes | Email address of the user to remove, as list_users shows it. | ||
| dryRun | No | true previews what the deletion would affect and deletes nothing — no confirm needed. Do this first and show the user the result. Needs the same privilege as the deletion itself. | |
| confirm | No | Repeat the exact key of the resource being deleted, as confirmation. Required to delete; not needed with dryRun. This is a deliberate safety step — do NOT guess it or copy it from a fuzzy match. If you are not certain, list the resources first and ask the user which one they mean. | |
| tenantName | Yes | Tenant NAME from list_tenants (a tenant id is accepted as a fallback). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true but the description goes well beyond them: it flags IRREVERSIBILITY, the confirmation requirement, the exact-failure conditions (tenant/email not resolving to exactly one record, confirmation mismatch), and dryRun side effects (login account removal, last-owner detection). This is rich behavioral context beyond the structured hints.
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 safety-critical facts (IRREVERSIBLE, REQUIRES CONFIRMATION) are front-loaded and the alternative path and dryRun guidance follow in logical order. Despite its length, every clause carries actionable weight.
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 5-parameter tool with no output schema, the description covers prerequisites, failure modes, the safe preview path, the alternative operation, and follow-on tooling. An agent has everything needed to call this correctly and safely.
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, but the description adds real meaning: confirm must equal the exact email address and must follow explicit user consent, and dryRun previews without needing confirm. It reinforces rather than merely restates 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?
States a specific verb and resource with scope: 'Remove a user from a tenant, revoking their access to it.' It also implicitly distinguishes itself from the suspension path by naming update_user, so an agent can route correctly without opening the schema.
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?
Explicit on when to use vs alternatives: use update_user with enabled=false if access should merely be suspended. Lays out the required two-step confirm flow, mandates dryRun preview first, and points to get_integration_guide for app integration. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
revoke_api_tokenRevoke API TokenADestructiveInspect
Revoke an API token by NAME, permanently disabling every client authenticating with it. This is IRREVERSIBLE — a revoked token cannot be restored, only replaced with a new one from create_api_token — and REQUIRES CONFIRMATION: list the tokens first, then call again with confirm set to the exact token name, and only after the user has explicitly agreed. Fails without revoking anything when the name matches no token (TOKEN_NOT_FOUND), matches several (TOKEN_AMBIGUOUS), or the confirmation does not match. dryRun: true previews it first — the token's privileges, when it was last used, and whether it is the token this very connection runs on — without revoking anything or needing confirm. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| name | Yes | Token NAME from list_api_tokens. | |
| dryRun | No | true previews what the deletion would affect and deletes nothing — no confirm needed. Do this first and show the user the result. Needs the same privilege as the deletion itself. | |
| confirm | No | Repeat the exact key of the resource being deleted, as confirmation. Required to delete; not needed with dryRun. This is a deliberate safety step — do NOT guess it or copy it from a fuzzy match. If you are not certain, list the resources first and ask the user which one they mean. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare destructiveHint=true, but the description goes well beyond them: irreversibility ('cannot be restored, only replaced'), the mandatory confirmation protocol, the specific failure modes (TOKEN_NOT_FOUND, TOKEN_AMBIGUOUS, mismatched confirmation) with the guarantee nothing is revoked, and that dryRun needs the same privilege as the deletion.
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?
Front-loaded with the irreversible warning and confirmation requirement in the first two sentences, and information-dense throughout. It runs long, and the trailing get_integration_guide instruction is arguably tangential to the revoke action, keeping it just short of a 5.
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 tool with no output schema, the description supplies everything needed: safety protocol, irreversibility, failure semantics, preview behavior, and named sibling prerequisites. An agent can invoke it correctly on the first try without further exploration.
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, and the description earns an extra point by making the interplay explicit: confirm must equal the exact token name and is not needed with dryRun, and dryRun reveals privileges, last use, and whether the token backs the current connection. It adds workflow meaning rather than just restating parameter docs.
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 a specific verb and resource ('Revoke an API token by NAME') plus the scope of impact ('permanently disabling every client authenticating with it'). It names the counterpart sibling create_api_token and the prerequisite sibling list_api_tokens, so an agent can place it precisely among the many delete/remove 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?
Gives an explicit ordered workflow: list the tokens first, then call with confirm set to the exact token name, and only after the user has explicitly agreed. It also states when to use dryRun (preview first) and when to call get_integration_guide, covering both alternatives and preconditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
scaffold_flags_integrationScaffold Flags IntegrationARead-onlyIdempotentInspect
Scaffold a flags-only Bridge integration into an existing project — the MCP equivalent of bridge flag init. Returns everything that command produces, for YOU to write to disk: the contents of bridge-flags.config.json (app id, app name, base URL, suggested provider config, read live from this Bridge app), the install command, and the framework-specific setup guide fetched from the plugin repo that owns it. Writes nothing — neither to disk nor to the Bridge app. Call this when adding feature flags to a project for the first time; for auth or billing use get_integration_guide with topic=master or topic=billing-master instead. framework is REQUIRED: this server cannot see the caller's disk, so detect it yourself from package.json (next → nextjs, @sveltejs/kit or svelte → svelte, @nestjs/core → nestjs, @angular/core → angular, react → react, express → express; check in that order) and pass it. The returned guide is the same document get_integration_guide returns for topic=feature-flags, so there is no need to call both. Do not invent import specifiers — they differ per plugin and only the guide has the current ones.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| baseUrl | No | Bridge API base URL to write into the config. Defaults to the one of the Bridge environment this server runs in. Pass it only when the project should talk to a different Bridge environment. | |
| framework | Yes | The framework the target project uses. Required — the server cannot see the caller's disk. Detect it from the project's package.json dependencies. | |
| includeGuide | No | Whether to fetch and inline the framework setup guide. Defaults to true. Pass false only when you have already read it via get_integration_guide and want just the config. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and idempotentHint=true, but the description adds real context beyond them: it enumerates exactly what is returned (config contents, install command, setup guide), confirms nothing is written to disk or the Bridge app, and notes the base URL is read live from the current Bridge app. It also discloses that the guide is fetched from the plugin repo that owns it.
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?
Long but every sentence carries distinct weight: purpose, return payload, no-write guarantee, usage routing, framework detection, guide dedup, and an import-specifier warning. Purpose and the CLI analogy are front-loaded, with operational detail following.
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 no output schema, the description carries the return-value burden and does so explicitly, plus it removes the main ambiguity (does it write? is it required to pass framework?) for a scaffold tool. Nothing an agent needs 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?
Schema coverage is 100%, so the basics are covered, but the description adds a full framework-detection procedure (package.json mappings with an explicit check order) that the schema does not contain, and explains why framework is required. app/baseUrl/includeGuide get no additional meaning beyond their schema docs, keeping this out of 5 territory.
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 a specific verb+resource ('Scaffold a flags-only Bridge integration into an existing project') and anchors it to a concrete equivalent ('bridge flag init'). It explicitly distinguishes itself from the closest sibling by telling the agent to use get_integration_guide for auth/billing topics.
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?
Gives an explicit trigger ('adding feature flags to a project for the first time'), names the alternative for other cases ('for auth or billing use get_integration_guide with topic=master or topic=billing-master'), and warns against a redundant call ('no need to call both'). Both when-to-use and when-not-to-use are covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_default_roleSet Default RoleAIdempotentInspect
Make an existing role the default: the role a person gets when they are added to a workspace without a role named (the first person in a workspace is always its Owner). Argument: key (a role KEY from list_roles, e.g. "MEMBER"). The previous default stops being the default. Which role is the default is the developer's decision — ask, do not pick one; read the app's real roles with list_roles first rather than assuming what a role grants from its name (in the default setup a new app defaults to MEMBER). Returns the updated role. Fails with ROLE_NOT_FOUND, listing the app's role keys, when no role has that key. What a role can do is only the app's default setup until you have read it here. Control access with a flag rule on a privilege (preferred) or on the role key, never with a hard-coded role check in app code. A privilege rule matches the whole key: privileges contains "REPORTS_VIEW" does not match REPORTS_VIEW_ALL. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Role KEY from list_roles, e.g. "MEMBER". |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare it non-readonly, idempotent, and non-destructive; the description adds substantial extra context on top: the side effect ('The previous default stops being the default'), the return value ('Returns the updated role'), and a specific failure mode ('Fails with ROLE_NOT_FOUND, listing the app's role keys'). This is rich disclosure beyond structured data.
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 core purpose, argument, and side effect are front-loaded effectively, but the tail drifts into general authorization advice (hard-coded role checks, privilege-key matching semantics, integration-guide pointers) that does not directly help an agent invoke set_default_role. For a simple two-parameter mutation the description is padded.
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 no output schema, the description covers the return value, the error case, the replaced-default side effect, and the prerequisite reads, which is nearly everything needed to call it. It omits any statement of required permissions/caller authority, which is the only notable gap.
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 documents both 'app' and 'key' with the exact 'Role KEY from list_roles, e.g. MEMBER' wording. The description repeats that phrasing rather than adding syntax or format detail, so the schema does the heavy lifting and 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?
States a precise verb and resource ('Make an existing role the default') and immediately defines the concept ('the role a person gets when they are added to a workspace without a role named'). An agent can distinguish this from siblings like create_role, update_role, and get_role without opening a schema.
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?
Gives clear context: read roles with list_roles first, ask the developer rather than picking a default, and call get_integration_guide before writing consuming code. It names prerequisite/related tools, but does not explicitly contrast this tool against the closely-related update_role, so the routing is slightly incomplete.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_flag_scheduleSet Feature Flag ScheduleAIdempotentInspect
Schedule a future state transition on a feature flag, by KEY. The flag keeps its current state until the timestamp, then moves to the scheduled state. Arguments: key, at (an ISO-8601 timestamp such as 2026-09-01T09:00:00Z), and state (off | on | on-with-rule). Setting a schedule replaces any existing one; use clear_flag_schedule to remove it. This writes the scheduled transition onto the flag — it does not change the current state, so the flag behaves exactly as before until the timer fires. Fails with FLAG_NOT_FOUND when no flag has the given key. Before writing app code that consumes this, call get_integration_guide with topic=feature-flags and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| at | Yes | ISO-8601 timestamp at which the transition fires, e.g. "2026-09-01T09:00:00Z". | |
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Flag KEY to schedule (see list_feature_flags). | |
| state | Yes | State the flag moves to when the timer fires. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations declare non-read-only, idempotent, non-destructive, closed-world, but the description adds genuinely new behavior: the write does not alter the flag's current state until the timer fires, that setting a schedule overwrites any existing schedule (a side effect the destructiveHint=false hint does not convey), and the FLAG_NOT_FOUND failure mode. This is meaningful disclosure beyond the structured fields.
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?
Front-loaded with the core action and the semantics that follow, and most sentences carry non-obvious information. The 'Arguments:' sentence largely duplicates the schema and the get_integration_guide pointer is slightly tangential, so it is efficient but not maximally tight.
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 4-parameter mutation tool with no output schema, the description covers effect on current state, replacement semantics, error behavior, and an integration prerequisite — everything an agent needs to call it correctly without follow-up. Return-value detail is unnecessary since no output schema exists.
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 key, at, state and app. The description restates key/at/state and the enum values, adding only the 'by KEY' emphasis and format example already present in the schema, and it omits the optional app parameter entirely. Baseline 3 is appropriate when the schema carries the parameter detail.
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 a specific verb (schedule), a specific resource (a future state transition on a feature flag) and the exact scope ('keeps its current state until the timestamp, then moves to the scheduled state'). It is immediately distinguishable from siblings like clear_flag_schedule, toggle_feature_flag and update_feature_flag without opening any schema.
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 names the alternative for the inverse operation ('use clear_flag_schedule to remove it'), warns that a new schedule replaces an existing one, and prescribes a prerequisite ('call get_integration_guide with topic=feature-flags'). When-to-use, when-to-be-cautious, and the adjacent tool are all covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_plan_featuresSet Plan FeaturesAIdempotentInspect
Replace the whole list of on/off features a plan includes. Arguments: key (plan key) and features ([{ key, name? }], e.g. [{ "key": "analytics", "name": "Analytics" }]); a feature the list leaves out is removed from the plan, and [] clears it. To add or remove one feature and keep the rest use add_plan_feature / remove_plan_feature. A plan feature is an on/off feature the plan sells; gate it with a feature flag whose rule is bridge:billing.entitlement.<featureKey> eq true, so the flag follows the plan's feature list and never names plans. The pricing table and the upgrade dialog read the same list. Returns the full plan. Use list_plans to see every plan's features. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY (see list_plans). | |
| features | Yes | The complete feature list for the plan: [{ key, name? }]. [] removes every feature. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes beyond the annotations by disclosing the replace-all consequence: any feature omitted from the list is removed, and [] clears the plan entirely — a deletion behavior the agent must anticipate. It also explains the idempotent/replace semantics that align with idempotentHint=true, states the tool 'Returns the full plan,' and documents the downstream effect on the pricing table and upgrade dialog.
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?
Front-loads the mutation semantics in the first sentence and then layers routing, flag-gating context, and the return value, with every clause carrying information. It is dense and runs long, but no sentence is filler; a slight trim of the flag-rule aside would make it tighter.
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?
No output schema exists, but the description states 'Returns the full plan,' and it covers the destructive replace semantics, the entitlement/flag interplay, discovery via list_plans, and the get_integration_guide prerequisite. Nothing an agent needs to invoke this 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 the baseline is 3, but the description adds real meaning: an inline example ([{ "key": "analytics", "name": "Analytics" }]), the default of name to key, and the crucial semantic that the array is the complete list rather than an addition, so misleading omission removes features.
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 a specific verb and resource with exact scope: 'Replace the whole list of on/off features a plan includes.' This verb+resource framing immediately distinguishes it from the sibling single-item mutators add_plan_feature / remove_plan_feature, which the description names explicitly.
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 routes the agent: 'To add or remove one feature and keep the rest use add_plan_feature / remove_plan_feature,' and points to list_plans for discovery and get_integration_guide with topic=billing before writing app code. When-to-use and alternatives are both covered without inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_plan_priceSet Plan PriceAIdempotentInspect
Add or update a recurring price on a plan. A plan can carry several prices (e.g. monthly + yearly); each is identified by its currency + interval, and setting one is idempotent — an existing price for the same currency + interval is replaced, others are preserved. Arguments: key (plan key), amount (>= 0), interval (day | week | month | year), currency (ISO code). currency may be left out when the plan's prices all use one currency — that one is used; otherwise it is the developer's decision, and the tool changes nothing and returns DECISION_NEEDED asking for it. Use remove_plan_price to delete a price. Returns the full plan. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY (see list_plans). | |
| amount | Yes | Price per interval, >= 0. 0 for a free tier. | |
| currency | No | ISO currency code. Omit only to use the plan's one existing price currency. | |
| interval | Yes | Billing recurrence interval. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Though annotations already declare idempotentHint=true and destructiveHint=false, the description goes well beyond them: it explains the actual idempotency semantics (same currency+interval is replaced, other prices preserved), the DECISION_NEEDED no-op outcome when currency is ambiguous, and that the tool returns the full plan. This is genuinely load-bearing behavioral context the structured fields do not carry.
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?
Front-loaded with the core action and idempotency model, then arguments, then the sibling pointer, then the guide pointer. Dense and mostly waste-free, though the trailing get_integration_guide sentence is only loosely tied to invoking this tool and the currency rule is restated in both the prose and the argument list.
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 5 params and no output schema, the description covers the mutation semantics, the multi-currency decision path, the error-style outcome, deletion routing, and the return value ('Returns the full plan'). Nothing an agent needs to call this 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 baseline would be 3, but the description adds value beyond the schema for currency: it spells out the multi-currency disambiguation rule and the resulting DECISION_NEEDED behavior, and restates amount>=0 and the interval choices in prose. It slightly duplicates the schema's currency note, which keeps it from a 5.
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 a specific verb+resource ('Add or update a recurring price on a plan') and immediately scopes it against siblings by naming remove_plan_price for deletion and by framing the operation as keyed on currency+interval. An agent can distinguish this from update_plan or set_plan_quota without opening any schema.
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?
Gives explicit when-to-use ('add or update a recurring price'), the alternative for the opposite operation (remove_plan_price to delete), the condition for omitting currency, and a chained follow-up (call get_integration_guide with topic=billing before writing consuming app code). Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_plan_quotaSet Plan QuotaAIdempotentInspect
Add or update a per-metric usage quota on a plan (idempotent by metric: an existing quota for that metric is replaced, others kept). Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses. Seats: name the limit (e.g. seats), kind gauge, source membership; Bridge counts the workspace's active members, pending invites included. Enforce it where invites happen: the built-in team page with its seat-limit setting, or @RequireQuota on the app's own invite handler. Never a flag or an entitlement. Count usage once, where the action happens: ask the developer whether the action calls their server. If it does, the backend decorator (@RequireQuota) counts it. If it does not, the browser reports it (bridge.usage.report / set) with on the button; that is a complete, first-class setup. Never count one metric in both places. limit is the included units (0 = metered from unit 1); policy ("hard" blocks at the limit; "metered" bills each unit above it and needs priceAmount > 0 per unit and a currency — priceCurrency defaults to the plan's one price currency). Hard quotas must NOT carry priceAmount. A quota is for something counted. An on/off feature the plan sells (analytics, SSO, export) belongs in the plan's features, set with add_plan_feature — not a hard quota with limit 1. kind: "counter" (default) sums events per billing period and resets (API calls, emails sent); "gauge" is an absolute value the app sets, never reset (projects, tickets, storage). If deleting it frees room, it's a gauge and your app counts it; if it happened, it's a counter and Bridge counts it. A gauge cannot be metered. source "membership" (gauge only) makes Bridge count the workspace's active members; omitting source keeps an existing gauge's, null removes it. Omitting kind keeps an existing quota's kind. list_plan_quotas shows every metric name and its kind; remove_plan_quota deletes one.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY (see list_plans). | |
| kind | No | counter (default) = summed per billing period; gauge = absolute value the app sets, never reset. If deleting it frees room, it's a gauge and your app counts it; if it happened, it's a counter and Bridge counts it. | |
| limit | Yes | Included units. 0 = pure per-unit metered (billed from unit 1). | |
| metric | Yes | Metric KEY the app reports usage against, e.g. "projects". Reuse the names list_plan_quotas shows. | |
| policy | Yes | hard blocks at the limit; metered keeps going and bills each unit above it. | |
| source | No | membership = Bridge counts the workspace's active members (pending invites included); the app never reports it. Gauge + hard only. Use it for seats. null removes it. | |
| priceAmount | No | Per-unit price for metered quotas (required with policy=metered). | |
| priceCurrency | No | Currency for the metered price (defaults to the plan's price currency when unambiguous). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond annotations (which cover readOnly/idempotent/destructive), the description discloses idempotency-by-metric behavior, that other quotas are kept, cross-field validation (hard quotas must NOT carry priceAmount; metered requires priceAmount > 0 and a currency), that metered is incompatible with gauge, and that omitting kind/source preserves existing values.
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?
Purpose is front-loaded, but the body is a dense, long multi-sentence block with some redundancy against the schema (counter/gauge rules restated) and slightly meandering asides ('A quota is for something counted'). It is information-rich but not tightly trimmed.
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 9-parameter mutation with no output schema, the description covers everything an agent needs: where/how usage is counted, seats handling, gauge vs counter edge cases, and pointers to related tools. Nothing material 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 the baseline is 3, but the description adds cross-parameter meaning not captured per-field: default currency resolution, priceAmount requirements per policy, and defaulting behavior for omitted kind/source. It largely reinforces the schema rather than adding entirely new per-param detail, so it sits just above baseline.
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 states a specific verb and resource ('Add or update a per-metric usage quota on a plan') and immediately names the idempotency semantics. It explicitly distinguishes itself from sibling alternatives like add_plan_feature (on/off features), list_plan_quotas, and remove_plan_quota.
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 rules: hard vs metered policy, gauge vs counter selection, when to route to get_integration_guide first, and when an item belongs in add_plan_feature instead of a quota. Explicit alternatives and exclusions are provided throughout.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_tenant_planSet Tenant PlanAIdempotentInspect
Move a tenant (workspace) to another plan, the same change as the plan picker on a workspace in the Bridge dashboard. A paid Stripe subscription is updated to the new plan's price. Use it to clear a plan before delete_plan, or to put a customer on a plan by hand. Arguments: name (the tenant), plan (the plan KEY), and optionally interval and currency to pick one of the plan's prices — without them the plan's first price is used. Fails with TENANT_NOT_FOUND, TENANT_AMBIGUOUS, PLAN_NOT_FOUND or PRICE_NOT_FOUND without changing anything. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| name | Yes | Tenant NAME from list_tenants (a tenant id is accepted as a fallback). | |
| plan | Yes | Plan KEY to move the tenant to. | |
| currency | No | Which of the plan's prices: its currency, e.g. USD. | |
| interval | No | Which of the plan's prices: its interval. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the mutation is non-destructive and idempotent, but the description adds important context beyond them: a paid Stripe subscription is updated, optional interval/currency select a specific price with a default fallback, and failures are atomic ('without changing anything'). This is rich behavioral disclosure for a billing mutation.
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 action and scope, then proceeds through side effects, usage, arguments, error behavior, and integration guidance. Every sentence carries useful information for correctly invoking or understanding the 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 complex billing mutation with no output schema, the description covers arguments, side effects, atomic failure modes, and usage well. It stops short of describing what a successful call returns, which is a minor but real gap when no output schema exists.
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%, establishing a baseline of 3. The description still adds meaning by clarifying that plan is the plan KEY, that interval and currency select among the plan's prices, and that the first price is used by default; only the optional app parameter is left to 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 states a specific verb and resource: 'Move a tenant (workspace) to another plan.' It also clarifies the scope and equivalent dashboard action, making it easy to distinguish from siblings like update_tenant or delete_plan.
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 explicit when-to-use guidance: 'Use it to clear a plan before delete_plan, or to put a customer on a plan by hand.' It also names a prerequisite alternative tool, get_integration_guide, for app-code consumers, leaving little to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_communicationSet Up Email SenderAInspect
Set the sender of the transactional email Bridge sends for the app (invitations, password resets, magic links, MFA codes). Bridge delivers all of this email through its own email provider — there is no provider, account or API key to configure, and none is accepted. Arguments (at least one): fromAddress (sender email address) and fromName (sender display name). A NEW fromAddress must be verified before it is used: Bridge sends a verification email to that address, and until the link in it is clicked, email keeps coming from the Bridge default sender — tell the user to look for it. Returns the stored sender settings; use get_app to read them back later. Before writing app code that consumes this, call get_integration_guide with topic=integration and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| fromName | No | Sender display name. | |
| fromAddress | No | Sender email address. Verified by email before it is used. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only declare the mutation profile (readOnlyHint=false, idempotentHint=false, destructiveHint=false). The description adds substantial context beyond them: no provider/API key is accepted, a new fromAddress triggers an email verification flow, and email continues from the Bridge default sender until the link is clicked. That verification behavior is exactly the kind of non-obvious trait the description should carry.
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?
Front-loaded with the core action, then behavior, then routing hints. Five sentences is on the longer side, and the 'there is no provider, account or API key to configure' clause is slightly verbose, but every sentence carries actionable 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?
No output schema exists, and the description compensates by stating what is returned ('the stored sender settings') and how to read them later via get_app. Combined with the verification caveat and the integration-guide pointer, an agent has everything needed to call this mutation 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, but the description adds real value the schema omits: the schema declares required=[] yet the description states 'at least one' of the two sender arguments must be supplied, and it explains the verification semantics tied to fromAddress. It stops short of detailing format constraints already in 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?
States a specific verb and resource ('Set the sender of the transactional email Bridge sends for the app') and immediately scopes what the email covers (invitations, password resets, magic links, MFA codes). This is clearly distinguishable from setup_payments, setup_sso, and update_branding among the 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?
Gives explicit preconditions (at least one of fromAddress/fromName), routing guidance to get_app for reading settings back, and a next-step pointer to get_integration_guide with topic=integration before writing app code. It also clarifies what the tool is NOT for by ruling out provider/API-key configuration.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_paymentsSet Up PaymentsAInspect
Connect Stripe to the Bridge app in one step: stores the Stripe API credentials AND turns payments on, so checkout, subscriptions and the billing portal start working. Arguments: stripeSecretKey (the SECRET key, "sk_live_..." or "sk_test_...") and stripePublicKey (the publishable key, "pk_live_..." or "pk_test_..."), both from the Stripe dashboard under Developers > API keys. ASK THE USER FOR THESE — never invent, guess, or reuse a key from another context. The keys are never echoed back in the result. This does NOT create any plans; use create_plan / set_plan_price for those, and list_plans to see what exists. Prefer this over connect_stripe when setting billing up from scratch: connect_stripe only stores the keys and leaves Stripe disabled. Check the returned stripeSetupStatus — "failed" means Stripe rejected the credentials or Bridge could not set up its Stripe webhook, and stripeSetupError says why. webhookConfigured=false means subscription changes, cancellations and payment failures made in Stripe will not reach Bridge; calling setup_payments again with the same keys re-runs setup and replaces the webhook endpoint. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| stripePublicKey | No | Stripe publishable key (pk_live_... or pk_test_...). Stored, never returned. | |
| stripeSecretKey | Yes | Stripe secret key (sk_live_... or sk_test_...). Stored, never returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Beyond the annotations (which only say non-read-only, open-world, non-destructive), the description discloses that keys are never echoed back, that re-running replaces the webhook endpoint, what stripeSetupStatus='failed' and webhookConfigured=false mean, and why subscription events may not reach Bridge. This is rich behavioral context the annotations cannot convey.
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?
It is dense and long, but the core action is front-loaded and each subsequent sentence (arguments, key-safety warning, plan alternative, status semantics, follow-up guide) carries distinct information. The density is warranted by the task, though it could be trimmed marginally.
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 no output schema, the description explains the return signals (stripeSetupStatus, stripeSetupError, webhookConfigured), the credential sourcing and safety requirements, and the required follow-up. An agent has everything needed to call and interpret 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, but the description adds meaning beyond the schema: it gives concrete key formats, points to the Stripe dashboard location, and adds a strong operational directive ('ASK THE USER FOR THESE — never invent, guess, or reuse a key'). That operational guidance exceeds what the field descriptions provide.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific action and resource ('Connect Stripe to the Bridge app in one step: stores the Stripe API credentials AND turns payments on') and clearly names what it does not do ('does NOT create any plans'), routing to create_plan/set_plan_price/list_plans. This makes it trivially distinguishable from connect_stripe and the plan-management 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?
It explicitly states when to prefer this over connect_stripe ('when setting billing up from scratch'), what to use instead for plans, and adds a follow-up step ('call get_integration_guide with topic=billing') before writing consuming code. When-to-use, when-not, and alternatives are all present.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
setup_ssoSet Up SSOAIdempotentInspect
Enable a social/enterprise SSO login provider on the Bridge app in one step: saves the provider credentials, turns the provider on, and returns the app's OAuth callback URL. Arguments: provider (google | azure | github | linkedin | facebook), clientId and clientSecret from the provider console, and tenantId (the Entra ID directory id, not a Bridge tenant) — required for azure only. Company SAML or OIDC sign-in and Sign in with Apple are not configured here: asking for them returns NOT_OFFERED_HERE naming where to do it (the Bridge dashboard). THE ACTIONABLE OUTPUT IS THE RETURNED callbackUrl: the user must register it in the provider's console (e.g. Google Cloud OAuth credentials, GitHub OAuth app settings) or logins will fail with a redirect mismatch — always surface the callbackUrl and that instruction to the user. Credentials are never echoed back. This is the ONLY way to CONFIGURE a social provider (credentials + callback URL); update_auth_methods can flip the enable flags but never saves credentials. Before writing app code that consumes this, call get_integration_guide with topic=auth and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| clientId | Yes | OAuth client id from the provider's developer console. Ask the developer; never invent one. | |
| provider | Yes | google, azure, github, linkedin or facebook. saml, oidc and apple are set up in the Bridge dashboard. | |
| tenantId | No | Entra ID (Azure AD) directory id — not a Bridge tenant. Required when provider is azure. | |
| clientSecret | Yes | OAuth client secret from the provider's developer console. Stored, never returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations (idempotent/readOnly/destructive hints), disclosing that credentials are never echoed back, that the function performs three side effects in one call, that the actionable output is the callbackUrl which must be registered or logins fail with a redirect mismatch, and the NOT_OFFERED_HERE error behavior. This is exactly the behavioral context annotations cannot carry.
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?
Front-loads the core purpose and routes the critical callbackUrl instruction prominently via capitalization. It is dense and relies on caps emphasis, and the parameter recap partly duplicates the schema, but every sentence carries actionable content and there is little true 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?
With no output schema, the description correctly compensates by naming the returned callbackUrl as the actionable output and explaining what the user must do with it. Combined with the enterprise-provider exclusions and the follow-up guide pointer, an agent has everything needed to invoke and act on the result.
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, but the description adds value: it restates the provider enum, clarifies that tenantId is the Entra ID directory id required only for azure, and warns that clientId/clientSecret come from the provider console and must never be invented. Most of this is duplicated in the schema descriptions, keeping it below a 5.
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?
Opens with a specific verb+resource+scope: 'Enable a social/enterprise SSO login provider on the Bridge app in one step,' and enumerates the concrete effects (saves credentials, enables provider, returns callback URL). It explicitly distinguishes itself from the closest sibling update_auth_methods ('can flip the enable flags but never saves credentials'). An agent can identify it without opening any schema.
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?
States when to use it, when NOT to (SAML/OIDC/Apple return NOT_OFFERED_HERE pointing to the dashboard), the alternative for flag-flipping (update_auth_methods), and a follow-up routing hint (get_integration_guide with topic=auth). Explicit alternatives and exclusions leave nothing to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
toggle_feature_flagTurn Feature Flag On or OffAIdempotentInspect
Quick-toggle a feature flag on or off by its KEY (no id lookup needed — this tool resolves it). enabled: true sets state="on", false sets state="off". Does not touch the flag's rule, values or schedule — for those use update_feature_flag. Fails with FLAG_NOT_FOUND when no flag has the given key, and with FLAG_HAS_TARGETING when the flag is state=on-with-rule and you try to turn it on, since that would widen it from the rule's audience to everyone — use update_feature_flag explicitly for that. Every gate in app code is a flag: flags are the standard way to control a route, an API endpoint, a feature or a piece of code. A feature a plan sells is also listed on the plan, and the flag's rule points at bridge:billing.entitlement.. Access by who someone is is a rule on a privilege (preferred) or a role; app code never reads a role, privileges, the plan or a plan feature itself. Numbers are plan quotas, not flags; permission on one specific record stays in app code. Full rule: get_integration_guide topic=fit-together. The result carries warnings when the flag cannot mean what it looks like — switched on while its onValue is false, or a rule on a plan or role the app does not have. A warning never blocks the write; read it and fix the flag. Before writing app code that consumes this, call get_integration_guide with topic=feature-flags and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Flag KEY to switch (see list_feature_flags). | |
| enabled | Yes | true = on, false = off. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover only the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false); the description adds far more — exact state mapping (enabled true→state="on"), the FLAG_NOT_FOUND and FLAG_HAS_TARGETING failure semantics with the reason the second exists, and the non-blocking `warnings` in the result. This is rich behavioral disclosure well beyond structured fields.
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?
Front-loaded correctly — the action, the key resolution, and the sibling exclusion come first. However, the mid-section domain lore ('Every gate in app code is a flag…', plan features, privileges vs roles, quotas) is conceptual background that does not help select or invoke this tool and is largely deferred to get_integration_guide anyway. It reads as over-stuffed for a two-argument toggle.
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?
No output schema exists, yet the description compensates by explaining the `warnings` field in the result and the failure modes. Combined with annotations covering the safety profile, an agent has everything needed to call this correctly and interpret the response.
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, but the description adds real semantics: the `key` parameter is resolved without an id lookup (contrasted with get_flag/list_feature_flags), and `enabled` maps to concrete state values (true=\"on\", false=\"off\") rather than just the schema's terse 'true = on, false = off'. It exceeds the structured data without fully re-documenting every parameter.
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?
Starts with a specific verb+resource+mechanism: 'Quick-toggle a feature flag on or off by its KEY (no id lookup needed — this tool resolves it).' It explicitly distinguishes itself from the closest sibling, update_feature_flag, which handles rule/values/schedule. An agent can select this without opening any schema.
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-not (rule/values/schedule → use update_feature_flag), routes the agent to get_integration_guide topic=feature-flags before writing consuming app code, and names the error conditions (FLAG_NOT_FOUND, FLAG_HAS_TARGETING) that select a different path. Nothing is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_appUpdate AppAIdempotentInspect
Update app-level settings on the Bridge app. Only the fields you pass are changed: name (display name shown on the hosted auth pages and in emails), apiUrl (your backend's base URL), uiUrl (your frontend's base URL — used to build links in invitation and password-reset emails), webhookUrl (where Bridge POSTs platform events), defaultCallbackUri (the OAuth callback used when a login flow does not name one), allowedOrigins (CORS origins), tenantSelfSignup (whether a new user may create their own workspace instead of being invited) and paymentsAutoRedirect (force new users to pick a plan before entering the app — a billing paywall). WARNING: allowedOrigins REPLACES the entire list, so call get_app first and pass the existing origins plus the new one; the previous list is returned as previousAllowedOrigins so a mistake can be undone. Redirect URIs are NOT settable here — use add_redirect_uri / remove_redirect_uri, which preserve the rest of the list. Login methods are not settable here either — use update_auth_methods, or setup_sso for a provider with credentials. Token lifetimes: use update_password_policy. Before writing app code that consumes this, call get_integration_guide with topic=auth and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| name | No | App display name. | |
| uiUrl | No | Frontend base URL, absolute http(s). Used to build email links. | |
| apiUrl | No | Backend base URL, absolute http(s). | |
| webhookUrl | No | Absolute http(s) URL Bridge POSTs platform events to. | |
| allowedOrigins | No | CORS origins (scheme://host[:port]). REPLACES the whole list — include the existing origins from get_app, not just the new one. | |
| tenantSelfSignup | No | Allow users to create their own workspace instead of being invited. | |
| defaultCallbackUri | No | Default OAuth callback URI, absolute http(s). | |
| paymentsAutoRedirect | No | Force new users to pick a plan before entering the app (billing paywall). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the safety profile (readOnlyHint=false, destructiveHint=false, idempotentHint=true), so the bar is lower. The description still adds real context: the allowedOrigins list REPLACES rather than appends, and previousAllowedOrigins is returned so a mistake can be undone. This is exactly the kind of destructive-in-practice caveat the annotations don't convey.
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?
Front-loaded with the core action and merge semantics, then the warning, then the exclusion routing. Every sentence carries information, though the long parenthetical field glosses make it denser than strictly necessary.
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 9-parameter, all-optional mutation tool with no output schema, the description covers merge behavior, the destructive replacement caveat, sibling routing, and even a return-value hint (previousAllowedOrigins). Nothing needed 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 description coverage is 100%, so baseline is 3. The description goes beyond the schema by explaining what each field affects (name appears on hosted auth pages and emails, uiUrl builds invitation/reset links, webhookUrl receives platform events, paymentsAutoRedirect is a billing paywall), adding intent the schema alone doesn't.
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 a specific verb (update) and resource (app-level settings on the Bridge app) and enumerates exactly which fields are settable. It also distinguishes itself from siblings by declaring what is NOT handled here (redirect URIs, login methods, token lifetimes) and naming the tools that are.
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 the merge semantics ('Only the fields you pass are changed') and routes each excluded concern to the right alternative: add_redirect_uri/remove_redirect_uri, update_auth_methods, setup_sso, update_password_policy. It even names the get_app prerequisite and get_integration_guide for downstream code.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_auth_methodsUpdate Sign-In MethodsAIdempotentInspect
Toggle the app's login methods. Only the fields you pass are changed: mfaEnabled (MFA as a second factor), passkeysEnabled (WebAuthn passkeys), magicLinkEnabled (email magic links), and the social provider flags (googleSsoEnabled, linkedinSsoEnabled, azureAdSsoEnabled, appleSsoEnabled, githubSsoEnabled, facebookSsoEnabled). Email + password login is always available on Bridge and has no toggle. A social provider can only be switched on once its credentials are saved — otherwise Bridge refuses with SIGN_IN_CREDENTIALS_MISSING and a fix; to configure a provider end-to-end (credentials + enable + callback URL) use setup_sso. Bridge also refuses to switch off the last remaining sign-in method (LAST_SIGN_IN_METHOD). CLI: bridge auth methods enable|disable <method>. Returns the updated login-method configuration (same projection as get_auth_config). For MFA this is the same as bridge auth mfa --enabled true|false. Before writing app code that consumes this, call get_integration_guide with topic=auth and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| mfaEnabled | No | Enable MFA (second factor). | |
| appleSsoEnabled | No | Enable Apple sign-in (needs saved Apple credentials; setup_sso does not cover Apple). | |
| passkeysEnabled | No | Enable WebAuthn passkeys. | |
| githubSsoEnabled | No | Enable GitHub SSO (needs saved credentials — setup_sso). | |
| googleSsoEnabled | No | Enable Google SSO (needs saved credentials — setup_sso). | |
| magicLinkEnabled | No | Enable email magic-link login. | |
| azureAdSsoEnabled | No | Enable Azure AD SSO (needs saved credentials — setup_sso, provider "azure"). | |
| facebookSsoEnabled | No | Enable Facebook SSO (needs saved credentials — setup_sso). | |
| linkedinSsoEnabled | No | Enable LinkedIn SSO (needs saved credentials — setup_sso). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive and idempotent, but the description adds substantial behavioral context: partial-update semantics ('only the fields you pass are changed'), prerequisites (credentials must be saved), specific refusal codes (SIGN_IN_CREDENTIALS_MISSING, LAST_SIGN_IN_METHOD), and what is returned.
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 core action ('Toggle the app's login methods') is front-loaded, and the dense block is mostly non-redundant: each sentence carries either an error condition, a prerequisite, or a routing hint. It is long, but for a 10-param mutation tool little of it is wasted.
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?
Although there is no output schema, the description states the return value (updated login-method configuration, same projection as get_auth_config) and covers error conditions, prerequisites, and related tools, so an agent has enough to invoke 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?
Schema coverage is 100%, so the baseline is 3, but the description adds real meaning beyond the schema: it groups the SSO flags, explains that email+password has no toggle, and attaches the credential prerequisite specifically to the social provider flags.
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 names a specific verb and resource (toggle the app's login/sign-in methods) and enumerates the exact flags being controlled. It clearly distinguishes itself from setup_sso (end-to-end provider config), get_auth_config (read projection), and the CLI/mfa equivalents.
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 states when to use this tool, when to use setup_sso instead ('to configure a provider end-to-end'), and points to get_integration_guide before writing app code. It also names the CLI equivalent so an agent can map its usage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_brandingUpdate BrandingAIdempotentInspect
Update the Bridge-hosted auth pages' branding (login, signup, etc.). Only the fields you pass are changed: bgColor, textColor, linkColor, primaryButtonBgColor, primaryButtonTextColor (CSS color values, e.g. "#1a1a2e"), fontFamily (CSS font-family value) and borderRadius (CSS length, e.g. "8px"). Returns the full updated branding configuration. This same record is pushed live to connected SDK clients as bridge.app.branding — before writing app code that renders a workspace logo, name or colours, call get_integration_guide with topic=branding and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| bgColor | No | Page background color (CSS color). | |
| linkColor | No | Link color (CSS color). | |
| textColor | No | Body text color (CSS color). | |
| fontFamily | No | Font family (CSS font-family value). | |
| borderRadius | No | Border radius (CSS length, e.g. "8px"). | |
| primaryButtonBgColor | No | Primary button background color (CSS color). | |
| primaryButtonTextColor | No | Primary button text color (CSS color). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare idempotent=true, destructive=false, readOnly=false; the description adds genuinely new behavior beyond that: it is a partial/patch update ('Only the fields you pass are changed'), returns the full config, and has an external propagation side effect to connected SDK clients as bridge.app.branding. That downstream visibility is not captured by any annotation.
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?
Front-loaded with the purpose and field-scoping rule, then the propagation effect, then the cross-tool pointer. Dense and mostly waste-free, though the final get_integration_guide sentence is somewhat tangential to invoking 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 partial-update tool with no output schema, the description supplies the mutation semantics, the return shape ('full updated branding configuration'), and the side effects. An agent has enough to call it correctly and anticipate consequences.
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 every parameter is already documented in the schema. The description names the same field set and adds brief CSS-format examples ("#1a1a2e", "8px"), which mostly duplicates the schema's own examples; 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?
States a specific verb (update) and resource (Bridge-hosted auth pages' branding) plus the exact scope of fields that can be set. It is clearly distinguishable from get_branding, the read counterpart in the sibling list.
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?
Gives clear context for the operation and a conditional route to a different tool ('before writing app code that renders a workspace logo, name or colours, call get_integration_guide with topic=branding'). It does not state when NOT to use this tool or when to prefer get_branding, so it stops short of full alternative coverage.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_feature_flagUpdate Feature FlagAIdempotentInspect
Update an existing feature flag by its id (get the id from list_feature_flags). Only the fields you pass are changed. Before writing app code that consumes this, call get_integration_guide with topic=feature-flags and the framework the app uses. The result carries warnings when the flag cannot mean what it looks like — switched on while its onValue is false, or a rule on a plan or role the app does not have. A warning never blocks the write; read it and fix the flag. Every gate in app code is a flag: flags are the standard way to control a route, an API endpoint, a feature or a piece of code. A feature a plan sells is also listed on the plan, and the flag's rule points at bridge:billing.entitlement.. Access by who someone is is a rule on a privilege (preferred) or a role; app code never reads a role, privileges, the plan or a plan feature itself. Numbers are plan quotas, not flags; permission on one specific record stays in app code. Full rule: get_integration_guide topic=fit-together. Fields: key, description, state (off | on | on-with-rule), valueType (boolean | string | number | json), onValue / offValue (typed JSON values), rule (replaces the whole rule), clearRule: true to remove the rule entirely. A rule is ordered branches of AND-ed conditions, first match wins, else otherwiseValue; the rule argument has the full shape and examples. A feature a plan sells is listed on the plan (add_plan_feature) and the rule points at that list, never at plan names. For who someone is, prefer a privilege rule over a role rule on the role KEY; read the app's real roles with list_roles first. The same rule gives the same answer in the browser and on the NestJS backend. For a plain on/off switch prefer toggle_feature_flag, which works by key.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Flag id from list_feature_flags (this tool addresses flags by id; toggle_feature_flag takes the key). | |
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | No | New flag key. Changing it breaks app code that reads the old key. | |
| rule | No | Structured targeting rule: { branches: [{ conditions: [{ attribute, operator, values }], returnValue }], otherwiseValue, rolloutPct?, groupRef? }. Branches are first-match-wins; conditions in a branch are AND-ed. A feature a plan sells is listed on the plan (add_plan_feature) and the rule points at that list, never at plan names: { "branches": [{ "conditions": [{ "attribute": "bridge:billing.entitlement.analytics", "operator": "eq", "values": [true] }], "returnValue": true }], "otherwiseValue": false }. For who someone is, prefer a privilege rule ({ "attribute": "privileges", "operator": "contains", "values": ["REPORTS_VIEW"] }, which matches that whole key) over a role rule on the role KEY ("user.role" eq "ADMIN"); read the app's real roles with list_roles first. The same rule gives the same answer in the browser and on the NestJS backend. | |
| state | No | Three-state model: off (always offValue), on (always onValue), on-with-rule (evaluate rule). | |
| onValue | No | Value returned when state=on (typed per valueType). | |
| offValue | No | Value returned when state=off (typed per valueType). | |
| clearRule | No | true removes the existing rule (sets it to null). | |
| valueType | No | Type of the values this flag returns. | |
| description | No | New description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover the safety profile (readOnlyHint=false, idempotentHint=true, destructiveHint=false), so the bar is lower. The description adds genuine non-structured context: it discloses that warnings can be returned (flag on while onValue is false, or a rule on a nonexistent plan/role), that warnings never block the write, and that only passed fields are changed. It does not detail partial-failure or error semantics.
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?
Purpose and alternatives are front-loaded, but the text is long and repetitive for a single tool. The privilege-vs-role preference and 'plan feature listed on the plan' guidance are each stated twice, and the 'every gate is a flag' philosophy is tangential 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 10-parameter tool with a nested rule object and no output schema, the description is quite complete: it explains field effects, rule shape behavior, the consumer-side integration path, and the warnings returned. The only thin spot is error/failure behavior, which is left implicit.
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 baseline is 3, but the description adds meaning beyond the schema: the partial-update contract ('Only the fields you pass are changed'), the state three-state semantics, and domain guidance on rule targets (plan features, privileges over role keys, 'numbers are plan quotas, not flags'). Much rule detail is duplicated from the schema, keeping it from a 5.
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 a specific verb+resource ('Update an existing feature flag by its id') and explicitly distinguishes itself from the sibling toggle_feature_flag ('For a plain on/off switch prefer toggle_feature_flag, which works by key'). The id-vs-key addressing is called out, so an agent can route correctly without opening schemas.
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?
Gives explicit when-to-use context: get the id from list_feature_flags, call get_integration_guide with topic=feature-flags before writing consuming app code, read real roles with list_roles first, and use toggle_feature_flag for plain switches. It also names external alternatives (add_plan_feature, get_integration_guide topic=fit-together).
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_password_policyUpdate Password PolicyAIdempotentInspect
Set the session token lifetimes on the Bridge app: accessTokenTTL and refreshTokenTTL, both in SECONDS. Only the fields you pass are changed. IMPORTANT — despite the name (kept for parity with bridge auth password-policy), this sets token TTLs and NOTHING about passwords: Bridge exposes no password-complexity, rotation or reuse policy on the management API, so if the user asked for password rules, say so instead of calling this. The access token TTL controls how often a client silently refreshes (short is safer, e.g. 900 = 15 minutes); the refresh token TTL controls how long a user stays logged in without re-authenticating (e.g. 2592000 = 30 days). Read the current values with get_auth_config. Before writing app code that consumes this, call get_integration_guide with topic=auth and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| accessTokenTTL | No | Access token lifetime in seconds, e.g. 900 (15 minutes). | |
| refreshTokenTTL | No | Refresh token lifetime in seconds, e.g. 2592000 (30 days). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish that this is a non-read-only, non-destructive, idempotent mutation. The description adds substantial behavioral context beyond that: only passed fields are changed, the name is a legacy misnomer, and the tool deliberately does not expose password complexity, rotation, or reuse settings.
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 dense but well-structured and front-loaded: the actual behavior is stated first, then the name mismatch warning, then operational guidance. Every sentence adds decision-relevant information for an agent, especially given the misleading tool name.
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 three-parameter mutation tool with no output schema, the description covers behavior, parameter effects, alternatives, and prerequisites sufficiently. An agent has everything needed to decide whether to call this tool and how to interpret the TTL values.
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 adds meaningful semantics beyond field definitions. It explains that both TTLs are in seconds and describes the real-world effect of each: accessTokenTTL governs silent client refresh cadence, while refreshTokenTTL governs how long a user stays logged in.
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 explicitly states the tool sets accessTokenTTL and refreshTokenTTL on a Bridge app, and directly resolves the misleading name by clarifying it does not manage passwords. This makes the tool immediately distinguishable from what an agent might infer from 'update_password_policy' and from sibling config tools.
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 explicit when-not-to-use guidance: if the user asked for password rules, say so instead of calling this. It also names concrete alternatives for related tasks, telling the agent to read current values with get_auth_config and to consult get_integration_guide for auth integration work.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_planUpdate PlanAIdempotentInspect
Update an existing subscription plan by its key. Only the fields you pass are changed: name (the display name; flag rules read the plan's features, never its name, so renaming never changes who a rule matches), description, trial and trialDays. Set trial=false to REMOVE a trial from a plan that has one. Prices and quotas are NOT updated here — use set_plan_price / remove_plan_price and set_plan_quota / remove_plan_quota instead. Before writing app code that consumes this, call get_integration_guide with topic=billing and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | Yes | Plan KEY of the plan to change (see list_plans). | |
| name | No | New display name. | |
| trial | No | Whether the plan has a trial period. Pass false to remove an existing trial. | |
| trialDays | No | Trial period length in days. | |
| description | No | New description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations cover safety (readOnlyHint=false, idempotentHint=true, destructiveHint=false), and the description adds genuinely non-obvious behavior: patch semantics ('Only the fields you pass are changed'), the removal trick ('Set trial=false to REMOVE a trial'), and that renaming a plan never changes flag-rule matching. This is exactly the context annotations cannot express.
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?
Front-loaded with the core operation and the partial-update rule, and every sentence carries information (removal semantics, sibling routing, integration guide). It is a dense single block, but nothing is padding.
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 full annotations and no output schema, the description covers patch semantics, destructive edge cases (trial removal), sibling routing, and a setup prerequisite. An agent has everything needed 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?
Schema coverage is 100%, so the baseline is 3, but the description adds semantics the schema lacks: the trial=false removal behavior and the decoupling of name from flag-rule evaluation. It does not, however, explain the app-parameter override behavior beyond what the schema already says.
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?
Opens with a specific verb+resource+identifier: 'Update an existing subscription plan by its key.' It also enumerates exactly which fields are mutable (name, description, trial, trialDays), which cleanly separates it from create_plan, get_plan, and the price/quota 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?
Explicitly routes the agent away from this tool for non-covered concerns ('Prices and quotas are NOT updated here — use set_plan_price / remove_plan_price and set_plan_quota / remove_plan_quota instead') and names a prerequisite helper (get_integration_guide with topic=billing) for consuming code. Both when-to-use and when-not-to-use are stated.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_privilegeUpdate PrivilegeAIdempotentInspect
Update a privilege, addressed by its key (or id) from list_privileges. Only the fields you pass are changed: newKey (renames it) and description. Roles that grant it keep granting it under the new key, but flag rules and app code that name the OLD key stop matching — update them too. The AUTHENTICATED privilege cannot be renamed. Same as bridge privilege update. What a role can do is only the app's default setup until you have read it here. Control access with a flag rule on a privilege (preferred) or on the role key, never with a hard-coded role check in app code. A privilege rule matches the whole key: privileges contains "REPORTS_VIEW" does not match REPORTS_VIEW_ALL. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| id | No | Privilege id from list_privileges, instead of key. | |
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| key | No | Privilege KEY from list_privileges, e.g. "REPORTS_VIEW". Pass this or id, not both. | |
| newKey | No | Rename the privilege to this key. key addresses it; newKey renames it. | |
| description | No | New description of what the privilege allows. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only cover the safety profile (idempotent, non-destructive), while the description discloses the real behavioral hazards: only passed fields change, renaming keeps role grants intact but silently breaks flag rules and app code referencing the old key, and AUTHENTICATED cannot be renamed. That is exactly the mutation side-effect context an agent needs and cannot get from structured fields.
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 core behavior is front-loaded and efficient, but the second half drifts into general access-control doctrine ('control access with a flag rule... never with a hard-coded role check in app code') and a key-matching example that are architectural advice rather than invocation guidance. Some of that padding dilutes an otherwise tight definition.
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 5-param mutation with no output schema, the description covers partial updates, rename side effects, the immutability exception, and a documentation hand-off. It never indicates what the call returns or confirms success, a minor gap given the absence of an output 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 coverage is 100% so the baseline is 3, but the description adds real meaning: it explains partial-update semantics ('only the fields you pass are changed') and that key addresses while newKey renames, plus the AUTHENTICATED rename constraint. It does not restate the id/key mutual exclusivity, which the schema already covers.
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 a specific verb and resource ('Update a privilege') and immediately pins down addressing semantics: by key or id from list_privileges. An agent can distinguish this from create_privilege/delete_privilege/update_role without opening any schema.
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?
Gives clear context for when to use it (after list_privileges, addressing an existing privilege) and routes to get_integration_guide with topic=team before writing consuming app code. It does not explicitly contrast with siblings like create_privilege or update_role, 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.
update_roleUpdate RoleAIdempotentInspect
Update an existing access role by its id (get the id from list_roles). Only the fields you pass are changed: name, description, privileges, isDefault. NOTE: privileges REPLACES the whole privilege list — read the current list from list_roles first and pass the full desired set, or privileges not included are revoked. isDefault=true makes this the role people get when added to a workspace without a role named (the previous default stops being default); an app always has exactly one default, so to move it pass isDefault=true on the new one rather than false on the old one. set_default_role does the same by role key. What a role can do is only the app's default setup until you have read it here. Control access with a flag rule on a privilege (preferred) or on the role key, never with a hard-coded role check in app code. A privilege rule matches the whole key: privileges contains "REPORTS_VIEW" does not match REPORTS_VIEW_ALL. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| id | Yes | Role id from list_roles (this tool addresses roles by id). | |
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| name | No | New display name. | |
| isDefault | No | true makes this the default role for people added without a role named. | |
| privileges | No | Full replacement privilege list (omitted privileges are revoked). | |
| description | No | New description. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well beyond the annotations: it discloses that privileges is a full replacement (omitted privileges are revoked), that isDefault=true demotes the previous default and that only one default can exist (so move it by setting the new one true, not the old one false), and that a privilege rule matches the whole key (REPORTS_VIEW does not match REPORTS_VIEW_ALL). These are exactly the side effects an agent needs and are not derivable from readOnly/idempotent hints alone.
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?
Front-loaded with purpose and the key replacement warning, but it runs long and the closing guidance about flag rules versus hard-coded role checks and calling get_integration_guide is about app design rather than selecting or invoking this tool. That material, while useful, does not strictly earn its place in a tool description and bloats an otherwise dense block.
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 6 parameters (1 required), full schema coverage, and no output schema needed, the description supplies everything an agent needs: id source, partial-update behavior, the destructive replacement caveat, and the default-role semantics. Nothing required 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 the baseline is 3, but the description adds real meaning the schema lacks: 'Only the fields you pass are changed' (partial-update semantics) and the isDefault migration behavior (set true on the new role rather than false on the old). The privileges replacement rule reinforces the schema text rather than merely repeating it.
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 a specific verb+resource ('Update an existing access role by its id') and immediately distinguishes itself from create_role/get_role/delete_role by naming the source of the id (list_roles). An agent can identify the operation without opening the schema.
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?
Explicit routing: get the id from list_roles, read the current privilege list before replacing it, and 'set_default_role does the same by role key' as an alternative for the default-role case. It even points to get_integration_guide before writing consuming code, so when-to-use and alternatives are fully covered.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_tenantUpdate TenantAIdempotentInspect
Update a tenant, addressed by its current NAME. Only the fields you pass are changed. Arguments: name (required — the tenant to update), newName (rename the tenant), locale (ISO 639-1, e.g. "en"), logo (an image URL). Fails with TENANT_NOT_FOUND or TENANT_AMBIGUOUS without changing anything. Use create_tenant to create one and delete_tenant to remove one. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| logo | No | Logo image URL. | |
| name | Yes | Current tenant NAME from list_tenants (a tenant id is accepted as a fallback). | |
| locale | No | ISO 639-1 locale, e.g. "en". | |
| newName | No | New tenant display name. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, idempotent, non-open-world semantics, and the description goes beyond them by stating the partial-update rule ('only the fields you pass are changed') and the atomic failure modes (TENANT_NOT_FOUND / TENANT_AMBIGUOUS 'without changing anything'). That is real behavioral value, though it stops short of describing the response shape or how rename interacts with cached references.
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?
Front-loaded with the operation, addressing key, and update semantics before enumerating arguments; nearly every sentence carries information. The trailing get_integration_guide cross-sell is tangential to invoking this tool and adds slight bloat.
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 5-parameter mutation tool with no output schema, the description covers the essentials an agent needs: addressing, partial-update semantics, and failure behavior. The omission of the app parameter and any note on return/verification leaves a small gap, but the annotations cover the safety profile.
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 the semantic mapping of name to 'the tenant to update' and newName to a rename, and gives format hints for locale and logo. The app parameter is never mentioned in the description, so it is not fully compensating 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?
States a specific verb (Update) and resource (tenant), plus the addressing key (current NAME) and the partial-update contract. It also names the create/delete siblings, so an agent can place it immediately among update_tenant/create_tenant/delete_tenant.
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 routes creation to create_tenant and removal to delete_tenant, and adds a prerequisite workflow hint (call get_integration_guide before writing consuming app code). It does not, however, say anything about when to prefer get_tenant over this tool or any conditions where an update should be avoided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_userUpdate UserAIdempotentInspect
Update a user of a tenant, addressed by EMAIL. Only the fields you pass are changed. Arguments: tenantName (tenant NAME), email (the user), role (a role KEY from list_roles, e.g. "ADMIN"), enabled (false disables sign-in without deleting the account — prefer this over remove_user when access should be revocable), firstName, lastName. Fails with TENANT_NOT_FOUND / TENANT_AMBIGUOUS / USER_NOT_FOUND / USER_AMBIGUOUS without changing anything. Before writing app code that consumes this, call get_integration_guide with topic=team and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| role | No | Role KEY from list_roles, e.g. "ADMIN". | |
| Yes | Email address of the user to change, as list_users shows it. | ||
| enabled | No | false disables the user without deleting them. | |
| lastName | No | New last name. | |
| firstName | No | New first name. | |
| tenantName | Yes | Tenant NAME from list_tenants (a tenant id is accepted as a fallback). |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-read-only, idempotent, non-destructive behavior. The description adds meaningful behavioral context beyond them: partial update semantics, specific failure modes that leave the user unchanged, and the sign-in-disabling effect of enabled=false without account deletion.
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?
Front-loads purpose and partial-update behavior, then lists arguments, failure modes, and an integration-guide pointer. Every sentence earns its place and the dense format suits the tool's complexity.
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 rich annotations, full schema coverage, and no output schema, the description supplies the key behavioral and routing details an agent needs: partial updates, error outcomes, and the remove_user alternative. The omission of the optional app parameter is covered by the schema and does not block correct 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 coverage is 100%, so the baseline is 3, but the description adds useful meaning beyond the schema for several parameters, especially the preference for enabled=false over remove_user. It omits the optional app parameter from its argument list, keeping it from a full 5.
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 a specific verb (Update), resource (user of a tenant), and addressing key (EMAIL), plus partial-update semantics. It distinguishes itself from remove_user by explaining the enabled=false alternative for revocable access.
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 only passed fields change, gives a clear alternative (prefer enabled=false over remove_user when access should be revocable), and points to get_integration_guide before writing app code. This covers when to use it and how it differs from a sibling.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
use_appSwitch Current AppAIdempotentInspect
Make an app the default for this connection: later calls that pass no app argument act on it. Takes an app id from list_apps. The choice is kept on the connection, so it applies to every session using it; pass app on a single call instead when you only need one app briefly.
| Name | Required | Description | Default |
|---|---|---|---|
| app | Yes | Id of the app to make the default, from list_apps. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already disclose readOnlyHint=false and idempotentHint=true, so the write and repeat-safety profile is covered. The description adds real value beyond that by explaining the persistence model — the choice is 'kept on the connection' and applies to every session using it — which the annotations cannot express. It does not say what happens to a previously set default or whether other sessions are disrupted immediately.
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?
Three tight sentences with zero filler; the primary effect is front-loaded, followed by the id source and then the alternative. Every sentence 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?
For a one-parameter, no-output tool, the description covers what it does, where the id comes from, the scope of the persisted state (whole connection, all sessions), and the per-call alternative. No return value explanation is needed since there is no output 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 coverage is 100%, so the `app` parameter's id semantics are already documented and the baseline is 3. The description goes slightly beyond by explaining the downstream effect of this value (later calls omitting `app` act on it) and its relationship to the per-call `app` argument on other tools.
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 a specific verb+resource+effect: 'Make an app the default for this connection.' This is clearly distinct from list_apps, get_app, update_app, and create_app, since it sets a connection-scoped default rather than reading or mutating an app record.
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 names the alternative ('pass `app` on a single call instead when you only need one app briefly') and the condition under which to prefer it, and states the prerequisite source for the id ('from list_apps'). Nothing about when to choose this tool is left to inference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
verify_loginVerify LoginAInspect
Prove a sign-in works end to end: signs in for real through this Bridge environment exactly as the SDK does (from one of the app's allowed origins), exchanges the session for tokens, and verifies the access token against the published JWKS. Returns verified with the steps and evidence (key id, algorithm, issuer, audience, subject, workspace, expiry, claims checked) — never the tokens. When verified is false, failure names the reason (WRONG_PASSWORD, USER_NOT_FOUND, NO_PASSWORD_SET, NO_ACTIVE_WORKSPACE, ORIGIN_NOT_ALLOWED, MFA_REQUIRED, …) and its fix. Use the credentials from create_test_user. Same as bridge test-user verify. If sign-in works here but not in the app, the app code is the difference: call get_integration_guide with topic=auth and the framework the app uses.
| Name | Required | Description | Default |
|---|---|---|---|
| app | No | Id of the Bridge app to act on for this call (see list_apps). Omit to use the current app. | |
| Yes | Email of the user to sign in as. | ||
| origin | No | Origin to sign in from; must be one of the app's allowed origins. Defaults to the app's UI URL. | |
| password | Yes | Their password. Used for this one sign-in; never stored or returned. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations (readOnlyHint=false, destructiveHint=false, idempotentHint=false) only give the safety profile; the description adds that it performs a real sign-in, never stores or returns tokens, enumerates concrete failure reasons with fixes, and describes the evidence returned. This is substantial context beyond the structured fields and is 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?
Front-loaded with the core purpose and efficient throughout, but it is a dense single paragraph packing return values, failure modes, and alternatives. Every sentence earns its place, though slightly heavy.
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 no output schema, the description fully carries the return-value burden, explaining the `verified` result, the evidence fields, and the `failure`/`fix` structure on failure. Nothing needed 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 the baseline is 3, but the description adds meaning beyond the schema by tying email/password to credentials from create_test_user and clarifying that origin must be an allowed origin. It doesn't add much syntax detail, so a 4 rather than 5.
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 a specific verb+resource ('Prove a sign-in works end to end') and elaborates the exact mechanism (signs in through the Bridge environment as the SDK does, exchanges session for tokens, verifies against JWKS). This clearly separates it from read-only siblings like get_auth_config or debug_auth_issue.
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?
Gives concrete when-to-use ('Use the credentials from create_test_user') and an explicit alternative path for the contrasting scenario ('If sign-in works here but not in the app... call get_integration_guide with topic=auth'). Both the precondition and the fallback tool are named.
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.
3 tool updates
- Added
archive_plan - Added
delete_plan - Added
set_tenant_plan
6 tool updates
- Changed
apply_plan5 fields changed- added
Input schema / properties / quotas / items / properties / source / typeAdded value: +[ + "string", + "null" +] - removed
Input schema / properties / removePrices / items / properties / interval / $refRemoved value: -"#/properties/prices/items/properties/interval" - added
Input schema / properties / removePrices / items / properties / interval / descriptionAdded value: +"Billing recurrence interval." - added
Input schema / properties / removePrices / items / properties / interval / enumAdded value: +[ + "day", + "week", + "month", + "year" +] - added
Input schema / properties / removePrices / items / properties / interval / typeAdded value: +"string"
- Changed
create_feature_flag4 fields changed- added
Input schema / properties / offValue / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +] - added
Input schema / properties / onValue / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +] - added
Input schema / properties / rule / properties / branches / items / properties / returnValue / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +] - added
Input schema / properties / rule / properties / otherwiseValue / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +]
- Changed
evaluate_feature_flag1 field changed- added
Input schema / properties / attributes / additionalProperties / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +]
- Changed
import_feature_flags6 fields changed- added
Input schema / properties / flags / items / properties / offValue / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +] - added
Input schema / properties / flags / items / properties / onValue / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +] - changed
Input schema / properties / flags / items / properties / rule / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "branches": { - "default": [], - "description": "Ordered branches, first-match-wins.", - "items": { - "additionalProperties": false, - "properties": { - "conditions": { - "description": "Conditions AND-ed together; the branch matches when all hold.", - "items": { - "additionalProperties": false, - "properties": { - "attribute": { - "minLength": 1, - "type": "string" - }, - "operator": { - "enum": [ - "eq", - "neq", - "contains", - "not_contains", - "in", - "not_in", - "gt", - "lt", - "between", - "regex", - "exists", - "not_exists" - ], - "type": "string" - }, - "values": { - "description": "Comparison values (always a plural array, even for single-value operators like eq). For between: [min, max]. For exists/not_exists: [].", - "items": { - "type": [ - "string", - "number", - "boolean", - "null" - ] - }, - "type": "array" - } - }, - "required": [ - "attribute", - "operator", - "values" - ], - "type": "object" - }, - "type": "array" - }, - "returnValue": { - "description": "Value the flag returns when this branch matches (typed per the flag valueType)." - } - }, - "required": [ - "conditions" - ], - "type": "object" - }, - "type": "array" - }, - "groupRef": { - "description": "Reference to a saved condition group; mutually exclusive with inline branches.", - "minLength": 1, - "type": "string" - }, - "otherwiseValue": { - "description": "Value returned when no branch matches (or the identity is excluded by rollout)." - }, - "rolloutPct": { - "default": 100, - "description": "0-100; applies to the whole rule. Defaults to 100 (full rollout).", - "maximum": 100, - "minimum": 0, - "type": "number" - } - }, - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "branches": { + "default": [], + "description": "Ordered branches, first-match-wins.", + "items": { + "additionalProperties": false, + "properties": { + "conditions": { + "description": "Conditions AND-ed together; the branch matches when all hold.", + "items": { + "additionalProperties": false, + "properties": { + "attribute": { + "minLength": 1, + "type": "string" + }, + "operator": { + "enum": [ + "eq", + "neq", + "contains", + "not_contains", + "in", + "not_in", + "gt", + "lt", + "between", + "regex", + "exists", + "not_exists" + ], + "type": "string" + }, + "values": { + "description": "Comparison values (always a plural array, even for single-value operators like eq). For between: [min, max]. For exists/not_exists: [].", + "items": { + "type": [ + "string", + "number", + "boolean", + "null" + ] + }, + "type": "array" + } + }, + "required": [ + "attribute", + "operator", + "values" + ], + "type": "object" + }, + "type": "array" + }, + "returnValue": { + "description": "Value the flag returns when this branch matches (typed per the flag valueType).", + "type": [ + "string", + "number", + "boolean", + "object", + "array", + "null" + ] + } + }, + "required": [ + "conditions" + ], + "type": "object" + }, + "type": "array" + }, + "groupRef": { + "description": "Reference to a saved condition group; mutually exclusive with inline branches.", + "minLength": 1, + "type": "string" + }, + "otherwiseValue": { + "description": "Value returned when no branch matches (or the identity is excluded by rollout).", + "type": [ + "string", + "number", + "boolean", + "object", + "array", + "null" + ] + }, + "rolloutPct": { + "default": 100, + "description": "0-100; applies to the whole rule. Defaults to 100 (full rollout).", + "maximum": 100, + "minimum": 0, + "type": "number" + } + }, + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / flags / items / properties / rule / typeAdded value: +[ + "object", + "null" +] - changed
Input schema / properties / flags / items / properties / schedule / anyOfPrevious value: -[ - { - "additionalProperties": false, - "properties": { - "at": { - "description": "ISO-8601 timestamp at which the transition fires.", - "minLength": 1, - "type": "string" - }, - "state": { - "$ref": "#/properties/flags/items/properties/state" - } - }, - "required": [ - "at", - "state" - ], - "type": "object" - }, - { - "type": "null" - } -]New value: +[ + { + "additionalProperties": false, + "properties": { + "at": { + "description": "ISO-8601 timestamp at which the transition fires.", + "minLength": 1, + "type": "string" + }, + "state": { + "description": "Defaults to \"off\" when omitted.", + "enum": [ + "off", + "on", + "on-with-rule" + ], + "type": "string" + } + }, + "required": [ + "at", + "state" + ], + "type": "object" + }, + { + "type": "null" + } +] - added
Input schema / properties / flags / items / properties / schedule / typeAdded value: +[ + "object", + "null" +]
- Changed
set_plan_quota1 field changed- added
Input schema / properties / source / typeAdded value: +[ + "string", + "null" +]
- Changed
update_feature_flag4 fields changed- added
Input schema / properties / offValue / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +] - added
Input schema / properties / onValue / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +] - added
Input schema / properties / rule / properties / branches / items / properties / returnValue / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +] - added
Input schema / properties / rule / properties / otherwiseValue / typeAdded value: +[ + "string", + "number", + "boolean", + "object", + "array", + "null" +]
76 tool updates
- First observed
add_plan_feature - First observed
add_redirect_uri - First observed
apply_plan - First observed
clear_flag_schedule - First observed
connect_stripe - First observed
create_api_token - First observed
create_app - First observed
create_feature_flag - First observed
create_plan - First observed
create_privilege - First observed
create_role - First observed
create_tenant - First observed
create_test_user - First observed
debug_auth_issue - First observed
delete_feature_flag - First observed
delete_privilege - First observed
delete_role - First observed
delete_tenant - First observed
diagnose_integration - First observed
evaluate_feature_flag - First observed
export_feature_flags - First observed
get_app - First observed
get_auth_config - First observed
get_branding - First observed
get_environment_info - First observed
get_flag - First observed
get_integration_guide - First observed
get_plan - First observed
get_role - First observed
get_server_info - First observed
get_setup_status - First observed
get_started - First observed
get_stripe_status - First observed
get_tenant - First observed
get_user - First observed
import_feature_flags - First observed
invite_user - First observed
list_api_tokens - First observed
list_apps - First observed
list_events - First observed
list_feature_flags - First observed
list_plan_quotas - First observed
list_plans - First observed
list_privileges - First observed
list_redirect_uris - First observed
list_roles - First observed
list_tenants - First observed
list_users - First observed
remove_plan_feature - First observed
remove_plan_price - First observed
remove_plan_quota - First observed
remove_redirect_uri - First observed
remove_user - First observed
revoke_api_token - First observed
scaffold_flags_integration - First observed
set_default_role - First observed
set_flag_schedule - First observed
set_plan_features - First observed
set_plan_price - First observed
set_plan_quota - First observed
setup_communication - First observed
setup_payments - First observed
setup_sso - First observed
toggle_feature_flag - First observed
update_app - First observed
update_auth_methods - First observed
update_branding - First observed
update_feature_flag - First observed
update_password_policy - First observed
update_plan - First observed
update_privilege - First observed
update_role - First observed
update_tenant - First observed
update_user - First observed
use_app - First observed
verify_login
Publisher details
- Operator
- The Bridge · Publisher source
- Operator website
- http://thebridge.dev · Publisher source
- Vendor relationship
- Not applicable
- Documentation
- https://app.thebridge.dev · Publisher source
- Trust center
- https://thebridge.dev/security · Publisher source
- Restrictions
- Free tier available. The Bridge pricing page shows the subscriptions tiers · Publisher source
Related MCP Connectors
Production backend for AI-built apps: storage, data, jobs, webhooks, email, metering and billing.
Deploy web apps with sign-in, per-user storage, realtime and AI built in.
Managed database, auth, file storage, email, analytics, and deployment for coding agents.
Form companies, manage bank accounts, cards, invoices and more — directly from your AI coding tools.
Related MCP Servers
AlicenseNot gradedqualityBmaintenanceEnables AI assistants to deploy and manage hosted apps from git repos, read logs, add Postgres databases and domains, manage API keys and budgets, and send requests to 200+ AI models. Connects over remote Streamable HTTP with OAuth sign-in, so users need no API keys, installs, or local server.MIT- AlicenseNot gradedqualityFmaintenanceAdd authentication to your app without leaving your IDE. Creates projects, configures auth methods, wires up OAuth, and scaffolds sign-in flows - all from your editor's chat.22 npmMIT
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to query Postgres as the signed-in person through OAuth 2.1/OIDC, with database-enforced read-only queries, PII masking, human-approved writes, and a tamper-evident audit log.Apache 2.0
- AlicenseNot gradedqualityAmaintenanceEnables AI assistants to manage workspaces, projects, tasks, and AI agents, and to generate tools from any OpenAPI spec, through a hosted OAuth-secured endpoint or a local stdio package.1,264 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.