# How to integrate Dungeon fighter online MCP with LlamaIndex

```json
{
  "title": "How to integrate Dungeon fighter online MCP with LlamaIndex",
  "toolkit": "Dungeon fighter online",
  "toolkit_slug": "dungeon_fighter_online",
  "framework": "LlamaIndex",
  "framework_slug": "llama-index",
  "url": "https://composio.dev/toolkits/dungeon_fighter_online/framework/llama-index",
  "markdown_url": "https://composio.dev/toolkits/dungeon_fighter_online/framework/llama-index.md",
  "updated_at": "2026-05-12T10:09:59.362Z"
}
```

## Introduction

This guide walks you through connecting Dungeon fighter online to LlamaIndex using the Composio tool router. By the end, you'll have a working Dungeon fighter online agent that can show all servers available this week, find characters named arin on cain server, get latest status info for your character through natural language commands.
This guide will help you understand how to give your LlamaIndex agent real control over a Dungeon fighter online account through Composio's Dungeon fighter online MCP server.
Before we dive in, let's take a quick look at the key ideas and tools involved.

## Also integrate Dungeon fighter online with

- [OpenAI Agents SDK](https://composio.dev/toolkits/dungeon_fighter_online/framework/open-ai-agents-sdk)
- [Claude Agent SDK](https://composio.dev/toolkits/dungeon_fighter_online/framework/claude-agents-sdk)
- [Claude Code](https://composio.dev/toolkits/dungeon_fighter_online/framework/claude-code)
- [Claude Cowork](https://composio.dev/toolkits/dungeon_fighter_online/framework/claude-cowork)
- [Codex](https://composio.dev/toolkits/dungeon_fighter_online/framework/codex)
- [OpenClaw](https://composio.dev/toolkits/dungeon_fighter_online/framework/openclaw)
- [Hermes](https://composio.dev/toolkits/dungeon_fighter_online/framework/hermes-agent)
- [CLI](https://composio.dev/toolkits/dungeon_fighter_online/framework/cli)
- [Google ADK](https://composio.dev/toolkits/dungeon_fighter_online/framework/google-adk)
- [LangChain](https://composio.dev/toolkits/dungeon_fighter_online/framework/langchain)
- [Vercel AI SDK](https://composio.dev/toolkits/dungeon_fighter_online/framework/ai-sdk)
- [Mastra AI](https://composio.dev/toolkits/dungeon_fighter_online/framework/mastra-ai)
- [CrewAI](https://composio.dev/toolkits/dungeon_fighter_online/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 Dungeon fighter online
- Connect LlamaIndex to the Dungeon fighter online MCP server
- Build a Dungeon fighter online-powered agent using LlamaIndex
- Interact with Dungeon fighter online 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 Dungeon fighter online MCP server, and what's possible with it?

The Dungeon fighter online MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Dungeon Fighter Online account. It provides structured and secure access to your character and server data, so your agent can perform actions like searching for characters, retrieving character stats, checking equipment, and exploring timelines on your behalf.
- Character search and discovery: Effortlessly search for characters by name on any available server or fetch detailed character lists.
- Comprehensive character stats retrieval: Instantly pull base information and detailed status, including active buffs and skill information, for any character you own.
- Equipment and avatar inspection: View your character's equipped items and inspect skill buff avatar gear to optimize your loadout.
- Timeline and history tracking: Retrieve and review a character's timeline to see recent game activities and progression milestones.
- Server information lookup: Quickly access the full list of available DFO servers to stay up to date with the game environment.

## Supported Tools

| Tool slug | Name | Description |
|---|---|---|
| `DUNGEON_FIGHTER_ONLINE_CHARACTER_BASE_INFO` | Character Base Information | Retrieves comprehensive base information for a Dungeon & Fighter Online character, including level, job details, fame, adventure/account info, and guild membership. Prerequisites: - Use GET_SERVER_LIST to obtain valid server IDs (e.g., "cain", "siroco") - Use CHARACTER_SEARCH to find character IDs by searching character names Returns character details including level, job/class information, fame points, adventure (account) name, and guild affiliation if applicable. |
| `DUNGEON_FIGHTER_ONLINE_CHARACTER_SEARCH` | Character Search | Search for Dungeon Fighter Online characters by name on a specific server. Returns a list of characters matching the search criteria, including their ID, level, job information, and fame points. Use the Get Server List action first to obtain valid server IDs. Supports both exact matching and partial substring searches. |
| `DUNGEON_FIGHTER_ONLINE_CHARACTER_SKILL_BUFF_AVATAR` | Get Character Skill Buff Avatar | Retrieves detailed information about a character's buff skill and equipped avatars that enhance it. Returns comprehensive data including: - Buff skill details (name, ID, level, description, stat values) - Avatar equipment in buff slots (jacket, pants, etc.) - Avatar properties (rarity, clone info, option abilities) - Emblems attached to each avatar piece Use this to analyze a character's buff skill configuration, avatar setup for skill enhancement, and emblem attachments. Requires valid serverId (from GET_SERVER_LIST) and characterId (from CHARACTER_SEARCH). |
| `DUNGEON_FIGHTER_ONLINE_CHARACTER_SKILL_BUFF_STATUS` | Get Character Skill Buff Status | Tool to fetch character's skill buff status information. Use when you need to know active buff statuses for a specific character. |
| `DUNGEON_FIGHTER_ONLINE_CHARACTER_STATUS_INFO` | Character Status Info | Tool to retrieve status information of a specific character. Use after obtaining serverId and characterId to fetch current stats. |
| `DUNGEON_FIGHTER_ONLINE_CHARACTER_TIMELINE` | Character Timeline | Retrieves the activity timeline for a specific character in Dungeon Fighter Online. Returns a chronological list of timeline events (e.g., equipment changes, level ups, achievements) for the character. Use this tool after obtaining a valid serverId from server list and characterId from character search. Returns an empty timeline if no events are available for the character. |
| `DUNGEON_FIGHTER_ONLINE_GET_CHARACTER_AVATAR` | Get Character Avatar Equipment | Retrieves comprehensive information about a character's equipped avatar items in Dungeon Fighter Online. Returns character details and avatar equipment across all slots (hair, face, hat, neck, jacket, pants, belt, shoes, skin, weapon) including item details, rarities, clone avatars, option abilities, and attached emblems. |
| `DUNGEON_FIGHTER_ONLINE_GET_CHARACTER_BUFF_CREATURE` | Get Character Buff Skill Creature | Retrieves detailed information about a character's buff skill creature equipment. Returns comprehensive data including: - Character information (name, level, job, guild) - Buff skill details (skill name, ID, level, description, stat values) - Creature equipped for the buff skill (item name, ID, rarity) Use this to analyze a character's buff skill creature configuration. Requires valid serverId (from GET_SERVER_LIST) and characterId (from CHARACTER_SEARCH). Note: Buff skill value information is provided based on the latest in-game login and can differ or be unavailable depending on character login circumstances. |
| `DUNGEON_FIGHTER_ONLINE_GET_CHARACTER_CREATURE` | Get Character Creature | Tool to retrieve equipped creature information for a Dungeon & Fighter Online character. Use after obtaining serverId and characterId to fetch creature details. |
| `DUNGEON_FIGHTER_ONLINE_GET_CHARACTER_EQUIPMENT` | Get Character Equipment | Retrieves comprehensive equipment information for a Dungeon & Fighter Online character. Returns detailed data including: - Character base information (level, job, fame, adventure, guild) - All equipped items across 13 equipment slots - Item details (name, type, rarity, level requirements) - Enhancement information (reinforcement, amplification, refinement, enchantments) - Set item bonuses and fusion stone options - Upgrade, tuning, and exalted equipment details Prerequisites: - Use GET_SERVER_LIST to obtain valid server IDs - Use CHARACTER_SEARCH to find character IDs by name |
| `DUNGEON_FIGHTER_ONLINE_GET_CHARACTER_INSIGNIA` | Get Character Equipped Insignia | Retrieves character equipped insignia (flag) information from Dungeon Fighter Online. Returns character details and equipped insignia/flag items including reinforcement skills. |
| `DUNGEON_FIGHTER_ONLINE_GET_CHARACTER_SKILL_BUFF` | Get Character Skill Buff Equipment | Retrieves detailed information about a character's skill buff equipment, including the buff skill details and equipment items that enhance the buff. This action returns: - Character information (name, level, job, guild) - Buff skill information (skill name, level, description) - Equipment items that provide buff bonuses (weapon, armor, accessories, title) Prerequisites: - Valid server ID (use Get Server List action) - Valid character ID (use Character Search action) Note: Buff data is based on the character's latest in-game login. |
| `DUNGEON_FIGHTER_ONLINE_GET_CHARACTER_SKILL_STYLE` | Get Character Skill Style | Tool to retrieve character skill style information. Use when you need to know a character's active skills, passive skills, skill evolutions, and skill enhancements. Note: Skill enhancements through items and equipment are excluded from this response. |
| `DUNGEON_FIGHTER_ONLINE_GET_ITEM_HASHTAGS` | Get Item Hashtags | Tool to retrieve the list of all available item hashtags for searching items. Use when needing to know which hashtag categories are available for item searches. |
| `DUNGEON_FIGHTER_ONLINE_GET_ITEM_INFO` | Get Item Information | Retrieves detailed information for a specific item in Dungeon & Fighter Online. Equipment stats are shown based on Superior 100% grade values. Titles are shown based on average Ordinary grade values. |
| `DUNGEON_FIGHTER_ONLINE_GET_ITEM_SHOP_INFO` | Get Item Shop Info | Tool to retrieve item shop sell information for specific equipment. Use when needing to find which NPCs sell a particular item and at what price. Only supports Lv.95 Epic and Lv.100+ Unique/Legendary/Epic equipment. |
| `DUNGEON_FIGHTER_ONLINE_GET_JOBS` | Get Jobs List | Tool to retrieve the list of all available character classes (jobs) in Dungeon Fighter Online. Use when needing to know which job classes are available in the game. |
| `DUNGEON_FIGHTER_ONLINE_GET_JOB_SKILLS` | Get Job Skills | Tool to retrieve the complete list of skills available for a specific character class and advancement. Use when you need to know what skills are available for a particular job and job growth combination. |
| `DUNGEON_FIGHTER_ONLINE_GET_MULTIPLE_ITEMS` | Get Multiple Items | Tool to retrieve detailed information for multiple items at once. Use when needing to fetch item details for up to 15 items in a single request. Duplicate item IDs will be processed only once. |
| `DUNGEON_FIGHTER_ONLINE_GET_MULTIPLE_SKILLS` | Get Multiple Skills Information | Retrieves information for multiple skills of a character class at once. Up to 10 skills can be queried per request, with duplicate skill IDs automatically removed. Use this action when you need to fetch details for several skills simultaneously rather than making individual requests. The response includes skill names, levels, descriptions, and option values for each requested skill. Note: If invalid skill IDs are provided, they may be omitted from the response rather than causing an error. |
| `DUNGEON_FIGHTER_ONLINE_GET_SERVER_LIST` | Get Server List | Tool to retrieve the list of available game servers. Use when needing to know which servers are available. |
| `DUNGEON_FIGHTER_ONLINE_GET_SKILL_INFO` | Get Skill Information | Tool to retrieve detailed information for a specific skill of a character class. Use when you need to know skill stats, level requirements, MP costs, cooldowns, or level-by-level progression details. |
| `DUNGEON_FIGHTER_ONLINE_SEARCH_CHARACTERS_BY_FAME` | Search Characters By Fame | Tool to search characters by fame ranking. Only returns characters level 110 or above that have logged in within 90 days. Use when you need to find high-ranking characters based on fame points. |
| `DUNGEON_FIGHTER_ONLINE_SEARCH_ITEMS` | Search Items | Search for Dungeon Fighter Online items by name or hashtag. Only returns items currently obtainable in-game. Supports filtering by level range and rarity. Item images available at https://img-api.dfoneople.com/df/items/{itemId}. |
| `DUNGEON_FIGHTER_ONLINE_SEARCH_SET_ITEMS` | Search Set Items | Search for Dungeon Fighter Online set items by name. Returns a list of set items matching the search criteria, including their unique identifiers. Supports exact match, prefix match, and full text search modes. Use URL encoding for non-ASCII characters (automatically handled). |

## Supported Triggers

None listed.

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

The Dungeon fighter online MCP server is an implementation of the Model Context Protocol that connects your AI agent to Dungeon fighter online. It provides structured and secure access so your agent can perform Dungeon fighter online 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 Dungeon fighter online account and project
- Basic familiarity with async Python/Typescript

### 1. Getting API Keys for OpenAI, Composio, and Dungeon fighter online

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 Dungeon fighter online 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, dungeon fighter online)
- 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 Dungeon fighter online 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=["dungeon_fighter_online"],
    )

    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 Dungeon fighter online actions."
    system_prompt = """
    You are a helpful assistant connected to Composio Tool Router.
    Use the available tools to answer user queries and perform Dungeon fighter online 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: ["dungeon_fighter_online"],
    },
  );

  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 Dungeon fighter online 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 Dungeon fighter online
```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 Dungeon fighter online, 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=["dungeon_fighter_online"],
    )

    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 Dungeon fighter online actions."
    system_prompt = """
    You are a helpful assistant connected to Composio Tool Router.
    Use the available tools to answer user queries and perform Dungeon fighter online 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: ["dungeon_fighter_online"],
    },
  );

  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 Dungeon fighter online 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 Dungeon fighter online to LlamaIndex through Composio's Tool Router MCP layer.
Key takeaways:
- Tool Router dynamically exposes Dungeon fighter online 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 Dungeon fighter online MCP Agent with another framework

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

## Related Toolkits

- [Youtube](https://composio.dev/toolkits/youtube) - YouTube is a leading video-sharing platform for uploading, streaming, and discovering content. It empowers creators and businesses to reach global audiences and monetize their work.
- [Amara](https://composio.dev/toolkits/amara) - Amara is a collaborative platform for creating and managing subtitles and captions for videos. It helps make content accessible and multilingual for global audiences.
- [Cats](https://composio.dev/toolkits/cats) - Cats is an API with a huge library of cat images, breed data, and cat facts. It makes finding adorable cat photos and trivia effortless for your apps and users.
- [Chatfai](https://composio.dev/toolkits/chatfai) - Chatfai is an AI platform that lets users talk to AI versions of fictional characters from books, movies, and games. It offers an engaging, interactive experience for fans to chat, roleplay, and explore creative dialogues.
- [Cincopa](https://composio.dev/toolkits/cincopa) - Cincopa is a multimedia platform for uploading, managing, and customizing videos, images, and audio. It helps you deliver engaging media experiences with robust APIs and flexible integrations.
- [Elevenlabs](https://composio.dev/toolkits/elevenlabs) - Elevenlabs is an advanced AI voice generation platform for lifelike, multilingual speech synthesis. Perfect for creating natural voices for videos, apps, and business content in seconds.
- [Elevenreader](https://composio.dev/toolkits/elevenreader) - Elevenreader is an AI-powered text-to-speech service by ElevenLabs that converts written content into lifelike audio. It enables fast, natural audio generation from any text.
- [Epic games](https://composio.dev/toolkits/epic_games) - Epic Games is a leading video game publisher and digital storefront, known for Fortnite and Unreal Engine. It lets gamers access, manage, and purchase games all in one place.
- [Fal.ai](https://composio.dev/toolkits/fal_ai) - Fal.ai is a generative media platform offering 600+ AI models for images, video, voice, and audio. Developers use Fal.ai for fast, scalable access to cutting-edge generative AI tools.
- [Giphy](https://composio.dev/toolkits/giphy) - Giphy is the largest online library for searching and sharing GIFs and stickers. Instantly add vibrant animated content to your apps, chats, and workflows.
- [Headout](https://composio.dev/toolkits/headout) - Headout is a global platform for booking travel experiences, tours, and entertainment. It helps users discover and secure activities at top destinations, all in one place.
- [Imagekit io](https://composio.dev/toolkits/imagekit_io) - ImageKit.io is a cloud-based media management platform for image and video delivery. Instantly optimize, transform, and deliver visuals globally via a lightning-fast CDN.
- [Listennotes](https://composio.dev/toolkits/listennotes) - Listennotes is a powerful podcast search engine with a massive global database. Discover, search, and curate podcasts from around the world in seconds.
- [News api](https://composio.dev/toolkits/news_api) - News api is a REST API for searching and retrieving live news articles from across the web. Instantly access headlines, coverage, and breaking stories from thousands of sources.
- [RAWG Video Games Database](https://composio.dev/toolkits/rawg_video_games_database) - RAWG Video Games Database is the largest video game discovery and info service. Instantly access comprehensive details, ratings, and release dates for thousands of games.
- [Seat geek](https://composio.dev/toolkits/seat_geek) - SeatGeek is a live event platform offering APIs for concerts, sports, and theater data. Instantly access events, venues, and performers info for smarter ticketing and discovery.
- [Shotstack](https://composio.dev/toolkits/shotstack) - Shotstack is a cloud platform for programmatically generating videos, images, and audio. Automate creative content production at scale with flexible RESTful APIs.
- [Spotify](https://composio.dev/toolkits/spotify) - Spotify is a streaming service for music and podcasts with millions of tracks from artists worldwide. Enjoy personalized playlists, recommendations, and seamless listening across all your devices.
- [Ticketmaster](https://composio.dev/toolkits/ticketmaster) - Ticketmaster is a global platform for event discovery, ticket sales, and live entertainment management. Get real-time access to events and streamline ticketing for fans and organizers.
- [Gmail](https://composio.dev/toolkits/gmail) - Gmail is Google's email service with powerful spam protection, search, and G Suite integration. It keeps your inbox organized and makes communication fast and reliable.

## Frequently Asked Questions

### What are the differences in Tool Router MCP and Dungeon fighter online MCP?

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

### Can I manage the permissions and scopes for Dungeon fighter online while using Tool Router?

Yes, absolutely. You can configure which Dungeon fighter online 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 Dungeon fighter online data and credentials are handled as safely as possible.

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