rhombus-node-mcp
Version:
MCP server for Rhombus API
204 lines (203 loc) • 8.96 kB
JavaScript
import { z } from "zod";
import { ISOTimestampFormatDescription } from "../utils/timestampInput.js";
import { ChatFollowUpActionEnum, ChatVisibilityEnum, FrequencyUnitEnum } from "./schema.js";
export var AutomatedPromptsRequestType;
(function (AutomatedPromptsRequestType) {
AutomatedPromptsRequestType["LIST"] = "list";
AutomatedPromptsRequestType["GET"] = "get";
AutomatedPromptsRequestType["CREATE"] = "create";
AutomatedPromptsRequestType["UPDATE"] = "update";
AutomatedPromptsRequestType["DELETE"] = "delete";
AutomatedPromptsRequestType["GET_HISTORY"] = "get-history";
AutomatedPromptsRequestType["SHARE_RESPONSE"] = "share-response";
AutomatedPromptsRequestType["VERIFY_SCHEDULED"] = "verify-scheduled";
})(AutomatedPromptsRequestType || (AutomatedPromptsRequestType = {}));
export const TOOL_ARGS = {
requestType: z
.enum(AutomatedPromptsRequestType)
.describe("The type of automated prompt request to make."),
promptUuid: z
.string()
.nullable()
.describe("UUID of the automated prompt. Required for 'get', 'update', 'delete', 'get-history', and 'verify-scheduled'."),
chatUuid: z
.string()
.nullable()
.describe("UUID of a chat record (an individual response generated by an automated prompt). Required for 'share-response'."),
visibility: z
.enum(ChatVisibilityEnum)
.nullable()
.describe("Visibility for a shared chat response. Required for 'share-response'. One of PUBLIC, ORG_WIDE, SELECT_USERS, PRIVATE."),
prompt: z
.string()
.nullable()
.describe("The prompt MIND will execute every time the job runs. Required for 'create', recommended for 'update'."),
responseTemplate: z
.string()
.nullable()
.describe("Optional template that guides the shape of MIND's response. Used by 'create' and 'update'."),
frequencyValue: z
.number()
.int()
.positive()
.nullable()
.describe("How many time units between runs (e.g. 1 for 'every 1 day'). Required for 'create' alongside frequencyUnit."),
frequencyUnit: z
.enum(FrequencyUnitEnum)
.nullable()
.describe("Unit for the recurrence (HOURS, DAYS, WEEKS, MONTHS). Required for 'create' alongside frequencyValue."),
invokeAt: z.iso
.datetime({
message: "Invalid datetime string. Expected ISO 8601 format.",
offset: true,
})
.nullable()
.describe("When the automated prompt should first run. Required for 'create'. Must be at least 15 minutes in the future. " +
ISOTimestampFormatDescription),
permissionGroupUuid: z
.string()
.nullable()
.describe("UUID of the permission group/role that owns the job. Users in this role (or a higher role) can view and edit the job, and MIND uses this role's permissions when running the prompt. Required for 'create'."),
notifyUserUuids: z
.array(z.string())
.nullable()
.describe("User UUIDs to email-notify when MIND finishes a run. These users must be members of the permission group set above. Used by 'create' and 'update'. Pass an empty array to clear existing notifyees on 'update'."),
lastEvaluatedKey: z
.string()
.nullable()
.describe("Pagination cursor returned by a previous 'list' or 'get-history' call. Pass to fetch the next page."),
maxPageSize: z
.number()
.int()
.positive()
.nullable()
.describe("Maximum number of items per page for 'list' and 'get-history'."),
};
const TOOL_ARGS_SCHEMA = z.object(TOOL_ARGS);
/**
* Below is the individual request types schema
*/
const invokeAtDatetime = z.iso.datetime({
message: "invokeAt must be a valid ISO 8601 timestamp with offset (e.g. 2026-04-22T10:57:00-07:00).",
offset: true,
});
export const ListRequestSchema = z.object({
requestType: z.literal(AutomatedPromptsRequestType.LIST),
lastEvaluatedKey: z.string().nullish(),
maxPageSize: z.number().int().positive().nullish(),
});
export const GetRequestSchema = z.object({
requestType: z.literal(AutomatedPromptsRequestType.GET),
promptUuid: z.string().min(1, "promptUuid is required."),
});
export const CreateRequestSchema = z.object({
requestType: z.literal(AutomatedPromptsRequestType.CREATE),
prompt: z.string().min(1, "prompt is required."),
invokeAt: invokeAtDatetime,
frequencyValue: z.number().int().positive(),
frequencyUnit: z.enum(FrequencyUnitEnum),
permissionGroupUuid: z.string().min(1, "permissionGroupUuid is required."),
responseTemplate: z.string().nullish(),
notifyUserUuids: z.array(z.string()).nullish(),
});
export const UpdateRequestSchema = z
.object({
requestType: z.literal(AutomatedPromptsRequestType.UPDATE),
promptUuid: z.string().min(1, "promptUuid is required."),
prompt: z.string().min(1).nullish(),
invokeAt: invokeAtDatetime.nullish(),
frequencyValue: z.number().int().positive().nullish(),
frequencyUnit: z.enum(FrequencyUnitEnum).nullish(),
permissionGroupUuid: z.string().min(1).nullish(),
responseTemplate: z.string().nullish(),
notifyUserUuids: z.array(z.string()).nullish(),
})
.refine(data => (data.frequencyValue == null) === (data.frequencyUnit == null), {
message: "frequencyValue and frequencyUnit must be provided together when updating recurrence.",
path: ["frequencyValue"],
});
export const DeleteRequestSchema = z.object({
requestType: z.literal(AutomatedPromptsRequestType.DELETE),
promptUuid: z.string().min(1, "promptUuid is required."),
});
export const GetHistoryRequestSchema = z.object({
requestType: z.literal(AutomatedPromptsRequestType.GET_HISTORY),
promptUuid: z.string().min(1, "promptUuid is required."),
lastEvaluatedKey: z.string().nullish(),
maxPageSize: z.number().int().positive().nullish(),
});
export const ShareResponseRequestSchema = z.object({
requestType: z.literal(AutomatedPromptsRequestType.SHARE_RESPONSE),
chatUuid: z.string().min(1, "chatUuid is required."),
visibility: z.enum(ChatVisibilityEnum),
});
export const VerifyScheduledRequestSchema = z.object({
requestType: z.literal(AutomatedPromptsRequestType.VERIFY_SCHEDULED),
promptUuid: z.string().min(1, "promptUuid is required."),
});
/* More shared types */
const FrequencySchema = z
.object({
frequency: z.number().optional(),
unit: z.enum(FrequencyUnitEnum).optional(),
})
.describe("How often the prompt runs.");
const AutomatedPromptSummarySchema = z
.object({
uuid: z.string().optional(),
prompt: z.string().optional(),
responseTemplate: z.string().optional(),
frequency: FrequencySchema.optional(),
invokeAt: z
.string()
.optional()
.describe("Next run time as an ISO 8601 string with timezone offset."),
permissionGroupUuid: z.string().optional(),
notifyUserUuids: z.array(z.string()).optional(),
scheduleUuid: z.string().optional(),
orgUuid: z.string().optional(),
})
.describe("Summary of an automated prompt's settings.");
const ChatHistoryEntrySchema = z
.object({
uuid: z.string().optional(),
automatedPromptUuid: z.string().optional(),
query: z.string().optional(),
response: z.string().optional(),
queriedAt: z
.string()
.optional()
.describe("When the run started, as an ISO 8601 string with offset."),
respondedAt: z
.string()
.optional()
.describe("When the response was generated, as an ISO 8601 string with offset."),
responseType: z.string().optional(),
})
.describe("One MIND response generated by an automated prompt run.");
export const OUTPUT_SCHEMA = z.object({
settings: AutomatedPromptSummarySchema.optional().describe("Returned by 'get', 'create', and 'update'."),
settingsList: z.array(AutomatedPromptSummarySchema).optional().describe("Returned by 'list'."),
lastEvaluatedKey: z
.string()
.optional()
.describe("Pagination cursor for the next page; absent when no more pages."),
chatHistory: z.array(ChatHistoryEntrySchema).optional().describe("Returned by 'get-history'."),
verifyResult: z
.object({
scheduleExpression: z.string().optional(),
scheduleTimezone: z.string().optional(),
})
.optional()
.describe("Returned by 'verify-scheduled'. Schedule expression and timezone for the next trigger."),
success: z
.object({
ok: z.boolean(),
action: z.string(),
})
.optional()
.describe("Returned by 'delete' and 'share-response'."),
error: z.string().optional().describe("An error message if the request failed."),
});
// Re-export for the api/tool layers so they can build ChatPrivacy follow-ups.
export { ChatFollowUpActionEnum, ChatVisibilityEnum, FrequencyUnitEnum };