---
title: "List the tools a connector defines"
method: GET
path: "/connector/{slug}/tools"
tags: ["Connectors"]
---

# List the tools a connector defines

`GET /connector/{slug}/tools`

## Request

- Base URL: `https://api.elaichi.ai`
- URL: `https://api.elaichi.ai/connector/{slug}/tools`
- Auth: HTTP bearer

Lists every tool a connector defines, each flagged `restricted` and `restricted_by` for the caller. This is the catalog view with no account behind it; use it to pick `tool_name` values for toolbox entries. For what one authenticated account can run, use `GET /connection/{id}/tools`. Blocked tools are flagged, not omitted, so a person can see why one is unavailable (the model-facing `connector.list_tools` operation does omit them). `q` and `operation` are applied before paging, and `operation_counts` describes the `q`-filtered set (never narrowed by `operation` itself), so filter counts stay stable under a search. A restricted connector answers 403; a custom connector the caller cannot see answers 404 (checked first, so the 403 never confirms it exists). Requires `connector:view`.

## Path parameters

- `slug` string, required

## Query parameters

- `limit` integer
- `cursor` string
- `q` string
- `operation` string

## Headers

- `X-Organization-Id` string

## Response `200`

OK

- object
  - `result` object[], required
    - `name` string: Exact tool name — what a toolbox entry's `tool_name` must contain.
    - `description` string
    - `resource` string
    - `method` string
    - `input_schema` object: JSON Schema for the tool arguments.
    - `title` string: The upstream server's human title for the tool. Present only on a remote MCP tool that has one.
    - `tier` 'read' | 'write' | 'destructive': Always present. How the approval gate and the MCP scope ladder classify this tool, so a badge shown to a person always matches the gate. For a remote MCP tool it is derived from the server's annotations (unannotated means `destructive`) and follows the server up or down on every refresh. For a platform catalog tool whose method documents MCP annotations, those decide the tier (an HTTP DELETE is always `destructive`); any other catalog tool, including every custom connector and fork tool, takes it from its method and HTTP verb. Never infer a remote MCP tool from it: read `kind`.
    - `kind` 'catalog' | 'remote_mcp': `remote_mcp` for a tool from a remote MCP connector (its `resource` is the constant `mcp`, its `method` the upstream name, and `title` may be set), `catalog` for every other tool.
    - `tier_source` 'server' | 'default': Why a remote MCP tool's `tier` is what it is: `server` (the MCP server's own annotations decided it) or `default` (the server labeled the tool neither way, so the MCP safe default `destructive` applies). Lets a client say "Not labeled" rather than show a tier nobody chose. Present only on a remote MCP tool.
    - `restricted` boolean: True when the caller's restrictions block THIS tool. Blocked tools are returned flagged, never omitted — a shorter list is no signal, because nobody knows the length it should have been. Presence is not permission: execution still refuses it. The connector-level 403 is a separate question and is unchanged.
    - `restricted_by` 'role' | 'user' | 'null', nullable: Which precedence layer's rule blocks this tool, null when none does. Same field, union and meaning as on connector and connection rows: adds *which* to `restricted`'s *whether* and nothing else — no rule id, author, reason or coverage. `restricted === (restricted_by !== null)` always.
    - `restricted_scope` 'connector' | 'tool' | 'null', nullable: `"connector"` when the tool is refused because its WHOLE connector is restricted for the caller, `"tool"` for a rule about the tool itself, null exactly when `restricted_by` is. Decides which ask can succeed: a tool request on a connector restricted whole is refused (`409 tool_request_connector_blocked`), so ask for the connector. On this listing it is only ever `"tool"` when set, since a connector restricted whole 403s the route; toolbox entries carry the same field and can say `"connector"`.
    - `operation` 'read' | 'create' | 'update' | 'delete' | 'other': The CRUD bucket this tool falls into, computed from its resolved HTTP verb. Filter with `?operation=`.
  - `next_cursor` string, nullable, required
  - `prev_cursor` string, nullable, required
  - `operation_counts` object, required: How many tools of each CRUD bucket the `q` filter alone leaves — never narrowed further by `operation` itself, so the count beside an unselected filter chip stays honest. Repeated on every page.
    - `read` integer, required
    - `create` integer, required
    - `update` integer, required
    - `delete` integer, required
    - `other` integer, required

## Other responses

- `400`: Bad request
- `401`: Unauthorized
- `403`: Forbidden
- `404`: Not found
- `429`: Rate limited

---

[API](https://skmtc.dev/elaichi/apis/elaichi-api.md) · [All operations](https://skmtc.dev/elaichi/apis/elaichi-api/llms.txt) · [OpenAPI document](https://skmtc.dev/elaichi/apis/elaichi-api/revisions/b22cfb7b6d15?raw)
