Esta página foi traduzida automaticamente. A versão em inglês é a fonte e pode ser mais precisa ou estar mais atualizada. Ver em inglês

Servidor MCP - Integração para desenvolvedores

Este guia aborda a integração programática com o servidor MCP do finlight. Use-o para criar aplicações de IA personalizadas, automatizar a obtenção de notícias ou integrar notícias financeiras nos seus sistemas existentes.


INFOEndpoints

Informações do servidor

AmbienteURL
Produçãohttps://mcp.finlight.me

O servidor implementa o MCP (Model Context Protocol) via JSON-RPC 2.0 sobre HTTP.


AUTHChave de API

Autenticação

Todas as chamadas de ferramentas exigem autenticação via token Bearer. Sua chave de API do finlight serve como token de acesso.

Authorization: Bearer YOUR_API_KEY

Para fluxos OAuth automatizados (como o Claude Desktop), o servidor implementa OAuth 2.0 com PKCE. Consulte Fluxo OAuth para mais detalhes.


QUICKSTARTExemplos

Início rápido

Usando cURL

Listar as ferramentas disponíveis:

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"
  }'

Buscar artigos:

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
      }
    }
  }'

Usando 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);

Usando 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))

TOOLSReferência

Ferramentas disponíveis

search_articles

Busca artigos de notícias financeiras com filtragem avançada e análise de sentimento.

Parâmetros:

ParâmetroTipoDescrição
querystringConsulta de busca com operadores booleanos (AND, OR, NOT) e filtros de campo (ticker:AAPL, source:reuters.com)
tickersstring[]Filtra por símbolos de ticker (ex.: ["AAPL", "NVDA"])
sourcesstring[]Limita a domínios de fontes de notícias específicos
optInSourcesstring[]Adiciona fontes ao conjunto padrão (em vez de substituir)
excludeSourcesstring[]Exclui fontes específicas dos resultados
countriesstring[]Filtra por códigos de país ISO 3166-1 alpha-2
fromstringData de início (YYYY-MM-DD ou ISO 8601)
tostringData de fim (YYYY-MM-DD ou ISO 8601)
languagestringCódigo de idioma (padrão: "en")
includeContentbooleanInclui o texto completo do artigo (requer assinatura)
includeEntitiesbooleanInclui as entidades de empresa marcadas
excludeEmptyContentbooleanIgnora artigos sem conteúdo
order"ASC" | "DESC"Ordem de classificação (padrão: DESC = mais recente primeiro)
orderBy"publishDate" | "createdAt" | "revisedDate"Campo de ordenação — revisedDate ordena pela data de revisão mais recente
pageSizenumberResultados por página (1-100, padrão: 20)
pagenumberNúmero da página (padrão: 1)

Exemplo de solicitação:

{
  "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
    }
  }
}

Exemplo de resposta:

{
  "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

Recupera um artigo específico pela sua URL.

Parâmetros:

ParâmetroTipoObrigatórioDescrição
linkstringSimA URL completa do artigo
includeContentbooleanNãoInclui o texto completo do artigo
includeEntitiesbooleanNãoInclui as entidades de empresa marcadas

Exemplo de solicitação:

{
  "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

Obtém todas as fontes de notícias disponíveis com seus metadados.

Parâmetros: Nenhum

Exemplo de solicitação:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "tools/call",
  "params": {
    "name": "list_sources",
    "arguments": {}
  }
}

A resposta inclui:

  • domain - Domínio do site da fonte
  • isDefaultSource - Se está incluída nas buscas padrão
  • isContentAvailable - Se a recuperação de conteúdo completo é suportada

PROTOCOLJSON-RPC

Métodos do protocolo MCP

O servidor implementa estes métodos do protocolo MCP:

MétodoDescrição
initializeInicializa a sessão MCP
notifications/initializedConfirma que a inicialização foi concluída
tools/listLista as ferramentas disponíveis e seus esquemas
tools/callExecuta uma ferramenta com argumentos
pingVerificação de integridade

Exemplo de Initialize:

{
  "jsonrpc": "2.0",
  "id": 1,
  "method": "initialize",
  "params": {
    "protocolVersion": "2024-11-05",
    "capabilities": {},
    "clientInfo": {
      "name": "my-client",
      "version": "1.0.0"
    }
  }
}

Resposta:

{
  "jsonrpc": "2.0",
  "result": {
    "protocolVersion": "2024-11-05",
    "capabilities": {
      "tools": {}
    },
    "serverInfo": {
      "name": "finlight-news-api",
      "version": "1.0.0"
    }
  },
  "id": 1
}

OAUTHAutenticação

Fluxo OAuth

Para clientes que suportam OAuth (como o Claude Desktop), o servidor implementa OAuth 2.0 com PKCE.

Endpoints

EndpointMétodoDescrição
/.well-known/oauth-protected-resourceGETMetadados do recurso protegido
/.well-known/oauth-authorization-serverGETMetadados do servidor de autorização
/registerPOSTRegistro dinâmico de cliente
/authorizeGETPágina de autorização
/authorize/submitPOSTProcessa a autorização
/tokenPOSTTroca o código por um token

Visão geral do fluxo

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

Recursos de segurança

  • PKCE obrigatório - Evita a interceptação do código de autorização
  • Códigos autocriptografados - Criptografados com AES-256-GCM, sem estado
  • Códigos de curta duração - Expiram em 120 segundos
  • Validação de Redirect URI - Códigos vinculados à URI original

ERRORSSolução de problemas

Tratamento de erros

Códigos de erro JSON-RPC

CódigoMensagemDescrição
-32700Parse errorJSON inválido
-32600Invalid RequestFalta jsonrpc ou method
-32601Method not foundMétodo desconhecido
-32602Invalid paramsParâmetros de ferramenta inválidos
-32001UnauthorizedChave de API faltante ou inválida
-32603Internal errorErro do lado do servidor

Respostas de erro da API

As chamadas de ferramentas que falham retornam uma estrutura de erro:

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

Erros comuns em nível HTTP:

StatusDescrição
401Chave de API inválida
403A assinatura não permite esta operação
429Limite de taxa excedido
400Erro de validação

LIMITSCotas

Limites de taxa

Os limites de taxa dependem do seu plano de assinatura do finlight. Quando os limites são excedidos, a API retorna um código de status 429.

Verifique seu uso e limites atuais em app.finlight.me.


SUPPORTAjuda

Suporte