handlers.ts•2.67 kB
import { McpServer } from 'tmcp';
import type { GenericSchema } from 'valibot';
import { available_providers } from './tools.js';
export const setup_handlers = (server: McpServer<GenericSchema>) => {
	// Provider Status Resource
	server.resource(
		{
			name: 'provider-status',
			description: 'Current status of all search providers',
			uri: 'omnisearch://providers/status',
		},
		async () => {
			return {
				contents: [
					{
						uri: 'omnisearch://providers/status',
						mimeType: 'application/json',
						text: JSON.stringify(
							{
								status: 'operational',
								providers: {
									search: Array.from(available_providers.search),
									ai_response: Array.from(
										available_providers.ai_response,
									),
									processing: Array.from(
										available_providers.processing,
									),
									enhancement: Array.from(
										available_providers.enhancement,
									),
								},
								available_count: {
									search: available_providers.search.size,
									ai_response: available_providers.ai_response.size,
									processing: available_providers.processing.size,
									enhancement: available_providers.enhancement.size,
									total:
										available_providers.search.size +
										available_providers.ai_response.size +
										available_providers.processing.size +
										available_providers.enhancement.size,
								},
							},
							null,
							2,
						),
					},
				],
			};
		},
	);
	// Provider Info Resource Template
	server.resource(
		{
			name: 'provider-info',
			description: 'Information about a specific search provider',
			uri: 'omnisearch://search/{provider}/info',
		},
		async (uri) => {
			// Handle provider info template
			const providerMatch = uri.match(
				/^omnisearch:\/\/search\/([^/]+)\/info$/,
			);
			if (providerMatch) {
				const providerName = providerMatch[1];
				// Check if provider is available
				const isAvailable =
					available_providers.search.has(providerName) ||
					available_providers.ai_response.has(providerName);
				if (!isAvailable) {
					throw new Error(
						`Provider not available: ${providerName} (missing API key)`,
					);
				}
				return {
					contents: [
						{
							uri,
							mimeType: 'application/json',
							text: JSON.stringify(
								{
									name: providerName,
									status: 'active',
									capabilities: ['web_search', 'news_search'],
									rate_limits: {
										requests_per_minute: 60,
										requests_per_day: 1000,
									},
								},
								null,
								2,
							),
						},
					],
				};
			}
			throw new Error(`Unknown resource URI: ${uri}`);
		},
	);
};