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.
Información del servidor
| Entorno | URL |
|---|---|
| Producción | https://mcp.finlight.me |
El servidor implementa MCP (Model Context Protocol) mediante JSON-RPC 2.0 sobre HTTP.
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.
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))
Herramientas disponibles
search_articles
Busca artículos de noticias financieras con filtrado avanzado y análisis de sentimiento.
Parámetros:
| Parámetro | Tipo | Descripción |
|---|---|---|
query | string | Consulta de búsqueda con operadores booleanos (AND, OR, NOT) y filtros de campo (ticker:AAPL, source:reuters.com) |
tickers | string[] | Filtra por símbolos de ticker (p. ej., ["AAPL", "NVDA"]) |
sources | string[] | Limita a dominios de fuentes de noticias específicos |
optInSources | string[] | Añade fuentes al conjunto predeterminado (en lugar de reemplazarlo) |
excludeSources | string[] | Excluye fuentes específicas de los resultados |
countries | string[] | Filtra por códigos de país ISO 3166-1 alpha-2 |
from | string | Fecha de inicio (YYYY-MM-DD o ISO 8601) |
to | string | Fecha de fin (YYYY-MM-DD o ISO 8601) |
language | string | Código de idioma (predeterminado: "en") |
includeContent | boolean | Incluye el texto completo del artículo (requiere suscripción) |
includeEntities | boolean | Incluye las entidades de empresa etiquetadas |
excludeEmptyContent | boolean | Omite 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 |
pageSize | number | Resultados por página (1-100, predeterminado: 20) |
page | number | Nú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ámetro | Tipo | Requerido | Descripción |
|---|---|---|---|
link | string | Sí | La URL completa del artículo |
includeContent | boolean | No | Incluye el texto completo del artículo |
includeEntities | boolean | No | Incluye 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 fuenteisDefaultSource- Si se incluye en las búsquedas predeterminadasisContentAvailable- Si se admite la recuperación de contenido completo
Métodos del protocolo MCP
El servidor implementa estos métodos del protocolo MCP:
| Método | Descripción |
|---|---|
initialize | Inicializa la sesión MCP |
notifications/initialized | Confirma que la inicialización se completó |
tools/list | Lista las herramientas disponibles y sus esquemas |
tools/call | Ejecuta una herramienta con argumentos |
ping | Comprobació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
}
Flujo OAuth
Para los clientes que admiten OAuth (como Claude Desktop), el servidor implementa OAuth 2.0 con PKCE.
Endpoints
| Endpoint | Método | Descripción |
|---|---|---|
/.well-known/oauth-protected-resource | GET | Metadatos del recurso protegido |
/.well-known/oauth-authorization-server | GET | Metadatos del servidor de autorización |
/register | POST | Registro dinámico de cliente |
/authorize | GET | Página de autorización |
/authorize/submit | POST | Procesa la autorización |
/token | POST | Intercambia 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
Manejo de errores
Códigos de error JSON-RPC
| Código | Mensaje | Descripción |
|---|---|---|
| -32700 | Parse error | JSON inválido |
| -32600 | Invalid Request | Falta jsonrpc o method |
| -32601 | Method not found | Método desconocido |
| -32602 | Invalid params | Parámetros de herramienta inválidos |
| -32001 | Unauthorized | Clave de API faltante o inválida |
| -32603 | Internal error | Error 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:
| Estado | Descripción |
|---|---|
| 401 | Clave de API inválida |
| 403 | La suscripción no permite esta operación |
| 429 | Límite de tasa superado |
| 400 | Error de validación |
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.
Soporte
- Documentación: docs.finlight.me
- Panel: app.finlight.me
- Soporte: Contáctanos