Esta página fue traducida automáticamente. La versión en inglés es la fuente y puede ser más precisa o estar más actualizada. Ver en inglés

Servidor MCP - Integración para desarrolladores

Esta guía cubre la integración programática con el servidor MCP de finlight. Úsala para crear aplicaciones de IA personalizadas, automatizar la obtención de noticias o integrar noticias financieras en tus sistemas existentes.


INFOEndpoints

Información del servidor

EntornoURL
Producciónhttps://mcp.finlight.me

El servidor implementa MCP (Model Context Protocol) mediante JSON-RPC 2.0 sobre HTTP.


AUTHClave de API

Autenticación

Todas las llamadas a herramientas requieren autenticación mediante token Bearer. Tu clave de API de finlight sirve como token de acceso.

Authorization: Bearer YOUR_API_KEY

Para flujos OAuth automatizados (como Claude Desktop), el servidor implementa OAuth 2.0 con PKCE. Consulta Flujo OAuth para más detalles.


QUICKSTARTEjemplos

Inicio rápido

Usando cURL

Listar las herramientas disponibles:

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 artículos:

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

TOOLSReferencia

Herramientas disponibles

search_articles

Busca artículos de noticias financieras con filtrado avanzado y análisis de sentimiento.

Parámetros:

ParámetroTipoDescripción
querystringConsulta de búsqueda con operadores booleanos (AND, OR, NOT) y filtros de campo (ticker:AAPL, source:reuters.com)
tickersstring[]Filtra por símbolos de ticker (p. ej., ["AAPL", "NVDA"])
sourcesstring[]Limita a dominios de fuentes de noticias específicos
optInSourcesstring[]Añade fuentes al conjunto predeterminado (en lugar de reemplazarlo)
excludeSourcesstring[]Excluye fuentes específicas de los resultados
countriesstring[]Filtra por códigos de país ISO 3166-1 alpha-2
fromstringFecha de inicio (YYYY-MM-DD o ISO 8601)
tostringFecha de fin (YYYY-MM-DD o ISO 8601)
languagestringCódigo de idioma (predeterminado: "en")
includeContentbooleanIncluye el texto completo del artículo (requiere suscripción)
includeEntitiesbooleanIncluye las entidades de empresa etiquetadas
excludeEmptyContentbooleanOmite artículos sin contenido
order"ASC" | "DESC"Orden de clasificación (predeterminado: DESC = más reciente primero)
orderBy"publishDate" | "createdAt" | "revisedDate"Campo de ordenación — revisedDate ordena por la fecha de revisión más reciente
pageSizenumberResultados por página (1-100, predeterminado: 20)
pagenumberNúmero de página (predeterminado: 1)

Ejemplo de solicitud:

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

Ejemplo de respuesta:

{
  "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 un artículo específico por su URL.

Parámetros:

ParámetroTipoRequeridoDescripción
linkstringLa URL completa del artículo
includeContentbooleanNoIncluye el texto completo del artículo
includeEntitiesbooleanNoIncluye las entidades de empresa etiquetadas

Ejemplo de solicitud:

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

Obtiene todas las fuentes de noticias disponibles con sus metadatos.

Parámetros: Ninguno

Ejemplo de solicitud:

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

La respuesta incluye:

  • domain - Dominio del sitio web de la fuente
  • isDefaultSource - Si se incluye en las búsquedas predeterminadas
  • isContentAvailable - Si se admite la recuperación de contenido completo

PROTOCOLJSON-RPC

Métodos del protocolo MCP

El servidor implementa estos métodos del protocolo MCP:

MétodoDescripción
initializeInicializa la sesión MCP
notifications/initializedConfirma que la inicialización se completó
tools/listLista las herramientas disponibles y sus esquemas
tools/callEjecuta una herramienta con argumentos
pingComprobación de estado

Ejemplo de Initialize:

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

Respuesta:

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

OAUTHAutenticación

Flujo OAuth

Para los clientes que admiten OAuth (como Claude Desktop), el servidor implementa OAuth 2.0 con PKCE.

Endpoints

EndpointMétodoDescripción
/.well-known/oauth-protected-resourceGETMetadatos del recurso protegido
/.well-known/oauth-authorization-serverGETMetadatos del servidor de autorización
/registerPOSTRegistro dinámico de cliente
/authorizeGETPágina de autorización
/authorize/submitPOSTProcesa la autorización
/tokenPOSTIntercambia el código por un token

Resumen del flujo

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

Características de seguridad

  • PKCE obligatorio - Evita la interceptación del código de autorización
  • Códigos autocifrados - Cifrados con AES-256-GCM, sin estado
  • Códigos de corta duración - Expiran a los 120 segundos
  • Validación de Redirect URI - Códigos vinculados a la URI original

ERRORSSolución de problemas

Manejo de errores

Códigos de error JSON-RPC

CódigoMensajeDescripción
-32700Parse errorJSON inválido
-32600Invalid RequestFalta jsonrpc o method
-32601Method not foundMétodo desconocido
-32602Invalid paramsParámetros de herramienta inválidos
-32001UnauthorizedClave de API faltante o inválida
-32603Internal errorError del lado del servidor

Respuestas de error de la API

Las llamadas a herramientas que fallan devuelven una estructura de error:

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

Errores comunes a nivel HTTP:

EstadoDescripción
401Clave de API inválida
403La suscripción no permite esta operación
429Límite de tasa superado
400Error de validación

LIMITSCuotas

Límites de tasa

Los límites de tasa dependen de tu plan de suscripción de finlight. Cuando se superan los límites, la API devuelve un código de estado 429.

Consulta tu uso y límites actuales en app.finlight.me.


SUPPORTAyuda

Soporte