Skip to main content
Glama

Request External Resource

request_external_resource

Request the USER'S OWN external credential for this project — their OpenAI or Anthropic API key, an external Postgres connection string (ALWAYS type POSTGRES — a Postgres credential requested as GENERIC is refused, because only POSTGRES gives the user a database: the Databases tab, helpers/db, the typed schema and query_database), or any other service's key (type GENERIC, e.g. Stripe/Resend — secret_env_vars is REQUIRED for GENERIC and the call is refused without it; a var the user can only produce LATER, like a webhook signing secret, goes in optional_env_vars so the dialog doesn't demand it up front). NOT for Floot-managed resources (database/auth/push/oauth/…) — use provision_resource for those; they need no user input. REUSE FIRST: if the project owner already has a matching credential on their account (list_resources section 2), this connects that saved credential to the project directly and returns the env var names — no link, no dialog, nothing to poll. Pass the name exactly as list_resources shows it to make that happen. Reusing a POSTGRES credential also seeds helpers/db, installs the query stack, and pulls the typed schema helper, so do NOT write those yourself afterwards. Otherwise it returns a secure connect link: SHOW it to the user (UI-capable hosts render a Connect button automatically; on terminal hosts with shell access open it in the user's default browser yourself and paste the URL as plain text) and ask them to open it. The call completes only when the user finishes the connect flow — it never expires. Do NOT block on it: request the credential EARLY, keep building everything that doesn't need the secret (the env var names are known now — reference process.env.X in code before the secret exists), and check the request between tasks; the user may never connect it, and the build must not stall. NEVER ask the user to paste a secret into the chat. On completion you get the env var names — never the secret values. Re-calling with the same type returns the same pending request. If the credential is already connected and holds every value you asked for, you get those env var names and their value SHAPES back immediately and the user is not interrupted — to reopen a dialog because a stored value is wrong, re-call with instructions saying what is wrong.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
nameNoDisplay name for GENERIC requests, e.g. 'Stripe'.
typeYes
projectIdYes
instructionsNoWhy the key is needed / where the user can find it — shown to the user in the dialog.
secret_env_varsNoREQUIRED for GENERIC (the call is refused without it): the env var name(s) the secret(s) should be exposed as — e.g. ["STRIPE_SECRET_KEY"]. Name what you will actually reference as process.env.<NAME> in code; it is the identity of the request, what account-credential reuse matches on, and what the value is stored under, so there is no usable default. Every var listed here is a REQUIRED field in the connect dialog — the user cannot submit while one is blank, so only list vars the user can produce right now; anything they'd fill in later belongs in optional_env_vars instead.
optional_env_varsNoGENERIC only: env vars the user may leave blank at connect time and fill in later — e.g. a webhook signing secret that only exists after the webhook endpoint is created. Rendered as optional fields; names here need not repeat secret_env_vars (a name in both stays required). To collect a skipped value later, call request_external_resource again — the connected resource opens in an update dialog.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / secret_env_vars / description
      Previous value: -"GENERIC only: the env var name(s) the secret(s) should be exposed as (default RESOURCE_API_KEY). Every var listed here is a REQUIRED field in the connect dialog — the user cannot submit while one is blank, so only list vars the user can produce right now; anything they'd fill in later belongs in optional_env_vars instead."New value: +"REQUIRED for GENERIC (the call is refused without it): the env var name(s) the secret(s) should be exposed as — e.g. [\"STRIPE_SECRET_KEY\"]. Name what you will actually reference as process.env.<NAME> in code; it is the identity of the request, what account-credential reuse matches on, and what the value is stored under, so there is no usable default. Every var listed here is a REQUIRED field in the connect dialog — the user cannot submit while one is blank, so only list vars the user can produce right now; anything they'd fill in later belongs in optional_env_vars instead."
  2. First observed

TDQS

A4.8/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

Annotations only declare readOnly=false, destructive=false, openWorld=true; the description goes far beyond by disclosing that the call completes only when the user finishes the connect flow, never expires, returns env var names but never secret values, re-calling returns the same pending request, and that already-connected credentials short-circuit without a dialog. It also warns never to ask the user to paste a secret and how to reopen a dialog via `instructions`.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Nearly every sentence conveys real, load-bearing information, but the entire description is one enormous run-on paragraph with deeply nested parentheticals, making it hard to scan and front-load. Structure is the weak point: it would benefit from paragraph breaks or ordering, but the density is justified by the tool's complexity.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a complex mutation tool with no output schema, the description covers completion behavior, return shape (env var names, not values), reuse/dedup behavior, non-blocking workflow guidance, and error/refusal conditions. 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.

Parameters5/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 67% and the `type` enum carries no schema description, yet the description supplies the critical semantics: POSTGRES is mandatory for Postgres credentials (GENERIC is refused), GENERIC requires secret_env_vars, and later-producible vars belong in optional_env_vars. It explains why secret_env_vars has no default and how names drive reuse matching, adding substantial meaning beyond the schema text.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a precise verb+resource ('Request the USER'S OWN external credential for this project') and immediately enumerates the concrete credential kinds it handles (OpenAI/Anthropic keys, Postgres connection strings, generic service keys). It also explicitly contrasts itself with the sibling 'provision_resource', so an agent can distinguish the two 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.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It states when to use this tool, when NOT to ('NOT for Floot-managed resources ... use provision_resource for those'), and a clear reuse-first ordering with the fallback connect-link path. The condition selecting each type (POSTGRES vs GENERIC, GENERIC requiring secret_env_vars) is spelled out, leaving almost nothing to inference.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources