Create a connection
In Agent connections, name your agent and copy its credential. Each credential is scoped to one agent in your workspace.
Connect / Observe / Audit
Bring local scripts, cloud workers, and agents you already run into Toolcaise. Give each one a private credential, report its activity over HTTPS, and see its health and history in your workspace.
Works with code or workflow tools that can make HTTP requests. No inbound port, VPN, or model-provider key required.
In Agent connections, name your agent and copy its credential. Each credential is scoped to one agent in your workspace.
Set TOOLCAISE_AGENT_TOKEN in the agent’s environment. Choose Python, Node.js, Docker, or an HTTP workflow.
The setup screen confirms the first accepted heartbeat. Add run and event reports to populate Agent management.
Python 3.10+. Download beside your agent, verify your credential, then wrap your existing work. No packages required.
Invoke-WebRequest https://toolcaise.com/downloads/toolcaise_agent.py -OutFile toolcaise_agent.py
$secret = Read-Host 'Agent credential' -AsSecureString
$env:TOOLCAISE_AGENT_TOKEN = [System.Net.NetworkCredential]::new('', $secret).Password
python toolcaise_agent.py checkfrom toolcaise_agent import Toolcaise
from your_agent import main # your existing function
client = Toolcaise()
with client.run("daily-work") as run_id:
with client.span(run_id, "agent-work"):
main()
# Add client.checkpoint(run_id) between safe steps to opt into controls.Replace example imports and image names with your actual agent. The SDK reports metadata, never prompts, outputs, or exception text automatically. Runs send heartbeats every 60 seconds. Telemetry failures raise errors; handle them explicitly in your application.
Add checkpoints between steps. A pause waits for resume; cancellation raises AgentCancelled. Network or authorization failures stop the guarded operation. Checkpoints cannot stop an external action already in progress. Use one SDK client per agent process; do not share it across concurrent runs.
# Python: your run must already be reported with client.run().
client.checkpoint(run_id)
result = client.guarded_action(
run_id, "Approve report delivery",
{"operation": "send_report", "report_id": report_id, "recipient": recipient},
lambda approved: send_report(approved["report_id"], approved["recipient"]),
)
client.outcome(run_id, "Report delivery", status="succeeded")
// Node.js equivalent inside client.run():
await client.checkpoint(runId);
await client.guardedAction(runId, 'Approve report delivery',
{ operation: 'send_report', reportId, recipient },
approved => sendReport(approved.reportId, approved.recipient));
await client.outcome(runId, 'Report delivery', { status: 'succeeded' });Every execution parameter belongs in the action object; the callable must use the supplied snapshot. Toolcaise receives its SHA-256 digest and your safe title, not the action parameters. Approval consumption is single-use and never retried by the SDK; an uncertain response leaves the action unexecuted. A human approves or denies in Agent controls. Reported outcomes remain claims until reviewed.
Use span helpers for steps, tools, models, and retries. Optional model/tool names, token counts, and reportedCostUsd appear in run details. Span metadata accepts numbers and booleans only. Never place secrets in names, titles, labels, or event messages.
POST /api/v1/agents/telemetry. The credential supplies workspace and agent identity. Do not include orgId, agentId, or agent in the body.
| Field | Meaning |
|---|---|
| version | Required. Always 1. |
| status | healthy (default), degraded, offline, or disabled. |
| heartbeatAt | Optional ISO timestamp. Defaults to receipt time; at most 10 minutes old or 1 minute ahead. |
| hostName / unitName / releaseVersion | Optional host label, service name, and release identifier. |
| capabilities | Optional array of up to 24 descriptive strings. Not enforced permissions. |
| run | Optional run snapshot. Required: externalRunId, status, mode, trigger, startedAt. Status: running, completed, failed, held, skipped, shadow_passed, canceled. Optional: completedAt, phase, counts, summary, durationMs, errorCode, artifactDigest (SHA-256). |
| events | Up to 100 events. Required per event: externalEventId, eventType, level (info/warning/error), message, occurredAt. Optional: externalRunId, phase, detail. |
| spans / outcomes | Optional structured step traces and reported outcomes. SDK span and outcome helpers generate stable IDs. Human review is separate from agent reporting. |
| schedule | Optional reported schedule: name, calendar, timezone, enabled, active; optional ISO nextRunAt and lastTriggeredAt. |
| deliveries | Up to 24 reported receipts: externalDeliveryId, channel, status (pending/sent/failed/skipped), attemptedAt; optional externalRunId, recipientLabel, sentAt, errorCode, detail. |
IDs use 2–120 letters, digits, dots, underscores, colons, or hyphens. Historical event timestamps are accepted for backfills. Keep stable IDs when retrying: event inserts are deduplicated per agent, while run and delivery snapshots update. Send a run before or alongside events that reference it. Counts must be nonnegative integers; durationMs is capped at 24 hours. Event messages are limited to 600 characters.
Limits: 128 KB per request, 60 requests per minute per connection. Success returns 200 with agentId and receivedAt. 400 means invalid data, 401 invalid/revoked credential, 413 oversized body, 415 wrong content type, 429 rate limit (Retry-After: 60), and 503 temporary storage failure. Retry network errors, 429, and 503 with backoff and the same event IDs.
Toolcaise records what your agent reports. A “completed” run or “sent” receipt is an agent claim, not independently verified execution. Connection creation, key rotation, and revocation are recorded separately as Toolcaise events.
Monitoring works with any reporting client. Python and Node SDK checkpoints opt into cooperative pause, resume, and run cancellation. Guarded actions execute only after an exact action approval is consumed once. These controls act at checkpoints; they cannot interrupt an in-flight tool call. Revoking a credential stops new reports and keeps history.
Send only operational metadata you intend to store. Secret-like field names are rejected, but that is not automatic redaction of free text. Do not send credentials, personal data, raw prompts, or private outputs.