# How to integrate Dropbox sign MCP with LangChain

```json
{
  "title": "How to integrate Dropbox sign MCP with LangChain",
  "toolkit": "Dropbox sign",
  "toolkit_slug": "dropbox_sign",
  "framework": "LangChain",
  "framework_slug": "langchain",
  "url": "https://composio.dev/toolkits/dropbox_sign/framework/langchain",
  "markdown_url": "https://composio.dev/toolkits/dropbox_sign/framework/langchain.md",
  "updated_at": "2026-05-12T10:09:55.194Z"
}
```

## Introduction

This guide walks you through connecting Dropbox sign to LangChain using the Composio tool router. By the end, you'll have a working Dropbox sign agent that can send nda for signature to new hire, get status of recent signature requests, download signed contract from last week through natural language commands.
This guide will help you understand how to give your LangChain agent real control over a Dropbox sign account through Composio's Dropbox sign MCP server.
Before we dive in, let's take a quick look at the key ideas and tools involved.

## Also integrate Dropbox sign with

- [ChatGPT](https://composio.dev/toolkits/dropbox_sign/framework/chatgpt)
- [OpenAI Agents SDK](https://composio.dev/toolkits/dropbox_sign/framework/open-ai-agents-sdk)
- [Claude Agent SDK](https://composio.dev/toolkits/dropbox_sign/framework/claude-agents-sdk)
- [Claude Code](https://composio.dev/toolkits/dropbox_sign/framework/claude-code)
- [Claude Cowork](https://composio.dev/toolkits/dropbox_sign/framework/claude-cowork)
- [Codex](https://composio.dev/toolkits/dropbox_sign/framework/codex)
- [Cursor](https://composio.dev/toolkits/dropbox_sign/framework/cursor)
- [VS Code](https://composio.dev/toolkits/dropbox_sign/framework/vscode)
- [OpenCode](https://composio.dev/toolkits/dropbox_sign/framework/opencode)
- [OpenClaw](https://composio.dev/toolkits/dropbox_sign/framework/openclaw)
- [Hermes](https://composio.dev/toolkits/dropbox_sign/framework/hermes-agent)
- [CLI](https://composio.dev/toolkits/dropbox_sign/framework/cli)
- [Google ADK](https://composio.dev/toolkits/dropbox_sign/framework/google-adk)
- [Vercel AI SDK](https://composio.dev/toolkits/dropbox_sign/framework/ai-sdk)
- [Mastra AI](https://composio.dev/toolkits/dropbox_sign/framework/mastra-ai)
- [LlamaIndex](https://composio.dev/toolkits/dropbox_sign/framework/llama-index)
- [CrewAI](https://composio.dev/toolkits/dropbox_sign/framework/crew-ai)

## TL;DR

Here's what you'll learn:
- Get and set up your OpenAI and Composio API keys
- Connect your Dropbox sign project to Composio
- Create a Tool Router MCP session for Dropbox sign
- Initialize an MCP client and retrieve Dropbox sign tools
- Build a LangChain agent that can interact with Dropbox sign
- Set up an interactive chat interface for testing

## What is LangChain?

LangChain is a framework for developing applications powered by language models. It provides tools and abstractions for building agents that can reason, use tools, and maintain conversation context.
Key features include:
- Agent Framework: Build agents that can use tools and make decisions
- MCP Integration: Connect to external services through Model Context Protocol adapters
- Memory Management: Maintain conversation history across interactions
- Multi-Provider Support: Works with OpenAI, Anthropic, and other LLM providers

## What is the Dropbox sign MCP server, and what's possible with it?

The Dropbox sign MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Dropbox Sign account. It provides structured and secure access to your e-signature workflows, so your agent can prepare signature requests, manage documents, track signing progress, and automate agreement workflows on your behalf.
- Automated signature requests: Have your agent create, send, and manage legally binding signature requests to one or multiple recipients, streamlining document approval processes.
- Template-based document preparation: Let your agent generate documents from templates, pre-fill fields, and quickly send out repeat agreements without manual editing.
- Status tracking and reminders: Ask your agent to monitor the progress of signature requests, check who has signed, and send automated reminders to outstanding signers as needed.
- Secure document storage and retrieval: Effortlessly fetch completed, pending, or archived documents, download signed agreements, and keep your workflow organized and compliant.
- Audit trails and activity logs: Access detailed audit trails and event histories for every document, so you can maintain compliance and always know who did what, and when.

## Supported Tools

| Tool slug | Name | Description |
|---|---|---|
| `DROPBOX_SIGN_ADD_USER_TO_TEAM` | Invite User to Team | Tool to invite a user to your Team. Use when you need to add a member by email or account ID. |
| `DROPBOX_SIGN_ADD_USER_TO_TEMPLATE` | Add User to Template | Tool to grant a specified account access to a template. Use when you need to share a template with another user after confirming template and account identifiers. |
| `DROPBOX_SIGN_BULK_CREATE_EMBEDDED_SIG_REQ_WITH_TEMPLATE` | Bulk create embedded signature request with template | Tool to create a BulkSendJob for embedded templated signature requests. Use when you need to send up to 250 embedded signature requests at once via one or more templates for iFrame signing. |
| `DROPBOX_SIGN_BULK_SEND_WITH_TEMPLATE` | Bulk send with template | Tool to create a BulkSendJob for templated signature requests. Use when you need to send up to 250 signature requests at once via one or more templates. |
| `DROPBOX_SIGN_CANCEL_SIGNATURE_REQUEST` | Cancel Signature Request | Cancels an incomplete signature request. Use when you need to cancel a pending signature request that has not been completed. The operation is asynchronous and not reversible - once canceled, the signature request cannot be restored. |
| `DROPBOX_SIGN_CREATE_ACCOUNT` | Create Dropbox Sign Account | Tool to create a new Dropbox Sign account associated with a specified email address. Use when you need to programmatically register new users in the Dropbox Sign platform. |
| `DROPBOX_SIGN_CREATE_API_APP` | Create API App | Tool to create a new Dropbox Sign API App. Use when you need to register a new application for API integration. The app will have a client_id for authentication and can be configured with OAuth, callbacks, and white labeling. |
| `DROPBOX_SIGN_CREATE_EMBEDDED_SIGNATURE_REQUEST` | Create Embedded Signature Request | Tool to create an embedded signature request for signing in an iFrame. Use when you need to initiate a signature request that will be signed within your application rather than via email links. |
| `DROPBOX_SIGN_CREATE_EMBEDDED_SIGNATURE_REQUEST_WITH_TEMPLATE` | Create Embedded Signature Request With Template | Tool to create an embedded signature request based on a template. Use when you need to initiate a new signature request for embedded signing using pre-defined templates. Returns signature request details including signing URLs for embedded iFrame integration. |
| `DROPBOX_SIGN_CREATE_EMBEDDED_TEMPLATE_DRAFT` | Create Embedded Template Draft | Tool to create an embedded template draft. Use when initiating an embedded template workflow where users can edit the template in an iframe before finalizing it. |
| `DROPBOX_SIGN_CREATE_EMBEDDED_UNCLAIMED_DRAFT_WITH_TEMPLATE` | Create Embedded Unclaimed Draft with Template | Tool to create an embedded unclaimed draft using saved templates. Use when you need to create a draft that can be claimed and embedded in an iFrame for signature collection. |
| `DROPBOX_SIGN_CREATE_REPORT` | Create Report | Request creation of CSV report(s) for a specified date range. Reports are generated asynchronously and delivered via email. Available report types: user_activity (account activity), document_status (signature request status), sms_activity (SMS delivery info). You can request up to 2 report types per call. Date range can be up to 12 months, with start_date no more than 10 years in the past. Note: This feature may require a paid plan. |
| `DROPBOX_SIGN_CREATE_TEMPLATE` | Create Template | Tool to create a reusable template for document signing workflows. Use when you need to establish a template with pre-defined form fields, signer roles, and documents. |
| `DROPBOX_SIGN_CREATE_UNCLAIMED_DRAFT` | Create Unclaimed Draft | Tool to create an unclaimed draft that can be claimed via a unique URL. Use when you need to prepare a signature request or document send that will be finalized later by someone else through the claim URL. |
| `DROPBOX_SIGN_DELETE_API_APP` | Delete API App | Tool to delete an API App from your Dropbox Sign account by its client_id. Use when you need to remove an API App that is no longer needed. The API App must be owned by the requesting user. |
| `DROPBOX_SIGN_DELETE_FAX` | Delete Fax | Tool to delete a fax from the system by its fax_id. Use when you need to remove a fax from Dropbox Sign. Returns success if the fax is deleted or doesn't exist. |
| `DROPBOX_SIGN_DELETE_TEMPLATE` | Delete Template | Permanently deletes a template from your Dropbox Sign account by its template_id. Once deleted, the template cannot be recovered. Use this when you need to remove outdated or unused templates. Returns success if template is deleted or doesn't exist. |
| `DROPBOX_SIGN_DOWNLOAD_SIGNATURE_REQUEST_FILES` | Download Signature Request Files | Download files for a signature request as PDF (merged) or ZIP (individual documents). Returns immediately if files are ready, or indicates if files are still being prepared (409 status). |
| `DROPBOX_SIGN_EDIT_AND_RESEND_EMBEDDED_SIGNATURE_REQUEST` | Edit and Resend Embedded Signature Request | Tool to edit and resend an embedded signature request. Use when you need to modify and restart the embedded signing flow for an existing request. |
| `DROPBOX_SIGN_EDIT_AND_RESEND_SIGNATURE_REQUEST` | Edit and Resend Signature Request | Edits and resends an existing non-templated signature request with updated documents, signers, or settings. Use this tool when you need to modify an already-created signature request and resend it to signers. Note: This will reset signatures - anyone who already signed will need to sign again. Important: Edit and resend operations deduct from your signature request quota. Required: You must provide either 'files' or 'file_urls' (not both) and either 'signers' or 'grouped_signers' (not both). |
| `DROPBOX_SIGN_EDIT_AND_RESEND_UNCLAIMED_DRAFT` | Edit and Resend Unclaimed Draft | Tool to edit and resend a previously created unclaimed draft. Use when you have an existing signature_request_id and want to modify the draft before reissuing. |
| `DROPBOX_SIGN_EDIT_RESEND_EMBEDDED_SIGNATURE_REQUEST_TEMPLATE` | Edit and Resend Embedded Signature Request With Template | Tool to edit and resend an embedded signature request using templates. Use when you need to update request details or recipients and resend within an embedded signing flow. |
| `DROPBOX_SIGN_GET_ACCOUNT` | Get Dropbox Sign Account | Retrieves detailed information about a Dropbox Sign account including quotas, payment status, and settings. Use this tool to: - Check account quota limits (API requests, documents, templates remaining) - Verify account payment status (paid vs free tier) - Get account settings (SMS delivery, authentication options) - Retrieve account identifiers and contact information Requires either account_id (40-character identifier) or email_address, but not both. |
| `DROPBOX_SIGN_GET_API_APP` | Get API App | Tool to retrieve information about an API App by its client ID. Use when you need to fetch API App configuration, OAuth settings, white labeling options, or owner details. |
| `DROPBOX_SIGN_GET_BULK_SEND_JOB` | Get Bulk Send Job | Tool to retrieve the status of a bulk send job. Use when you need up-to-date job progress and request details. |
| `DROPBOX_SIGN_GET_CURRENT_TEAM` | Get Current Team Membership | Tool to get the current team membership status and details. Use when you need to check if the authenticated user is part of a team and retrieve team information. Returns is_on_team False if user is not part of any team (no retries needed for this case). |
| `DROPBOX_SIGN_GET_EMBEDDED_SIGN_URL` | Get Embedded Sign URL | Retrieves an embedded signing URL for a specific signer's signature. Use this after creating an embedded signature request to get a temporary URL that can be embedded in an iFrame for the signer to complete signing. The URL expires after 60 minutes or upon first access, but you can generate a new URL anytime using the same signature_id. Note: Requires the signature_id (per signer), not the signature_request_id. |
| `DROPBOX_SIGN_GET_EMBEDDED_TEMPLATE_EDIT_URL` | Get Embedded Template Edit URL | Tool to generate an edit URL for embedded template editing. Use after selecting or uploading a template to allow users to modify it in an iframe. |
| `DROPBOX_SIGN_GET_FAX_LINE_AREA_CODES` | Get Available Fax Line Area Codes | Tool to retrieve available fax line area codes for a given country, state/province, and city. Use when you need to determine which area codes are available for purchasing or provisioning a fax line in a specific location. |
| `DROPBOX_SIGN_GET_SIGNATURE_REQUEST` | Get Signature Request | Retrieves the current status and complete details of a signature request by ID. Use this action to: - Check if signers have viewed, signed, or declined the request - Get signer information and signature timestamps - Access form field responses and custom field values - Retrieve URLs for document downloads and management - Monitor signature request progress and completion status Returns detailed information including signer names, emails, signing status, custom fields, response data, attachments, and signing options. Handles errors gracefully with structured error responses for invalid or non-existent signature request IDs. |
| `DROPBOX_SIGN_GET_SIGNATURE_REQUEST_FILES_AS_DATA_URI` | Get Signature Request Files as Data URI | Tool to download signature request files as a base64-encoded data URI. Use when you need the document content as a data URI string for embedding or transmission. Returns immediately if files are ready (status 200), or indicates if files are still being prepared (status 409). |
| `DROPBOX_SIGN_GET_SIGNATURE_REQUEST_FILES_AS_FILE_URL` | Get Signature Request Files as File URL | Retrieves a copy of the current documents and returns a JSON object with a URL to the file (PDFs only). Use this action when you need a temporary download link for signature request documents instead of downloading the files directly. The returned URL will expire after a certain time period indicated by the expires_at field. |
| `DROPBOX_SIGN_GET_TEAM_INFO` | Get Team Info | Retrieves information about a Dropbox Sign team, including team name, member count, and sub-team count. Use when you need to get team details. If team_id is provided, retrieves info for that specific team; otherwise retrieves info for the authenticated user's team. |
| `DROPBOX_SIGN_GET_TEMPLATE` | Get Template | Tool to return the specified template. Use when you need to fetch full template details by ID. |
| `DROPBOX_SIGN_GET_TEMPLATE_FILES` | Download Template Files | Tool to download documents associated with a template. Use after confirming the template is created; returns a PDF or ZIP archive of the documents. |
| `DROPBOX_SIGN_GET_TEMPLATE_FILES_AS_DATA_URI` | Get Template Files as Data URI | Tool to retrieve template documents as base64-encoded data URI. Use when you need template files in data URI format instead of downloading binary files. |
| `DROPBOX_SIGN_GET_TEMPLATE_FILES_AS_FILE_URL` | Get Template Files as File URL | Tool to retrieve a copy of template documents and return a JSON object with a URL to the file (PDFs only). Use this action when you need a temporary download link for template documents instead of downloading the files directly. |
| `DROPBOX_SIGN_LIST_API_APPS` | List API Apps | Tool to list API Apps. Use when you need to retrieve a paginated list of API Apps accessible to your account. |
| `DROPBOX_SIGN_LIST_BULK_SEND_JOBS` | List Bulk Send Jobs | Tool to list bulk send jobs. Use when you need to retrieve all bulk send job summaries the authenticated user can access. Supports pagination via page and page_size. |
| `DROPBOX_SIGN_LIST_FAXES` | List Faxes | Tool to list faxes and their properties. Use when you need to retrieve paginated faxes with information about transmissions and status. |
| `DROPBOX_SIGN_LIST_FAX_LINES` | List Fax Lines | Tool to list fax lines and their properties. Use when you need to retrieve available fax lines for an account, optionally paging or including team lines. |
| `DROPBOX_SIGN_LIST_SIGNATURE_REQUESTS` | List Signature Requests | Tool to list signature requests. Use when you need to retrieve paginated signature requests with optional filters. |
| `DROPBOX_SIGN_LIST_SUB_TEAMS` | List Sub-Teams | Lists all sub-teams belonging to a parent team with pagination support. Returns team identifiers and names for each sub-team. Use this to discover the organizational structure of teams within Dropbox Sign. Requires a valid team_id from the parent team. Returns empty list if the team has no sub-teams or if team features are not available for the account. |
| `DROPBOX_SIGN_LIST_TEAM_MEMBERS` | List Team Members | Lists all members and their roles for a specific team. Returns a paginated list of team members with their account IDs, email addresses, and roles. Requires team_id which can be obtained from LIST_TEAMS or GET_TEAM_INFO actions. Supports pagination for teams with many members. |
| `DROPBOX_SIGN_LIST_TEAMS` | List All Teams | Lists all Dropbox Sign teams accessible to the authenticated user, including the current team and its sub-teams. Returns team IDs and names which can be used with other team-related actions. Returns an empty list if the account doesn't have team features enabled. |
| `DROPBOX_SIGN_LIST_TEMPLATES` | List Templates | Tool to list templates. Use when you need to retrieve a paginated list of templates accessible to your account. |
| `DROPBOX_SIGN_O_AUTH_AUTHORIZE` | Generate OAuth Authorization URL | Tool to generate an OAuth authorization URL. Use before directing the user to grant access. |
| `DROPBOX_SIGN_RELEASE_SIGNATURE_REQUEST_HOLD` | Release Signature Request Hold | Release a held signature request to send it to signers. Use this when a signature request was created from an unclaimed draft with hold_request=true and has been claimed but not yet sent. After releasing, the request will be sent to all designated signers. |
| `DROPBOX_SIGN_REMOVE_USER_FROM_TEMPLATE` | Remove User from Template | Tool to remove an account's access to a template. Use when you need to revoke a user's permission on a template after confirming template ID and target account. |
| `DROPBOX_SIGN_SEND_SIGNATURE_REQUEST` | Send Signature Request | Tool to create and send a new signature request with documents. Use when you need to send documents for electronic signature. The action sends emails to all specified signers with links to view and sign the documents. Supports multiple signers, CC recipients, custom fields, form fields, and various signing options. Documents can be uploaded directly or provided via publicly accessible URLs. |
| `DROPBOX_SIGN_SEND_SIGNATURE_REQUEST_REMINDER` | Send Request Reminder | Sends an email reminder to a signer about a pending signature request. Use this when a signer needs a reminder to complete their signature. Important constraints: - Cannot send a reminder within 1 hour of the last reminder (automatic or manual) - Cannot be used with embedded signature requests - The signature request must exist and not be completed - The email address must match a signer on the request |
| `DROPBOX_SIGN_UPDATE_ACCOUNT` | Update Dropbox Sign Account | Tool to update Dropbox Sign account properties and settings. Use when you need to modify callback URLs or locale settings for an account. |
| `DROPBOX_SIGN_UPDATE_API_APP` | Update API App | Tool to update an existing API App in Dropbox Sign. Use when you need to modify API App settings such as name, callback URL, domains, OAuth configuration, branding options, or custom logo. |
| `DROPBOX_SIGN_UPDATE_SIGNATURE_REQUEST` | Update Signature Request | Updates the email address and/or name for a specific signer on a signature request. Use this when you need to correct or update signer contact information before they complete signing. Important: This endpoint only works for signature requests created with explicit form_fields_per_document (no appended signature page). At least one of email_address or name must be provided. |
| `DROPBOX_SIGN_UPDATE_TEMPLATE_FILES` | Update Template Files | Tool to update files for an existing template. Overlays new files with the overlay of an existing template. Use when you need to replace the documents in a template while keeping the field configuration. The update is processed asynchronously; completion is communicated via callback events (template_created or template_error). |
| `DROPBOX_SIGN_VERIFY_ACCOUNT` | Verify Dropbox Sign Account | Tool to verify whether a Dropbox Sign account exists for the given email. Use when you need to check account existence before sending signature requests. |

## Supported Triggers

None listed.

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

The Dropbox sign MCP server is an implementation of the Model Context Protocol that connects your AI agent to Dropbox sign. It provides structured and secure access so your agent can perform Dropbox sign 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

No description provided.

### 1. Getting API Keys for OpenAI and Composio

OpenAI API Key
- Go to the [OpenAI dashboard](https://platform.openai.com/settings/organization/api-keys) and create an API key. You'll need credits to use the models, or you can connect to another model provider.
- Keep the API key safe.
Composio API Key
- Log in to the [Composio dashboard](https://dashboard.composio.dev?utm_source=toolkits&utm_medium=framework_docs).
- Navigate to your API settings and generate a new API key.
- Store this key securely as you'll need it for authentication.

### 2. Install dependencies

No description provided.
```python
pip install composio-langchain langchain-mcp-adapters langchain python-dotenv
```

```typescript
npm install @composio/langchain @langchain/core @langchain/openai @langchain/mcp-adapters dotenv
```

### 3. Set up environment variables

Create a .env file in your project root.
What's happening:
- COMPOSIO_API_KEY authenticates your requests to Composio's API
- COMPOSIO_USER_ID identifies the user for session management
- OPENAI_API_KEY enables access to OpenAI's language models
```bash
COMPOSIO_API_KEY=your_composio_api_key_here
COMPOSIO_USER_ID=your_composio_user_id_here
OPENAI_API_KEY=your_openai_api_key_here
```

### 4. Import dependencies

No description provided.
```python
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
from dotenv import load_dotenv
from composio import Composio
import asyncio
import os

load_dotenv()
```

```typescript
import { Composio } from '@composio/core';
import { LangchainProvider } from '@composio/langchain';
import { MultiServerMCPClient } from "@langchain/mcp-adapters";
import { createAgent } from "langchain";
import * as readline from 'readline';
import 'dotenv/config';

dotenv.config();
```

### 5. Initialize Composio client

What's happening:
- We're loading the COMPOSIO_API_KEY from environment variables and validating it exists
- Creating a Composio instance that will manage our connection to Dropbox sign tools
- Validating that COMPOSIO_USER_ID is also set before proceeding
```python
async def main():
    composio = Composio(api_key=os.getenv("COMPOSIO_API_KEY"))

    if not os.getenv("COMPOSIO_API_KEY"):
        raise ValueError("COMPOSIO_API_KEY is not set")
    if not os.getenv("COMPOSIO_USER_ID"):
        raise ValueError("COMPOSIO_USER_ID is not set")
```

```typescript
const composioApiKey = process.env.COMPOSIO_API_KEY;
const userId = process.env.COMPOSIO_USER_ID;

if (!composioApiKey) throw new Error('COMPOSIO_API_KEY is not set');
if (!userId) throw new Error('COMPOSIO_USER_ID is not set');

async function main() {
    const composio = new Composio({
        apiKey: composioApiKey as string,
        provider: new LangchainProvider()
    });
```

### 6. Create a Tool Router session

What's happening:
- We're creating a Tool Router session that gives your agent access to Dropbox sign tools
- The create method takes the user ID and specifies which toolkits should be available
- The returned session.mcp.url is the MCP server URL that your agent will use
- This approach allows the agent to dynamically load and use Dropbox sign tools as needed
```python
# Create Tool Router session for Dropbox sign
session = composio.create(
    user_id=os.getenv("COMPOSIO_USER_ID"),
    toolkits=['dropbox_sign']
)

url = session.mcp.url
```

```typescript
const session = await composio.create(
    userId as string,
    {
        toolkits: ['dropbox_sign']
    }
);

const url = session.mcp.url;
```

### 7. Configure the agent with the MCP URL

No description provided.
```python
client = MultiServerMCPClient({
    "dropbox_sign-agent": {
        "transport": "streamable_http",
        "url": session.mcp.url,
        "headers": {
            "x-api-key": os.getenv("COMPOSIO_API_KEY")
        }
    }
})

tools = await client.get_tools()

agent = create_agent("gpt-5", tools)
```

```typescript
const client = new MultiServerMCPClient({
    "dropbox_sign-agent": {
        transport: "http",
        url: url,
        headers: {
            "x-api-key": process.env.COMPOSIO_API_KEY
        }
    }
});

const tools = await client.getTools();

const agent = createAgent({ model: "gpt-5", tools });
```

### 8. Set up interactive chat interface

No description provided.
```python
conversation_history = []

print("Chat started! Type 'exit' or 'quit' to end the conversation.\n")
print("Ask any Dropbox sign related question or task to the agent.\n")

while True:
    user_input = input("You: ").strip()

    if user_input.lower() in ['exit', 'quit', 'bye']:
        print("\nGoodbye!")
        break

    if not user_input:
        continue

    conversation_history.append({"role": "user", "content": user_input})
    print("\nAgent is thinking...\n")

    response = await agent.ainvoke({"messages": conversation_history})
    conversation_history = response['messages']
    final_response = response['messages'][-1].content
    print(f"Agent: {final_response}\n")
```

```typescript
let conversationHistory: any[] = [];

console.log("Chat started! Type 'exit' or 'quit' to end the conversation.\n");
console.log("Ask any Dropbox sign related question or task to the agent.\n");

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: 'You: '
});

rl.prompt();

rl.on('line', async (userInput: string) => {
    const trimmedInput = userInput.trim();

    if (['exit', 'quit', 'bye'].includes(trimmedInput.toLowerCase())) {
        console.log("\nGoodbye!");
        rl.close();
        process.exit(0);
    }

    if (!trimmedInput) {
        rl.prompt();
        return;
    }

    conversationHistory.push({ role: "user", content: trimmedInput });
    console.log("\nAgent is thinking...\n");

    const response = await agent.invoke({ messages: conversationHistory });
    conversationHistory = response.messages;

    const finalResponse = response.messages[response.messages.length - 1]?.content;
    console.log(`Agent: ${finalResponse}\n`);
        
        rl.prompt();
    });

    rl.on('close', () => {
        console.log('\n👋 Session ended.');
        process.exit(0);
    });
```

### 9. Run the application

No description provided.
```python
if __name__ == "__main__":
    asyncio.run(main())
```

```typescript
main().catch((err) => {
    console.error('Fatal error:', err);
    process.exit(1);
});
```

## Complete Code

```python
from langchain_mcp_adapters.client import MultiServerMCPClient
from langchain.agents import create_agent
from dotenv import load_dotenv
from composio import Composio
import asyncio
import os

load_dotenv()

async def main():
    composio = Composio(api_key=os.getenv("COMPOSIO_API_KEY"))
    
    if not os.getenv("COMPOSIO_API_KEY"):
        raise ValueError("COMPOSIO_API_KEY is not set")
    if not os.getenv("COMPOSIO_USER_ID"):
        raise ValueError("COMPOSIO_USER_ID is not set")
    
    session = composio.create(
        user_id=os.getenv("COMPOSIO_USER_ID"),
        toolkits=['dropbox_sign']
    )

    url = session.mcp.url
    
    client = MultiServerMCPClient({
        "dropbox_sign-agent": {
            "transport": "streamable_http",
            "url": url,
            "headers": {
                "x-api-key": os.getenv("COMPOSIO_API_KEY")
            }
        }
    })
    
    tools = await client.get_tools()
  
    agent = create_agent("gpt-5", tools)
    
    conversation_history = []
    
    print("Chat started! Type 'exit' or 'quit' to end the conversation.\n")
    print("Ask any Dropbox sign related question or task to the agent.\n")
    
    while True:
        user_input = input("You: ").strip()
        
        if user_input.lower() in ['exit', 'quit', 'bye']:
            print("\nGoodbye!")
            break
        
        if not user_input:
            continue
        
        conversation_history.append({"role": "user", "content": user_input})
        print("\nAgent is thinking...\n")
        
        response = await agent.ainvoke({"messages": conversation_history})
        conversation_history = response['messages']
        final_response = response['messages'][-1].content
        print(f"Agent: {final_response}\n")

if __name__ == "__main__":
    asyncio.run(main())
```

```typescript
import { Composio } from '@composio/core';
import { LangchainProvider } from '@composio/langchain';
import { MultiServerMCPClient } from "@langchain/mcp-adapters";  
import { createAgent } from "langchain";
import * as readline from 'readline';
import 'dotenv/config';

const composioApiKey = process.env.COMPOSIO_API_KEY;
const userId = process.env.COMPOSIO_USER_ID;

if (!composioApiKey) throw new Error('COMPOSIO_API_KEY is not set');
if (!userId) throw new Error('COMPOSIO_USER_ID is not set');

async function main() {
    const composio = new Composio({
        apiKey: composioApiKey as string,
        provider: new LangchainProvider()
    });

    const session = await composio.create(
        userId as string,
        {
            toolkits: ['dropbox_sign']
        }
    );

    const url = session.mcp.url;
    
    const client = new MultiServerMCPClient({
        "dropbox_sign-agent": {
            transport: "http",
            url: url,
            headers: {
                "x-api-key": process.env.COMPOSIO_API_KEY
            }
        }
    });
    
    const tools = await client.getTools();
  
    const agent = createAgent({ model: "gpt-5", tools });
    
    let conversationHistory: any[] = [];
    
    console.log("Chat started! Type 'exit' or 'quit' to end the conversation.\n");
    console.log("Ask any Dropbox sign related question or task to the agent.\n");
    
    const rl = readline.createInterface({
        input: process.stdin,
        output: process.stdout,
        prompt: 'You: '
    });

    rl.prompt();

    rl.on('line', async (userInput: string) => {
        const trimmedInput = userInput.trim();
        
        if (['exit', 'quit', 'bye'].includes(trimmedInput.toLowerCase())) {
            console.log("\nGoodbye!");
            rl.close();
            process.exit(0);
        }
        
        if (!trimmedInput) {
            rl.prompt();
            return;
        }
        
        conversationHistory.push({ role: "user", content: trimmedInput });
        console.log("\nAgent is thinking...\n");
        
        const response = await agent.invoke({ messages: conversationHistory });
        conversationHistory = response.messages;
        
        const finalResponse = response.messages[response.messages.length - 1]?.content;
        console.log(`Agent: ${finalResponse}\n`);
        
        rl.prompt();
    });

    rl.on('close', () => {
        console.log('\nSession ended.');
        process.exit(0);
    });
}

main().catch((err) => {
    console.error('Fatal error:', err);
    process.exit(1);
});
```

## Conclusion

You've successfully built a LangChain agent that can interact with Dropbox sign through Composio's Tool Router.
Key features of this implementation:
- Dynamic tool loading through Composio's Tool Router
- Conversation history maintenance for context-aware responses
- Async Python provides clean, efficient execution of agent workflows
You can extend this further by adding error handling, implementing specific business logic, or integrating additional Composio toolkits to create multi-app workflows.

## How to build Dropbox sign MCP Agent with another framework

- [ChatGPT](https://composio.dev/toolkits/dropbox_sign/framework/chatgpt)
- [OpenAI Agents SDK](https://composio.dev/toolkits/dropbox_sign/framework/open-ai-agents-sdk)
- [Claude Agent SDK](https://composio.dev/toolkits/dropbox_sign/framework/claude-agents-sdk)
- [Claude Code](https://composio.dev/toolkits/dropbox_sign/framework/claude-code)
- [Claude Cowork](https://composio.dev/toolkits/dropbox_sign/framework/claude-cowork)
- [Codex](https://composio.dev/toolkits/dropbox_sign/framework/codex)
- [Cursor](https://composio.dev/toolkits/dropbox_sign/framework/cursor)
- [VS Code](https://composio.dev/toolkits/dropbox_sign/framework/vscode)
- [OpenCode](https://composio.dev/toolkits/dropbox_sign/framework/opencode)
- [OpenClaw](https://composio.dev/toolkits/dropbox_sign/framework/openclaw)
- [Hermes](https://composio.dev/toolkits/dropbox_sign/framework/hermes-agent)
- [CLI](https://composio.dev/toolkits/dropbox_sign/framework/cli)
- [Google ADK](https://composio.dev/toolkits/dropbox_sign/framework/google-adk)
- [Vercel AI SDK](https://composio.dev/toolkits/dropbox_sign/framework/ai-sdk)
- [Mastra AI](https://composio.dev/toolkits/dropbox_sign/framework/mastra-ai)
- [LlamaIndex](https://composio.dev/toolkits/dropbox_sign/framework/llama-index)
- [CrewAI](https://composio.dev/toolkits/dropbox_sign/framework/crew-ai)

## Related Toolkits

- [Google Drive](https://composio.dev/toolkits/googledrive) - Google Drive is a cloud storage platform for uploading, sharing, and collaborating on files. It's perfect for keeping your documents accessible and organized across devices.
- [Google Docs](https://composio.dev/toolkits/googledocs) - Google Docs is a cloud-based word processor that enables document creation and real-time collaboration. Its seamless sharing and version history make team editing and content management a breeze.
- [Google Super](https://composio.dev/toolkits/googlesuper) - Google Super is an all-in-one suite combining Gmail, Drive, Calendar, Sheets, Analytics, and more. It gives you a unified platform to manage your digital life, boosting productivity and organization.
- [Affinda](https://composio.dev/toolkits/affinda) - Affinda is an AI-powered document processing platform that automates data extraction from resumes, invoices, and more. It streamlines document-heavy workflows by turning files into structured, actionable data.
- [Agility cms](https://composio.dev/toolkits/agility_cms) - Agility CMS is a headless content management system for building and managing digital experiences across platforms. It lets teams update content quickly and deliver omnichannel experiences with ease.
- [Algodocs](https://composio.dev/toolkits/algodocs) - Algodocs is an AI-powered platform that automates data extraction from business documents. It delivers fast, secure, and accurate processing without templates or manual training.
- [Api2pdf](https://composio.dev/toolkits/api2pdf) - Api2Pdf is a REST API for generating PDFs from HTML, URLs, and documents using powerful engines like wkhtmltopdf and Headless Chrome. It streamlines document conversion and automation for developers and businesses.
- [Aryn](https://composio.dev/toolkits/aryn) - Aryn is an AI-powered platform for parsing, extracting, and analyzing data from unstructured documents. Use it to automate document processing and unlock actionable insights from your files.
- [Boldsign](https://composio.dev/toolkits/boldsign) - Boldsign is a digital eSignature platform for sending, signing, and tracking documents online. Organizations use it to automate agreements and manage legally binding workflows efficiently.
- [Boloforms](https://composio.dev/toolkits/boloforms) - BoloForms is an eSignature platform built for small businesses, offering unlimited signatures, templates, and forms. It simplifies digital document signing and team collaboration at a predictable, fixed price.
- [Box](https://composio.dev/toolkits/box) - Box is a cloud content management and file sharing platform for businesses. It helps teams securely store, organize, and collaborate on files from anywhere.
- [Carbone](https://composio.dev/toolkits/carbone) - Carbone is a blazing-fast report generator that turns JSON data into PDFs, Word docs, spreadsheets, and more using flexible templates. It lets you automate document creation at scale with minimal code.
- [Castingwords](https://composio.dev/toolkits/castingwords) - CastingWords is a transcription service specializing in human-powered, accurate transcripts via a simple API. Get seamless audio-to-text conversion for interviews, meetings, podcasts, and more.
- [Cloudconvert](https://composio.dev/toolkits/cloudconvert) - CloudConvert is a powerful file conversion service supporting over 200 file formats. It streamlines converting, compressing, and managing documents, media, and more, all in one place.
- [Cloudlayer](https://composio.dev/toolkits/cloudlayer) - Cloudlayer is a document and asset generation service for creating PDFs and images via API or SDKs. It lets you automate high-quality doc creation, saving dev time and reducing manual work.
- [Cloudpress](https://composio.dev/toolkits/cloudpress) - Cloudpress is a content export tool for Google Docs and Notion. It automates publishing to your favorite Content Management Systems.
- [Contentful graphql](https://composio.dev/toolkits/contentful_graphql) - Contentful graphql is a content delivery API that lets you access Contentful data using GraphQL queries. It gives you efficient, flexible ways to fetch and manage structured content for any digital project.
- [Conversion tools](https://composio.dev/toolkits/conversion_tools) - Conversion Tools is an online service for converting documents between formats such as PDF, Word, Excel, XML, and CSV. It lets you automate complex document workflows with just a few clicks.
- [Convertapi](https://composio.dev/toolkits/convertapi) - ConvertAPI is a robust file conversion service for documents, images, and spreadsheets. It streamlines programmatic format changes and lets developers automate complex workflows with a single API.
- [Craftmypdf](https://composio.dev/toolkits/craftmypdf) - CraftMyPDF is a web-based service for designing and generating PDFs with templates and live data. It streamlines document creation by automating personalized PDFs at scale.

## Frequently Asked Questions

### What are the differences in Tool Router MCP and Dropbox sign MCP?

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

### Can I use Tool Router MCP with LangChain?

Yes, you can. LangChain 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 Dropbox sign tools.

### Can I manage the permissions and scopes for Dropbox sign while using Tool Router?

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

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