Skip to main content
Glama
maven81g

TradeStation MCP Server

by maven81g

getExecutions

Retrieve fill details and execution data for a specific TradeStation order to track trade completion and verify transaction records.

Instructions

Get fills/executions for a specific order

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
accountIdNoAccount ID (optional, uses TRADESTATION_ACCOUNT_ID from env if not provided)
orderIdYesOrder ID

Implementation Reference

  • The core handler function implementing the getExecutions tool logic. It fetches order executions from the TradeStation API endpoint `/brokerage/accounts/{accountId}/orders/{orderId}/executions`, handles accountId fallback to environment variable, and returns formatted JSON response or error.
    async (args) => {
      try {
        const accountId = args.accountId || TS_ACCOUNT_ID;
        const { orderId } = args;
    
        if (!accountId) {
          throw new Error('Account ID is required. Either provide accountId parameter or set TRADESTATION_ACCOUNT_ID in .env file.');
        }
    
        const executions = await makeAuthenticatedRequest(
          `/brokerage/accounts/${encodeURIComponent(accountId)}/orders/${encodeURIComponent(orderId)}/executions`
        );
    
        return {
          content: [
            {
              type: "text",
              text: JSON.stringify(executions, null, 2)
            }
          ]
        };
      } catch (error: unknown) {
        return {
          content: [
            {
              type: "text",
              text: `Failed to fetch executions: ${error instanceof Error ? error.message : 'Unknown error'}`
            }
          ],
          isError: true
        };
      }
    }
  • Zod input schema for the getExecutions tool, defining optional accountId and required orderId parameters.
    const executionsSchema = {
      accountId: z.string().optional().describe('Account ID (optional, uses TRADESTATION_ACCOUNT_ID from env if not provided)'),
      orderId: z.string().describe('Order ID')
    };
  • src/index.ts:629-666 (registration)
    MCP server registration of the getExecutions tool, specifying name, description, input schema, and inline handler function.
    server.tool(
      "getExecutions",
      "Get fills/executions for a specific order",
      executionsSchema,
      async (args) => {
        try {
          const accountId = args.accountId || TS_ACCOUNT_ID;
          const { orderId } = args;
    
          if (!accountId) {
            throw new Error('Account ID is required. Either provide accountId parameter or set TRADESTATION_ACCOUNT_ID in .env file.');
          }
    
          const executions = await makeAuthenticatedRequest(
            `/brokerage/accounts/${encodeURIComponent(accountId)}/orders/${encodeURIComponent(orderId)}/executions`
          );
    
          return {
            content: [
              {
                type: "text",
                text: JSON.stringify(executions, null, 2)
              }
            ]
          };
        } catch (error: unknown) {
          return {
            content: [
              {
                type: "text",
                text: `Failed to fetch executions: ${error instanceof Error ? error.message : 'Unknown error'}`
              }
            ],
            isError: true
          };
        }
      }
    );
  • Shared helper function called by the getExecutions handler to perform authenticated HTTP requests to the TradeStation API, including automatic token refresh.
    async function makeAuthenticatedRequest(
      endpoint: string,
      method: AxiosRequestConfig['method'] = 'GET',
      data: any = null
    ): Promise<any> {
      const userTokens = tokenStore.get(DEFAULT_USER);
    
      if (!userTokens) {
        throw new Error('User not authenticated. Please set TRADESTATION_REFRESH_TOKEN in .env file.');
      }
    
      // Check if token is expired or about to expire (within 60 seconds)
      if (userTokens.expiresAt < Date.now() + 60000) {
        // Refresh the token
        const newTokens = await refreshToken(userTokens.refreshToken);
        tokenStore.set(DEFAULT_USER, newTokens);
      }
    
      try {
        const options: AxiosRequestConfig = {
          method,
          url: `${TS_API_BASE}${endpoint}`,
          headers: {
            'Authorization': `Bearer ${tokenStore.get(DEFAULT_USER)?.accessToken}`,
            'Content-Type': 'application/json',
            'Accept': 'application/json'
          },
          timeout: 60000
        };
    
        if (data && (method === 'POST' || method === 'PUT' || method === 'PATCH')) {
          options.data = data;
        }
    
        const response = await axios(options);
        return response.data;
      } catch (error: unknown) {
        if (error instanceof AxiosError) {
          const errorMessage = error.response?.data?.Message || error.response?.data?.message || error.message;
          const statusCode = error.response?.status;
          console.error(`API request error [${statusCode}]: ${errorMessage}`);
          console.error('Endpoint:', endpoint);
          throw new Error(`API Error (${statusCode}): ${errorMessage}`);
        } else if (error instanceof Error) {
          console.error('API request error:', error.message);
          throw error;
        } else {
          console.error('Unknown API request error:', error);
          throw new Error('Unknown API request error');
        }
      }
    }

Latest Blog Posts

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/maven81g/tradestation_mcp'

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