> ## Documentation Index
> Fetch the complete documentation index at: https://iotools.cloud/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# Install

> Add IOTools.cloud to Claude, Cursor, Windsurf or any MCP client

## Prerequisites

An API key from [Account → API keys](https://iotools.cloud/account/#api-keys). The same key works for REST and MCP.

## The config

Every client below reads the same shape. Substitute your key:

```json theme={"system"}
{
  "mcpServers": {
    "iotools": {
      "type": "http",
      "url": "https://mcp.iotools.cloud/mcp",
      "headers": { "Authorization": "Bearer YOUR_API_KEY" }
    }
  }
}
```

<Tabs>
  <Tab title="Claude Desktop">
    Edit `claude_desktop_config.json`:

    * **macOS** — `~/Library/Application Support/Claude/claude_desktop_config.json`
    * **Windows** — `%APPDATA%\Claude\claude_desktop_config.json`

    Add the block above, then **fully quit and reopen Claude** — reloading the window is not enough.
  </Tab>

  <Tab title="Cursor">
    **Settings → MCP → Add new global MCP server**, or edit `~/.cursor/mcp.json` directly with the block above.
  </Tab>

  <Tab title="Windsurf">
    **Settings → Cascade → MCP servers → Add server**, then paste the block.
  </Tab>

  <Tab title="Other clients">
    Any client supporting the **Streamable HTTP** transport works. Point it at `https://mcp.iotools.cloud/mcp` and send `Authorization: Bearer YOUR_API_KEY`.
  </Tab>
</Tabs>

<Warning>
  This config file holds a live credential in plaintext. Don't commit it, and don't paste it into a chat — including into the agent you are configuring.
</Warning>

## Listing all 800+ tools

A session advertises five tools by default; the catalog is reached through `search_tools` → `describe_tool` → `run_tool`, because the full listing is \~215k tokens and most clients load it eagerly. If yours loads tools **lazily** (Claude Code, the Claude API's tool-search), add `?listing=full` for every tool by name with its own schema:

```json theme={"system"}
"url": "https://mcp.iotools.cloud/mcp?listing=full"
```

Same key, same credits, same tools. See [the overview](/docs/mcp/overview#the-full-listing).

## Check it worked

Ask the agent something only a tool can answer:

> Use IOTools to convert "hello world" to uppercase.

It should find `case-converter` with `search_tools` and run it with `run_tool`, coming back with `HELLO WORLD`. If it answers without calling a tool, it hasn't loaded the server — restart the client.

Clients that support elicitation stop and ask before the paid call:

> String Case Converter costs 3 credits. Run it?

That's the safeguard, not a glitch — approve and it runs, decline and nothing is charged. See [Your agent can't spend credits without asking](/docs/mcp/overview#your-agent-cant-spend-credits-without-asking).

## Troubleshooting

| Symptom                                 | Cause                                                                                                                       |
| --------------------------------------- | --------------------------------------------------------------------------------------------------------------------------- |
| No IOTools tools listed                 | Client not restarted, or malformed JSON. A trailing comma is the usual culprit                                              |
| Only 5 tools listed                     | That's the default — the catalog is behind `search_tools`/`run_tool`. Add `?listing=full` if your client loads tools lazily |
| Every call fails with `invalid_api_key` | Key revoked, or `Bearer ` prefix missing                                                                                    |
| `insufficient_credits`                  | Out of credits for the month — see [Credits](/docs/concepts/credits)                                                             |
| `tool_not_found`                        | The agent invented a tool name. Tell it to run `search_tools` first                                                         |
| `validation_error` on a field name      | The agent guessed the inputs. Tell it to call `describe_tool` before `run_tool`                                             |
