Skip to main content
Glama

Interactive Brokers MCP Server

by code-rabi
tool-definitions.test.ts10.1 kB
// test/tool-definitions.test.ts import { describe, it, expect } from 'vitest'; import { PlaceOrderZodSchema, GetPositionsZodSchema, GetMarketDataZodSchema, GetLiveOrdersZodSchema, GetOrderStatusZodSchema, ConfirmOrderZodSchema, CreateAlertZodSchema, ActivateAlertZodSchema, DeleteAlertZodSchema, } from '../src/tool-definitions.js'; describe('Tool Definitions - Zod Schemas', () => { describe('PlaceOrderZodSchema', () => { it('should accept valid market order', () => { const validOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'BUY' as const, orderType: 'MKT' as const, quantity: 10, }; const result = PlaceOrderZodSchema.safeParse(validOrder); expect(result.success).toBe(true); }); it('should accept fractional quantities as numbers', () => { const validOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'BUY' as const, orderType: 'MKT' as const, quantity: 1.5, }; const result = PlaceOrderZodSchema.safeParse(validOrder); expect(result.success).toBe(true); if (result.success) { expect(result.data.quantity).toBe(1.5); } }); it('should accept fractional quantities as strings', () => { const validOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'BUY' as const, orderType: 'MKT' as const, quantity: '2.75', }; const result = PlaceOrderZodSchema.safeParse(validOrder); expect(result.success).toBe(true); if (result.success) { expect(result.data.quantity).toBe(2.75); } }); it('should accept integer quantities as strings', () => { const validOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'BUY' as const, orderType: 'MKT' as const, quantity: '100', }; const result = PlaceOrderZodSchema.safeParse(validOrder); expect(result.success).toBe(true); if (result.success) { expect(result.data.quantity).toBe(100); } }); it('should reject negative quantities', () => { const invalidOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'BUY' as const, orderType: 'MKT' as const, quantity: -10, }; const result = PlaceOrderZodSchema.safeParse(invalidOrder); expect(result.success).toBe(false); }); it('should reject zero quantity', () => { const invalidOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'BUY' as const, orderType: 'MKT' as const, quantity: 0, }; const result = PlaceOrderZodSchema.safeParse(invalidOrder); expect(result.success).toBe(false); }); it('should require price for LMT orders', () => { const invalidOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'BUY' as const, orderType: 'LMT' as const, quantity: 10, }; const result = PlaceOrderZodSchema.safeParse(invalidOrder); expect(result.success).toBe(false); }); it('should accept valid LMT order with price', () => { const validOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'BUY' as const, orderType: 'LMT' as const, quantity: 10, price: 150.50, }; const result = PlaceOrderZodSchema.safeParse(validOrder); expect(result.success).toBe(true); }); it('should require stopPrice for STP orders', () => { const invalidOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'SELL' as const, orderType: 'STP' as const, quantity: 10, }; const result = PlaceOrderZodSchema.safeParse(invalidOrder); expect(result.success).toBe(false); }); it('should accept valid STP order with stopPrice', () => { const validOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'SELL' as const, orderType: 'STP' as const, quantity: 10, stopPrice: 140.00, }; const result = PlaceOrderZodSchema.safeParse(validOrder); expect(result.success).toBe(true); }); it('should accept suppressConfirmations flag', () => { const validOrder = { accountId: 'U12345', symbol: 'AAPL', action: 'BUY' as const, orderType: 'MKT' as const, quantity: 10, suppressConfirmations: true, }; const result = PlaceOrderZodSchema.safeParse(validOrder); expect(result.success).toBe(true); }); }); describe('GetPositionsZodSchema', () => { it('should accept accountId', () => { const result = GetPositionsZodSchema.safeParse({ accountId: 'U12345' }); expect(result.success).toBe(true); }); it('should require accountId', () => { const result = GetPositionsZodSchema.safeParse({}); expect(result.success).toBe(false); }); }); describe('GetMarketDataZodSchema', () => { it('should require symbol', () => { const result = GetMarketDataZodSchema.safeParse({}); expect(result.success).toBe(false); }); it('should accept symbol only', () => { const result = GetMarketDataZodSchema.safeParse({ symbol: 'AAPL' }); expect(result.success).toBe(true); }); it('should accept symbol with exchange', () => { const result = GetMarketDataZodSchema.safeParse({ symbol: 'AAPL', exchange: 'NASDAQ' }); expect(result.success).toBe(true); }); }); describe('GetLiveOrdersZodSchema', () => { it('should accept empty object', () => { const result = GetLiveOrdersZodSchema.safeParse({}); expect(result.success).toBe(true); }); it('should accept accountId', () => { const result = GetLiveOrdersZodSchema.safeParse({ accountId: 'U12345' }); expect(result.success).toBe(true); }); }); describe('GetOrderStatusZodSchema', () => { it('should require orderId', () => { const result = GetOrderStatusZodSchema.safeParse({}); expect(result.success).toBe(false); }); it('should accept valid orderId', () => { const result = GetOrderStatusZodSchema.safeParse({ orderId: '12345' }); expect(result.success).toBe(true); }); }); describe('ConfirmOrderZodSchema', () => { it('should require replyId and messageIds', () => { const result = ConfirmOrderZodSchema.safeParse({}); expect(result.success).toBe(false); }); it('should accept valid confirmation data', () => { const result = ConfirmOrderZodSchema.safeParse({ replyId: 'reply-123', messageIds: ['msg1', 'msg2'], }); expect(result.success).toBe(true); }); it('should require messageIds to be an array', () => { const result = ConfirmOrderZodSchema.safeParse({ replyId: 'reply-123', messageIds: 'msg1', }); expect(result.success).toBe(false); }); }); describe('CreateAlertZodSchema', () => { it('should require accountId and alertRequest', () => { const result = CreateAlertZodSchema.safeParse({}); expect(result.success).toBe(false); }); it('should accept valid alert creation request', () => { const result = CreateAlertZodSchema.safeParse({ accountId: 'U12345', alertRequest: { alertName: 'Price Alert', conditions: [ { conidex: '265598', type: 'price', operator: '>', triggerMethod: 'last', value: '150', }, ], }, }); expect(result.success).toBe(true); }); it('should accept alert request with optional fields', () => { const result = CreateAlertZodSchema.safeParse({ accountId: 'U12345', alertRequest: { alertName: 'Price Alert', alertMessage: 'AAPL hit $150', showPopup: 1, emailNotification: 'test@example.com', conditions: [ { conidex: '265598', type: 'price', operator: '>', triggerMethod: 'last', value: '150', timeZone: 'America/New_York', }, ], }, }); expect(result.success).toBe(true); }); it('should require conditions array', () => { const result = CreateAlertZodSchema.safeParse({ accountId: 'U12345', alertRequest: { alertName: 'Price Alert', }, }); expect(result.success).toBe(false); }); }); describe('ActivateAlertZodSchema', () => { it('should require accountId and alertId', () => { const result = ActivateAlertZodSchema.safeParse({}); expect(result.success).toBe(false); }); it('should accept valid activation request', () => { const result = ActivateAlertZodSchema.safeParse({ accountId: 'U12345', alertId: 'alert-123', }); expect(result.success).toBe(true); }); it('should reject missing alertId', () => { const result = ActivateAlertZodSchema.safeParse({ accountId: 'U12345', }); expect(result.success).toBe(false); }); }); describe('DeleteAlertZodSchema', () => { it('should require accountId and alertId', () => { const result = DeleteAlertZodSchema.safeParse({}); expect(result.success).toBe(false); }); it('should accept valid deletion request', () => { const result = DeleteAlertZodSchema.safeParse({ accountId: 'U12345', alertId: 'alert-123', }); expect(result.success).toBe(true); }); it('should reject missing accountId', () => { const result = DeleteAlertZodSchema.safeParse({ alertId: 'alert-123', }); expect(result.success).toBe(false); }); }); });

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/code-rabi/interactive-brokers-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server