Skip to main content
Glama

create_credential

Save a new reusable credential, sealed with the project's encryption key at write time. Neither this call nor any later read ever returns the secret back — reference it from a target by id (see create_endpoint/update_endpoint's target.credentialVaultEntryId) instead of copying the secret around. auth.type selects which fields apply: bearer→token, basic→username+password, apiKeyHeader→headerName+key, apiKeyQuery→paramName+key, publicPrivateKey→secret+key, oauthClientCredentials→tokenUrl+clientId+clientSecret (+ optional scope, audience, clientAuth "basic"|"post"; the access token is fetched at delivery, and clientSecret is never returned. The client secret is only ever sent to tokenUrl, and the access token only to the bound destinationHost; tokenUrl is permanent like destinationHost — it must pass the project's outbound host allowlist at create, and an update that changes it is refused), signingSecret→secret (the secret a sender such as GitHub or Stripe signs the webhooks it sends you with; attach it to an endpoint as senderSignature.credentialId). destinationHost is required and permanent: the credential is only ever sent to that host, over https, and no later call can re-aim it. A signingSecret credential is never sent anywhere, so it takes no destinationHost.

Input Schema

NameRequiredDescriptionDefault
authYesThe credential's auth shape.
nameYesHuman-readable label, up to 120 characters.
destinationHostNoThe only host this credential may be sent to, e.g. "api.stripe.com", or a single-label wildcard, e.g. "*.stripe.com" (matches api.stripe.com, not stripe.com and not a.b.stripe.com). Host only — no scheme, port or path. Internationalised hosts must be given in punycode ("xn--…"). Permanent: attaching this credential to a target on any other host is refused, and it cannot be changed later — a different destination means a new credential, which means entering the secret again.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changed
    • changedInput schema / properties / auth / properties / type / enum
      Previous value: -[
      -  "none",
      -  "bearer",
      -  "basic",
      -  "apiKeyHeader",
      -  "apiKeyQuery",
      -  "publicPrivateKey",
      -  "oauthClientCredentials",
      -  "signingSecret"
      -]New value: +[
      +  "bearer",
      +  "basic",
      +  "apiKeyHeader",
      +  "apiKeyQuery",
      +  "publicPrivateKey",
      +  "oauthClientCredentials",
      +  "signingSecret"
      +]
  2. Changed7 schema fields changed
    • addedInput schema / properties / auth / properties / audience
      Added value: +{
      +  "description": "oauthClientCredentials only, optional.",
      +  "type": "string"
      +}
    • addedInput schema / properties / auth / properties / clientAuth
      Added value: +{
      +  "description": "oauthClientCredentials only. \"basic\" (default) sends the client credentials in an Authorization header, \"post\" in the request body.",
      +  "enum": [
      +    "basic",
      +    "post"
      +  ],
      +  "type": "string"
      +}
    • addedInput schema / properties / auth / properties / clientId
      Added value: +{
      +  "description": "oauthClientCredentials only.",
      +  "type": "string"
      +}
    • addedInput schema / properties / auth / properties / clientSecret
      Added value: +{
      +  "description": "oauthClientCredentials only. Omit on update to keep the stored value.",
      +  "type": "string"
      +}
    • addedInput schema / properties / auth / properties / scope
      Added value: +{
      +  "description": "oauthClientCredentials only, optional. Space-separated scopes.",
      +  "type": "string"
      +}
    • addedInput schema / properties / auth / properties / tokenUrl
      Added value: +{
      +  "description": "oauthClientCredentials only. An https URL; the only place the client secret is ever sent. Permanent after create — an update may only restate it.",
      +  "type": "string"
      +}
    • changedInput schema / properties / auth / properties / type / enum
      Previous value: -[
      -  "none",
      -  "bearer",
      -  "basic",
      -  "apiKeyHeader",
      -  "apiKeyQuery",
      -  "publicPrivateKey",
      -  "signingSecret"
      -]New value: +[
      +  "none",
      +  "bearer",
      +  "basic",
      +  "apiKeyHeader",
      +  "apiKeyQuery",
      +  "publicPrivateKey",
      +  "oauthClientCredentials",
      +  "signingSecret"
      +]
  3. Changed3 schema fields changed
    • changedInput schema / properties / auth / properties / secret / description
      Previous value: -"publicPrivateKey only."New value: +"publicPrivateKey or signingSecret."
    • changedInput schema / properties / auth / properties / type / enum
      Previous value: -[
      -  "none",
      -  "bearer",
      -  "basic",
      -  "apiKeyHeader",
      -  "apiKeyQuery",
      -  "publicPrivateKey"
      -]New value: +[
      +  "none",
      +  "bearer",
      +  "basic",
      +  "apiKeyHeader",
      +  "apiKeyQuery",
      +  "publicPrivateKey",
      +  "signingSecret"
      +]
    • changedInput schema / required
      Previous value: -[
      -  "name",
      -  "destinationHost",
      -  "auth"
      -]New value: +[
      +  "name",
      +  "auth"
      +]
  4. Changed2 schema fields changed
    • addedInput schema / properties / destinationHost
      Added value: +{
      +  "description": "The only host this credential may be sent to, e.g. \"api.stripe.com\", or a single-label wildcard, e.g. \"*.stripe.com\" (matches api.stripe.com, not stripe.com and not a.b.stripe.com). Host only — no scheme, port or path. Internationalised hosts must be given in punycode (\"xn--…\"). Permanent: attaching this credential to a target on any other host is refused, and it cannot be changed later — a different destination means a new credential, which means entering the secret again.",
      +  "type": "string"
      +}
    • changedInput schema / required
      Previous value: -[
      -  "name",
      -  "auth"
      -]New value: +[
      +  "name",
      +  "destinationHost",
      +  "auth"
      +]
  5. Added
  6. Removed
  7. Added

TDQS

A4.6/5.0
Behavior5/5

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

Goes far beyond the thin annotations: the secret is never returned on any read, destinationHost is required and permanent with an https-only and allowlist constraint, changing tokenUrl on update is refused, the client secret is only sent to tokenUrl and the access token only to destinationHost. These are exactly the non-obvious behavioral constraints an agent needs before mutating state.

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

Conciseness4/5

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

Front-loaded with the core action and the no-return-secret rule, then per-type detail. It is dense, and the long oauthClientCredentials parenthetical is heavy to parse, but nearly every clause carries operational information rather than filler.

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 nested-object mutation tool with no output schema, the description covers the security model, permanence constraints, per-auth-type required fields, and the follow-up wiring into endpoints. Nothing critical for correct invocation is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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; the description adds real value by enumerating which fields each auth.type consumes and by flagging optional fields (scope, audience, clientAuth) and defaults. The only shortfall is that a few semantics (e.g. what the call returns) are left implicit.

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?

States a specific verb and resource ('Save a new reusable credential') plus the defining mechanism ('sealed with the project's encryption key at write time'). An agent can distinguish this from update_credential and list_credentials from the description alone.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

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

Explains the intended workflow clearly: don't copy secrets, reference the entry by id via create_endpoint/update_endpoint's target.credentialVaultEntryId, and attach signingSecret credentials as senderSignature.credentialId. It stops short of explicitly contrasting create vs. update_credential, so there is a small inference gap, but practical usage is well covered.

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