Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Automate Lemlist multichannel outreach -- manage campaigns, enroll leads, add personalization variables, export campaign data, and handle unsubscribes via the Composio MCP integration.
.claude/skills/composiohq-lemlist-automation/SKILL.md| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-02 | ✗→✓ | ▲ Improved | 3% | 0% |
| case-04 | ✗→✓ | ▲ Improved | 72% | 0% |
| case-05 | ✗→✓ | ▲ Improved | 115% | 0% |
| case-07 | ✗→✓ | ▲ Improved | 63% | 0% |
| case-08 | ✗→✓ | ▲ Improved | 37% | 0% |
Automate your Lemlist multichannel outreach workflows -- manage campaigns, enroll leads at scale, enrich with custom variables, export campaign data, and clean up unsubscribes.
Toolkit docs: composio.dev/toolkits/lemlist
https://rube.app/mcpUse LEMLIST_GET_LIST_CAMPAIGNS to enumerate all campaigns by status, with pagination support.
Tool: LEMLIST_GET_LIST_CAMPAIGNS
Inputs:
- status: "running" | "draft" | "archived" | "ended" | "paused" | "errors" (optional)
- limit: integer (max 100, default 100)
- offset: integer (pagination offset)
- sortBy: "createdAt"
- sortOrder: "asc" | "desc"Important: The response may be wrapped as {campaigns: [...], pagination: {...}} instead of a flat list. Always extract from the campaigns key.
Use LEMLIST_GET_CAMPAIGN_BY_ID to validate campaign configuration before writes.
Tool: LEMLIST_GET_CAMPAIGN_BY_ID
Inputs:
- campaignId: string (required) -- e.g., "cam_A1B2C3D4E5F6G7H8I9"Use LEMLIST_POST_CREATE_LEAD_IN_CAMPAIGN to add leads with optional email finding, phone lookup, and LinkedIn enrichment.
Tool: LEMLIST_POST_CREATE_LEAD_IN_CAMPAIGN
Inputs:
- campaignId: string (required)
- email: string (required)
- firstName, lastName, companyName, companyDomain: string (optional)
- jobTitle, phone, linkedinUrl, icebreaker: string (optional)
- deduplicate: boolean (prevents cross-campaign duplicates)
- findEmail, findPhone, verifyEmail, linkedinEnrichment: boolean (optional)
- timezone: string (IANA format, e.g., "America/New_York")Bulk pattern: Chunk leads into batches of ~50 and checkpoint progress between batches.
Use LEMLIST_POST_ADD_VARIABLES_TO_LEAD to enrich leads with personalization fields after enrollment.
Tool: LEMLIST_POST_ADD_VARIABLES_TO_LEAD
Inputs:
- leadId: string (required) -- internal Lemlist lead ID (NOT email)
- company: string (required) -- must match your company name in Lemlist
- variables: object (required) -- key-value pairs, e.g., {"score": "42", "color": "yellow"}Important: This is NOT an upsert -- attempting to add variables that already exist will fail. Resolve the internal leadId via LEMLIST_GET_RETRIEVE_LEAD_BY_EMAIL if you only have the email address.
Use LEMLIST_GET_EXPORT_CAMPAIGN_LEADS to download leads with state filtering for reporting or QA.
Tool: LEMLIST_GET_EXPORT_CAMPAIGN_LEADS
Inputs:
- campaignId: string (required)
- (supports state filtering and JSON/CSV output)Use LEMLIST_DELETE_UNSUBSCRIBE_LEAD_FROM_CAMPAIGN to stop outreach by removing a lead from a campaign.
Tool: LEMLIST_DELETE_UNSUBSCRIBE_LEAD_FROM_CAMPAIGN
Inputs:
- campaignId: string (required)
- leadId or email: string (required)| Pitfall | Detail | |---------|--------| | Wrapped campaign list | LEMLIST_GET_LIST_CAMPAIGNS may return {campaigns: [...], pagination: {...}} instead of a flat array. Always extract from the campaigns key. | | Cross-campaign deduplication | LEMLIST_POST_CREATE_LEAD_IN_CAMPAIGN with deduplication enabled fails with HTTP 500 "Lead already in other campaign" -- disable deduplication for intentional cross-campaign enrollment. | | Bulk import failures | Chunk bulk imports to ~50 per batch with checkpoints to avoid losing partial progress on intermittent failures. | | Invalid leadId | LEMLIST_POST_ADD_VARIABLES_TO_LEAD returns HTTP 400 "Invalid leadId" when using an email as the leadId -- resolve the internal ID via LEMLIST_GET_RETRIEVE_LEAD_BY_EMAIL first. | | Variable collisions | LEMLIST_POST_ADD_VARIABLES_TO_LEAD is not an upsert. Adding keys that already exist returns HTTP 400 "Variables X already exist". |
| Tool Slug | Description | |-----------|-------------| | LEMLIST_GET_LIST_CAMPAIGNS | List all campaigns with status filter and pagination | | LEMLIST_GET_CAMPAIGN_BY_ID | Get detailed campaign info by ID | | LEMLIST_POST_CREATE_LEAD_IN_CAMPAIGN | Create and enroll a lead into a campaign | | LEMLIST_POST_ADD_VARIABLES_TO_LEAD | Add custom personalization variables to a lead | | LEMLIST_GET_RETRIEVE_LEAD_BY_EMAIL | Look up a lead by email address | | LEMLIST_GET_EXPORT_CAMPAIGN_LEADS | Export leads from a campaign with state filtering | | LEMLIST_DELETE_UNSUBSCRIBE_LEAD_FROM_CAMPAIGN | Remove a lead from a campaign |
Powered by Composio
| Case | Status | Duration (ms) | Turns | Tokens | Tool calls | ||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Without | With | Δ | Without | With | Δ | Without | With | Δ | Without | With | Δ | ||
case-01 | fail→fail | 6,598 | 4,557 | -31% | 1 | 1 | 0% | 1,624 | 1,847 | +14% | 0 | 0 | — |
case-02 | fail→pass | 11,514 | 7,288 | -37% | 1 | 1 | 0% | 2,543 | 2,621 | +3% | 0 | 0 | — |
case-03 | fail→fail | 5,496 | 3,940 | -28% | 1 | 1 | 0% | 1,195 | 1,735 | +45% | 0 | 0 | — |
case-04 | fail→pass | 5,624 | 2,389 | -58% | 1 | 1 | 0% | 1,124 | 1,929 | +72% | 0 | 0 | — |
case-05 | fail→pass | 4,300 | 1,758 | -59% | 1 | 1 | 0% | 854 | 1,836 | +115% | 0 | 0 | — |
case-06 | fail→fail | 10,032 | 2,755 | -73% | 1 | 1 | 0% | 1,048 | 1,932 | +84% | 0 | 0 | — |
case-07 | fail→pass | 6,893 | 2,824 | -59% | 1 | 1 | 0% | 1,232 | 2,004 | +63% | 0 | 0 | — |
case-08 | fail→pass | 6,359 | 2,189 | -66% | 1 | 1 | 0% | 1,400 | 1,924 | +37% | 0 | 0 | — |
case-09 | fail→fail | 7,148 | 3,742 | -48% | 1 | 1 | 0% | 1,410 | 1,623 | +15% | 0 | 0 | — |
case-10 | fail→fail | 8,843 | 3,969 | -55% | 1 | 1 | 0% | 1,866 | 1,758 | -6% | 0 | 0 | — |
case-11 | fail→pass | 9,323 | 3,129 | -66% | 1 | 1 | 0% | 1,729 | 2,155 | +25% | 0 | 0 | — |
case-12 | fail→pass | 8,901 | 6,285 | -29% | 1 | 1 | 0% | 1,662 | 2,629 | +58% | 0 | 0 | — |
case-13 | fail→pass | 8,577 | 4,419 | -48% | 1 | 1 | 0% | 1,744 | 2,392 | +37% | 0 | 0 | — |
case-14 | fail→pass | 7,188 | 3,051 | -58% | 1 | 1 | 0% | 1,388 | 2,007 | +45% | 0 | 0 | — |
case-15 | fail→pass | 6,042 | 1,388 | -77% | 1 | 1 | 0% | 1,033 | 1,707 | +65% | 0 | 0 | — |
case-16 | fail→fail | 5,158 | 5,356 | +4% | 1 | 1 | 0% | 1,062 | 1,758 | +66% | 0 | 0 | — |
case-17 | pass→pass | 3,942 | 1,624 | -59% | 1 | 1 | 0% | 732 | 1,728 | +136% | 0 | 0 | — |
case-18 | fail→pass | 6,031 | 2,566 | -57% | 1 | 1 | 0% | 1,104 | 2,048 | +86% | 0 | 0 | — |
case-19 | pass→pass | 3,662 | 2,053 | -44% | 1 | 1 | 0% | 643 | 1,825 | +184% | 0 | 0 | — |
case-20 | pass→fail | 12,623 | 11,402 | -10% | 1 | 1 | 0% | 2,052 | 3,505 | +71% | 0 | 0 | — |
case-21 | fail→fail | 11,549 | 11,093 | -4% | 1 | 1 | 0% | 2,400 | 3,756 | +56% | 0 | 0 | — |
case-22 | fail→pass | 9,157 | 8,980 | -2% | 1 | 1 | 0% | 1,771 | 3,211 | +81% | 0 | 0 | — |
DecimalAI ran this skill against gemini-3.6-flash twice over the same eval suite — once with the skill loaded and once without — and compared the two runs case by case. 22 cases were attempted, and 16 counted toward the lift figure. The other 6 produced results that are not comparable between the two arms, so they are excluded from the headline rather than averaged into it. The headline lift of +50 percentage points is the difference between those two pass rates over the 16 comparable cases. 1 case got worse with the skill loaded, and it is included in that figure.
Without the skill loaded, the model failed this case. With it loaded, the same prompt on the same model passed. This is one improved case from the latest verified run; every case, including any that regressed, is in the table above.
Other measured skills in the registry, with their headline benchmark lift.