async def integrate_toolkit(
self,
toolkit_slug: str,
account_id: str,
user_id: str,
profile_name: Optional[str] = None,
save_as_profile: bool = True,
initiation_fields: Optional[Dict[str, str]] = None,
custom_auth_config: Optional[Dict[str, str]] = None,
use_custom_auth: bool = False
) -> ComposioIntegrationResult:
# Step 1: Verify toolkit exists
toolkit = await self.toolkit_service.get_toolkit_by_slug(toolkit_slug)
# Step 2: Create auth config (OAuth)
auth_config = await self.auth_config_service.create_auth_config(
toolkit_slug,
initiation_fields=initiation_fields,
custom_auth_config=custom_auth_config,
use_custom_auth=use_custom_auth
)
# Step 3: Create connected account (user's OAuth connection)
connected_account = await self.connected_account_service.create_connected_account(
auth_config_id=auth_config.id,
user_id=user_id,
initiation_fields=initiation_fields
)
# Step 4: Create MCP server
mcp_server = await self.mcp_server_service.create_mcp_server(
auth_config_ids=[auth_config.id],
name=f"{toolkit.name} MCP Server",
toolkit_name=toolkit.name
)
# Step 5: Generate user-specific MCP URL
mcp_url_response = await self.mcp_server_service.generate_mcp_url(
mcp_server_id=mcp_server.id,
connected_account_ids=[connected_account.id],
user_ids=[user_id]
)
# Prefer account-specific URL (more secure)
final_mcp_url = mcp_url_response.connected_account_urls[0]
# Step 6: Save as credential profile (optional)
if save_as_profile:
profile = await self.profile_service.create_profile(
account_id=account_id,
profile_name=profile_name or f"{toolkit.name} Integration",
toolkit_slug=toolkit_slug,
mcp_url=final_mcp_url,
user_id=user_id,
connected_account_id=connected_account.id
)
profile_id = profile.profile_id
return ComposioIntegrationResult(
toolkit=toolkit,
auth_config=auth_config,
connected_account=connected_account,
mcp_server=mcp_server,
mcp_url_response=mcp_url_response,
final_mcp_url=final_mcp_url,
profile_id=profile_id
)