Tools
| Tool | REST endpoint | Annotations |
|---|---|---|
list_workspace_tools | GET /v1/tools | read, idempotent |
get_workspace_tool | GET /v1/tools/{toolId} | read, idempotent |
list_agent_tools | GET /v1/agents/{agentId}/tools | read, idempotent |
list_available_agent_tools | GET /v1/agents/{agentId}/tools/available | read, idempotent |
connect_agent_tool | POST /v1/agents/{agentId}/tools | write |
update_agent_tool_status | PATCH /v1/agents/{agentId}/tools/{toolId} | write, idempotent |
disconnect_agent_tool | DELETE /v1/agents/{agentId}/tools/{toolId} | destructive |
preview_mcp_server | POST /v1/tools/mcp/preview | read (persists nothing) |
list_mcp_servers | GET /v1/tools/mcp | read, idempotent |
get_mcp_server | GET /v1/tools/mcp/{mcpId} | read, idempotent |
connect_mcp_server | POST /v1/tools/mcp | write |
refresh_mcp_server | POST /v1/tools/mcp/{mcpId}/refresh | write, idempotent |
start_mcp_server_oauth | POST /v1/tools/mcp/{mcpId}/oauth/start | write |
sync_mcp_server_tools | POST /v1/tools/mcp/{mcpId}/tools/sync | destructive (replaces) |
delete_mcp_server | DELETE /v1/tools/mcp/{mcpId} | destructive |
list_api_tools | GET /v1/tools/apis | read, idempotent |
get_api_tool | GET /v1/tools/apis/{integrationId} | read, idempotent |
create_api_tool | POST /v1/tools/apis | write |
update_api_tool | PATCH /v1/tools/apis/{integrationId} | write, partial |
test_api_tool | POST /v1/tools/apis/{integrationId}/test | destructive (may execute POST/PATCH/DELETE) |
enable_api_tool | POST /v1/tools/apis/{integrationId}/enable | write, idempotent |
pause_api_tool | POST /v1/tools/apis/{integrationId}/pause | destructive, idempotent |
delete_api_tool | DELETE /v1/tools/apis/{integrationId} | destructive |
The three layers
Before using these tools it helps to be clear on the separation, because it is the source of almost every mistake:
- The workspace catalog — everything that exists and can be used.
list_workspace_tools. - The agent connection — what lets a specific agent call a tool.
connect_agent_tool. - The connectors — what creates catalog entries.
connect_mcp_serverandcreate_api_tool.
Installing a tool in the workspace does not give it to any agent. Disconnecting it from an agent does not remove it from the workspace.
connect_mcp_server → the server and its tools land in the catalog
list_workspace_tools → you get the toolIds
connect_agent_tool → the agent can now call them Full REST documentation at Tools .
Workspace catalog
list_workspace_tools
| Field | Type | Description |
|---|---|---|
kind | "mcp" \| "api" \| "integration" \| "legacy" | Filter by origin. |
mcpId | string | Only tools from that MCP server. |
integrationId | string | Only tools from that custom API. |
workspace | string | if multi-ws |
Returns each tool's id (the toolId), name, description, kind, parameters and origin.
get_workspace_tool
| Field | Type | Required |
|---|---|---|
toolId | string | yes |
workspace | string | if multi-ws |
Same as a list item, with the full parameter JSON Schema.
Agent tools
list_agent_tools
| Field | Type | Required |
|---|---|---|
agentId | string | yes |
workspace | string | if multi-ws |
Only connections with status: "active" are passed to the model at runtime. An entry with toolExists: false is an orphaned connection: the catalog tool was deleted.
list_available_agent_tools
| Field | Type | Required |
|---|---|---|
agentId | string | yes |
kind | "mcp" \| "api" \| "integration" \| "legacy" | no |
workspace | string | if multi-ws |
Returns the full catalog with isConnected and connectionStatus. Use it before connecting to avoid a 409.
connect_agent_tool
| Field | Type | Required | Description |
|---|---|---|---|
agentId | string | yes | |
toolId | string | yes | From the catalog, not the tool's name. |
status | "active" \| "inactive" | no | Default "active". |
workspace | string | if multi-ws |
Returns 409 if it was already connected — use update_agent_tool_status in that case.
update_agent_tool_status
| Field | Type | Required |
|---|---|---|
agentId | string | yes |
toolId | string | yes |
status | "active" \| "inactive" | yes |
workspace | string | if multi-ws |
Deactivating is the reversible way to take a tool away from an agent. Activating one that was not connected connects it, so the tool is idempotent.
disconnect_agent_tool
| Field | Type | Required |
|---|---|---|
agentId | string | yes |
toolId | string | yes |
workspace | string | if multi-ws |
Removes the connection. Does not delete the catalog tool or affect other agents.
MCP servers
preview_mcp_server
Connects to the server and lists its tools without saving anything. Call it before connect_mcp_server.
| Field | Type | Required | Description |
|---|---|---|---|
url | string | yes | Server URL (https). |
auth | object | no | Default { "type": "none" }. |
headers | object | no | Extra handshake headers. |
workspace | string | if multi-ws |
auth shapes:
type | Fields |
|---|---|
none | — |
bearer | token |
apikey-header | token, headerName, headerPrefix (optional) |
oauth2 | scope, clientId, clientSecret (all optional) |
The name values it returns are the server's original names: those are what you pass as tools to connect_mcp_server and sync_mcp_server_tools.
list_mcp_servers
| Field | Type | Required |
|---|---|---|
workspace | string | if multi-ws |
status can be connected, pending_auth, needs_reauth or error. Credentials are never returned.
get_mcp_server
| Field | Type | Required |
|---|---|---|
mcpId | string | yes |
workspace | string | if multi-ws |
Includes discoveredTools (what the server offers, with an installed flag) and installedTools (what is in the catalog, with each toolId).
connect_mcp_server
| Field | Type | Required | Description |
|---|---|---|---|
name | string (≤ 120) | yes | Display name inside Platica. |
url | string | yes | Server URL (https). |
description | string (≤ 500) | no | |
auth | object | no | Same as preview_mcp_server. |
headers | object | no | |
tools | string[] | no | Original names to install. Omit to install all. |
workspace | string | if multi-ws |
{
"name": "connect_mcp_server",
"arguments": {
"name": "Linear",
"url": "https://mcp.linear.app/mcp",
"auth": { "type": "bearer", "token": "lin_api_xxx" },
"tools": ["create_issue", "search_issues"]
}
} Returns installedToolIds, ready to pass to connect_agent_tool.
With auth.type: "oauth2" the response includes authorizeUrl. Open that URL in a browser, then call refresh_mcp_server. Use start_mcp_server_oauth to restart authorization.
refresh_mcp_server
| Field | Type | Required |
|---|---|---|
mcpId | string | yes |
workspace | string | if multi-ws |
Re-discovers tools and updates the schemas of installed ones. It does not install new ones: they show up with installed: false until you add them with sync_mcp_server_tools.
start_mcp_server_oauth
| Field | Type | Required | Description |
|---|---|---|---|
mcpId | string | yes | |
scope | string | no | Requested OAuth scopes. |
clientId, clientSecret | string | no | Only for providers without dynamic registration. |
workspace | string | if multi-ws |
Returns authorizeUrl; a person must open it in a browser. The callback stores encrypted tokens.
sync_mcp_server_tools
| Field | Type | Required | Description |
|---|---|---|---|
mcpId | string | yes | |
tools | string[] | yes | The complete list of original names that should remain installed. |
workspace | string | if multi-ws |
This is a replacement, not an addition. Tools missing from the list are removed from the catalog and disconnected from every agent. To add one without losing the rest, read get_mcp_server first and send the current list plus the new name.
delete_mcp_server
| Field | Type | Required |
|---|---|---|
mcpId | string | yes |
workspace | string | if multi-ws |
Removes the server, its credentials, its tools, and any connections those tools had with any agent.
Custom APIs
A custom API turns an HTTP endpoint into a tool. It has two parts: request describes the call with {{name}} placeholders, and variables declares who fills each one.
Variable mode | Who provides the value | Does the model see it? |
|---|---|---|
ai (default) | The model when calling the tool | Yes |
constant | constantValue | No |
context | contextField from the conversation | No |
The schema the model sees is derived from the ai variables at enable time. That is why each variable's description is mandatory: it is what the model reads.
Lifecycle: draft → enabled → paused. Only enabled exists in the catalog.
list_api_tools
| Field | Type | Required |
|---|---|---|
workspace | string | if multi-ws |
get_api_tool
| Field | Type | Required |
|---|---|---|
integrationId | string | yes |
workspace | string | if multi-ws |
Credentials and write-only constants are returned as "[REDACTED]"; they never enter the model context.
create_api_tool
| Field | Type | Required | Description |
|---|---|---|---|
name | string | yes | Lowercase, starts alphanumeric, only letters/digits/_ (≤ 62). The model sees it as api_<name>. |
description | string (10-1024) | yes | When the agent should call it. |
request | object | yes | method, url, params, headers, body, auth. |
variables | array | no | name, type, description, required, mode, plus JSON Schema refinements. |
passContext | boolean | no | Required for context variables. |
context | object | no | Context settings such as lastMessagesN. |
mapping | object | no | bodyStrategy and extraBody. |
response | object | no | path, include, exclude, maxBytes to trim the response. |
periodicAuth | object | no | Cron-generated token injected into a header/query. |
encryptPayload | object | no | Signs the body as a JWT. |
workspace | string | if multi-ws |
{
"name": "create_api_tool",
"arguments": {
"name": "order_lookup",
"description": "Look up an order status by its reference. Use it when the customer asks where their order is.",
"request": {
"method": "GET",
"url": "https://api.store.com/orders/{{orderId}}",
"auth": { "type": "bearer", "token": "sk_live_xxx" }
},
"variables": [
{
"name": "orderId",
"type": "string",
"description": "Order reference, as shown in the confirmation email.",
"required": true
}
]
}
} It starts as a draft. Test it with test_api_tool and publish it with enable_api_tool.
update_api_tool
Same fields as create_api_tool but all optional, plus integrationId. Arrays (variables, request.headers, request.params) are replaced wholesale, not merged element by element.
test_api_tool
| Field | Type | Required | Description |
|---|---|---|---|
integrationId | string | yes | |
input | object | no | Values for the ai variables. |
dryRun | boolean | no | true assembles the request without calling the API. |
workspace | string | if multi-ws |
Start with dryRun: true to check the substitutions before hitting the real API. A failure from the remote API is not a tool error: it is reported in data.outcome and data.httpStatus.
enable_api_tool
| Field | Type | Required |
|---|---|---|
integrationId | string | yes |
workspace | string | if multi-ws |
Publishes the tool to the catalog and returns the toolId for connect_agent_tool. Fails with 400 if a model-facing variable has no description.
pause_api_tool
| Field | Type | Required |
|---|---|---|
integrationId | string | yes |
workspace | string | if multi-ws |
Withdraws the tool from the catalog, keeping its configuration.
delete_api_tool
| Field | Type | Required |
|---|---|---|
integrationId | string | yes |
workspace | string | if multi-ws |
Deletes the tool permanently. If you only want to switch it off, use pause_api_tool.
REST endpoints with no MCP tool
- Installing first-party apps (
kind: "integration") is done from the dashboard. Once installed, their tools show up inlist_workspace_toolsand connect like any other.