fleetlessfleetlessdocs
Reference/SDK/Robots & discovery

SDK · Robots & discovery

Which robots the caller reaches, and what their role lets them do on each — the datasheet with every granted slug, its unit and decimals, and the parameter JSON Schema an action, service or publisher takes.

Generated from the SDK’s own source. The SDK Reference is the narrative; this page is every member, in the order the SDK declares them.

RobotsApi

Discovery, reachable as client.robots: which robots may I name at all, and what may I do on one. The two calls every app screen starts from; every other namespace takes a robotId that came from here.

The answers are the caller’s role made visible — the same rows and the same datasheet the MCP tools robots_list and robot_describe answer, from the same code on the server. There is no client-side filtering to do and nothing to cache: a role change shows at the next call.

list()

ts
list(): Promise<({ bridge_state: { online: boolean; latency_ms: number | null; low_bandwidth: boolean }; published_version: number | null; id: string; name: string; created_at: string })[]>

The robots this caller reaches, in name order with the id as the tiebreak.

An app user reaches the robots their app attaches on which their role grants at least one slug or capability; a server key reaches every robot its app attaches. A robot the role grants nothing on is absent rather than listed empty — reach is a grant, not an attachment — so a new app whose built-in roles grant nothing yet resolves [], and that is the console’s Roles tab talking, not a broken login.

Returns Promise<({ bridge_state: { online: boolean; latency_ms: number | null; low_bandwidth: boolean }; published_version: number | null; id: string; name: string; created_at: string })[]>.

describe()

ts
describe(robotId: string): Promise<{ robot_id: string; robot_name: string; capabilities: { action_history: boolean; assets: boolean }; exposures: ({ slug: string; kind: "camera" | "action" | "datapoint" | "service" | "publisher"; description: string | null; unit: string | null; decimals: number | null; input_schema: unknown })[] }>

Everything the caller’s role lets them do on one robot: every granted datapoint (with unit and decimals), action, service and publisher (with the parameter JSON Schema under input_schema) and camera, plus the two capabilities that gate whole features, action_history and assets. A robot with nothing published resolves an empty exposures list. One the caller does not reach rejects not_found, exactly as a robot that does not exist — never forbidden, which would say it exists.

The type is McpRobotDatasheet because the MCP server answered it first; the prefix is history, not scope.

Parameter Type Required Description
robotId string yes

Returns Promise<{ robot_id: string; robot_name: string; capabilities: { action_history: boolean; assets: boolean }; exposures: ({ slug: string; kind: "camera" | "action" | "datapoint" | "service" | "publisher"; description: string | null; unit: string | null; decimals: number | null; input_schema: unknown })[] }>.

ClientRobotListItem

The client-robot-list-item wire schema, re-exported so app code and the SDK agree on the shape — see API Schemas for its fields.

McpRobotDatasheet

The mcp-robot-datasheet wire schema, re-exported so app code and the SDK agree on the shape — see API Schemas for its fields.

McpExposure

One row of a datasheet’s exposures: a granted datapoint, action, service, publisher or camera, with its slug, kind, description (or null), a datapoint’s unit and decimals, and for anything that takes parameters the JSON Schema under input_schema. The wire shape is contracts’ mcpExposure; the alias exists so the reference can describe it.

ts
type McpExposure = McpExposure$1

McpCapabilities

The two role capabilities a datasheet names beyond slugs: action_history (may jobs.history be read) and assets (may the URDF and meshes be read). The wire shape is contracts’ mcpCapabilities.

ts
type McpCapabilities = McpCapabilities$1