# Tools (/mcp/tools)

Sim MCP exposes four tools for discovering and calling its supported JSON API operations. Search for an operation, inspect its inputs, then call the read or write tool named in its description.

## Tools \[#tools]

| Tool | Does |
| - | - |
| `search_operations` | Finds operations by keyword (`"table rows"`) or by area (`tables`, `workflows`, `knowledge`, …). Returns each operation's name, method, path, summary, and the tool that runs it. |
| `describe_operation` | Returns an operation's description and the JSON Schema of its path parameters, query, body, and headers. |
| `call_read_operation` | Runs an operation that only needs read access, such as `listWorkspaces`, `queryRows`, or `getWorkflowRun`. |
| `call_write_operation` | Runs an operation that needs write access: one that creates, changes, runs, or deletes something, or reaches out to another service, such as `createTable`, `executeWorkflow`, or `listMcpServerTools`. |

The operation's required access determines the tool, rather than its HTTP method: a read can use POST, and a GET that contacts another service can require write access. Your app controls tool approvals.

`search_operations` returns the total number of matches and at most `limit` operations: 25 by default, 100 maximum. Catalog search has no cursor. Narrow the keywords or `domain` when matches exceed that limit; this is separate from paginating API resources.

## Calling an operation \[#calling-an-operation]

Operation names match the [CLI](/cli/reference) and the
[API reference](/api-reference/getting-started). A call names the operation and
fills the parts of the request it needs:

```json
{
  "operation": "listTableRows",
  "params": { "tableId": "tbl_8f2c" },
  "query": { "workspaceId": "ws_91ab", "limit": 50 }
}
```

| Field | Holds |
| - | - |
| `params` | Path parameters, such as `tableId` or `workflowId` |
| `query` | Query-string parameters; most operations need `workspaceId` |
| `body` | The JSON request body when the operation declares one, including read operations such as `queryRows` |
| `headers` | Only headers the operation declares, such as `upload-token` |

For example, `queryRows` uses the read tool with a JSON body:

```json
{
  "operation": "queryRows",
  "params": { "tableId": "tbl_8f2c" },
  "body": { "workspaceId": "ws_91ab", "limit": 50 }
}
```

Keep authentication in your app's connection configuration. You cannot pass undeclared authentication or protocol headers, including `X-API-Key`, `Authorization`, or `Accept`, through the call's `headers` field.

## Results and errors \[#results-and-errors]

The result is the same JSON the API returns, usually `{ "data": … }`. Paginated list
operations use `limit` and `cursor`; check the operation because some lists do not support pagination. A failed API call returns its error,
such as `{ "error": { "code": "NOT_FOUND", "message": "…" } }`, so the agent can
correct its request.

## Limits \[#limits]

- **Same rules as the API.** Permissions, rate limits, and request validation
  are the API's own; nothing is looser through MCP.
- **1 MiB per API result.** Request smaller pages for paginated lists. A single-resource result may also exceed the limit. The size check happens after the API executes: if a write returns a size error, check the resource state before repeating it because the change may already have succeeded.
- **No streaming.** Run a workflow without `stream: true` to wait for its
  result, or with `async: true` and poll `getWorkflowRun`.
- **No file bytes.** Downloads, knowledge base exports, and multipart document
  uploads are not available over MCP; use the [CLI](/cli/files) or the API.

## Related docs \[#related-docs]

- [Authentication](/mcp/authentication) for scopes and credential access
- [API getting started](/api-reference/getting-started) for response and pagination contracts
- [Workflow runs](/workflows/deployment/api) for synchronous and asynchronous execution
