Toolkits
Endpoints for managing the toolkits bound to an Assistant. A toolkit is a named group of tools (see the Toolkit API); binding one to an Assistant lets that Assistant call its tools.
Every route is gated by ai.verify (AI enabled on the tenant AND the caller
having AI access). The write routes (POST/DELETE) additionally require
permission.assistant.write on the looked-up Assistant.
A binding is the join row between an Assistant and a Toolkit; it is addressed in the URL by the toolkit's id.
GET /api/assistants/{id}/toolkits
List the toolkits bound to an Assistant.
Authentication: Required (AI access via ai.verify)
Response:
A HAL collection (rel inf:assistant-toolkits) of the bindings. Each row is
embedded as inf:assistant-toolkit and itself embeds inf:toolkit — the
bound toolkit, scoped to what the caller can read.
{
"_links": {
"self": {
"href": "https://informer.example.com/api/assistants/admin%3Aorder-desk-assistant/toolkits"
}
},
"start": 0,
"count": 1,
"total": 1,
"_embedded": {
"inf:assistant-toolkit": [
{
"_links": {
"self": {
"href": "https://informer.example.com/api/assistants/admin%3Aorder-desk-assistant/toolkits/00000000-0000-4000-8000-000000000001"
}
},
"id": "00000000-0000-4000-8000-000000000002",
"assistantId": "00000000-0000-4000-8000-000000000003",
"toolkitId": "00000000-0000-4000-8000-000000000001",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tenant": "acme",
"_embedded": {
"inf:toolkit": {
"_links": {
"self": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools"
},
"inf:toolkit-share": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/shares/{principalId}",
"templated": true
},
"inf:favorite": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/favorite"
},
"inf:toolkit-owner": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/owner"
},
"inf:toolkit-shares": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/shares"
},
"inf:toolkit-tools": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/tools"
},
"inf:toolkit-discover": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/discover"
}
},
"naturalId": "admin:order-tools",
"allowUserInstances": true,
"executionLocation": "server",
"canManageTools": true,
"permissions": {
"write": true,
"edit": true,
"delete": true,
"share": true,
"assignTags": true,
"changeOwner": true
},
"id": "00000000-0000-4000-8000-000000000001",
"name": "Order Tools",
"slug": "order-tools",
"type": "custom",
"description": "Helpers for the order desk.",
"instructions": null,
"ownerId": "admin",
"shared": false,
"folderId": null,
"config": null,
"integrationId": null,
"source": null,
"sourceId": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tenant": "acme",
"integration": null,
"_embedded": {
"inf:driver": {
"_links": {
"self": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/driver"
}
},
"id": "custom",
"name": "Integration Toolkit",
"description": "Create API tools that call external services via an Integration",
"image": "/images/icons/toolkit-server.svg",
"viewComponent": "customToolkitView",
"executionLocation": "server",
"allowUserInstances": true,
"canManageTools": true,
"supportsIntegration": true,
"editorComponent": {}
}
}
}
}
}
]
}
}
POST /api/assistants/{id}/toolkits
Bind a toolkit to the Assistant.
Authentication: Required (AI access + permission.assistant.write)
Request Body:
| Field | Type | Required | Description |
|---|---|---|---|
toolkitId | string | Yes | The toolkit's id or natural id. |
The binding is an idempotent upsert on UNIQUE(tenant, assistantId, toolkitId),
so re-posting the same toolkit returns the existing binding instead of erroring.
Returns 201 with a Location header pointing at the new binding.
{
"toolkitId": "admin:order-tools"
}
{
"_links": {
"self": {
"href": "https://informer.example.com/api/assistants/admin%3Aorder-desk-assistant/toolkits/00000000-0000-4000-8000-000000000001"
}
},
"id": "00000000-0000-4000-8000-000000000002",
"tenant": "acme",
"assistantId": "00000000-0000-4000-8000-000000000003",
"toolkitId": "00000000-0000-4000-8000-000000000001",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z"
}
GET /api/assistants/{id}/toolkits/{toolkitId}
Get a single binding.
Authentication: Required (AI access via ai.verify)
Returns the binding (embedding inf:toolkit). Responds 404 if the toolkit is
not bound to this Assistant.
{
"_links": {
"self": {
"href": "https://informer.example.com/api/assistants/admin%3Aorder-desk-assistant/toolkits/00000000-0000-4000-8000-000000000001"
}
},
"id": "00000000-0000-4000-8000-000000000002",
"assistantId": "00000000-0000-4000-8000-000000000003",
"toolkitId": "00000000-0000-4000-8000-000000000001",
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tenant": "acme",
"_embedded": {
"inf:toolkit": {
"_links": {
"self": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools"
},
"inf:toolkit-share": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/shares/{principalId}",
"templated": true
},
"inf:favorite": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/favorite"
},
"inf:toolkit-owner": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/owner"
},
"inf:toolkit-shares": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/shares"
},
"inf:toolkit-tools": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/tools"
},
"inf:toolkit-discover": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/discover"
}
},
"naturalId": "admin:order-tools",
"allowUserInstances": true,
"executionLocation": "server",
"canManageTools": true,
"permissions": {
"write": true,
"edit": true,
"delete": true,
"share": true,
"assignTags": true,
"changeOwner": true
},
"id": "00000000-0000-4000-8000-000000000001",
"name": "Order Tools",
"slug": "order-tools",
"type": "custom",
"description": "Helpers for the order desk.",
"instructions": null,
"ownerId": "admin",
"shared": false,
"folderId": null,
"config": null,
"integrationId": null,
"source": null,
"sourceId": null,
"createdAt": "2026-01-15T16:20:00.000Z",
"updatedAt": "2026-01-15T16:20:00.000Z",
"tenant": "acme",
"integration": null,
"_embedded": {
"inf:driver": {
"_links": {
"self": {
"href": "https://informer.example.com/api/toolkits/admin%3Aorder-tools/driver"
}
},
"id": "custom",
"name": "Integration Toolkit",
"description": "Create API tools that call external services via an Integration",
"image": "/images/icons/toolkit-server.svg",
"viewComponent": "customToolkitView",
"executionLocation": "server",
"allowUserInstances": true,
"canManageTools": true,
"supportsIntegration": true,
"editorComponent": {}
}
}
}
}
}
DELETE /api/assistants/{id}/toolkits/{toolkitId}
Detach a toolkit from the Assistant.
Authentication: Required (AI access + permission.assistant.write)
Removes the binding and responds 200 with an empty body (Informer convention).
Detach resolves the join row directly, so it does not require read access on
the toolkit — you can revoke a binding even after the toolkit share that created
it has been pulled.