# List tools

URL: https://docs.hanzo.ai/docs/openapi/ai/aimcptools

> Reports what THIS PROCESS's MCP server carries: how many tools its own registry projects, optionally their names, and which subsystems this process composed.

`GET /v1/ai/mcp/tools`

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

|               |                                        |
| ------------- | -------------------------------------- |
| **Address**   | `https://api.hanzo.ai/v1/ai/mcp/tools` |
| **Method**    | `GET`                                  |
| **Operation** | `aiMCPTools`                           |
| **Auth**      | `Authorization: Bearer $HANZO_API_KEY` |

Reports what THIS PROCESS's MCP server carries: how many tools its own
registry projects, optionally their names, and which subsystems this process
composed. It is the answer to "is this MCP server up and does it have anything
behind it" — a question a status code cannot answer, since an empty server and
a full one are both 200. What the FLEET's server carries is the fleet server's
own answer: POST /v1/mcp, tools/list, which asks every subsystem and names the
ones that did not reply.

## Request

1 field.

| Field   | In    | Type    | Required | Description                                                               |
| ------- | ----- | ------- | -------- | ------------------------------------------------------------------------- |
| `names` | query | boolean | —        | Names asks for this process's tool NAMES and not only how many there are. |

## Response

| Status    | Body            | Meaning |
| --------- | --------------- | ------- |
| `200`     | aiMCPSurface    | ok      |
| `default` | problem-details | refused |

`200` body — 5 fields.

| Field           | In   | Type            | Always | Description                                                                                                                                                  |
| --------------- | ---- | --------------- | ------ | ------------------------------------------------------------------------------------------------------------------------------------------------------------ |
| `apps`          | body | aiMCPApp\[]     | —      | Apps is one row per subsystem this deployment composes, in manifest order.                                                                                   |
| `apps[].name`   | body | string          | —      | Name is the subsystem, as the manifest names it.                                                                                                             |
| `apps[].served` | body | boolean         | —      | Served reports that THIS process mounted it, so its tools are on this process's MCP server rather than behind a sibling this process only knows the name of. |
| `names`         | body | string\[]       | —      | Names are this process's own tool names, present only when the query asked for them.                                                                         |
| `tools`         | body | integer (int64) | —      | Tools is how many tools THIS PROCESS's MCP server carries: its own typed-op registry, projected.                                                             |

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

## Examples

**CLI**

```bash
hanzo ai mcp tools
```

**SDK**

**.ts**

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

const api = new AiApi(new Configuration({ accessToken: process.env.HANZO_API_KEY }));
const { data } = await api.aiMCPTools();
```

**.py**

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

client = ApiClient(Configuration(access_token=os.environ["HANZO_API_KEY"]))
result = AiApi(client).ai_mcp_tools()
```

**.go**

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

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

**.rs**

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

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

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

**.java**

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

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

var result = new AiApi(client).aiMCPTools();
```

**HTTP**

```bash
curl https://api.hanzo.ai/v1/ai/mcp/tools \
  -H "Authorization: Bearer $HANZO_API_KEY"
```

**MCP**

Tool `ai`, op `aiMCPTools` — 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": "ai",
         "arguments": {
           "op": "aiMCPTools",
           "input": {}
         }
       }
     }'
```

---

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