How to integrate Bitbucket MCP with LlamaIndex

This guide walks you through connecting Bitbucket to LlamaIndex using the Composio tool router. By the end, you'll have a working Bitbucket agent that can create a new branch off main, open a pull request for your feature, comment on the latest open issue through natural language commands. This guide will help you understand how to give your LlamaIndex agent real control over a Bitbucket account through Composio's Bitbucket MCP server. Before we dive in, let's take a quick look at the key ideas and tools involved.

Bitbucket logoBitbucket
Oauth2

Bitbucket is a Git-based code hosting and collaboration platform for teams. It enables secure repository management and streamlined code reviews.

105 Tools

Introduction

This guide walks you through connecting Bitbucket to LlamaIndex using the Composio tool router. By the end, you'll have a working Bitbucket agent that can create a new branch off main, open a pull request for your feature, comment on the latest open issue through natural language commands.

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

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

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

The Bitbucket MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Bitbucket account. It provides structured and secure access to your repositories, issues, and pull requests, so your agent can create branches, manage issues, review code, and handle repository operations for you.

  • Branch and repository management: Let your agent create new branches for feature work or initialize fresh repositories within your Bitbucket workspace—no manual setup required.
  • Automated issue tracking: Have your agent create, comment on, or delete issues to streamline team collaboration and bug tracking directly from your workflows.
  • Pull request automation: Empower your agent to open new pull requests for code review, ensuring changes are properly tracked and integrated.
  • File and snippet operations: Ask your agent to fetch specific files from any branch or commit, or to post comments on code snippets for contextual discussions.
  • User profile and workspace insights: Retrieve your Bitbucket user profile details on demand, making it easy to personalize and audit agent-driven actions.

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

Getting API Keys for OpenAI, Composio, and Bitbucket

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

  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 Bitbucket 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, bitbucket)
  • 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 Bitbucket 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 Bitbucket
  • 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 Bitbucket 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 Bitbucket
10

Run the agent

npx ts-node llamaindex-agent.ts

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

Complete Code

Here's the complete code to get you started with Bitbucket 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: ["bitbucket"],
    },
  );

  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 Bitbucket 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 Bitbucket to LlamaIndex through Composio's Tool Router MCP layer. Key takeaways:
  • Tool Router dynamically exposes Bitbucket 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 Bitbucket action and event your agent gets out of the box.

Approve Pull Request

Tool to approve a pull request as the authenticated user.

Browse repository path

Tool to retrieve content for a file path or browse directory contents at a specified revision in a Bitbucket repository.

Create a branch

Creates a new branch in a Bitbucket repository from a target commit hash; the branch name must be unique, adhere to Bitbucket's naming conventions, and not include the 'refs/heads/' prefix.

Create an issue

Creates a new issue in a Bitbucket repository, setting the authenticated user as reporter; ensures assignee (if provided) has repository access, and that any specified milestone, version, or component IDs exist.

Create an issue comment

Adds a new comment with markdown support to an existing Bitbucket issue.

Create a pull request

Creates a new pull request in a specified Bitbucket repository, ensuring the source branch exists and is distinct from the (optional) destination branch.

Create pull request comment

Creates a new comment on a Bitbucket pull request.

Create commit report annotations

Adds multiple annotations to a commit report in bulk.

List commits from revision (POST)

Tool to list commits from a revision using POST method.

Create repository

Creates a new Bitbucket 'git' repository in a specified workspace, defaulting to the workspace's oldest project if `project_key` is not provided.

Create snippet comment

Posts a new top-level comment or a threaded reply to an existing comment on a specified Bitbucket snippet.

Create team pipeline variable

Creates a team-level pipeline configuration variable in Bitbucket.

Create user pipeline variable

Creates a user-level pipeline variable for Bitbucket pipelines.

Delete commit comment

Permanently deletes a specific comment on a commit.

Delete issue

Permanently deletes a specific issue, identified by its `issue_id`, from the repository specified by `repo_slug` within the given `workspace`.

Delete pull request comment

Permanently deletes a specific pull request comment (top-level, inline, or threaded reply).

Delete commit report annotation

Deletes a single annotation matching the provided ID from a commit report.

Delete repository

Permanently deletes a specified Bitbucket repository; this action is irreversible and does not affect forks.

Delete snippet watch

Stops watching a specific snippet.

Delete user pipeline variable

Permanently deletes a user-level pipeline configuration variable identified by its UUID.

Get branch

Retrieves detailed information about a specific branch in a Bitbucket repository.

Get Commit Build Status

Get a specific build status for a commit in Bitbucket.

Get Commit Changes

Tool to retrieve a page of changes made in a specified commit, showing all changed files with their change statistics (lines added/removed, status).

Get commit comment

Retrieves a specific comment from a commit by its ID.

Get Commit Diff

Tool to retrieve the unified diff between two provided revisions or for a single commit in a Bitbucket repository.

Get current user (v2)

Tool to retrieve complete profile information for the currently authenticated Bitbucket user.

Get deployment environment variables

Retrieves deployment environment level variables for a specific Bitbucket repository environment.

Get file from repository

Retrieves a specific file's content from a Bitbucket repository at a given commit (hash, branch, or tag), failing if the file path is invalid for that commit.

Get hook events

Retrieves a paginated list of all valid webhook events for a specified entity type (repository or workspace).

Get OpenID configuration for OIDC in Pipelines

Retrieves the OpenID Connect discovery configuration for Bitbucket Pipelines OIDC.

Get Pull Request

Get a single pull request by ID with complete details.

Get pull request comment

Tool to retrieve a specific comment from a pull request by its ID.

Get Pull Request Commits

Tool to retrieve commits for a specified pull request.

Get Pull Request Diff

Tool to fetch the unified diff for a Bitbucket pull request (follows 302 redirect to repository diff).

Get Pull Request Diffstat

Tool to get the diffstat for a Bitbucket pull request, showing all changed files with their change statistics (lines added/removed, status).

Get Repository Branching Model

Return the branching model as applied to the repository.

Get Repository Commit

Tool to retrieve detailed information about a specific commit in a Bitbucket repository.

Get commit comments

Retrieves all comments on a specific commit in a Bitbucket repository.

Get commit report

Returns a single report matching the provided ID from a commit.

Get Commit Reports

Tool to get reports linked to a specific commit.

Get commit report annotation

Returns a single annotation matching the provided ID from a commit report.

Get commit statuses

Returns all build statuses (e.

Get effective branching model

Retrieves the effective branching model for a Bitbucket repository, showing which branching model is currently applied (including any inheritance from project-level settings).

Get Repository Environment

Retrieve detailed information about a specific deployment environment in a Bitbucket repository.

Get file commit history

Returns a paginated list of commits that modified the specified file.

Check if user voted for issue

Tool to check whether the authenticated user has voted for a specific issue in a Bitbucket repository.

Get Repositories Merge Base

Get the merge base (best common ancestor) between two commits in a Bitbucket repository.

Get specific pipeline

Retrieve a specified pipeline from a Bitbucket repository.

Get repository pipelines caches

Retrieves the repository pipelines caches.

Get repository pipeline runners

Retrieves the list of self-hosted runners configured for a repository's pipelines.

Get repository pipeline schedules

Retrieves configured pipeline schedules for a Bitbucket repository.

Get repository SSH known hosts

Retrieves repository-level SSH known hosts configured for Bitbucket Pipelines.

Get repository pipeline variables

Retrieves repository-level pipeline variables for a specific Bitbucket repository.

Get pipeline steps

Retrieves all steps for a given pipeline.

Get pull requests activity log

Get paginated activity log for all pull requests in a repository.

Get pull request comments

Retrieves a paginated list of comments on a specific pull request in a Bitbucket repository.

Get pull request statuses

Returns all build statuses (e.

Get repository refs

Returns the branches and tags in the repository.

Get tag

Retrieves detailed information about a specific tag in a Bitbucket repository.

Get repositories src

Lists the contents of the root directory on the repository's main branch without needing to specify a commit or branch.

Get repository watchers

Retrieves a paginated list of all the watchers on the specified repository.

Get repository

Retrieves detailed information about a specific repository in a Bitbucket workspace.

Get Repository Patch

Tool to retrieve the git patch content for a Bitbucket repository at a specified revision or commit range.

Get snippet

Retrieves a specific Bitbucket snippet by its encoded ID from an existing workspace, returning its metadata and file structure.

Get snippet watch status

Checks if the current user is watching a specific snippet.

Get SSH keys for user

Retrieves a paginated list of SSH keys for a specified Bitbucket user.

Get user

Retrieves public profile information for a specific Bitbucket user by username or UUID.

Get user emails

Returns all the authenticated user's email addresses, both confirmed and unconfirmed.

Get user email details

Retrieves details about a specific email address for the authenticated user.

Get user permissions for repositories

Returns an object for each repository the caller has explicit access to, including their permission level.

Get user permissions for workspaces

Retrieves workspace memberships and permission levels for the authenticated user.

Get user workspaces

Tool to retrieve all workspaces accessible to the authenticated user.

Get workspace

Retrieves detailed information about a specific Bitbucket workspace.

Get Workspace Pull Requests by User

Tool to get all workspace pull requests authored by a specified user.

Search code in workspace

Tool to search for code in the repositories of the specified workspace.

List branches

Lists branches in a Bitbucket repository with optional server-side filtering by name pattern (BBQL) and sorting.

List commits

Tool to retrieve a page of commits from a Bitbucket repository.

List commits from revision

Tool to list commits starting from a specific revision in a Bitbucket repository.

List commits on master

Lists commits on the master branch of a Bitbucket repository.

List deployments

Lists deployments for a specified Bitbucket repository.

List issues in a repository

Lists issues in a Bitbucket repository with optional filtering by state, priority, kind, or assignee.

List pipelines

Tool to find pipelines in a Bitbucket repository.

List pull requests

Lists pull requests in a specified, accessible Bitbucket repository, optionally filtering by state (OPEN, MERGED, DECLINED).

List pull request tasks

Lists all tasks associated with a pull request in a Bitbucket repository.

List all public repositories

Retrieves a paginated list of all public repositories on Bitbucket.

List repository environments

List all deployment environments configured for a Bitbucket repository.

List repositories in workspace

Lists repositories in a specified Bitbucket workspace, accessible to the authenticated user, with options to filter by role or query string, and sort results.

List repository paths

Lists file and directory entries under a repository path at a given revision, with optional breadth-first recursion via max_depth for repository traversal and scanning.

List snippets

Returns all snippets accessible to the authenticated user.

List tags

Lists tags in a Bitbucket repository with optional server-side filtering by name pattern or commit hash (BBQL) and sorting.

List versions

Lists versions (milestones) in a Bitbucket repository's issue tracker.

List workspace members

Lists all members of a specified Bitbucket workspace; the workspace must exist.

List workspace projects

Lists projects in a specified Bitbucket workspace.

List workspaces

Lists Bitbucket workspaces accessible to the authenticated user, optionally filtered and sorted.

Merge Pull Request

Tool to merge a Bitbucket Cloud pull request via the REST API.

Request Pull Request Changes

Tool to request changes on a pull request as the authenticated user.

Resolve pull request comment

Tool to resolve or reopen a pull request comment thread.

Search code in user repositories

Tool to search for code in the repositories of a specified user.

Update commit insight report

Create or update an insight report for a commit.

Update an issue

Updates an existing issue in a Bitbucket repository by modifying specified attributes; requires `workspace`, `repo_slug`, `issue_id`, and at least one attribute to update.

Update Pull Request

Tool to update an existing pull request's editable fields (e.

Update commit comment

Updates the contents of a comment on a commit.

Update commit report annotation

Creates or updates an individual annotation for a commit report.

Update team pipeline variable

Updates a team-level pipeline configuration variable in Bitbucket.

Update user pipeline variable

Updates a user-level pipeline variable for Bitbucket pipelines.

FAQ

Frequently asked questions

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

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

Start with Bitbucket.It takes 30 seconds.

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

Start building