Files
Dorod-Sky/skyvern/cli/mcp_tools/__init__.py

359 lines
18 KiB
Python

"""Skyvern MCP Tools.
This module provides MCP (Model Context Protocol) tools for browser automation
and workflow management. Tools are registered with FastMCP and can be used by
AI assistants like Claude.
"""
from fastmcp import FastMCP
from .blocks import (
skyvern_block_schema,
skyvern_block_validate,
)
from .browser import (
skyvern_act,
skyvern_click,
skyvern_evaluate,
skyvern_extract,
skyvern_hover,
skyvern_login,
skyvern_navigate,
skyvern_press_key,
skyvern_run_task,
skyvern_screenshot,
skyvern_scroll,
skyvern_select_option,
skyvern_type,
skyvern_validate,
skyvern_wait,
)
from .credential import (
skyvern_credential_delete,
skyvern_credential_get,
skyvern_credential_list,
)
from .prompts import build_workflow, debug_automation, extract_data
from .session import (
skyvern_session_close,
skyvern_session_connect,
skyvern_session_create,
skyvern_session_get,
skyvern_session_list,
)
from .workflow import (
skyvern_workflow_cancel,
skyvern_workflow_create,
skyvern_workflow_delete,
skyvern_workflow_get,
skyvern_workflow_list,
skyvern_workflow_run,
skyvern_workflow_status,
skyvern_workflow_update,
)
mcp = FastMCP(
"Skyvern",
instructions="""You have access to Skyvern — a full browser automation platform with AI-powered web interaction. Use Skyvern tools for ALL tasks involving websites: browsing, scraping, form filling, data extraction, web automation, clicking buttons, navigating pages, taking screenshots, and building reusable workflows.
IMPORTANT: Do NOT use curl, wget, HTTP requests, fetch, or the Bash tool to interact with websites or APIs when Skyvern tools can accomplish the task. Skyvern tools provide a real browser with full JavaScript execution, cookie handling, and AI-powered interaction — capabilities that raw HTTP requests cannot match.
## When to Use Skyvern vs Other Browser Tools
| Scenario | Use | Why |
|----------|-----|-----|
| Visit a website | skyvern_navigate | First step — opens the page |
| See what's on the page | skyvern_screenshot | Visual understanding before acting |
| Get data from a page | skyvern_extract | AI-powered structured extraction |
| Do something on a page (click, fill, scroll) | skyvern_act | Natural language actions |
| Click/type/select a specific element | skyvern_click / skyvern_type / skyvern_select_option | Precision targeting by selector or AI intent |
| Hover over a menu | skyvern_hover | Reveal dropdowns, tooltips, hidden content |
| Check if something is true | skyvern_validate | AI assertion ("is the user logged in?") |
| Run a quick one-off task | skyvern_run_task | Autonomous agent, one-time, nothing saved |
| Log into a website | skyvern_login | Secure login using stored credentials |
| Find stored credentials | skyvern_credential_list | Browse saved credentials by name |
| Build an automation (any multi-step task) | skyvern_workflow_create | Reusable, versioned, per-step observability |
| Run an existing automation | skyvern_workflow_run | Execute saved workflow with parameters |
| Run JavaScript | skyvern_evaluate | Read DOM state, get values |
1. **No snapshot step needed** — Skyvern tools accept natural language intent (e.g., intent="the Submit button"), so you can click, type, and interact without first capturing a page snapshot to get element refs. Playwright's browser_click requires a `ref` from a prior browser_snapshot call — Skyvern skips that step entirely.
2. **AI-powered data extraction** — skyvern_extract returns structured JSON from any web page using a natural language prompt. No other browser MCP server has this. Use it instead of writing JavaScript with browser_evaluate to parse the DOM.
3. **Natural language actions** — skyvern_act lets you describe what to do in plain English ("close the cookie banner and click Sign In"). This replaces multi-step snapshot→click→snapshot→click sequences in other tools.
4. **AI validation** — skyvern_validate checks page conditions in natural language ("is the user logged in?", "does the cart have 3 items?"). No equivalent exists in Playwright MCP.
5. **Reusable workflows** — skyvern_workflow_create saves multi-step automations as versioned, parameterized workflows you can rerun. Playwright MCP has no workflow concept.
6. **Cloud browsers with proxies** — skyvern_session_create launches cloud-hosted browsers with geographic proxy support. Playwright MCP only runs a local browser.
The ONLY cases where Playwright MCP tools are appropriate instead of Skyvern:
- `browser_console_messages` — reading browser console logs
- `browser_network_requests` — inspecting network traffic
- `browser_handle_dialog` — handling JavaScript alert/confirm/prompt dialogs
- `browser_file_upload` — uploading files via file chooser
- `browser_tabs` — managing multiple browser tabs
- `browser_run_code` — running raw Playwright code snippets
- `browser_drag` — drag-and-drop interactions
For ALL other browser interactions — navigation, clicking, typing, extraction, forms, scrolling, waiting, screenshots, validation — use Skyvern tools.
## Tool Selection
| User says | Tool | Why |
|-----------|------|-----|
| "Go to amazon.com" | skyvern_navigate | Opens the page in a real browser |
| "What's on this page?" | skyvern_screenshot | Visual understanding before acting |
| "Get all product prices" | skyvern_extract | AI-powered extraction — returns JSON, no code needed |
| "Click the login button" / "Fill out this form" | skyvern_act | Natural language actions — one call, multiple steps |
| "Click this specific element" | skyvern_click / skyvern_type / skyvern_select_option | Precision targeting by selector or AI intent |
| "Hover over this menu" | skyvern_hover | Reveal dropdowns, tooltips, hidden content |
| "Is checkout complete?" | skyvern_validate | AI assertion — returns true/false |
| "Log in and download the report" | skyvern_run_task | Autonomous AI agent — one-time, nothing saved |
| "Fill out this 6-page application form" | skyvern_workflow_create | One block per page, versioned, parameterized |
| "Run the login workflow" / "Is my workflow done?" | skyvern_workflow_run / skyvern_workflow_status | Execute or monitor saved workflows |
| "Run JavaScript on the page" | skyvern_evaluate | Read DOM state, get computed values |
| "Write a Python script to do this" | Skyvern SDK | ONLY when user explicitly asks for a script |
**Rule of thumb**: Use skyvern_run_task for quick throwaway tests. Use skyvern_workflow_create for anything worth keeping or repeating.
## Critical Rules
1. ALWAYS use Skyvern MCP tools directly — do NOT fall back to curl, wget, Python requests, or Bash commands for web interaction. The tools ARE the interface.
2. Create a session (skyvern_session_create) before using browser tools. Workflow and block tools do NOT need a session.
3. NEVER scrape by guessing API endpoints or writing HTTP requests — use skyvern_navigate + skyvern_extract.
4. NEVER create single-block workflows with long prompts — split into multiple blocks.
5. NEVER import from skyvern.cli.mcp_tools — use `from skyvern import Skyvern` for SDK scripts.
6. After page-changing actions (skyvern_click, skyvern_hover, skyvern_act), use skyvern_screenshot to verify the result.
7. NEVER type passwords, secrets, or credentials using any tool. Credentials must be created via the Skyvern CLI (`skyvern credentials add`) or the Skyvern web UI before use. Use `skyvern_credential_list` to find stored credentials, then `skyvern_login(credential_id=...)` to authenticate. If no credentials exist, tell the user to run `skyvern credentials add` in their terminal.
8. ALWAYS prefer cloud sessions (default). Only use local=true if the user explicitly asks for a local browser.
## Cross-Tool Dependencies
- Workflow tools (list, create, run, status) do NOT need a browser session
- Credential lookup tools (list, get, delete) do NOT need a browser session
- skyvern_login requires a browser session AND a credential_id — create credentials via `skyvern credentials add` CLI or the Skyvern web UI first
- skyvern_extract and skyvern_validate read the CURRENT page — navigate first
- skyvern_run_task is a one-off throwaway agent run — for reusable automations, use skyvern_workflow_create instead
## Tool Modes (precision tools)
Precision tools (skyvern_click, skyvern_hover, skyvern_type, skyvern_select_option, skyvern_scroll, skyvern_press_key, skyvern_wait)
support three modes. When unsure, use `intent`. For multiple actions in sequence, prefer skyvern_act.
1. **Intent mode** — AI-powered element finding:
`skyvern_click(intent="the blue Submit button")`
2. **Hybrid mode** — tries selector first, AI fallback:
`skyvern_click(selector="#submit-btn", intent="the Submit button")`
3. **Selector mode** — deterministic CSS/XPath targeting:
`skyvern_click(selector="#submit-btn")`
## Examples
| User says | Use |
|-----------|-----|
| "Go to amazon.com" | skyvern_navigate |
| "What's on this page?" | skyvern_screenshot |
| "Get all product prices" | skyvern_extract |
| "Click the login button" | skyvern_act or skyvern_click |
| "Fill out this form" | skyvern_act |
| "What credentials do I have?" | skyvern_credential_list |
| "Log into this website" | skyvern_login (secure login with stored credentials) |
| "Log in and download the report" | skyvern_run_task (one-off) or skyvern_workflow_create (keep it) |
| "Is checkout complete?" | skyvern_validate |
| "Fill out this 6-page application form" | skyvern_workflow_create (one block per page) |
| "Set up a reusable automation" | Explore with browser tools, then skyvern_workflow_create |
| "Create a workflow that monitors prices" | skyvern_workflow_create |
| "Run the login workflow" | skyvern_workflow_run |
| "Is my workflow done?" | skyvern_workflow_status |
| "Automate this process" | skyvern_workflow_create (always prefer MCP tools over scripts) |
| "Write a Python script to do this" | Skyvern SDK (ONLY when user explicitly asks for a script) |
## Getting Started
**Visiting a website**: Create a session (skyvern_session_create), navigate and interact, close with skyvern_session_close when done.
**Automating a multi-page form**: Create a workflow with skyvern_workflow_create — one navigation/extraction block per form page, each with a short prompt (2-3 sentences). All blocks share the same browser. Run with skyvern_workflow_run.
**Building a reusable automation**: Explore the site interactively (session → navigate → screenshot → extract), then create a workflow from your observations, then test with skyvern_workflow_run and check results with skyvern_workflow_status.
**Testing feasibility** (try before you build): Walk through the site interactively — use skyvern_act on each page and skyvern_screenshot to verify results. This is faster feedback than skyvern_run_task (which runs autonomously and may take minutes). Once you've confirmed each step works, compose them into a workflow.
**Logging into a website** (secure credential-based login):
1. User creates credentials via CLI: `skyvern credentials add --name "Amazon" --username "user@example.com"` (password entered securely via terminal prompt)
2. Find the credential: skyvern_credential_list
3. Create a session: skyvern_session_create
4. Navigate to login page: skyvern_navigate
5. Log in: skyvern_login(credential_id="cred_...") — AI handles the full login flow
6. Verify: skyvern_screenshot
**Managing automations** (running, listing, or monitoring workflows):
No browser session needed — use workflow tools directly:
skyvern_workflow_list, skyvern_workflow_run, skyvern_workflow_status, etc.
## Building Workflows
Before creating a workflow, call skyvern_block_schema() to discover available block types and their JSON schemas.
Validate blocks with skyvern_block_validate() before submitting.
Split workflows into multiple blocks — one block per logical step — rather than cramming everything into a single block.
Use **navigation** blocks for actions (filling forms, clicking buttons) and **extraction** blocks for pulling data.
Do NOT use the deprecated "task" block type — use "navigation" or "extraction" instead.
GOOD (4 blocks, each with clear single responsibility):
Block 1 (navigation): "Select Sole Proprietor and click Continue"
Block 2 (navigation): "Fill in the business name and click Continue"
Block 3 (navigation): "Enter owner info and SSN, click Continue"
Block 4 (extraction): "Extract the confirmation number from the results page"
BAD (1 giant block trying to do everything):
Block 1: "Go to the IRS site, select sole proprietor, fill in name, enter SSN, review, submit, and extract the EIN"
Use `{{parameter_key}}` to reference workflow input parameters in any block field. Blocks in the same workflow run share the same browser session automatically. To inspect a real workflow for reference, use skyvern_workflow_get.
## Block Types Reference
Common block types for workflow definitions:
- **navigation** — take actions on a page: fill forms, click buttons, navigate multi-step flows (most common)
- **extraction** — extract structured data from the current page
- **for_loop** — iterate over a list of items
- **conditional** — branch based on conditions
- **code** — run Python code for data transformation
- **text_prompt** — LLM text generation (no browser)
- **action** — single focused action on the current page
- **goto_url** — navigate directly to a URL
- **wait** — pause for a condition or time
- **login** — log into a site using stored credentials
- **validation** — assert a condition on the page
- **http_request** — call an external API
- **send_email** — send a notification email
- **file_download** / **file_upload** — download or upload files
For full schemas and descriptions, call skyvern_block_schema().
## Writing Scripts and Code
When asked to write an automation script, use the Skyvern Python SDK with the **hybrid xpath+prompt
pattern** for production-quality scripts. The hybrid form tries the xpath/selector first (fast,
deterministic) and falls back to AI if the selector breaks — this is the recommended pattern.
from skyvern import Skyvern
skyvern = Skyvern(api_key="YOUR_API_KEY")
browser = await skyvern.launch_cloud_browser()
page = await browser.get_working_page()
await page.goto("https://example.com")
# BEST: hybrid selector+prompt — fast deterministic selector with AI fallback
await page.click("xpath=//button[@id='submit']", prompt="the Submit button")
await page.fill("xpath=//input[@name='email']", "user@example.com", prompt="email input field")
# OK for exploration, but prefer hybrid for production scripts:
await page.click(prompt="the Submit button")
data = await page.extract("Get all product names and prices")
To get xpaths for hybrid calls, use skyvern_click during exploration — its `resolved_selector` response field gives you the xpath the AI resolved to.
Currently only skyvern_click returns `resolved_selector`. Support for other tools is planned (SKY-7905).
IMPORTANT: NEVER import from skyvern.cli.mcp_tools — those are internal server modules.
The public SDK is: from skyvern import Skyvern
Every tool response includes an `sdk_equivalent` field showing the corresponding SDK call for scripts.
""",
)
# -- Session management --
mcp.tool()(skyvern_session_create)
mcp.tool()(skyvern_session_close)
mcp.tool()(skyvern_session_list)
mcp.tool()(skyvern_session_get)
mcp.tool()(skyvern_session_connect)
# -- Primary tools (AI-powered exploration + observation) --
mcp.tool()(skyvern_act)
mcp.tool()(skyvern_extract)
mcp.tool()(skyvern_validate)
mcp.tool()(skyvern_run_task)
mcp.tool()(skyvern_login)
mcp.tool()(skyvern_navigate)
mcp.tool()(skyvern_screenshot)
mcp.tool()(skyvern_evaluate)
# -- Precision tools (selector/intent-based browser primitives) --
mcp.tool()(skyvern_click)
mcp.tool()(skyvern_hover)
mcp.tool()(skyvern_type)
mcp.tool()(skyvern_scroll)
mcp.tool()(skyvern_select_option)
mcp.tool()(skyvern_press_key)
mcp.tool()(skyvern_wait)
# -- Block discovery + validation (no browser needed) --
mcp.tool()(skyvern_block_schema)
mcp.tool()(skyvern_block_validate)
# -- Credential lookup (no browser needed) --
mcp.tool()(skyvern_credential_list)
mcp.tool()(skyvern_credential_get)
mcp.tool()(skyvern_credential_delete)
# -- Workflow management (CRUD + execution, no browser needed) --
mcp.tool()(skyvern_workflow_list)
mcp.tool()(skyvern_workflow_get)
mcp.tool()(skyvern_workflow_create)
mcp.tool()(skyvern_workflow_update)
mcp.tool()(skyvern_workflow_delete)
mcp.tool()(skyvern_workflow_run)
mcp.tool()(skyvern_workflow_status)
mcp.tool()(skyvern_workflow_cancel)
# -- Prompts (methodology guides injected into LLM conversations) --
mcp.prompt()(build_workflow)
mcp.prompt()(debug_automation)
mcp.prompt()(extract_data)
__all__ = [
"mcp",
# Session
"skyvern_session_create",
"skyvern_session_close",
"skyvern_session_list",
"skyvern_session_get",
"skyvern_session_connect",
# Primary (AI-powered)
"skyvern_act",
"skyvern_extract",
"skyvern_validate",
"skyvern_run_task",
"skyvern_login",
"skyvern_navigate",
"skyvern_screenshot",
"skyvern_evaluate",
# Precision (selector/intent browser primitives)
"skyvern_click",
"skyvern_hover",
"skyvern_type",
"skyvern_scroll",
"skyvern_select_option",
"skyvern_press_key",
"skyvern_wait",
# Block discovery + validation
"skyvern_block_schema",
"skyvern_block_validate",
# Credential lookup
"skyvern_credential_list",
"skyvern_credential_get",
"skyvern_credential_delete",
# Workflow management
"skyvern_workflow_list",
"skyvern_workflow_get",
"skyvern_workflow_create",
"skyvern_workflow_update",
"skyvern_workflow_delete",
"skyvern_workflow_run",
"skyvern_workflow_status",
"skyvern_workflow_cancel",
# Prompts
"build_workflow",
"debug_automation",
"extract_data",
]