GET /v1/actions/packs/{namespace}/{name}/tools
Every action of a pack version that is exposed to MCP, as MCP tool definitions in one response, so an MCP server lists a pack's tools with one request instead of one describe per action. The node builds the list when it loads the pack. Tool names are the registry's (`mcp_name`); each tool also carries the action's `ref` and `effects`, which a server drops from `tools/list`. Cache the response for `ttlMs`; the `ETag` is the version's content hash plus the filters, and `If-None-Match` with it answers `304`.

Authentication

Bearer Token (b3os_sk_ API key or b3os_pat_ token)

Path Parameters

namespace string required path
Reverse-DNS publisher namespace, such as `io.b3os`.
Example: "io.b3os"
name string required path
Pack name within the namespace, such as `github`.
Example: "github"

Query Parameters

version string optional query
An exact version or a range such as `1` or `^1.2`; the latest by default.
effects string optional query
The most a listed tool may do. `read` lists `pure` and `read` actions only.
actions string optional query
Only these action keys, comma-separated (`post-message,list-channels`). An unknown key is a 400.

Header Parameters

If-None-Match string optional header
The `ETag` of a response you hold.

Responses

200 The pack's tools.
application/json
object string REQUIRED
Enum: pack_tools
pack string REQUIRED
version string REQUIRED
content_hash string REQUIRED
ttlMs integer REQUIRED
How long to cache this list, in milliseconds.
tools object[] REQUIRED
Array of:
name string REQUIRED
The MCP tool name (`mcp_name`).
title string REQUIRED
description string REQUIRED
inputSchema object | boolean REQUIRED
A JSON Schema (draft 2020-12) document, such as a routine's `inputs` or an action's `inputSchema`. B3OS checks it against the meta-schema when it is published. References to the meta-schema in `schemas/*.json` resolve here.
Any of:
Option 1object
Option 2boolean
outputSchema object | boolean
A JSON Schema (draft 2020-12) document, such as a routine's `inputs` or an action's `inputSchema`. B3OS checks it against the meta-schema when it is published. References to the meta-schema in `schemas/*.json` resolve here.
Any of:
Option 1object
Option 2boolean
annotations object REQUIRED
title string
readOnlyHint boolean
destructiveHint boolean
idempotentHint boolean
openWorldHint boolean
ref string REQUIRED
effects string REQUIRED
`pure` computes from input only; `read` reads from the world; `write` changes it; `irreversible` changes it and cannot be undone (never retried automatically). Drives MCP annotations and retries.
Enum: pure, read, write, irreversible
304 Nothing changed since `If-None-Match`.
400 The request failed validation (`invalid_request`, `invalid_url`).
401 Missing, malformed, expired or revoked credentials (`unauthorized`).
403 Authenticated but not allowed (`forbidden`, `egress_denied`).
404 No such pack or version (`pack_not_found`, `pack_version_not_found`).
429 A rate, concurrency or quota limit applies (`rate_limited`, `concurrency_limited`, `quota_exceeded`).
500 Something failed inside B3OS (`internal`). Retry with backoff.
503 The node or the product is not available right now (`node_unavailable`, `product_unavailable`, `capacity_unavailable`).
curl -X GET 'https://beta-api.b3os.org/v1/actions/packs/io.b3os/github/tools' \  -H 'Authorization: Bearer YOUR_API_TOKEN'
const response = await fetch('https://beta-api.b3os.org/v1/actions/packs/io.b3os/github/tools', {  method: 'GET',  headers: {      "Authorization": "Bearer YOUR_API_TOKEN"  }});const data = await response.json();console.log(data);
import requestsheaders = {    'Authorization': 'Bearer YOUR_API_TOKEN'}response = requests.get('https://beta-api.b3os.org/v1/actions/packs/io.b3os/github/tools', headers=headers)print(response.json())
200 Response
{  "object": "pack_tools",  "pack": "io.b3os/github",  "version": "1.0.0",  "content_hash": "sha256:1201ecd682388440dfef9cf437f213b05584a971a8673d2b3679d2401f6cd8ae",  "ttlMs": 300000,  "tools": [    {      "name": "github__create-issue",      "title": "Create issue",      "description": "Open a new issue with a title, optional Markdown body, labels and assignees. Returns its number and URL. Not idempotent: calling it twice opens two issues.",      "inputSchema": {        "type": "object",        "required": [          "owner",          "repo",          "title"        ],        "properties": {          "owner": {            "type": "string"          },          "repo": {            "type": "string"          },          "title": {            "type": "string"          }        },        "additionalProperties": false,        "examples": [          {            "owner": "acme",            "repo": "widgets",            "title": "Flaky test in checkout flow"          }        ]      },      "outputSchema": {        "type": "object",        "properties": {          "number": {            "type": "integer"          },          "html_url": {            "type": "string"          }        }      },      "annotations": {        "title": "Create issue",        "readOnlyHint": false,        "destructiveHint": false,        "idempotentHint": false,        "openWorldHint": true      },      "ref": "io.b3os/github/create-issue@1.0.0",      "effects": "write"    }  ]}
Ask a question... ⌘I