Skip to content

Resources

Six MCP resources. The two blender://bus/* resources are local to the server (no Blender peer needed). The four others (blender://scene/*, blender://console/{level}, blender://console/{level}/{page}) dispatch through a Blender peer using the same JobWaiter round-trip as the dispatch tools — they require an active persistent Blender on the user’s bus.

All resources scope returns to the caller’s user bus and require a valid JWT. The blender:// URI scheme is declared explicitly on each @mcp_resource(uri=...) and is not modified by MCPMixin’s prefix="blender" (which only affects tool and prompt names).

Snapshot of the caller’s bus: persistent + ephemeral clients with their UUIDs, types, capabilities, and timestamps.

Returns:

{
"user_id": "demo",
"persistent": [
{
"uuid": "blender-a1b2c3d4e5f6",
"client_type": "blender",
"is_persistent": true,
"capabilities": ["python_execution", "modeling", "rendering"],
"group_id": null,
"connected_at": 1716000000.0,
"last_seen": 1716001000.0
}
],
"ephemeral": [
{
"uuid": "llm-20260525-abc123",
"client_type": "llm",
"is_persistent": false,
"capabilities": ["text_generation", "reasoning"],
"group_id": null,
"connected_at": 1716000500.0,
"last_seen": 1716001200.0
}
]
}

Read-only equivalent of blender_list_available_clients — useful when a client wants to observe bus state through a resource subscription rather than a polling tool call.

Counts for the caller’s bus.

Returns:

{
"user_id": "demo",
"persistent_count": 1,
"ephemeral_count": 2,
"pending_jobs_for_user": 3
}

pending_jobs_for_user is the number of dispatches awaiting a blender_job_update reply on behalf of this user.

Live JSON snapshot of the active Blender scene. Internally dispatches get_scene_info through the bus.

Returns: same payload as blender_get_scene_info — scene name, object count, first ~10 objects, materials count, wrapped in the standard dispatch envelope:

{
"status": "completed",
"command": "get_scene_info",
"target_uuid": "blender-...",
"job_id": "j-...",
"result": "<JSON-encoded scene snapshot>",
"error": ""
}

If no Blender peer is connected, status is no_client.

First page of bpy.data.objects. Dispatches browse_data with collection="objects", page=1, page_size=50.

Returns: the standard dispatch envelope with result containing the paginated object list. For other pages or other collections (materials, meshes, etc.) call blender_browse_data directly.

Templated resource. {level} is one of all, info, warning, error, output. Returns the first page of console output filtered by level.

Dispatches get_console_output with page=1, page_size=50. For other pages, use the explicit-page variant below or call blender_get_console_output directly.

Templated resource. {level} as above; {page} is a 1-indexed integer. Returns page {page} of console output at the requested level.

All resources call the same _resolve_user_id(ctx) helper as the tools. An unauthenticated read returns:

{"status": "error", "error": "unauthenticated"}
  • Bus tools — the tool surface that includes equivalents for the bus resources
  • Dispatch tools — the tool equivalents for the scene + console resources
  • ClientInfo — the dataclass each entry in persistent/ephemeral is serialized from
  • OAuth and per-user buses — why resource scope is per-user