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.
Informações do servidor
| Ambiente | URL |
|---|---|
| Produção | https://mcp.finlight.me |
O servidor implementa o MCP (Model Context Protocol) via JSON-RPC 2.0 sobre HTTP.
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.
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))
Ferramentas disponíveis
search_articles
Busca artigos de notícias financeiras com filtragem avançada e análise de sentimento.
Parâmetros:
| Parâmetro | Tipo | Descrição |
|---|---|---|
query | string | Consulta de busca com operadores booleanos (AND, OR, NOT) e filtros de campo (ticker:AAPL, source:reuters.com) |
tickers | string[] | Filtra por símbolos de ticker (ex.: ["AAPL", "NVDA"]) |
sources | string[] | Limita a domínios de fontes de notícias específicos |
optInSources | string[] | Adiciona fontes ao conjunto padrão (em vez de substituir) |
excludeSources | string[] | Exclui fontes específicas dos resultados |
countries | string[] | Filtra por códigos de país ISO 3166-1 alpha-2 |
from | string | Data de início (YYYY-MM-DD ou ISO 8601) |
to | string | Data de fim (YYYY-MM-DD ou ISO 8601) |
language | string | Código de idioma (padrão: "en") |
includeContent | boolean | Inclui o texto completo do artigo (requer assinatura) |
includeEntities | boolean | Inclui as entidades de empresa marcadas |
excludeEmptyContent | boolean | Ignora 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 |
pageSize | number | Resultados por página (1-100, padrão: 20) |
page | number | Nú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âmetro | Tipo | Obrigatório | Descrição |
|---|---|---|---|
link | string | Sim | A URL completa do artigo |
includeContent | boolean | Não | Inclui o texto completo do artigo |
includeEntities | boolean | Não | Inclui 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 fonteisDefaultSource- Se está incluída nas buscas padrãoisContentAvailable- Se a recuperação de conteúdo completo é suportada
Métodos do protocolo MCP
O servidor implementa estes métodos do protocolo MCP:
| Método | Descrição |
|---|---|
initialize | Inicializa a sessão MCP |
notifications/initialized | Confirma que a inicialização foi concluída |
tools/list | Lista as ferramentas disponíveis e seus esquemas |
tools/call | Executa uma ferramenta com argumentos |
ping | Verificaçã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
}
Fluxo OAuth
Para clientes que suportam OAuth (como o Claude Desktop), o servidor implementa OAuth 2.0 com PKCE.
Endpoints
| Endpoint | Método | Descrição |
|---|---|---|
/.well-known/oauth-protected-resource | GET | Metadados do recurso protegido |
/.well-known/oauth-authorization-server | GET | Metadados do servidor de autorização |
/register | POST | Registro dinâmico de cliente |
/authorize | GET | Página de autorização |
/authorize/submit | POST | Processa a autorização |
/token | POST | Troca 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
Tratamento de erros
Códigos de erro JSON-RPC
| Código | Mensagem | Descrição |
|---|---|---|
| -32700 | Parse error | JSON inválido |
| -32600 | Invalid Request | Falta jsonrpc ou method |
| -32601 | Method not found | Método desconhecido |
| -32602 | Invalid params | Parâmetros de ferramenta inválidos |
| -32001 | Unauthorized | Chave de API faltante ou inválida |
| -32603 | Internal error | Erro 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:
| Status | Descrição |
|---|---|
| 401 | Chave de API inválida |
| 403 | A assinatura não permite esta operação |
| 429 | Limite de taxa excedido |
| 400 | Erro de validação |
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.
Suporte
- Documentação: docs.finlight.me
- Painel: app.finlight.me
- Suporte: Fale conosco