Skip to main content
Glama

fizzy_boards

List boards and their columns with card counts to discover board and column IDs for creating cards or triaging tasks.

Instructions

List boards in the account with column summaries.

Get an overview of boards and their column structure including card counts.

When to use:

  • Discover board IDs and column IDs for subsequent operations

  • See card counts per column across all boards

  • Find the right board/column to create cards or triage

Fizzy column conventions: Every board has three implicit columns not returned in the columns array:

  • Maybe? (inbox): Untriaged cards. Cards here have no column_id. New cards start here.

  • Not Now: Deferred cards. Move here via status: "not_now" in fizzy_task.

  • Done: Closed cards. Move here via status: "closed" in fizzy_task.

The columns array only contains custom workflow columns (e.g., "In Progress", "Backlog"). To move a card from a column back to Maybe?, use fizzy_task with column_id omitted and no status change.

Arguments:

  • account_slug (optional): Uses session default if omitted

  • limit (optional): Max items to return, 1-100 (default: 25)

  • cursor (optional): Continuation cursor from previous response

Returns: JSON with items and pagination metadata.

{"items": [{"id": "board_1", "name": "Project", "columns": [{"id": "col_1", "name": "Backlog"}]}], "pagination": {...}}

Related: Use board ID with fizzy_task to create cards. Use column IDs for triage.

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
account_slugNoAccount slug. Uses session default if omitted.
limitYesMax items to return (1-100, default: 25).
cursorNoContinuation cursor from previous response. Omit to start fresh.

Implementation Reference

  • Execution handler for the fizzy_boards tool. Lists boards, hydrates columns in parallel, and returns JSON with pagination.
    export const boardsTool = {
    	name: "fizzy_boards",
    	description: `List boards in the account with column summaries.
    
    Get an overview of boards and their column structure including card counts.
    
    **When to use:**
    - Discover board IDs and column IDs for subsequent operations
    - See card counts per column across all boards
    - Find the right board/column to create cards or triage
    
    **Fizzy column conventions:**
    Every board has three implicit columns not returned in the columns array:
    - **Maybe?** (inbox): Untriaged cards. Cards here have no \`column_id\`. New cards start here.
    - **Not Now**: Deferred cards. Move here via \`status: "not_now"\` in \`fizzy_task\`.
    - **Done**: Closed cards. Move here via \`status: "closed"\` in \`fizzy_task\`.
    
    The \`columns\` array only contains custom workflow columns (e.g., "In Progress", "Backlog").
    To move a card from a column back to Maybe?, use \`fizzy_task\` with \`column_id\` omitted and no status change.
    
    **Arguments:**
    - \`account_slug\` (optional): Uses session default if omitted
    - \`limit\` (optional): Max items to return, 1-100 (default: 25)
    - \`cursor\` (optional): Continuation cursor from previous response
    
    **Returns:** JSON with items and pagination metadata.
    \`\`\`json
    {"items": [{"id": "board_1", "name": "Project", "columns": [{"id": "col_1", "name": "Backlog"}]}], "pagination": {...}}
    \`\`\`
    
    **Related:** Use board ID with \`fizzy_task\` to create cards. Use column IDs for triage.`,
    	parameters: z.object({
    		account_slug: z
    			.string()
    			.optional()
    			.describe("Account slug. Uses session default if omitted."),
    		limit: z
    			.number()
    			.int()
    			.min(1)
    			.max(100)
    			.default(DEFAULT_LIMIT)
    			.describe("Max items to return (1-100, default: 25)."),
    		cursor: z
    			.string()
    			.optional()
    			.describe(
    				"Continuation cursor from previous response. Omit to start fresh.",
    			),
    	}),
    	execute: async (args: {
    		account_slug?: string;
    		limit: number;
    		cursor?: string;
    	}) => {
    		const slug = await resolveAccount(args.account_slug);
    		const client = getFizzyClient();
    		const result = await client.listBoards(slug, {
    			limit: args.limit,
    			cursor: args.cursor,
    		});
    		if (isErr(result)) {
    			throw toUserError(result.error, {
    				resourceType: "Board",
    				container: `account "${slug}"`,
    			});
    		}
    
    		const boardsWithColumns = await hydrateColumnsForBoards(
    			client,
    			slug,
    			result.value.items,
    		);
    
    		return JSON.stringify(
    			{
    				items: boardsWithColumns,
    				pagination: result.value.pagination,
    			},
    			null,
    			2,
    		);
    	},
    };
  • Zod schema for the fizzy_boards input parameters: account_slug (optional), limit (default 25), cursor (optional pagination).
    parameters: z.object({
    	account_slug: z
    		.string()
    		.optional()
    		.describe("Account slug. Uses session default if omitted."),
    	limit: z
    		.number()
    		.int()
    		.min(1)
    		.max(100)
    		.default(DEFAULT_LIMIT)
    		.describe("Max items to return (1-100, default: 25)."),
    	cursor: z
    		.string()
    		.optional()
    		.describe(
    			"Continuation cursor from previous response. Omit to start fresh.",
    		),
    }),
  • Zod schema definitions for Board, BoardWithColumns, and ColumnSummary types used by fizzy_boards.
    export const BoardSchema = z.object({
    	id: z.string(),
    	name: z.string(),
    	all_access: z.boolean(),
    	creator: UserSchema,
    	columns: z.array(ColumnSummarySchema).optional(),
    	created_at: z.string(),
    	url: z.string().url(),
    });
    
    export const BoardWithColumnsSchema = BoardSchema.extend({
    	columns: z.array(ColumnSummarySchema),
    });
    
    export const CreateBoardInputSchema = z.object({
    	name: z.string().min(1),
    	description: z.string().optional(),
    });
    
    export const UpdateBoardInputSchema = z.object({
    	name: z.string().min(1).optional(),
    	description: z.string().optional(),
    });
    
    export type ColumnSummary = z.infer<typeof ColumnSummarySchema>;
    export type Board = z.infer<typeof BoardSchema>;
    export type BoardWithColumns = z.infer<typeof BoardWithColumnsSchema>;
    export type CreateBoardInput = z.infer<typeof CreateBoardInputSchema>;
    export type UpdateBoardInput = z.infer<typeof UpdateBoardInputSchema>;
  • Helper function that fetches columns for each board in parallel and merges them into BoardWithColumns objects.
    async function hydrateColumnsForBoards(
    	client: FizzyClient,
    	accountSlug: string,
    	boards: Board[],
    ): Promise<BoardWithColumns[]> {
    	const columnResults = await Promise.all(
    		boards.map((board) => client.listColumns(accountSlug, board.id)),
    	);
    
    	return boards.map((board, i) => {
    		const colResult = columnResults[i];
    		const columns: ColumnSummary[] =
    			colResult && isOk(colResult)
    				? colResult.value.items.map(({ id, name, color }) => ({
    						id,
    						name,
    						color,
    					}))
    				: [];
    		return { ...board, columns };
    	});
    }
  • src/server.ts:19-19 (registration)
    Registration of the fizzy_boards tool (as boardsTool) with the FastMCP server.
    server.addTool(boardsTool);
Behavior4/5

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

No annotations provided, so description carries full burden. It discloses behavior beyond a simple list: explains implicit column conventions (Maybe?, Not Now, Done) and how columns array works. This is valuable for correct usage.

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

Conciseness5/5

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

Description is well-structured with clear sections: purpose, when to use, conventions, arguments, return format, related tools. Every sentence is meaningful and front-loaded with main purpose.

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

Completeness5/5

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

Given no output schema, the description provides an example return JSON and explains pagination. The implicit column rule is critical for downstream operations, and the 'Related' section ties to sibling tools. Complete for a list tool.

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

Parameters5/5

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

Schema has 100% coverage, but description adds significant meaning: explains account_slug default behavior, limit default range, cursor pagination usage, and column array contents. These details compensate fully.

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

Purpose5/5

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

The description starts with a clear verb+resource: 'List boards in the account with column summaries.' It distinguishes from sibling tools like fizzy_task (create cards) and fizzy_search by focusing on board listing and column discovery.

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

Usage Guidelines4/5

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

The 'When to use' section explicitly states purposes: discover board IDs/column IDs, see card counts, find right board/column. It also relates to siblings via 'Related' line. Missing explicit 'when not to use', but context is clear.

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/davegomez/fizzy-mcp'

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