surf

Use when user asks to browse websites, automate browser tasks, fill forms, extract webpage data, search web information, or interact with external apps. This is the main entry point that delegates to specialized skills.

Surf - VibeSurf Browser Automation

Overview

Control real browsers through VibeSurf. This skill delegates to specialized sub-skills.

🚨 VIBESURF STATUS (Auto-detected at session start)

Check the <SURF_SKILLS> status at the TOP of this context:

  • āœ… Status: running → Proceed with surf skills
  • āŒ Status: not_running → Ask user to run vibesurf (NEVER run it yourself)

Check manually: curl $VIBESURF_ENDPOINT/health (default: http://127.0.0.1:9335)

How to Call VibeSurf API

VibeSurf exposes three core HTTP endpoints. All requests go to the configured endpoint (check the status line above for the actual endpoint):

1. List Available Actions

GET $VIBESURF_ENDPOINT/api/tool/search?keyword={optional_keyword}

Returns all available VibeSurf actions.

2. Get Action Parameters

GET $VIBESURF_ENDPOINT/api/tool/{action_name}/params

Returns JSON schema for the action's parameters.

3. Execute Action

POST $VIBESURF_ENDPOINT/api/tool/execute
Content-Type: application/json

{
  "action_name": "action_name_here",
  "parameters": {
    // action-specific parameters
  }
}

Workflow:

  1. Search for action → Get action name
  2. Get params schema → See required/optional parameters
  3. Execute → Call with parameters

āš ļø CRITICAL: Parameter Error Handling

ALWAYS call GET /api/tool/{action_name}/params before executing ANY action if you are unsure about parameters.

When you encounter a parameter error:

  1. STOP - Do not guess or make up parameters
  2. CALL GET /api/tool/{action_name}/params to get the exact schema
  3. READ the response to identify required vs optional parameters
  4. RETRY with correct parameters

Never blindly retry with incorrect parameters. Always fetch the schema first!

Which Skill to Use

Task TypeUse SkillAction Name
AI web searchsearchskill_search
Fetch URL content as markdownfetchskill_fetch
Extract lists/tablesjs_codeskill_code
Extract page contentcrawlskill_crawl
Summarize pagesummaryskill_summary
Stock/financial datafinanceskill_finance
Trending newstrendskill_trend
Screenshotscreenshotskill_screenshot
Precise browser controlbrowserbrowser.* actions
Task-oriented automation (sub-agent)browser-useexecute_browser_use_agent
Social Media Platform APIswebsite-apiget_website_api_params, call_website_api
Pre-built workflowsworkflowssearch_workflows, execute_workflow
Gmail/GitHub/Slackintegrationsget_all_toolkit_types, execute_extra_tool
LLM profile settingsconfig-llmconfig/llm-profiles/*
MCP server configconfig-mcpconfig/mcp-profiles/*
VibeSurf key/workflowsconfig-vibesurfvibesurf/verify-key, vibesurf/import-workflow
Composio key/toolkitsconfig-composiocomposio/verify-key, composio/toolkits
Schedule workflowsconfig-scheduleschedule/*
File upload/downloadfile/api/files/*
Voice/ASR configurationconfig-voice/api/voices/*

Configuration Skills

Use these skills to configure VibeSurf settings:

Config TaskSkillWhen to Use
Add/switch LLMconfig-llmManage AI model profiles (OpenAI, Anthropic, etc.)
Add MCP serverconfig-mcpConfigure MCP integrations for extended tools
VibeSurf API keyconfig-vibesurfSet up API key, import/export workflows
Enable Gmail/GitHub/etcconfig-composioConfigure Composio toolkits and OAuth
Schedule workflowsconfig-scheduleSet up cron-based workflow automation
Voice/ASR profilesconfig-voiceConfigure speech recognition profiles

Note: After configuring Composio or MCP tools, use them through the integrations skill (see tool naming: cpo.{toolkit}.{action} or mcp.{server}.{action}).

Decision Flow

Browser/Web Task
│
ā”œā”€ Need to search for information/bug/issue? → search (skill_search) [PREFERRED]
│  Examples: "Search for solutions to [bug name]", "Find latest info about [topic]"
│  Fallback: If skill_search doesn't find complete info → browser.search + browser.click + extract/summary/crawl
│
ā”œā”€ Need to fetch URL content directly? → fetch (skill_fetch)
│  Examples: "Fetch content from [URL]", "Get documentation at [URL]", "Read this webpage"
│  Use for: Getting structured markdown from any URL without browser interaction
│
ā”œā”€ Need to open website? → browser (browser.navigate)
│  Examples: "Open documentation site", "Go to [URL]", "Check this page"
│
ā”œā”€ Need to extract data?
│  ā”œā”€ Lists/tables/repeated items? → js_code (skill_code)
│  Examples: "Extract all product prices", "Get all post titles"
│  └─ Main content? → crawl (skill_crawl)
│  Examples: "Get the article content", "Extract main section"
│
ā”œā”€ Need summary? → summary (skill_summary)
│  Examples: "Summarize this page", "What's this about?"
│
ā”œā”€ Stock/finance data? → finance (skill_finance)
│  Examples: "Stock price for AAPL", "Financial data for [company]"
│
ā”œā”€ Trending news? → trend (skill_trend)
│  Examples: "What's trending", "Hot topics"
│
ā”œā”€ Screenshot? → screenshot (skill_screenshot)
│  Examples: "Take a screenshot", "Show me the page"
│
ā”œā”€ Need precise control or step-by-step operations? → browser (browser.*)
│  Examples: "Click the button", "Type in the field", "Scroll down", "Navigate then click"
│  Use for: Any browser task where you want explicit control over each action
│
ā”œā”€ Debug/test website or monitor logs? → browser (debugging actions)
│  Examples: "Monitor console logs", "Capture network traffic", "Debug this page"
│  Workflow: start_console_logging/start_network_logging → perform actions → stop_*_logging
│  Use cases: Website testing, frontend/backend debugging, reverse engineering
│
ā”œā”€ Complex task-oriented automation? → browser-use (execute_browser_use_agent)
│  Examples: "Fill out this form", "Extract data from multiple pages", "Login and check dashboard"
│  Use for: Complex tasks where describing the goal is easier than specifying steps
│  Fallback: If browser-use fails → use browser with get_browser_state loop
│
ā”œā”€ Platform API (XiaoHongShu/Youtube/etc)? → website-api
│  Examples: "Get XiaoHongShu posts", "Call Weibo API"
│
ā”œā”€ External app (Gmail/Google Calendar/GitHub)? → integrations
│  Examples: "Send email via Gmail", "Create GitHub PR", "Post to Slack"
│
└─ Pre-built workflow? → workflows
│  Examples: "Run video download workflow", "Execute auto-login workflow"
│
ā”œā”€ Need to configure LLM/MCP/VibeSurf/Composio/Voice? → config-* skills
│  Examples: "Add OpenAI API key", "Enable Gmail toolkit", "Import workflow"
│  - LLM profiles → config-llm
│  - MCP servers → config-mcp
│  - VibeSurf key/workflows → config-vibesurf
│  - Composio key/toolkits → config-composio
│  - Schedule workflows → config-schedule
│  - Voice/ASR profiles → config-voice

Quick Reference

GoalSkillAction
Search websearchskill_search
Fetch URL contentfetchskill_fetch
Extract prices/productsjs_codeskill_code
Get main contentcrawlskill_crawl
Summarize pagesummaryskill_summary
Stock datafinanceskill_finance
Hot topicstrendskill_trend
Take screenshotscreenshotskill_screenshot
Click/navigate/typebrowserbrowser.click, browser.navigate, etc.
Task-oriented automationbrowser-useexecute_browser_use_agent (fallback to browser if fails)
Social Media Platform APIswebsite-apicall_website_api
Send emailintegrationsexecute_extra_tool
Run workflowworkflowsexecute_workflow
Configure LLM profilesconfig-llmconfig/llm-profiles/*
Configure MCP serversconfig-mcpconfig/mcp-profiles/*
Configure VibeSurf keyconfig-vibesurfvibesurf/verify-key
Enable Composio toolkitsconfig-composiocomposio/toolkits
Schedule workflowsconfig-scheduleschedule/*
Upload/Download filesfile/api/files/*
Configure Voice/ASRconfig-voice/api/voices/*

Common Patterns

RequestUse SkillAction
"Search for X"searchskill_search (preferred)
"Search for bug/issue"search first, fallback to browserskill_search, then browser.search + extract if needed
"Fetch content from [URL]"fetchskill_fetch
"Get documentation at [URL]"fetchskill_fetch
"Read this webpage"fetchskill_fetch
"Extract all prices"js_codeskill_code
"Summarize this page"summaryskill_summary
"Stock info for AAPL"financeskill_finance
"What's trending"trendskill_trend
"Take a screenshot"screenshotskill_screenshot
"Navigate and click"browserbrowser.navigate, browser.click
"Fill out this form"browser-use or browserexecute_browser_use_agent (or manual browser operations)
"Get XiaoHongShu posts"website-apicall_website_api
"Get Youtube video content or transcript"website-apicall_website_api
"Send Gmail"integrationsexecute_extra_tool
"Run video download"workflowsexecute_workflow
"Debug console logs"browserbrowser.start_console_logging → actions → browser.stop_console_logging
"Monitor network traffic"browserbrowser.start_network_logging → actions → browser.stop_network_logging
"Test this website"browserUse console/network logging actions
"Configure LLM"config-llmconfig/llm-profiles endpoints
"Add MCP server"config-mcpconfig/mcp-profiles endpoints
"Set VibeSurf API key"config-vibesurfvibesurf/verify-key
"Import workflow"config-vibesurfvibesurf/import-workflow
"Enable Gmail/GitHub"config-composiocomposio/toolkits + toggle endpoints
"Schedule workflow"config-scheduleschedule/* endpoints
"Upload file" / "Download file"file/api/files/* endpoints
"Configure voice profile" / "ASR"config-voice/api/voices/*
"Speech to text" / "Transcribe audio"config-voice/api/voices/asr

Error Handling

ErrorSolution
VibeSurf not runningCheck status in context (SessionStart hook already detected)<br>If not_running: Inform user to run vibesurf<br>NEVER run the command yourself
Don't know which skillRead skill descriptions above
Action not foundCall GET /api/tool/search to list all actions
Wrong parametersCall GET /api/tool/{action_name}/params to see schema
browser-use fails or gets stuckFallback to browser: use get_browser_state → browser.{action} → repeat loop
LLM/Crawl/Summary errorsCause: No LLM profile configured<br>Solution: Use config-llm to add an LLM profile first
Integration tools empty/not foundCause: Composio/MCP not configured<br>Solution: Use config-composio or config-mcp to enable toolkits first

VibeSurf Status (Auto-Detected at Session Start)

šŸ” LOOK FOR THE STATUS IN THE CONTEXT ABOVE - DO NOT IGNORE IT

The status appears at the very top:

<SURF_SKILLS>**VibeSurf Integration** - Status: running/not_running

Actions based on status:

  • Status: running → VibeSurf is ready, use surf actions directly
  • Status: not_running → Inform user to start VibeSurf, DO NOT run commands to start it yourself

To manually re-check status (only if needed):

curl $VIBESURF_ENDPOINT/health
# Returns HTTP 200 if running, connection error if not running
# Default endpoint: http://127.0.0.1:9335 (if VIBESURF_ENDPOINT is not set)

Getting Browser State

šŸ” Check Current Browser State

When user asks about current page content or browser status (e.g., "What's on the current page?", "What tabs are open?", "What's the browser showing?"), use the get_browser_state action to get the current browser state including:

  • All open tabs and their URLs
  • Active tab information
  • Page content/state
  • Highlighted Screenshot

Action: get_browser_state

This is essential when you don't have context about what the user is currently viewing in their browser.

browser vs browser-use

Both skills can accomplish the same browser tasks - they're complementary tools:

ApproachBest ForHow It Works
browser-useComplex, long tasksTask-oriented sub-agent: describe goal + desired output, agent figures out steps
browserPrecise controlStep-by-step manual control: explicit actions with full visibility
HybridBest reliabilityTry browser-use first, fallback to browser if it fails

Fallback pattern when browser-use fails:

browser-use fails or gets stuck
→ get_browser_state (inspect page)
→ browser.{action} (perform action)
→ get_browser_state (verify & plan next)
→ repeat until complete

Key principle: Choose based on task complexity and control needs, not step count. Browser-use is not exclusive to multi-step tasks; browser can handle complex workflows too.


API Parameter Troubleshooting

If you encounter API parameter errors when calling VibeSurf endpoints, you can visit the interactive API documentation at:

http://127.0.0.1:9335/docs

For example: http://127.0.0.1:9335/docs#/config/create_mcp_profile_api_config_mcp_profiles_post

Note: This is a fallback approach. In most cases, reading the corresponding skill documentation (e.g., config-mcp skill) should provide sufficient guidance on how to use the API correctly. Only refer to the /docs endpoint when the skill documentation doesn't resolve your issue or you need to inspect specific request/response schemas.