# Get catalog

URL: https://docs.hanzo.ai/docs/openapi/tool/get-tool-catalog-by-id

> Returns one catalog entry in full: the publisher's description, its repository and site, every package form with the runtime that launches it, and every hosted endpoint.

`GET /v1/tool/catalog/{id}`

> [Tool →](https://docs.hanzo.ai/docs/openapi/tool) · [All API references →](https://docs.hanzo.ai/docs/openapi) · [Get started →](https://docs.hanzo.ai/docs/guides)

|               |                                             |
| ------------- | ------------------------------------------- |
| **Address**   | `https://api.hanzo.ai/v1/tool/catalog/{id}` |
| **Method**    | `GET`                                       |
| **Operation** | `get_tool_catalog_by_id`                    |
| **Auth**      | `Authorization: Bearer $HANZO_API_KEY`      |

Returns one catalog entry in full: the publisher's description, its
repository and site, every package form with the runtime that launches it, and
every hosted endpoint. It is what a branding page renders, and what tells a
caller whether the listing can be enabled here and now (a streamable-http
remote) or needs somewhere to run first (a stdio package).

A HIDDEN listing is not served to an org — a shelf that renders what it does
not list would be a way around the shelf — but is served to a SuperAdmin, who
is the one deciding whether to put it back. Like the shelf, it needs no
credential.

## Request

1 field.

| Field | In   | Type   | Required | Description                       |
| ----- | ---- | ------ | -------- | --------------------------------- |
| `id`  | path | string | yes      | ID is the listing, from the path. |

## Response

| Status    | Body            | Meaning |
| --------- | --------------- | ------- |
| `200`     | tool.MCPListing | ok      |
| `default` | problem-details | refused |

`200` body — 24 fields.

| Field                   | In   | Type               | Always | Description                                                                                                                         |
| ----------------------- | ---- | ------------------ | ------ | ----------------------------------------------------------------------------------------------------------------------------------- |
| `description`           | body | string             | —      | Description is the publisher's one-line summary.                                                                                    |
| `featured`              | body | boolean            | —      | Featured puts the listing on the front of the shelf.                                                                                |
| `hidden`                | body | boolean            | —      | Hidden keeps the listing out of the org-visible catalog.                                                                            |
| `id`                    | body | string             | —      | ID addresses the listing in a URL.                                                                                                  |
| `logo`                  | body | string             | —      | Logo is the brand mark to render for the listing — the publisher's icon when the entry carries one, or the one an admin set.        |
| `name`                  | body | string             | —      | Name is the publisher's reverse-DNS name, e.g. "com.stripe/mcp".                                                                    |
| `official`              | body | boolean            | —      | Official is whether this is the vendor's OWN server rather than someone else's copy of it.                                          |
| `packages`              | body | tool.MCPPackage\[] | —      | Packages are the runnable package forms — npm, pypi, oci — each with the runtime that launches it and the transport it then speaks. |
| `packages[].identifier` | body | string             | —      | Identifier is the package name or download URL.                                                                                     |
| `packages[].registry`   | body | string             | —      | Registry is where the package is fetched from: npm, pypi, oci, nuget, mcpb.                                                         |
| `packages[].runtime`    | body | string             | —      | Runtime is the publisher's hint for what launches it: npx, uvx, docker.                                                             |
| `packages[].transport`  | body | string             | —      | Transport is what the launched process speaks: usually "stdio".                                                                     |
| `packages[].version`    | body | string             | —      | Version is the exact published package version.                                                                                     |
| `registry`              | body | string             | —      | Registry is the upstream this row was synced from.                                                                                  |
| `remotes`               | body | tool.MCPRemote\[]  | —      | Remotes are the hosted endpoints the publisher serves the server at.                                                                |
| `remotes[].transport`   | body | string             | —      | Transport is "streamable-http" or "sse".                                                                                            |
| `remotes[].url`         | body | string             | —      | URL is the endpoint.                                                                                                                |
| `repo`                  | body | string             | —      | Repo is the source repository URL, when the entry names one.                                                                        |
| `site`                  | body | string             | —      | Site is the project's homepage, when the entry names one.                                                                           |
| `synced`                | body | integer (int64)    | —      | Synced is when this row was last confirmed against upstream, Unix seconds.                                                          |
| `title`                 | body | string             | —      | Title is the human-readable display name, when the entry carries one.                                                               |
| `transports`            | body | string\[]          | —      | Transports are the distinct transports this server can be reached over, sorted: some of "stdio", "streamable-http", "sse".          |
| `vendor`                | body | string             | —      | Vendor is the namespace half of Name — the publisher, e.g. "com.stripe".                                                            |
| `version`               | body | string             | —      | Version is the published version of this listing.                                                                                   |

Failure carries the platform error shape — see [Errors](https://docs.hanzo.ai/docs/errors).

## Examples

**CLI**

```bash
hanzo tool catalog get <id>
```

**SDK**

**.ts**

```ts
import { Configuration, ToolApi } from 'hanzoai';

const api = new ToolApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.getToolCatalogById({ id: 'id' });
```

**.py**

```python
from hanzoai.cloud import ApiClient, Configuration
from hanzoai.cloud.api import ToolApi

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = ToolApi(client).get_tool_catalog_by_id(id='id')
```

**.go**

```go
cfg := hanzoai.NewConfiguration()
cfg.AddDefaultHeader("Authorization", "Bearer "+os.Getenv("HANZO_API_KEY"))
client := hanzoai.NewAPIClient(cfg)

resp, _, err := client.ToolAPI.GetToolCatalogById(context.Background()).Execute()
if err != nil {
	return err
}
```

**.rs**

```rust
use hanzo_client::apis::{configuration::Configuration, tool_api};

let mut cfg = Configuration::new();
cfg.bearer_access_token = std::env::var("HANZO_API_KEY").ok();

let result = tool_api::get_tool_catalog_by_id(&cfg, Default::default()).await?;
```

**.java**

```java
import ai.hanzo.cloud.ApiClient;
import ai.hanzo.cloud.api.ToolApi;

ApiClient client = new ApiClient();
client.setBearerToken(System.getenv("HANZO_API_KEY"));

var result = new ToolApi(client).getToolCatalogById();
```

**HTTP**

```bash
curl https://api.hanzo.ai/v1/tool/catalog/<id> \
  -H "Authorization: Bearer $HANZO_API_KEY"
```

**MCP**

Tool `tool`, op `get_tool_catalog_by_id` — POST the JSON-RPC envelope to `https://api.hanzo.ai/v1/mcp`.

```bash
curl -X POST https://api.hanzo.ai/v1/mcp \
  -H "Authorization: Bearer $HANZO_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
       "jsonrpc": "2.0",
       "id": 1,
       "method": "tools/call",
       "params": {
         "name": "tool",
         "arguments": {
           "op": "get_tool_catalog_by_id",
           "input": {
             "id": "<id>"
           }
         }
       }
     }'
```

---

[Tool API](https://docs.hanzo.ai/docs/openapi/tool) · [All Hanzo APIs](https://docs.hanzo.ai/docs/openapi) · [Interactive reference](https://docs.hanzo.ai/docs/openapi/reference)
