UNPKG

rhombus-node-mcp

Version:
148 lines (145 loc) 9.28 kB
import { createAutomatedPrompt, deleteAutomatedPrompt, getAutomatedPrompt, getAutomatedPromptChatHistory, listAutomatedPrompts, shareAutomatedPromptResponse, updateAutomatedPrompt, verifyJobScheduled, } from "../api/automated-prompts-tool-api.js"; import { AutomatedPromptsRequestType, CreateRequestSchema, DeleteRequestSchema, GetHistoryRequestSchema, GetRequestSchema, ListRequestSchema, OUTPUT_SCHEMA, ShareResponseRequestSchema, TOOL_ARGS, UpdateRequestSchema, VerifyScheduledRequestSchema, } from "../types/automated-prompts-tool-types.js"; import { createToolStructuredContent, createToolTextContent, extractFromToolExtra, } from "../util.js"; const TOOL_NAME = "automated-prompts-tool"; const TOOL_DESCRIPTION = ` This tool manages Rhombus MIND automated prompts - scheduled chatbot jobs that run a prompt at a recurring interval and store each response. Use it to list, inspect, create, update, delete, page through past responses for, share, or re-verify the schedule of an automated prompt. Modes (set "requestType"): - ${AutomatedPromptsRequestType.LIST}: List all automated prompts in the org. Optional 'lastEvaluatedKey' / 'maxPageSize' for pagination. - ${AutomatedPromptsRequestType.GET}: Get a single automated prompt's settings. Requires 'promptUuid'. - ${AutomatedPromptsRequestType.CREATE}: Create a new automated prompt. Requires 'prompt', 'invokeAt' (ISO 8601 with offset, must be at least 15 minutes in the future), 'frequencyValue', 'frequencyUnit', and 'permissionGroupUuid'. Optional 'responseTemplate' and 'notifyUserUuids'. - ${AutomatedPromptsRequestType.UPDATE}: Selectively update an automated prompt. Requires 'promptUuid'; only the fields you set will be changed. To change the role, the caller must have access to both the current and new role. Pass an empty 'notifyUserUuids' array to clear notifyees. - ${AutomatedPromptsRequestType.DELETE}: Delete an automated prompt and all of its stored responses. Requires 'promptUuid'. - ${AutomatedPromptsRequestType.GET_HISTORY}: Page through responses generated by an automated prompt. Requires 'promptUuid'. Optional 'lastEvaluatedKey' / 'maxPageSize'. - ${AutomatedPromptsRequestType.SHARE_RESPONSE}: Update the visibility of one stored response. Requires 'chatUuid' and 'visibility' (PUBLIC, ORG_WIDE, SELECT_USERS, PRIVATE). - ${AutomatedPromptsRequestType.VERIFY_SCHEDULED}: Re-verify that the job is scheduled to trigger; the server reschedules it if missing. Requires 'promptUuid'. Notes: - Use 'user-tool' to look up user UUIDs and resolve them to names/emails. 'notifyUserUuids' must be members of the chosen 'permissionGroupUuid'. - 'invokeAt' is an ISO 8601 timestamp; both 'Z' and '+/-HH:mm' offsets are accepted. The tool converts it to milliseconds for the API. - Timestamps in the output are ISO 8601 strings with timezone offset (defaults to America/Los_Angeles when no org timezone is available). - 'submitTestPrompt' is intentionally not exposed by this tool. `; function formatZodError(err) { return err.issues .map(issue => { const path = issue.path.join("."); return path ? `${path}: ${issue.message}` : issue.message; }) .join("; "); } function validationErrorResponse(err) { return createToolTextContent(JSON.stringify({ error: formatZodError(err) })); } const TOOL_HANDLER = async (args, _extra) => { const { requestModifiers, sessionId } = extractFromToolExtra(_extra); try { switch (args.requestType) { case AutomatedPromptsRequestType.LIST: { const parsed = ListRequestSchema.safeParse(args); if (!parsed.success) return validationErrorResponse(parsed.error); const { lastEvaluatedKey, maxPageSize } = parsed.data; const result = await listAutomatedPrompts({ lastEvaluatedKey: lastEvaluatedKey ?? undefined, maxPageSize: maxPageSize ?? undefined, }, requestModifiers, sessionId); return createToolStructuredContent({ settingsList: result.settingsList, lastEvaluatedKey: result.lastEvaluatedKey, }); } case AutomatedPromptsRequestType.GET: { const parsed = GetRequestSchema.safeParse(args); if (!parsed.success) return validationErrorResponse(parsed.error); const settings = await getAutomatedPrompt(parsed.data.promptUuid, requestModifiers, sessionId); return createToolStructuredContent({ settings }); } case AutomatedPromptsRequestType.CREATE: { const parsed = CreateRequestSchema.safeParse(args); if (!parsed.success) return validationErrorResponse(parsed.error); const data = parsed.data; const settings = await createAutomatedPrompt({ prompt: data.prompt, invokeAtMs: new Date(data.invokeAt).getTime(), frequencyValue: data.frequencyValue, frequencyUnit: data.frequencyUnit, permissionGroupUuid: data.permissionGroupUuid, responseTemplate: data.responseTemplate ?? undefined, notifyUserUuids: data.notifyUserUuids ?? undefined, }, requestModifiers, sessionId); return createToolStructuredContent({ settings }); } case AutomatedPromptsRequestType.UPDATE: { const parsed = UpdateRequestSchema.safeParse(args); if (!parsed.success) return validationErrorResponse(parsed.error); const data = parsed.data; const settings = await updateAutomatedPrompt({ promptUuid: data.promptUuid, prompt: data.prompt ?? undefined, invokeAtMs: data.invokeAt ? new Date(data.invokeAt).getTime() : undefined, frequencyValue: data.frequencyValue ?? undefined, frequencyUnit: data.frequencyUnit ?? undefined, permissionGroupUuid: data.permissionGroupUuid ?? undefined, responseTemplate: data.responseTemplate ?? undefined, notifyUserUuids: data.notifyUserUuids ?? undefined, }, requestModifiers, sessionId); return createToolStructuredContent({ settings }); } case AutomatedPromptsRequestType.DELETE: { const parsed = DeleteRequestSchema.safeParse(args); if (!parsed.success) return validationErrorResponse(parsed.error); const success = await deleteAutomatedPrompt(parsed.data.promptUuid, requestModifiers, sessionId); return createToolStructuredContent({ success }); } case AutomatedPromptsRequestType.GET_HISTORY: { const parsed = GetHistoryRequestSchema.safeParse(args); if (!parsed.success) return validationErrorResponse(parsed.error); const data = parsed.data; const result = await getAutomatedPromptChatHistory(data.promptUuid, { lastEvaluatedKey: data.lastEvaluatedKey ?? undefined, maxPageSize: data.maxPageSize ?? undefined, }, requestModifiers, sessionId); return createToolStructuredContent({ chatHistory: result.chatHistory, lastEvaluatedKey: result.lastEvaluatedKey, }); } case AutomatedPromptsRequestType.SHARE_RESPONSE: { const parsed = ShareResponseRequestSchema.safeParse(args); if (!parsed.success) return validationErrorResponse(parsed.error); const { chatUuid, visibility } = parsed.data; const success = await shareAutomatedPromptResponse(chatUuid, visibility, requestModifiers, sessionId); return createToolStructuredContent({ success }); } case AutomatedPromptsRequestType.VERIFY_SCHEDULED: { const parsed = VerifyScheduledRequestSchema.safeParse(args); if (!parsed.success) return validationErrorResponse(parsed.error); const verifyResult = await verifyJobScheduled(parsed.data.promptUuid, requestModifiers, sessionId); return createToolStructuredContent({ verifyResult }); } } } catch (error) { if (error instanceof Error) { return createToolStructuredContent({ error: error.message }); } return createToolStructuredContent({ error: "Unknown error" }); } return createToolStructuredContent({ error: "Invalid request type" }); }; export function createTool(server) { server.registerTool(TOOL_NAME, { title: "Automated Prompts", description: TOOL_DESCRIPTION, inputSchema: TOOL_ARGS, outputSchema: OUTPUT_SCHEMA.shape, annotations: { readOnlyHint: false, destructiveHint: true }, }, TOOL_HANDLER); }