Skip to main content
Glama
plunger

plunger

Official

save_request

Idempotent

Stores an HTTP request in the Saved list without sending it, so it can be rerun by name later; enable overwrite to replace an existing saved request.

Instructions

Save a request in the user's Saved list without sending it, so it can be re-run by name with send_request (saved_request). Describe it like send_request. {{placeholders}} are kept as written, including in Authorization headers. An existing name is refused unless overwrite is true, which replaces it, so a mistake can be fixed.

Tool call template

Replace each placeholder with a value matching the input schema. Only required parameters are included; add optional parameters as needed.

{
  "id": 1,
  "jsonrpc": "2.0",
  "method": "tools/call",
  "params": {
    "arguments": {
      "name": "<name>"
    },
    "name": "save_request"
  }
}

Input Schema

NameRequiredDescriptionDefault
urlNoFull URL. May use {{variables}}, e.g. "{{base}}/users/{{id}}". Required unless saved_request is given.
bodyNoA raw text body, sent as-is. Use instead of `json` for non-JSON payloads.
formNoForm fields, sent as application/x-www-form-urlencoded.
jsonNoA JSON body (any JSON value). Sent with Content-Type: application/json.
nameYesThe name to save it under, shown in Plunger's Saved list.
groupNoFile it under a group, such as "Jira" or "Jira/Issues". Left out, a new request has no group and a replaced one keeps its group; an empty string takes it out of its group.
methodNoGET, POST, PUT, PATCH, DELETE, HEAD or OPTIONS. Defaults to GET.
selectNoReturn only these values instead of the whole body, e.g. ["$.data[0].id", "header:Location", "status"]. Saves context on a big response; `json`, `body` and the headers are then left out. `[?(@.name=='Done')]` keeps the array items whose field equals the value. `jq:<program>` reshapes the whole body with a jq program (e.g. "jq:[.items[] | {id, name}]"; pure, no files or network; several outputs come back as an array). On a 4xx or 5xx the start of the body is returned as `error_body`, so the reason is not hidden. If every path fails the whole response is returned with the reasons; if only some fail, the values that could be read come back and `problems` names the rest.
extractNoKeep values from the response as variables for later requests, e.g. [{"name": "token", "from": "json:$.access_token"}]. `from` is `json:$.path`, `header:Name` or `status`. A name like token or password is kept as a hidden secret.
headersNoRequest headers, e.g. {"Accept": "application/json", "Authorization": "Bearer {{token}}"}. A list of {"name", "value"} objects or "Name: value" strings is accepted too.
overwriteNoReplace a saved request that already has this name (otherwise an existing name is refused).
variablesNoExtra or overriding {{variable}} values for this request only. The user's own variables (including secrets) are already available by name; you don't need their values.
insecure_tlsNoSkip TLS certificate checks, e.g. for a local server with a self-signed certificate.
timeout_secsNoSeconds to wait for a response (1-600). Defaults to the user's setting (20).
saved_requestNoSend a saved request by name (see list_saved_requests). Any other field given here overrides that part of it.
max_body_charsNoLongest body to return, in characters (default 50000). A longer JSON body comes back as an outline of its shape (keys, types, array lengths) with a hint to use `select`; a longer text body is cut and marked with `body_cut_from_chars`.
include_headersNoWhich response headers to return: `all`, `none`, or `relevant` (location, link, retry-after, content-type, content-disposition, etag, rate-limit headers and set-cookie names). Left out: `all`, or `none` when `select` is used.
follow_redirectsNoFollow redirects (default true). Set false to receive the redirect response itself and read its `Location` header.
use_saved_bearerNoAttach the Bearer token the user saved in Plunger. Off by default: only turn it on for a host the user asked you to call with their credentials.

Output Schema

NameRequiredDescriptionDefault
urlYes
bodyNo
groupNoThe group a saved request is filed under (`Jira`, `Jira/Issues`).
methodYes
headersYes
optionsNoWhat a saved request carries besides its form: `timeout_secs`, `follow_redirects`, `insecure_tls` and `select`. They apply when it is sent by name, unless the call gives its own.
saved_idNoSet when saved under `save_as`; it now shows in Plunger's Saved list.
body_typeYesnone, json, form-data or raw.
not_savedNoFields of the call that a saved request does not keep (only said when there are some).
form_fieldsNomultipart -F fields: "name=value" or "name=@file".
variables_usedYes{{variables}} the request uses.

Schema Changelog

Changes observed during successful MCP inspections.

  1. Changed1 schema field changedv0.8.1
    • changedInput schema / properties / select / description
      Previous value: -"Return only these values instead of the whole body, e.g. [\"$.data[0].id\", \"header:Location\", \"status\"].\nSaves context on a big response; `json`, `body` and the headers are then left out. `[?(@.name=='Done')]`\nkeeps the array items whose field equals the value. If every path fails the whole response is returned with the reasons; if only some fail, the values that could be read come back and `problems` names the rest."New value: +"Return only these values instead of the whole body, e.g. [\"$.data[0].id\", \"header:Location\", \"status\"].\nSaves context on a big response; `json`, `body` and the headers are then left out. `[?(@.name=='Done')]`\nkeeps the array items whose field equals the value. `jq:<program>` reshapes the whole body with a jq program\n(e.g. \"jq:[.items[] | {id, name}]\"; pure, no files or network; several outputs come back as an array). On a 4xx or\n5xx the start of the body is returned as `error_body`, so the reason is not hidden. If every path fails the whole response is returned with the reasons; if only some fail, the values that could be read come back and `problems` names the rest."
  2. First observedv0.1.0

TDQS

A4.2/5.0
Behavior4/5

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

Beyond the annotations, the description discloses that saving does not send the request, that placeholders are kept as written including in Authorization headers, and that an existing name is refused unless overwrite is true. These are useful behavioral details for an agent. With idempotentHint and destructiveHint already present, the description adds solid context without being exhaustive.

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

Conciseness5/5

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

The description is three sentences and front-loads the core action: save without sending. Every sentence carries relevant information about re-running, placeholders, and overwrite behavior.

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

Completeness4/5

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

For a complex 19-parameter tool with full schema descriptions and an output schema, the description covers the key behavioral points an agent needs: save-only semantics, re-run by name, placeholder preservation, and overwrite refusal. The phrase 'Describe it like send_request' is slightly indirect, but the schema fills in the remaining request-shape details.

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

Parameters3/5

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 19 parameters in detail. The description adds meaning mainly around overwrite and placeholder preservation, but otherwise leaves parameter semantics to the schema. This fits the baseline of 3 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.

Purpose5/5

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

The description states a specific verb and resource: save a request in the user's Saved list without sending it, so it can be re-run by name with send_request. It explicitly distinguishes this from send_request by saying it does not send the request, and it names the related saved_request parameter.

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?

The description implies when to use it: to persist a request for later re-run with send_request rather than sending it immediately. It also explains the overwrite condition for an existing name. It does not explicitly state when not to use it or contrast it with every sibling, but the routing to send_request is clear.

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