Эта страница переведена машинным способом. Английская версия является источником и может быть точнее или новее. Открыть на английском

MCP-сервер - Интеграция для разработчиков

В этом руководстве рассматривается программная интеграция с MCP-сервером finlight. Используйте его для создания пользовательских ИИ-приложений, автоматизации получения новостей или интеграции финансовых новостей в существующие системы.


INFOЭндпоинты

Информация о сервере

СредаURL
Продакшенhttps://mcp.finlight.me

Сервер реализует MCP (Model Context Protocol) через JSON-RPC 2.0 поверх HTTP.


AUTHКлюч API

Аутентификация

Все вызовы инструментов требуют аутентификации через токен Bearer. Ваш ключ API finlight служит токеном доступа.

Authorization: Bearer YOUR_API_KEY

Для автоматизированных потоков OAuth (как в Claude Desktop) сервер реализует OAuth 2.0 с PKCE. Подробнее см. в разделе Поток OAuth.


QUICKSTARTПримеры

Быстрый старт

С помощью 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))

TOOLSСправочник

Доступные инструменты

search_articles

Поиск финансовых новостных статей с расширенной фильтрацией и анализом тональности.

Параметры:

ПараметрТипОписание
querystringПоисковый запрос с булевыми операторами (AND, OR, NOT) и фильтрами полей (ticker:AAPL, source:reuters.com)
tickersstring[]Фильтрация по тикерам (напр., ["AAPL", "NVDA"])
sourcesstring[]Ограничение определёнными доменами источников новостей
optInSourcesstring[]Добавляет источники к набору по умолчанию (а не заменяет)
excludeSourcesstring[]Исключает определённые источники из результатов
countriesstring[]Фильтрация по кодам стран ISO 3166-1 alpha-2
fromstringДата начала (YYYY-MM-DD или ISO 8601)
tostringДата окончания (YYYY-MM-DD или ISO 8601)
languagestringКод языка (по умолчанию: "en")
includeContentbooleanВключает полный текст статьи (требует подписки)
includeEntitiesbooleanВключает помеченные сущности компаний
excludeEmptyContentbooleanПропускает статьи без содержимого
order"ASC" | "DESC"Порядок сортировки (по умолчанию: DESC = сначала новые)
orderBy"publishDate" | "createdAt" | "revisedDate"Поле сортировки — revisedDate сортирует по самой недавней дате правки
pageSizenumberРезультатов на странице (1-100, по умолчанию: 20)
pagenumberНомер страницы (по умолчанию: 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.

Параметры:

ПараметрТипОбязательныйОписание
linkstringДаПолный URL статьи
includeContentbooleanНетВключает полный текст статьи
includeEntitiesbooleanНетВключает помеченные сущности компаний

Пример запроса:

{
  "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 - Поддерживается ли получение полного содержимого

PROTOCOLJSON-RPC

Методы протокола 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

Для клиентов, поддерживающих OAuth (как Claude Desktop), сервер реализует OAuth 2.0 с PKCE.

Эндпоинты

ЭндпоинтМетодОписание
/.well-known/oauth-protected-resourceGETМетаданные защищённого ресурса
/.well-known/oauth-authorization-serverGETМетаданные сервера авторизации
/registerPOSTДинамическая регистрация клиента
/authorizeGETСтраница авторизации
/authorize/submitPOSTОбработка авторизации
/tokenPOSTОбмен кода на токен

Обзор потока

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

ERRORSУстранение неполадок

Обработка ошибок

Коды ошибок JSON-RPC

КодСообщениеОписание
-32700Parse errorНедопустимый JSON
-32600Invalid RequestОтсутствует jsonrpc или method
-32601Method not foundНеизвестный метод
-32602Invalid paramsНедопустимые параметры инструмента
-32001UnauthorizedОтсутствует или недействителен ключ API
-32603Internal errorОшибка на стороне сервера

Ответы об ошибках API

Неуспешные вызовы инструментов возвращают структуру ошибки:

{
  "jsonrpc": "2.0",
  "result": {
    "isError": true,
    "content": [{
      "type": "text",
      "text": "Error: Invalid API key"
    }]
  },
  "id": 1
}

Распространённые ошибки уровня HTTP:

СтатусОписание
401Недействительный ключ API
403Подписка не разрешает эту операцию
429Превышен лимит скорости
400Ошибка валидации

LIMITSКвоты

Ограничения скорости

Ограничения скорости зависят от вашего тарифа подписки finlight. При превышении лимитов API возвращает код состояния 429.

Проверьте текущее использование и лимиты на app.finlight.me.


SUPPORTПомощь

Поддержка