/**
* コンテンツ取得ツール
*/
import { z } from 'zod';
import { requireMTClient } from '../utils/connection-manager.js';
// サイト一覧取得のスキーマ
export const listSitesSchema = z.object({});
// 記事一覧取得のスキーマ
export const listEntriesSchema = z.object({
siteId: z.number().describe('サイトID'),
limit: z.number().optional().default(20).describe('取得件数(デフォルト: 20)'),
offset: z.number().optional().default(0).describe('オフセット(デフォルト: 0)'),
status: z.string().optional().describe('ステータスフィルタ(例: Publish, Draft)'),
});
// 記事取得のスキーマ
export const getEntrySchema = z.object({
siteId: z.number().describe('サイトID'),
entryId: z.number().describe('記事ID'),
});
// ウェブページ一覧取得のスキーマ
export const listPagesSchema = z.object({
siteId: z.number().describe('サイトID'),
limit: z.number().optional().default(20).describe('取得件数(デフォルト: 20)'),
offset: z.number().optional().default(0).describe('オフセット(デフォルト: 0)'),
status: z.string().optional().describe('ステータスフィルタ(例: Publish, Draft)'),
});
// ウェブページ取得のスキーマ
export const getPageSchema = z.object({
siteId: z.number().describe('サイトID'),
pageId: z.number().describe('ウェブページID'),
});
// コンテンツタイプ一覧取得のスキーマ
export const listContentTypesSchema = z.object({
siteId: z.number().describe('サイトID'),
});
// コンテンツデータ一覧取得のスキーマ
export const listContentDataSchema = z.object({
siteId: z.number().describe('サイトID'),
contentTypeId: z.number().describe('コンテンツタイプID'),
limit: z.number().optional().default(20).describe('取得件数(デフォルト: 20)'),
offset: z.number().optional().default(0).describe('オフセット(デフォルト: 0)'),
});
// コンテンツデータ取得のスキーマ
export const getContentDataSchema = z.object({
siteId: z.number().describe('サイトID'),
contentTypeId: z.number().describe('コンテンツタイプID'),
contentDataId: z.number().describe('コンテンツデータID'),
});
/**
* サイト一覧を取得
*/
export async function handleListSites() {
const client = await requireMTClient();
const sites = await client.getSites();
if (sites.length === 0) {
return {
content: [{
type: 'text' as const,
text: 'サイトが見つかりませんでした。',
}],
};
}
const list = sites.map(s => `[${s.id}] ${s.name}\n URL: ${s.url || '(未設定)'}`).join('\n\n');
return {
content: [{
type: 'text' as const,
text: `サイト一覧 (${sites.length}件):\n\n${list}`,
}],
};
}
/**
* 記事一覧を取得
*/
export async function handleListEntries(args: z.infer<typeof listEntriesSchema>) {
const client = await requireMTClient();
const result = await client.getEntries(args.siteId, {
limit: args.limit,
offset: args.offset,
status: args.status,
});
if (result.items.length === 0) {
return {
content: [{
type: 'text' as const,
text: '記事が見つかりませんでした。',
}],
};
}
const list = result.items.map(e => {
const bodyPreview = e.body ? e.body.substring(0, 100).replace(/\n/g, ' ') + '...' : '(本文なし)';
return `[${e.id}] ${e.title}\n ステータス: ${e.status}\n 本文プレビュー: ${bodyPreview}`;
}).join('\n\n');
return {
content: [{
type: 'text' as const,
text: `記事一覧 (${result.items.length}/${result.totalResults}件):\n\n${list}`,
}],
};
}
/**
* 記事を取得
*/
export async function handleGetEntry(args: z.infer<typeof getEntrySchema>) {
const client = await requireMTClient();
const entry = await client.getEntry(args.siteId, args.entryId);
return {
content: [{
type: 'text' as const,
text: JSON.stringify({
id: entry.id,
title: entry.title,
status: entry.status,
date: entry.date,
body: entry.body,
more: entry.more,
categories: entry.categories,
tags: entry.tags,
}, null, 2),
}],
};
}
/**
* ウェブページ一覧を取得
*/
export async function handleListPages(args: z.infer<typeof listPagesSchema>) {
const client = await requireMTClient();
const result = await client.getPages(args.siteId, {
limit: args.limit,
offset: args.offset,
status: args.status,
});
if (result.items.length === 0) {
return {
content: [{
type: 'text' as const,
text: 'ウェブページが見つかりませんでした。',
}],
};
}
const list = result.items.map(p => {
const bodyPreview = p.body ? p.body.substring(0, 100).replace(/\n/g, ' ') + '...' : '(本文なし)';
return `[${p.id}] ${p.title}\n ステータス: ${p.status}\n 本文プレビュー: ${bodyPreview}`;
}).join('\n\n');
return {
content: [{
type: 'text' as const,
text: `ウェブページ一覧 (${result.items.length}/${result.totalResults}件):\n\n${list}`,
}],
};
}
/**
* ウェブページを取得
*/
export async function handleGetPage(args: z.infer<typeof getPageSchema>) {
const client = await requireMTClient();
const page = await client.getPage(args.siteId, args.pageId);
return {
content: [{
type: 'text' as const,
text: JSON.stringify({
id: page.id,
title: page.title,
status: page.status,
date: page.date,
body: page.body,
more: page.more,
folder: page.folder,
}, null, 2),
}],
};
}
/**
* コンテンツタイプ一覧を取得
*/
export async function handleListContentTypes(args: z.infer<typeof listContentTypesSchema>) {
const client = await requireMTClient();
const result = await client.getContentTypes(args.siteId);
if (result.items.length === 0) {
return {
content: [{
type: 'text' as const,
text: 'コンテンツタイプが見つかりませんでした。',
}],
};
}
const list = result.items.map(ct => {
const fields = ct.fields?.map(f => `${f.label} (${f.type})`).join(', ') || '(フィールドなし)';
return `[${ct.id}] ${ct.name}\n フィールド: ${fields}`;
}).join('\n\n');
return {
content: [{
type: 'text' as const,
text: `コンテンツタイプ一覧 (${result.items.length}件):\n\n${list}`,
}],
};
}
/**
* コンテンツデータ一覧を取得
*/
export async function handleListContentData(args: z.infer<typeof listContentDataSchema>) {
const client = await requireMTClient();
const result = await client.getContentData(args.siteId, args.contentTypeId, {
limit: args.limit,
offset: args.offset,
});
if (result.items.length === 0) {
return {
content: [{
type: 'text' as const,
text: 'コンテンツデータが見つかりませんでした。',
}],
};
}
const list = result.items.map(cd => {
return `[${cd.id}] ${cd.label || '(ラベルなし)'}\n ステータス: ${cd.status}`;
}).join('\n\n');
return {
content: [{
type: 'text' as const,
text: `コンテンツデータ一覧 (${result.items.length}/${result.totalResults}件):\n\n${list}`,
}],
};
}
/**
* コンテンツデータを取得
*/
export async function handleGetContentData(args: z.infer<typeof getContentDataSchema>) {
const client = await requireMTClient();
const data = await client.getContentDataItem(args.siteId, args.contentTypeId, args.contentDataId);
return {
content: [{
type: 'text' as const,
text: JSON.stringify(data, null, 2),
}],
};
}