Skip to main content
Glama
laukikk

Alpaca Trading MCP Server

by laukikk

place_market_order

Execute immediate stock trades at current market prices to buy or sell shares. Specify symbol, quantity, and side (buy/sell) for order confirmation.

Instructions

Place a market order to buy or sell a stock.

Args: symbol: Stock symbol (e.g., 'AAPL') quantity: Number of shares to buy or sell (can be fractional) side: Either 'buy' or 'sell'

Returns: Order confirmation details

Input Schema

TableJSON Schema
NameRequiredDescriptionDefault
symbolYes
quantityYes
sideYes

Implementation Reference

  • Core handler for the 'place_market_order' tool. Validates input parameters, constructs an AlpacaOrderRequest for a MARKET order, submits it using the helper function calls.place_order, and formats the response with order details.
    @mcp.tool()
    def place_market_order(symbol: str, quantity: float, side: str) -> str:
        """
        Place a market order to buy or sell a stock.
        
        Args:
            symbol: Stock symbol (e.g., 'AAPL')
            quantity: Number of shares to buy or sell (can be fractional)
            side: Either 'buy' or 'sell'
        
        Returns:
            Order confirmation details
        """
        # Validate side
        try:
            order_side = AlpacaOrderSide(side.lower())
        except ValueError:
            return f"Invalid side: {side}. Must be 'buy' or 'sell'."
        
        # Create order request
        order_request = AlpacaOrderRequest(
            symbol=symbol,
            qty=float(quantity),
            side=order_side,
            type=AlpacaOrderType.MARKET,
            time_in_force=AlpacaTimeInForce.DAY
        )
        
        try:
            order = calls.place_order(trading_client, order_request)
            
            return (
                f"Market order placed successfully!\n\n"
                f"Order ID: {order.id}\n"
                f"Symbol: {order.symbol}\n"
                f"Side: {order.side.value}\n"
                f"Type: {order.type.value}\n"
                f"Quantity: {order.qty}\n"
                f"Status: {order.status.value}\n"
                f"Created At: {order.created_at}\n"
            )
        except Exception as e:
            return f"Error placing market order: {str(e)}"
  • Helper function that handles order submission to Alpaca API. Converts custom AlpacaOrderRequest model to Alpaca-native request objects based on order type and submits the order.
    def place_order(client: TradingClient, order_details: AlpacaOrderRequest):
        """
        Place an order with flexible order types
        
        :param client: Alpaca trading client
        :param order_details: Order request details
        :return: Placed AlpacaOrder
        """
        # Map Pydantic model to Alpaca order request based on order type
        if order_details.type == AlpacaOrderType.MARKET:
            order_request = MarketOrderRequest(
                symbol=order_details.symbol,
                qty=order_details.qty,
                side=order_details.side,
                time_in_force=order_details.time_in_force
            )
        elif order_details.type == AlpacaOrderType.LIMIT:
            if not order_details.limit_price:
                raise ValueError("Limit price is required for limit orders")
            order_request = LimitOrderRequest(
                symbol=order_details.symbol,
                qty=order_details.qty,
                side=order_details.side,
                time_in_force=order_details.time_in_force,
                limit_price=order_details.limit_price
            )
        elif order_details.type == AlpacaOrderType.STOP:
            if not order_details.stop_price:
                raise ValueError("Stop price is required for stop orders")
            order_request = StopOrderRequest(
                symbol=order_details.symbol,
                qty=order_details.qty,
                side=order_details.side,
                time_in_force=order_details.time_in_force,
                stop_price=order_details.stop_price
            )
        elif order_details.type == AlpacaOrderType.STOP_LIMIT:
            if not (order_details.stop_price and order_details.limit_price):
                raise ValueError("Both stop and limit prices are required for stop-limit orders")
            order_request = StopLimitOrderRequest(
                symbol=order_details.symbol,
                qty=order_details.qty,
                side=order_details.side,
                time_in_force=order_details.time_in_force,
                stop_price=order_details.stop_price,
                limit_price=order_details.limit_price
            )
        else:
            raise ValueError(f"Unsupported order type: {order_details.type}")
    
        # Submit order
        order = client.submit_order(order_request)
        return AlpacaOrder(**order.__dict__)
  • Pydantic model defining the structure for order requests, used internally by the tool handler to create market orders. Includes type definitions for side, type, etc.
    class AlpacaOrderRequest(BaseModel):
        symbol: str
        qty: Union[int, float]
        side: AlpacaOrderSide
        type: AlpacaOrderType
        time_in_force: AlpacaTimeInForce
        limit_price: Optional[float] = None
        stop_price: Optional[float] = None
        client_order_id: Optional[str] = None
        extended_hours: Optional[bool] = False
  • Enum defining valid order sides ('buy', 'sell'), used for input validation in the tool.
    class AlpacaOrderSide(str, Enum):
        BUY = 'buy'
        SELL = 'sell'
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations provided, the description carries full burden but only states the basic action. It doesn't disclose critical behavioral traits like authentication requirements, rate limits, whether this is a real trade or simulation, what happens on execution failure, or confirmation details format. For a financial transaction tool, this is a significant gap.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

The description is efficiently structured with a clear purpose statement followed by parameter and return sections. Every sentence adds value, though the return statement could be more specific. It's appropriately sized for a 3-parameter tool.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness2/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a financial trading tool with no annotations and no output schema, the description is incomplete. It doesn't address critical context like authentication, execution guarantees, error conditions, or what 'order confirmation details' includes. The agent lacks sufficient information to use this tool safely and effectively.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

The description provides clear semantic meaning for all three parameters beyond the schema's 0% coverage. It explains symbol format with an example, clarifies quantity can be fractional, and specifies side options. This compensates well for the schema's lack of descriptions.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description clearly states the action ('Place a market order') and resource ('stock'), distinguishing it from sibling tools like place_limit_order. However, it doesn't explicitly differentiate market orders from other order types beyond the name, missing an opportunity to clarify the immediate execution characteristic.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

No guidance is provided on when to use this tool versus alternatives like place_limit_order or place_stop_order. The description lacks context about market conditions, urgency, or price sensitivity that would help an agent choose between order types.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Install Server

Other Tools

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/laukikk/alpaca-mcp'

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