[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"skill-composio-webapp-testing":3,"mdc--43589v-key":53,"related-repo-composio-webapp-testing":710,"related-org-composio-webapp-testing":798},{"slug":4,"name":4,"fn":5,"description":6,"org":7,"tags":12,"stars":26,"repoUrl":27,"updatedAt":28,"license":29,"forks":30,"topics":31,"repo":48,"sourceUrl":51,"mdContent":52},"webapp-testing","test local web applications with Playwright","Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},"composio","Composio","https:\u002F\u002Fpexgzepcugksgbtrxkhf.supabase.co\u002Fstorage\u002Fv1\u002Fobject\u002Fpublic\u002Forg-logos\u002Fcomposio.png","ComposioHQ",[13,17,20,23],{"name":14,"slug":15,"type":16},"Playwright","playwright","tag",{"name":18,"slug":19,"type":16},"Testing","testing",{"name":21,"slug":22,"type":16},"Frontend","frontend",{"name":24,"slug":25,"type":16},"Debugging","debugging",67499,"https:\u002F\u002Fgithub.com\u002FComposioHQ\u002Fawesome-claude-skills","2026-07-12T08:09:08.189081","Complete terms in LICENSE.txt",7603,[32,33,34,35,36,37,38,8,39,40,41,42,43,44,45,46,47],"agent-skills","ai-agents","antigravity","automation","claude","claude-code","codex","cursor","developer-tools","gemini-cli","mcp","openai-codex","rube","saas","skill","workflow-automation",{"repoUrl":27,"stars":26,"forks":30,"topics":49,"description":50},[32,33,34,35,36,37,38,8,39,40,41,42,43,44,45,46,47],"A curated list of awesome Claude Skills, resources, and tools for customizing Claude AI workflows","https:\u002F\u002Fgithub.com\u002FComposioHQ\u002Fawesome-claude-skills\u002Ftree\u002FHEAD\u002Fwebapp-testing","---\nname: webapp-testing\ndescription: Toolkit for interacting with and testing local web applications using Playwright. Supports verifying frontend functionality, debugging UI behavior, capturing browser screenshots, and viewing browser logs.\nlicense: Complete terms in LICENSE.txt\n---\n\n# Web Application Testing\n\nTo test local web applications, write native Python Playwright scripts.\n\n**Helper Scripts Available**:\n- `scripts\u002Fwith_server.py` - Manages server lifecycle (supports multiple servers)\n\n**Always run scripts with `--help` first** to see usage. DO NOT read the source until you try running the script first and find that a customized solution is abslutely necessary. These scripts can be very large and thus pollute your context window. They exist to be called directly as black-box scripts rather than ingested into your context window.\n\n## Decision Tree: Choosing Your Approach\n\n```\nUser task → Is it static HTML?\n    ├─ Yes → Read HTML file directly to identify selectors\n    │         ├─ Success → Write Playwright script using selectors\n    │         └─ Fails\u002FIncomplete → Treat as dynamic (below)\n    │\n    └─ No (dynamic webapp) → Is the server already running?\n        ├─ No → Run: python scripts\u002Fwith_server.py --help\n        │        Then use the helper + write simplified Playwright script\n        │\n        └─ Yes → Reconnaissance-then-action:\n            1. Navigate and wait for networkidle\n            2. Take screenshot or inspect DOM\n            3. Identify selectors from rendered state\n            4. Execute actions with discovered selectors\n```\n\n## Example: Using with_server.py\n\nTo start a server, run `--help` first, then use the helper:\n\n**Single server:**\n```bash\npython scripts\u002Fwith_server.py --server \"npm run dev\" --port 5173 -- python your_automation.py\n```\n\n**Multiple servers (e.g., backend + frontend):**\n```bash\npython scripts\u002Fwith_server.py \\\n  --server \"cd backend && python server.py\" --port 3000 \\\n  --server \"cd frontend && npm run dev\" --port 5173 \\\n  -- python your_automation.py\n```\n\nTo create an automation script, include only Playwright logic (servers are managed automatically):\n```python\nfrom playwright.sync_api import sync_playwright\n\nwith sync_playwright() as p:\n    browser = p.chromium.launch(headless=True) # Always launch chromium in headless mode\n    page = browser.new_page()\n    page.goto('http:\u002F\u002Flocalhost:5173') # Server already running and ready\n    page.wait_for_load_state('networkidle') # CRITICAL: Wait for JS to execute\n    # ... your automation logic\n    browser.close()\n```\n\n## Reconnaissance-Then-Action Pattern\n\n1. **Inspect rendered DOM**:\n   ```python\n   page.screenshot(path='\u002Ftmp\u002Finspect.png', full_page=True)\n   content = page.content()\n   page.locator('button').all()\n   ```\n\n2. **Identify selectors** from inspection results\n\n3. **Execute actions** using discovered selectors\n\n## Common Pitfall\n\n❌ **Don't** inspect the DOM before waiting for `networkidle` on dynamic apps\n✅ **Do** wait for `page.wait_for_load_state('networkidle')` before inspection\n\n## Best Practices\n\n- **Use bundled scripts as black boxes** - To accomplish a task, consider whether one of the scripts available in `scripts\u002F` can help. These scripts handle common, complex workflows reliably without cluttering the context window. Use `--help` to see usage, then invoke directly. \n- Use `sync_playwright()` for synchronous scripts\n- Always close the browser when done\n- Use descriptive selectors: `text=`, `role=`, CSS selectors, or IDs\n- Add appropriate waits: `page.wait_for_selector()` or `page.wait_for_timeout()`\n\n## Reference Files\n\n- **examples\u002F** - Examples showing common patterns:\n  - `element_discovery.py` - Discovering buttons, links, and inputs on a page\n  - `static_html_automation.py` - Using file:\u002F\u002F URLs for local HTML\n  - `console_logging.py` - Capturing console logs during automation",{"data":54,"body":55},{"name":4,"description":6,"license":29},{"type":56,"children":57},"root",[58,67,73,84,101,119,126,138,144,156,164,238,246,355,360,446,452,516,522,557,563,649,655,704],{"type":59,"tag":60,"props":61,"children":63},"element","h1",{"id":62},"web-application-testing",[64],{"type":65,"value":66},"text","Web Application Testing",{"type":59,"tag":68,"props":69,"children":70},"p",{},[71],{"type":65,"value":72},"To test local web applications, write native Python Playwright scripts.",{"type":59,"tag":68,"props":74,"children":75},{},[76,82],{"type":59,"tag":77,"props":78,"children":79},"strong",{},[80],{"type":65,"value":81},"Helper Scripts Available",{"type":65,"value":83},":",{"type":59,"tag":85,"props":86,"children":87},"ul",{},[88],{"type":59,"tag":89,"props":90,"children":91},"li",{},[92,99],{"type":59,"tag":93,"props":94,"children":96},"code",{"className":95},[],[97],{"type":65,"value":98},"scripts\u002Fwith_server.py",{"type":65,"value":100}," - Manages server lifecycle (supports multiple servers)",{"type":59,"tag":68,"props":102,"children":103},{},[104,117],{"type":59,"tag":77,"props":105,"children":106},{},[107,109,115],{"type":65,"value":108},"Always run scripts with ",{"type":59,"tag":93,"props":110,"children":112},{"className":111},[],[113],{"type":65,"value":114},"--help",{"type":65,"value":116}," first",{"type":65,"value":118}," to see usage. DO NOT read the source until you try running the script first and find that a customized solution is abslutely necessary. These scripts can be very large and thus pollute your context window. They exist to be called directly as black-box scripts rather than ingested into your context window.",{"type":59,"tag":120,"props":121,"children":123},"h2",{"id":122},"decision-tree-choosing-your-approach",[124],{"type":65,"value":125},"Decision Tree: Choosing Your Approach",{"type":59,"tag":127,"props":128,"children":132},"pre",{"className":129,"code":131,"language":65},[130],"language-text","User task → Is it static HTML?\n    ├─ Yes → Read HTML file directly to identify selectors\n    │         ├─ Success → Write Playwright script using selectors\n    │         └─ Fails\u002FIncomplete → Treat as dynamic (below)\n    │\n    └─ No (dynamic webapp) → Is the server already running?\n        ├─ No → Run: python scripts\u002Fwith_server.py --help\n        │        Then use the helper + write simplified Playwright script\n        │\n        └─ Yes → Reconnaissance-then-action:\n            1. Navigate and wait for networkidle\n            2. Take screenshot or inspect DOM\n            3. Identify selectors from rendered state\n            4. Execute actions with discovered selectors\n",[133],{"type":59,"tag":93,"props":134,"children":136},{"__ignoreMap":135},"",[137],{"type":65,"value":131},{"type":59,"tag":120,"props":139,"children":141},{"id":140},"example-using-with_serverpy",[142],{"type":65,"value":143},"Example: Using with_server.py",{"type":59,"tag":68,"props":145,"children":146},{},[147,149,154],{"type":65,"value":148},"To start a server, run ",{"type":59,"tag":93,"props":150,"children":152},{"className":151},[],[153],{"type":65,"value":114},{"type":65,"value":155}," first, then use the helper:",{"type":59,"tag":68,"props":157,"children":158},{},[159],{"type":59,"tag":77,"props":160,"children":161},{},[162],{"type":65,"value":163},"Single server:",{"type":59,"tag":127,"props":165,"children":169},{"className":166,"code":167,"language":168,"meta":135,"style":135},"language-bash shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","python scripts\u002Fwith_server.py --server \"npm run dev\" --port 5173 -- python your_automation.py\n","bash",[170],{"type":59,"tag":93,"props":171,"children":172},{"__ignoreMap":135},[173],{"type":59,"tag":174,"props":175,"children":178},"span",{"class":176,"line":177},"line",1,[179,185,191,196,202,207,212,217,223,228,233],{"type":59,"tag":174,"props":180,"children":182},{"style":181},"--shiki-light:#E2931D;--shiki-default:#FFCB6B;--shiki-dark:#FFCB6B",[183],{"type":65,"value":184},"python",{"type":59,"tag":174,"props":186,"children":188},{"style":187},"--shiki-light:#91B859;--shiki-default:#C3E88D;--shiki-dark:#C3E88D",[189],{"type":65,"value":190}," scripts\u002Fwith_server.py",{"type":59,"tag":174,"props":192,"children":193},{"style":187},[194],{"type":65,"value":195}," --server",{"type":59,"tag":174,"props":197,"children":199},{"style":198},"--shiki-light:#39ADB5;--shiki-default:#89DDFF;--shiki-dark:#89DDFF",[200],{"type":65,"value":201}," \"",{"type":59,"tag":174,"props":203,"children":204},{"style":187},[205],{"type":65,"value":206},"npm run dev",{"type":59,"tag":174,"props":208,"children":209},{"style":198},[210],{"type":65,"value":211},"\"",{"type":59,"tag":174,"props":213,"children":214},{"style":187},[215],{"type":65,"value":216}," --port",{"type":59,"tag":174,"props":218,"children":220},{"style":219},"--shiki-light:#F76D47;--shiki-default:#F78C6C;--shiki-dark:#F78C6C",[221],{"type":65,"value":222}," 5173",{"type":59,"tag":174,"props":224,"children":225},{"style":187},[226],{"type":65,"value":227}," --",{"type":59,"tag":174,"props":229,"children":230},{"style":187},[231],{"type":65,"value":232}," python",{"type":59,"tag":174,"props":234,"children":235},{"style":187},[236],{"type":65,"value":237}," your_automation.py\n",{"type":59,"tag":68,"props":239,"children":240},{},[241],{"type":59,"tag":77,"props":242,"children":243},{},[244],{"type":65,"value":245},"Multiple servers (e.g., backend + frontend):",{"type":59,"tag":127,"props":247,"children":249},{"className":166,"code":248,"language":168,"meta":135,"style":135},"python scripts\u002Fwith_server.py \\\n  --server \"cd backend && python server.py\" --port 3000 \\\n  --server \"cd frontend && npm run dev\" --port 5173 \\\n  -- python your_automation.py\n",[250],{"type":59,"tag":93,"props":251,"children":252},{"__ignoreMap":135},[253,270,305,338],{"type":59,"tag":174,"props":254,"children":255},{"class":176,"line":177},[256,260,264],{"type":59,"tag":174,"props":257,"children":258},{"style":181},[259],{"type":65,"value":184},{"type":59,"tag":174,"props":261,"children":262},{"style":187},[263],{"type":65,"value":190},{"type":59,"tag":174,"props":265,"children":267},{"style":266},"--shiki-light:#90A4AE;--shiki-default:#EEFFFF;--shiki-dark:#BABED8",[268],{"type":65,"value":269}," \\\n",{"type":59,"tag":174,"props":271,"children":273},{"class":176,"line":272},2,[274,279,283,288,292,296,301],{"type":59,"tag":174,"props":275,"children":276},{"style":187},[277],{"type":65,"value":278},"  --server",{"type":59,"tag":174,"props":280,"children":281},{"style":198},[282],{"type":65,"value":201},{"type":59,"tag":174,"props":284,"children":285},{"style":187},[286],{"type":65,"value":287},"cd backend && python server.py",{"type":59,"tag":174,"props":289,"children":290},{"style":198},[291],{"type":65,"value":211},{"type":59,"tag":174,"props":293,"children":294},{"style":187},[295],{"type":65,"value":216},{"type":59,"tag":174,"props":297,"children":298},{"style":219},[299],{"type":65,"value":300}," 3000",{"type":59,"tag":174,"props":302,"children":303},{"style":266},[304],{"type":65,"value":269},{"type":59,"tag":174,"props":306,"children":308},{"class":176,"line":307},3,[309,313,317,322,326,330,334],{"type":59,"tag":174,"props":310,"children":311},{"style":187},[312],{"type":65,"value":278},{"type":59,"tag":174,"props":314,"children":315},{"style":198},[316],{"type":65,"value":201},{"type":59,"tag":174,"props":318,"children":319},{"style":187},[320],{"type":65,"value":321},"cd frontend && npm run dev",{"type":59,"tag":174,"props":323,"children":324},{"style":198},[325],{"type":65,"value":211},{"type":59,"tag":174,"props":327,"children":328},{"style":187},[329],{"type":65,"value":216},{"type":59,"tag":174,"props":331,"children":332},{"style":219},[333],{"type":65,"value":222},{"type":59,"tag":174,"props":335,"children":336},{"style":266},[337],{"type":65,"value":269},{"type":59,"tag":174,"props":339,"children":341},{"class":176,"line":340},4,[342,347,351],{"type":59,"tag":174,"props":343,"children":344},{"style":187},[345],{"type":65,"value":346},"  --",{"type":59,"tag":174,"props":348,"children":349},{"style":187},[350],{"type":65,"value":232},{"type":59,"tag":174,"props":352,"children":353},{"style":187},[354],{"type":65,"value":237},{"type":59,"tag":68,"props":356,"children":357},{},[358],{"type":65,"value":359},"To create an automation script, include only Playwright logic (servers are managed automatically):",{"type":59,"tag":127,"props":361,"children":364},{"className":362,"code":363,"language":184,"meta":135,"style":135},"language-python shiki shiki-themes material-theme-lighter material-theme material-theme-palenight","from playwright.sync_api import sync_playwright\n\nwith sync_playwright() as p:\n    browser = p.chromium.launch(headless=True) # Always launch chromium in headless mode\n    page = browser.new_page()\n    page.goto('http:\u002F\u002Flocalhost:5173') # Server already running and ready\n    page.wait_for_load_state('networkidle') # CRITICAL: Wait for JS to execute\n    # ... your automation logic\n    browser.close()\n",[365],{"type":59,"tag":93,"props":366,"children":367},{"__ignoreMap":135},[368,376,385,393,401,410,419,428,437],{"type":59,"tag":174,"props":369,"children":370},{"class":176,"line":177},[371],{"type":59,"tag":174,"props":372,"children":373},{},[374],{"type":65,"value":375},"from playwright.sync_api import sync_playwright\n",{"type":59,"tag":174,"props":377,"children":378},{"class":176,"line":272},[379],{"type":59,"tag":174,"props":380,"children":382},{"emptyLinePlaceholder":381},true,[383],{"type":65,"value":384},"\n",{"type":59,"tag":174,"props":386,"children":387},{"class":176,"line":307},[388],{"type":59,"tag":174,"props":389,"children":390},{},[391],{"type":65,"value":392},"with sync_playwright() as p:\n",{"type":59,"tag":174,"props":394,"children":395},{"class":176,"line":340},[396],{"type":59,"tag":174,"props":397,"children":398},{},[399],{"type":65,"value":400},"    browser = p.chromium.launch(headless=True) # Always launch chromium in headless mode\n",{"type":59,"tag":174,"props":402,"children":404},{"class":176,"line":403},5,[405],{"type":59,"tag":174,"props":406,"children":407},{},[408],{"type":65,"value":409},"    page = browser.new_page()\n",{"type":59,"tag":174,"props":411,"children":413},{"class":176,"line":412},6,[414],{"type":59,"tag":174,"props":415,"children":416},{},[417],{"type":65,"value":418},"    page.goto('http:\u002F\u002Flocalhost:5173') # Server already running and ready\n",{"type":59,"tag":174,"props":420,"children":422},{"class":176,"line":421},7,[423],{"type":59,"tag":174,"props":424,"children":425},{},[426],{"type":65,"value":427},"    page.wait_for_load_state('networkidle') # CRITICAL: Wait for JS to execute\n",{"type":59,"tag":174,"props":429,"children":431},{"class":176,"line":430},8,[432],{"type":59,"tag":174,"props":433,"children":434},{},[435],{"type":65,"value":436},"    # ... your automation logic\n",{"type":59,"tag":174,"props":438,"children":440},{"class":176,"line":439},9,[441],{"type":59,"tag":174,"props":442,"children":443},{},[444],{"type":65,"value":445},"    browser.close()\n",{"type":59,"tag":120,"props":447,"children":449},{"id":448},"reconnaissance-then-action-pattern",[450],{"type":65,"value":451},"Reconnaissance-Then-Action Pattern",{"type":59,"tag":453,"props":454,"children":455},"ol",{},[456,496,506],{"type":59,"tag":89,"props":457,"children":458},{},[459,464,465],{"type":59,"tag":77,"props":460,"children":461},{},[462],{"type":65,"value":463},"Inspect rendered DOM",{"type":65,"value":83},{"type":59,"tag":127,"props":466,"children":468},{"className":362,"code":467,"language":184,"meta":135,"style":135},"page.screenshot(path='\u002Ftmp\u002Finspect.png', full_page=True)\ncontent = page.content()\npage.locator('button').all()\n",[469],{"type":59,"tag":93,"props":470,"children":471},{"__ignoreMap":135},[472,480,488],{"type":59,"tag":174,"props":473,"children":474},{"class":176,"line":177},[475],{"type":59,"tag":174,"props":476,"children":477},{},[478],{"type":65,"value":479},"page.screenshot(path='\u002Ftmp\u002Finspect.png', full_page=True)\n",{"type":59,"tag":174,"props":481,"children":482},{"class":176,"line":272},[483],{"type":59,"tag":174,"props":484,"children":485},{},[486],{"type":65,"value":487},"content = page.content()\n",{"type":59,"tag":174,"props":489,"children":490},{"class":176,"line":307},[491],{"type":59,"tag":174,"props":492,"children":493},{},[494],{"type":65,"value":495},"page.locator('button').all()\n",{"type":59,"tag":89,"props":497,"children":498},{},[499,504],{"type":59,"tag":77,"props":500,"children":501},{},[502],{"type":65,"value":503},"Identify selectors",{"type":65,"value":505}," from inspection results",{"type":59,"tag":89,"props":507,"children":508},{},[509,514],{"type":59,"tag":77,"props":510,"children":511},{},[512],{"type":65,"value":513},"Execute actions",{"type":65,"value":515}," using discovered selectors",{"type":59,"tag":120,"props":517,"children":519},{"id":518},"common-pitfall",[520],{"type":65,"value":521},"Common Pitfall",{"type":59,"tag":68,"props":523,"children":524},{},[525,527,532,534,540,542,547,549,555],{"type":65,"value":526},"❌ ",{"type":59,"tag":77,"props":528,"children":529},{},[530],{"type":65,"value":531},"Don't",{"type":65,"value":533}," inspect the DOM before waiting for ",{"type":59,"tag":93,"props":535,"children":537},{"className":536},[],[538],{"type":65,"value":539},"networkidle",{"type":65,"value":541}," on dynamic apps\n✅ ",{"type":59,"tag":77,"props":543,"children":544},{},[545],{"type":65,"value":546},"Do",{"type":65,"value":548}," wait for ",{"type":59,"tag":93,"props":550,"children":552},{"className":551},[],[553],{"type":65,"value":554},"page.wait_for_load_state('networkidle')",{"type":65,"value":556}," before inspection",{"type":59,"tag":120,"props":558,"children":560},{"id":559},"best-practices",[561],{"type":65,"value":562},"Best Practices",{"type":59,"tag":85,"props":564,"children":565},{},[566,591,604,609,630],{"type":59,"tag":89,"props":567,"children":568},{},[569,574,576,582,584,589],{"type":59,"tag":77,"props":570,"children":571},{},[572],{"type":65,"value":573},"Use bundled scripts as black boxes",{"type":65,"value":575}," - To accomplish a task, consider whether one of the scripts available in ",{"type":59,"tag":93,"props":577,"children":579},{"className":578},[],[580],{"type":65,"value":581},"scripts\u002F",{"type":65,"value":583}," can help. These scripts handle common, complex workflows reliably without cluttering the context window. Use ",{"type":59,"tag":93,"props":585,"children":587},{"className":586},[],[588],{"type":65,"value":114},{"type":65,"value":590}," to see usage, then invoke directly.",{"type":59,"tag":89,"props":592,"children":593},{},[594,596,602],{"type":65,"value":595},"Use ",{"type":59,"tag":93,"props":597,"children":599},{"className":598},[],[600],{"type":65,"value":601},"sync_playwright()",{"type":65,"value":603}," for synchronous scripts",{"type":59,"tag":89,"props":605,"children":606},{},[607],{"type":65,"value":608},"Always close the browser when done",{"type":59,"tag":89,"props":610,"children":611},{},[612,614,620,622,628],{"type":65,"value":613},"Use descriptive selectors: ",{"type":59,"tag":93,"props":615,"children":617},{"className":616},[],[618],{"type":65,"value":619},"text=",{"type":65,"value":621},", ",{"type":59,"tag":93,"props":623,"children":625},{"className":624},[],[626],{"type":65,"value":627},"role=",{"type":65,"value":629},", CSS selectors, or IDs",{"type":59,"tag":89,"props":631,"children":632},{},[633,635,641,643],{"type":65,"value":634},"Add appropriate waits: ",{"type":59,"tag":93,"props":636,"children":638},{"className":637},[],[639],{"type":65,"value":640},"page.wait_for_selector()",{"type":65,"value":642}," or ",{"type":59,"tag":93,"props":644,"children":646},{"className":645},[],[647],{"type":65,"value":648},"page.wait_for_timeout()",{"type":59,"tag":120,"props":650,"children":652},{"id":651},"reference-files",[653],{"type":65,"value":654},"Reference Files",{"type":59,"tag":85,"props":656,"children":657},{},[658],{"type":59,"tag":89,"props":659,"children":660},{},[661,666,668],{"type":59,"tag":77,"props":662,"children":663},{},[664],{"type":65,"value":665},"examples\u002F",{"type":65,"value":667}," - Examples showing common patterns:\n",{"type":59,"tag":85,"props":669,"children":670},{},[671,682,693],{"type":59,"tag":89,"props":672,"children":673},{},[674,680],{"type":59,"tag":93,"props":675,"children":677},{"className":676},[],[678],{"type":65,"value":679},"element_discovery.py",{"type":65,"value":681}," - Discovering buttons, links, and inputs on a page",{"type":59,"tag":89,"props":683,"children":684},{},[685,691],{"type":59,"tag":93,"props":686,"children":688},{"className":687},[],[689],{"type":65,"value":690},"static_html_automation.py",{"type":65,"value":692}," - Using file:\u002F\u002F URLs for local HTML",{"type":59,"tag":89,"props":694,"children":695},{},[696,702],{"type":59,"tag":93,"props":697,"children":699},{"className":698},[],[700],{"type":65,"value":701},"console_logging.py",{"type":65,"value":703}," - Capturing console logs during automation",{"type":59,"tag":705,"props":706,"children":707},"style",{},[708],{"type":65,"value":709},"html .light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html.light .shiki span {color: var(--shiki-light);background: var(--shiki-light-bg);font-style: var(--shiki-light-font-style);font-weight: var(--shiki-light-font-weight);text-decoration: var(--shiki-light-text-decoration);}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}",{"items":711,"total":797},[712,728,744,753,763,775,784],{"slug":713,"name":714,"fn":715,"description":716,"org":717,"tags":718,"stars":26,"repoUrl":27,"updatedAt":727},"21risk-automation","-21risk-automation","automate 21risk compliance and safety tasks","Automate 21risk tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[719,721,722,724],{"name":720,"slug":35,"type":16},"Automation",{"name":9,"slug":8,"type":16},{"name":723,"slug":42,"type":16},"MCP",{"name":725,"slug":726,"type":16},"Risk Assessment","risk-assessment","2026-07-15T05:54:18.790529",{"slug":729,"name":730,"fn":731,"description":732,"org":733,"tags":734,"stars":26,"repoUrl":27,"updatedAt":743},"2chat-automation","-2chat-automation","automate 2chat messaging tasks","Automate 2chat tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[735,736,739,740],{"name":720,"slug":35,"type":16},{"name":737,"slug":738,"type":16},"Communications","communications",{"name":723,"slug":42,"type":16},{"name":741,"slug":742,"type":16},"Messaging","messaging","2026-07-15T05:51:27.190332",{"slug":745,"name":745,"fn":746,"description":747,"org":748,"tags":749,"stars":26,"repoUrl":27,"updatedAt":752},"ably-automation","automate Ably tasks with Composio","Automate Ably tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[750,751],{"name":720,"slug":35,"type":16},{"name":723,"slug":42,"type":16},"2026-07-12T08:09:55.453088",{"slug":754,"name":754,"fn":755,"description":756,"org":757,"tags":758,"stars":26,"repoUrl":27,"updatedAt":762},"abstract-automation","automate Abstract tasks via Composio","Automate Abstract tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[759,760,761],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},{"name":723,"slug":42,"type":16},"2026-07-15T05:45:16.470309",{"slug":764,"name":764,"fn":765,"description":766,"org":767,"tags":768,"stars":26,"repoUrl":27,"updatedAt":774},"abuselpdb-automation","automate Abuselpdb tasks via Composio","Automate Abuselpdb tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[769,770,771],{"name":720,"slug":35,"type":16},{"name":723,"slug":42,"type":16},{"name":772,"slug":773,"type":16},"Security","security","2026-07-15T05:56:20.013366",{"slug":776,"name":776,"fn":777,"description":778,"org":779,"tags":780,"stars":26,"repoUrl":27,"updatedAt":783},"abyssale-automation","automate Abyssale tasks via Composio","Automate Abyssale tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[781,782],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},"2026-07-15T05:54:50.762889",{"slug":785,"name":785,"fn":786,"description":787,"org":788,"tags":789,"stars":26,"repoUrl":27,"updatedAt":796},"accelo-automation","automate Accelo tasks via Composio","Automate Accelo tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[790,791,792,795],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},{"name":793,"slug":794,"type":16},"CRM","crm",{"name":723,"slug":42,"type":16},"2026-07-15T05:48:43.429136",860,{"items":799,"total":903},[800,807,814,819,825,831,836,843,857,870,883,893],{"slug":713,"name":714,"fn":715,"description":716,"org":801,"tags":802,"stars":26,"repoUrl":27,"updatedAt":727},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[803,804,805,806],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},{"name":723,"slug":42,"type":16},{"name":725,"slug":726,"type":16},{"slug":729,"name":730,"fn":731,"description":732,"org":808,"tags":809,"stars":26,"repoUrl":27,"updatedAt":743},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[810,811,812,813],{"name":720,"slug":35,"type":16},{"name":737,"slug":738,"type":16},{"name":723,"slug":42,"type":16},{"name":741,"slug":742,"type":16},{"slug":745,"name":745,"fn":746,"description":747,"org":815,"tags":816,"stars":26,"repoUrl":27,"updatedAt":752},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[817,818],{"name":720,"slug":35,"type":16},{"name":723,"slug":42,"type":16},{"slug":754,"name":754,"fn":755,"description":756,"org":820,"tags":821,"stars":26,"repoUrl":27,"updatedAt":762},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[822,823,824],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},{"name":723,"slug":42,"type":16},{"slug":764,"name":764,"fn":765,"description":766,"org":826,"tags":827,"stars":26,"repoUrl":27,"updatedAt":774},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[828,829,830],{"name":720,"slug":35,"type":16},{"name":723,"slug":42,"type":16},{"name":772,"slug":773,"type":16},{"slug":776,"name":776,"fn":777,"description":778,"org":832,"tags":833,"stars":26,"repoUrl":27,"updatedAt":783},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[834,835],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},{"slug":785,"name":785,"fn":786,"description":787,"org":837,"tags":838,"stars":26,"repoUrl":27,"updatedAt":796},{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[839,840,841,842],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},{"name":793,"slug":794,"type":16},{"name":723,"slug":42,"type":16},{"slug":844,"name":844,"fn":845,"description":846,"org":847,"tags":848,"stars":26,"repoUrl":27,"updatedAt":856},"accredible-certificates-automation","automate Accredible certificate management","Automate Accredible Certificates tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[849,850,853],{"name":720,"slug":35,"type":16},{"name":851,"slug":852,"type":16},"Documents","documents",{"name":854,"slug":855,"type":16},"E-Signature","e-signature","2026-07-15T05:55:33.159639",{"slug":858,"name":858,"fn":859,"description":860,"org":861,"tags":862,"stars":26,"repoUrl":27,"updatedAt":869},"acculynx-automation","automate Acculynx construction management tasks","Automate Acculynx tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[863,864,865,866],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},{"name":723,"slug":42,"type":16},{"name":867,"slug":868,"type":16},"Operations","operations","2026-07-15T05:58:48.059284",{"slug":871,"name":871,"fn":872,"description":873,"org":874,"tags":875,"stars":26,"repoUrl":27,"updatedAt":882},"active-campaign-automation","automate ActiveCampaign marketing and CRM tasks","Automate ActiveCampaign tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[876,877,878,879],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},{"name":793,"slug":794,"type":16},{"name":880,"slug":881,"type":16},"Email Marketing","email-marketing","2026-07-15T05:49:44.281711",{"slug":884,"name":884,"fn":885,"description":886,"org":887,"tags":888,"stars":26,"repoUrl":27,"updatedAt":892},"addresszen-automation","automate Addresszen address validation","Automate Addresszen tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[889,890,891],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},{"name":723,"slug":42,"type":16},"2026-07-15T05:47:51.742515",{"slug":894,"name":894,"fn":895,"description":896,"org":897,"tags":898,"stars":26,"repoUrl":27,"updatedAt":902},"adobe-automation","automate Adobe tasks via Composio","Automate Adobe tasks via Rube MCP (Composio). Always search tools first for current schemas.",{"slug":8,"name":9,"logoUrl":10,"githubOrg":11},[899,900,901],{"name":720,"slug":35,"type":16},{"name":9,"slug":8,"type":16},{"name":723,"slug":42,"type":16},"2026-07-15T05:45:05.303254",863]