Skip to Content
GatewaysUTCP Gateway

UTCP Gateway

Call your tools over a plain REST API. A UTCP (Universal Tool Call Protocol) gateway lists and invokes tools with ordinary HTTP, so it works from any client library or agent framework with no special SDK.

Gateway detail page

Create the gateway

  1. Open Gateways in the sidebar and click Create Gateway
  2. Select UTCP as the protocol

Create Gateway dialog

  1. Enter a name, slug, and optional description
  2. Click Create

Assign tools from the Tools tab on the gateway detail page, then configure authentication from the Authentication tab.

Assigning tools on the gateway Tools tab

Your UTCP endpoint follows this pattern:

https://api.almyty.com/utcp/{org}/{gateway-slug}

Endpoints

MethodPathDescription
GET/toolsList all tools on this gateway
GET/tools/{name}Get a single tool definition
POST/tools/{name}/invokeExecute a tool
GET/healthGateway health check

Listing tools returns each tool’s name, description, and parameter schema:

{ "tools": [ { "name": "get_users", "description": "Retrieve a list of users with pagination", "parameters": { "type": "object", "properties": { "page": { "type": "integer" }, "limit": { "type": "integer" } } } } ] }

Invoking a tool takes an arguments object and returns the result plus timing metadata:

{ "result": { "users": [ { "id": "1", "name": "Alice", "email": "alice@example.com" } ], "total": 42 }, "metadata": { "duration": 234, "toolId": "tool-uuid" } }

Connect from code

Python

import requests base = "https://api.almyty.com/utcp/acme/tools-api" headers = {"Authorization": "Bearer your-gateway-key"} tools = requests.get(f"{base}/tools", headers=headers).json()["tools"] result = requests.post( f"{base}/tools/get_users/invoke", headers=headers, json={"arguments": {"page": 1, "limit": 10}}, ).json()["result"]

JavaScript

const base = "https://api.almyty.com/utcp/acme/tools-api"; const headers = { Authorization: "Bearer your-gateway-key" }; const { tools } = await fetch(`${base}/tools`, { headers }).then(r => r.json()); const { result } = await fetch(`${base}/tools/get_users/invoke`, { method: "POST", headers: { ...headers, "Content-Type": "application/json" }, body: JSON.stringify({ arguments: { page: 1, limit: 10 } }), }).then(r => r.json());

Error codes

CodeHTTP StatusDescription
TOOL_NOT_FOUND404Tool does not exist on this gateway
INVALID_PARAMS400Parameters failed validation
EXECUTION_FAILED500Tool execution threw an error
UNAUTHORIZED401Missing or invalid authentication
RATE_LIMITED429Too many requests

See Gateway Authentication for the auth methods you can put in front of the endpoint.