Kalshi MCP Server

Un servidor MCP simple para interactuar con el mercado de predicciones Kalshi

Documentación

kalshi-mcp-server

Un servidor MCP que permite a la IA operar en el mercado de predicción, Kalshi

Herramientas implementadas

  • get_tags_for_series_categories
    • Llama al endpoint público de Kalshi: GET /search/tags_by_categories
    • No se requiere clave API
  • get_balance
    • Llama al endpoint privado de Kalshi: GET /portfolio/balance
    • Requiere autenticación con clave API (KALSHI_API_KEY_ID + KALSHI_API_KEY_PATH)
  • get_subaccount_balances
    • Llama al endpoint privado de Kalshi: GET /portfolio/subaccounts/balances
    • Requiere autenticación con clave API (KALSHI_API_KEY_ID + KALSHI_API_KEY_PATH)
  • create_subaccount
    • Llama al endpoint privado de Kalshi: POST /portfolio/subaccounts
    • Sin argumentos
    • Crea una nueva subcuenta (máximo 32 por usuario)
    • Devuelve: subaccount_number (int, 1-32)
    • Requiere autenticación con clave API (KALSHI_API_KEY_ID + KALSHI_API_KEY_PATH)
  • get_orders
    • Llama al endpoint privado de Kalshi: GET /portfolio/orders
    • Argumentos opcionales:
      • ticker (cadena; ticker de mercado)
      • event_ticker (cadena; tickers de eventos separados por comas, máximo 10)
      • status (cadena: resting|canceled|executed)
      • min_ts/max_ts (int; segundos Unix)
      • limit (int, 1-200)
      • cursor (cadena)
      • subaccount (int, 0-32)
    • Devuelve órdenes de cartera (y cursor de paginación opcional)
    • Requiere autenticación con clave API (KALSHI_API_KEY_ID + KALSHI_API_KEY_PATH)
  • get_order
    • Llama al endpoint privado de Kalshi: GET /portfolio/orders/{order_id}
    • Argumentos requeridos:
      • order_id (cadena; el identificador de la orden)
    • Devuelve un objeto de orden único con todos los campos de la orden
    • Requiere autenticación con clave API (KALSHI_API_KEY_ID + KALSHI_API_KEY_PATH)
  • create_order
    • Llama al endpoint privado de Kalshi: POST /portfolio/orders
    • Argumentos requeridos:
      • ticker (cadena; ticker de mercado)
      • side (cadena: yes|no)
      • action (cadena: buy|sell)
    • Argumentos opcionales:
      • client_order_id (cadena; ID de orden especificado por el llamador)
      • count (int, >=1; cantidad de contratos)
      • count_fp (cadena; recuento de contratos en punto fijo)
      • yes_price (int, 1-99; precio en centavos)
      • no_price (int, 1-99; precio en centavos)
      • yes_price_dollars (cadena; precio de "yes" en dólares)
      • no_price_dollars (cadena; precio de "no" en dólares)
      • expiration_ts (int; marca de tiempo Unix para la expiración de la orden)
      • time_in_force (cadena: fill_or_kill|good_till_canceled|immediate_or_cancel)
      • buy_max_cost (int; costo máximo en centavos)
      • sell_position_floor (int; obsoleto, solo se permite 0 si se establece)
      • post_only (booleano)
      • reduce_only (booleano)
      • self_trade_prevention_type (cadena: taker_at_cross|maker)
      • order_group_id (cadena)
      • cancel_order_on_pause (booleano)
      • subaccount (int, 0-32)
    • Devuelve los detalles de la orden creada
    • Requiere autenticación con clave API (KALSHI_API_KEY_ID + KALSHI_API_KEY_PATH)
  • cancel_order
    • Llama al endpoint privado de Kalshi: DELETE /portfolio/orders/{order_id}
    • Argumentos requeridos:
      • order_id (cadena; el identificador de la orden)
    • Argumentos opcionales:
      • subaccount (int, 0-32)
    • Devuelve el objeto de la orden cancelada y el número de contratos reducidos (reduced_by, reduced_by_fp)
    • Requiere autenticación con clave API (KALSHI_API_KEY_ID + KALSHI_API_KEY_PATH)
  • get_positions
    • Llama al endpoint privado de Kalshi: GET /portfolio/positions
    • Argumentos opcionales:
      • cursor (cadena)
      • limit (int, 1-1000; por defecto 100)
      • count_filter (cadena; separados por comas de position y/o total_traded)
      • ticker (cadena; ticker de mercado)
      • event_ticker (cadena; tickers de eventos separados por comas, máximo 10)
      • subaccount (int, 0-32)
    • Devuelve posiciones de cartera con los arreglos market_positions y event_positions, más el cursor de paginación
    • Requiere autenticación con clave API (KALSHI_API_KEY_ID + KALSHI_API_KEY_PATH)
  • get_categories
    • Llama al endpoint público de Kalshi: GET /search/tags_by_categories
    • Devuelve solo los nombres de las categorías
    • No se requiere clave API
  • get_tags_for_series_category
    • Llama al endpoint público de Kalshi: GET /search/tags_by_categories
    • Requiere un argumento: category (nombre exacto de la categoría)
    • Devuelve etiquetas para la categoría seleccionada
    • No se requiere clave API
  • get_series_list
    • Llama al endpoint público de Kalshi: GET /series
    • Argumentos opcionales:
      • category (cadena)
      • tags (cadena)
      • cursor (cadena)
      • limit (int, 1-1000)
      • include_product_metadata (booleano)
      • include_volume (booleano)
    • Devuelve objetos de series tipados de la respuesta de Kalshi
    • Registra detalles de advertencia/error cuando los campos de la respuesta tienen tipos/formas inesperados
    • No se requiere clave API
  • get_series_tickers_for_category
    • Pagina el endpoint público de Kalshi: GET /series
    • Argumentos requeridos:
      • category (cadena)
    • Argumentos opcionales:
      • tags (cadena)
      • limit (int, 1-1000; por defecto 1000)
      • max_pages (int, 1-10000; por defecto 1000)
    • Devuelve solo los valores de ticker en todas las páginas
    • No se requiere clave API
  • get_markets
    • Llama al endpoint público de Kalshi: GET /markets
    • Argumentos opcionales:
      • cursor (cadena)
      • limit (int, 1-1000)
      • status (cadena; los documentos de Kalshi enumeran valores como unopened|open|paused|closed|settled)
      • tickers (cadena; tickers de mercado separados por comas)
      • event_ticker (cadena; tickers de eventos separados por comas)
      • series_ticker (cadena)
      • mve_filter (cadena: only|exclude)
      • min_created_ts/max_created_ts (int; segundos Unix)
      • min_updated_ts (int; segundos Unix)
      • min_close_ts/max_close_ts (int; segundos Unix)
      • min_settled_ts/max_settled_ts (int; segundos Unix)
    • Devuelve mercados tipados de la respuesta de Kalshi
    • No se requiere clave API
  • get_open_markets_for_series
    • Pagina el endpoint público de Kalshi: GET /markets
    • Argumentos requeridos:
      • series_ticker (cadena)
    • Argumentos opcionales:
      • limit (int, 1-1000; por defecto 1000)
      • max_pages (int, 1-10000; por defecto 1000)
    • Fuerza status=open y devuelve todos los mercados en todas las páginas
    • No se requiere clave API
  • get_open_market_titles_for_series
    • Pagina el endpoint público de Kalshi: GET /markets
    • Argumentos requeridos:
      • series_ticker (cadena)
    • Argumentos opcionales:
      • limit (int, 1-1000; por defecto 1000)
      • max_pages (int, 1-10000; por defecto 1000)
    • Fuerza status=open y devuelve solo ticker, title, subtitle, yes_sub_title, no_sub_title para cada mercado en todas las páginas
    • No se requiere clave API

Configuración

  • KALSHI_API_BASE_URL
    • Por defecto: https://api.elections.kalshi.com/trade-api/v2
  • KALSHI_TIMEOUT_SECONDS
    • Por defecto: 10
  • KALSHI_API_KEY_ID
    • Requerido para endpoints autenticados/privados (por ejemplo, get_balance)
  • KALSHI_API_KEY_PATH
    • Requerido para endpoints autenticados/privados
    • Ruta al archivo PEM de clave privada de tu API de Kalshi
  • .env
    • load_settings() lee un archivo local .env desde la raíz del repositorio y carga variables cuando no están ya establecidas en el entorno

Ejecutar como servidor MCP stdio

  • Comando (instalado/editable):
    • python3 -m pip install -e .
    • python3 -m kalshi_mcp.server
  • Comando (sin instalación):
    • PYTHONPATH=src python3 -m kalshi_mcp.server
  • Transporte:
    • JSON-RPC 2.0 sobre JSON delimitado por nuevas líneas en stdin/stdout

Desarrollo

  • Ejecutar pruebas unitarias (unittest):
    • python3 -m unittest discover -s tests -p 'test_*.py'
  • Ejecutar pruebas unitarias (pytest):
    • Instalar dependencias de desarrollo: python3 -m pip install -r requirements-dev.txt
    • Luego: python3 -m pytest -q