GitHub MCP Server
by asbloom-py
- src
import { McpError, ErrorCode } from '@modelcontextprotocol/sdk/types.js';
export function validateString(value: unknown, field: string): string {
if (typeof value !== 'string') {
throw new McpError(ErrorCode.InvalidParams, `${field} must be a string`);
}
return value;
}
export function validateOptionalString(value: unknown): string | undefined {
if (value === undefined) return undefined;
return validateString(value, 'value');
}
export function validateNumber(value: unknown, field: string): number {
if (typeof value !== 'number') {
throw new McpError(ErrorCode.InvalidParams, `${field} must be a number`);
}
return value;
}
export function validateOptionalNumber(value: unknown): number | undefined {
if (value === undefined) return undefined;
return validateNumber(value, 'value');
}
export function validateStringArray(value: unknown): string[] {
if (!Array.isArray(value) || !value.every(item => typeof item === 'string')) {
throw new McpError(ErrorCode.InvalidParams, 'Value must be an array of strings');
}
return value;
}
export function validateOptionalStringArray(value: unknown): string[] | undefined {
if (value === undefined) return undefined;
return validateStringArray(value);
}
export function validateGetCardsListRequest(args: Record<string, unknown>): { listId: string } {
if (!args.listId) {
throw new McpError(ErrorCode.InvalidParams, 'listId is required');
}
return {
listId: validateString(args.listId, 'listId'),
};
}
export function validateGetRecentActivityRequest(args: Record<string, unknown>): { limit?: number } {
return {
limit: validateOptionalNumber(args.limit),
};
}
export function validateAddCardRequest(args: Record<string, unknown>): {
listId: string;
name: string;
description?: string;
dueDate?: string;
labels?: string[];
} {
if (!args.listId || !args.name) {
throw new McpError(ErrorCode.InvalidParams, 'listId and name are required');
}
return {
listId: validateString(args.listId, 'listId'),
name: validateString(args.name, 'name'),
description: validateOptionalString(args.description),
dueDate: validateOptionalString(args.dueDate),
labels: validateOptionalStringArray(args.labels),
};
}
export function validateUpdateCardRequest(args: Record<string, unknown>): {
cardId: string;
name?: string;
description?: string;
dueDate?: string;
labels?: string[];
} {
if (!args.cardId) {
throw new McpError(ErrorCode.InvalidParams, 'cardId is required');
}
return {
cardId: validateString(args.cardId, 'cardId'),
name: validateOptionalString(args.name),
description: validateOptionalString(args.description),
dueDate: validateOptionalString(args.dueDate),
labels: validateOptionalStringArray(args.labels),
};
}
export function validateArchiveCardRequest(args: Record<string, unknown>): { cardId: string } {
if (!args.cardId) {
throw new McpError(ErrorCode.InvalidParams, 'cardId is required');
}
return {
cardId: validateString(args.cardId, 'cardId'),
};
}
export function validateAddListRequest(args: Record<string, unknown>): { name: string } {
if (!args.name) {
throw new McpError(ErrorCode.InvalidParams, 'name is required');
}
return {
name: validateString(args.name, 'name'),
};
}
export function validateArchiveListRequest(args: Record<string, unknown>): { listId: string } {
if (!args.listId) {
throw new McpError(ErrorCode.InvalidParams, 'listId is required');
}
return {
listId: validateString(args.listId, 'listId'),
};
}