protocols
MCP client
Connect to Model Context Protocol servers over STDIO, Streamable HTTP or HTTP + SSE, call tools, read resources and prompts, and test tools in Cloak Proxy.
An MCP request connects Cloak Proxy to a Model Context Protocol server, the kind of server AI assistants use for tools. You see the server’s tools, resources and prompts, call any tool with JSON arguments, and watch every JSON-RPC message in both directions. Use it to build and debug your own MCP server, to check what a third-party server really does before giving it to an assistant, or to test tools in the collection runner. Saved MCP requests can also give tools to AI requests.
This page is about Cloak Proxy as an MCP client. To let Claude Code, Cursor or another assistant control Cloak Proxy itself, see MCP server.
Add an MCP server
Section titled “Add an MCP server”-
In the API client’s sidebar, click MCP. The Overview page opens.
-
Click New MCP Server, or open From a Preset and choose a ready-made server (table below). You can also click + at the top of the sidebar.
The request is saved in a collection named MCP Servers, created the first time, and appears in the MCP sidebar list.
-
Set the transport and the command or URL, then press ⌘ ↩ or click Connect.
-
Click New › Other Protocols › MCP, or right-click a collection and choose Add Other Request › MCP. Search Everything (⇧ ⌘ A) also has New MCP Request.
-
Set the transport and the command or URL, then press ⌘ ↩ or click Connect.
Every MCP request in any collection also appears in the MCP section’s list.
The MCP section collects every MCP server in your workspace.
- MCP section in the sidebar
- + adds a new MCP server
- New MCP Server
- From a Preset
- Your saved servers; click one to open it
| Preset | Command | What it does |
|---|---|---|
| Everything (demo) | npx -y @modelcontextprotocol/server-everything |
Every MCP feature, for trying things out. |
| Filesystem | npx -y @modelcontextprotocol/server-filesystem ~/Documents |
Read and search files in a folder. |
| Memory | npx -y @modelcontextprotocol/server-memory |
A knowledge-graph memory. |
| Fetch | uvx mcp-server-fetch |
Fetch web pages as Markdown. |
The npx presets need Node.js, and Fetch needs uv. The rest of the Overview page covers using Cloak Proxy from AI assistants and turning a collection into an MCP server.
Choose a transport
Section titled “Choose a transport”Pick the transport from the menu at the left of the connection bar:
| Transport | Connection bar holds | Use for |
|---|---|---|
| STDIO | The command line that starts the server, for example npx -y @modelcontextprotocol/server-everything. |
Local servers that run as a process. Cloak Proxy starts the process and talks to it over standard input and output. |
| Streamable HTTP | The server’s URL, for example https://mcp.example.com/mcp. |
Remote servers using the current HTTP transport (MCP 2025-03-26 and later). |
| HTTP + SSE | The server’s SSE endpoint URL. | Older remote servers using the legacy event-stream transport (MCP 2024-11-05). |
{{variables}} work in the command or URL.
An STDIO MCP request before connecting.
- Transport: STDIO, Streamable HTTP or HTTP + SSE
- Command line or server URL
- Connect (⌘↩)
- Tools, Resources and Prompts, with counts
- Environment (STDIO) or Headers (HTTP)
- Use in… exports the server to other MCP clients
STDIO servers
Section titled “STDIO servers”The command line is split into words like a shell does, honoring single and double quotes, but it isn’t run through a shell: pipes, && and $VARIABLES don’t work. The first word is the program.
Apps started from the Dock get a minimal PATH, so Cloak Proxy adds the usual tool folders when it looks up the program: /opt/homebrew/bin, /usr/local/bin, ~/.local/bin, ~/.volta/bin, ~/.cargo/bin, ~/.bun/bin, ~/.deno/bin, your nvm Node.js versions, and the system folders. If the program still isn’t found, the log shows Command not found and you can type its full path instead.
The Environment tab configures the process:
| Field | What it does |
|---|---|
| Environment variable table | Variables added to the process’s environment, on top of Cloak Proxy’s own. Values can use {{variables}}. Mark a row as secret to mask its value on screen. |
| Working directory (optional) | The folder the process starts in. ~ is expanded. It must exist, or connecting fails with Working directory does not exist. |
Lines the server writes to standard error appear in the log as stderr entries. When you disconnect, Cloak Proxy closes the server’s input, then stops the process if it doesn’t exit on its own.
HTTP servers
Section titled “HTTP servers”For Streamable HTTP and HTTP + SSE, the tab is called Headers: a table of headers sent with every request to the server, typically Authorization: Bearer {{mcp_token}}. Values can use {{variables}}, and rows can be marked secret to mask them.
With Streamable HTTP, Cloak Proxy keeps the session id the server assigns, opens the optional event stream for server messages, and ends the session when you disconnect. MCP connections go straight to the server, not through Cloak Proxy’s listening port.
Connect
Section titled “Connect”When you click Connect, Cloak Proxy starts or reaches the server, sends initialize, and then lists the server’s tools, and its resources and prompts if the server offers them. A line under the connection bar shows the server’s name and version, the protocol version you agreed on and the server’s instructions, if any.
Cloak Proxy asks for protocol version 2025-06-18 and accepts a server that answers with 2025-11-25, 2025-06-18, 2025-03-26 or 2024-11-05. Any other version fails the connection with an unsupported version error.
Call tools
Section titled “Call tools”-
Open Tools. The list shows each tool’s title (or name) and description.
-
Select a tool. Its description and an Arguments editor appear. The arguments start from the tool’s input schema: defaults where the schema has them, and empty values for required fields.
-
Edit the arguments as JSON. Warnings appear in orange below the editor when they don’t match the schema, for example a missing required field or a wrong type.
-
Press ⌘ ⇧ ↩ or click Run Tool. The result’s text appears under the button. If the tool reports a failure, the result starts with Tool reported an error:.
Selecting a tool also saves it, with its arguments, on the request: that’s the call the collection runner and cloakctl make. Selecting the same tool again keeps the arguments you saved.
The connection stays open while you work, and switching tabs doesn’t close it. A single call waits up to 60 seconds; when the server sends progress notifications, the wait starts over with each one.
Read resources and prompts
Section titled “Read resources and prompts”| Tab | What you see | Action |
|---|---|---|
| Resources | Each resource’s title (or name) and URI. | Read fetches the resource and adds its contents to the log. Binary contents show as their size. |
| Prompts | Each prompt’s title, description and arguments. Required arguments are marked with *. |
Get fetches the prompt with every argument set to an empty string and adds the resulting messages to the log. |
The tab badges count tools, resources and prompts.
Watch the protocol
Section titled “Watch the protocol”The Messages log at the bottom shows the whole conversation with the server:
| Entry | Meaning |
|---|---|
| Outgoing (blue) | A JSON-RPC request or notification Cloak Proxy sent, such as tools/call. |
| Incoming (green) | A response or request from the server. |
| Notification | A notification from the server, such as a progress update or a list change. |
| stderr | A line the STDIO server wrote to standard error. |
| Error / Couldn’t connect | A transport or protocol failure, with the reason. |
Select an entry to see its full JSON as a tree. Hide events hides notifications and stderr lines, the search field filters entries, and Clear empties the log. The log keeps the last 5,000 entries.
Use the server in other apps
Section titled “Use the server in other apps”The Use in… tab turns this request into configuration for another MCP client. Choose the app in Add this server to, then click Copy:
| App | Snippet | Where it goes |
|---|---|---|
| Claude Desktop | JSON for mcpServers. Remote servers are bridged with npx mcp-remote, because Claude Desktop’s config file only starts local processes. |
~/Library/Application Support/Claude/claude_desktop_config.json |
| Cursor | JSON for mcpServers. |
.cursor/mcp.json in a project, or ~/.cursor/mcp.json |
| VS Code | JSON for servers, with the transport type. |
.vscode/mcp.json |
| Claude Code | A claude mcp add command with the transport, environment variables or headers. |
Run it in a terminal. |
Variables are filled in, so the snippet contains real values. The working directory isn’t exported, because none of these formats has a field for it.
Run MCP requests in the collection runner
Section titled “Run MCP requests in the collection runner”The collection runner and cloakctl run a saved MCP request in one step: connect, make one call, disconnect.
| Saved on the request | What the run does | Body |
|---|---|---|
| No tool selected | Calls tools/list. |
A JSON array of tools, each with name, description and inputSchema. |
| A tool and arguments | Calls tools/call with the saved arguments (after filling in {{variables}}). |
The tool result as JSON: its content array, isError, and structuredContent when the server sends it. |
| Response part | Value |
|---|---|
| Status | 200 OK, or 500 Tool Error when the tool’s result has isError: true. |
| Headers | Content-Type: application/json, mcp-server (the server’s name and version), mcp-protocol-version, and mcp-tool for tool calls. |
A tool that fails is a response, so tests can check it. A server that can’t be started or reached, or arguments that aren’t valid JSON, is reported as an error with no response. The tool call waits up to the request timeout, 30 seconds by default.
MCP requests have no Scripts tab of their own. Put tests in the collection’s or a folder’s post-response script, and check pm.info.requestName for tests meant for one request:
if (pm.info.requestName === "Search issues tool") { pm.test("tool succeeded", () => pm.response.to.have.status(200)); pm.test("returned text content", () => { const result = pm.response.json(); pm.expect(result.content[0].type).to.eql("text"); pm.expect(result.content[0].text).to.include("issue"); });}