@xiaotaitech/tempo-mcp-server
Version:
MCP server for managing Tempo worklogs in Jira
98 lines (97 loc) • 3.41 kB
JavaScript
import { z } from 'zod';
// Common validation schemas
export const dateSchema = () => z.string().regex(/^\d{4}-\d{2}-\d{2}$/, 'Date must be in YYYY-MM-DD format');
export const timeSchema = () => z.string().regex(/^([01]\d|2[0-3]):([0-5]\d)$/, 'Time must be in HH:MM format');
export const issueKeySchema = () => z.string().min(1, 'Issue key cannot be empty');
export const issueIdSchema = () => z.union([
z.string().min(1, 'Issue ID cannot be empty'),
z.number().int().positive('Issue ID must be a positive integer')
]);
// Environment validation
export const envSchema = z.object({
TEMPO_API_TOKEN: z.string().min(1, 'TEMPO_API_TOKEN is required'),
JIRA_BASE_URL: z.string().min(1, 'JIRA_BASE_URL is required'),
JIRA_API_TOKEN: z.string().min(1, 'JIRA_API_TOKEN is required'),
JIRA_EMAIL: z.string().min(1, 'JIRA_EMAIL is required'),
});
// Worklog entry schema
export const worklogEntrySchema = z.object({
issueKey: issueKeySchema(),
timeSpentHours: z.number().positive('Time spent must be positive'),
date: dateSchema(),
description: z.string().optional(),
startTime: timeSchema().optional(),
});
// MCP tool schemas
export const retrieveWorklogsSchema = z.object({
startDate: dateSchema(),
endDate: dateSchema(),
});
export const createWorklogSchema = z.object({
issueKey: issueKeySchema(),
timeSpentHours: z.number().positive('Time spent must be positive'),
date: dateSchema(),
description: z.string().optional().default(''),
startTime: timeSchema().optional(),
activity: z.enum([
'Development',
'Design',
'Testing',
'RegressionTesting',
'InternalMeeting',
'Planning',
'Absence',
'Support',
'InternalMeeting-1',
'SolutionDelivery',
'RequirementAnalysis',
'ComplianceGDPR',
'Architect',
'PLOfficeRedecoration'
]), // Required activity parameter with predefined values
});
export const bulkCreateWorklogsSchema = z.object({
worklogEntries: z.array(worklogEntrySchema).min(1, 'At least one worklog entry is required'),
activity: z.enum([
'Development',
'Design',
'Testing',
'RegressionTesting',
'InternalMeeting',
'Planning',
'Absence',
'Support',
'InternalMeeting-1',
'SolutionDelivery',
'RequirementAnalysis',
'ComplianceGDPR',
'Architect',
'PLOfficeRedecoration'
]), // Required activity parameter with predefined values
});
export const editWorklogSchema = z.object({
worklogId: z.string().min(1, 'Worklog ID is required'),
timeSpentHours: z.number().positive('Time spent must be positive'),
description: z.string().optional().nullable(),
date: dateSchema().optional().nullable(),
startTime: timeSchema().optional(),
activity: z.enum([
'Development',
'Design',
'Testing',
'RegressionTesting',
'InternalMeeting',
'Planning',
'Absence',
'Support',
'InternalMeeting-1',
'SolutionDelivery',
'RequirementAnalysis',
'ComplianceGDPR',
'Architect',
'PLOfficeRedecoration'
]).optional(), // Optional activity parameter with predefined values
});
export const deleteWorklogSchema = z.object({
worklogId: z.string().min(1, 'Worklog ID is required'),
});