@roottale/cms-mcp 0.61.1 → 0.63.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/index.ts","../src/cli.ts","../src/api.ts","../src/automation-definitions.ts","../src/automation-media.ts","../src/automation-schemas.ts","../src/automation-tools.ts","../src/management-definitions.ts","../src/management-schemas.ts","../src/management-tools.ts","../src/server.ts","../src/tools.ts","../src/docs.ts","../src/seo-tools.ts","../src/seo-definitions.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n\nimport { runCmsCli } from \"./cli.js\";\nimport { createServer } from \"./server.js\";\n\nif (process.argv[2] === \"cli\") {\n await runCmsCli(process.argv);\n} else {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport { Command, InvalidArgumentError } from \"commander\";\n\nimport { callAutomationTool } from \"./automation-tools.js\";\nimport { callManagementTool } from \"./management-tools.js\";\n\ntype CommonOptions = { readonly siteId?: string };\n\nexport function createCmsCli(): Command {\n const cli = new Command()\n .name(\"roottale-cms\")\n .description(\"RootTale CMS 전체 관리 자동화 CLI\");\n\n registerManagementCommands(cli);\n registerPostCommands(cli, \"entries\");\n registerPostCommands(cli, \"posts\");\n registerMediaCommands(cli);\n return cli;\n}\n\nexport async function runCmsCli(argv: readonly string[]): Promise<void> {\n try {\n await createCmsCli().parseAsync([\n argv[0] ?? \"node\",\n \"roottale-cms\",\n ...argv.slice(3),\n ]);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`${message}\\n`);\n process.exitCode = 1;\n }\n}\n\nfunction registerPostCommands(cli: Command, name: \"entries\" | \"posts\"): void {\n const posts = cli.command(name).description(\n name === \"entries\" ? \"페이지·글·정보 항목 관리\" : \"CMS 글 관리(호환 명령)\",\n );\n\n posts\n .command(\"list\")\n .description(\"초안·예약·발행 글 목록 조회\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--limit <number>\", \"조회 개수\", integer, 20)\n .option(\"--cursor <cursor>\", \"다음 페이지 커서\")\n .option(\"--type <type>\", \"post 또는 page\")\n .option(\"--status <status>\", \"draft, published, scheduled, private\")\n .option(\"--model-key <key>\", \"콘텐츠 모델 key\")\n .action(async (options) => {\n await run(\"listManagedCmsPosts\", options);\n });\n\n posts\n .command(\"get <post-id>\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .action(async (postId: string, options: CommonOptions) => {\n await run(\"getManagedCmsPost\", { postId, ...options });\n });\n\n posts\n .command(\"create\")\n .description(\"Tiptap JSON 본문으로 새 글 생성\")\n .requiredOption(\"--title <title>\", \"글 제목\")\n .requiredOption(\"--slug <slug>\", \"URL 슬러그\")\n .requiredOption(\"--body-file <path>\", \"Tiptap 본문 JSON 파일\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--type <type>\", \"post 또는 page\", \"post\")\n .option(\"--excerpt <text>\", \"요약\")\n .option(\"--featured-media-id <id>\", \"썸네일 미디어 ID\")\n .option(\"--publish\", \"즉시 발행\")\n .option(\"--scheduled-at <iso>\", \"예약 발행 ISO 시각\")\n .option(\"--category-ids <ids>\", \"쉼표로 구분한 카테고리 ID\")\n .option(\"--tag-ids <ids>\", \"쉼표로 구분한 태그 ID\")\n .option(\"--model-key <key>\", \"콘텐츠 모델 key\")\n .option(\"--field-values-file <path>\", \"모델 필드 값 JSON 파일\")\n .action(async (options) => {\n await run(\"createCmsPost\", {\n ...options,\n bodyJson: await readJsonObject(options.bodyFile),\n categoryIds: commaSeparated(options.categoryIds),\n tagIds: commaSeparated(options.tagIds),\n modelKey: options.modelKey,\n fieldValues: options.fieldValuesFile\n ? await readJsonObject(options.fieldValuesFile)\n : undefined,\n bodyFile: undefined,\n fieldValuesFile: undefined,\n });\n });\n\n posts\n .command(\"update\")\n .description(\"기존 글의 일부 필드 수정\")\n .argument(\"<post-id>\", \"글 ID\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--title <title>\", \"글 제목\")\n .option(\"--slug <slug>\", \"URL 슬러그\")\n .option(\"--body-file <path>\", \"Tiptap 본문 JSON 파일\")\n .option(\"--excerpt <text>\", \"요약\")\n .option(\"--featured-media-id <id>\", \"썸네일 미디어 ID\")\n .option(\"--clear-featured-media\", \"썸네일 연결 해제\")\n .option(\"--scheduled-at <iso>\", \"예약 발행 ISO 시각\")\n .option(\"--clear-schedule\", \"예약 해제\")\n .option(\"--field-values-file <path>\", \"모델 필드 값 JSON 파일\")\n .action(async (postId: string, options) => {\n await run(\"updateCmsPost\", {\n postId,\n siteId: options.siteId,\n title: options.title,\n slug: options.slug,\n bodyJson: options.bodyFile\n ? await readJsonObject(options.bodyFile)\n : undefined,\n excerpt: options.excerpt,\n featuredMediaId: options.clearFeaturedMedia\n ? null\n : options.featuredMediaId,\n scheduledAt: options.clearSchedule ? null : options.scheduledAt,\n fieldValues: options.fieldValuesFile\n ? await readJsonObject(options.fieldValuesFile)\n : undefined,\n });\n });\n\n lifecycle(posts, \"publish\", \"글을 즉시 발행\", \"publishCmsPost\");\n lifecycle(posts, \"unpublish\", \"발행 글을 초안으로 전환\", \"unpublishCmsPost\");\n\n posts\n .command(\"set-terms\")\n .description(\"글의 카테고리 또는 태그 전체 교체\")\n .argument(\"<post-id>\", \"글 ID\")\n .requiredOption(\"--taxonomy <type>\", \"category 또는 tag\")\n .requiredOption(\"--term-ids <ids>\", \"쉼표로 구분한 term ID\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .action(async (postId: string, options) => {\n await run(\"setCmsPostTerms\", {\n postId,\n siteId: options.siteId,\n taxonomy: options.taxonomy,\n termIds: commaSeparated(options.termIds) ?? [],\n });\n });\n\n posts\n .command(\"delete <post-id>\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--hard\", \"영구 삭제\")\n .action(async (postId: string, options) => {\n await run(\"deleteCmsPost\", { postId, ...options });\n });\n}\n\nfunction registerManagementCommands(cli: Command): void {\n const models = cli.command(\"models\").description(\"페이지·글·정보 모델 관리\");\n models.command(\"list\").option(\"--site-id <id>\").option(\"--state <state>\")\n .option(\"--preset <preset>\").option(\"--source <source>\")\n .action(async (options) => runManagement(\"listCmsContentModels\", options));\n models.command(\"get <model-key>\").option(\"--site-id <id>\")\n .action(async (modelKey: string, options) => runManagement(\"getCmsContentModel\", { modelKey, ...options }));\n inputCommand(models, \"create\", \"createCmsContentModel\");\n inputCommand(models, \"update <model-key>\", \"updateCmsContentModel\", \"modelKey\");\n refCommand(models, \"activate <model-key>\", \"activateCmsContentModel\", \"modelKey\");\n refCommand(models, \"deactivate <model-key>\", \"deactivateCmsContentModel\", \"modelKey\");\n refCommand(models, \"delete <model-key>\", \"deleteCmsContentModel\", \"modelKey\");\n\n const fields = cli.command(\"fields\").description(\"모델별 필드 그룹 관리\");\n refCommand(fields, \"list <model-key>\", \"listCmsFieldGroups\", \"modelKey\");\n twoRefCommand(fields, \"get <model-key> <group-key>\", \"getCmsFieldGroup\");\n inputCommand(fields, \"create <model-key>\", \"createCmsFieldGroup\", \"modelKey\");\n inputCommand(fields, \"update <model-key> <group-key>\", \"updateCmsFieldGroup\", \"modelKey\", \"groupKey\");\n twoRefCommand(fields, \"activate <model-key> <group-key>\", \"activateCmsFieldGroup\");\n twoRefCommand(fields, \"deactivate <model-key> <group-key>\", \"deactivateCmsFieldGroup\");\n twoRefCommand(fields, \"delete <model-key> <group-key>\", \"deleteCmsFieldGroup\");\n\n const slots = cli.command(\"exposure-slots\").description(\"FRONT 노출 슬롯 조회\");\n slots.command(\"list\").option(\"--site-id <id>\")\n .action(async (options) => runManagement(\"listCmsExposureSlots\", options));\n\n const exposures = cli.command(\"exposures\").description(\"배너·팝업 캠페인 관리\");\n exposures.command(\"list\").option(\"--site-id <id>\").option(\"--kind <kind>\")\n .option(\"--status <status>\")\n .action(async (options) => runManagement(\"listCmsExposures\", options));\n refCommand(exposures, \"get <exposure-id>\", \"getCmsExposure\", \"exposureId\");\n inputCommand(exposures, \"create\", \"createCmsExposure\");\n inputCommand(exposures, \"update <exposure-id>\", \"updateCmsExposure\", \"exposureId\");\n refCommand(exposures, \"publish <exposure-id>\", \"publishCmsExposure\", \"exposureId\");\n refCommand(exposures, \"archive <exposure-id>\", \"archiveCmsExposure\", \"exposureId\");\n}\n\ntype ManagementName = Parameters<typeof callManagementTool>[0];\n\nfunction refCommand(\n parent: Command,\n syntax: string,\n toolName: ManagementName,\n key: \"modelKey\" | \"exposureId\",\n): void {\n parent.command(syntax).option(\"--site-id <id>\")\n .action(async (value: string, options) => runManagement(toolName, { [key]: value, ...options }));\n}\n\nfunction twoRefCommand(parent: Command, syntax: string, toolName: ManagementName): void {\n parent.command(syntax).option(\"--site-id <id>\")\n .action(async (modelKey: string, groupKey: string, options) =>\n runManagement(toolName, { modelKey, groupKey, ...options }));\n}\n\nfunction inputCommand(\n parent: Command,\n syntax: string,\n toolName: ManagementName,\n firstKey?: \"modelKey\" | \"exposureId\",\n secondKey?: \"groupKey\",\n): void {\n const command = parent.command(syntax)\n .requiredOption(\"--input-file <path>\", \"요청 JSON 파일\")\n .option(\"--site-id <id>\");\n command.action(async (...values: unknown[]) => {\n const options = values.at(-2) as { inputFile: string; siteId?: string };\n const input = await readJsonObject(options.inputFile);\n const refs: Record<string, unknown> = {};\n if (firstKey) refs[firstKey] = values[0];\n if (secondKey) refs[secondKey] = values[1];\n await runManagement(toolName, { ...input, ...refs, siteId: options.siteId });\n });\n}\n\nfunction registerMediaCommands(cli: Command): void {\n const media = cli.command(\"media\").description(\"CMS 미디어 자동화\");\n\n media\n .command(\"list\")\n .description(\"미디어 라이브러리 조회\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--limit <number>\", \"조회 개수\", integer, 20)\n .option(\"--offset <number>\", \"조회 시작 위치\", integer, 0)\n .action(async (options) => {\n await run(\"listCmsMedia\", options);\n });\n\n media\n .command(\"upload\")\n .description(\"로컬 파일을 업로드하고 CMS 미디어로 등록\")\n .argument(\"<file>\", \"jpg, png, webp, gif 또는 pdf 파일\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--content-type <type>\", \"MIME type 직접 지정\")\n .option(\"--alt <text>\", \"대체 텍스트\")\n .option(\"--caption <text>\", \"캡션\")\n .action(async (filePath: string, options) => {\n await run(\"uploadCmsMedia\", { filePath, ...options });\n });\n\n media\n .command(\"update\")\n .description(\"미디어 대체 텍스트 또는 캡션 수정\")\n .argument(\"<media-id>\", \"미디어 ID\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--alt <text>\", \"대체 텍스트\")\n .option(\"--caption <text>\", \"캡션\")\n .action(async (mediaId: string, options) => {\n await run(\"updateCmsMedia\", { mediaId, ...options });\n });\n\n media\n .command(\"delete\")\n .description(\"미디어 파일과 라이브러리 항목 삭제\")\n .argument(\"<media-id>\", \"미디어 ID\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .action(async (mediaId: string, options: CommonOptions) => {\n await run(\"deleteCmsMedia\", { mediaId, ...options });\n });\n}\n\nfunction lifecycle(\n posts: Command,\n commandName: string,\n description: string,\n toolName: \"publishCmsPost\" | \"unpublishCmsPost\",\n): void {\n posts\n .command(commandName)\n .description(description)\n .argument(\"<post-id>\", \"글 ID\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .action(async (postId: string, options: CommonOptions) => {\n await run(toolName, { postId, ...options });\n });\n}\n\nasync function run(\n name: Parameters<typeof callAutomationTool>[0],\n args: Record<string, unknown>,\n): Promise<void> {\n const definedArgs = Object.fromEntries(\n Object.entries(args).filter(([, value]) => value !== undefined),\n );\n const result = await callAutomationTool(name, definedArgs);\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n}\n\nasync function runManagement(\n name: Parameters<typeof callManagementTool>[0],\n args: Record<string, unknown>,\n): Promise<void> {\n const definedArgs = Object.fromEntries(\n Object.entries(args).filter(([, value]) => value !== undefined),\n );\n const result = await callManagementTool(name, definedArgs);\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n}\n\nasync function readJsonObject(filePath: string): Promise<Record<string, unknown>> {\n const parsed: unknown = JSON.parse(await readFile(filePath, \"utf8\"));\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new InvalidArgumentError(\"본문 파일은 Tiptap JSON 객체여야 합니다.\");\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction commaSeparated(value: string | undefined): string[] | undefined {\n if (value === undefined) return undefined;\n return value.split(\",\").map((item) => item.trim()).filter(Boolean);\n}\n\nfunction integer(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new InvalidArgumentError(\"0 이상의 정수를 입력하세요.\");\n }\n return parsed;\n}\n","import ky from \"ky\";\n\nconst DEFAULT_API_BASE = \"https://api.roottale.com\";\n\nexport class CmsAutomationError extends Error {\n readonly name = \"CmsAutomationError\";\n}\n\nexport type ApiRequest = {\n readonly method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n readonly pathname: string;\n readonly query?: Readonly<Record<string, string | undefined>>;\n readonly body?: unknown;\n};\n\nfunction apiConfig(): { readonly apiKey: string; readonly baseUrl: string } {\n const apiKey = process.env.ROOTTALE_API_KEY;\n if (!apiKey) {\n throw new CmsAutomationError(\n \"ROOTTALE_API_KEY 환경변수가 없습니다. 어드민 설정 > 사이트 연결 키에서 read_write 키를 발급해 MCP env에 추가하세요.\",\n );\n }\n return {\n apiKey,\n baseUrl: (process.env.ROOTTALE_API_BASE ?? DEFAULT_API_BASE).replace(\n /\\/+$/,\n \"\",\n ),\n };\n}\n\nexport async function requestRootTaleApi(\n request: ApiRequest,\n): Promise<unknown> {\n const { apiKey, baseUrl } = apiConfig();\n const url = new URL(`${baseUrl}${request.pathname}`);\n for (const [key, value] of Object.entries(request.query ?? {})) {\n if (value !== undefined) url.searchParams.set(key, value);\n }\n return ky(url, {\n method: request.method,\n headers: { authorization: `Bearer ${apiKey}` },\n json: request.body,\n retry: 0,\n timeout: 30_000,\n }).json();\n}\n\nexport async function putUpload(\n uploadUrl: string,\n bytes: Uint8Array,\n contentType: string,\n): Promise<void> {\n const body = new Uint8Array(bytes.byteLength);\n body.set(bytes);\n await ky.put(uploadUrl, {\n body: body.buffer,\n headers: { \"content-type\": contentType },\n retry: 0,\n timeout: 120_000,\n });\n}\n","type JsonSchemaProperty = Readonly<Record<string, unknown>>;\n\nexport const AUTOMATION_TOOL_DEFINITIONS = [\n tool(\"listManagedCmsPosts\", \"초안·예약·발행 글을 포함한 관리용 글 목록을 조회합니다.\", {\n siteId: stringProperty(\"사이트 ID\"),\n limit: numberProperty(\"1-100\"),\n type: enumProperty([\"post\", \"page\"]),\n status: enumProperty([\"draft\", \"published\", \"scheduled\", \"private\"]),\n cursor: stringProperty(\"이전 응답의 next_cursor\"),\n modelKey: stringProperty(\"콘텐츠 모델 key\"),\n }),\n tool(\"getManagedCmsPost\", \"페이지·글·정보 항목 한 건을 관리용 원문으로 조회합니다.\", {\n postId: stringProperty(\"항목 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n }, [\"postId\"]),\n tool(\n \"createCmsPost\",\n \"Tiptap bodyJson으로 글 또는 페이지를 생성합니다. 기본은 초안이며 publish=true면 즉시 발행합니다.\",\n {\n siteId: stringProperty(\"사이트 ID\"),\n type: enumProperty([\"post\", \"page\"]),\n title: stringProperty(\"제목\"),\n slug: stringProperty(\"슬러그\"),\n bodyJson: { type: \"object\", description: \"Tiptap 문서 JSON\" },\n excerpt: nullableStringProperty(\"요약\"),\n featuredMediaId: nullableStringProperty(\"대표 이미지 media id\"),\n publish: { type: \"boolean\" },\n scheduledAt: stringProperty(\"미래 ISO 8601 발행 시각\"),\n categoryIds: arrayProperty(\"카테고리 term id\"),\n tagIds: arrayProperty(\"태그 term id\"),\n modelKey: stringProperty(\"콘텐츠 모델 key\"),\n fieldValues: { type: \"object\", description: \"모델 필드 원문 값\" },\n },\n [\"title\", \"slug\", \"bodyJson\"],\n ),\n tool(\"updateCmsPost\", \"기존 CMS 글을 부분 수정합니다.\", {\n postId: stringProperty(\"글 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n title: stringProperty(\"제목\"),\n slug: stringProperty(\"슬러그\"),\n bodyJson: { type: \"object\", description: \"Tiptap 문서 JSON\" },\n excerpt: nullableStringProperty(\"요약\"),\n featuredMediaId: nullableStringProperty(\"대표 이미지 media id\"),\n scheduledAt: nullableStringProperty(\"예약 시각\"),\n fieldValues: { type: \"object\", description: \"모델 필드 원문 값\" },\n }, [\"postId\"]),\n tool(\"publishCmsPost\", \"초안 또는 예약 글을 즉시 발행하고 웹훅을 전송합니다.\", {\n postId: stringProperty(\"글 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n }, [\"postId\"]),\n tool(\"unpublishCmsPost\", \"발행 글을 초안으로 되돌립니다.\", {\n postId: stringProperty(\"글 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n }, [\"postId\"]),\n tool(\"deleteCmsPost\", \"페이지·글·정보 항목을 휴지통으로 보내거나 영구 삭제합니다.\", {\n postId: stringProperty(\"항목 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n hard: { type: \"boolean\", description: \"true면 영구 삭제\" },\n }, [\"postId\"]),\n tool(\"setCmsPostTerms\", \"글의 카테고리 또는 태그 연결을 교체합니다.\", {\n postId: stringProperty(\"글 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n taxonomy: enumProperty([\"category\", \"tag\"]),\n termIds: arrayProperty(\"term id\"),\n }, [\"postId\", \"taxonomy\", \"termIds\"]),\n tool(\"listCmsMedia\", \"CMS 미디어 라이브러리를 조회합니다.\", {\n siteId: stringProperty(\"사이트 ID\"),\n limit: numberProperty(\"1-100\"),\n offset: numberProperty(\"0 이상\"),\n }),\n tool(\n \"uploadCmsMedia\",\n \"로컬 이미지/PDF 파일을 업로드하고 CMS media id와 공개 URL을 반환합니다.\",\n {\n filePath: stringProperty(\"로컬 파일 절대/상대 경로\"),\n siteId: stringProperty(\"사이트 ID\"),\n contentType: enumProperty([\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/gif\",\n \"application/pdf\",\n ]),\n alt: nullableStringProperty(\"대체 텍스트\"),\n caption: nullableStringProperty(\"캡션\"),\n },\n [\"filePath\"],\n ),\n tool(\"updateCmsMedia\", \"CMS 미디어의 대체 텍스트 또는 캡션을 수정합니다.\", {\n mediaId: stringProperty(\"media id\"),\n siteId: stringProperty(\"사이트 ID\"),\n alt: nullableStringProperty(\"대체 텍스트\"),\n caption: nullableStringProperty(\"캡션\"),\n }, [\"mediaId\"]),\n tool(\"deleteCmsMedia\", \"CMS 미디어를 R2와 라이브러리에서 삭제합니다.\", {\n mediaId: stringProperty(\"media id\"),\n siteId: stringProperty(\"사이트 ID\"),\n }, [\"mediaId\"]),\n] as const;\n\nexport type AutomationToolName =\n (typeof AUTOMATION_TOOL_DEFINITIONS)[number][\"name\"];\n\nexport function isAutomationToolName(name: string): name is AutomationToolName {\n return AUTOMATION_TOOL_DEFINITIONS.some(\n (toolDefinition) => toolDefinition.name === name,\n );\n}\n\nfunction tool<const TName extends string>(\n name: TName,\n description: string,\n properties: Readonly<Record<string, JsonSchemaProperty>>,\n required: readonly string[] = [],\n) {\n return {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false,\n },\n } as const;\n}\n\nfunction stringProperty(description: string): JsonSchemaProperty {\n return { type: \"string\", description };\n}\n\nfunction nullableStringProperty(description: string): JsonSchemaProperty {\n return { type: [\"string\", \"null\"], description };\n}\n\nfunction numberProperty(description: string): JsonSchemaProperty {\n return { type: \"number\", description };\n}\n\nfunction enumProperty(values: readonly string[]): JsonSchemaProperty {\n return { type: \"string\", enum: values };\n}\n\nfunction arrayProperty(description: string): JsonSchemaProperty {\n return { type: \"array\", items: { type: \"string\" }, description };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname, resolve } from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { CmsAutomationError, putUpload, requestRootTaleApi } from \"./api.js\";\nimport { UploadMediaInput } from \"./automation-schemas.js\";\n\nexport async function uploadCmsMedia(args: Record<string, unknown>): Promise<unknown> {\n const input = UploadMediaInput.parse(args);\n const filePath = resolve(input.filePath);\n const bytes = await readFile(filePath);\n const contentType = input.contentType ?? inferContentType(filePath);\n if (!contentType) {\n throw new CmsAutomationError(\n \"contentType을 추론할 수 없습니다. jpg/png/webp/gif/pdf 파일이 아니면 contentType을 지정하세요.\",\n );\n }\n const requested = z\n .object({\n upload_url: z.string().url(),\n r2_key: z.string().min(1),\n })\n .parse(\n await requestRootTaleApi({\n method: \"POST\",\n pathname: \"/v1/cms/media/uploads\",\n body: {\n site_id: input.siteId,\n original_name: basename(filePath),\n content_type: contentType,\n size_bytes: bytes.byteLength,\n },\n }),\n );\n await putUpload(requested.upload_url, bytes, contentType);\n return requestRootTaleApi({\n method: \"POST\",\n pathname: \"/v1/cms/media/uploads/complete\",\n body: {\n site_id: input.siteId,\n r2_key: requested.r2_key,\n original_name: basename(filePath),\n content_type: contentType,\n size_bytes: bytes.byteLength,\n alt: input.alt,\n caption: input.caption,\n },\n });\n}\n\nfunction inferContentType(filePath: string): string | undefined {\n switch (extname(filePath).toLowerCase()) {\n case \".jpg\":\n case \".jpeg\":\n return \"image/jpeg\";\n case \".png\":\n return \"image/png\";\n case \".webp\":\n return \"image/webp\";\n case \".gif\":\n return \"image/gif\";\n case \".pdf\":\n return \"application/pdf\";\n default:\n return undefined;\n }\n}\n","import { z } from \"zod\";\n\nconst SiteId = z.string().min(1).optional();\nconst PostId = z.string().min(1);\nconst NullableText = z.string().nullable().optional();\n\nexport const CreatePostInput = z\n .object({\n siteId: SiteId,\n type: z.enum([\"post\", \"page\"]).optional(),\n title: z.string().min(1).max(500),\n slug: z.string().min(1).max(120),\n bodyJson: z.record(z.string(), z.unknown()),\n excerpt: z.string().max(1000).nullable().optional(),\n featuredMediaId: z.string().nullable().optional(),\n publish: z.boolean().optional(),\n scheduledAt: z.string().datetime({ offset: true }).optional(),\n categoryIds: z.array(z.string()).optional(),\n tagIds: z.array(z.string()).optional(),\n modelKey: z.string().min(1).optional(),\n fieldValues: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\nexport const UpdatePostInput = z\n .object({\n postId: PostId,\n siteId: SiteId,\n title: z.string().min(1).max(500).optional(),\n slug: z.string().min(1).max(120).optional(),\n bodyJson: z.record(z.string(), z.unknown()).optional(),\n excerpt: NullableText,\n featuredMediaId: z.string().nullable().optional(),\n scheduledAt: z.string().datetime({ offset: true }).nullable().optional(),\n fieldValues: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\nexport const PostLifecycleInput = z\n .object({ postId: PostId, siteId: SiteId })\n .strict();\n\nexport const DeletePostInput = PostLifecycleInput.extend({ hard: z.boolean().optional() }).strict();\n\nexport const ListManagedPostsInput = z\n .object({\n siteId: SiteId,\n limit: z.number().int().min(1).max(100).optional(),\n type: z.enum([\"post\", \"page\"]).optional(),\n status: z\n .enum([\"draft\", \"published\", \"scheduled\", \"private\"])\n .optional(),\n cursor: z.string().optional(),\n modelKey: z.string().min(1).optional(),\n })\n .strict();\n\nexport const SetTermsInput = z\n .object({\n postId: PostId,\n siteId: SiteId,\n taxonomy: z.enum([\"category\", \"tag\"]),\n termIds: z.array(z.string()),\n })\n .strict();\n\nexport const UploadMediaInput = z\n .object({\n filePath: z.string().min(1),\n siteId: SiteId,\n contentType: z\n .enum([\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/gif\",\n \"application/pdf\",\n ])\n .optional(),\n alt: NullableText,\n caption: NullableText,\n })\n .strict();\n\nexport const ListMediaInput = z\n .object({\n siteId: SiteId,\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().nonnegative().optional(),\n })\n .strict();\n\nexport const UpdateMediaInput = z\n .object({\n mediaId: z.string().min(1),\n siteId: SiteId,\n alt: NullableText,\n caption: NullableText,\n })\n .strict()\n .refine((input) => input.alt !== undefined || input.caption !== undefined, {\n message: \"alt 또는 caption 중 하나 이상이 필요합니다.\",\n });\n\nexport const DeleteMediaInput = z\n .object({ mediaId: z.string().min(1), siteId: SiteId })\n .strict();\n","import { CmsAutomationError, requestRootTaleApi } from \"./api.js\";\nimport {\n type AutomationToolName,\n AUTOMATION_TOOL_DEFINITIONS,\n isAutomationToolName,\n} from \"./automation-definitions.js\";\nimport { uploadCmsMedia } from \"./automation-media.js\";\nimport {\n CreatePostInput,\n DeletePostInput,\n DeleteMediaInput,\n ListManagedPostsInput,\n ListMediaInput,\n PostLifecycleInput,\n SetTermsInput,\n UpdateMediaInput,\n UpdatePostInput,\n} from \"./automation-schemas.js\";\n\nexport {\n AUTOMATION_TOOL_DEFINITIONS,\n isAutomationToolName,\n};\n\nexport async function callAutomationTool(\n name: AutomationToolName,\n args: Record<string, unknown>,\n): Promise<unknown> {\n switch (name) {\n case \"listManagedCmsPosts\": {\n const input = ListManagedPostsInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/posts\",\n query: optionalQuery({\n site_id: input.siteId,\n limit: input.limit,\n type: input.type,\n status: input.status,\n cursor: input.cursor,\n model_key: input.modelKey,\n }),\n });\n }\n case \"getManagedCmsPost\": {\n const input = PostLifecycleInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname: `/v1/cms/posts/${encodeURIComponent(input.postId)}`,\n query: optionalQuery({ site_id: input.siteId }),\n });\n }\n case \"createCmsPost\": {\n const input = CreatePostInput.parse(args);\n return requestRootTaleApi({\n method: \"POST\",\n pathname: \"/v1/cms/posts\",\n body: {\n site_id: input.siteId,\n type: input.type,\n title: input.title,\n slug: input.slug,\n body_json: input.bodyJson,\n excerpt: input.excerpt,\n featured_media_id: input.featuredMediaId,\n publish: input.publish,\n scheduled_at: input.scheduledAt,\n category_ids: input.categoryIds,\n tag_ids: input.tagIds,\n model_key: input.modelKey,\n field_values: input.fieldValues,\n },\n });\n }\n case \"updateCmsPost\": {\n const input = UpdatePostInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: `/v1/cms/posts/${encodeURIComponent(input.postId)}`,\n body: {\n site_id: input.siteId,\n title: input.title,\n slug: input.slug,\n body_json: input.bodyJson,\n excerpt: input.excerpt,\n featured_media_id: input.featuredMediaId,\n scheduled_at: input.scheduledAt,\n field_values: input.fieldValues,\n },\n });\n }\n case \"publishCmsPost\":\n case \"unpublishCmsPost\": {\n const input = PostLifecycleInput.parse(args);\n const action = name === \"publishCmsPost\" ? \"publish\" : \"unpublish\";\n return requestRootTaleApi({\n method: \"POST\",\n pathname: `/v1/cms/posts/${encodeURIComponent(input.postId)}/${action}`,\n body: { site_id: input.siteId },\n });\n }\n case \"setCmsPostTerms\": {\n const input = SetTermsInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: `/v1/cms/posts/${encodeURIComponent(input.postId)}/terms`,\n body: {\n site_id: input.siteId,\n taxonomy: input.taxonomy,\n term_ids: input.termIds,\n },\n });\n }\n case \"deleteCmsPost\": {\n const input = DeletePostInput.parse(args);\n return requestRootTaleApi({\n method: \"DELETE\",\n pathname: `/v1/cms/posts/${encodeURIComponent(input.postId)}`,\n query: optionalQuery({\n site_id: input.siteId,\n hard: input.hard === undefined ? undefined : String(input.hard),\n }),\n });\n }\n case \"listCmsMedia\": {\n const input = ListMediaInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/media\",\n query: optionalQuery({\n site_id: input.siteId,\n limit: input.limit,\n offset: input.offset,\n }),\n });\n }\n case \"uploadCmsMedia\":\n return uploadCmsMedia(args);\n case \"updateCmsMedia\": {\n const input = UpdateMediaInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: `/v1/cms/media/${encodeURIComponent(input.mediaId)}`,\n body: {\n site_id: input.siteId,\n alt: input.alt,\n caption: input.caption,\n },\n });\n }\n case \"deleteCmsMedia\": {\n const input = DeleteMediaInput.parse(args);\n return requestRootTaleApi({\n method: \"DELETE\",\n pathname: `/v1/cms/media/${encodeURIComponent(input.mediaId)}`,\n query: optionalQuery({ site_id: input.siteId }),\n });\n }\n default:\n return assertNever(name);\n }\n}\n\nfunction optionalQuery(\n values: Readonly<Record<string, string | number | undefined>>,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(values)\n .filter((entry): entry is [string, string | number] => entry[1] !== undefined)\n .map(([key, value]) => [key, String(value)]),\n );\n}\n\nfunction assertNever(value: never): never {\n throw new CmsAutomationError(`Unknown automation tool: ${String(value)}`);\n}\n","type Property = Readonly<Record<string, unknown>>;\n\nconst string = (description: string): Property => ({ type: \"string\", description });\nconst number = (description: string): Property => ({ type: \"number\", description });\nconst boolean = (description: string): Property => ({ type: \"boolean\", description });\nconst object = (description: string): Property => ({ type: \"object\", description });\nconst nullableString = (description: string): Property => ({\n type: [\"string\", \"null\"],\n description,\n});\nconst enumValue = (values: readonly string[]): Property => ({ type: \"string\", enum: values });\nconst strings = (description: string): Property => ({\n type: \"array\",\n items: { type: \"string\" },\n description,\n});\n\nexport const MANAGEMENT_TOOL_DEFINITIONS = [\n tool(\"listCmsContentModels\", \"페이지·글·정보 콘텐츠 모델과 사용량을 조회합니다.\", {\n siteId: string(\"사이트 ID\"),\n state: enumValue([\"active\", \"inactive\"]),\n preset: enumValue([\"page\", \"article\", \"entity\", \"none\"]),\n source: enumValue([\"code\", \"site\"]),\n }),\n tool(\"getCmsContentModel\", \"콘텐츠 모델 한 건을 modelKey로 조회합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n }, [\"modelKey\"]),\n tool(\"createCmsContentModel\", \"사이트 소유 article 또는 entity 모델을 만듭니다.\", {\n siteId: string(\"사이트 ID\"), key: string(\"콘텐츠 모델 key\"),\n label: string(\"표시 이름\"), cardinality: enumValue([\"singleton\", \"collection\"]),\n preset: { type: [\"string\", \"null\"], enum: [\"article\", \"entity\", null] },\n presentation: object(\"표시 경로 계약\"), publication: object(\"발행 정책\"),\n compatibilityCollectionKey: nullableString(\"이전 collection key\"),\n definition: object(\"추가 모델 정의\"),\n }, [\"key\", \"label\", \"cardinality\", \"preset\", \"presentation\"]),\n tool(\"updateCmsContentModel\", \"사이트 모델의 구조 또는 모델 상태를 수정합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n expectedUpdatedAt: string(\"현재 updated_at\"), label: string(\"표시 이름\"),\n cardinality: enumValue([\"singleton\", \"collection\"]),\n preset: { type: [\"string\", \"null\"], enum: [\"article\", \"entity\", null] },\n state: enumValue([\"active\", \"inactive\"]), presentation: object(\"표시 경로 계약\"),\n publication: object(\"발행 정책\"),\n compatibilityCollectionKey: nullableString(\"이전 collection key\"),\n definition: object(\"추가 모델 정의\"),\n }, [\"modelKey\", \"expectedUpdatedAt\"]),\n tool(\"activateCmsContentModel\", \"콘텐츠 모델을 활성화합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n }, [\"modelKey\"]),\n tool(\"deactivateCmsContentModel\", \"콘텐츠 모델을 비활성화합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n }, [\"modelKey\"]),\n tool(\"deleteCmsContentModel\", \"사용하지 않는 사이트 모델을 삭제합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n }, [\"modelKey\"]),\n tool(\"listCmsFieldGroups\", \"모델에 연결된 code·site 필드 그룹을 조회합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n }, [\"modelKey\"]),\n tool(\"getCmsFieldGroup\", \"필드 그룹 한 건을 조회합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"),\n }, [\"modelKey\", \"groupKey\"]),\n tool(\"createCmsFieldGroup\", \"사이트 소유 필드 그룹을 만듭니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"), title: string(\"표시 이름\"),\n definition: object(\"필드 정의\"),\n }, [\"modelKey\", \"groupKey\", \"title\", \"definition\"]),\n tool(\"updateCmsFieldGroup\", \"사이트 필드 그룹을 수정합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"), expectedUpdatedAt: string(\"현재 updated_at\"),\n title: string(\"표시 이름\"), active: boolean(\"활성 상태\"),\n definition: object(\"필드 정의\"),\n }, [\"modelKey\", \"groupKey\", \"expectedUpdatedAt\"]),\n tool(\"activateCmsFieldGroup\", \"필드 그룹을 활성화합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"),\n }, [\"modelKey\", \"groupKey\"]),\n tool(\"deactivateCmsFieldGroup\", \"필드 그룹을 비활성화합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"),\n }, [\"modelKey\", \"groupKey\"]),\n tool(\"deleteCmsFieldGroup\", \"사용하지 않는 사이트 필드 그룹을 삭제합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"),\n }, [\"modelKey\", \"groupKey\"]),\n tool(\"listCmsExposureSlots\", \"연결된 FRONT가 선언한 노출 슬롯을 조회합니다.\", {\n siteId: string(\"사이트 ID\"),\n }),\n tool(\"listCmsExposures\", \"초안·발행·보관 노출 캠페인을 조회합니다.\", {\n siteId: string(\"사이트 ID\"), kind: enumValue([\"banner\", \"popup\"]),\n status: enumValue([\"draft\", \"published\", \"archived\"]),\n }),\n tool(\"getCmsExposure\", \"노출 캠페인 한 건을 조회합니다.\", {\n exposureId: string(\"노출 캠페인 ID\"), siteId: string(\"사이트 ID\"),\n }, [\"exposureId\"]),\n tool(\"createCmsExposure\", \"FRONT 슬롯 계약에 맞는 노출 캠페인 초안을 만듭니다.\", {\n siteId: string(\"사이트 ID\"), slotKey: string(\"노출 슬롯 key\"),\n kind: enumValue([\"banner\", \"popup\"]), content: object(\"노출 콘텐츠\"),\n startsAt: nullableString(\"시작 ISO 시각\"), endsAt: nullableString(\"종료 ISO 시각\"),\n targetPaths: strings(\"대상 경로\"), priority: number(\"우선순위\"),\n repeat: enumValue([\"always\", \"session\", \"day\", \"never\"]),\n }, [\"slotKey\", \"kind\", \"content\", \"startsAt\", \"endsAt\", \"targetPaths\", \"priority\", \"repeat\"]),\n tool(\"updateCmsExposure\", \"노출 캠페인을 낙관적 잠금으로 수정합니다.\", {\n exposureId: string(\"노출 캠페인 ID\"), expectedVersion: number(\"현재 version\"),\n siteId: string(\"사이트 ID\"), slotKey: string(\"노출 슬롯 key\"),\n kind: enumValue([\"banner\", \"popup\"]), content: object(\"노출 콘텐츠\"),\n startsAt: nullableString(\"시작 ISO 시각\"), endsAt: nullableString(\"종료 ISO 시각\"),\n targetPaths: strings(\"대상 경로\"), priority: number(\"우선순위\"),\n repeat: enumValue([\"always\", \"session\", \"day\", \"never\"]),\n }, [\"exposureId\", \"expectedVersion\", \"slotKey\", \"kind\", \"content\", \"startsAt\", \"endsAt\", \"targetPaths\", \"priority\", \"repeat\"]),\n tool(\"publishCmsExposure\", \"노출 캠페인을 발행하고 겹침 경고를 반환합니다.\", {\n exposureId: string(\"노출 캠페인 ID\"), siteId: string(\"사이트 ID\"),\n }, [\"exposureId\"]),\n tool(\"archiveCmsExposure\", \"노출 캠페인을 보관합니다.\", {\n exposureId: string(\"노출 캠페인 ID\"), siteId: string(\"사이트 ID\"),\n }, [\"exposureId\"]),\n] as const;\n\nexport type ManagementToolName = (typeof MANAGEMENT_TOOL_DEFINITIONS)[number][\"name\"];\n\nexport function isManagementToolName(name: string): name is ManagementToolName {\n return MANAGEMENT_TOOL_DEFINITIONS.some((definition) => definition.name === name);\n}\n\nfunction tool<const TName extends string>(\n name: TName,\n description: string,\n properties: Readonly<Record<string, Property>>,\n required: readonly string[] = [],\n) {\n return {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n additionalProperties: false,\n },\n } as const;\n}\n","import { z } from \"zod\";\n\nconst SiteId = z.string().min(1).optional();\nconst Key = z.string().min(1);\nconst DateTime = z.string().datetime({ offset: true });\nconst JsonObject = z.record(z.string(), z.unknown());\n\nexport const ModelRefInput = z.object({ modelKey: Key, siteId: SiteId }).strict();\nexport const ListModelsInput = z.object({\n siteId: SiteId,\n state: z.enum([\"active\", \"inactive\"]).optional(),\n preset: z.enum([\"page\", \"article\", \"entity\", \"none\"]).optional(),\n source: z.enum([\"code\", \"site\"]).optional(),\n}).strict();\nexport const CreateModelInput = z.object({\n siteId: SiteId,\n key: Key,\n label: z.string().min(1),\n cardinality: z.enum([\"singleton\", \"collection\"]),\n preset: z.enum([\"article\", \"entity\"]).nullable(),\n presentation: JsonObject,\n publication: JsonObject.nullable().optional(),\n compatibilityCollectionKey: z.string().nullable().optional(),\n definition: JsonObject.optional(),\n}).strict();\nexport const UpdateModelInput = z.object({\n modelKey: Key,\n siteId: SiteId,\n expectedUpdatedAt: DateTime,\n label: z.string().min(1).optional(),\n cardinality: z.enum([\"singleton\", \"collection\"]).optional(),\n preset: z.enum([\"article\", \"entity\"]).nullable().optional(),\n state: z.enum([\"active\", \"inactive\"]).optional(),\n presentation: JsonObject.optional(),\n publication: JsonObject.nullable().optional(),\n compatibilityCollectionKey: z.string().nullable().optional(),\n definition: JsonObject.optional(),\n}).strict();\n\nexport const FieldRefInput = z.object({\n modelKey: Key, groupKey: Key, siteId: SiteId,\n}).strict();\nexport const CreateFieldInput = FieldRefInput.extend({\n title: z.string().min(1), definition: JsonObject,\n}).strict();\nexport const UpdateFieldInput = FieldRefInput.extend({\n expectedUpdatedAt: DateTime,\n title: z.string().min(1).optional(),\n active: z.boolean().optional(),\n definition: JsonObject.optional(),\n}).strict();\n\nexport const SiteInput = z.object({ siteId: SiteId }).strict();\nexport const ListExposuresInput = SiteInput.extend({\n kind: z.enum([\"banner\", \"popup\"]).optional(),\n status: z.enum([\"draft\", \"published\", \"archived\"]).optional(),\n}).strict();\nexport const ExposureRefInput = z.object({ exposureId: Key, siteId: SiteId }).strict();\nconst ExposureFields = {\n slotKey: Key,\n kind: z.enum([\"banner\", \"popup\"]),\n content: z.object({\n variant: Key,\n eyebrow: z.string().optional(),\n title: z.string().min(1),\n description: z.string().optional(),\n assetUrl: z.string().url().optional(),\n assetAlt: z.string().optional(),\n linkLabel: z.string().optional(),\n linkUrl: z.string().optional(),\n }).strict(),\n startsAt: DateTime.nullable(),\n endsAt: DateTime.nullable(),\n targetPaths: z.array(z.string().startsWith(\"/\")).min(1),\n priority: z.number().int().min(-1000).max(1000),\n repeat: z.enum([\"always\", \"session\", \"day\", \"never\"]),\n} as const;\nexport const CreateExposureInput = z.object({ siteId: SiteId, ...ExposureFields }).strict();\nexport const UpdateExposureInput = z.object({\n exposureId: Key,\n expectedVersion: z.number().int().positive(),\n siteId: SiteId,\n ...ExposureFields,\n}).strict();\n\nexport const VersionResponse = z.object({ version: z.number().int().positive() }).passthrough();\nexport const UpdatedAtResponse = z.object({ updated_at: DateTime.nullable() }).passthrough();\n","import { CmsAutomationError, requestRootTaleApi } from \"./api.js\";\nimport {\n type ManagementToolName,\n MANAGEMENT_TOOL_DEFINITIONS,\n isManagementToolName,\n} from \"./management-definitions.js\";\nimport {\n CreateExposureInput,\n CreateFieldInput,\n CreateModelInput,\n ExposureRefInput,\n FieldRefInput,\n ListExposuresInput,\n ListModelsInput,\n ModelRefInput,\n SiteInput,\n UpdateExposureInput,\n UpdatedAtResponse,\n UpdateFieldInput,\n UpdateModelInput,\n VersionResponse,\n} from \"./management-schemas.js\";\n\nexport { MANAGEMENT_TOOL_DEFINITIONS, isManagementToolName };\n\nexport async function callManagementTool(\n name: ManagementToolName,\n args: Record<string, unknown>,\n): Promise<unknown> {\n switch (name) {\n case \"listCmsContentModels\": {\n const input = ListModelsInput.parse(args);\n return get(\"/v1/cms/content-models\", {\n site_id: input.siteId,\n state: input.state,\n preset: input.preset,\n source: input.source,\n });\n }\n case \"getCmsContentModel\": {\n const input = ModelRefInput.parse(args);\n return get(modelPath(input.modelKey), { site_id: input.siteId });\n }\n case \"createCmsContentModel\": {\n const input = CreateModelInput.parse(args);\n return requestRootTaleApi({\n method: \"POST\",\n pathname: \"/v1/cms/content-models\",\n body: modelBody(input),\n });\n }\n case \"updateCmsContentModel\": {\n const input = UpdateModelInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: modelPath(input.modelKey),\n body: {\n site_id: input.siteId,\n expected_updated_at: input.expectedUpdatedAt,\n label: input.label,\n cardinality: input.cardinality,\n preset: input.preset,\n state: input.state,\n presentation: input.presentation,\n publication: input.publication,\n compatibility_collection_key: input.compatibilityCollectionKey,\n definition: input.definition,\n },\n });\n }\n case \"activateCmsContentModel\":\n case \"deactivateCmsContentModel\": {\n const input = ModelRefInput.parse(args);\n const current = UpdatedAtResponse.parse(\n await get(modelPath(input.modelKey), { site_id: input.siteId }),\n );\n if (!current.updated_at) throw new CmsAutomationError(\"모델 updated_at이 없습니다\");\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: modelPath(input.modelKey),\n body: {\n site_id: input.siteId,\n expected_updated_at: current.updated_at,\n state: name === \"activateCmsContentModel\" ? \"active\" : \"inactive\",\n },\n });\n }\n case \"deleteCmsContentModel\": {\n const input = ModelRefInput.parse(args);\n const current = UpdatedAtResponse.parse(\n await get(modelPath(input.modelKey), { site_id: input.siteId }),\n );\n if (!current.updated_at) throw new CmsAutomationError(\"모델 updated_at이 없습니다\");\n return requestRootTaleApi({\n method: \"DELETE\",\n pathname: modelPath(input.modelKey),\n query: optionalQuery({\n site_id: input.siteId,\n expected_updated_at: current.updated_at,\n }),\n });\n }\n case \"listCmsFieldGroups\": {\n const input = ModelRefInput.parse(args);\n return get(`${modelPath(input.modelKey)}/field-groups`, { site_id: input.siteId });\n }\n case \"getCmsFieldGroup\": {\n const input = FieldRefInput.parse(args);\n return get(fieldPath(input.modelKey, input.groupKey), { site_id: input.siteId });\n }\n case \"createCmsFieldGroup\": {\n const input = CreateFieldInput.parse(args);\n return requestRootTaleApi({\n method: \"POST\",\n pathname: `${modelPath(input.modelKey)}/field-groups`,\n body: {\n site_id: input.siteId,\n key: input.groupKey,\n title: input.title,\n definition: input.definition,\n },\n });\n }\n case \"updateCmsFieldGroup\": {\n const input = UpdateFieldInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: fieldPath(input.modelKey, input.groupKey),\n body: {\n site_id: input.siteId,\n expected_updated_at: input.expectedUpdatedAt,\n title: input.title,\n active: input.active,\n definition: input.definition,\n },\n });\n }\n case \"activateCmsFieldGroup\":\n case \"deactivateCmsFieldGroup\": {\n const input = FieldRefInput.parse(args);\n const current = UpdatedAtResponse.parse(\n await get(fieldPath(input.modelKey, input.groupKey), { site_id: input.siteId }),\n );\n if (!current.updated_at) {\n throw new CmsAutomationError(\"code 필드 그룹의 상태는 API로 바꿀 수 없습니다\");\n }\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: fieldPath(input.modelKey, input.groupKey),\n body: {\n site_id: input.siteId,\n expected_updated_at: current.updated_at,\n active: name === \"activateCmsFieldGroup\",\n },\n });\n }\n case \"deleteCmsFieldGroup\": {\n const input = FieldRefInput.parse(args);\n const current = UpdatedAtResponse.parse(\n await get(fieldPath(input.modelKey, input.groupKey), { site_id: input.siteId }),\n );\n if (!current.updated_at) {\n throw new CmsAutomationError(\"code 필드 그룹은 삭제할 수 없습니다\");\n }\n return requestRootTaleApi({\n method: \"DELETE\",\n pathname: fieldPath(input.modelKey, input.groupKey),\n query: optionalQuery({\n site_id: input.siteId,\n expected_updated_at: current.updated_at,\n }),\n });\n }\n case \"listCmsExposureSlots\": {\n const input = SiteInput.parse(args);\n return get(\"/v1/cms/exposure-slots\", { site_id: input.siteId });\n }\n case \"listCmsExposures\": {\n const input = ListExposuresInput.parse(args);\n return get(\"/v1/cms/exposures\", {\n site_id: input.siteId,\n kind: input.kind,\n status: input.status,\n });\n }\n case \"getCmsExposure\": {\n const input = ExposureRefInput.parse(args);\n return get(exposurePath(input.exposureId), { site_id: input.siteId });\n }\n case \"createCmsExposure\": {\n const input = CreateExposureInput.parse(args);\n return requestRootTaleApi({\n method: \"POST\",\n pathname: \"/v1/cms/exposures\",\n body: exposureBody(input),\n });\n }\n case \"updateCmsExposure\": {\n const input = UpdateExposureInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: exposurePath(input.exposureId),\n body: {\n ...exposureBody(input),\n expected_version: input.expectedVersion,\n },\n });\n }\n case \"publishCmsExposure\":\n case \"archiveCmsExposure\": {\n const input = ExposureRefInput.parse(args);\n const current = VersionResponse.parse(\n await get(exposurePath(input.exposureId), { site_id: input.siteId }),\n );\n const action = name === \"publishCmsExposure\" ? \"publish\" : \"archive\";\n return requestRootTaleApi({\n method: \"POST\",\n pathname: `${exposurePath(input.exposureId)}/${action}`,\n body: { site_id: input.siteId, expected_version: current.version },\n });\n }\n default:\n return assertNever(name);\n }\n}\n\nfunction get(pathname: string, query: Record<string, string | undefined>): Promise<unknown> {\n return requestRootTaleApi({ method: \"GET\", pathname, query: optionalQuery(query) });\n}\n\nfunction modelPath(modelKey: string): string {\n return `/v1/cms/content-models/${encodeURIComponent(modelKey)}`;\n}\n\nfunction fieldPath(modelKey: string, groupKey: string): string {\n return `${modelPath(modelKey)}/field-groups/${encodeURIComponent(groupKey)}`;\n}\n\nfunction exposurePath(exposureId: string): string {\n return `/v1/cms/exposures/${encodeURIComponent(exposureId)}`;\n}\n\nfunction modelBody(input: typeof CreateModelInput._output) {\n return {\n site_id: input.siteId,\n key: input.key,\n label: input.label,\n cardinality: input.cardinality,\n preset: input.preset,\n presentation: input.presentation,\n publication: input.publication,\n compatibility_collection_key: input.compatibilityCollectionKey,\n definition: input.definition,\n };\n}\n\nfunction exposureBody(input: typeof CreateExposureInput._output) {\n return {\n site_id: input.siteId,\n slot_key: input.slotKey,\n kind: input.kind,\n content: {\n variant: input.content.variant,\n eyebrow: input.content.eyebrow,\n title: input.content.title,\n description: input.content.description,\n asset_url: input.content.assetUrl,\n asset_alt: input.content.assetAlt,\n link_label: input.content.linkLabel,\n link_url: input.content.linkUrl,\n },\n starts_at: input.startsAt,\n ends_at: input.endsAt,\n target_paths: input.targetPaths,\n priority: input.priority,\n repeat: input.repeat,\n };\n}\n\nfunction optionalQuery(\n values: Readonly<Record<string, string | undefined>>,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(values).filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n}\n\nfunction assertNever(value: never): never {\n throw new CmsAutomationError(`Unknown management tool: ${String(value)}`);\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\n\nimport { registerTools } from \"./tools.js\";\n\n// tsup define 으로 빌드타임 주입 — 비번들 실행(vitest 등)에서는 \"dev\".\ndeclare const __CMS_MCP_VERSION__: string | undefined;\nconst VERSION =\n typeof __CMS_MCP_VERSION__ === \"string\" ? __CMS_MCP_VERSION__ : \"dev\";\n\nexport const SERVER_INSTRUCTIONS = `\nroottale-cms-mcp는 RootTale CMS를 외부 사이트(주로 Next.js)에 연동하고\n글·썸네일·본문 이미지를 자동화하기 위한 문서·예시 코드·API tool을 제공합니다.\n\n지켜야 할 규칙:\n- RootTale 연동 관련 작업은 가장 먼저 listRootTaleDocs를 호출해 문서 목록을 파악하세요.\n- 연동 코드를 작성하기 전 반드시 readRootTaleNextjsExampleCode를 호출해 예시 코드를\n 참고한 후 그 패턴을 따라 작성하세요.\n- API 키(rtlk_cust_*)는 서버 전용입니다. NEXT_PUBLIC_* 등 브라우저로 노출되는\n 환경변수에 절대 넣지 마세요.\n- 글쓰기 전에 getSiteKnowledge로 브랜드 보이스와 용어 규칙을 확인하세요.\n- 새 글은 기본적으로 draft로 만들고, 사용자가 즉시 발행을 명시했을 때만\n publish=true 또는 publishCmsPost를 사용하세요.\n- 이미지는 uploadCmsMedia로 먼저 등록한 뒤 반환된 id를 featuredMediaId에,\n 반환된 URL을 Tiptap image 노드의 attrs.src에 사용하세요.\n- 글을 수정하거나 발행하기 전 analyzeCmsPostSeo로 SEO와 가독성을 확인하세요.\n- 개선할 글을 찾을 때 getCmsPostSeoScores를, 실제 유입 검색어를 고를 때\n getTopSeoKeywords를 사용하세요.\n- 이미 학습된 내용이더라도 본 서버의 문서로 더블체크 후 작업하세요.\n`.trim();\n\nexport function createServer(): Server {\n const server = new Server(\n { name: \"roottale-cms\", version: VERSION },\n { capabilities: { tools: {} }, instructions: SERVER_INSTRUCTIONS },\n );\n registerTools(server);\n return server;\n}\n","import type { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n CallToolRequestSchema,\n ErrorCode,\n ListToolsRequestSchema,\n McpError,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\n\nimport {\n AUTOMATION_TOOL_DEFINITIONS,\n callAutomationTool,\n isAutomationToolName,\n} from \"./automation-tools.js\";\nimport { requestRootTaleApi } from \"./api.js\";\nimport { listDocs, readDoc, readNextjsExampleCode, searchDocs } from \"./docs.js\";\nimport {\n callManagementTool,\n isManagementToolName,\n MANAGEMENT_TOOL_DEFINITIONS,\n} from \"./management-tools.js\";\nimport {\n callSeoTool,\n isSeoToolName,\n SEO_TOOL_DEFINITIONS,\n} from \"./seo-tools.js\";\n\nconst ReadDocInput = z.object({ path: z.string().min(1) }).strict();\nconst SearchDocsInput = z.object({ query: z.string().min(1) }).strict();\nconst ListPostsInput = z\n .object({\n limit: z.number().int().min(1).max(100).optional(),\n type: z.enum([\"post\", \"page\"]).optional(),\n cursor: z.string().optional(),\n })\n .strict();\nconst GetPostInput = z.object({ slugOrId: z.string().min(1) }).strict();\nconst GetSiteKnowledgeInput = z\n .object({ siteId: z.string().optional() })\n .strict();\n\nconst DOCUMENTATION_TOOL_DEFINITIONS = [\n {\n name: \"listRootTaleDocs\",\n description:\n \"RootTale CMS 통합 문서 전체 목록(경로·제목·설명)을 반환합니다. \" +\n \"RootTale 연동 작업을 시작하기 전 가장 먼저 호출하세요.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"readRootTaleDoc\",\n description:\n \"RootTale CMS 통합 문서 1개를 경로로 읽습니다. \" +\n \"경로는 listRootTaleDocs 가 반환한 path 값을 사용하세요.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"문서 경로 (예: blog.md)\" },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"searchRootTaleDocs\",\n description:\n \"RootTale CMS 통합 문서 전체에서 정규식으로 검색합니다 (대소문자 무시). \" +\n \"매치된 파일 경로·라인 번호·라인 내용을 반환합니다.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"정규식 패턴 (예: revalidate|webhook)\" },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"readRootTaleNextjsExampleCode\",\n description:\n \"RootTale CMS를 외부 Next.js(App Router) 사이트에 연동하는 완전한 예시 코드 세트를 반환합니다 \" +\n \"(블로그 목록/상세, 웹훅 revalidate 라우트, RSS/사이트맵, 상담문의 서버 액션 등). \" +\n \"연동 코드를 작성하기 전 반드시 호출해 패턴을 따라 작성하세요.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"listPublishedPosts\",\n description:\n \"연동 검증용 — RootTale 공개 CMS API(GET /v1/cms/public/posts)로 발행된 글 목록을 조회합니다. \" +\n \"환경변수 ROOTTALE_API_KEY(rtlk_cust_*)가 필요합니다.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"1-100, 기본 20\" },\n type: { type: \"string\", enum: [\"post\", \"page\"] },\n cursor: { type: \"string\", description: \"이전 응답의 next_cursor\" },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"getPublishedPost\",\n description:\n \"연동 검증용 — RootTale 공개 CMS API(GET /v1/cms/public/posts/:identifier)로 발행된 글 1개를 \" +\n \"slug 또는 UUID로 조회합니다. 환경변수 ROOTTALE_API_KEY(rtlk_cust_*)가 필요합니다.\",\n inputSchema: {\n type: \"object\",\n properties: {\n slugOrId: { type: \"string\", description: \"글 slug 또는 UUID\" },\n },\n required: [\"slugOrId\"],\n additionalProperties: false,\n },\n },\n {\n name: \"getSiteKnowledge\",\n description:\n \"이 RootTale 사이트의 브랜드 보이스(어조·톤·화자)와 용어 규칙(금지어·교정어)을 조회합니다 \" +\n \"(GET /v1/cms/public/site-knowledge). 이 사이트에 맞는 글을 쓰기 전에 호출해 톤·표현을 맞추세요. \" +\n \"금지어는 쓰지 말고, 교정어는 권장 표현으로 바꿔 쓰세요. 환경변수 ROOTTALE_API_KEY(rtlk_cust_*)가 필요합니다.\",\n inputSchema: {\n type: \"object\",\n properties: {\n siteId: {\n type: \"string\",\n description: \"사이트 ID (선택, 미설정 시 기본 사이트)\",\n },\n },\n additionalProperties: false,\n },\n },\n] as const;\n\nexport const TOOL_DEFINITIONS = [\n ...DOCUMENTATION_TOOL_DEFINITIONS,\n ...AUTOMATION_TOOL_DEFINITIONS,\n ...MANAGEMENT_TOOL_DEFINITIONS,\n ...SEO_TOOL_DEFINITIONS,\n] as const;\n\nfunction textResponse(text: string) {\n return { content: [{ type: \"text\" as const, text }] };\n}\n\nfunction jsonResponse(value: unknown) {\n return textResponse(JSON.stringify(value, null, 2));\n}\n\nexport function registerTools(server: Server): void {\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOL_DEFINITIONS.map((t) => ({ ...t })),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const args = (request.params.arguments ?? {}) as Record<string, unknown>;\n try {\n if (isAutomationToolName(request.params.name)) {\n return jsonResponse(\n await callAutomationTool(request.params.name, args),\n );\n }\n if (isSeoToolName(request.params.name)) {\n return jsonResponse(await callSeoTool(request.params.name, args));\n }\n if (isManagementToolName(request.params.name)) {\n return jsonResponse(await callManagementTool(request.params.name, args));\n }\n switch (request.params.name) {\n case \"listRootTaleDocs\":\n return jsonResponse(await listDocs());\n case \"readRootTaleDoc\": {\n const input = ReadDocInput.parse(args);\n const content = await readDoc(input.path);\n if (content === null) {\n throw new McpError(\n ErrorCode.InvalidParams,\n `문서를 찾을 수 없습니다: ${input.path} — listRootTaleDocs로 경로를 확인하세요.`,\n );\n }\n return textResponse(content);\n }\n case \"searchRootTaleDocs\": {\n const input = SearchDocsInput.parse(args);\n return jsonResponse(await searchDocs(input.query));\n }\n case \"readRootTaleNextjsExampleCode\":\n return textResponse(await readNextjsExampleCode());\n case \"listPublishedPosts\": {\n const input = ListPostsInput.parse(args);\n const params: Record<string, string> = {};\n if (input.limit) params.limit = String(input.limit);\n if (input.type) params.type = input.type;\n if (input.cursor) params.cursor = input.cursor;\n return jsonResponse(\n await requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/public/posts\",\n query: params,\n }),\n );\n }\n case \"getPublishedPost\": {\n const input = GetPostInput.parse(args);\n return jsonResponse(\n await requestRootTaleApi({\n method: \"GET\",\n pathname: `/v1/cms/public/posts/${encodeURIComponent(input.slugOrId)}`,\n }),\n );\n }\n case \"getSiteKnowledge\": {\n const input = GetSiteKnowledgeInput.parse(args);\n const params: Record<string, string> = {};\n if (input.siteId) params.site_id = input.siteId;\n return jsonResponse(\n await requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/public/site-knowledge\",\n query: params,\n }),\n );\n }\n default:\n throw new McpError(\n ErrorCode.InvalidParams,\n `Unknown RootTale tool: ${request.params.name}`,\n );\n }\n } catch (error) {\n if (error instanceof McpError) throw error;\n const message = error instanceof Error ? error.message : String(error);\n return { isError: true, content: [{ type: \"text\" as const, text: message }] };\n }\n });\n}\n","/**\n * 패키지에 번들된 통합 문서(`docs/`)·예시 코드(`examples/`) 로더.\n *\n * dist/index.js 와 src/docs.ts 모두 패키지 루트에서 한 단계 아래이므로\n * `..` 상대 경로 해석이 빌드 전후 동일하다. npm publish 시 `files` 에\n * docs/, examples/ 가 포함되어 npx 환경에서도 같은 구조로 설치된다.\n */\nimport { readdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst PKG_ROOT = fileURLToPath(new URL(\"..\", import.meta.url));\nconst DOCS_ROOT = path.join(PKG_ROOT, \"docs\");\nconst EXAMPLES_ROOT = path.join(PKG_ROOT, \"examples\");\n\nexport interface DocEntry {\n /** docs/ 기준 상대 경로 (예: \"blog.md\"). */\n path: string;\n title: string;\n description: string;\n}\n\ninterface Frontmatter {\n title: string;\n description: string;\n}\n\n/** `---\\ntitle: ...\\ndescription: ...\\n---` 형태의 단순 frontmatter 파서. */\nexport function parseFrontmatter(markdown: string): Frontmatter {\n const result: Frontmatter = { title: \"\", description: \"\" };\n const match = markdown.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return result;\n for (const line of match[1].split(\"\\n\")) {\n const idx = line.indexOf(\":\");\n if (idx === -1) continue;\n const key = line.slice(0, idx).trim();\n const value = line.slice(idx + 1).trim();\n if (key === \"title\") result.title = value;\n if (key === \"description\") result.description = value;\n }\n return result;\n}\n\nasync function walkFiles(root: string, dir = root): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkFiles(root, full)));\n } else {\n files.push(path.relative(root, full));\n }\n }\n return files.sort();\n}\n\nexport async function listDocs(): Promise<DocEntry[]> {\n const files = (await walkFiles(DOCS_ROOT)).filter((f) => f.endsWith(\".md\"));\n return Promise.all(\n files.map(async (rel) => {\n const content = await readFile(path.join(DOCS_ROOT, rel), \"utf8\");\n const fm = parseFrontmatter(content);\n return { path: rel, title: fm.title || rel, description: fm.description };\n }),\n );\n}\n\n/** 경로 탈출(../) 방지 후 단일 문서 읽기. 없으면 null. */\nexport async function readDoc(relPath: string): Promise<string | null> {\n const resolved = path.resolve(DOCS_ROOT, relPath);\n if (!resolved.startsWith(DOCS_ROOT + path.sep)) return null;\n try {\n return await readFile(resolved, \"utf8\");\n } catch {\n return null;\n }\n}\n\nexport interface SearchMatch {\n path: string;\n line: number;\n text: string;\n}\n\n/** 모든 문서에 대해 정규식 검색 (대소문자 무시). 매치 라인을 반환. */\nexport async function searchDocs(query: string): Promise<SearchMatch[]> {\n const regex = new RegExp(query, \"i\");\n const matches: SearchMatch[] = [];\n for (const doc of await listDocs()) {\n const content = await readDoc(doc.path);\n if (!content) continue;\n content.split(\"\\n\").forEach((text, idx) => {\n if (regex.test(text)) {\n matches.push({ path: doc.path, line: idx + 1, text: text.trim() });\n }\n });\n }\n return matches;\n}\n\n/**\n * Next.js 통합 예시 코드 전체를 `--- FILE: <path> ---` 헤더로 이어붙여 반환.\n * 파일 수가 적어(통합 1세트) 한 번에 주는 쪽이 에이전트 왕복을 줄인다.\n */\nexport async function readNextjsExampleCode(): Promise<string> {\n const root = path.join(EXAMPLES_ROOT, \"nextjs\");\n const files = await walkFiles(root);\n const sections = await Promise.all(\n files.map(async (rel) => {\n const content = await readFile(path.join(root, rel), \"utf8\");\n return `--- FILE: ${rel} ---\\n${content}`;\n }),\n );\n return sections.join(\"\\n\\n\");\n}\n","import { z } from \"zod\";\n\nimport { requestRootTaleApi } from \"./api.js\";\nimport {\n isSeoToolName,\n SEO_TOOL_DEFINITIONS,\n type SeoToolName,\n} from \"./seo-definitions.js\";\n\nconst SiteIdInput = z.object({ siteId: z.string().optional() });\n\nconst TopKeywordsInput = SiteIdInput.extend({\n dateRange: z\n .enum([\n \"last_7_days\",\n \"last_30_days\",\n \"last_3_months\",\n \"last_6_months\",\n \"last_12_months\",\n ])\n .optional(),\n limit: z.number().int().min(1).max(100).optional(),\n}).strict();\n\nconst AnalyzePostInput = SiteIdInput.extend({\n postId: z.string().min(1),\n focusKeyword: z.string().max(200).optional(),\n}).strict();\n\nconst ScoresInput = SiteIdInput.extend({\n limit: z.number().int().min(1).max(100).optional(),\n type: z.enum([\"post\", \"page\"]).optional(),\n seoFilter: z.enum([\"bad\", \"ok\", \"good\", \"empty_keyword\"]).optional(),\n}).strict();\n\nexport { isSeoToolName, SEO_TOOL_DEFINITIONS };\n\nexport async function callSeoTool(\n name: SeoToolName,\n args: Record<string, unknown>,\n): Promise<unknown> {\n switch (name) {\n case \"getTopSeoKeywords\": {\n const input = TopKeywordsInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/seo/keywords\",\n query: optionalQuery({\n site_id: input.siteId,\n date_range: input.dateRange,\n limit: input.limit,\n }),\n });\n }\n case \"analyzeCmsPostSeo\": {\n const input = AnalyzePostInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname:\n `/v1/cms/seo/posts/${encodeURIComponent(input.postId)}/analysis`,\n query: optionalQuery({\n site_id: input.siteId,\n focus_keyword: input.focusKeyword,\n }),\n });\n }\n case \"getCmsPostSeoScores\": {\n const input = ScoresInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/seo/scores\",\n query: optionalQuery({\n site_id: input.siteId,\n limit: input.limit,\n type: input.type,\n seo_filter: input.seoFilter,\n }),\n });\n }\n }\n}\n\nfunction optionalQuery(\n values: Readonly<Record<string, string | number | undefined>>,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(values)\n .filter(\n (entry): entry is [string, string | number] =>\n entry[1] !== undefined,\n )\n .map(([key, value]) => [key, String(value)]),\n );\n}\n","type JsonSchemaProperty = Readonly<Record<string, unknown>>;\n\nconst DATE_RANGES = [\n \"last_7_days\",\n \"last_30_days\",\n \"last_3_months\",\n \"last_6_months\",\n \"last_12_months\",\n] as const;\n\nexport const SEO_TOOL_DEFINITIONS = [\n tool(\n \"getTopSeoKeywords\",\n \"Google Search Console에서 사이트의 상위 검색어와 클릭·노출·CTR·평균 순위를 조회합니다.\",\n {\n siteId: stringProperty(\"사이트 ID\"),\n dateRange: enumProperty(DATE_RANGES, \"조회 기간, 기본 last_30_days\"),\n limit: numberProperty(\"1-100, 기본 25\"),\n },\n ),\n tool(\n \"analyzeCmsPostSeo\",\n \"ROOT-ADMIN과 같은 규칙으로 글의 SEO와 한국어 가독성을 다시 검사합니다. 글을 수정하거나 발행하기 전에 사용하세요.\",\n {\n postId: stringProperty(\"분석할 글 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n focusKeyword: stringProperty(\"이번 분석에 사용할 집중 키워드\"),\n },\n [\"postId\"],\n ),\n tool(\n \"getCmsPostSeoScores\",\n \"발행된 글의 최신 SEO 점수와 등급을 조회합니다. 개선이 필요한 글이나 집중 키워드가 없는 글을 찾을 수 있습니다.\",\n {\n siteId: stringProperty(\"사이트 ID\"),\n limit: numberProperty(\"1-100, 기본 10\"),\n type: enumProperty([\"post\", \"page\"], \"콘텐츠 유형\"),\n seoFilter: enumProperty(\n [\"bad\", \"ok\", \"good\", \"empty_keyword\"],\n \"SEO 상태 필터\",\n ),\n },\n ),\n] as const;\n\nexport type SeoToolName = (typeof SEO_TOOL_DEFINITIONS)[number][\"name\"];\n\nexport function isSeoToolName(name: string): name is SeoToolName {\n return SEO_TOOL_DEFINITIONS.some((definition) => definition.name === name);\n}\n\nfunction tool<const TName extends string>(\n name: TName,\n description: string,\n properties: Readonly<Record<string, JsonSchemaProperty>>,\n required: readonly string[] = [],\n) {\n return {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false,\n },\n } as const;\n}\n\nfunction stringProperty(description: string): JsonSchemaProperty {\n return { type: \"string\", description };\n}\n\nfunction numberProperty(description: string): JsonSchemaProperty {\n return { type: \"number\", description };\n}\n\nfunction enumProperty(\n values: readonly string[],\n description: string,\n): JsonSchemaProperty {\n return { type: \"string\", enum: values, description };\n}\n"],"mappings":"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","names":["readFile","z","z","tool","z","SiteId","optionalQuery","assertNever","readFile","z","readFile","z","tool","stringProperty","enumProperty","numberProperty","z","optionalQuery","z"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/cli.ts","../src/api.ts","../src/automation-definitions.ts","../src/automation-media.ts","../src/automation-schemas.ts","../src/automation-tools.ts","../src/management-definitions.ts","../src/management-schemas.ts","../src/management-tools.ts","../src/server.ts","../src/tools.ts","../src/docs.ts","../src/seo-tools.ts","../src/seo-definitions.ts"],"sourcesContent":["#!/usr/bin/env node\nimport { StdioServerTransport } from \"@modelcontextprotocol/sdk/server/stdio.js\";\n\nimport { runCmsCli } from \"./cli.js\";\nimport { createServer } from \"./server.js\";\n\nif (process.argv[2] === \"cli\") {\n await runCmsCli(process.argv);\n} else {\n const server = createServer();\n const transport = new StdioServerTransport();\n await server.connect(transport);\n}\n","import { readFile } from \"node:fs/promises\";\n\nimport { Command, InvalidArgumentError } from \"commander\";\n\nimport { callAutomationTool } from \"./automation-tools.js\";\nimport { callManagementTool } from \"./management-tools.js\";\n\ntype CommonOptions = { readonly siteId?: string };\n\nexport function createCmsCli(): Command {\n const cli = new Command()\n .name(\"roottale-cms\")\n .description(\"RootTale CMS 전체 관리 자동화 CLI\");\n\n registerManagementCommands(cli);\n registerPostCommands(cli, \"entries\");\n registerPostCommands(cli, \"posts\");\n registerMediaCommands(cli);\n return cli;\n}\n\nexport async function runCmsCli(argv: readonly string[]): Promise<void> {\n try {\n await createCmsCli().parseAsync([\n argv[0] ?? \"node\",\n \"roottale-cms\",\n ...argv.slice(3),\n ]);\n } catch (error) {\n const message = error instanceof Error ? error.message : String(error);\n process.stderr.write(`${message}\\n`);\n process.exitCode = 1;\n }\n}\n\nfunction registerPostCommands(cli: Command, name: \"entries\" | \"posts\"): void {\n const posts = cli.command(name).description(\n name === \"entries\" ? \"페이지·글·정보 항목 관리\" : \"CMS 글 관리(호환 명령)\",\n );\n\n posts\n .command(\"list\")\n .description(\"초안·예약·발행 글 목록 조회\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--limit <number>\", \"조회 개수\", integer, 20)\n .option(\"--cursor <cursor>\", \"다음 페이지 커서\")\n .option(\"--type <type>\", \"post 또는 page\")\n .option(\"--status <status>\", \"draft, published, scheduled, private\")\n .option(\"--model-key <key>\", \"콘텐츠 모델 key\")\n .action(async (options) => {\n await run(\"listManagedCmsPosts\", options);\n });\n\n posts\n .command(\"get <post-id>\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .action(async (postId: string, options: CommonOptions) => {\n await run(\"getManagedCmsPost\", { postId, ...options });\n });\n\n posts\n .command(\"create\")\n .description(\"Tiptap JSON 본문으로 새 글 생성\")\n .requiredOption(\"--title <title>\", \"글 제목\")\n .requiredOption(\"--slug <slug>\", \"URL 슬러그\")\n .requiredOption(\"--body-file <path>\", \"Tiptap 본문 JSON 파일\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--type <type>\", \"post 또는 page\", \"post\")\n .option(\"--excerpt <text>\", \"요약\")\n .option(\"--featured-media-id <id>\", \"썸네일 미디어 ID\")\n .option(\"--publish\", \"즉시 발행\")\n .option(\"--scheduled-at <iso>\", \"예약 발행 ISO 시각\")\n .option(\"--category-ids <ids>\", \"쉼표로 구분한 카테고리 ID\")\n .option(\"--tag-ids <ids>\", \"쉼표로 구분한 태그 ID\")\n .option(\"--model-key <key>\", \"콘텐츠 모델 key\")\n .option(\"--field-values-file <path>\", \"모델 필드 값 JSON 파일\")\n .action(async (options) => {\n await run(\"createCmsPost\", {\n ...options,\n bodyJson: await readJsonObject(options.bodyFile),\n categoryIds: commaSeparated(options.categoryIds),\n tagIds: commaSeparated(options.tagIds),\n modelKey: options.modelKey,\n fieldValues: options.fieldValuesFile\n ? await readJsonObject(options.fieldValuesFile)\n : undefined,\n bodyFile: undefined,\n fieldValuesFile: undefined,\n });\n });\n\n posts\n .command(\"update\")\n .description(\"기존 글의 일부 필드 수정\")\n .argument(\"<post-id>\", \"글 ID\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--title <title>\", \"글 제목\")\n .option(\"--slug <slug>\", \"URL 슬러그\")\n .option(\"--body-file <path>\", \"Tiptap 본문 JSON 파일\")\n .option(\"--excerpt <text>\", \"요약\")\n .option(\"--featured-media-id <id>\", \"썸네일 미디어 ID\")\n .option(\"--clear-featured-media\", \"썸네일 연결 해제\")\n .option(\"--scheduled-at <iso>\", \"예약 발행 ISO 시각\")\n .option(\"--clear-schedule\", \"예약 해제\")\n .option(\"--field-values-file <path>\", \"모델 필드 값 JSON 파일\")\n .action(async (postId: string, options) => {\n await run(\"updateCmsPost\", {\n postId,\n siteId: options.siteId,\n title: options.title,\n slug: options.slug,\n bodyJson: options.bodyFile\n ? await readJsonObject(options.bodyFile)\n : undefined,\n excerpt: options.excerpt,\n featuredMediaId: options.clearFeaturedMedia\n ? null\n : options.featuredMediaId,\n scheduledAt: options.clearSchedule ? null : options.scheduledAt,\n fieldValues: options.fieldValuesFile\n ? await readJsonObject(options.fieldValuesFile)\n : undefined,\n });\n });\n\n lifecycle(posts, \"publish\", \"글을 즉시 발행\", \"publishCmsPost\");\n lifecycle(posts, \"unpublish\", \"발행 글을 초안으로 전환\", \"unpublishCmsPost\");\n\n posts\n .command(\"set-terms\")\n .description(\"글의 카테고리 또는 태그 전체 교체\")\n .argument(\"<post-id>\", \"글 ID\")\n .requiredOption(\"--taxonomy <type>\", \"category 또는 tag\")\n .requiredOption(\"--term-ids <ids>\", \"쉼표로 구분한 term ID\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .action(async (postId: string, options) => {\n await run(\"setCmsPostTerms\", {\n postId,\n siteId: options.siteId,\n taxonomy: options.taxonomy,\n termIds: commaSeparated(options.termIds) ?? [],\n });\n });\n\n posts\n .command(\"delete <post-id>\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--hard\", \"영구 삭제\")\n .action(async (postId: string, options) => {\n await run(\"deleteCmsPost\", { postId, ...options });\n });\n}\n\nfunction registerManagementCommands(cli: Command): void {\n const models = cli.command(\"models\").description(\"페이지·글·정보 모델 관리\");\n models.command(\"list\").option(\"--site-id <id>\").option(\"--state <state>\")\n .option(\"--preset <preset>\").option(\"--source <source>\")\n .action(async (options) => runManagement(\"listCmsContentModels\", options));\n models.command(\"get <model-key>\").option(\"--site-id <id>\")\n .action(async (modelKey: string, options) => runManagement(\"getCmsContentModel\", { modelKey, ...options }));\n inputCommand(models, \"create\", \"createCmsContentModel\");\n inputCommand(models, \"update <model-key>\", \"updateCmsContentModel\", \"modelKey\");\n refCommand(models, \"activate <model-key>\", \"activateCmsContentModel\", \"modelKey\");\n refCommand(models, \"deactivate <model-key>\", \"deactivateCmsContentModel\", \"modelKey\");\n refCommand(models, \"delete <model-key>\", \"deleteCmsContentModel\", \"modelKey\");\n\n const fields = cli.command(\"fields\").description(\"모델별 필드 그룹 관리\");\n refCommand(fields, \"list <model-key>\", \"listCmsFieldGroups\", \"modelKey\");\n twoRefCommand(fields, \"get <model-key> <group-key>\", \"getCmsFieldGroup\");\n inputCommand(fields, \"create <model-key>\", \"createCmsFieldGroup\", \"modelKey\");\n inputCommand(fields, \"update <model-key> <group-key>\", \"updateCmsFieldGroup\", \"modelKey\", \"groupKey\");\n twoRefCommand(fields, \"activate <model-key> <group-key>\", \"activateCmsFieldGroup\");\n twoRefCommand(fields, \"deactivate <model-key> <group-key>\", \"deactivateCmsFieldGroup\");\n twoRefCommand(fields, \"delete <model-key> <group-key>\", \"deleteCmsFieldGroup\");\n\n const slots = cli.command(\"exposure-slots\").description(\"FRONT 노출 슬롯 조회\");\n slots.command(\"list\").option(\"--site-id <id>\")\n .action(async (options) => runManagement(\"listCmsExposureSlots\", options));\n\n const exposures = cli.command(\"exposures\").description(\"배너·팝업 캠페인 관리\");\n exposures.command(\"list\").option(\"--site-id <id>\").option(\"--kind <kind>\")\n .option(\"--status <status>\")\n .action(async (options) => runManagement(\"listCmsExposures\", options));\n refCommand(exposures, \"get <exposure-id>\", \"getCmsExposure\", \"exposureId\");\n inputCommand(exposures, \"create\", \"createCmsExposure\");\n inputCommand(exposures, \"update <exposure-id>\", \"updateCmsExposure\", \"exposureId\");\n refCommand(exposures, \"publish <exposure-id>\", \"publishCmsExposure\", \"exposureId\");\n refCommand(exposures, \"archive <exposure-id>\", \"archiveCmsExposure\", \"exposureId\");\n inputCommand(exposures, \"save-draft <exposure-id>\", \"saveCmsExposureDraft\", \"exposureId\");\n inputCommand(exposures, \"schedule <exposure-id>\", \"updateCmsExposureSchedule\", \"exposureId\");\n inputCommand(exposures, \"preview\", \"previewCmsExposure\");\n for (const [command, toolName] of [\n [\"pause\", \"pauseCmsExposure\"], [\"resume\", \"resumeCmsExposure\"],\n [\"cancel\", \"cancelCmsExposureReservation\"], [\"duplicate\", \"duplicateCmsExposure\"],\n [\"restore\", \"restoreCmsExposure\"],\n ] as const) {\n exposures.command(`${command} <exposure-id>`).option(\"--site-id <id>\")\n .requiredOption(\"--expected-version <number>\", \"조회한 현재 version\", integer)\n .action(async (exposureId: string, options) => runManagement(toolName, { exposureId, ...options }));\n }\n}\n\ntype ManagementName = Parameters<typeof callManagementTool>[0];\n\nfunction refCommand(\n parent: Command,\n syntax: string,\n toolName: ManagementName,\n key: \"modelKey\" | \"exposureId\",\n): void {\n const command = parent.command(syntax).option(\"--site-id <id>\");\n if (key === \"exposureId\" && (toolName === \"publishCmsExposure\" || toolName === \"archiveCmsExposure\")) {\n command.option(\"--expected-version <number>\", \"조회한 현재 version\", integer);\n }\n command.action(async (value: string, options) => runManagement(toolName, { [key]: value, ...options }));\n}\n\nfunction twoRefCommand(parent: Command, syntax: string, toolName: ManagementName): void {\n parent.command(syntax).option(\"--site-id <id>\")\n .action(async (modelKey: string, groupKey: string, options) =>\n runManagement(toolName, { modelKey, groupKey, ...options }));\n}\n\nfunction inputCommand(\n parent: Command,\n syntax: string,\n toolName: ManagementName,\n firstKey?: \"modelKey\" | \"exposureId\",\n secondKey?: \"groupKey\",\n): void {\n const command = parent.command(syntax)\n .requiredOption(\"--input-file <path>\", \"요청 JSON 파일\")\n .option(\"--site-id <id>\");\n command.action(async (...values: unknown[]) => {\n const options = values.at(-2) as { inputFile: string; siteId?: string };\n const input = await readJsonObject(options.inputFile);\n const refs: Record<string, unknown> = {};\n if (firstKey) refs[firstKey] = values[0];\n if (secondKey) refs[secondKey] = values[1];\n await runManagement(toolName, { ...input, ...refs, ...(options.siteId ? { siteId: options.siteId } : {}) });\n });\n}\n\nfunction registerMediaCommands(cli: Command): void {\n const media = cli.command(\"media\").description(\"CMS 미디어 자동화\");\n\n media\n .command(\"list\")\n .description(\"미디어 라이브러리 조회\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--limit <number>\", \"조회 개수\", integer, 20)\n .option(\"--offset <number>\", \"조회 시작 위치\", integer, 0)\n .action(async (options) => {\n await run(\"listCmsMedia\", options);\n });\n\n media\n .command(\"upload\")\n .description(\"로컬 파일을 업로드하고 CMS 미디어로 등록\")\n .argument(\"<file>\", \"jpg, png, webp, gif 또는 pdf 파일\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--content-type <type>\", \"MIME type 직접 지정\")\n .option(\"--alt <text>\", \"대체 텍스트\")\n .option(\"--caption <text>\", \"캡션\")\n .action(async (filePath: string, options) => {\n await run(\"uploadCmsMedia\", { filePath, ...options });\n });\n\n media\n .command(\"update\")\n .description(\"미디어 대체 텍스트 또는 캡션 수정\")\n .argument(\"<media-id>\", \"미디어 ID\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .option(\"--alt <text>\", \"대체 텍스트\")\n .option(\"--caption <text>\", \"캡션\")\n .action(async (mediaId: string, options) => {\n await run(\"updateCmsMedia\", { mediaId, ...options });\n });\n\n media\n .command(\"delete\")\n .description(\"미디어 파일과 라이브러리 항목 삭제\")\n .argument(\"<media-id>\", \"미디어 ID\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .action(async (mediaId: string, options: CommonOptions) => {\n await run(\"deleteCmsMedia\", { mediaId, ...options });\n });\n}\n\nfunction lifecycle(\n posts: Command,\n commandName: string,\n description: string,\n toolName: \"publishCmsPost\" | \"unpublishCmsPost\",\n): void {\n posts\n .command(commandName)\n .description(description)\n .argument(\"<post-id>\", \"글 ID\")\n .option(\"--site-id <id>\", \"사이트 ID\")\n .action(async (postId: string, options: CommonOptions) => {\n await run(toolName, { postId, ...options });\n });\n}\n\nasync function run(\n name: Parameters<typeof callAutomationTool>[0],\n args: Record<string, unknown>,\n): Promise<void> {\n const definedArgs = Object.fromEntries(\n Object.entries(args).filter(([, value]) => value !== undefined),\n );\n const result = await callAutomationTool(name, definedArgs);\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n}\n\nasync function runManagement(\n name: Parameters<typeof callManagementTool>[0],\n args: Record<string, unknown>,\n): Promise<void> {\n const definedArgs = Object.fromEntries(\n Object.entries(args).filter(([, value]) => value !== undefined),\n );\n const result = await callManagementTool(name, definedArgs);\n process.stdout.write(`${JSON.stringify(result, null, 2)}\\n`);\n}\n\nasync function readJsonObject(filePath: string): Promise<Record<string, unknown>> {\n const parsed: unknown = JSON.parse(await readFile(filePath, \"utf8\"));\n if (parsed === null || typeof parsed !== \"object\" || Array.isArray(parsed)) {\n throw new InvalidArgumentError(\"본문 파일은 Tiptap JSON 객체여야 합니다.\");\n }\n return parsed as Record<string, unknown>;\n}\n\nfunction commaSeparated(value: string | undefined): string[] | undefined {\n if (value === undefined) return undefined;\n return value.split(\",\").map((item) => item.trim()).filter(Boolean);\n}\n\nfunction integer(value: string): number {\n const parsed = Number.parseInt(value, 10);\n if (!Number.isInteger(parsed) || parsed < 0) {\n throw new InvalidArgumentError(\"0 이상의 정수를 입력하세요.\");\n }\n return parsed;\n}\n","import ky from \"ky\";\n\nconst DEFAULT_API_BASE = \"https://api.roottale.com\";\n\nexport class CmsAutomationError extends Error {\n readonly name = \"CmsAutomationError\";\n}\n\nexport type ApiRequest = {\n readonly method: \"GET\" | \"POST\" | \"PATCH\" | \"DELETE\";\n readonly pathname: string;\n readonly query?: Readonly<Record<string, string | undefined>>;\n readonly body?: unknown;\n};\n\nfunction apiConfig(): { readonly apiKey: string; readonly baseUrl: string } {\n const apiKey = process.env.ROOTTALE_API_KEY;\n if (!apiKey) {\n throw new CmsAutomationError(\n \"ROOTTALE_API_KEY 환경변수가 없습니다. 어드민 설정 > 사이트 연결 키에서 read_write 키를 발급해 MCP env에 추가하세요.\",\n );\n }\n return {\n apiKey,\n baseUrl: (process.env.ROOTTALE_API_BASE ?? DEFAULT_API_BASE).replace(\n /\\/+$/,\n \"\",\n ),\n };\n}\n\nexport async function requestRootTaleApi(\n request: ApiRequest,\n): Promise<unknown> {\n const { apiKey, baseUrl } = apiConfig();\n const url = new URL(`${baseUrl}${request.pathname}`);\n for (const [key, value] of Object.entries(request.query ?? {})) {\n if (value !== undefined) url.searchParams.set(key, value);\n }\n return ky(url, {\n method: request.method,\n headers: { authorization: `Bearer ${apiKey}` },\n json: request.body,\n retry: 0,\n timeout: 30_000,\n }).json();\n}\n\nexport async function putUpload(\n uploadUrl: string,\n bytes: Uint8Array,\n contentType: string,\n): Promise<void> {\n const body = new Uint8Array(bytes.byteLength);\n body.set(bytes);\n await ky.put(uploadUrl, {\n body: body.buffer,\n headers: { \"content-type\": contentType },\n retry: 0,\n timeout: 120_000,\n });\n}\n","type JsonSchemaProperty = Readonly<Record<string, unknown>>;\n\nexport const AUTOMATION_TOOL_DEFINITIONS = [\n tool(\"listManagedCmsPosts\", \"초안·예약·발행 글을 포함한 관리용 글 목록을 조회합니다.\", {\n siteId: stringProperty(\"사이트 ID\"),\n limit: numberProperty(\"1-100\"),\n type: enumProperty([\"post\", \"page\"]),\n status: enumProperty([\"draft\", \"published\", \"scheduled\", \"private\"]),\n cursor: stringProperty(\"이전 응답의 next_cursor\"),\n modelKey: stringProperty(\"콘텐츠 모델 key\"),\n }),\n tool(\"getManagedCmsPost\", \"페이지·글·정보 항목 한 건을 관리용 원문으로 조회합니다.\", {\n postId: stringProperty(\"항목 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n }, [\"postId\"]),\n tool(\n \"createCmsPost\",\n \"Tiptap bodyJson으로 글 또는 페이지를 생성합니다. 기본은 초안이며 publish=true면 즉시 발행합니다.\",\n {\n siteId: stringProperty(\"사이트 ID\"),\n type: enumProperty([\"post\", \"page\"]),\n title: stringProperty(\"제목\"),\n slug: stringProperty(\"슬러그\"),\n bodyJson: { type: \"object\", description: \"Tiptap 문서 JSON\" },\n excerpt: nullableStringProperty(\"요약\"),\n featuredMediaId: nullableStringProperty(\"대표 이미지 media id\"),\n publish: { type: \"boolean\" },\n scheduledAt: stringProperty(\"미래 ISO 8601 발행 시각\"),\n categoryIds: arrayProperty(\"카테고리 term id\"),\n tagIds: arrayProperty(\"태그 term id\"),\n modelKey: stringProperty(\"콘텐츠 모델 key\"),\n fieldValues: { type: \"object\", description: \"모델 필드 원문 값\" },\n },\n [\"title\", \"slug\", \"bodyJson\"],\n ),\n tool(\"updateCmsPost\", \"기존 CMS 글을 부분 수정합니다.\", {\n postId: stringProperty(\"글 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n title: stringProperty(\"제목\"),\n slug: stringProperty(\"슬러그\"),\n bodyJson: { type: \"object\", description: \"Tiptap 문서 JSON\" },\n excerpt: nullableStringProperty(\"요약\"),\n featuredMediaId: nullableStringProperty(\"대표 이미지 media id\"),\n scheduledAt: nullableStringProperty(\"예약 시각\"),\n fieldValues: { type: \"object\", description: \"모델 필드 원문 값\" },\n }, [\"postId\"]),\n tool(\"publishCmsPost\", \"초안 또는 예약 글을 즉시 발행하고 웹훅을 전송합니다.\", {\n postId: stringProperty(\"글 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n }, [\"postId\"]),\n tool(\"unpublishCmsPost\", \"발행 글을 초안으로 되돌립니다.\", {\n postId: stringProperty(\"글 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n }, [\"postId\"]),\n tool(\"deleteCmsPost\", \"페이지·글·정보 항목을 휴지통으로 보내거나 영구 삭제합니다.\", {\n postId: stringProperty(\"항목 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n hard: { type: \"boolean\", description: \"true면 영구 삭제\" },\n }, [\"postId\"]),\n tool(\"setCmsPostTerms\", \"글의 카테고리 또는 태그 연결을 교체합니다.\", {\n postId: stringProperty(\"글 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n taxonomy: enumProperty([\"category\", \"tag\"]),\n termIds: arrayProperty(\"term id\"),\n }, [\"postId\", \"taxonomy\", \"termIds\"]),\n tool(\"listCmsMedia\", \"CMS 미디어 라이브러리를 조회합니다.\", {\n siteId: stringProperty(\"사이트 ID\"),\n limit: numberProperty(\"1-100\"),\n offset: numberProperty(\"0 이상\"),\n }),\n tool(\n \"uploadCmsMedia\",\n \"로컬 이미지/PDF 파일을 업로드하고 CMS media id와 공개 URL을 반환합니다.\",\n {\n filePath: stringProperty(\"로컬 파일 절대/상대 경로\"),\n siteId: stringProperty(\"사이트 ID\"),\n contentType: enumProperty([\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/gif\",\n \"application/pdf\",\n ]),\n alt: nullableStringProperty(\"대체 텍스트\"),\n caption: nullableStringProperty(\"캡션\"),\n },\n [\"filePath\"],\n ),\n tool(\"updateCmsMedia\", \"CMS 미디어의 대체 텍스트 또는 캡션을 수정합니다.\", {\n mediaId: stringProperty(\"media id\"),\n siteId: stringProperty(\"사이트 ID\"),\n alt: nullableStringProperty(\"대체 텍스트\"),\n caption: nullableStringProperty(\"캡션\"),\n }, [\"mediaId\"]),\n tool(\"deleteCmsMedia\", \"CMS 미디어를 R2와 라이브러리에서 삭제합니다.\", {\n mediaId: stringProperty(\"media id\"),\n siteId: stringProperty(\"사이트 ID\"),\n }, [\"mediaId\"]),\n] as const;\n\nexport type AutomationToolName =\n (typeof AUTOMATION_TOOL_DEFINITIONS)[number][\"name\"];\n\nexport function isAutomationToolName(name: string): name is AutomationToolName {\n return AUTOMATION_TOOL_DEFINITIONS.some(\n (toolDefinition) => toolDefinition.name === name,\n );\n}\n\nfunction tool<const TName extends string>(\n name: TName,\n description: string,\n properties: Readonly<Record<string, JsonSchemaProperty>>,\n required: readonly string[] = [],\n) {\n return {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false,\n },\n } as const;\n}\n\nfunction stringProperty(description: string): JsonSchemaProperty {\n return { type: \"string\", description };\n}\n\nfunction nullableStringProperty(description: string): JsonSchemaProperty {\n return { type: [\"string\", \"null\"], description };\n}\n\nfunction numberProperty(description: string): JsonSchemaProperty {\n return { type: \"number\", description };\n}\n\nfunction enumProperty(values: readonly string[]): JsonSchemaProperty {\n return { type: \"string\", enum: values };\n}\n\nfunction arrayProperty(description: string): JsonSchemaProperty {\n return { type: \"array\", items: { type: \"string\" }, description };\n}\n","import { readFile } from \"node:fs/promises\";\nimport { basename, extname, resolve } from \"node:path\";\n\nimport { z } from \"zod\";\n\nimport { CmsAutomationError, putUpload, requestRootTaleApi } from \"./api.js\";\nimport { UploadMediaInput } from \"./automation-schemas.js\";\n\nexport async function uploadCmsMedia(args: Record<string, unknown>): Promise<unknown> {\n const input = UploadMediaInput.parse(args);\n const filePath = resolve(input.filePath);\n const bytes = await readFile(filePath);\n const contentType = input.contentType ?? inferContentType(filePath);\n if (!contentType) {\n throw new CmsAutomationError(\n \"contentType을 추론할 수 없습니다. jpg/png/webp/gif/pdf 파일이 아니면 contentType을 지정하세요.\",\n );\n }\n const requested = z\n .object({\n upload_url: z.string().url(),\n r2_key: z.string().min(1),\n })\n .parse(\n await requestRootTaleApi({\n method: \"POST\",\n pathname: \"/v1/cms/media/uploads\",\n body: {\n site_id: input.siteId,\n original_name: basename(filePath),\n content_type: contentType,\n size_bytes: bytes.byteLength,\n },\n }),\n );\n await putUpload(requested.upload_url, bytes, contentType);\n return requestRootTaleApi({\n method: \"POST\",\n pathname: \"/v1/cms/media/uploads/complete\",\n body: {\n site_id: input.siteId,\n r2_key: requested.r2_key,\n original_name: basename(filePath),\n content_type: contentType,\n size_bytes: bytes.byteLength,\n alt: input.alt,\n caption: input.caption,\n },\n });\n}\n\nfunction inferContentType(filePath: string): string | undefined {\n switch (extname(filePath).toLowerCase()) {\n case \".jpg\":\n case \".jpeg\":\n return \"image/jpeg\";\n case \".png\":\n return \"image/png\";\n case \".webp\":\n return \"image/webp\";\n case \".gif\":\n return \"image/gif\";\n case \".pdf\":\n return \"application/pdf\";\n default:\n return undefined;\n }\n}\n","import { z } from \"zod\";\n\nconst SiteId = z.string().min(1).optional();\nconst PostId = z.string().min(1);\nconst NullableText = z.string().nullable().optional();\n\nexport const CreatePostInput = z\n .object({\n siteId: SiteId,\n type: z.enum([\"post\", \"page\"]).optional(),\n title: z.string().min(1).max(500),\n slug: z.string().min(1).max(120),\n bodyJson: z.record(z.string(), z.unknown()),\n excerpt: z.string().max(1000).nullable().optional(),\n featuredMediaId: z.string().nullable().optional(),\n publish: z.boolean().optional(),\n scheduledAt: z.string().datetime({ offset: true }).optional(),\n categoryIds: z.array(z.string()).optional(),\n tagIds: z.array(z.string()).optional(),\n modelKey: z.string().min(1).optional(),\n fieldValues: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\nexport const UpdatePostInput = z\n .object({\n postId: PostId,\n siteId: SiteId,\n title: z.string().min(1).max(500).optional(),\n slug: z.string().min(1).max(120).optional(),\n bodyJson: z.record(z.string(), z.unknown()).optional(),\n excerpt: NullableText,\n featuredMediaId: z.string().nullable().optional(),\n scheduledAt: z.string().datetime({ offset: true }).nullable().optional(),\n fieldValues: z.record(z.string(), z.unknown()).optional(),\n })\n .strict();\n\nexport const PostLifecycleInput = z\n .object({ postId: PostId, siteId: SiteId })\n .strict();\n\nexport const DeletePostInput = PostLifecycleInput.extend({ hard: z.boolean().optional() }).strict();\n\nexport const ListManagedPostsInput = z\n .object({\n siteId: SiteId,\n limit: z.number().int().min(1).max(100).optional(),\n type: z.enum([\"post\", \"page\"]).optional(),\n status: z\n .enum([\"draft\", \"published\", \"scheduled\", \"private\"])\n .optional(),\n cursor: z.string().optional(),\n modelKey: z.string().min(1).optional(),\n })\n .strict();\n\nexport const SetTermsInput = z\n .object({\n postId: PostId,\n siteId: SiteId,\n taxonomy: z.enum([\"category\", \"tag\"]),\n termIds: z.array(z.string()),\n })\n .strict();\n\nexport const UploadMediaInput = z\n .object({\n filePath: z.string().min(1),\n siteId: SiteId,\n contentType: z\n .enum([\n \"image/jpeg\",\n \"image/png\",\n \"image/webp\",\n \"image/gif\",\n \"application/pdf\",\n ])\n .optional(),\n alt: NullableText,\n caption: NullableText,\n })\n .strict();\n\nexport const ListMediaInput = z\n .object({\n siteId: SiteId,\n limit: z.number().int().min(1).max(100).optional(),\n offset: z.number().int().nonnegative().optional(),\n })\n .strict();\n\nexport const UpdateMediaInput = z\n .object({\n mediaId: z.string().min(1),\n siteId: SiteId,\n alt: NullableText,\n caption: NullableText,\n })\n .strict()\n .refine((input) => input.alt !== undefined || input.caption !== undefined, {\n message: \"alt 또는 caption 중 하나 이상이 필요합니다.\",\n });\n\nexport const DeleteMediaInput = z\n .object({ mediaId: z.string().min(1), siteId: SiteId })\n .strict();\n","import { CmsAutomationError, requestRootTaleApi } from \"./api.js\";\nimport {\n type AutomationToolName,\n AUTOMATION_TOOL_DEFINITIONS,\n isAutomationToolName,\n} from \"./automation-definitions.js\";\nimport { uploadCmsMedia } from \"./automation-media.js\";\nimport {\n CreatePostInput,\n DeletePostInput,\n DeleteMediaInput,\n ListManagedPostsInput,\n ListMediaInput,\n PostLifecycleInput,\n SetTermsInput,\n UpdateMediaInput,\n UpdatePostInput,\n} from \"./automation-schemas.js\";\n\nexport {\n AUTOMATION_TOOL_DEFINITIONS,\n isAutomationToolName,\n};\n\nexport async function callAutomationTool(\n name: AutomationToolName,\n args: Record<string, unknown>,\n): Promise<unknown> {\n switch (name) {\n case \"listManagedCmsPosts\": {\n const input = ListManagedPostsInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/posts\",\n query: optionalQuery({\n site_id: input.siteId,\n limit: input.limit,\n type: input.type,\n status: input.status,\n cursor: input.cursor,\n model_key: input.modelKey,\n }),\n });\n }\n case \"getManagedCmsPost\": {\n const input = PostLifecycleInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname: `/v1/cms/posts/${encodeURIComponent(input.postId)}`,\n query: optionalQuery({ site_id: input.siteId }),\n });\n }\n case \"createCmsPost\": {\n const input = CreatePostInput.parse(args);\n return requestRootTaleApi({\n method: \"POST\",\n pathname: \"/v1/cms/posts\",\n body: {\n site_id: input.siteId,\n type: input.type,\n title: input.title,\n slug: input.slug,\n body_json: input.bodyJson,\n excerpt: input.excerpt,\n featured_media_id: input.featuredMediaId,\n publish: input.publish,\n scheduled_at: input.scheduledAt,\n category_ids: input.categoryIds,\n tag_ids: input.tagIds,\n model_key: input.modelKey,\n field_values: input.fieldValues,\n },\n });\n }\n case \"updateCmsPost\": {\n const input = UpdatePostInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: `/v1/cms/posts/${encodeURIComponent(input.postId)}`,\n body: {\n site_id: input.siteId,\n title: input.title,\n slug: input.slug,\n body_json: input.bodyJson,\n excerpt: input.excerpt,\n featured_media_id: input.featuredMediaId,\n scheduled_at: input.scheduledAt,\n field_values: input.fieldValues,\n },\n });\n }\n case \"publishCmsPost\":\n case \"unpublishCmsPost\": {\n const input = PostLifecycleInput.parse(args);\n const action = name === \"publishCmsPost\" ? \"publish\" : \"unpublish\";\n return requestRootTaleApi({\n method: \"POST\",\n pathname: `/v1/cms/posts/${encodeURIComponent(input.postId)}/${action}`,\n body: { site_id: input.siteId },\n });\n }\n case \"setCmsPostTerms\": {\n const input = SetTermsInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: `/v1/cms/posts/${encodeURIComponent(input.postId)}/terms`,\n body: {\n site_id: input.siteId,\n taxonomy: input.taxonomy,\n term_ids: input.termIds,\n },\n });\n }\n case \"deleteCmsPost\": {\n const input = DeletePostInput.parse(args);\n return requestRootTaleApi({\n method: \"DELETE\",\n pathname: `/v1/cms/posts/${encodeURIComponent(input.postId)}`,\n query: optionalQuery({\n site_id: input.siteId,\n hard: input.hard === undefined ? undefined : String(input.hard),\n }),\n });\n }\n case \"listCmsMedia\": {\n const input = ListMediaInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/media\",\n query: optionalQuery({\n site_id: input.siteId,\n limit: input.limit,\n offset: input.offset,\n }),\n });\n }\n case \"uploadCmsMedia\":\n return uploadCmsMedia(args);\n case \"updateCmsMedia\": {\n const input = UpdateMediaInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: `/v1/cms/media/${encodeURIComponent(input.mediaId)}`,\n body: {\n site_id: input.siteId,\n alt: input.alt,\n caption: input.caption,\n },\n });\n }\n case \"deleteCmsMedia\": {\n const input = DeleteMediaInput.parse(args);\n return requestRootTaleApi({\n method: \"DELETE\",\n pathname: `/v1/cms/media/${encodeURIComponent(input.mediaId)}`,\n query: optionalQuery({ site_id: input.siteId }),\n });\n }\n default:\n return assertNever(name);\n }\n}\n\nfunction optionalQuery(\n values: Readonly<Record<string, string | number | undefined>>,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(values)\n .filter((entry): entry is [string, string | number] => entry[1] !== undefined)\n .map(([key, value]) => [key, String(value)]),\n );\n}\n\nfunction assertNever(value: never): never {\n throw new CmsAutomationError(`Unknown automation tool: ${String(value)}`);\n}\n","type Property = Readonly<Record<string, unknown>>;\n\nconst string = (description: string): Property => ({ type: \"string\", description });\nconst number = (description: string): Property => ({ type: \"number\", description });\nconst boolean = (description: string): Property => ({ type: \"boolean\", description });\nconst object = (description: string): Property => ({ type: \"object\", description });\nconst nullableString = (description: string): Property => ({\n type: [\"string\", \"null\"],\n description,\n});\nconst enumValue = (values: readonly string[]): Property => ({ type: \"string\", enum: values });\nconst strings = (description: string): Property => ({\n type: \"array\",\n items: { type: \"string\" },\n description,\n});\nconst exposureFields = {\n siteId: string(\"사이트 ID\"), name: string(\"관리용 이름\"), slotKey: string(\"노출 슬롯 key\"),\n kind: enumValue([\"banner\", \"popup\"]), content: object(\"camelCase 콘텐츠; assetId/mobileAssetId, linkTarget self|blank\"),\n delivery: object(\"v2 표시 조건; timeZone, includePaths, excludePaths, schedule\"),\n startsAt: nullableString(\"시작 ISO 시각\"), endsAt: nullableString(\"종료 ISO 시각\"),\n targetPaths: strings(\"이전 runtime 대상 경로\"), priority: number(\"우선순위\"),\n repeat: enumValue([\"always\", \"session\", \"day\", \"never\"]),\n};\nconst exposureRequired = [\"slotKey\", \"kind\", \"content\", \"startsAt\", \"endsAt\", \"targetPaths\", \"priority\", \"repeat\"];\nconst exposureVersionFields = {\n exposureId: string(\"노출 캠페인 ID\"), siteId: string(\"사이트 ID\"), expectedVersion: number(\"조회한 현재 version\"),\n};\n\nexport const MANAGEMENT_TOOL_DEFINITIONS = [\n tool(\"listCmsContentModels\", \"페이지·글·정보 콘텐츠 모델과 사용량을 조회합니다.\", {\n siteId: string(\"사이트 ID\"),\n state: enumValue([\"active\", \"inactive\"]),\n preset: enumValue([\"page\", \"article\", \"entity\", \"none\"]),\n source: enumValue([\"code\", \"site\"]),\n }),\n tool(\"getCmsContentModel\", \"콘텐츠 모델 한 건을 modelKey로 조회합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n }, [\"modelKey\"]),\n tool(\"createCmsContentModel\", \"사이트 소유 article 또는 entity 모델을 만듭니다.\", {\n siteId: string(\"사이트 ID\"), key: string(\"콘텐츠 모델 key\"),\n label: string(\"표시 이름\"), cardinality: enumValue([\"singleton\", \"collection\"]),\n preset: { type: [\"string\", \"null\"], enum: [\"article\", \"entity\", null] },\n presentation: object(\"표시 경로 계약\"), publication: object(\"발행 정책\"),\n compatibilityCollectionKey: nullableString(\"이전 collection key\"),\n definition: object(\"추가 모델 정의\"),\n }, [\"key\", \"label\", \"cardinality\", \"preset\", \"presentation\"]),\n tool(\"updateCmsContentModel\", \"사이트 모델의 구조 또는 모델 상태를 수정합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n expectedUpdatedAt: string(\"현재 updated_at\"), label: string(\"표시 이름\"),\n cardinality: enumValue([\"singleton\", \"collection\"]),\n preset: { type: [\"string\", \"null\"], enum: [\"article\", \"entity\", null] },\n state: enumValue([\"active\", \"inactive\"]), presentation: object(\"표시 경로 계약\"),\n publication: object(\"발행 정책\"),\n compatibilityCollectionKey: nullableString(\"이전 collection key\"),\n definition: object(\"추가 모델 정의\"),\n }, [\"modelKey\", \"expectedUpdatedAt\"]),\n tool(\"activateCmsContentModel\", \"콘텐츠 모델을 활성화합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n }, [\"modelKey\"]),\n tool(\"deactivateCmsContentModel\", \"콘텐츠 모델을 비활성화합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n }, [\"modelKey\"]),\n tool(\"deleteCmsContentModel\", \"사용하지 않는 사이트 모델을 삭제합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n }, [\"modelKey\"]),\n tool(\"listCmsFieldGroups\", \"모델에 연결된 code·site 필드 그룹을 조회합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), siteId: string(\"사이트 ID\"),\n }, [\"modelKey\"]),\n tool(\"getCmsFieldGroup\", \"필드 그룹 한 건을 조회합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"),\n }, [\"modelKey\", \"groupKey\"]),\n tool(\"createCmsFieldGroup\", \"사이트 소유 필드 그룹을 만듭니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"), title: string(\"표시 이름\"),\n definition: object(\"필드 정의\"),\n }, [\"modelKey\", \"groupKey\", \"title\", \"definition\"]),\n tool(\"updateCmsFieldGroup\", \"사이트 필드 그룹을 수정합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"), expectedUpdatedAt: string(\"현재 updated_at\"),\n title: string(\"표시 이름\"), active: boolean(\"활성 상태\"),\n definition: object(\"필드 정의\"),\n }, [\"modelKey\", \"groupKey\", \"expectedUpdatedAt\"]),\n tool(\"activateCmsFieldGroup\", \"필드 그룹을 활성화합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"),\n }, [\"modelKey\", \"groupKey\"]),\n tool(\"deactivateCmsFieldGroup\", \"필드 그룹을 비활성화합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"),\n }, [\"modelKey\", \"groupKey\"]),\n tool(\"deleteCmsFieldGroup\", \"사용하지 않는 사이트 필드 그룹을 삭제합니다.\", {\n modelKey: string(\"콘텐츠 모델 key\"), groupKey: string(\"필드 그룹 key\"),\n siteId: string(\"사이트 ID\"),\n }, [\"modelKey\", \"groupKey\"]),\n tool(\"listCmsExposureSlots\", \"연결된 FRONT가 선언한 노출 슬롯을 조회합니다.\", {\n siteId: string(\"사이트 ID\"),\n }),\n tool(\"listCmsExposures\", \"초안·발행·보관 노출 캠페인을 조회합니다.\", {\n siteId: string(\"사이트 ID\"), kind: enumValue([\"banner\", \"popup\"]),\n status: enumValue([\"draft\", \"published\", \"archived\"]),\n }),\n tool(\"getCmsExposure\", \"노출 캠페인 한 건을 조회합니다.\", {\n exposureId: string(\"노출 캠페인 ID\"), siteId: string(\"사이트 ID\"),\n }, [\"exposureId\"]),\n tool(\"createCmsExposure\", \"FRONT 슬롯 계약에 맞는 노출 캠페인 초안을 만듭니다.\", {\n name: exposureFields.name, delivery: exposureFields.delivery,\n siteId: string(\"사이트 ID\"), slotKey: string(\"노출 슬롯 key\"),\n kind: enumValue([\"banner\", \"popup\"]), content: object(\"노출 콘텐츠\"),\n startsAt: nullableString(\"시작 ISO 시각\"), endsAt: nullableString(\"종료 ISO 시각\"),\n targetPaths: strings(\"대상 경로\"), priority: number(\"우선순위\"),\n repeat: enumValue([\"always\", \"session\", \"day\", \"never\"]),\n }, [\"slotKey\", \"kind\", \"content\", \"startsAt\", \"endsAt\", \"targetPaths\", \"priority\", \"repeat\"]),\n tool(\"updateCmsExposure\", \"노출 캠페인을 낙관적 잠금으로 수정합니다.\", {\n name: exposureFields.name, delivery: exposureFields.delivery,\n exposureId: string(\"노출 캠페인 ID\"), expectedVersion: number(\"현재 version\"),\n siteId: string(\"사이트 ID\"), slotKey: string(\"노출 슬롯 key\"),\n kind: enumValue([\"banner\", \"popup\"]), content: object(\"노출 콘텐츠\"),\n startsAt: nullableString(\"시작 ISO 시각\"), endsAt: nullableString(\"종료 ISO 시각\"),\n targetPaths: strings(\"대상 경로\"), priority: number(\"우선순위\"),\n repeat: enumValue([\"always\", \"session\", \"day\", \"never\"]),\n }, [\"exposureId\", \"expectedVersion\", \"slotKey\", \"kind\", \"content\", \"startsAt\", \"endsAt\", \"targetPaths\", \"priority\", \"repeat\"]),\n tool(\"publishCmsExposure\", \"노출 캠페인을 발행하고 겹침 경고를 반환합니다.\", {\n expectedVersion: exposureVersionFields.expectedVersion,\n exposureId: string(\"노출 캠페인 ID\"), siteId: string(\"사이트 ID\"),\n }, [\"exposureId\"]),\n tool(\"archiveCmsExposure\", \"노출 캠페인을 보관합니다.\", {\n expectedVersion: exposureVersionFields.expectedVersion,\n exposureId: string(\"노출 캠페인 ID\"), siteId: string(\"사이트 ID\"),\n }, [\"exposureId\"]),\n tool(\"saveCmsExposureDraft\", \"공개본을 유지하며 수정안을 저장합니다.\", {\n ...exposureFields, ...exposureVersionFields,\n }, [\"exposureId\", \"expectedVersion\", ...exposureRequired]),\n tool(\"updateCmsExposureSchedule\", \"내용 수정안을 발행하지 않고 공개본의 일정만 바꿉니다.\", {\n ...exposureVersionFields, startsAt: nullableString(\"시작 ISO 시각\"), endsAt: nullableString(\"종료 ISO 시각\"),\n schedule: object(\"camelCase 기간 편집 정보\"),\n }, [\"exposureId\", \"expectedVersion\", \"startsAt\", \"endsAt\"]),\n tool(\"pauseCmsExposure\", \"현재 노출을 일시 중지합니다.\", exposureVersionFields, [\"exposureId\", \"expectedVersion\"]),\n tool(\"resumeCmsExposure\", \"유효한 기간의 일시 중지 항목을 재개합니다.\", exposureVersionFields, [\"exposureId\", \"expectedVersion\"]),\n tool(\"cancelCmsExposureReservation\", \"시작 전 예약을 취소하고 초안으로 되돌립니다.\", exposureVersionFields, [\"exposureId\", \"expectedVersion\"]),\n tool(\"duplicateCmsExposure\", \"새 ID와 비어 있는 일정으로 초안을 복제합니다.\", exposureVersionFields, [\"exposureId\", \"expectedVersion\"]),\n tool(\"restoreCmsExposure\", \"보관한 항목을 초안으로 복원합니다.\", exposureVersionFields, [\"exposureId\", \"expectedVersion\"]),\n tool(\"previewCmsExposure\", \"저장하지 않고 경로·기기·시각에 맞는 노출 결과를 확인합니다.\", {\n exposureId: string(\"수정 중인 기존 항목 ID; 생략하면 새 항목으로 확인\"),\n ...exposureFields, path: string(\"미리 볼 사이트 경로\"), device: enumValue([\"desktop\", \"mobile\"]),\n evaluatedAt: string(\"확인할 ISO 시각; 생략 시 현재\"),\n }, [...exposureRequired, \"path\", \"device\"]),\n] as const;\n\nexport type ManagementToolName = (typeof MANAGEMENT_TOOL_DEFINITIONS)[number][\"name\"];\n\nexport function isManagementToolName(name: string): name is ManagementToolName {\n return MANAGEMENT_TOOL_DEFINITIONS.some((definition) => definition.name === name);\n}\n\nfunction tool<const TName extends string>(\n name: TName,\n description: string,\n properties: Readonly<Record<string, Property>>,\n required: readonly string[] = [],\n) {\n return {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties,\n ...(required.length > 0 && { required }),\n additionalProperties: false,\n },\n } as const;\n}\n","import { z } from \"zod\";\n\nconst SiteId = z.string().min(1).optional();\nconst Key = z.string().min(1);\nconst DateTime = z.string().datetime({ offset: true });\nconst JsonObject = z.record(z.string(), z.unknown());\n\nexport const ModelRefInput = z.object({ modelKey: Key, siteId: SiteId }).strict();\nexport const ListModelsInput = z.object({\n siteId: SiteId,\n state: z.enum([\"active\", \"inactive\"]).optional(),\n preset: z.enum([\"page\", \"article\", \"entity\", \"none\"]).optional(),\n source: z.enum([\"code\", \"site\"]).optional(),\n}).strict();\nexport const CreateModelInput = z.object({\n siteId: SiteId,\n key: Key,\n label: z.string().min(1),\n cardinality: z.enum([\"singleton\", \"collection\"]),\n preset: z.enum([\"article\", \"entity\"]).nullable(),\n presentation: JsonObject,\n publication: JsonObject.nullable().optional(),\n compatibilityCollectionKey: z.string().nullable().optional(),\n definition: JsonObject.optional(),\n}).strict();\nexport const UpdateModelInput = z.object({\n modelKey: Key,\n siteId: SiteId,\n expectedUpdatedAt: DateTime,\n label: z.string().min(1).optional(),\n cardinality: z.enum([\"singleton\", \"collection\"]).optional(),\n preset: z.enum([\"article\", \"entity\"]).nullable().optional(),\n state: z.enum([\"active\", \"inactive\"]).optional(),\n presentation: JsonObject.optional(),\n publication: JsonObject.nullable().optional(),\n compatibilityCollectionKey: z.string().nullable().optional(),\n definition: JsonObject.optional(),\n}).strict();\n\nexport const FieldRefInput = z.object({\n modelKey: Key, groupKey: Key, siteId: SiteId,\n}).strict();\nexport const CreateFieldInput = FieldRefInput.extend({\n title: z.string().min(1), definition: JsonObject,\n}).strict();\nexport const UpdateFieldInput = FieldRefInput.extend({\n expectedUpdatedAt: DateTime,\n title: z.string().min(1).optional(),\n active: z.boolean().optional(),\n definition: JsonObject.optional(),\n}).strict();\n\nexport const SiteInput = z.object({ siteId: SiteId }).strict();\nexport const ListExposuresInput = SiteInput.extend({\n kind: z.enum([\"banner\", \"popup\"]).optional(),\n status: z.enum([\"draft\", \"published\", \"archived\"]).optional(),\n}).strict();\nexport const ExposureRefInput = z.object({ exposureId: Key, siteId: SiteId }).strict();\nexport const ExposureStateInput = ExposureRefInput.extend({\n expectedVersion: z.number().int().positive().optional(),\n}).strict();\nexport const ExposureMutationInput = ExposureStateInput.required({ expectedVersion: true });\nconst ScheduleInput = z.object({\n startMode: z.enum([\"now\", \"scheduled\"]), startDate: z.string().optional(), startTime: z.string().optional(),\n endMode: z.enum([\"none\", \"date\"]), endDate: z.string().optional(), endTime: z.string().optional(),\n endPreset: z.union([z.literal(1), z.literal(7), z.literal(30)]).optional(),\n}).strict();\nconst PathRuleInput = z.object({ path: z.string().startsWith(\"/\"), match: z.enum([\"exact\", \"prefix\"]) }).strict();\nconst DeliveryInput = z.object({\n version: z.literal(2), timeZone: z.string().optional(), device: z.enum([\"all\", \"desktop\", \"mobile\"]).optional(),\n includePaths: z.array(PathRuleInput).min(1).max(100), excludePaths: z.array(PathRuleInput).max(100).optional(),\n delaySeconds: z.number().min(0).max(30).optional(),\n scrollPercent: z.union([z.literal(25), z.literal(50), z.literal(75)]).nullable().optional(),\n dismissible: z.boolean().optional(), hideForToday: z.boolean().optional(),\n size: z.enum([\"small\", \"medium\", \"large\"]).optional(), dayBoundary: z.enum([\"calendar\", \"rolling\"]).optional(),\n schedule: ScheduleInput.optional(),\n}).strict();\nexport const ExposureScheduleInput = ExposureMutationInput.extend({\n startsAt: DateTime.nullable(), endsAt: DateTime.nullable(), schedule: ScheduleInput.optional(),\n}).strict();\nconst ExposureFields = {\n name: z.string().max(200).optional(),\n delivery: DeliveryInput.optional(),\n slotKey: Key,\n kind: z.enum([\"banner\", \"popup\"]),\n content: z.object({\n variant: Key,\n eyebrow: z.string().optional(),\n title: z.string().min(1),\n description: z.string().optional(),\n assetUrl: z.string().url().optional(),\n assetAlt: z.string().optional(),\n assetId: Key.optional(),\n mobileAssetId: Key.optional(),\n mobileAssetUrl: z.string().url().optional(),\n mobileAssetAlt: z.string().optional(),\n linkLabel: z.string().optional(),\n linkUrl: z.string().optional(),\n linkTarget: z.enum([\"self\", \"blank\"]).optional(),\n }).strict(),\n startsAt: DateTime.nullable(),\n endsAt: DateTime.nullable(),\n targetPaths: z.array(z.string().startsWith(\"/\")).min(1),\n priority: z.number().int().min(-1000).max(1000),\n repeat: z.enum([\"always\", \"session\", \"day\", \"never\"]),\n} as const;\nexport const CreateExposureInput = z.object({ siteId: SiteId, ...ExposureFields }).strict();\nexport const UpdateExposureInput = z.object({\n exposureId: Key,\n expectedVersion: z.number().int().positive(),\n siteId: SiteId,\n ...ExposureFields,\n}).strict();\n\nexport const PreviewExposureInput = CreateExposureInput.extend({\n exposureId: Key.optional(),\n path: z.string().startsWith(\"/\"), device: z.enum([\"desktop\", \"mobile\"]),\n evaluatedAt: DateTime.optional(),\n}).strict();\n\nexport const VersionResponse = z.object({ version: z.number().int().positive() }).passthrough();\nexport const UpdatedAtResponse = z.object({ updated_at: DateTime.nullable() }).passthrough();\n","import { CmsAutomationError, requestRootTaleApi } from \"./api.js\";\nimport {\n type ManagementToolName,\n MANAGEMENT_TOOL_DEFINITIONS,\n isManagementToolName,\n} from \"./management-definitions.js\";\nimport {\n CreateExposureInput,\n CreateFieldInput,\n CreateModelInput,\n ExposureRefInput,\n ExposureMutationInput,\n ExposureScheduleInput,\n ExposureStateInput,\n FieldRefInput,\n ListExposuresInput,\n ListModelsInput,\n ModelRefInput,\n PreviewExposureInput,\n SiteInput,\n UpdateExposureInput,\n UpdatedAtResponse,\n UpdateFieldInput,\n UpdateModelInput,\n VersionResponse,\n} from \"./management-schemas.js\";\n\nexport { MANAGEMENT_TOOL_DEFINITIONS, isManagementToolName };\n\nexport async function callManagementTool(\n name: ManagementToolName,\n args: Record<string, unknown>,\n): Promise<unknown> {\n switch (name) {\n case \"listCmsContentModels\": {\n const input = ListModelsInput.parse(args);\n return get(\"/v1/cms/content-models\", {\n site_id: input.siteId,\n state: input.state,\n preset: input.preset,\n source: input.source,\n });\n }\n case \"getCmsContentModel\": {\n const input = ModelRefInput.parse(args);\n return get(modelPath(input.modelKey), { site_id: input.siteId });\n }\n case \"createCmsContentModel\": {\n const input = CreateModelInput.parse(args);\n return requestRootTaleApi({\n method: \"POST\",\n pathname: \"/v1/cms/content-models\",\n body: modelBody(input),\n });\n }\n case \"updateCmsContentModel\": {\n const input = UpdateModelInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: modelPath(input.modelKey),\n body: {\n site_id: input.siteId,\n expected_updated_at: input.expectedUpdatedAt,\n label: input.label,\n cardinality: input.cardinality,\n preset: input.preset,\n state: input.state,\n presentation: input.presentation,\n publication: input.publication,\n compatibility_collection_key: input.compatibilityCollectionKey,\n definition: input.definition,\n },\n });\n }\n case \"activateCmsContentModel\":\n case \"deactivateCmsContentModel\": {\n const input = ModelRefInput.parse(args);\n const current = UpdatedAtResponse.parse(\n await get(modelPath(input.modelKey), { site_id: input.siteId }),\n );\n if (!current.updated_at) throw new CmsAutomationError(\"모델 updated_at이 없습니다\");\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: modelPath(input.modelKey),\n body: {\n site_id: input.siteId,\n expected_updated_at: current.updated_at,\n state: name === \"activateCmsContentModel\" ? \"active\" : \"inactive\",\n },\n });\n }\n case \"deleteCmsContentModel\": {\n const input = ModelRefInput.parse(args);\n const current = UpdatedAtResponse.parse(\n await get(modelPath(input.modelKey), { site_id: input.siteId }),\n );\n if (!current.updated_at) throw new CmsAutomationError(\"모델 updated_at이 없습니다\");\n return requestRootTaleApi({\n method: \"DELETE\",\n pathname: modelPath(input.modelKey),\n query: optionalQuery({\n site_id: input.siteId,\n expected_updated_at: current.updated_at,\n }),\n });\n }\n case \"listCmsFieldGroups\": {\n const input = ModelRefInput.parse(args);\n return get(`${modelPath(input.modelKey)}/field-groups`, { site_id: input.siteId });\n }\n case \"getCmsFieldGroup\": {\n const input = FieldRefInput.parse(args);\n return get(fieldPath(input.modelKey, input.groupKey), { site_id: input.siteId });\n }\n case \"createCmsFieldGroup\": {\n const input = CreateFieldInput.parse(args);\n return requestRootTaleApi({\n method: \"POST\",\n pathname: `${modelPath(input.modelKey)}/field-groups`,\n body: {\n site_id: input.siteId,\n key: input.groupKey,\n title: input.title,\n definition: input.definition,\n },\n });\n }\n case \"updateCmsFieldGroup\": {\n const input = UpdateFieldInput.parse(args);\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: fieldPath(input.modelKey, input.groupKey),\n body: {\n site_id: input.siteId,\n expected_updated_at: input.expectedUpdatedAt,\n title: input.title,\n active: input.active,\n definition: input.definition,\n },\n });\n }\n case \"activateCmsFieldGroup\":\n case \"deactivateCmsFieldGroup\": {\n const input = FieldRefInput.parse(args);\n const current = UpdatedAtResponse.parse(\n await get(fieldPath(input.modelKey, input.groupKey), { site_id: input.siteId }),\n );\n if (!current.updated_at) {\n throw new CmsAutomationError(\"code 필드 그룹의 상태는 API로 바꿀 수 없습니다\");\n }\n return requestRootTaleApi({\n method: \"PATCH\",\n pathname: fieldPath(input.modelKey, input.groupKey),\n body: {\n site_id: input.siteId,\n expected_updated_at: current.updated_at,\n active: name === \"activateCmsFieldGroup\",\n },\n });\n }\n case \"deleteCmsFieldGroup\": {\n const input = FieldRefInput.parse(args);\n const current = UpdatedAtResponse.parse(\n await get(fieldPath(input.modelKey, input.groupKey), { site_id: input.siteId }),\n );\n if (!current.updated_at) {\n throw new CmsAutomationError(\"code 필드 그룹은 삭제할 수 없습니다\");\n }\n return requestRootTaleApi({\n method: \"DELETE\",\n pathname: fieldPath(input.modelKey, input.groupKey),\n query: optionalQuery({\n site_id: input.siteId,\n expected_updated_at: current.updated_at,\n }),\n });\n }\n case \"listCmsExposureSlots\": {\n const input = SiteInput.parse(args);\n return get(\"/v1/cms/exposure-slots\", { site_id: input.siteId });\n }\n case \"listCmsExposures\": {\n const input = ListExposuresInput.parse(args);\n return get(\"/v1/cms/exposures\", {\n site_id: input.siteId,\n kind: input.kind,\n status: input.status,\n });\n }\n case \"getCmsExposure\": {\n const input = ExposureRefInput.parse(args);\n return get(exposurePath(input.exposureId), { site_id: input.siteId });\n }\n case \"createCmsExposure\": {\n const input = CreateExposureInput.parse(args);\n return requestRootTaleApi({\n method: \"POST\",\n pathname: \"/v1/cms/exposures\",\n body: exposureBody(input),\n });\n }\n case \"updateCmsExposure\":\n case \"saveCmsExposureDraft\": {\n const input = UpdateExposureInput.parse(args);\n return requestRootTaleApi({\n method: name === \"saveCmsExposureDraft\" ? \"POST\" : \"PATCH\",\n pathname: `${exposurePath(input.exposureId)}${name === \"saveCmsExposureDraft\" ? \"/draft\" : \"\"}`,\n body: {\n ...exposureBody(input),\n expected_version: input.expectedVersion,\n },\n });\n }\n case \"publishCmsExposure\":\n case \"archiveCmsExposure\":\n case \"pauseCmsExposure\":\n case \"resumeCmsExposure\":\n case \"cancelCmsExposureReservation\":\n case \"duplicateCmsExposure\":\n case \"restoreCmsExposure\": {\n const input = (name === \"publishCmsExposure\" || name === \"archiveCmsExposure\"\n ? ExposureStateInput : ExposureMutationInput).parse(args);\n const expectedVersion = input.expectedVersion ?? VersionResponse.parse(\n await get(exposurePath(input.exposureId), { site_id: input.siteId }),\n ).version;\n const actions = {\n publishCmsExposure: \"publish\", archiveCmsExposure: \"archive\", pauseCmsExposure: \"pause\",\n resumeCmsExposure: \"resume\", cancelCmsExposureReservation: \"cancel\",\n duplicateCmsExposure: \"duplicate\", restoreCmsExposure: \"restore\",\n } as const;\n return requestRootTaleApi({\n method: \"POST\",\n pathname: `${exposurePath(input.exposureId)}/${actions[name]}`,\n body: { site_id: input.siteId, expected_version: expectedVersion },\n });\n }\n case \"updateCmsExposureSchedule\": {\n const input = ExposureScheduleInput.parse(args);\n return requestRootTaleApi({ method: \"POST\", pathname: `${exposurePath(input.exposureId)}/schedule`,\n body: { site_id: input.siteId, expected_version: input.expectedVersion,\n starts_at: input.startsAt, ends_at: input.endsAt, schedule: scheduleBody(input.schedule) },\n });\n }\n case \"previewCmsExposure\": {\n const input = PreviewExposureInput.parse(args);\n return requestRootTaleApi({ method: \"POST\", pathname: \"/v1/cms/exposures/preview\",\n body: { ...exposureBody(input), exposure_id: input.exposureId, path: input.path, device: input.device, evaluated_at: input.evaluatedAt },\n });\n }\n default:\n return assertNever(name);\n }\n}\n\nfunction get(pathname: string, query: Record<string, string | undefined>): Promise<unknown> {\n return requestRootTaleApi({ method: \"GET\", pathname, query: optionalQuery(query) });\n}\n\nfunction modelPath(modelKey: string): string {\n return `/v1/cms/content-models/${encodeURIComponent(modelKey)}`;\n}\n\nfunction fieldPath(modelKey: string, groupKey: string): string {\n return `${modelPath(modelKey)}/field-groups/${encodeURIComponent(groupKey)}`;\n}\n\nfunction exposurePath(exposureId: string): string {\n return `/v1/cms/exposures/${encodeURIComponent(exposureId)}`;\n}\n\nfunction modelBody(input: typeof CreateModelInput._output) {\n return {\n site_id: input.siteId,\n key: input.key,\n label: input.label,\n cardinality: input.cardinality,\n preset: input.preset,\n presentation: input.presentation,\n publication: input.publication,\n compatibility_collection_key: input.compatibilityCollectionKey,\n definition: input.definition,\n };\n}\n\nfunction exposureBody(input: typeof CreateExposureInput._output) {\n return {\n site_id: input.siteId,\n name: input.name,\n delivery: input.delivery ? {\n version: input.delivery.version, time_zone: input.delivery.timeZone, device: input.delivery.device,\n include_paths: input.delivery.includePaths, exclude_paths: input.delivery.excludePaths,\n delay_seconds: input.delivery.delaySeconds, scroll_percent: input.delivery.scrollPercent,\n dismissible: input.delivery.dismissible, hide_for_today: input.delivery.hideForToday,\n size: input.delivery.size, day_boundary: input.delivery.dayBoundary,\n schedule: scheduleBody(input.delivery.schedule),\n } : undefined,\n slot_key: input.slotKey,\n kind: input.kind,\n content: {\n variant: input.content.variant,\n eyebrow: input.content.eyebrow,\n title: input.content.title,\n description: input.content.description,\n asset_url: input.content.assetUrl,\n asset_alt: input.content.assetAlt,\n asset_id: input.content.assetId,\n mobile_asset_id: input.content.mobileAssetId,\n mobile_asset_url: input.content.mobileAssetUrl,\n mobile_asset_alt: input.content.mobileAssetAlt,\n link_label: input.content.linkLabel,\n link_url: input.content.linkUrl,\n link_target: input.content.linkTarget,\n },\n starts_at: input.startsAt,\n ends_at: input.endsAt,\n target_paths: input.targetPaths,\n priority: input.priority,\n repeat: input.repeat,\n };\n}\n\nfunction scheduleBody(schedule: typeof ExposureScheduleInput._output.schedule) {\n return schedule ? {\n start_mode: schedule.startMode, start_date: schedule.startDate, start_time: schedule.startTime,\n end_mode: schedule.endMode, end_date: schedule.endDate, end_time: schedule.endTime,\n end_preset: schedule.endPreset,\n } : undefined;\n}\n\nfunction optionalQuery(\n values: Readonly<Record<string, string | undefined>>,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(values).filter((entry): entry is [string, string] => entry[1] !== undefined),\n );\n}\n\nfunction assertNever(value: never): never {\n throw new CmsAutomationError(`Unknown management tool: ${String(value)}`);\n}\n","import { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\n\nimport { registerTools } from \"./tools.js\";\n\n// tsup define 으로 빌드타임 주입 — 비번들 실행(vitest 등)에서는 \"dev\".\ndeclare const __CMS_MCP_VERSION__: string | undefined;\nconst VERSION =\n typeof __CMS_MCP_VERSION__ === \"string\" ? __CMS_MCP_VERSION__ : \"dev\";\n\nexport const SERVER_INSTRUCTIONS = `\nroottale-cms-mcp는 RootTale CMS를 외부 사이트(주로 Next.js)에 연동하고\n글·썸네일·본문 이미지를 자동화하기 위한 문서·예시 코드·API tool을 제공합니다.\n\n지켜야 할 규칙:\n- RootTale 연동 관련 작업은 가장 먼저 listRootTaleDocs를 호출해 문서 목록을 파악하세요.\n- 연동 코드를 작성하기 전 반드시 readRootTaleNextjsExampleCode를 호출해 예시 코드를\n 참고한 후 그 패턴을 따라 작성하세요.\n- API 키(rtlk_cust_*)는 서버 전용입니다. NEXT_PUBLIC_* 등 브라우저로 노출되는\n 환경변수에 절대 넣지 마세요.\n- 글쓰기 전에 getSiteKnowledge로 브랜드 보이스와 용어 규칙을 확인하세요.\n- 새 글은 기본적으로 draft로 만들고, 사용자가 즉시 발행을 명시했을 때만\n publish=true 또는 publishCmsPost를 사용하세요.\n- 이미지는 uploadCmsMedia로 먼저 등록한 뒤 반환된 id를 featuredMediaId에,\n 반환된 URL을 Tiptap image 노드의 attrs.src에 사용하세요.\n- 글을 수정하거나 발행하기 전 analyzeCmsPostSeo로 SEO와 가독성을 확인하세요.\n- 개선할 글을 찾을 때 getCmsPostSeoScores를, 실제 유입 검색어를 고를 때\n getTopSeoKeywords를 사용하세요.\n- 이미 학습된 내용이더라도 본 서버의 문서로 더블체크 후 작업하세요.\n`.trim();\n\nexport function createServer(): Server {\n const server = new Server(\n { name: \"roottale-cms\", version: VERSION },\n { capabilities: { tools: {} }, instructions: SERVER_INSTRUCTIONS },\n );\n registerTools(server);\n return server;\n}\n","import type { Server } from \"@modelcontextprotocol/sdk/server/index.js\";\nimport {\n CallToolRequestSchema,\n ErrorCode,\n ListToolsRequestSchema,\n McpError,\n} from \"@modelcontextprotocol/sdk/types.js\";\nimport { z } from \"zod\";\n\nimport {\n AUTOMATION_TOOL_DEFINITIONS,\n callAutomationTool,\n isAutomationToolName,\n} from \"./automation-tools.js\";\nimport { requestRootTaleApi } from \"./api.js\";\nimport { listDocs, readDoc, readNextjsExampleCode, searchDocs } from \"./docs.js\";\nimport {\n callManagementTool,\n isManagementToolName,\n MANAGEMENT_TOOL_DEFINITIONS,\n} from \"./management-tools.js\";\nimport {\n callSeoTool,\n isSeoToolName,\n SEO_TOOL_DEFINITIONS,\n} from \"./seo-tools.js\";\n\nconst ReadDocInput = z.object({ path: z.string().min(1) }).strict();\nconst SearchDocsInput = z.object({ query: z.string().min(1) }).strict();\nconst ListPostsInput = z\n .object({\n limit: z.number().int().min(1).max(100).optional(),\n type: z.enum([\"post\", \"page\"]).optional(),\n cursor: z.string().optional(),\n })\n .strict();\nconst GetPostInput = z.object({ slugOrId: z.string().min(1) }).strict();\nconst GetSiteKnowledgeInput = z\n .object({ siteId: z.string().optional() })\n .strict();\n\nconst DOCUMENTATION_TOOL_DEFINITIONS = [\n {\n name: \"listRootTaleDocs\",\n description:\n \"RootTale CMS 통합 문서 전체 목록(경로·제목·설명)을 반환합니다. \" +\n \"RootTale 연동 작업을 시작하기 전 가장 먼저 호출하세요.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"readRootTaleDoc\",\n description:\n \"RootTale CMS 통합 문서 1개를 경로로 읽습니다. \" +\n \"경로는 listRootTaleDocs 가 반환한 path 값을 사용하세요.\",\n inputSchema: {\n type: \"object\",\n properties: {\n path: { type: \"string\", description: \"문서 경로 (예: blog.md)\" },\n },\n required: [\"path\"],\n additionalProperties: false,\n },\n },\n {\n name: \"searchRootTaleDocs\",\n description:\n \"RootTale CMS 통합 문서 전체에서 정규식으로 검색합니다 (대소문자 무시). \" +\n \"매치된 파일 경로·라인 번호·라인 내용을 반환합니다.\",\n inputSchema: {\n type: \"object\",\n properties: {\n query: { type: \"string\", description: \"정규식 패턴 (예: revalidate|webhook)\" },\n },\n required: [\"query\"],\n additionalProperties: false,\n },\n },\n {\n name: \"readRootTaleNextjsExampleCode\",\n description:\n \"RootTale CMS를 외부 Next.js(App Router) 사이트에 연동하는 완전한 예시 코드 세트를 반환합니다 \" +\n \"(블로그 목록/상세, 웹훅 revalidate 라우트, RSS/사이트맵, 상담문의 서버 액션 등). \" +\n \"연동 코드를 작성하기 전 반드시 호출해 패턴을 따라 작성하세요.\",\n inputSchema: { type: \"object\", properties: {}, additionalProperties: false },\n },\n {\n name: \"listPublishedPosts\",\n description:\n \"연동 검증용 — RootTale 공개 CMS API(GET /v1/cms/public/posts)로 발행된 글 목록을 조회합니다. \" +\n \"환경변수 ROOTTALE_API_KEY(rtlk_cust_*)가 필요합니다.\",\n inputSchema: {\n type: \"object\",\n properties: {\n limit: { type: \"number\", description: \"1-100, 기본 20\" },\n type: { type: \"string\", enum: [\"post\", \"page\"] },\n cursor: { type: \"string\", description: \"이전 응답의 next_cursor\" },\n },\n additionalProperties: false,\n },\n },\n {\n name: \"getPublishedPost\",\n description:\n \"연동 검증용 — RootTale 공개 CMS API(GET /v1/cms/public/posts/:identifier)로 발행된 글 1개를 \" +\n \"slug 또는 UUID로 조회합니다. 환경변수 ROOTTALE_API_KEY(rtlk_cust_*)가 필요합니다.\",\n inputSchema: {\n type: \"object\",\n properties: {\n slugOrId: { type: \"string\", description: \"글 slug 또는 UUID\" },\n },\n required: [\"slugOrId\"],\n additionalProperties: false,\n },\n },\n {\n name: \"getSiteKnowledge\",\n description:\n \"이 RootTale 사이트의 브랜드 보이스(어조·톤·화자)와 용어 규칙(금지어·교정어)을 조회합니다 \" +\n \"(GET /v1/cms/public/site-knowledge). 이 사이트에 맞는 글을 쓰기 전에 호출해 톤·표현을 맞추세요. \" +\n \"금지어는 쓰지 말고, 교정어는 권장 표현으로 바꿔 쓰세요. 환경변수 ROOTTALE_API_KEY(rtlk_cust_*)가 필요합니다.\",\n inputSchema: {\n type: \"object\",\n properties: {\n siteId: {\n type: \"string\",\n description: \"사이트 ID (선택, 미설정 시 기본 사이트)\",\n },\n },\n additionalProperties: false,\n },\n },\n] as const;\n\nexport const TOOL_DEFINITIONS = [\n ...DOCUMENTATION_TOOL_DEFINITIONS,\n ...AUTOMATION_TOOL_DEFINITIONS,\n ...MANAGEMENT_TOOL_DEFINITIONS,\n ...SEO_TOOL_DEFINITIONS,\n] as const;\n\nfunction textResponse(text: string) {\n return { content: [{ type: \"text\" as const, text }] };\n}\n\nfunction jsonResponse(value: unknown) {\n return textResponse(JSON.stringify(value, null, 2));\n}\n\nexport function registerTools(server: Server): void {\n server.setRequestHandler(ListToolsRequestSchema, async () => ({\n tools: TOOL_DEFINITIONS.map((t) => ({ ...t })),\n }));\n\n server.setRequestHandler(CallToolRequestSchema, async (request) => {\n const args = (request.params.arguments ?? {}) as Record<string, unknown>;\n try {\n if (isAutomationToolName(request.params.name)) {\n return jsonResponse(\n await callAutomationTool(request.params.name, args),\n );\n }\n if (isSeoToolName(request.params.name)) {\n return jsonResponse(await callSeoTool(request.params.name, args));\n }\n if (isManagementToolName(request.params.name)) {\n return jsonResponse(await callManagementTool(request.params.name, args));\n }\n switch (request.params.name) {\n case \"listRootTaleDocs\":\n return jsonResponse(await listDocs());\n case \"readRootTaleDoc\": {\n const input = ReadDocInput.parse(args);\n const content = await readDoc(input.path);\n if (content === null) {\n throw new McpError(\n ErrorCode.InvalidParams,\n `문서를 찾을 수 없습니다: ${input.path} — listRootTaleDocs로 경로를 확인하세요.`,\n );\n }\n return textResponse(content);\n }\n case \"searchRootTaleDocs\": {\n const input = SearchDocsInput.parse(args);\n return jsonResponse(await searchDocs(input.query));\n }\n case \"readRootTaleNextjsExampleCode\":\n return textResponse(await readNextjsExampleCode());\n case \"listPublishedPosts\": {\n const input = ListPostsInput.parse(args);\n const params: Record<string, string> = {};\n if (input.limit) params.limit = String(input.limit);\n if (input.type) params.type = input.type;\n if (input.cursor) params.cursor = input.cursor;\n return jsonResponse(\n await requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/public/posts\",\n query: params,\n }),\n );\n }\n case \"getPublishedPost\": {\n const input = GetPostInput.parse(args);\n return jsonResponse(\n await requestRootTaleApi({\n method: \"GET\",\n pathname: `/v1/cms/public/posts/${encodeURIComponent(input.slugOrId)}`,\n }),\n );\n }\n case \"getSiteKnowledge\": {\n const input = GetSiteKnowledgeInput.parse(args);\n const params: Record<string, string> = {};\n if (input.siteId) params.site_id = input.siteId;\n return jsonResponse(\n await requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/public/site-knowledge\",\n query: params,\n }),\n );\n }\n default:\n throw new McpError(\n ErrorCode.InvalidParams,\n `Unknown RootTale tool: ${request.params.name}`,\n );\n }\n } catch (error) {\n if (error instanceof McpError) throw error;\n const message = error instanceof Error ? error.message : String(error);\n return { isError: true, content: [{ type: \"text\" as const, text: message }] };\n }\n });\n}\n","/**\n * 패키지에 번들된 통합 문서(`docs/`)·예시 코드(`examples/`) 로더.\n *\n * dist/index.js 와 src/docs.ts 모두 패키지 루트에서 한 단계 아래이므로\n * `..` 상대 경로 해석이 빌드 전후 동일하다. npm publish 시 `files` 에\n * docs/, examples/ 가 포함되어 npx 환경에서도 같은 구조로 설치된다.\n */\nimport { readdir, readFile } from \"node:fs/promises\";\nimport path from \"node:path\";\nimport { fileURLToPath } from \"node:url\";\n\nconst PKG_ROOT = fileURLToPath(new URL(\"..\", import.meta.url));\nconst DOCS_ROOT = path.join(PKG_ROOT, \"docs\");\nconst EXAMPLES_ROOT = path.join(PKG_ROOT, \"examples\");\n\nexport interface DocEntry {\n /** docs/ 기준 상대 경로 (예: \"blog.md\"). */\n path: string;\n title: string;\n description: string;\n}\n\ninterface Frontmatter {\n title: string;\n description: string;\n}\n\n/** `---\\ntitle: ...\\ndescription: ...\\n---` 형태의 단순 frontmatter 파서. */\nexport function parseFrontmatter(markdown: string): Frontmatter {\n const result: Frontmatter = { title: \"\", description: \"\" };\n const match = markdown.match(/^---\\n([\\s\\S]*?)\\n---/);\n if (!match) return result;\n for (const line of match[1].split(\"\\n\")) {\n const idx = line.indexOf(\":\");\n if (idx === -1) continue;\n const key = line.slice(0, idx).trim();\n const value = line.slice(idx + 1).trim();\n if (key === \"title\") result.title = value;\n if (key === \"description\") result.description = value;\n }\n return result;\n}\n\nasync function walkFiles(root: string, dir = root): Promise<string[]> {\n const entries = await readdir(dir, { withFileTypes: true });\n const files: string[] = [];\n for (const entry of entries) {\n const full = path.join(dir, entry.name);\n if (entry.isDirectory()) {\n files.push(...(await walkFiles(root, full)));\n } else {\n files.push(path.relative(root, full));\n }\n }\n return files.sort();\n}\n\nexport async function listDocs(): Promise<DocEntry[]> {\n const files = (await walkFiles(DOCS_ROOT)).filter((f) => f.endsWith(\".md\"));\n return Promise.all(\n files.map(async (rel) => {\n const content = await readFile(path.join(DOCS_ROOT, rel), \"utf8\");\n const fm = parseFrontmatter(content);\n return { path: rel, title: fm.title || rel, description: fm.description };\n }),\n );\n}\n\n/** 경로 탈출(../) 방지 후 단일 문서 읽기. 없으면 null. */\nexport async function readDoc(relPath: string): Promise<string | null> {\n const resolved = path.resolve(DOCS_ROOT, relPath);\n if (!resolved.startsWith(DOCS_ROOT + path.sep)) return null;\n try {\n return await readFile(resolved, \"utf8\");\n } catch {\n return null;\n }\n}\n\nexport interface SearchMatch {\n path: string;\n line: number;\n text: string;\n}\n\n/** 모든 문서에 대해 정규식 검색 (대소문자 무시). 매치 라인을 반환. */\nexport async function searchDocs(query: string): Promise<SearchMatch[]> {\n const regex = new RegExp(query, \"i\");\n const matches: SearchMatch[] = [];\n for (const doc of await listDocs()) {\n const content = await readDoc(doc.path);\n if (!content) continue;\n content.split(\"\\n\").forEach((text, idx) => {\n if (regex.test(text)) {\n matches.push({ path: doc.path, line: idx + 1, text: text.trim() });\n }\n });\n }\n return matches;\n}\n\n/**\n * Next.js 통합 예시 코드 전체를 `--- FILE: <path> ---` 헤더로 이어붙여 반환.\n * 파일 수가 적어(통합 1세트) 한 번에 주는 쪽이 에이전트 왕복을 줄인다.\n */\nexport async function readNextjsExampleCode(): Promise<string> {\n const root = path.join(EXAMPLES_ROOT, \"nextjs\");\n const files = await walkFiles(root);\n const sections = await Promise.all(\n files.map(async (rel) => {\n const content = await readFile(path.join(root, rel), \"utf8\");\n return `--- FILE: ${rel} ---\\n${content}`;\n }),\n );\n return sections.join(\"\\n\\n\");\n}\n","import { z } from \"zod\";\n\nimport { requestRootTaleApi } from \"./api.js\";\nimport {\n isSeoToolName,\n SEO_TOOL_DEFINITIONS,\n type SeoToolName,\n} from \"./seo-definitions.js\";\n\nconst SiteIdInput = z.object({ siteId: z.string().optional() });\n\nconst TopKeywordsInput = SiteIdInput.extend({\n dateRange: z\n .enum([\n \"last_7_days\",\n \"last_30_days\",\n \"last_3_months\",\n \"last_6_months\",\n \"last_12_months\",\n ])\n .optional(),\n limit: z.number().int().min(1).max(100).optional(),\n}).strict();\n\nconst AnalyzePostInput = SiteIdInput.extend({\n postId: z.string().min(1),\n focusKeyword: z.string().max(200).optional(),\n}).strict();\n\nconst ScoresInput = SiteIdInput.extend({\n limit: z.number().int().min(1).max(100).optional(),\n type: z.enum([\"post\", \"page\"]).optional(),\n seoFilter: z.enum([\"bad\", \"ok\", \"good\", \"empty_keyword\"]).optional(),\n}).strict();\n\nexport { isSeoToolName, SEO_TOOL_DEFINITIONS };\n\nexport async function callSeoTool(\n name: SeoToolName,\n args: Record<string, unknown>,\n): Promise<unknown> {\n switch (name) {\n case \"getTopSeoKeywords\": {\n const input = TopKeywordsInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/seo/keywords\",\n query: optionalQuery({\n site_id: input.siteId,\n date_range: input.dateRange,\n limit: input.limit,\n }),\n });\n }\n case \"analyzeCmsPostSeo\": {\n const input = AnalyzePostInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname:\n `/v1/cms/seo/posts/${encodeURIComponent(input.postId)}/analysis`,\n query: optionalQuery({\n site_id: input.siteId,\n focus_keyword: input.focusKeyword,\n }),\n });\n }\n case \"getCmsPostSeoScores\": {\n const input = ScoresInput.parse(args);\n return requestRootTaleApi({\n method: \"GET\",\n pathname: \"/v1/cms/seo/scores\",\n query: optionalQuery({\n site_id: input.siteId,\n limit: input.limit,\n type: input.type,\n seo_filter: input.seoFilter,\n }),\n });\n }\n }\n}\n\nfunction optionalQuery(\n values: Readonly<Record<string, string | number | undefined>>,\n): Record<string, string> {\n return Object.fromEntries(\n Object.entries(values)\n .filter(\n (entry): entry is [string, string | number] =>\n entry[1] !== undefined,\n )\n .map(([key, value]) => [key, String(value)]),\n );\n}\n","type JsonSchemaProperty = Readonly<Record<string, unknown>>;\n\nconst DATE_RANGES = [\n \"last_7_days\",\n \"last_30_days\",\n \"last_3_months\",\n \"last_6_months\",\n \"last_12_months\",\n] as const;\n\nexport const SEO_TOOL_DEFINITIONS = [\n tool(\n \"getTopSeoKeywords\",\n \"Google Search Console에서 사이트의 상위 검색어와 클릭·노출·CTR·평균 순위를 조회합니다.\",\n {\n siteId: stringProperty(\"사이트 ID\"),\n dateRange: enumProperty(DATE_RANGES, \"조회 기간, 기본 last_30_days\"),\n limit: numberProperty(\"1-100, 기본 25\"),\n },\n ),\n tool(\n \"analyzeCmsPostSeo\",\n \"ROOT-ADMIN과 같은 규칙으로 글의 SEO와 한국어 가독성을 다시 검사합니다. 글을 수정하거나 발행하기 전에 사용하세요.\",\n {\n postId: stringProperty(\"분석할 글 ID\"),\n siteId: stringProperty(\"사이트 ID\"),\n focusKeyword: stringProperty(\"이번 분석에 사용할 집중 키워드\"),\n },\n [\"postId\"],\n ),\n tool(\n \"getCmsPostSeoScores\",\n \"발행된 글의 최신 SEO 점수와 등급을 조회합니다. 개선이 필요한 글이나 집중 키워드가 없는 글을 찾을 수 있습니다.\",\n {\n siteId: stringProperty(\"사이트 ID\"),\n limit: numberProperty(\"1-100, 기본 10\"),\n type: enumProperty([\"post\", \"page\"], \"콘텐츠 유형\"),\n seoFilter: enumProperty(\n [\"bad\", \"ok\", \"good\", \"empty_keyword\"],\n \"SEO 상태 필터\",\n ),\n },\n ),\n] as const;\n\nexport type SeoToolName = (typeof SEO_TOOL_DEFINITIONS)[number][\"name\"];\n\nexport function isSeoToolName(name: string): name is SeoToolName {\n return SEO_TOOL_DEFINITIONS.some((definition) => definition.name === name);\n}\n\nfunction tool<const TName extends string>(\n name: TName,\n description: string,\n properties: Readonly<Record<string, JsonSchemaProperty>>,\n required: readonly string[] = [],\n) {\n return {\n name,\n description,\n inputSchema: {\n type: \"object\",\n properties,\n ...(required.length > 0 ? { required } : {}),\n additionalProperties: false,\n },\n } as const;\n}\n\nfunction stringProperty(description: string): JsonSchemaProperty {\n return { type: \"string\", description };\n}\n\nfunction numberProperty(description: string): JsonSchemaProperty {\n return { type: \"number\", description };\n}\n\nfunction enumProperty(\n values: readonly string[],\n description: string,\n): JsonSchemaProperty {\n return { type: \"string\", enum: values, description };\n}\n"],"mappings":"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","names":["readFile","z","z","tool","z","SiteId","optionalQuery","assertNever","readFile","z","readFile","z","tool","stringProperty","enumProperty","numberProperty","z","optionalQuery","z"]}