Implementación de código para construir un servidor de protocolo de contexto modelo (MCP) y conectarlo con Claude Desktop

En este tutorial práctico, construiremos un servidor MCP (protocolo de contexto modelo) que permita que Claude Desktop obtenga un sentimiento de noticias y ganancias y mudanzas diarias a través del API Alphavantage. Dado que la mayoría de los LLM no pueden acceder directamente a los datos financieros en tiempo real, esta solución utiliza MCP para proporcionar información en tiempo real.

Expondremos dos herramientas de nuestro servidor:

  • get_news_sentiment
  • get_top_movers

Caminemos por cada paso.

Paso 1: Configuración del entorno

Primero configuraremos nuestro entorno y comenzaremos con la instalación del Administrador de paquetes UV. Para Mac o Linux:

curl -LsSf https://astral.sh/uv/install.sh | sh  

Para Windows (PowerShell):

powershell -ExecutionPolicy ByPass -c "irm https://astral.sh/uv/install.ps1 | iex"

Luego crearemos un nuevo directorio de proyectos e inicializaremos con UV

uv init stockNews
cd stockNews

Ahora podemos crear y activar un entorno virtual. Para Mac o Linux:

uv venv
source .venv/bin/activate

Para Windows:

uv venv
.venv\Scripts\activate

Ahora instalaremos las dependencias requeridas

uv add mcp httpx python-dotenv 

Paso 3: Configuración de las variables de entorno

Ahora crearemos un archivo .env que contiene la clave API para Alphavantage. Para generar una clave API gratuita:

Ahora, cree un archivo .env y agregue la siguiente línea:

ALPHA_VANTAGE_API_KEY = your_api_key

Paso 4: Implementar el servidor MCP e integrar Alphavantage

Primero crea un stocknews.py Archivo en el directorio que creamos y agregue los siguientes fragmentos de código:

Importar paquetes y configurar la instancia:

Primero importaremos los paquetes necesarios y configuraremos la instancia para usar la API

from typing import Any
import os
import httpx
from mcp.server.fastmcp import FastMCP
from dotenv import load_dotenv


# Load .env variables
load_dotenv()
API_KEY = os.getenv("ALPHA_VANTAGE_API_KEY")

# Initialize FastMCP server
mcp = FastMCP("alpha-finance")

# Constants
BASE_URL = "https://www.alphavantage.co/query"

Funciones auxiliares

A continuación, agregemos nuestras funciones auxiliares para consultar los datos de Alphavantage.

async def call_alpha_vantage(endpoint: str, params: dict[str, Any]) -> dict[str, Any] | None:
    """Generic async caller to Alpha Vantage."""
    params["apikey"] = API_KEY
    params["function"] = endpoint
    async with httpx.AsyncClient() as client:
        try:
            response = await client.get(BASE_URL, params=params, timeout=30.0)
            response.raise_for_status()
            return response.json()
        except Exception:
            return None

Implementación de la ejecución de la herramienta

El controlador de ejecución de la herramienta es responsable de ejecutar la lógica de cada herramienta.

@mcp.tool()
async def get_news_sentiment(ticker: str) -> str:
    """Get news sentiment data for a stock ticker.

    Args:
        ticker: Stock ticker symbol (e.g., MSFT, AAPL)
    """
    data = await call_alpha_vantage("NEWS_SENTIMENT", {"tickers": ticker.upper()})
    if not data or "feed" not in data:
        return "Couldn't retrieve news sentiment."

    articles = data["feed"][:3]
    result = []
    for item in articles:
        result.append(f"""
📰 {item['title']}
Summary: {item['summary']}
Source: {item['source']} | Published: {item['time_published']}
""")
    return "\n---\n".join(result)

@mcp.tool()
async def get_top_movers() -> str:
    """Get top gainers and losers from the stock market.

    No arguments required.
    """
    data = await call_alpha_vantage("TOP_GAINERS_LOSERS", {})
    if not data:
        return "Couldn't retrieve top movers."

    gainers = data.get("top_gainers", [])[:3]
    losers = data.get("top_losers", [])[:3]

    result = "**Top Gainers**\n"
    result += "\n".join([
        f"{g['ticker']} ({g.get('change_percentage', 'N/A')})"
        for g in gainers
    ])

    result += "\n\n**Top Losers**\n"
    result += "\n".join([
        f"{l['ticker']} ({l.get('change_percentage', 'N/A')})"
        for l in losers
    ])

    return result

Ejecutando el servidor

Finalmente, inicializar y ejecutar el servidor:

if __name__ == "__main__":
    mcp.run(transport="stdio")

Ahora probaremos nuestro servidor desde un host MCP existente, Claude para escritorio.

Paso 5: Prueba del servidor

Primero, asegúrese de tener Claude para escritorio instalado. Si no, descargue e instale la última versión de la fuente oficial. Si ya lo tiene, asegúrese de que esté actualizado.

A continuación, deberá configurar Claude para conectarse con su servidor MCP. Para hacer esto, abra el archivo Claude_desktop_config.json ubicado en el directorio de Claude utilizando cualquier editor de texto. Si el archivo no existe, continúe y cree manualmente.

Para macOS/Linux:

{
    "mcpServers": {
        "stockNews": {
            "command": "uv",
            "args": [
                "--directory",
                "/ABSOLUTE/PATH/TO/PARENT/FOLDER/stockNews",
                "run",
                "stockNews.py"
            ]
        }
    }
}

Para Windows:

{
    "mcpServers": {
        "stockNews": {
            "command": "uv",
            "args": [
                "--directory",
                "C:\\ABSOLUTE\\PATH\\TO\\PARENT\\FOLDER\\stockNews",
                "run",
                "stockNews.py"
            ]
        }
    }
}

Esta configuración deja Claude para escritorio saber que:

  • Hay un servidor MCP llamado “StockNews”.
  • Debe iniciarse utilizando el siguiente comando:
    UV –Directory/Absolute/Path/To/Parent/Folder/Stocknews Run StockNews.py

Una vez que haya agregado esto a su archivo de configuración, Guarde el archivo y reinicie Claude para el escritorio para aplicar los cambios.

Prueba con comandos

Para confirmar que Claude para escritorio ha reconocido las dos herramientas de su servidor StockNews, busque el Icono de martillo En la interfaz Claude: este icono indica el acceso a la herramienta.

Después de hacer clic en el icono de martillo, debería ver dos herramientas en la lista:

Podemos probar el servidor ejecutando las siguientes indicaciones:

  • ¿Cuál es el sentimiento de noticias para Apple?
  • ¿Quiénes son los principales ganadores y perdedores del mercado de valores?

Cuando le haces una pregunta a Claude:

  1. El cliente envía su consulta a Claude.
  2. Claude revisa las herramientas disponibles (Como get_news_sentiment o get_top_movers) y determina cuál (s) usar en función de su pregunta.
  3. La herramienta seleccionada se ejecuta a través del servidor MCP Configuraste anteriormente.
  4. La herramienta devuelve los resultados Volver a Claude.
  5. Claude usa esos resultados para elaborar una respuesta del lenguaje natural.
  6. La respuesta final se le muestra en la interfaz de chat.

Este flujo perfecto es lo que permite a Claude interactuar con los datos en tiempo real de una manera estructurada y controlada.

Conclusión:

Nuestro servidor de Stock Insights basado en MCP extiende las capacidades de Claude Desktop al habilitar la recuperación de datos financieros en tiempo real. Al integrar la API Alphavantage con un servidor MCP personalizado, los usuarios pueden obtener un sentimiento de noticias en vivo y rastrear los principales mudanzas del mercado directamente a través de Claude. Esta configuración faculta a los usuarios con ideas de acciones oportunas y procesables, todas dentro de una interfaz de conversación, haciendo que el análisis financiero sea más eficiente, contextual e interactivo.


Soy un graduado de ingeniería civil (2022) de Jamia Millia Islamia, Nueva Delhi, y tengo un gran interés en la ciencia de datos, especialmente las redes neuronales y su aplicación en varias áreas.