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

# Run a tool

> Run a tool once with its input and get its result as a job.

Run a tool by passing its `tool_id` and an `input` that matches its `input_schema`. The answer is a [job](/guides/jobs/job-object) that carries the result, usually within seconds.

## Pick the call by effect

| Effect | MCP | REST |
| - | - | - |
| `read` | `run_read_only_website_tool` | `POST /v1/runs/read-only` |
| `write` | `run_website_tool` | `POST /v1/runs` |

The ordinary run takes reads too. The read-only run refuses a write tool with `tool_not_read_only` before anything happens.

```json theme={null}
{
  "name": "run_read_only_website_tool",
  "arguments": {
    "tool_id": "tool_0f8e2d1c4b3a49e8a7f6e5d4c3b2a190",
    "input": "{\"from\":\"SFO\",\"to\":\"JFK\",\"date\":\"2026-11-20\"}"
  }
}
```

Through MCP, `input` is a JSON-encoded string. Over REST, send it as JSON in the body.

## Run reads in parallel

A read-only run changes nothing, so clients may run it without asking and send several at once, such as Google Flights searches for five dates.

## Run a write

A write changes the website and may not be undoable, such as checking out an Instacart cart. Send an `idempotency_key` so a retry never repeats it. See [Retry a call safely](/guides/tools/retries-and-idempotency).

## Sign in with a saved login

A tool whose `login` isn't `null` signs in. It uses the site's saved login on its own; pass `login_id` to choose when the site has several. With none saved, the job asks the person to sign in on its answer page. See [Give a job a login](/guides/logins/give-a-job-a-login).

## Get the result

An MCP run waits for the job: up to 5 minutes when your client accepts streaming, 50 seconds otherwise. REST answers at once. If the job is still running or asks a question, [follow it](/guides/jobs/wait-for-a-result) instead of running the tool again.

<Accordion title="Details">
  * An `input` that doesn't match the schema creates no job and answers `invalid_input`.
  * A result is delivered once. Save it when you receive it.
  * When the website rejects a saved login, the job waits up to 60 minutes for a correction, then resumes as the same job.
  * On an integration MCP, each tool takes `input` as a plain object and needs no `tool_id`. See [Use integration MCPs](/guides/integration-mcps/overview).
</Accordion>


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.