202 lines
5.5 KiB
TypeScript
202 lines
5.5 KiB
TypeScript
/**
|
|
* Intercom Articles Tools
|
|
*/
|
|
|
|
import { z } from 'zod';
|
|
import { Tool } from '@modelcontextprotocol/sdk/types.js';
|
|
import type { IntercomClient } from '../clients/intercom.js';
|
|
|
|
// Zod schemas
|
|
const CreateArticleSchema = z.object({
|
|
title: z.string(),
|
|
description: z.string().optional(),
|
|
body: z.string().optional(),
|
|
author_id: z.string(),
|
|
state: z.enum(['published', 'draft']).optional(),
|
|
parent_id: z.string().optional(),
|
|
parent_type: z.enum(['collection', 'section']).optional(),
|
|
});
|
|
|
|
const UpdateArticleSchema = z.object({
|
|
id: z.string(),
|
|
title: z.string().optional(),
|
|
description: z.string().optional(),
|
|
body: z.string().optional(),
|
|
author_id: z.string().optional(),
|
|
state: z.enum(['published', 'draft']).optional(),
|
|
parent_id: z.string().optional(),
|
|
parent_type: z.enum(['collection', 'section']).optional(),
|
|
});
|
|
|
|
// Tool definitions
|
|
export function getTools(client: IntercomClient): Array<{
|
|
definition: Tool;
|
|
handler: (args: Record<string, unknown>) => Promise<unknown>;
|
|
}> {
|
|
return [
|
|
{
|
|
definition: {
|
|
name: 'intercom_list_articles',
|
|
description: 'List all help center articles with pagination.',
|
|
inputSchema: {
|
|
type: 'object',
|
|
properties: {
|
|
per_page: {
|
|
type: 'number',
|
|
description: 'Number of results per page',
|
|
},
|
|
page: {
|
|
type: 'number',
|
|
description: 'Page number',
|
|
},
|
|
},
|
|
},
|
|
},
|
|
handler: async (args) => {
|
|
const params = args as { per_page?: number; page?: number };
|
|
return client.listArticles(params);
|
|
},
|
|
},
|
|
|
|
{
|
|
definition: {
|
|
name: 'intercom_get_article',
|
|
description: 'Retrieve a specific article by ID.',
|
|
inputSchema: {
|
|
type: 'object',
|
|
properties: {
|
|
id: {
|
|
type: 'string',
|
|
description: 'Article ID',
|
|
},
|
|
},
|
|
required: ['id'],
|
|
},
|
|
},
|
|
handler: async (args) => {
|
|
const { id } = args as { id: string };
|
|
return client.getArticle(id as any);
|
|
},
|
|
},
|
|
|
|
{
|
|
definition: {
|
|
name: 'intercom_create_article',
|
|
description: 'Create a new help center article. Can be published immediately or saved as draft.',
|
|
inputSchema: {
|
|
type: 'object',
|
|
properties: {
|
|
title: {
|
|
type: 'string',
|
|
description: 'Article title (required)',
|
|
},
|
|
description: {
|
|
type: 'string',
|
|
description: 'Short description/summary',
|
|
},
|
|
body: {
|
|
type: 'string',
|
|
description: 'Article body content (HTML or markdown)',
|
|
},
|
|
author_id: {
|
|
type: 'string',
|
|
description: 'Admin ID of the author (required)',
|
|
},
|
|
state: {
|
|
type: 'string',
|
|
enum: ['published', 'draft'],
|
|
description: 'Publication state (default: draft)',
|
|
},
|
|
parent_id: {
|
|
type: 'string',
|
|
description: 'Collection or Section ID to place article in',
|
|
},
|
|
parent_type: {
|
|
type: 'string',
|
|
enum: ['collection', 'section'],
|
|
description: 'Type of parent (collection or section)',
|
|
},
|
|
},
|
|
required: ['title', 'author_id'],
|
|
},
|
|
},
|
|
handler: async (args) => {
|
|
const data = CreateArticleSchema.parse(args);
|
|
return client.createArticle(data as any);
|
|
},
|
|
},
|
|
|
|
{
|
|
definition: {
|
|
name: 'intercom_update_article',
|
|
description: 'Update an existing article by ID.',
|
|
inputSchema: {
|
|
type: 'object',
|
|
properties: {
|
|
id: {
|
|
type: 'string',
|
|
description: 'Article ID',
|
|
},
|
|
title: {
|
|
type: 'string',
|
|
description: 'Article title',
|
|
},
|
|
description: {
|
|
type: 'string',
|
|
description: 'Description',
|
|
},
|
|
body: {
|
|
type: 'string',
|
|
description: 'Article body content',
|
|
},
|
|
author_id: {
|
|
type: 'string',
|
|
description: 'Author admin ID',
|
|
},
|
|
state: {
|
|
type: 'string',
|
|
enum: ['published', 'draft'],
|
|
description: 'Publication state',
|
|
},
|
|
parent_id: {
|
|
type: 'string',
|
|
description: 'Parent collection or section ID',
|
|
},
|
|
parent_type: {
|
|
type: 'string',
|
|
enum: ['collection', 'section'],
|
|
description: 'Parent type',
|
|
},
|
|
},
|
|
required: ['id'],
|
|
},
|
|
},
|
|
handler: async (args) => {
|
|
const { id, ...data } = UpdateArticleSchema.parse(args);
|
|
return client.updateArticle(id as any, data as any);
|
|
},
|
|
},
|
|
|
|
{
|
|
definition: {
|
|
name: 'intercom_delete_article',
|
|
description: 'Permanently delete an article by ID. This action cannot be undone.',
|
|
inputSchema: {
|
|
type: 'object',
|
|
properties: {
|
|
id: {
|
|
type: 'string',
|
|
description: 'Article ID to delete',
|
|
},
|
|
},
|
|
required: ['id'],
|
|
},
|
|
},
|
|
handler: async (args) => {
|
|
const { id } = args as { id: string };
|
|
return client.deleteArticle(id as any);
|
|
},
|
|
},
|
|
];
|
|
}
|