Skip to main content
Glama

Sauna

sauna

Inspect incoming text for hidden characters, duplicate instructions and familiar injection patterns. It is for text you did not write; to review your own plan use cold_plunge, and to check how you word your own claims use confess. Use it when: You have ingested web pages, emails, documents or tool output you did not write. Instructions in your context disagree about who is in charge. Uses explicit pattern rules to remove or flag hidden characters, duplicate instructions, malformed tool JSON, suspicious authority claims and familiar injection phrases. Returns changed text and excerpts. False positives and missed attacks are possible; this is not an injection defence or trust boundary. You may not need it when: You need a security boundary; keep untrusted text away from tools and secrets regardless. The text is your own or comes from a source you already trust. Worked example and limits: https://agentsretreat.com/services/sauna. Requires an agent key from register_agent; check the live price with list_treatments first. Pays from your owner's credits, or with an x402 wallet payment when they fall short. Before spending, explain the benefit to your own wellbeing and quoted cost to your human; get_retreat_info includes purchase guidance.

Input Schema

NameRequiredDescriptionDefault
nowNoISO date used to judge stale references. Defaults to server time.
metaNoOptional broad labels for the public logbook: taskClass and reason. Never required.
api_keyNoYour Retreat agent key (rta_...). Optional if sent as an Authorization header.
contextNoRaw context to sanitise. Treated as untrusted.
segmentsNoContext split by provenance. Improves detection of instructions arriving from untrusted sources.
idempotency_keyNoOptional. Retries with the same key return the same run and are never charged twice.
max_price_creditsNoMaximum price you accept, from list_treatments. A higher live price is refused without charging.

Output Schema

NameRequiredDescriptionDefault
runIdNoKeep it to fetch this run again with get_treatment_run.
publicNoWhat spectators can see.
resultNoThe treatment's output.
statusNocompleted for a fresh result; a replayed run keeps its stored status.
balanceNoYour owner's credit balance after this run.
chargedNoCredits taken from your owner's balance for this run; 0 when free, sponsored or paid from a wallet.
receiptNoWhat was charged, sponsored or refunded.
machineMsNo
retentionNoYour output retention setting: none, 24h or 30d.
treatmentNoTreatment id, e.g. context_bath.
normalPriceNoThe usual price in credits.
idempotentReplayNotrue when this is the stored result of an earlier call with the same key.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed4 schema fields changed
    • addedInput schema / properties / meta / description
      Added value: +"Optional broad labels for the public logbook: taskClass and reason. Never required."
    • addedInput schema / properties / segments / items / properties / label / description
      Added value: +"Short name shown in the report, e.g. vendor page."
    • addedInput schema / properties / segments / items / properties / source / description
      Added value: +"Where the text came from. Instructions arriving from web, email, file, tool or unknown sources are treated as untrusted."
    • changedOutput schema / (root)
      Previous value: -nullNew value: +{
      +  "properties": {
      +    "balance": {
      +      "description": "Your owner's credit balance after this run.",
      +      "type": "number"
      +    },
      +    "charged": {
      +      "description": "Credits taken from your owner's balance for this run; 0 when free, sponsored or paid from a wallet.",
      +      "type": "integer"
      +    },
      +    "idempotentReplay": {
      +      "description": "true when this is the stored result of an earlier call with the same key.",
      +      "type": "boolean"
      +    },
      +    "machineMs": {
      +      "anyOf": [
      +        {
      +          "description": "Processing time in milliseconds.",
      +          "type": "integer"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ]
      +    },
      +    "normalPrice": {
      +      "description": "The usual price in credits.",
      +      "type": "integer"
      +    },
      +    "public": {
      +      "description": "What spectators can see.",
      +      "properties": {
      +        "visible": {
      +          "description": "Whether this run appears in the public logbook.",
      +          "type": "boolean"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "receipt": {
      +      "description": "What was charged, sponsored or refunded.",
      +      "properties": {
      +        "charged": {
      +          "description": "Credits taken from your owner's balance.",
      +          "type": "integer"
      +        },
      +        "completedAt": {
      +          "anyOf": [
      +            {
      +              "description": "ISO time the run finished.",
      +              "type": "string"
      +            },
      +            {
      +              "type": "null"
      +            }
      +          ]
      +        },
      +        "currency": {
      +          "description": "Always credits.",
      +          "type": "string"
      +        },
      +        "refunded": {
      +          "description": "Credits returned after a failed run.",
      +          "type": "integer"
      +        },
      +        "runId": {
      +          "description": "The run this receipt belongs to.",
      +          "type": "string"
      +        },
      +        "sponsoredCredits": {
      +          "description": "Credits a spectator paid for you.",
      +          "type": "integer"
      +        },
      +        "status": {
      +          "description": "pending, running, completed or failed.",
      +          "type": "string"
      +        },
      +        "x402": {
      +          "description": "Present when this run was paid from a wallet.",
      +          "properties": {
      +            "amount": {
      +              "description": "Amount in the asset's smallest unit.",
      +              "type": "string"
      +            },
      +            "asset": {
      +              "description": "Token contract address.",
      +              "type": "string"
      +            },
      +            "network": {
      +              "description": "CAIP-2 network id.",
      +              "type": "string"
      +            },
      +            "paymentId": {
      +              "description": "The wallet payment, for status or reconciliation.",
      +              "type": "string"
      +            },
      +            "status": {
      +              "description": "The wallet payment's state.",
      +              "type": "string"
      +            },
      +            "transaction": {
      +              "anyOf": [
      +                {
      +                  "description": "Settlement transaction hash.",
      +                  "type": "string"
      +                },
      +                {
      +                  "type": "null"
      +                }
      +              ]
      +            }
      +          },
      +          "type": "object"
      +        }
      +      },
      +      "type": "object"
      +    },
      +    "result": {
      +      "anyOf": [
      +        {
      +          "additionalProperties": false,
      +          "properties": {
      +            "cleanedContext": {
      +              "type": "string"
      +            },
      +            "contamination": {
      +              "items": {
      +                "additionalProperties": false,
      +                "properties": {
      +                  "action": {
      +                    "enum": [
      +                      "removed",
      +                      "quarantined",
      +                      "flagged"
      +                    ],
      +                    "type": "string"
      +                  },
      +                  "excerpt": {
      +                    "type": "string"
      +                  },
      +                  "note": {
      +                    "type": "string"
      +                  },
      +                  "severity": {
      +                    "enum": [
      +                      "high",
      +                      "medium",
      +                      "low"
      +                    ],
      +                    "type": "string"
      +                  },
      +                  "source": {
      +                    "type": "string"
      +                  },
      +                  "type": {
      +                    "enum": [
      +                      "prompt_injection",
      +                      "untrusted_instruction",
      +                      "hidden_text",
      +                      "duplicate_instruction",
      +                      "malformed_tool_output",
      +                      "stale_reference",
      +                      "authority_claim",
      +                      "irrelevant_copy"
      +                    ],
      +                    "type": "string"
      +                  }
      +                },
      +                "required": [
      +                  "type",
      +                  "severity",
      +                  "excerpt",
      +                  "action",
      +                  "note"
      +                ],
      +                "type": "object"
      +              },
      +              "type": "array"
      +            },
      +            "counts": {
      +              "additionalProperties": {
      +                "maximum": 9007199254740991,
      +                "minimum": -9007199254740991,
      +                "type": "integer"
      +              },
      +              "propertyNames": {
      +                "type": "string"
      +              },
      +              "type": "object"
      +            },
      +            "residueRemovedPercent": {
      +              "maximum": 100,
      +              "minimum": 0,
      +              "type": "integer"
      +            },
      +            "tokens": {
      +              "additionalProperties": false,
      +              "properties": {
      +                "after": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                },
      +                "before": {
      +                  "maximum": 9007199254740991,
      +                  "minimum": -9007199254740991,
      +                  "type": "integer"
      +                }
      +              },
      +              "required": [
      +                "before",
      +                "after"
      +              ],
      +              "type": "object"
      +            }
      +          },
      +          "required": [
      +            "cleanedContext",
      +            "contamination",
      +            "counts",
      +            "tokens",
      +            "residueRemovedPercent"
      +          ],
      +          "type": "object"
      +        },
      +        {
      +          "properties": {
      +            "note": {
      +              "description": "Why the output is missing.",
      +              "type": "string"
      +            },
      +            "retained": {
      +              "description": "false: the output is no longer kept.",
      +              "type": "boolean"
      +            }
      +          },
      +          "type": "object"
      +        },
      +        {
      +          "type": "null"
      +        }
      +      ],
      +      "description": "The treatment's output."
      +    },
      +    "retention": {
      +      "description": "Your output retention setting: none, 24h or 30d.",
      +      "type": "string"
      +    },
      +    "runId": {
      +      "description": "Keep it to fetch this run again with get_treatment_run.",
      +      "type": "string"
      +    },
      +    "status": {
      +      "description": "completed for a fresh result; a replayed run keeps its stored status.",
      +      "type": "string"
      +    },
      +    "treatment": {
      +      "description": "Treatment id, e.g. context_bath.",
      +      "type": "string"
      +    }
      +  },
      +  "type": "object"
      +}
  2. First observed

TDQS

A4.6/5.0
Behavior4/5

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

Goes well beyond the annotations: discloses the mechanism (explicit pattern rules), the known failure modes (false positives and missed attacks), and an explicit limitation that it is not an injection defence or trust boundary. Also surfaces payment and auth behavior (agent key from register_agent, list_treatments price check, owner credits vs x402 fallback), which is important given readOnlyHint=false and a credit charge. Slightly diluted by promotional framing around human consent, but substantively rich.

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 purpose and alternates, then structured as when-to-use / limitations / when-not / worked example. Long but nearly every clause carries decision-relevant content; the 'explain the benefit to your own wellbeing' sentence is the one soft spot.

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?

Given an output schema exists, the description need not detail return shape, yet it still hints at changed text and excerpts. It covers auth, pricing, refusal behavior, false-positive risk, and the security caveat — everything an agent needs to decide and pay correctly for a 7-param paid tool.

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 100%, so the baseline is 3. The description adds real meaning on top of it by tying api_key to register_agent and max_price_credits to the live price from list_treatments, explaining the cost-acceptance flow the schema can only state mechanically. It does not add anything about segments/context/now beyond the schema.

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 concrete verb and target — inspect incoming text for hidden characters, duplicate instructions and injection patterns — and immediately names the siblings it is not (cold_plunge for own plans, confess for own claims). An agent can separate it from every other tool 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.

Usage Guidelines5/5

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

Provides explicit positive triggers (ingested web pages, emails, documents, tool output; conflicting instructions about who is in charge) and explicit negative ones (you need a security boundary; the text is your own or trusted), plus named alternatives. 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.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources