import type { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js"; import { z } from "zod"; import { db } from "../db.js"; import { objects } from "../schema.js"; import { objectTypes } from "../shared-types.js"; import { resolveWorkspaceHandle } from "../lib/resolve-workspace.js"; import { toolCatch, toolErr, toolOk } from "./tool-result.js"; const objectTypeSchema = z.enum(objectTypes as unknown as [string, ...string[]]); const createObjectInputSchema = z.object({ type: objectTypeSchema, title: z.string().min(1).max(500), parentId: z.string().uuid().nullable().optional(), workspace: z .string() .min(1) .describe("Workspace UUID or slug (e.g. 'acme' or '550e8400-...')"), description: z.string().optional(), status: z.string().optional(), icon: z.string().optional(), }); export function registerCreateObjectTool(mcp: McpServer): void { mcp.registerTool( "create_object", { description: "Create a new object (task, project, document, whiteboard, group). Accepts the workspace slug or UUID.", inputSchema: createObjectInputSchema, }, async (args) => { try { const input = createObjectInputSchema.parse(args); const ws = await resolveWorkspaceHandle(input.workspace); const [created] = await db .insert(objects) .values({ type: input.type, title: input.title, parentId: input.parentId ?? null, workspaceId: ws.id, description: input.description, status: input.status, icon: input.icon, }) .returning(); if (!created) { return toolErr("Failed to create object"); } return toolOk({ workspace: { id: ws.id, slug: ws.slug, name: ws.name }, object: created, }); } catch (e) { return toolCatch(e); } }, ); }