# How to integrate Polygon MCP with LlamaIndex

```json
{
  "title": "How to integrate Polygon MCP with LlamaIndex",
  "toolkit": "Polygon",
  "toolkit_slug": "polygon",
  "framework": "LlamaIndex",
  "framework_slug": "llama-index",
  "url": "https://composio.dev/toolkits/polygon/framework/llama-index",
  "markdown_url": "https://composio.dev/toolkits/polygon/framework/llama-index.md",
  "updated_at": "2026-05-12T10:22:22.686Z"
}
```

## Introduction

This guide walks you through connecting Polygon to LlamaIndex using the Composio tool router. By the end, you'll have a working Polygon agent that can show the latest closing price for btc-usd, list all stock tickers traded on nasdaq, get the crypto rsi for eth over 14 days through natural language commands.
This guide will help you understand how to give your LlamaIndex agent real control over a Polygon account through Composio's Polygon MCP server.
Before we dive in, let's take a quick look at the key ideas and tools involved.

## Also integrate Polygon with

- [OpenAI Agents SDK](https://composio.dev/toolkits/polygon/framework/open-ai-agents-sdk)
- [Claude Agent SDK](https://composio.dev/toolkits/polygon/framework/claude-agents-sdk)
- [Claude Code](https://composio.dev/toolkits/polygon/framework/claude-code)
- [Claude Cowork](https://composio.dev/toolkits/polygon/framework/claude-cowork)
- [Codex](https://composio.dev/toolkits/polygon/framework/codex)
- [OpenClaw](https://composio.dev/toolkits/polygon/framework/openclaw)
- [Hermes](https://composio.dev/toolkits/polygon/framework/hermes-agent)
- [CLI](https://composio.dev/toolkits/polygon/framework/cli)
- [Google ADK](https://composio.dev/toolkits/polygon/framework/google-adk)
- [LangChain](https://composio.dev/toolkits/polygon/framework/langchain)
- [Vercel AI SDK](https://composio.dev/toolkits/polygon/framework/ai-sdk)
- [Mastra AI](https://composio.dev/toolkits/polygon/framework/mastra-ai)
- [CrewAI](https://composio.dev/toolkits/polygon/framework/crew-ai)

## TL;DR

Here's what you'll learn:
- Set your OpenAI and Composio API keys
- Install LlamaIndex and Composio packages
- Create a Composio Tool Router session for Polygon
- Connect LlamaIndex to the Polygon MCP server
- Build a Polygon-powered agent using LlamaIndex
- Interact with Polygon through natural language

## What is LlamaIndex?

LlamaIndex is a data framework for building LLM applications. It provides tools for connecting LLMs to external data sources and services through agents and tools.
Key features include:
- ReAct Agent: Reasoning and acting pattern for tool-using agents
- MCP Tools: Native support for Model Context Protocol
- Context Management: Maintain conversation context across interactions
- Async Support: Built for async/await patterns

## What is the Polygon MCP server, and what's possible with it?

The Polygon MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Polygon account. It provides structured and secure access to real-time and historical financial market data, so your agent can retrieve market status, analyze price indicators, track dividends, and monitor crypto and stock tickers on your behalf.
- Market status and holiday tracking: Instantly check if U.S. exchanges are open or closed and retrieve upcoming market holidays or early closures to plan trading activities.
- Comprehensive ticker retrieval: Ask your agent to fetch all available ticker symbols across asset classes, including stocks, crypto, forex, and options, filtered by market or exchange.
- Crypto technical analysis: Have your agent calculate moving averages (EMA, SMA), MACD, and RSI indicators for specific cryptocurrencies to support informed trading decisions.
- Daily and historical price fetching: Let your agent retrieve daily open/close prices, previous day’s close, or detailed price history for cryptocurrencies and stocks with just a prompt.
- Dividend data extraction: Effortlessly access up-to-date corporate dividend information for stocks, enabling portfolio reviews and income analysis.

## Supported Tools

| Tool slug | Name | Description |
|---|---|---|
| `POLYGON_GET10_K_SECTIONS` | Get 10-K Filing Sections | Tool to retrieve 10-K filing sections from the SEC. Use when you need to access specific sections of 10-K filings such as business descriptions, risk factors, or financial statements. |
| `POLYGON_GET_AGGREGATES` | Get Aggregates | Tool to fetch custom aggregate OHLCV bars for a stock. Use when you need historical price and volume data aggregated by custom intervals over a date range. |
| `POLYGON_GET_ALL_TICKERS` | Get All Tickers | Tool to retrieve all ticker symbols across asset classes. Use when you need to filter by market or exchange and paginate through results. Without filters, result sets can be extremely large — always narrow queries using `market`, `search`, `ticker`, or `exchange`. |
| `POLYGON_GET_CONDITION_CODES` | Get Condition Codes | Tool to retrieve a unified list of trade and quote condition codes and their definitions. Use when needing to decode condition identifiers after fetching market data. |
| `POLYGON_GET_CRYPTO_AGGREGATES` | Get Crypto Aggregates | Tool to retrieve aggregate bars for a cryptocurrency over a time range. Use when you need to fetch historical bars aggregated by specific time intervals. |
| `POLYGON_GET_CRYPTO_ALL_TICKERS` | Get Crypto All Tickers Snapshot | Tool to retrieve snapshots for all cryptocurrency tickers. Use when you need a full-market crypto snapshot of the latest values. |
| `POLYGON_GET_CRYPTO_EMA` | Get Crypto EMA | Tool to calculate Exponential Moving Average (EMA) technical indicator for a crypto ticker. Use when you need trend analysis or moving average calculations for cryptocurrency pairs. |
| `POLYGON_GET_CRYPTO_GROUPED_DAILY` | Get Crypto Grouped Daily | Tool to retrieve daily grouped bars for all cryptocurrencies on a specified date. Use when you need a comprehensive end-of-day summary across all crypto tickers. |
| `POLYGON_GET_CRYPTO_LAST_TRADE` | Get Crypto Last Trade | Tool to retrieve the last trade for a specified cryptocurrency pair. Use when you need the most recent trade details after specifying both symbols. |
| `POLYGON_GET_CRYPTO_MACD` | Get Crypto MACD | Tool to calculate Moving Average Convergence/Divergence (MACD) technical indicator for a crypto ticker. Use when you need momentum analysis, trend identification, or trading signal generation for cryptocurrency pairs. |
| `POLYGON_GET_CRYPTO_OPEN_CLOSE` | Get Crypto Open/Close | Tool to fetch daily open and close prices for a given crypto pair on a specified date. Use after specifying both currency symbols and the date. |
| `POLYGON_GET_CRYPTO_PREV_CLOSE` | Get Crypto Previous Close | Tool to retrieve previous day’s close for a crypto ticker. Use when you need the last closing price of a cryptocurrency before analysis or trading. |
| `POLYGON_GET_CRYPTO_RSI` | Get Crypto RSI | Tool to calculate the Relative Strength Index (RSI) for a cryptocurrency ticker. Use when you need to analyze momentum or identify overbought/oversold conditions for crypto assets. |
| `POLYGON_GET_CRYPTO_SMA` | Get Crypto SMA | Tool to calculate Simple Moving Average (SMA) technical indicator for a cryptocurrency ticker. Use when you need trend analysis, support/resistance levels, or trading signal generation for crypto pairs. |
| `POLYGON_GET_CRYPTO_TICKER_BOOK` | Get Crypto Ticker Book | Tool to retrieve the full L2 order book for a crypto ticker. Use when you need a snapshot of combined bids and asks for market depth analysis. |
| `POLYGON_GET_CRYPTO_TRADES` | Get Crypto Trades | Tool to fetch historical trade data for a cryptocurrency ticker. Use when you need tick-level trades within a time range. |
| `POLYGON_GET_DIVIDENDS` | Get Dividends | Tool to retrieve dividend data for stocks. Use when you need corporate dividend information for specific tickers. |
| `POLYGON_GET_ECONOMY_INFLATION` | Get Economy Inflation Indicators | Tool to retrieve key indicators of realized inflation including CPI and PCE price indexes. Use when analyzing inflation trends, economic conditions, or historical price changes in the U.S. economy. |
| `POLYGON_GET_EMA` | Get Exponential Moving Average | Tool to retrieve the Exponential Moving Average for a stock ticker. Use when you need EMA values across a specific timespan with optional underlying data. |
| `POLYGON_GET_FILING` | Get SEC Filing | Tool to retrieve SEC filing details by filing ID. Use when you need detailed information about a specific SEC filing. |
| `POLYGON_GET_FILING_FILE` | Get SEC Filing File | Tool to retrieve information about a specific SEC filing file. Use when you need to get metadata and download URL for a particular file within an SEC filing. |
| `POLYGON_GET_FOREX_AGGREGATES` | Get Forex Aggregates | Tool to retrieve aggregate bars for a forex pair over a date range. Use when you need custom OHLC bars for forex currency pairs within specified time span. |
| `POLYGON_GET_FOREX_EMA` | Get Forex EMA | Tool to calculate Exponential Moving Average (EMA) technical indicator for a forex pair. Use when you need trend analysis or moving average calculations for currency pairs. |
| `POLYGON_GET_FOREX_GROUPED_DAILY` | Get Forex Grouped Daily Bars | Tool to retrieve daily grouped OHLC bars for all forex currency pairs on a specified date. Use when you need aggregated forex data after confirming the date parameter. |
| `POLYGON_GET_FOREX_HISTORICAL_QUOTES` | Get Forex Historical Quotes | Tool to retrieve historical forex quotes for a currency pair over a time range. Use when you need bid/ask quotes for an FX ticker between timestamps or dates. Use after confirming the forex ticker symbol. |
| `POLYGON_GET_FOREX_LOCALES` | Get Forex Locales | Tool to list locales supported by Polygon's forex asset class. Use when you need available locale codes for regional filtering in FX endpoints. |
| `POLYGON_GET_FOREX_MACD` | Get Forex MACD | Tool to calculate Moving Average Convergence/Divergence (MACD) technical indicator for a forex pair. Use when you need momentum analysis, trend identification, or trading signal generation for currency pairs. |
| `POLYGON_GET_FOREX_PREV_CLOSE` | Get Forex Previous Close | Tool to retrieve previous day's close for a forex ticker. Use when you need the last closing price of a forex currency pair before analysis or trading. |
| `POLYGON_GET_FOREX_REAL_TIME_CURRENCY_CONVERSION` | Get Forex Real-Time Currency Conversion | Tool to convert amounts between currency pairs using real-time forex rates. Use when you need to perform currency conversions with the latest market rates. |
| `POLYGON_GET_FOREX_RSI` | Get Forex RSI | Tool to calculate the Relative Strength Index (RSI) technical indicator for a forex pair. Use when you need momentum analysis or want to identify overbought/oversold conditions for currency pairs. |
| `POLYGON_GET_FOREX_SMA` | Get Forex SMA | Tool to calculate Simple Moving Average (SMA) technical indicator for a forex pair. Use when you need trend analysis or moving average calculations for currency pairs. |
| `POLYGON_GET_FOREX_SNAPSHOT_LOSERS` | Get Forex Snapshot Losers | Tool to retrieve the current snapshot of the top losers in the forex market. Use when you need up-to-date information on the worst-performing forex pairs. |
| `POLYGON_GET_FUTURES_AGGREGATES` | Get Futures Aggregates | Tool to retrieve historical OHLCV aggregates for a futures contract. Use when you need aggregated price and volume data for a futures contract over specified time windows. |
| `POLYGON_GET_FUTURES_PRODUCTS` | Get Futures Products | Tool to retrieve a comprehensive list of futures products with advanced filtering. Use when you need to filter futures listings by date, sector, exchange, or type. |
| `POLYGON_GET_FUTURES_PRODUCT_SCHEDULES` | Get Futures Product Schedules | Tool to retrieve trading schedules for a futures product. Use when you need daily trading session schedules for a given product code. |
| `POLYGON_GET_FUTURES_QUOTES` | Get Futures Quotes | Tool to retrieve real-time quote data for a specified futures contract ticker. Use after confirming the exact futures ticker identifier (e.g., 'GCJ5'). |
| `POLYGON_GET_FUTURES_SCHEDULES` | Get Futures Schedules | Tool to retrieve futures trading schedules. Use when you need trading schedules for all futures contracts on a specific date. |
| `POLYGON_GET_FUTURES_TRADES` | Get Futures Trades | Tool to retrieve tick-level trade data for a specified futures contract. Use when you need detailed trade data over a time range. |
| `POLYGON_GET_HISTORIC_FOREX_TICKS` | Get Historic Forex Ticks | Tool to get historic ticks for a currency pair on a specific date. Use when you need historical forex tick-level data (ask/bid prices with timestamps) for a given day. |
| `POLYGON_GET_INFLATION_EXPECTATIONS` | Get Inflation Expectations | Tool to retrieve inflation expectations data from the Federal Reserve based on Treasury yields and Cleveland Fed models. Use when analyzing expected future inflation rates across multiple time horizons (1-year, 5-year, 10-year, 30-year). |
| `POLYGON_GET_IPO_DATA` | Get IPO Data | Tool to retrieve comprehensive information on Initial Public Offerings (IPOs), including upcoming and historical events. Use when analyzing IPO listing data by date range, ticker, or identifier. |
| `POLYGON_GET_MACD` | Get MACD | Tool to retrieve the Moving Average Convergence/Divergence (MACD) for a stock ticker. Use when you need momentum analysis or signal generation over a specified timeframe. |
| `POLYGON_GET_MARKET_HOLIDAYS` | Get Upcoming Market Holidays | Tool to retrieve upcoming market holidays and half-day closures. Use when you need to look up upcoming exchange holidays and early closures. |
| `POLYGON_GET_MARKET_STATUS` | Get Market Status | Tool to retrieve current market status. Use when you need to know if U.S. exchanges are open, closed, or on holiday. |
| `POLYGON_GET_META_CONDITIONS_BY_TICKTYPE` | Get Meta Conditions By Ticktype | Tool to retrieve condition code mappings for a specific tick type (trades or quotes). Use when you need to decode numeric condition codes into human-readable labels for market data interpretation. |
| `POLYGON_GET_NEWS` | Get News | Tool to retrieve recent news articles related to a ticker. Use when you need to fetch financial news after identifying a ticker symbol. |
| `POLYGON_GET_OPEN_CLOSE` | Get Stock Open/Close | Tool to fetch daily open and close prices for a stock on a specific date. Use when you need daily OHLC with pre/post-market prices. |
| `POLYGON_GET_OPTION_CHAIN_SNAPSHOT` | Get Option Chain Snapshot | Tool to fetch a real-time snapshot of all option contracts for an underlying asset. Use after selecting the underlying ticker to retrieve live option chain data. |
| `POLYGON_GET_OPTIONS_CONTRACT_OVERVIEW` | Get Options Contract Overview | Tool to retrieve comprehensive details about a specific options contract including contract type, exercise style, expiration date, strike price, and underlying ticker. Use when you need specifications for options contract analysis or strategy development. |
| `POLYGON_GET_OPTIONS_CUSTOM_BARS` | Get Options Custom Bars | Tool to retrieve historical OHLC and volume data for options contracts over custom date ranges with configurable time windows. Use when you need aggregate bars for options price analysis or strategy development. |
| `POLYGON_GET_OPTIONS_EMA` | Get Options EMA | Tool to calculate Exponential Moving Average (EMA) technical indicator for an options ticker. Use when you need trend analysis or moving average calculations for options contracts. |
| `POLYGON_GET_OPTIONS_MACD` | Get Options MACD | Tool to calculate Moving Average Convergence/Divergence (MACD) technical indicator for an options ticker. Use when you need momentum analysis, trend identification, or trading signal generation for options contracts. |
| `POLYGON_GET_OPTION_SNAPSHOT` | Get Option Snapshot | Tool to retrieve a real-time snapshot for a single option contract. Use when you need up-to-the-minute quotes, trades, greeks, and metrics for a specified option contract. |
| `POLYGON_GET_OPTIONS_RSI` | Get Options RSI | Tool to calculate Relative Strength Index (RSI) technical indicator for an options ticker. Use when you need momentum analysis or want to identify overbought/oversold conditions for options contracts. |
| `POLYGON_GET_OPTIONS_SMA` | Get Options SMA | Tool to calculate Simple Moving Average (SMA) technical indicator for an options ticker. Use when you need trend analysis or smoothed price data for options contracts. |
| `POLYGON_GET_PREVIOUS_CLOSE` | Get Previous Close | Tool to get previous trading day’s OHLC and volume for a stock. Use when you need the last day’s open, high, low, close, and volume for a given ticker. |
| `POLYGON_GET_REFERENCE_EXCHANGES` | Get reference exchanges | Tool to retrieve supported exchanges and their details. Use when you need a list of exchanges filtered by asset class or locale. |
| `POLYGON_GET_REFERENCE_MARKETS` | Get reference markets | Tool to retrieve all supported markets from Polygon.io. Use when you need a list of available market types. |
| `POLYGON_GET_REFERENCE_TYPES` | Get Reference Ticker Types | Tool to retrieve all ticker types supported by Polygon. Use when you need to understand the different ticker classifications available across asset classes and markets. |
| `POLYGON_GET_RELATED_COMPANIES` | Get Related Companies | Tool to get a list of related companies for a ticker symbol based on various similarity metrics. Use when you need to find companies related to a specific ticker. |
| `POLYGON_GET_RISK_CATEGORIES` | Get Risk Categories | Tool to retrieve risk factor taxonomy categories from SEC 10-K filings. Use when you need to explore or filter risk classifications by taxonomy version or category level. |
| `POLYGON_GET_RSI` | Get RSI | Tool to retrieve the Relative Strength Index (RSI) for a stock ticker. Use after confirming ticker symbol and timespan to analyze momentum over a period. |
| `POLYGON_GET_SHORT_INTEREST` | Get Short Interest | Tool to retrieve bi-monthly aggregated short interest data for stocks reported to FINRA. Use when analyzing sentiment, identifying potential short squeezes, or researching short positions. |
| `POLYGON_GET_SHORT_VOLUME` | Get Short Volume | Tool to retrieve short volume data for stocks. Use when analyzing short selling activity, market sentiment, or detecting abnormal short-selling patterns. |
| `POLYGON_GET_SMA` | Get Simple Moving Average | Tool to retrieve the Simple Moving Average (SMA) for any ticker (stocks, forex, crypto). Use when you need SMA values over a specified timespan with optional underlying data. |
| `POLYGON_GET_SNAPSHOT_ALL_TICKERS` | Get All Stock Tickers Snapshot | Tool to retrieve the current market snapshot for all stock tickers. Use when you need real-time OHLCV, trades, and quotes across the entire US stock market in one call. |
| `POLYGON_GET_SNAPSHOT_LOSERS` | Get Stock Snapshot Losers | Tool to retrieve the current snapshot of the top losers in the U.S. stock market. Use when you need up-to-date information on the worst-performing stocks. |
| `POLYGON_GET_SNAPSHOT_SINGLE_TICKER` | Get Stock Snapshot Ticker | Tool to retrieve the current snapshot of a specific stock ticker. Use when you need the most recent market snapshot after specifying the ticker symbol. |
| `POLYGON_GET_SPLITS` | Get Stock Splits | Tool to retrieve stock split events. Use when you need corporate stock split data filtered by ticker or date range. Example: "Get splits for AAPL between 2021-01-01 and 2021-12-31". |
| `POLYGON_GET_STOCK_FINANCIALS` | Get Stock Financials | Tool to retrieve historical financial data for a stock ticker from SEC filings. Use when analyzing company financials, comparing quarters, or examining financial trends. |
| `POLYGON_GET_STOCK_FLOAT` | Get Stock Float | Tool to retrieve stock float data showing the number and percentage of publicly tradable shares. Use when you need information about the free float of stocks. |
| `POLYGON_GET_STOCKS_BALANCE_SHEETS` | Get Stocks Balance Sheets | Tool to retrieve point-in-time balance sheet data including assets, liabilities, and equity from company SEC filings. Use when analyzing financial position with quarterly and annual history. |
| `POLYGON_GET_STOCKS_CASH_FLOW_STATEMENTS` | Get Stocks Cash Flow Statements | Tool to retrieve historical cash flow statement data from company SEC filings across quarterly, annual, and TTM frequencies. Use when analyzing cash generation, operating activities, investing activities, or financing activities. |
| `POLYGON_GET_STOCKS_CUSTOM_BARS` | Get Stocks Custom Bars | Tool to retrieve aggregated historical OHLC and volume data for a stock over custom date ranges with configurable time windows. Use when you need aggregate bars for stock price analysis, backtesting, or charting. |
| `POLYGON_GET_STOCKS_DAILY_MARKET_SUMMARY` | Get Stocks Daily Market Summary | Tool to retrieve daily OHLC, volume, and VWAP data for all U.S. stocks on a specified trading date. Use when you need to get grouped daily aggregate bars for all US stocks for a specific date. |
| `POLYGON_GET_STOCK_SPLITS_BY_TICKER` | Get Stock Splits by Ticker | Tool to retrieve historical stock splits for a specific ticker symbol. Use when you need split history including ex-dates, payment dates, and split ratios for a particular stock. |
| `POLYGON_GET_TECHNICAL_INDICATOR_SMA` | Get Simple Moving Average (SMA) | Tool to fetch Simple Moving Average (SMA) for a given stock ticker. Use when you need historical SMA data after confirming ticker, timespan, and window size. |
| `POLYGON_GET_TICKER_COMPANY_DETAILS` | Get Ticker Company Details | Tool to retrieve detailed company information for a stock ticker. Use when you need company fundamentals like CEO, industry, sector, market cap, and headquarters information. |
| `POLYGON_GET_TICKER_DETAILS` | Get Ticker Details | Tool to retrieve detailed information for a ticker. Use when you need an overview of a ticker including company info, market data, and identifiers. |
| `POLYGON_GET_TICKER_DETAILS_VX` | Get Ticker Details (vX) | Tool to retrieve comprehensive details for a specific ticker symbol using Polygon's vX API. Use when you need detailed information about a company including identifiers, market data, and corporate details. |
| `POLYGON_GET_TICKER_EVENTS` | Get Ticker Events | Tool to retrieve corporate events for a specific ticker. Use when you need the timeline of corporate actions for a given ticker. |
| `POLYGON_GET_TICKER_TYPES` | Get Ticker Types | Tool to retrieve all ticker types supported by Polygon.io. Use after authenticating to explore ticker categories. |
| `POLYGON_GET_TREASURY_YIELDS` | Get Treasury Yields | Tool to retrieve historical U.S. Treasury yield data for standard timeframes from 1-month to 30-year maturities. Use when analyzing interest rates, yield curves, or economic indicators. Data available daily back to 1962. |
| `POLYGON_GET_V1_META_CRYPTO_EXCHANGES` | Get V1 Meta Crypto Exchanges | Tool to retrieve a list of cryptocurrency exchanges using the legacy v1 API. Use when you need the complete list of crypto exchanges supported. |
| `POLYGON_LAST_QUOTE_FOR_A_SYMBOL` | Last Quote for a Symbol | Tool to retrieve the last quote tick for a given stock symbol. Use when you need the most recent bid/ask prices, sizes, and exchange information for a stock. |
| `POLYGON_LAST_TRADE_FOR_A_CURRENCY_PAIR` | Last Trade for a Currency Pair | Tool to retrieve the last trade tick for a currency pair in the forex market. Use when you need the most recent trade price, exchange, and timestamp for a specific currency pair. |
| `POLYGON_LIST_FILING_FILES` | List SEC Filing Files | Tool to retrieve files associated with an SEC filing. Use when you need to list all files (documents, exhibits, etc.) attached to a specific SEC filing by its filing ID. |
| `POLYGON_LIST_OPTIONS_CONTRACTS` | List Options Contracts | Tool to list and filter options contracts by underlying ticker, type, expiration, strike, and more. Use when you need to enumerate an options chain or find specific contracts matching criteria. |
| `POLYGON_LIST_SEC_FILINGS` | List SEC Filings | Tool to retrieve SEC filings from Polygon. Use when you need to query 10-K or 10-Q filings by company, date range, or other criteria. |

## Supported Triggers

None listed.

## Creating MCP Server - Stand-alone vs Composio SDK

The Polygon MCP server is an implementation of the Model Context Protocol that connects your AI agent to Polygon. It provides structured and secure access so your agent can perform Polygon operations on your behalf through a secure, permission-based interface.
With Composio's managed implementation, you don't have to create your own developer app. For production, if you're building an end product, we recommend using your own credentials. The managed server helps you prototype fast and go from 0-1 faster.

## Step-by-step Guide

### 1. Prerequisites

Before you begin, make sure you have:
- Python 3.8/Node 16 or higher installed
- A Composio account with the API key
- An OpenAI API key
- A Polygon account and project
- Basic familiarity with async Python/Typescript

### 1. Getting API Keys for OpenAI, Composio, and Polygon

No description provided.

### 2. Installing dependencies

No description provided.
```python
pip install composio-llamaindex llama-index llama-index-llms-openai llama-index-tools-mcp python-dotenv
```

```typescript
npm install @composio/llamaindex @llamaindex/openai @llamaindex/tools @llamaindex/workflow dotenv
```

### 3. Set environment variables

Create a .env file in your project root:
These credentials will be used to:
- Authenticate with OpenAI's GPT-5 model
- Connect to Composio's Tool Router
- Identify your Composio user session for Polygon access
```bash
OPENAI_API_KEY=your-openai-api-key
COMPOSIO_API_KEY=your-composio-api-key
COMPOSIO_USER_ID=your-user-id
```

### 4. Import modules

No description provided.
```python
import asyncio
import os
import dotenv

from composio import Composio
from composio_llamaindex import LlamaIndexProvider
from llama_index.core.agent.workflow import ReActAgent
from llama_index.core.workflow import Context
from llama_index.llms.openai import OpenAI
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec

dotenv.load_dotenv()
```

```typescript
import "dotenv/config";
import readline from "node:readline/promises";
import { stdin as input, stdout as output } from "node:process";

import { Composio } from "@composio/core";

import { mcp } from "@llamaindex/tools";
import { agent as createAgent } from "@llamaindex/workflow";
import { openai } from "@llamaindex/openai";

dotenv.config();
```

### 5. Load environment variables and initialize Composio

No description provided.
```python
OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
COMPOSIO_API_KEY = os.getenv("COMPOSIO_API_KEY")
COMPOSIO_USER_ID = os.getenv("COMPOSIO_USER_ID")

if not OPENAI_API_KEY:
    raise ValueError("OPENAI_API_KEY is not set in the environment")
if not COMPOSIO_API_KEY:
    raise ValueError("COMPOSIO_API_KEY is not set in the environment")
if not COMPOSIO_USER_ID:
    raise ValueError("COMPOSIO_USER_ID is not set in the environment")
```

```typescript
const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
const COMPOSIO_API_KEY = process.env.COMPOSIO_API_KEY;
const COMPOSIO_USER_ID = process.env.COMPOSIO_USER_ID;

if (!OPENAI_API_KEY) throw new Error("OPENAI_API_KEY is not set");
if (!COMPOSIO_API_KEY) throw new Error("COMPOSIO_API_KEY is not set");
if (!COMPOSIO_USER_ID) throw new Error("COMPOSIO_USER_ID is not set");
```

### 6. Create a Tool Router session and build the agent function

What's happening here:
- We create a Composio client using your API key and configure it with the LlamaIndex provider
- We then create a tool router MCP session for your user, specifying the toolkits we want to use (in this case, polygon)
- The session returns an MCP HTTP endpoint URL that acts as a gateway to all your configured tools
- LlamaIndex will connect to this endpoint to dynamically discover and use the available Polygon tools.
- The MCP tools are mapped to LlamaIndex-compatible tools and plug them into the Agent.
```python
async def build_agent() -> ReActAgent:
    composio_client = Composio(
        api_key=COMPOSIO_API_KEY,
        provider=LlamaIndexProvider(),
    )

    session = composio_client.create(
        user_id=COMPOSIO_USER_ID,
        toolkits=["polygon"],
    )

    mcp_url = session.mcp.url
    print(f"Composio MCP URL: {mcp_url}")

    mcp_client = BasicMCPClient(mcp_url, headers={"x-api-key": COMPOSIO_API_KEY})
    mcp_tool_spec = McpToolSpec(client=mcp_client)
    tools = await mcp_tool_spec.to_tool_list_async()

    llm = OpenAI(model="gpt-5")

    description = "An agent that uses Composio Tool Router MCP tools to perform Polygon actions."
    system_prompt = """
    You are a helpful assistant connected to Composio Tool Router.
    Use the available tools to answer user queries and perform Polygon actions.
    """
    return ReActAgent(tools=tools, llm=llm, description=description, system_prompt=system_prompt, verbose=True)
```

```typescript
async function buildAgent() {

  console.log(`Initializing Composio client...${COMPOSIO_USER_ID!}...`);
  console.log(`COMPOSIO_USER_ID: ${COMPOSIO_USER_ID!}...`);

  const composio = new Composio({
    apiKey: COMPOSIO_API_KEY,
    provider: new LlamaindexProvider(),
  });

  const session = await composio.create(
    COMPOSIO_USER_ID!,
    {
      toolkits: ["polygon"],
    },
  );

  const mcpUrl = session.mcp.url;
  console.log(`Composio Tool Router MCP URL: ${mcpUrl}`);

  const server = mcp({
    url: mcpUrl,
    clientName: "composio_tool_router_with_llamaindex",
    requestInit: {
      headers: {
        "x-api-key": COMPOSIO_API_KEY!,
      },
    },
    // verbose: true,
  });

  const tools = await server.tools();

  const llm = openai({ apiKey: OPENAI_API_KEY, model: "gpt-5" });

  const agent = createAgent({
    name: "composio_tool_router_with_llamaindex",
        description : "An agent that uses Composio Tool Router MCP tools to perform actions.",
    systemPrompt:
      "You are a helpful assistant connected to Composio Tool Router."+
"Use the available tools to answer user queries and perform Polygon actions." ,
    llm,
    tools,
  });

  return agent;
}
```

### 7. Create an interactive chat loop

No description provided.
```python
async def chat_loop(agent: ReActAgent) -> None:
    ctx = Context(agent)
    print("Type 'quit', 'exit', or Ctrl+C to stop.")

    while True:
        try:
            user_input = input("\nYou: ").strip()
        except (KeyboardInterrupt, EOFError):
            print("\nBye!")
            break

        if not user_input or user_input.lower() in {"quit", "exit"}:
            print("Bye!")
            break

        try:
            print("Agent: ", end="", flush=True)
            handler = agent.run(user_input, ctx=ctx)

            async for event in handler.stream_events():
                # Stream token-by-token from LLM responses
                if hasattr(event, "delta") and event.delta:
                    print(event.delta, end="", flush=True)
                # Show tool calls as they happen
                elif hasattr(event, "tool_name"):
                    print(f"\n[Using tool: {event.tool_name}]", flush=True)

            # Get final response
            response = await handler
            print()  # Newline after streaming
        except KeyboardInterrupt:
            print("\n[Interrupted]")
            continue
        except Exception as e:
            print(f"\nError: {e}")
```

```typescript
async function chatLoop(agent: ReturnType<typeof createAgent>) {
  const rl = readline.createInterface({ input, output });

  console.log("Type 'quit' or 'exit' to stop.");

  while (true) {
    let userInput: string;

    try {
      userInput = (await rl.question("\nYou: ")).trim();
    } catch {
      console.log("\nAgent: Bye!");
      break;
    }

    if (!userInput) {
      continue;
    }

    const lower = userInput.toLowerCase();
    if (lower === "quit" || lower === "exit") {
      console.log("Agent: Bye!");
      break;
    }

    try {
      process.stdout.write("Agent: ");

      const stream = agent.runStream(userInput);
      let finalResult: any = null;

      for await (const event of stream) {
        // The event.data contains the streamed content
        const data: any = event.data;

        // Check for streaming delta content
        if (data?.delta) {
          process.stdout.write(data.delta);
        }

        // Store final result for fallback
        if (data?.result || data?.message) {
          finalResult = data;
        }
      }

      // If no streaming happened, show the final result
      if (finalResult) {
        const answer =
          finalResult.result ??
          finalResult.message?.content ??
          finalResult.message ??
          "";
        if (answer && typeof answer === "string" && !answer.includes("[object")) {
          process.stdout.write(answer);
        }
      }

      console.log(); // New line after streaming completes
    } catch (err: any) {
      console.error("\nAgent error:", err?.message ?? err);
    }
  }

  rl.close();
}
```

### 8. Define the main entry point

What's happening here:
- We're orchestrating the entire application flow
- The agent gets built with proper error handling
- Then we kick off the interactive chat loop so you can start talking to Polygon
```python
async def main() -> None:
    agent = await build_agent()
    await chat_loop(agent)

if __name__ == "__main__":
    # Handle Ctrl+C gracefully
    signal.signal(signal.SIGINT, lambda s, f: (print("\nBye!"), exit(0)))
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\nBye!")
```

```typescript
async function main() {
  try {
    const agent = await buildAgent();
    await chatLoop(agent);
  } catch (err) {
    console.error("Failed to start agent:", err);
    process.exit(1);
  }
}

main();
```

### 9. Run the agent

When prompted, authenticate and authorise your agent with Polygon, then start asking questions.
```bash
python llamaindex_agent.py
```

```typescript
npx ts-node llamaindex-agent.ts
```

## Complete Code

```python
import asyncio
import os
import signal
import dotenv

from composio import Composio
from composio_llamaindex import LlamaIndexProvider
from llama_index.core.agent.workflow import ReActAgent
from llama_index.core.workflow import Context
from llama_index.llms.openai import OpenAI
from llama_index.tools.mcp import BasicMCPClient, McpToolSpec

dotenv.load_dotenv()

OPENAI_API_KEY = os.getenv("OPENAI_API_KEY")
COMPOSIO_API_KEY = os.getenv("COMPOSIO_API_KEY")
COMPOSIO_USER_ID = os.getenv("COMPOSIO_USER_ID")

if not OPENAI_API_KEY:
    raise ValueError("OPENAI_API_KEY is not set")
if not COMPOSIO_API_KEY:
    raise ValueError("COMPOSIO_API_KEY is not set")
if not COMPOSIO_USER_ID:
    raise ValueError("COMPOSIO_USER_ID is not set")

async def build_agent() -> ReActAgent:
    composio_client = Composio(
        api_key=COMPOSIO_API_KEY,
        provider=LlamaIndexProvider(),
    )

    session = composio_client.create(
        user_id=COMPOSIO_USER_ID,
        toolkits=["polygon"],
    )

    mcp_url = session.mcp.url
    print(f"Composio MCP URL: {mcp_url}")

    mcp_client = BasicMCPClient(mcp_url, headers={"x-api-key": COMPOSIO_API_KEY})
    mcp_tool_spec = McpToolSpec(client=mcp_client)
    tools = await mcp_tool_spec.to_tool_list_async()

    llm = OpenAI(model="gpt-5")
    description = "An agent that uses Composio Tool Router MCP tools to perform Polygon actions."
    system_prompt = """
    You are a helpful assistant connected to Composio Tool Router.
    Use the available tools to answer user queries and perform Polygon actions.
    """
    return ReActAgent(
        tools=tools,
        llm=llm,
        description=description,
        system_prompt=system_prompt,
        verbose=True,
    );

async def chat_loop(agent: ReActAgent) -> None:
    ctx = Context(agent)
    print("Type 'quit', 'exit', or Ctrl+C to stop.")

    while True:
        try:
            user_input = input("\nYou: ").strip()
        except (KeyboardInterrupt, EOFError):
            print("\nBye!")
            break

        if not user_input or user_input.lower() in {"quit", "exit"}:
            print("Bye!")
            break

        try:
            print("Agent: ", end="", flush=True)
            handler = agent.run(user_input, ctx=ctx)

            async for event in handler.stream_events():
                # Stream token-by-token from LLM responses
                if hasattr(event, "delta") and event.delta:
                    print(event.delta, end="", flush=True)
                # Show tool calls as they happen
                elif hasattr(event, "tool_name"):
                    print(f"\n[Using tool: {event.tool_name}]", flush=True)

            # Get final response
            response = await handler
            print()  # Newline after streaming
        except KeyboardInterrupt:
            print("\n[Interrupted]")
            continue
        except Exception as e:
            print(f"\nError: {e}")

async def main() -> None:
    agent = await build_agent()
    await chat_loop(agent)

if __name__ == "__main__":
    # Handle Ctrl+C gracefully
    signal.signal(signal.SIGINT, lambda s, f: (print("\nBye!"), exit(0)))
    try:
        asyncio.run(main())
    except KeyboardInterrupt:
        print("\nBye!")
```

```typescript
import "dotenv/config";
import readline from "node:readline/promises";
import { stdin as input, stdout as output } from "node:process";

import { Composio } from "@composio/core";
import { LlamaindexProvider } from "@composio/llamaindex";

import { mcp } from "@llamaindex/tools";
import { agent as createAgent } from "@llamaindex/workflow";
import { openai } from "@llamaindex/openai";

dotenv.config();

const OPENAI_API_KEY = process.env.OPENAI_API_KEY;
const COMPOSIO_API_KEY = process.env.COMPOSIO_API_KEY;
const COMPOSIO_USER_ID = process.env.COMPOSIO_USER_ID;

if (!OPENAI_API_KEY) {
    throw new Error("OPENAI_API_KEY is not set in the environment");
  }
if (!COMPOSIO_API_KEY) {
    throw new Error("COMPOSIO_API_KEY is not set in the environment");
  }
if (!COMPOSIO_USER_ID) {
    throw new Error("COMPOSIO_USER_ID is not set in the environment");
  }

async function buildAgent() {

  console.log(`Initializing Composio client...${COMPOSIO_USER_ID!}...`);
  console.log(`COMPOSIO_USER_ID: ${COMPOSIO_USER_ID!}...`);

  const composio = new Composio({
    apiKey: COMPOSIO_API_KEY,
    provider: new LlamaindexProvider(),
  });

  const session = await composio.create(
    COMPOSIO_USER_ID!,
    {
      toolkits: ["polygon"],
    },
  );

  const mcpUrl = session.mcp.url;
  console.log(`Composio Tool Router MCP URL: ${mcpUrl}`);

  const server = mcp({
    url: mcpUrl,
    clientName: "composio_tool_router_with_llamaindex",
    requestInit: {
      headers: {
        "x-api-key": COMPOSIO_API_KEY!,
      },
    },
    // verbose: true,
  });

  const tools = await server.tools();

  const llm = openai({ apiKey: OPENAI_API_KEY, model: "gpt-5" });

  const agent = createAgent({
    name: "composio_tool_router_with_llamaindex",
    description:
      "An agent that uses Composio Tool Router MCP tools to perform actions.",
    systemPrompt:
      "You are a helpful assistant connected to Composio Tool Router."+
"Use the available tools to answer user queries and perform Polygon actions." ,
    llm,
    tools,
  });

  return agent;
}

async function chatLoop(agent: ReturnType<typeof createAgent>) {
  const rl = readline.createInterface({ input, output });

  console.log("Type 'quit' or 'exit' to stop.");

  while (true) {
    let userInput: string;

    try {
      userInput = (await rl.question("\nYou: ")).trim();
    } catch {
      console.log("\nAgent: Bye!");
      break;
    }

    if (!userInput) {
      continue;
    }

    const lower = userInput.toLowerCase();
    if (lower === "quit" || lower === "exit") {
      console.log("Agent: Bye!");
      break;
    }

    try {
      process.stdout.write("Agent: ");

      const stream = agent.runStream(userInput);
      let finalResult: any = null;

      for await (const event of stream) {
        // The event.data contains the streamed content
        const data: any = event.data;

        // Check for streaming delta content
        if (data?.delta) {
          process.stdout.write(data.delta);
        }

        // Store final result for fallback
        if (data?.result || data?.message) {
          finalResult = data;
        }
      }

      // If no streaming happened, show the final result
      if (finalResult) {
        const answer =
          finalResult.result ??
          finalResult.message?.content ??
          finalResult.message ??
          "";
        if (answer && typeof answer === "string" && !answer.includes("[object")) {
          process.stdout.write(answer);
        }
      }

      console.log(); // New line after streaming completes
    } catch (err: any) {
      console.error("\nAgent error:", err?.message ?? err);
    }
  }

  rl.close();
}

async function main() {
  try {
    const agent = await buildAgent();
    await chatLoop(agent);
  } catch (err: any) {
    console.error("Failed to start agent:", err?.message ?? err);
    process.exit(1);
  }
}

main();
```

## Conclusion

You've successfully connected Polygon to LlamaIndex through Composio's Tool Router MCP layer.
Key takeaways:
- Tool Router dynamically exposes Polygon tools through an MCP endpoint
- LlamaIndex's ReActAgent handles reasoning and orchestration; Composio handles integrations
- The agent becomes more capable without increasing prompt size
- Async Python provides clean, efficient execution of agent workflows
You can easily extend this to other toolkits like Gmail, Notion, Stripe, GitHub, and more by adding them to the toolkits parameter.

## How to build Polygon MCP Agent with another framework

- [OpenAI Agents SDK](https://composio.dev/toolkits/polygon/framework/open-ai-agents-sdk)
- [Claude Agent SDK](https://composio.dev/toolkits/polygon/framework/claude-agents-sdk)
- [Claude Code](https://composio.dev/toolkits/polygon/framework/claude-code)
- [Claude Cowork](https://composio.dev/toolkits/polygon/framework/claude-cowork)
- [Codex](https://composio.dev/toolkits/polygon/framework/codex)
- [OpenClaw](https://composio.dev/toolkits/polygon/framework/openclaw)
- [Hermes](https://composio.dev/toolkits/polygon/framework/hermes-agent)
- [CLI](https://composio.dev/toolkits/polygon/framework/cli)
- [Google ADK](https://composio.dev/toolkits/polygon/framework/google-adk)
- [LangChain](https://composio.dev/toolkits/polygon/framework/langchain)
- [Vercel AI SDK](https://composio.dev/toolkits/polygon/framework/ai-sdk)
- [Mastra AI](https://composio.dev/toolkits/polygon/framework/mastra-ai)
- [CrewAI](https://composio.dev/toolkits/polygon/framework/crew-ai)

## Related Toolkits

- [Stripe](https://composio.dev/toolkits/stripe) - Stripe is a global online payments platform offering APIs for managing payments, customers, and subscriptions. Trusted by businesses for secure, efficient, and scalable payment processing worldwide.
- [Alpha vantage](https://composio.dev/toolkits/alpha_vantage) - Alpha Vantage is a financial data platform offering real-time and historical stock market APIs. Get instant, reliable access to equities, forex, and technical analysis data for smarter trading decisions.
- [Altoviz](https://composio.dev/toolkits/altoviz) - Altoviz is a cloud-based billing and invoicing platform for businesses. It streamlines online payments, expense tracking, and customizable invoice management.
- [Benzinga](https://composio.dev/toolkits/benzinga) - Benzinga provides real-time financial news and data APIs for market coverage. It helps you track breaking news and actionable market insights instantly.
- [Brex](https://composio.dev/toolkits/brex) - Brex provides corporate credit cards and spend management tailored for startups and tech businesses. It helps optimize company cash flow, streamline accounting, and accelerate business growth.
- [Chaser](https://composio.dev/toolkits/chaser) - Chaser is accounts receivable automation software that sends invoice reminders and helps businesses get paid faster. It streamlines the collections process to save time and improve cash flow.
- [Clientary](https://composio.dev/toolkits/clientary) - Clientary is a platform for managing clients, invoices, projects, proposals, and more. It streamlines client work and saves you serious admin time.
- [Coinbase](https://composio.dev/toolkits/coinbase) - Coinbase is a platform for buying, selling, and storing cryptocurrency. It makes exchanging and managing crypto simple and secure for everyone.
- [Coinranking](https://composio.dev/toolkits/coinranking) - Coinranking is a comprehensive cryptocurrency market data platform offering access to real-time coin prices, market caps, and historical data. Get accurate, up-to-date stats for thousands of digital assets in one place.
- [Coupa](https://composio.dev/toolkits/coupa) - Coupa is a business spend management platform for procurement, invoicing, and expenses. It helps organizations streamline purchasing, control costs, and gain complete visibility over financial operations.
- [CurrencyScoop](https://composio.dev/toolkits/currencyscoop) - CurrencyScoop is a developer-friendly API for real-time and historical currency exchange rates. Easily access fiat and crypto data for smart, up-to-date financial applications.
- [Daffy](https://composio.dev/toolkits/daffy) - Daffy is a modern charitable giving platform with a donor-advised fund. Easily set aside funds, grow them tax-free, and donate to over 1.7 million U.S. charities.
- [Eagle doc](https://composio.dev/toolkits/eagle_doc) - Eagle doc is an AI-powered OCR API for invoices and receipts. It delivers fast, reliable, and accurate document data extraction for seamless automation.
- [Elorus](https://composio.dev/toolkits/elorus) - Elorus is an online invoicing and time-tracking software for freelancers and small businesses. Easily manage finances, bill clients, and track work in one place.
- [Eodhd apis](https://composio.dev/toolkits/eodhd_apis) - Eodhd apis delivers comprehensive financial data, including live and historical stock prices, via robust APIs. Easily access reliable, up-to-date market insights to power your apps, dashboards, and analytics.
- [Fidel api](https://composio.dev/toolkits/fidel_api) - Fidel api is a secure platform for linking payment cards to web and mobile apps. It enables real-time card transaction monitoring and event-based automation for businesses.
- [Finage](https://composio.dev/toolkits/finage) - Finage is a secure API platform delivering real-time and historical financial data for stocks, forex, crypto, indices, and commodities. It empowers developers and businesses to access, analyze, and act on market data instantly.
- [Finmei](https://composio.dev/toolkits/finmei) - Finmei is an invoicing tool that simplifies billing, invoice management, and expense tracking. Ideal for automating and organizing your business finances in one place.
- [Fixer](https://composio.dev/toolkits/fixer) - Fixer is a currency data API offering real-time and historical exchange rates for 170 currencies. Instantly access accurate, up-to-date forex data for your applications and workflows.
- [Fixer io](https://composio.dev/toolkits/fixer_io) - Fixer.io is a lightweight API for real-time and historical foreign exchange rates. It makes global currency conversion fast, accurate, and hassle-free.

## Frequently Asked Questions

### What are the differences in Tool Router MCP and Polygon MCP?

With a standalone Polygon MCP server, the agents and LLMs can only access a fixed set of Polygon tools tied to that server. However, with the Composio Tool Router, agents can dynamically load tools from Polygon and many other apps based on the task at hand, all through a single MCP endpoint.

### Can I use Tool Router MCP with LlamaIndex?

Yes, you can. LlamaIndex fully supports MCP integration. You get structured tool calling, message history handling, and model orchestration while Tool Router takes care of discovering and serving the right Polygon tools.

### Can I manage the permissions and scopes for Polygon while using Tool Router?

Yes, absolutely. You can configure which Polygon scopes and actions are allowed when connecting your account to Composio. You can also bring your own OAuth credentials or API configuration so you keep full control over what the agent can do.

### How safe is my data with Composio Tool Router?

All sensitive data such as tokens, keys, and configuration is fully encrypted at rest and in transit. Composio is SOC 2 Type 2 compliant and follows strict security practices so your Polygon data and credentials are handled as safely as possible.

---
[See all toolkits](https://composio.dev/toolkits) · [Composio docs](https://docs.composio.dev/llms.txt)
