Single Toolkit MCP

For most use cases, use a regular session instead. Sessions provide dynamic tool access and a much better MCP experience with context management handled by us.

Install the SDK

uv add composio

Create an MCP server

Initialize Composio

from composio import Composio

composio = Composio(api_key="YOUR_API_KEY")

Create server configuration

Before you begin: Create an auth configuration for your toolkit.

server = composio.mcp.create(
    name="my-gmail-server",
    toolkits=[{
        "toolkit": "gmail",
        "auth_config": "ac_xyz123"
    }],
    allowed_tools=["GMAIL_FETCH_EMAILS", "GMAIL_SEND_EMAIL"]
)

print(f"Server created: {server.id}")

You can also create and manage MCP configs from the Composio dashboard.

Generate user URLs

Users must authenticate with the toolkits configured in your MCP server first. See authentication for details.

instance = composio.mcp.generate(user_id="user-123", mcp_config_id=server.id)

print(f"MCP Server URL: {instance['url']}")

Use with AI providers

Pass an x-api-key header when connecting to Composio MCP. This is required when require_mcp_api_key is enabled (default for newly created organizations).

from openai import OpenAI

client = OpenAI(api_key="your-openai-api-key")

mcp_server_url = "https://backend.composio.dev/v3/mcp/YOUR_SERVER_ID?user_id=YOUR_USER_ID"
mcp_headers = {"x-api-key": "YOUR_COMPOSIO_API_KEY"}

response = client.responses.create(
    model="gpt-5",
    tools=[{
        "type": "mcp",
        "server_label": "composio-server",
        "server_url": mcp_server_url,
        "headers": mcp_headers,
        "require_approval": "never",
    }],
    input="What are my latest emails?",
)

print(response.output_text)

Server management

List servers

servers = composio.mcp.list()
print(f"Found {len(servers['items'])} servers")

# Filter by toolkit
gmail_servers = composio.mcp.list(toolkits="gmail", limit=20)

Get server details

server = composio.mcp.get("mcp_server_id")
print(f"Server: {server.name}")

Update a server

updated = composio.mcp.update(
    server_id="mcp_server_id",
    name="updated-name",
    allowed_tools=["GMAIL_FETCH_EMAILS", "GMAIL_SEARCH_EMAILS"]
)

Delete a server

result = composio.mcp.delete("mcp_server_id")
if result['deleted']:
    print("Server deleted")

Next

Providers

Use with Anthropic, OpenAI, and other frameworks