Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Migrate from Composio to Scalekit

Map Composio concepts to Scalekit AgentKit equivalents and update your agent code step by step.

This guide maps Composio concepts to their Scalekit AgentKit equivalents and walks through each migration step: SDK setup, authentication, tool execution, and MCP. Use it as a reference while porting your agent code.

ComposioScalekitNotes
Toolkit (e.g. GITHUB)Connector (e.g. github)Scalekit uses lowercase slugs
Tool (e.g. GITHUB_CREATE_ISSUE)Tool (e.g. github_create_issue)Same concept, lowercase naming
Auth configConnectionOAuth app credentials, scopes, redirect URIs
Connected accountConnected accountPer-user credential record
user_id / entity IDidentifierYour app’s unique user ID, passed per API call
Connect LinkAuthorization linkOAuth redirect URL for user consent
Session (composio.create())No equivalentScalekit is stateless — pass identifier per call
Provider package (composio_openai)No equivalentScalekit uses a single SDK for all frameworks
session.tools()listScopedTools()Get tools a user is authorized to call
session.tools.execute()executeTool()Execute a tool on behalf of a user
session.mcp.urlMCP instance URLPer-user MCP endpoint
Custom tool (in-memory)Custom tool (API Proxy)Defined in your app code using actions.request()
executeToolRequest (proxy)actions.request()Proxied REST API call
TriggerNo equivalentScalekit does not support event-driven triggers
COMPOSIO_SEARCH_TOOLSNo equivalentUse listScopedTools with connection name filters
COMPOSIO_REMOTE_WORKBENCHNo equivalentNo remote sandbox execution
  1. Create a Scalekit account

    Sign up at app.scalekit.com and copy your API credentials from Dashboard > Developers > Settings > API Credentials.

  2. Set environment variables

    Terminal window
    SCALEKIT_CLIENT_ID=your_client_id
    SCALEKIT_CLIENT_SECRET=your_client_secret
    SCALEKIT_ENV_URL=https://your-env.scalekit.com
  3. Install the SDK

    Terminal window
    pip install scalekit-sdk-python
  4. Initialize the client

    Scalekit uses a single client instance. There is no session object — you pass identifier on each API call.

    import os
    import scalekit.client
    scalekit_client = scalekit.client.ScalekitClient(
    client_id=os.getenv("SCALEKIT_CLIENT_ID"),
    client_secret=os.getenv("SCALEKIT_CLIENT_SECRET"),
    env_url=os.getenv("SCALEKIT_ENV_URL"),
    )
    actions = scalekit_client.actions

In Composio, auth configs are created programmatically or via the dashboard. In Scalekit, you configure connections in the dashboard.

For each Composio toolkit your agent uses (Gmail, Slack, GitHub, etc.), create a corresponding connection in Dashboard > AgentKit > Connections > Add connection. See Configure a connection for the full walkthrough.

Composio auth typeScalekit equivalent
OAuth 2.0 (Composio managed)OAuth 2.0 (use Scalekit credentials to start, then bring your own)
OAuth 2.0 (custom)OAuth 2.0 (bring your own credentials)
API keyAPI key (user provides during connected account creation)
Bearer tokenBearer token
Basic authBasic auth

Both platforms create per-user records (connected accounts) and generate OAuth links. The SDK methods differ.

Before (Composio):

# Composio handles auth in-chat or via connect link
session = composio.create(user_id="user_123")
# Auth is triggered automatically when a tool requires it

After (Scalekit):

# Create or retrieve the connected account
response = actions.get_or_create_connected_account(
connection_name="gmail",
identifier="user_123",
)
connected_account = response.connected_account
# Generate an authorization link if the account is not yet active
if connected_account.status != "ACTIVE":
link_response = actions.get_authorization_link(
connection_name="gmail",
identifier="user_123",
)
auth_url = link_response.link
# Redirect or send auth_url to the user

Key difference: Composio can trigger auth in-chat automatically. With Scalekit, your app explicitly creates the connected account and sends the authorization link to the user. Once the user completes the OAuth flow, the connected account becomes ACTIVE and your agent can execute tools.

Composio tracks two statuses (ACTIVE and INACTIVE). Scalekit uses more granular states:

Scalekit statusMeaning
PENDINGUser hasn’t completed authentication
ACTIVECredentials valid, ready for tool calls
EXPIREDCredentials expired or invalidated, re-authentication required
REVOKEDUser revoked access or credentials were invalidated
ERRORAuthentication or configuration error

Check status before executing tools. If the account is not ACTIVE, generate a new authorization link.

Before (Composio):

session = composio.create(user_id="user_123")
tools = session.tools() # all tools the user is authorized for

After (Scalekit):

tools_response = scalekit_client.actions.tools.list_scoped_tools(
identifier="user_123",
filter={"connection_names": ["gmail"]}, # optional; omit for all connectors
page_size=100,
)

Before (Composio):

session = composio.create(user_id="user_123")
tools = session.tools()
# Framework handles execution via the agent loop, or:
# composio.tools.execute(tool_name="GMAIL_FETCH_MAILS", params={...})

After (Scalekit):

result = actions.execute_tool(
tool_name="gmail_fetch_mails",
identifier="user_123",
connection_name="gmail",
tool_input={"query": "is:unread", "max_results": 5},
)
print(result.data)

Key differences:

  • Composio tool names are uppercase (GMAIL_FETCH_MAILS); Scalekit uses lowercase (gmail_fetch_mails)
  • Composio’s session model means you don’t pass user_id on each call. With Scalekit, pass identifier and connection_name on every executeTool call
  • Both return structured, LLM-ready output

Composio and Scalekit may name tools differently for the same connector. Browse the connector’s tool list in the Scalekit connector catalog to find the exact tool names. Common patterns:

Composio tool nameScalekit tool name
GMAIL_FETCH_MAILSgmail_fetch_mails
SLACK_SEND_MESSAGEslack_send_message
GITHUB_CREATE_ISSUEgithub_create_issue
NOTION_CREATE_PAGEnotion_create_page

Tool input schemas may also differ. Check each tool’s parameters in the connector catalog and update your agent’s tool input accordingly.

Both platforms support MCP (Model Context Protocol) for framework-agnostic tool discovery and execution.

Before (Composio):

{
"mcpServers": {
"composio": {
"url": "https://backend.composio.dev/v3/mcp/{SERVER_ID}?user_id={USER_ID}",
"headers": {
"x-api-key": "<COMPOSIO_API_KEY>"
}
}
}
}

After (Scalekit):

In Scalekit, MCP requires a two-step setup:

  1. Create an MCP config — define which connections and tools the server exposes (one-time)
  2. Generate a per-user MCP URL — each user gets a unique, pre-authenticated endpoint

See Configure an MCP server and Generate user MCP URLs for the full setup.

Once you have the per-user URL:

{
"mcpServers": {
"scalekit": {
"url": "<PER_USER_MCP_URL>"
}
}
}

Key difference: Composio uses a single URL with the user ID as a query parameter. Scalekit generates a unique, pre-authenticated URL per user — no API key in the client config.

In Composio, custom tools are defined in code with decorators and stored in memory — they’re lost on restart. In Scalekit, custom tools use API Proxy mode (actions.request). The proxy is available out of the box for every connector with no extra configuration. You define the tool contract in your application code and call the provider’s REST endpoint through Scalekit, which injects the user’s credentials automatically.

Composio approachScalekit approach
@composio.tools.custom_tool decoratorDefine the tool in your app code
In-memory, lost on restartLives in your codebase
executeToolRequest for authenticated API callsactions.request() — works out of the box for every connector
response = actions.request(
connection_name="gmail",
identifier="user_123",
method="GET",
path="/gmail/v1/users/me/messages",
)

If your agent connects to an API or MCP server that isn’t in Scalekit’s built-in catalog, you can add your own connector. Custom connectors support OAuth 2.0, API keys, bearer tokens, and other auth types. Once created, they work exactly like built-in connectors — same connected account flow, same actions.request() proxy, same MCP tool calling.

This goes beyond what Composio offers with in-memory custom tools: Scalekit custom connectors are persistent, support any SaaS API, partner system, or internal service, and keep all credential handling centralized.

See Add your own connector for the full walkthrough.