How to integrate New relic MCP with LlamaIndex

Trusted by
AWS
Glean
Zoom
Airtable

30 min · no commitment · see it on your stack

New relic logo
LlamaIndex logo
divider

Introduction

This guide walks you through connecting New relic to LlamaIndex using the Composio tool router. By the end, you'll have a working New relic agent that can list all alert policies for your account, create a new webhook alert channel, get all applications monitored in new relic through natural language commands.

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

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

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

The New Relic MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your New Relic account. It provides structured and secure access to your observability data and alerting infrastructure, so your agent can perform actions like retrieving application metrics, managing alert policies, updating notification channels, and monitoring browser applications on your behalf.

  • Comprehensive alert policy management: Effortlessly create, update, or delete New Relic alert policies to keep your monitoring rules current and effective.
  • Alert notification channel control: Register new alert endpoints, update existing channels, or list all notification channels to optimize how your team receives important alerts.
  • Real-time application monitoring: Instantly retrieve a list of all monitored applications, filter them by name or host, and stay on top of your software stack’s health.
  • Browser application insights: List and filter browser applications to monitor user experience and catch frontend issues before they escalate.
  • Alert condition visibility: Fetch detailed alert conditions for specific policies, so you can audit or fine-tune how your system responds to incidents.

Supported Tools & Triggers

Tools
Add Notification Channels to PolicyTool to add notification channels to an alert policy using the NerdGraph GraphQL API.
Add Tags to EntityTool to add tags with values to a specific New Relic entity via NerdGraph GraphQL API.
Add Widgets to Dashboard PageTool to add widgets to an existing New Relic dashboard page via NerdGraph GraphQL API.
Configure Cloud IntegrationTool to enable and configure cloud integrations for monitoring in New Relic.
Create AI Notifications ChannelTool to create a New Relic AI Notifications channel via NerdGraph GraphQL API.
Create AI Notifications DestinationTool to create an AI notifications destination in New Relic for services like Jira or ServiceNow.
Create AI WorkflowTool to create an AI workflow for automated incident response in New Relic.
Create Alert Notification ChannelTool to create an alert notification channel.
Create Alert PolicyCreates a new alert policy in New Relic.
Create Static NRQL Alert ConditionTool to create a static NRQL alert condition using New Relic's NerdGraph GraphQL API.
Create Alert Policy (GraphQL)Tool to create a new alert policy using New Relic's NerdGraph GraphQL API.
Create API Access KeysTool to create New Relic API access keys using NerdGraph.
Create Broken Links MonitorTool to create a broken links monitor that scans a webpage for broken links.
Create DashboardTool to create a New Relic dashboard using NerdGraph GraphQL API.
Create Dashboard Snapshot URLTool to create a snapshot URL for sharing a New Relic dashboard at a specific point in time.
Create Deployment MarkerTool to record a deployment marker in New Relic to track changes and their effects on your systems.
Create Entity RelationshipTool to create or replace a user-defined relationship between two New Relic entities via NerdGraph GraphQL API.
Create Example Browser ApplicationTool to create a new browser application in New Relic via NerdGraph GraphQL API.
Create Example Mobile ApplicationTool to create a new example mobile application in New Relic via NerdGraph GraphQL API.
Create External Service Alert ConditionTool to create an external service alert condition in New Relic.
Create Infrastructure Alert ConditionTool to create an infrastructure alert condition in New Relic.
Create Location Failure Alert ConditionTool to create a location failure alert condition in New Relic.
Create Log Data Partition RuleTool to create a log data partition rule using New Relic's NerdGraph GraphQL API.
Create Lookup TableTool to upload a new lookup table to your New Relic account.
Create Metric Normalization RuleTool to create a metric normalization rule using New Relic's NerdGraph GraphQL API.
Create Synthetic MonitorTool to create a new synthetic monitor in New Relic for monitoring website or API availability.
Create NRQL Baseline Alert ConditionTool to create a NRQL baseline alert condition in New Relic via NerdGraph GraphQL API.
Create NRQL ConditionCreates a new NRQL alert condition for a specified policy.
Create Scripted MonitorTool to create a scripted monitor in New Relic Synthetics using NerdGraph GraphQL API.
Create Secure CredentialTool to add a secure credential to New Relic for use in synthetic monitors.
Create Service LevelTool to create a service level indicator (SLI) and optional objectives (SLO) using New Relic's NerdGraph GraphQL API.
Create Synthetics Alert ConditionTool to create a synthetics alert condition for monitoring synthetic checks.
Create Synthetics Private LocationTool to create a Synthetics private location via New Relic's NerdGraph GraphQL API.
Create Synthetics Secure CredentialTool to create a secure credential in New Relic Synthetics using NerdGraph GraphQL API.
Create Synthetics Simple MonitorTool to create a New Relic Synthetics simple (ping) monitor to check URL/endpoint accessibility.
Create UserTool to create a new user in New Relic account via NerdGraph GraphQL API.
Delete Agent ApplicationTool to delete an APM application entity via NerdGraph GraphQL API.
Delete AI notifications channelTool to delete an AI notifications channel via NerdGraph GraphQL API.
Delete AI Notifications DestinationTool to delete an AI notifications destination via NerdGraph GraphQL API.
Delete Alert ChannelTool to delete an alert notification channel via REST API.
Delete alert policyTool to delete an existing alert policy via REST API.
Delete alerts conditionTool to delete an alert condition via NerdGraph GraphQL API.
Delete Alert Policy via GraphQLTool to delete an alert policy using New Relic's NerdGraph GraphQL API.
Delete API Access KeysTool to delete API access keys (ingest/license keys or user keys) via New Relic's NerdGraph GraphQL API.
Delete DashboardTool to delete a New Relic dashboard using its entity GUID via NerdGraph GraphQL API.
Delete Data Partition RuleTool to delete a data partition rule via New Relic's NerdGraph GraphQL API.
Delete EntityTool to delete entities via New Relic's NerdGraph GraphQL API.
Delete Entity Relationship (User-Defined)Tool to delete user-defined relationships between entities via New Relic's NerdGraph GraphQL API.
Delete External Service ConditionTool to delete an external service alert condition in New Relic.
Delete Infrastructure Alert ConditionTool to delete an infrastructure alert condition.
Delete Location Failure Alert ConditionTool to delete a location failure alert condition via REST API.
Delete Lookup TableTool to delete a lookup table from New Relic.
Delete synthetic monitorTool to delete an existing synthetic monitor.
Delete NRQL ConditionTool to delete a NRQL alert condition via REST API.
Remove channel from policyTool to remove a notification channel from an alert policy.
Delete Secure CredentialTool to delete an existing secure credential from New Relic Synthetics.
Delete Synthetics Alert ConditionTool to delete a synthetics alert condition.
Delete Synthetics Monitor (GraphQL)Tool to delete a synthetic monitor using its GUID via New Relic's NerdGraph GraphQL API.
Delete Synthetics Private LocationTool to delete a synthetics private location via New Relic's NerdGraph GraphQL API.
Delete Synthetics Secure CredentialTool to delete a secure credential used in synthetic monitors via NerdGraph GraphQL API.
Delete Tag Values From EntityTool to delete specific tag values from a New Relic entity via NerdGraph GraphQL API.
Delete User Management UserTool to delete a user via New Relic's NerdGraph User Management API.
Delete WorkloadTool to delete a workload from New Relic by its GUID using NerdGraph GraphQL API.
Disable Cloud IntegrationTool to disable (remove) a cloud integration in New Relic.
Disable Metric Normalization RuleTool to disable a metric normalization rule using New Relic's NerdGraph GraphQL API.
Duplicate WorkloadTool to duplicate an existing workload using New Relic's NerdGraph GraphQL API.
Edit Metric Normalization RuleTool to edit an existing metric normalization rule using New Relic's NerdGraph GraphQL API.
Enable Metric Normalization RuleTool to enable a previously disabled metric normalization rule using New Relic's NerdGraph GraphQL API.
Execute NRQL QueryTool to execute NRQL queries to retrieve data from New Relic via NerdGraph GraphQL API.
Fetch Browser ConfigurationTool to fetch browser application configuration via New Relic's NerdGraph GraphQL API.
Fetch Browser JavaScript SnippetTool to fetch the JavaScript loader script snippet for a New Relic browser application.
Fetch Mobile Application TokenTool to fetch mobile application token for a given mobile app entity GUID via New Relic's NerdGraph GraphQL API.
Fetch Rules CollectionTool to fetch rules from a New Relic collection (Scorecard) via NerdGraph GraphQL API.
Fetch Your Organization IDTool to fetch your organization ID and name via New Relic's NerdGraph GraphQL API.
Get Alert ChannelsRetrieves a paginated list of alert notification channels configured in your New Relic account.
Get Alert ConditionsTool to retrieve alert conditions for a specified policy.
Get Alert PoliciesTool to retrieve a list of alert policies.
Get Alerts ViolationsTool to retrieve a list of alert violations from New Relic.
Get ApplicationsTool to retrieve a list of New Relic applications.
Get App Metric DataTool to retrieve metric timeslice data for a New Relic application.
Get Application Metrics NamesTool to retrieve a list of available metric names for a New Relic application.
Get Browser ApplicationsTool to list New Relic browser applications.
Get Dashboard Entity QueryTool to query detailed information about a New Relic dashboard entity using its GUID via NerdGraph GraphQL API.
Get Infrastructure Alert ConditionTool to retrieve details for a specific infrastructure alert condition.
Get Lookup TableTool to download a lookup table that was previously uploaded to New Relic.
Get Mobile ApplicationTool to retrieve details for a specific New Relic mobile application including crash count and crash rate.
Get Mobile Application MetricsTool to retrieve metric names for a New Relic mobile application.
Get Mobile Metric DataTool to retrieve metric data for a mobile application including crash count and crash rate.
Get Secure CredentialTool to retrieve a specific secure credential by key from New Relic Synthetics.
Get Synthetic MonitorTool to retrieve details for a specific synthetic monitor by its ID.
Link Cloud AccountTool to link cloud provider accounts (AWS, Azure, GCP) to your New Relic account for monitoring.
List DeploymentsTool to retrieve a list of all past deployments for a New Relic application.
List External Service Alert ConditionsTool to retrieve a list of external service alert conditions for a specified policy.
List Infrastructure Alert ConditionsTool to list infrastructure alert conditions for a specific policy.
List Key TransactionsTool to retrieve a list of New Relic key transactions.
List Location Failure Alert ConditionsTool to retrieve a list of location failure alert conditions for a specific policy.
List Synthetic Monitor LocationsTool to retrieve the list of valid locations for synthetic monitors.
List Lookup TablesTool to list all lookup tables previously uploaded for an account.
List Mobile ApplicationsTool to list all mobile applications in your New Relic account.
List Synthetic MonitorsTool to retrieve a list of all synthetic monitors in your New Relic account.
List NRQL Alert ConditionsTool to retrieve NRQL alert conditions for a specified policy.
List Secure CredentialsTool to retrieve a list of all secure credentials in your New Relic account.
List Synthetics Alert ConditionsTool to retrieve a list of synthetics alert conditions for a policy.
Override Entity Golden MetricsTool to override golden metrics or golden tags for a specific entity type in a New Relic account or workload.
Override Entity Golden TagsTool to override golden tags for entity types via New Relic's NerdGraph GraphQL API.
Patch Synthetic MonitorTool to partially update individual attributes of an existing synthetic monitor in New Relic.
Query Cloud ProvidersTool to query available cloud providers for a New Relic account.
Query ErrorTool to query error data from New Relic using NRQL (New Relic Query Language) via the NerdGraph GraphQL API.
Query Example Read QueryTool to execute GraphQL read queries against New Relic's NerdGraph API.
Remove Entity from Alert ConditionTool to remove an entity from an alert condition in New Relic.
Remove Notification Channels From PolicyTool to remove notification channels from an alert policy via NerdGraph GraphQL API.
Rename Cloud AccountTool to rename linked cloud provider accounts in New Relic via the NerdGraph GraphQL API.
Replace Tags On EntityTool to replace the entire set of tags on a New Relic entity with a new tag set via NerdGraph GraphQL API.
Reset Entity Golden MetricsTool to reset custom golden metrics and golden tags to New Relic defaults for an entity.
Reset Entity Golden TagsTool to reset golden tags for entities to their default values using New Relic's NerdGraph GraphQL API.
Revoke Authorization AccessTool to revoke access grants with a data access policy in New Relic.
Search EntitiesTool to search for New Relic entities by attributes including name, type, domain, and other values using NerdGraph GraphQL API.
Send EventsTool to send custom event data to New Relic's Event API.
Send TracesTool to send distributed tracing data to New Relic in New Relic format.
Test AI Notification Destination By IDTool to test an AI notification destination configuration by ID using New Relic NerdGraph API.
Test AI Notifications ChannelTool to test an AI notifications channel via NerdGraph GraphQL API.
Test AI Notifications DestinationTool to test AI notifications destinations via NerdGraph GraphQL API.
Test Notification ChannelTool to test a New Relic AI notification channel by sending a test notification.
Undelete DashboardTool to undelete a previously deleted dashboard via NerdGraph GraphQL API.
Update AccountTool to update a New Relic account name via the NerdGraph GraphQL API.
Update Agent Application SettingsTool to update APM agent application settings using New Relic's NerdGraph GraphQL API.
Update AI Notification ChannelTool to update an AI notification channel via NerdGraph GraphQL API.
Update AI Notifications DestinationTool to update an AI notifications destination via NerdGraph GraphQL API.
Update Alert Notification ChannelTool to update an existing New Relic alert notification channel.
Update Alert PolicyTool to update an existing alert policy via New Relic's NerdGraph GraphQL API.
Update Alert Policy (REST)Tool to update an existing alert policy via New Relic's REST API v2.
Update API Access KeysTool to update API access keys (ingest/license keys or user keys) via New Relic's NerdGraph GraphQL API.
Update Browser SettingsTool to update browser monitoring settings for a New Relic browser application via NerdGraph GraphQL mutation.
Update Cross-Account ElectionsTool to update cross-account alerting elections via New Relic's NerdGraph GraphQL API.
Update DashboardTool to update an existing New Relic dashboard using its entity GUID via NerdGraph GraphQL API.
Update Dashboard Live URL Creation PoliciesTool to update dashboard live URL creation policies using New Relic's NerdGraph GraphQL API.
Update Dashboard PageTool to update a dashboard page in New Relic via NerdGraph GraphQL API.
Update Dashboard Widgets In PageTool to update widgets in a New Relic dashboard page via NerdGraph GraphQL API.
Update Data Partition RuleTool to update an existing log data partition rule in New Relic via NerdGraph GraphQL API.
Update External Service ConditionTool to update an external service alert condition in New Relic.
Update Infrastructure Alert ConditionTool to update an infrastructure alert condition in New Relic.
Update Location Failure Alert ConditionTool to update a location failure alert condition in New Relic.
Update Lookup TableTool to replace an existing lookup table in your New Relic account.
Update Mobile Settings ExampleTool to update mobile application settings using New Relic's NerdGraph GraphQL API.
Update Monitor ScriptTool to update the script for a SCRIPT_BROWSER or SCRIPT_API synthetic monitor in New Relic.
Update NRQL Baseline Alert ConditionTool to update a NRQL baseline alert condition in New Relic via the NerdGraph GraphQL API.
Update NRQL ConditionTool to update an existing NRQL alert condition in New Relic.
Update NRQL Static Alert ConditionTool to update a NRQL static alert condition via New Relic's NerdGraph GraphQL API.
Update Policy ChannelsTool to associate notification channels with an alert policy using the REST API v2.
Update Scripted MonitorTool to update a scripted synthetic monitor (browser or API) in New Relic using the NerdGraph GraphQL API.
Update Secure CredentialTool to update an existing secure credential in New Relic Synthetics.
Update Service Level IndicatorTool to update a Service Level Indicator (SLI) and its objectives via New Relic's NerdGraph GraphQL API.
Update Synthetics Alert ConditionTool to update an existing synthetics alert condition.
Update Synthetics Simple MonitorTool to update an existing ping monitor configuration in New Relic Synthetics using NerdGraph GraphQL API.
Update Synthetic MonitorTool to fully update an existing synthetic monitor in New Relic using PUT method.
Update UserTool to update user information in New Relic account via NerdGraph GraphQL API.
Update AI WorkflowTool to update an existing New Relic AI workflow via NerdGraph GraphQL API.
Update WorkloadTool to update an existing workload configuration via New Relic's NerdGraph GraphQL API.

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

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 New relic account and project
  • Basic familiarity with async Python/Typescript

Getting API Keys for OpenAI, Composio, and New relic

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 New relic 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 new relic_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=["new_relic"],
    )

    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 New relic actions."
    system_prompt = """
    You are a helpful assistant connected to Composio Tool Router.
    Use the available tools to answer user queries and perform New relic 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, new relic)
  • 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 New relic 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 New relic 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 New relic

Run the agent

npx ts-node llamaindex-agent.ts

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

Complete Code

Here's the complete code to get you started with New relic 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=["new_relic"],
    )

    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 New relic actions."
    system_prompt = """
    You are a helpful assistant connected to Composio Tool Router.
    Use the available tools to answer user queries and perform New relic 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 New relic to LlamaIndex through Composio's Tool Router MCP layer. Key takeaways:
  • Tool Router dynamically exposes New relic 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 New relic MCP Agent with another framework

FAQ

What are the differences in Tool Router MCP and New relic MCP?

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

Can I manage the permissions and scopes for New relic while using Tool Router?

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