How to integrate Studio By Ai21 Labs MCP with LlamaIndex

Framework Integration Gradient
Studio By Ai21 Labs Logo
LlamaIndex Logo
divider

Introduction

This guide walks you through connecting Studio By Ai21 Labs to LlamaIndex using the Composio tool router. By the end, you'll have a working Studio By Ai21 Labs agent that can generate a summary of this research paper, classify sentiment of this product review, extract key topics from meeting transcript through natural language commands.

This guide will help you understand how to give your LlamaIndex agent real control over a Studio By Ai21 Labs account through Composio's Studio By Ai21 Labs MCP server.

Before we dive in, let's take a quick look at the key ideas and tools involved.

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 Studio By Ai21 Labs
  • Connect LlamaIndex to the Studio By Ai21 Labs MCP server
  • Build a Studio By Ai21 Labs-powered agent using LlamaIndex
  • Interact with Studio By Ai21 Labs 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 Studio By Ai21 Labs MCP server, and what's possible with it?

The Studio By Ai21 Labs MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Studio By Ai21 Labs account. It provides structured and secure access so your agent can perform Studio By Ai21 Labs operations on your behalf.

Supported Tools & Triggers

Tools
Check Can IframeTool to check if a URL can be embedded in an iframe.
Compare TextTool to compare two text strings and identify differences.
Create Aftersales Parts Classification BatchTool to create a batch job for Fnac Aftersales parts classification.
Create Assistant RouteTool to create a new route for an AI21 Studio assistant.
Create AssistantTool to create a new AI assistant in AI21 Studio.
Create Assistant PlanTool to create a new plan for an AI21 Studio assistant.
Create DemoTool to create a new demo in AI21 Studio.
Generate RequirementsTool to generate requirements from a query or task description.
Generate Thread NameTool to generate a thread name from a query or conversation context.
Create Kirsh Grant Compliance PreviewTool to preview grant compliance for Kirsh grants.
Kirsh Grant Metadata PreviewTool to retrieve grant metadata from the Kirsh preview endpoint.
Create MCP StorageTool to create MCP (Model Context Protocol) storage in AI21 Studio.
Create SecretTool to save a secret in AI21 Studio.
Check Kirsh Grant ComplianceTool to check compliance for Kirsh grant IDs.
Create Website ConnectorTool to create a website connector in AI21 Studio.
Delete AssistantTool to delete an assistant by its unique ID.
Delete Assistant RouteTool to delete a route from an AI21 Studio assistant.
Delete DemoTool to delete a demo by its unique ID.
Delete MCP StorageTool to delete an MCP (Model Context Protocol) storage configuration by its unique ID.
Delete SecretTool to delete a secret by its unique ID.
Delete Website ConnectorPermanently delete a website connector by its unique identifier.
Download Modified DocumentTool to download a modified document from AI21 Labs Studio.
Get AssistantTool to retrieve an assistant by its unique identifier.
Get Assistant RouteTool to retrieve details of a specific route for an AI21 Studio assistant.
Get Assistants By MCPTool to retrieve all assistants associated with a specific MCP (Model Context Protocol) storage configuration.
Get Batch Prediction StatusTool to check the status of a Fnac Aftersales parts classification batch prediction job.
Get DemoTool to retrieve a demo by its unique ID.
Grant Kirsh MetadataTool to retrieve Kirsh grant metadata by grant ID.
Get Library Batch StatusTool to get the ingestion status of a library batch.
Get MCP StorageTool to retrieve a specific MCP (Model Context Protocol) storage configuration by its unique ID.
Get Output ExplanationTool to get output explanation for an execution (cached or generated).
Get PlanTool to retrieve a specific plan from an AI21 Studio assistant.
Get Website Connector By IDTool to retrieve details of a specific website connector by its ID.
Get Website Connector StatusTool to retrieve the status of a website connector ingestion.
Get Website Connector URL StatusTool to retrieve the status of a specific URL in the website connector.
Ingest Website ConnectorTool to ingest website content via sitemap URL in AI21 Studio.
Ingest Website Connector URLTool to ingest a website URL into AI21 Studio's website connector.
List AssistantsTool to retrieve all assistants from AI21 Studio.
List Website ConnectorsTool to retrieve website connector information from AI21 Studio.
List DemosTool to retrieve all demos from AI21 Studio.
List Library FilesTool to list files in the workspace library with optional filtering.
List MCP StorageTool to retrieve all MCP (Model Context Protocol) storage configurations from AI21 Studio.
List ModelsTool to retrieve information about all available AI21 models.
List PlansTool to list all plans for a specific assistant.
List SecretsTool to retrieve all secrets from AI21 Studio secret storage.
List Workspace ModelsTool to retrieve all workspace models by organization from AI21 Studio.
List Available ModelsTool to retrieve all available models from AI21 Studio settings.
Modify AssistantTool to modify an existing AI21 Studio assistant.
Modify Assistant RouteTool to modify an existing route within an assistant.
Modify Assistant PlanTool to modify an existing assistant plan in AI21 Studio.
Retry Ingest WebsiteTool to retry ingestion of a website in AI21 Studio.
Run AssistantTool to run an AI21 Studio assistant with conversational input.
Sync Website ConnectorTool to sync a website connector in AI21 Studio.
Update DemoTool to update an existing demo in Studio by AI21 Labs.
Update MCP StorageTool to update an existing MCP (Model Context Protocol) storage configuration in AI21 Studio.
Update SecretTool to update an existing secret in AI21 Studio.
Validate PlanTool to validate Python code for an AI21 Studio assistant plan.

What is the Composio tool router, and how does it fit here?

What is Tool Router?

Composio's Tool Router helps agents find the right tools for a task at runtime. You can plug in multiple toolkits (like Gmail, HubSpot, and GitHub), and the agent will identify the relevant app and action to complete multi-step workflows. This can reduce token usage and improve the reliability of tool calls. Read more here: Getting started with Tool Router

The tool router generates a secure MCP URL that your agents can access to perform actions.

How the Tool Router works

The Tool Router follows a three-phase workflow:

  1. Discovery: Searches for tools matching your task and returns relevant toolkits with their details.
  2. Authentication: Checks for active connections. If missing, creates an auth config and returns a connection URL via Auth Link.
  3. Execution: Executes the action using the authenticated connection.

Step-by-step Guide

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 Studio By Ai21 Labs account and project
  • Basic familiarity with async Python/Typescript

Getting API Keys for OpenAI, Composio, and Studio By Ai21 Labs

OpenAI API key (OPENAI_API_KEY)
  • Go to the OpenAI dashboard
  • Create an API key if you don't have one
  • Assign it to OPENAI_API_KEY in .env
Composio API key and user ID
  • Log into the Composio dashboard
  • Copy your API key from Settings
    • Use this as COMPOSIO_API_KEY
  • Pick a stable user identifier (email or ID)
    • Use this as COMPOSIO_USER_ID

Installing dependencies

pip install composio-llamaindex llama-index llama-index-llms-openai llama-index-tools-mcp python-dotenv

Create a new Python project and install the necessary dependencies:

  • composio-llamaindex: Composio's LlamaIndex integration
  • llama-index: Core LlamaIndex framework
  • llama-index-llms-openai: OpenAI LLM integration
  • llama-index-tools-mcp: MCP client for LlamaIndex
  • python-dotenv: Environment variable management

Set environment variables

bash
OPENAI_API_KEY=your-openai-api-key
COMPOSIO_API_KEY=your-composio-api-key
COMPOSIO_USER_ID=your-user-id

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 Studio By Ai21 Labs access

Import modules

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()

Create a new file called studio by ai21 labs_llamaindex_agent.py and import the required modules:

Key imports:

  • asyncio: For async/await support
  • Composio: Main client for Composio services
  • LlamaIndexProvider: Adapts Composio tools for LlamaIndex
  • ReActAgent: LlamaIndex's reasoning and action agent
  • BasicMCPClient: Connects to MCP endpoints
  • McpToolSpec: Converts MCP tools to LlamaIndex format

Load environment variables and initialize Composio

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")

What's happening:

This ensures missing credentials cause early, clear errors before the agent attempts to initialise.

Create a Tool Router session and build the agent function

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=["studio_by_ai21_labs"],
    )

    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 Studio By Ai21 Labs actions."
    system_prompt = """
    You are a helpful assistant connected to Composio Tool Router.
    Use the available tools to answer user queries and perform Studio By Ai21 Labs actions.
    """
    return ReActAgent(tools=tools, llm=llm, description=description, system_prompt=system_prompt, verbose=True)

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, studio by ai21 labs)
  • 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 Studio By Ai21 Labs tools.
  • The MCP tools are mapped to LlamaIndex-compatible tools and plug them into the Agent.

Create an interactive chat loop

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}")

What's happening here:

  • We're creating a direct terminal interface to chat with your Studio By Ai21 Labs database
  • The LLM's responses are streamed to the CLI for faster interaction.
  • The agent uses context to maintain conversation history
  • You can type 'quit' or 'exit' to stop the chat loop gracefully
  • Agent responses and any errors are displayed in a clear, readable format

Define the main entry point

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!")

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 Studio By Ai21 Labs

Run the agent

npx ts-node llamaindex-agent.ts

When prompted, authenticate and authorise your agent with Studio By Ai21 Labs, then start asking questions.

Complete Code

Here's the complete code to get you started with Studio By Ai21 Labs and LlamaIndex:

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=["studio_by_ai21_labs"],
    )

    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 Studio By Ai21 Labs actions."
    system_prompt = """
    You are a helpful assistant connected to Composio Tool Router.
    Use the available tools to answer user queries and perform Studio By Ai21 Labs 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!")

Conclusion

You've successfully connected Studio By Ai21 Labs to LlamaIndex through Composio's Tool Router MCP layer. Key takeaways:
  • Tool Router dynamically exposes Studio By Ai21 Labs 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 Studio By Ai21 Labs MCP Agent with another framework

FAQ

What are the differences in Tool Router MCP and Studio By Ai21 Labs MCP?

With a standalone Studio By Ai21 Labs MCP server, the agents and LLMs can only access a fixed set of Studio By Ai21 Labs tools tied to that server. However, with the Composio Tool Router, agents can dynamically load tools from Studio By Ai21 Labs 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 Studio By Ai21 Labs tools.

Can I manage the permissions and scopes for Studio By Ai21 Labs while using Tool Router?

Yes, absolutely. You can configure which Studio By Ai21 Labs 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 Studio By Ai21 Labs data and credentials are handled as safely as possible.

Used by agents from

Context
Letta
glean
HubSpot
Agent.ai
Altera
DataStax
Entelligence
Rolai
Context
Letta
glean
HubSpot
Agent.ai
Altera
DataStax
Entelligence
Rolai
Context
Letta
glean
HubSpot
Agent.ai
Altera
DataStax
Entelligence
Rolai

Never worry about agent reliability

We handle tool reliability, observability, and security so you never have to second-guess an agent action.