import {
add,
differenceInDays,
differenceInHours,
differenceInMinutes,
differenceInMonths,
differenceInSeconds,
differenceInWeeks,
differenceInYears,
format,
isAfter,
isBefore,
isEqual,
sub,
type Duration,
} from "date-fns";
import type { TextContent } from "fastmcp";
import type {
TAddParams,
TCompareParams,
TDifferenceParams,
TFormatParams,
TSubtractParams,
} from "./params.js";
export const nowTool = async (): Promise<TextContent> => {
return { type: "text", text: new Date().toISOString() };
};
export const formatTool = async (args: TFormatParams): Promise<TextContent> => {
const result = format(new Date(args.datetime), args.format);
return {
type: "text",
text: result,
};
};
export const addTool = async (args: TAddParams): Promise<TextContent> => {
const result = add(new Date(args.datetime), args.duration as Duration);
return {
type: "text",
text: result.toISOString(),
};
};
export const subtractTool = async (
args: TSubtractParams
): Promise<TextContent> => {
const result = sub(new Date(args.datetime), args.duration as Duration);
return {
type: "text",
text: result.toISOString(),
};
};
export const differenceTool = async (
args: TDifferenceParams
): Promise<TextContent> => {
let result: number;
switch (args.unit) {
case "seconds":
result = differenceInSeconds(
new Date(args.datetimeFrom),
new Date(args.datetimeTo)
);
break;
case "minutes":
result = differenceInMinutes(
new Date(args.datetimeFrom),
new Date(args.datetimeTo)
);
break;
case "hours":
result = differenceInHours(
new Date(args.datetimeFrom),
new Date(args.datetimeTo)
);
break;
case "days":
result = differenceInDays(
new Date(args.datetimeFrom),
new Date(args.datetimeTo)
);
break;
case "weeks":
result = differenceInWeeks(
new Date(args.datetimeFrom),
new Date(args.datetimeTo)
);
break;
case "months":
result = differenceInMonths(
new Date(args.datetimeFrom),
new Date(args.datetimeTo)
);
break;
case "years":
result = differenceInYears(
new Date(args.datetimeFrom),
new Date(args.datetimeTo)
);
break;
default:
throw new Error(`Invalid unit: ${args.unit}`);
}
return {
type: "text",
text: `Difference between ${args.datetimeFrom} and ${
args.datetimeTo
} is ${Math.abs(result).toString()} ${args.unit}`,
};
};
export const compareTool = async (
args: TCompareParams
): Promise<TextContent> => {
let result: boolean;
switch (args.operator) {
case "after":
result = isAfter(
new Date(args.firstDatetime),
new Date(args.secondDatetime)
);
break;
case "before":
result = isBefore(
new Date(args.firstDatetime),
new Date(args.secondDatetime)
);
break;
case "equal":
result = isEqual(
new Date(args.firstDatetime),
new Date(args.secondDatetime)
);
break;
default:
throw new Error(`Invalid operator: ${args.operator}`);
}
return {
type: "text",
text: result.toString(),
};
};