Skip to main content
Glama
RhombusSystems

Rhombus MCP Server

Official

video-walls-tool

List or create video walls to combine multiple camera feeds into a single monitoring view.

Instructions

This tool interacts with Rhombus video walls. Rhombus video walls are a collection of camera feeds combined into a single view, allowing users to monitor multiple cameras.

The layout of created video walls is automatically determined by the number of cameras in video wall settings "numVisibleDevicesAtOnce".

Output filtering (all tools):

  • includeFields (string[]): Dot-notation paths to keep in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Omit to return all fields.

  • filterBy (array): Predicates to filter array items. Each entry: {field, op, value} where op is one of = != > >= < <= contains. All conditions are ANDed. Example: [{field:"vehicleLicensePlate", op:"=", value:"ABC123"}] WARNING: some tool responses exceed 400k characters — use these params to request only the data you need.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
requestTypeYesThe type of request to make.
videoWallCreateOptionsYesThe options for creating a video wall. This is required if your requestType === `create`
includeFieldsYesDot-notation field paths to include in the response (e.g. "vehicleEvents.vehicleLicensePlate"). Pass null to return all fields. WARNING: some responses can exceed 400k characters — use includeFields to request only the data you need. For high-volume tools this may be required to get a complete answer.
filterByYesFilter array items in the response by field values. All conditions are ANDed. Example: [{field: "vehicleLicensePlate", op: "=", value: "ABC123"}, {field: "confidence", op: ">", value: 0.8}] Use alongside includeFields to get only the specific records and fields you need.

Output Schema

TableJSON Schema
NameRequiredDescriptionDefault
errorNoIf this field exists, then an error occured and contains the error message.
needUserInputNoIf this field exists and is true, then the tool requires additional input from the user.
commandForUserNoIf this field exists, then the tool requires additional input from the user.
videoWallsNoIf requestType is `list`, then this field will be populated with the list of video walls.
videoWallNoIf requestType is `get`, then this field will be populated with the video wall.
uuidNoThe uuid of the created video wall.

Implementation Reference

  • Main handler for 'video-walls-tool'. Dispatches to 'create' (calls handleCreateVideoWallRequest) or 'list' (calls getVideoWalls) based on requestType.
    const TOOL_HANDLER = async (args: ToolArgs, extra: unknown) => {
    	const { requestType, videoWallCreateOptions } = args;
    	const { requestModifiers, sessionId } = extractFromToolExtra(extra);
    
    	switch (requestType) {
    		case "create":
    			if (!videoWallCreateOptions) {
    				return createToolTextContent(
    					JSON.stringify({
    						error: "videoWallCreateOptions is required. Please try again.",
    					}),
    				);
    			}
    
    			return createToolStructuredContent<OutputSchema>(
    				await handleCreateVideoWallRequest(
    					videoWallCreateOptions,
    					requestModifiers,
    					sessionId,
    				),
    			);
    		case "list":
    			return createToolStructuredContent<OutputSchema>(
    				await getVideoWalls(requestModifiers, sessionId),
    			);
    		default:
    	}
    
    	return {
    		content: [
    			{
    				type: "text" as const,
    				text: "Invalid entity type. Please try again.",
    			},
    		],
    	};
    };
  • Registers the tool named 'video-walls-tool' with the MCP server, including input/output schemas and the handler.
    export function createTool(server: McpServer) {
    	server.registerTool(
    		TOOL_NAME,
    		{
    			description: TOOL_DESCRIPTION,
    			inputSchema: TOOL_ARGS,
    			outputSchema: OUTPUT_SCHEMA.shape,
    		},
    		TOOL_HANDLER,
    	);
    }
  • Output schema for the video-walls-tool, defining error, needUserInput, commandForUser, videoWalls, videoWall, and uuid fields.
    export const OUTPUT_SCHEMA = z.object({
    	error: z
    		.optional(z.string())
    		.describe(
    			"If this field exists, then an error occured and contains the error message.",
    		),
    	needUserInput: z
    		.boolean()
    		.optional()
    		.describe(
    			"If this field exists and is true, then the tool requires additional input from the user.",
    		),
    	commandForUser: z
    		.string()
    		.optional()
    		.describe(
    			"If this field exists, then the tool requires additional input from the user.",
    		),
    	videoWalls: z
    		.array(z.any())
    		.describe(
    			"If requestType is `list`, then this field will be populated with the list of video walls.",
    		)
    		.optional(),
    	videoWall: z
    		.array(z.any())
    		.describe(
    			"If requestType is `get`, then this field will be populated with the video wall.",
    		)
    		.optional(),
      uuid: z.string().describe("The uuid of the created video wall.").optional(),
    });
    export type OutputSchema = z.infer<typeof OUTPUT_SCHEMA>;
  • Input schema for the video-walls-tool: requestType (list/create), videoWallCreateOptions, includeFields, filterBy.
    export const TOOL_ARGS = {
    	requestType: z
    		.enum(["list", "create"])
    		.describe("The type of request to make."),
    	videoWallCreateOptions: CreateVideoWallOptions,
    	includeFields: INCLUDE_FIELDS_ARG,
    	filterBy: FILTER_BY_ARG,
    };
  • Handles create video wall logic: validates displayName and deviceList, prompts user if missing, otherwise calls createVideoWall API.
    export async function handleCreateVideoWallRequest(
    	videoWallCreateOptions: CreateVideoWallOptions,
    	requestModifiers: RequestModifiers,
    	sessionId?: string,
    ): Promise<OutputSchema> {
    	logger.info("🔨 Creating video wall");
    	if (!videoWallCreateOptions?.displayName) {
    		return {
    			needUserInput: true,
    			commandForUser: "What should the name of the video wall be?",
    		};
    	} else if ((videoWallCreateOptions?.deviceList || []).length === 0) {
    		return {
    			needUserInput: true,
    			commandForUser: "Which cameras would you like on this video wall?",
    		};
    	} else {
    		logger.info(
    			"Creating video wall with options: ",
    			JSON.stringify(videoWallCreateOptions),
    		);
    		const response = await createVideoWall(
    			videoWallCreateOptions,
    			requestModifiers,
    			sessionId,
    		);
    
    		return {
    			uuid: response?.uuid ?? undefined,
    			error: response?.errorMsg ?? undefined,
    		};
    	}
    }
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

The description warns about large responses (400k characters) and recommends includeFields and filterBy, which is helpful. However, it does not disclose mutation safety, permissions, or side effects of creating a video wall. With no annotations, more detail on behavioral traits is expected.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness3/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description includes a lengthy generic section on output filtering that is likely repeated across tools. The purpose is front-loaded, but overall verbosity could be reduced. It is adequately structured but not concise.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Given the presence of an output schema, the description covers core aspects: purpose, parameter behavior (layout determination), and output size warnings. It adequately equips an agent to invoke the tool, though some edge cases (e.g., error handling) are omitted.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 100%, but the description adds value by explaining how 'numVisibleDevicesAtOnce' determines layout and providing extensive context on output filtering. This goes beyond the schema definitions, earning a score above baseline.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states the tool interacts with Rhombus video walls and lists the supported actions (list, create) via requestType enum. It clearly identifies the resource and verbs, but does not explicitly differentiate from sibling tools like camera-tool or clips-tool.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

The description provides no guidance on when to use this tool versus alternatives, nor does it explain when to use list vs create beyond the schema. Prerequisites or context for using the tool are absent.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/RhombusSystems/rhombus-node-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server