MCP-сервер - Интеграция для разработчиков
В этом руководстве рассматривается программная интеграция с MCP-сервером finlight. Используйте его для создания пользовательских ИИ-приложений, автоматизации получения новостей или интеграции финансовых новостей в существующие системы.
Информация о сервере
| Среда | URL |
|---|---|
| Продакшен | https://mcp.finlight.me |
Сервер реализует MCP (Model Context Protocol) через JSON-RPC 2.0 поверх HTTP.
Аутентификация
Все вызовы инструментов требуют аутентификации через токен Bearer. Ваш ключ API finlight служит токеном доступа.
Authorization: Bearer YOUR_API_KEY
Для автоматизированных потоков OAuth (как в Claude Desktop) сервер реализует OAuth 2.0 с PKCE. Подробнее см. в разделе Поток OAuth.
Быстрый старт
С помощью cURL
Список доступных инструментов:
curl -X POST https://mcp.finlight.me \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/list"
}'
Поиск статей:
curl -X POST https://mcp.finlight.me \
-H "Content-Type: application/json" \
-H "Authorization: Bearer YOUR_API_KEY" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_articles",
"arguments": {
"query": "NVIDIA earnings",
"tickers": ["NVDA"],
"pageSize": 10
}
}
}'
С помощью TypeScript
import { Client } from "@modelcontextprotocol/sdk/client/index.js";
import { StreamableHTTPClientTransport } from "@modelcontextprotocol/sdk/client/streamableHttp.js";
const transport = new StreamableHTTPClientTransport(
new URL("https://mcp.finlight.me"),
{
requestInit: {
headers: {
Authorization: `Bearer ${process.env.FINLIGHT_API_KEY}`,
},
},
}
);
const client = new Client({
name: "my-app",
version: "1.0.0",
});
await client.connect(transport);
// List available tools
const tools = await client.listTools();
console.log("Available tools:", tools);
// Search articles
const result = await client.callTool({
name: "search_articles",
arguments: {
query: "Federal Reserve interest rates",
from: "2024-01-01",
pageSize: 5,
},
});
console.log("Articles:", result);
С помощью Python
import requests
import json
API_KEY = "your-api-key"
MCP_URL = "https://mcp.finlight.me"
def mcp_request(method: str, params: dict = None):
response = requests.post(
MCP_URL,
headers={
"Content-Type": "application/json",
"Authorization": f"Bearer {API_KEY}",
},
json={
"jsonrpc": "2.0",
"id": 1,
"method": method,
"params": params or {},
},
)
return response.json()
# List available tools
tools = mcp_request("tools/list")
print("Available tools:", json.dumps(tools, indent=2))
# Search articles
articles = mcp_request("tools/call", {
"name": "search_articles",
"arguments": {
"query": "Tesla Model 3",
"tickers": ["TSLA"],
"from": "2024-01-01",
"pageSize": 10,
},
})
print("Articles:", json.dumps(articles, indent=2))
Доступные инструменты
search_articles
Поиск финансовых новостных статей с расширенной фильтрацией и анализом тональности.
Параметры:
| Параметр | Тип | Описание |
|---|---|---|
query | string | Поисковый запрос с булевыми операторами (AND, OR, NOT) и фильтрами полей (ticker:AAPL, source:reuters.com) |
tickers | string[] | Фильтрация по тикерам (напр., ["AAPL", "NVDA"]) |
sources | string[] | Ограничение определёнными доменами источников новостей |
optInSources | string[] | Добавляет источники к набору по умолчанию (а не заменяет) |
excludeSources | string[] | Исключает определённые источники из результатов |
countries | string[] | Фильтрация по кодам стран ISO 3166-1 alpha-2 |
from | string | Дата начала (YYYY-MM-DD или ISO 8601) |
to | string | Дата окончания (YYYY-MM-DD или ISO 8601) |
language | string | Код языка (по умолчанию: "en") |
includeContent | boolean | Включает полный текст статьи (требует подписки) |
includeEntities | boolean | Включает помеченные сущности компаний |
excludeEmptyContent | boolean | Пропускает статьи без содержимого |
order | "ASC" | "DESC" | Порядок сортировки (по умолчанию: DESC = сначала новые) |
orderBy | "publishDate" | "createdAt" | "revisedDate" | Поле сортировки — revisedDate сортирует по самой недавней дате правки |
pageSize | number | Результатов на странице (1-100, по умолчанию: 20) |
page | number | Номер страницы (по умолчанию: 1) |
Пример запроса:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "search_articles",
"arguments": {
"query": "earnings report",
"tickers": ["AAPL", "MSFT"],
"from": "2024-01-01",
"to": "2024-03-31",
"language": "en",
"pageSize": 20
}
}
}
Пример ответа:
{
"jsonrpc": "2.0",
"result": {
"content": [{
"type": "text",
"text": "{\"articles\":[{\"title\":\"Apple Reports Record Q1...\",\"summary\":\"...\",\"link\":\"https://...\",\"publishDate\":\"2024-02-01T16:30:00Z\",\"source\":\"www.reuters.com\",\"sentiment\":\"positive\",\"sentimentConfidence\":0.92}],\"totalResults\":847,\"page\":1,\"pageSize\":20}"
}]
},
"id": 1
}
get_article_by_link
Получает конкретную статью по её URL.
Параметры:
| Параметр | Тип | Обязательный | Описание |
|---|---|---|---|
link | string | Да | Полный URL статьи |
includeContent | boolean | Нет | Включает полный текст статьи |
includeEntities | boolean | Нет | Включает помеченные сущности компаний |
Пример запроса:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "get_article_by_link",
"arguments": {
"link": "https://www.reuters.com/technology/example-article",
"includeContent": true,
"includeEntities": true
}
}
}
list_sources
Получает все доступные источники новостей с метаданными.
Параметры: Нет
Пример запроса:
{
"jsonrpc": "2.0",
"id": 1,
"method": "tools/call",
"params": {
"name": "list_sources",
"arguments": {}
}
}
Ответ включает:
domain- Домен сайта источникаisDefaultSource- Включён ли в поиск по умолчаниюisContentAvailable- Поддерживается ли получение полного содержимого
Методы протокола MCP
Сервер реализует следующие методы протокола MCP:
| Метод | Описание |
|---|---|
initialize | Инициализирует сессию MCP |
notifications/initialized | Подтверждает завершение инициализации |
tools/list | Перечисляет доступные инструменты и их схемы |
tools/call | Выполняет инструмент с аргументами |
ping | Проверка работоспособности |
Пример Initialize:
{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2024-11-05",
"capabilities": {},
"clientInfo": {
"name": "my-client",
"version": "1.0.0"
}
}
}
Ответ:
{
"jsonrpc": "2.0",
"result": {
"protocolVersion": "2024-11-05",
"capabilities": {
"tools": {}
},
"serverInfo": {
"name": "finlight-news-api",
"version": "1.0.0"
}
},
"id": 1
}
Поток OAuth
Для клиентов, поддерживающих OAuth (как Claude Desktop), сервер реализует OAuth 2.0 с PKCE.
Эндпоинты
| Эндпоинт | Метод | Описание |
|---|---|---|
/.well-known/oauth-protected-resource | GET | Метаданные защищённого ресурса |
/.well-known/oauth-authorization-server | GET | Метаданные сервера авторизации |
/register | POST | Динамическая регистрация клиента |
/authorize | GET | Страница авторизации |
/authorize/submit | POST | Обработка авторизации |
/token | POST | Обмен кода на токен |
Обзор потока
1. Client discovers OAuth endpoints via .well-known
2. Client optionally registers via /register
3. Client redirects user to /authorize with PKCE challenge
4. User enters API key and submits
5. Server redirects back with authorization code
6. Client exchanges code + verifier for access token
7. Client uses access token as Bearer token for API calls
Функции безопасности
- PKCE обязателен - предотвращает перехват кода авторизации
- Самошифрующиеся коды - шифрование AES-256-GCM, без сохранения состояния
- Коды с коротким сроком - истекают через 120 секунд
- Проверка Redirect URI - коды привязаны к исходному URI
Обработка ошибок
Коды ошибок JSON-RPC
| Код | Сообщение | Описание |
|---|---|---|
| -32700 | Parse error | Недопустимый JSON |
| -32600 | Invalid Request | Отсутствует jsonrpc или method |
| -32601 | Method not found | Неизвестный метод |
| -32602 | Invalid params | Недопустимые параметры инструмента |
| -32001 | Unauthorized | Отсутствует или недействителен ключ API |
| -32603 | Internal error | Ошибка на стороне сервера |
Ответы об ошибках API
Неуспешные вызовы инструментов возвращают структуру ошибки:
{
"jsonrpc": "2.0",
"result": {
"isError": true,
"content": [{
"type": "text",
"text": "Error: Invalid API key"
}]
},
"id": 1
}
Распространённые ошибки уровня HTTP:
| Статус | Описание |
|---|---|
| 401 | Недействительный ключ API |
| 403 | Подписка не разрешает эту операцию |
| 429 | Превышен лимит скорости |
| 400 | Ошибка валидации |
Ограничения скорости
Ограничения скорости зависят от вашего тарифа подписки finlight. При превышении лимитов API возвращает код состояния 429.
Проверьте текущее использование и лимиты на app.finlight.me.
Поддержка
- Документация: docs.finlight.me
- Панель: app.finlight.me
- Поддержка: Свяжитесь с нами