How to integrate Render MCP with LlamaIndex

This guide walks you through connecting Render to LlamaIndex using the Composio tool router. By the end, you'll have a working Render agent that can deploy latest code to staging service, restart production web service now, get current status of all services through natural language commands. This guide will help you understand how to give your LlamaIndex agent real control over a Render account through Composio's Render MCP server. Before we dive in, let's take a quick look at the key ideas and tools involved.

Render logoRender
Api Key

Render is a unified cloud platform for building and running apps and websites. It simplifies deployment, scaling, and management across your projects.

95 Tools

Introduction

This guide walks you through connecting Render to LlamaIndex using the Composio tool router. By the end, you'll have a working Render agent that can deploy latest code to staging service, restart production web service now, get current status of all services through natural language commands.

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

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

Also integrate Render with

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

The Render MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Render account. It provides structured and secure access to your cloud infrastructure, so your agent can perform actions like deploying applications, managing services, monitoring site health, restarting instances, and scaling resources on your behalf.

  • Automated application deployment: Instantly deploy new web apps or services without manual steps, letting your agent handle setup and rollouts.
  • Service monitoring and status checks: Ask your agent to check the health and uptime of your apps or services, so you’re always up to speed on what’s running smoothly—and what’s not.
  • Instance management and restarts: Enable your agent to restart, stop, or scale up/down your running services to quickly respond to changes or issues.
  • Resource scaling and configuration: Let your agent adjust resource allocations, increasing or decreasing capacity based on current needs or traffic spikes.
  • Error diagnostics and log retrieval: Have your agent fetch logs or error reports to help troubleshoot issues before they become major problems.

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

What is Composio SDK?

Composio's Composio SDK 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 Composio SDK

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

How the Composio SDK works

The Composio SDK 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

Step by step10 STEPS
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 Render account and project
  • Basic familiarity with async Python/Typescript
2

Getting API Keys for OpenAI, Composio, and Render

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
3

Installing dependencies

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

Create a new Typescript project and install the necessary dependencies:

  • @composio/llamaindex: Composio's LlamaIndex integration
  • @llamaindex/openai: OpenAI LLM integration
  • @llamaindex/tools: MCP client for LlamaIndex
  • @llamaindex/workflow: Workflow framework for LlamaIndex
  • dotenv: Environment variable management
4

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 Render access
5

Import modules

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

Create a new file called render_llamaindex_agent.ts and import the required modules:

Key imports:

  • dotenv.config loads .env at runtime
  • readline gives us a simple CLI chat loop
  • Composio is the main Composio SDK client
  • mcp connects to an MCP endpoint
  • createAgent builds a LlamaIndex agent
  • openai configures the LLM backend
6

Load environment variables and initialize Composio

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

What's happening:

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

7

Create a Tool Router session and build the agent function

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: ["render"],
    },
  );

  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 Render actions." ,
    llm,
    tools,
  });

  return agent;
}

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, render)
  • 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 Render tools.
  • The MCP tools are mapped to LlamaIndex-compatible tools and plug them into the Agent.
8

Create an interactive chat loop

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

What's happening:

  • We're creating a direct terminal interface to chat with Render
  • The LLM's responses are streamed to the CLI for faster interaction.
  • The agent uses context to maintain conversation history
  • The agent processes the request, selects appropriate Render tools, and returns a result
  • We extract the answer from the result data structure and display it to the user
  • You can type 'quit' or 'exit' to stop the chat loop gracefully
  • Agent responses and any errors are streamed in a clear, readable format
9

Define the main entry point

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

main();

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 Render
10

Run the agent

npx ts-node llamaindex-agent.ts

When prompted, authenticate and authorise your agent with Render, then start asking questions.

Complete Code

Here's the complete code to get you started with Render and LlamaIndex:

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: ["render"],
    },
  );

  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 Render 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 Render to LlamaIndex through Composio's Tool Router MCP layer. Key takeaways:
  • Tool Router dynamically exposes Render 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.
TOOLS

Supported Tools

Every Render action and event your agent gets out of the box.

Add Header Rule

Tool to add a custom HTTP header rule to a Render service.

Add or Update Secret File

Tool to add or update a secret file for a Render service.

Add Resources to Environment

Tool to add resources to a Render environment.

Add Route

Tool to add redirect or rewrite rules to a Render service.

Create Custom Domain

Tool to add a custom domain to a Render service.

Create Environment Group

Tool to create a new environment group.

Create Environment

Tool to create a new environment within a Render project.

Create Postgres Instance

Tool to create a new Postgres instance on Render.

Create Registry Credential

Tool to create a registry credential.

Delete Environment Group Variable

Tool to remove an environment variable from an environment group.

Delete Environment Group Secret File

Tool to remove a secret file from an environment group.

Delete Environment

Tool to delete a specified environment.

Delete Key Value

Tool to delete a Key Value instance.

Delete Owner Log Stream

Tool to delete a log stream for an owner.

Delete Owner Metrics Stream

Tool to delete a metrics stream for a workspace.

Delete Registry Credential

Tool to delete a registry credential.

Delete Secret File

Tool to delete a secret file from a Render service.

Delete Service

Tool to delete a service.

Disconnect Blueprint

Tool to disconnect a blueprint from your Render account.

Get Active Connections

Tool to get active connection count metrics for Render resources.

Get Bandwidth Sources

Tool to get bandwidth usage breakdown by traffic source.

Get CPU Usage

Tool to retrieve CPU usage metrics for Render resources.

Get CPU Limit

Tool to retrieve CPU limit metrics for Render resources.

Get Disk Capacity

Tool to get disk capacity metrics for Render resources.

Get Disk Usage

Tool to retrieve disk usage metrics for Render resources.

Get Instance Count

Tool to get instance count metrics for Render resources.

Get Memory Usage

Tool to get memory usage metrics for one or more resources.

Get Memory Limit

Tool to get memory limit metrics for Render resources over a specified time range.

Get Memory Target

Tool to get memory target metrics for Render resources.

Get User

Tool to get the authenticated user.

Link Service to Environment Group

Tool to link a service to an environment group.

List Application Filter Values

Tool to list queryable instance values for application metrics.

List Blueprints

Tool to list all blueprints.

List Deploys

Tool to list recent deploys for a Render service with pagination and filtering.

List Disks

Tool to list all disks.

List Environment Groups

Tool to list environment groups.

List Environments

Tool to list environments for a project.

List Environment Variables for Service

Tool to list all environment variables configured directly on a Render service (with pagination).

List Instances

Tool to list instances of a service.

List Key Value Instances

Tool to list all Key Value instances.

List Logs

Tool to list logs for a specific workspace and resource.

List Log Label Values

Tool to list log label values for a workspace.

List Maintenance Runs

Tool to list maintenance runs.

List Notification Overrides

Tool to list notification overrides for services.

List Workspace Members

Tool to list workspace members.

List Owners

Tool to list owners (users and teams).

List Postgres Instances

Tool to list Postgres instances.

List Postgres Exports

Tool to list all exports for a Postgres instance.

List PostgreSQL Users

Tool to list PostgreSQL user credentials for a Render PostgreSQL database instance.

List Projects

List Projects

List Registry Credentials

Tool to list registry credentials.

List Resource Log Streams

Tool to list resource log stream overrides.

List Routes

Tool to list redirect/rewrite rules for a service.

List Secret Files

Tool to list secret files for a Render service.

List Services

Tool to list all services.

List Task Runs

Tool to list task runs.

List Tasks

Tool to list tasks.

List Webhooks

Tool to list all webhooks.

List Workflows

Tool to list workflows.

List Workflow Versions

Tool to list workflow versions.

Restart Service

Tool to restart a service.

Resume Service

Tool to resume a suspended service.

Retrieve Custom Domain

Tool to retrieve a specific custom domain for a service.

Retrieve deploy

Retrieve deploy

Retrieve Environment Group

Tool to retrieve a specific environment group by ID.

Retrieve Environment Variable

Tool to retrieve a specific environment variable from a Render environment group.

Retrieve Environment Group Secret File

Tool to retrieve secret file from an environment group.

Retrieve Environment Variable

Tool to retrieve a specific environment variable from a Render service.

Retrieve Owner

Tool to retrieve a specific owner (workspace) by ID.

Retrieve Owner Notification Settings

Tool to retrieve notification settings for a specific owner (workspace).

Retrieve Postgres Instance

Tool to retrieve a specific Postgres instance.

Retrieve Project

Tool to retrieve a specific project by ID.

Retrieve Registry Credential

Tool to retrieve a registry credential by ID.

Retrieve Secret File

Tool to retrieve a secret file from a Render service.

Retrieve Service

Tool to retrieve a specific service by ID.

Stream Task Runs Events

Tool to stream real-time task run events via Server-Sent Events (SSE).

Subscribe to Logs

Tool to subscribe to real-time logs via WebSocket connection.

Suspend Service

Tool to suspend a service.

Trigger Deploy

Tool to trigger a new deploy for a specified service.

Update Environment Group

Tool to update an environment group's name.

Update Environment Group Variable

Tool to add or update an environment variable in an environment group.

Update Environment Group Secret File

Tool to add or update a secret file in an environment group.

Update Environment Variable

Tool to add or update an environment variable for a Render service.

Update Environment Variables for Service

Tool to update environment variables for a Render service.

Update Header Rules

Tool to replace all header rules for a Render service.

Update Owner Log Stream

Tool to update log stream configuration for an owner.

Update Owner Notification Settings

Tool to update notification settings for a specific owner (workspace).

Update Postgres Instance

Tool to update a Postgres instance configuration.

Update Project

Tool to update a project's name.

Update Registry Credential

Tool to update a registry credential.

Update Resource Log Stream

Tool to update log stream override for a resource.

Update Routes

Tool to update redirect/rewrite rules for a service.

Update Secret Files for Service

Tool to update secret files for a Render service.

Update Service

Tool to update a service configuration.

Verify Custom Domain

Tool to verify DNS configuration for a custom domain.

FAQ

Frequently asked questions

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

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 Render tools.

Yes, absolutely. You can configure which Render 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.

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 Render data and credentials are handled as safely as possible.

Start with Render.It takes 30 seconds.

Managed auth, hosted MCP servers, and every Render tool your agent needs.Free to start.

Start building