import { VergeApiClient } from '../client/api.js';
import {
ListArticlesToolInput,
GetArticleToolInput,
CreateArticleToolInput,
UpdateArticleToolInput,
PublishArticleToolInput,
DeleteArticleToolInput,
} from './schemas.js';
/**
* verge_list_articles ツール
* 記事一覧を取得 (検索・フィルタリング可能)
*/
export async function handleListArticles(
input: ListArticlesToolInput,
apiClient: VergeApiClient
) {
try {
// category_ids と tag_ids をカンマ区切り文字列に変換
const query = {
search: input.search,
status: input.status,
categories: input.category_ids?.join(','),
tags: input.tag_ids?.join(','),
};
const articles = await apiClient.listArticles(input.blog_id, query);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: true,
count: articles.length,
articles: articles.map((article) => ({
id: article.id,
title: article.title,
slug: article.slug,
status: article.status,
excerpt: article.excerpt,
published_at: article.published_at,
created_at: article.created_at,
updated_at: article.updated_at,
author: article.author,
categories: article.categories,
tags: article.tags,
})),
},
null,
2
),
},
],
};
} catch (error) {
return {
isError: true,
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: false,
error: error instanceof Error ? error.message : String(error),
},
null,
2
),
},
],
};
}
}
/**
* verge_get_article ツール
* 記事詳細を取得
*/
export async function handleGetArticle(input: GetArticleToolInput, apiClient: VergeApiClient) {
try {
const article = await apiClient.getArticle(input.blog_id, input.article_id);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: true,
article: {
id: article.id,
blog_id: article.blog_id,
title: article.title,
content: article.content,
slug: article.slug,
status: article.status,
featured_image: article.featured_image,
excerpt: article.excerpt,
author_id: article.author_id,
published_at: article.published_at,
created_at: article.created_at,
updated_at: article.updated_at,
author: article.author,
categories: article.categories,
tags: article.tags,
},
},
null,
2
),
},
],
};
} catch (error) {
return {
isError: true,
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: false,
error: error instanceof Error ? error.message : String(error),
},
null,
2
),
},
],
};
}
}
/**
* verge_create_article ツール
* 新規記事を作成
*/
export async function handleCreateArticle(
input: CreateArticleToolInput,
apiClient: VergeApiClient
) {
try {
const { blog_id, ...articleData } = input;
const article = await apiClient.createArticle(blog_id, articleData);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: true,
message: '記事を作成しました',
article: {
id: article.id,
title: article.title,
slug: article.slug,
status: article.status,
featured_image: article.featured_image,
excerpt: article.excerpt,
published_at: article.published_at,
created_at: article.created_at,
},
},
null,
2
),
},
],
};
} catch (error) {
return {
isError: true,
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: false,
error: error instanceof Error ? error.message : String(error),
},
null,
2
),
},
],
};
}
}
/**
* verge_update_article ツール
* 既存記事を更新
*/
export async function handleUpdateArticle(
input: UpdateArticleToolInput,
apiClient: VergeApiClient
) {
try {
const { article_id, blog_id, ...updateData } = input;
const article = await apiClient.updateArticle(blog_id, article_id, updateData);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: true,
message: '記事を更新しました',
article: {
id: article.id,
title: article.title,
content: article.content,
slug: article.slug,
status: article.status,
published_at: article.published_at,
updated_at: article.updated_at,
},
},
null,
2
),
},
],
};
} catch (error) {
return {
isError: true,
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: false,
error: error instanceof Error ? error.message : String(error),
},
null,
2
),
},
],
};
}
}
/**
* verge_publish_article ツール
* 記事を公開状態に変更
*/
export async function handlePublishArticle(
input: PublishArticleToolInput,
apiClient: VergeApiClient
) {
try {
const article = await apiClient.updateArticle(input.blog_id, input.article_id, {
status: 'published',
});
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: true,
message: '記事を公開しました',
article: {
id: article.id,
title: article.title,
status: article.status,
published_at: article.published_at,
updated_at: article.updated_at,
},
},
null,
2
),
},
],
};
} catch (error) {
return {
isError: true,
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: false,
error: error instanceof Error ? error.message : String(error),
},
null,
2
),
},
],
};
}
}
/**
* verge_delete_article ツール
* 記事を削除
*/
export async function handleDeleteArticle(
input: DeleteArticleToolInput,
apiClient: VergeApiClient
) {
try {
await apiClient.deleteArticle(input.blog_id, input.article_id);
return {
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: true,
message: '記事を削除しました',
article_id: input.article_id,
},
null,
2
),
},
],
};
} catch (error) {
return {
isError: true,
content: [
{
type: 'text' as const,
text: JSON.stringify(
{
success: false,
error: error instanceof Error ? error.message : String(error),
},
null,
2
),
},
],
};
}
}