import { Tool } from '@modelcontextprotocol/sdk/types.js';
import { FetchRssSchema } from '../utils/validation.js';
import { RssParser } from '../utils/rss-parser.js';
import { ConfigManager } from '../config/manager.js';
export function createFetchRssTool(configManager: ConfigManager): Tool {
return {
name: 'fetch_rss_feed',
description: 'RSS/Atomフィードを取得・解析します',
inputSchema: {
type: 'object',
properties: {
url: {
type: 'string',
description: 'RSS/AtomフィードのURL'
},
limit: {
type: 'number',
description: '取得する記事数の上限(デフォルト: 10)',
minimum: 1,
maximum: 100,
default: 10
},
includeContent: {
type: 'boolean',
description: '記事の全文を含めるか(デフォルト: false)',
default: false
},
startDate: {
type: 'string',
description: '取得開始日(ISO 8601形式、例: 2024-01-01T00:00:00Z)',
format: 'date-time'
},
endDate: {
type: 'string',
description: '取得終了日(ISO 8601形式、例: 2024-12-31T23:59:59Z)',
format: 'date-time'
}
},
required: ['url']
}
};
}
export async function handleFetchRss(
args: any,
configManager: ConfigManager
): Promise<any> {
try {
const params = FetchRssSchema.parse(args);
const config = configManager.getConfig();
const parser = new RssParser(config.timeout, config.userAgent);
const result = await parser.fetchFeed(params.url, params.limit, params.includeContent, params.startDate, params.endDate);
return result;
} catch (error) {
if (error instanceof Error && 'issues' in error) {
return {
error: true,
code: 'VALIDATION_ERROR',
message: '入力パラメータが無効です',
details: error
};
}
return {
error: true,
code: 'NETWORK_ERROR',
message: `予期しないエラー: ${error instanceof Error ? error.message : 'Unknown error'}`
};
}
}