mcp-omnisearch
Version:
MCP server for integrating Omnisearch with LLMs
50 lines (49 loc) • 2.13 kB
JavaScript
import { http_json } from '../../../common/http.js';
import { ErrorType, ProviderError, } from '../../../common/types.js';
import { handle_provider_error, retry_with_backoff, validate_api_key, validate_processing_urls, } from '../../../common/utils.js';
import { config } from '../../../config/env.js';
export class JinaReaderProvider {
constructor() {
this.name = 'jina_reader';
this.description = 'Convert any URL to clean, LLM-friendly text using Jina Reader API';
// Validate API key exists at construction time
validate_api_key(config.processing.jina_reader.api_key, this.name);
}
async process_content(url) {
// Validate URL
validate_processing_urls(url, this.name);
const process_url = async () => {
const api_key = validate_api_key(config.processing.jina_reader.api_key, this.name);
const data = await http_json(this.name, 'https://r.jina.ai/', {
method: 'POST',
headers: {
Authorization: `Bearer ${api_key}`,
Accept: 'application/json',
'Content-Type': 'application/json',
},
body: JSON.stringify({ url }),
signal: AbortSignal.timeout(config.processing.jina_reader.timeout ?? 30000),
});
if (!data.data) {
throw new ProviderError(ErrorType.API_ERROR, 'Invalid response format from Jina Reader', this.name);
}
return {
content: data.data.content || '',
metadata: {
title: data.data.title || '',
date: data.data.timestamp || '',
word_count: (data.data.content || '')
.split(/\s+/)
.filter(Boolean).length,
},
source_provider: this.name,
};
};
try {
return await retry_with_backoff(process_url);
}
catch (error) {
handle_provider_error(error, this.name, 'process content');
}
}
}