---
title: "Get tool definitions from a tool server."
method: GET
path: "/rest/api/v1/tool-servers/{serverId}/tools"
tags: ["Tools"]
---

# Get tool definitions from a tool server.

`GET /rest/api/v1/tool-servers/{serverId}/tools`

Returns the name, description and JSON input schema for the named tools on the
specified tool server. Works for both action packs and MCP servers.

`toolNames` is required. Names that do not exist on the server are returned in
`notFound` rather than failing the request, so a single bad name does not force
callers into one-at-a-time retries. Matching is case-insensitive and treats `-`
and `_` as equivalent.

Native tools are not served; `serverId=native` returns 404.

## Query parameters

- `toolNames` string[], required

## Response `200`

Successful operation

- ToolDefinitionsResponse
  - `tools` ToolDefinition[], required — Definitions for the requested tools that exist on this server.
    - `serverId` string, required — Tool server this tool belongs to.
    - `name` string, required — Name to invoke the tool by.
    - `displayName` string — Human-readable name of the tool.
    - `description` string — What the tool does, as surfaced to a model.
    - `inputSchema` object — JSON Schema for the tool's input parameters.
    - `annotations` ToolAnnotations — Behavioural hints for the tool, exactly as declared by the tool server. No defaults are filled in — see the per-field notes for what an absent value means. Per the MCP specification, clients MUST treat these hints as untrusted unless the tool server is itself trusted. They are advisory metadata, not an authorization signal, and must not be the sole basis of a security decision.
      - `title` string
      - `readOnlyHint` boolean — True if the tool does not modify its environment. Always present. MCP defines no distinction between an undeclared value and `false` here, so `false` means "not declared read-only" rather than "declared mutating".
      - `destructiveHint` boolean, nullable — True if the tool may perform destructive updates. **Absent means the server did not declare it**, for which the MCP default is `true`. Only meaningful when `readOnlyHint` is `false`.
      - `idempotentHint` boolean — True if repeated calls with the same arguments have no additional effect. Always present; as with `readOnlyHint`, `false` means "not declared idempotent". Only meaningful when `readOnlyHint` is `false`.
      - `openWorldHint` boolean, nullable — True if the tool interacts with an open world of external entities. **Absent means the server did not declare it**, for which the MCP default is `true`.
  - `notFound` string[] — Requested names that do not exist on this server.

## Other responses

- `400` — Invalid request (e.g. missing toolNames, or more than 100 names)
- `401` — Unauthorized
- `404` — Tool server not found
- `429` — Too Many Requests
- `503` — Tool schemas could not be resolved from the server

---

[API](https://skmtc.net/gleanwork/apis/glean-api.md) · [All operations](https://skmtc.net/gleanwork/apis/glean-api/llms.txt) · [OpenAPI document](https://skmtc-service-staging.skmtc.workers.dev/v1/apis/gleanwork/glean-api/revisions/ebd602e4aea4/schema)
