HOPPSCOTCH_TOOL_PROFILE, which defaults to core and exposes 39 of them.
Each table carries a Profiles column telling you where that tool is available, and “All” means every profile, minimal included. CRUD is shorthand for the four basic operations on a resource: create, read, update, and delete.
core and standard are separate branches of full, not a ladder. Switching from core to standard loses execute_request, validate_response, generate_code, generate_documentation, and all eleven request CRUD tools. Choose full if you need both sides.Cloud behavior
Against a self-hosted instance, Community or Enterprise, every tool works. On Cloud, this server refuses one tool, and one other is unavailable because of a backend limitation:
Those are the two tools unavailable on Cloud. No other tool carries a Cloud-specific check in this server. Apart from
get_user_collection, the personal collection, request, and environment tools are all available there, reads included.
execute_request and validate_response read personal environments only, so passing a team environment ID is rejected on either deployment. See Request execution.
Teams
Team discovery and administration.list_teams and get_team_info are read-only and ship in core. Every other tool here is team administration and requires standard or full.
remove_team_member and update_team_member_role identify a member by user ID, while invite_team_member uses an email address. Read the user ID from get_team_info first. Removing or demoting a team’s only owner is refused before the call is sent, though that check is a convenience: the backend is authoritative, and if membership cannot be read the call proceeds and the backend rejects it.Team collections
Collections inside a team workspace. These work on both Cloud and self-hosted, exceptsearch_team_requests.
Team environments
Environment variables scoped to a team workspace. These work on both Cloud and self-hosted.Reading an environment masks every secret value as
<secret hidden>, and an update replaces the entire variable list. Listing an environment and submitting it back would therefore write the mask over the real secret, so the server refuses that write. To leave a secret alone, omit the variables field entirely, which keeps every variable as it is. If you send variables at all, it replaces the whole list, so include every variable you mean to keep and give the secret its real value.Personal collections
Collections in your personal workspace.get_user_collection is the only one refused on Cloud. See Cloud behavior.
Personal environments
Environment variables scoped to your personal workspace. These work on Cloud and self-hosted alike.Team requests
Individual requests stored inside a team collection.Personal requests
Individual requests stored inside a personal collection. These work on Cloud and self-hosted alike.Request execution
The tools that send real HTTP traffic. Both refuse targets on your own machine or a private network, and both cap the response body, as described in Overview. The 30 second timeout is a default that a call can override with its owntimeout argument, between 1,000 and 120,000 milliseconds.
Code generation
Turn a request definition into code or documentation.Session
Sign-in control.Variable substitution
execute_request and validate_response substitute {{variable}} references from your personal environments. The behavior has several edges.
- Substitution applies to the URL, header values, and the body. It does not apply to the
authblock or to header names. - The
authblock handles bearer, basic, and API key authentication. For anything else, set theAuthorizationheader yourself as a normal header. - Only personal environments are read. Passing a team environment ID is rejected.
- These tools do not inherit authentication from a parent collection. They use only the
authyou pass in the call. - When you select an environment, an unresolved
{{placeholder}}in the URL, the body, or a header value fails the call. When you select no environment, an unresolved{{placeholder}}is sent rather than failing the call, because there is nothing to resolve it against. In a URL path the braces are percent-encoded on the wire. - The unresolved-placeholder check covers the same three places substitution does, so two locations are outside it entirely. A placeholder in a header name is never substituted or checked, and the call then fails before anything is sent, because braces are not legal in a header name. A placeholder in the
authblock is also never substituted or checked, and what reaches the wire depends on the authentication type. A bearer token is sent as written, Basic credentials are base64-encoded, an API key added to the query is percent-encoded into the URL, and an API key whose name is a placeholder fails the same way a placeholder header name does, but only in the default header placement. Added to the query instead, the name is percent-encoded and goes out as written. - Values marked secret substitute into a request to any origin by default. Set
HOPPSCOTCH_SECRET_ALLOWED_ORIGINSto restrict which origins may receive them.
What scrubbing covers
Secrets that a request substituted are scrubbed from the response body, headers, and error text before the model sees them. The scrubber works by matching the forms a secret takes when it is sent: the raw value, its JSON-escaped form, and the percent-encoded forms a URL produces for it. It does not match base64 or any other re-encoding. Matching on forms is what makes this best-effort. Either end of the request can produce something the forms miss:- Your request can drop part of the value. Everything after a
#becomes a URL fragment and never leaves your machine, so the target only ever receives the part before it. When it echoes that prefix back, nothing matches. - The target can change what it received before echoing it, by decoding a percent-escape, turning a
+back into a space, or splitting the value at a delimiter. Again, nothing matches.
auth block, and anything typed straight into a header are never candidates. And the set is per-request: it holds the secrets that particular call substituted, not everything sitting in the environment.
Annotations
Every tool carries four MCP annotation hints:readOnlyHint, destructiveHint, idempotentHint, and openWorldHint. Hosts may use them to decide whether to ask you before running a tool.
execute_request and validate_response are marked both destructive and open-world, because the target host is arbitrary and may perform any write the credentials in the request allow.
The hints come from each tool’s name prefix, with a few hand-written exceptions, which makes them coarser than they look. Twenty-five tools are marked destructiveHint: true, seventeen of them in core. The twelve that write without being marked destructive are every create_, import_, and duplicate_ tool, plus invite_team_member.
That last one is the sharp edge. An invitation is additive in shape, so it advertises destructiveHint: false, yet it accepts a role of OWNER. A host that prompts only on the destructive hint will not ask before an ownership grant. invite_team_member is not in the default profile, so reaching it takes standard or full.
Next steps
Overview
Installation, host setup, authentication, and configuration.
Troubleshooting
Errors you may see, what causes them, and how to fix them.