Skip to content
Scalekit Docs
Talk to an Engineer Dashboard

Connect AI agents to the Tinyfish MCP server

Vendor MCP
Open markdown

The Tinyfish MCP connector routes your AI agent's tool calls to Tinyfish's own MCP server through Scalekit. Each user signs in to Tinyfish once, and Scalekit stores and refreshes their tokens, so your agent never handles credentials. It comes with 44 tools.

Tools
44
What they doRead · write · destructive
20 · 18 · 620 read18 write6 destructive
Users sign in with
OAuth app
Scalekit's or your own

What you can do

  • Automate websites: run multi-step tasks on a site from a plain-language goal, including clicks, form fills, and navigation
  • Fetch page content: render up to 10 URLs in a real browser and return clean markdown, HTML, or JSON
  • Search the web: get structured results with titles, snippets, and URLs, targeted by location and language
  • Track automation runs: check status, view step-by-step traces with screenshots, and cancel runs
  • Run browser sessions: start remote Chrome sessions to drive with Playwright, Puppeteer, or Selenium, and close them

Setup

  1. Install the SDK

    Terminal window
    npm install @scalekit-sdk/node dotenv
  2. Set your credentials

    Add your Scalekit credentials to your .env file. Find values in app.scalekit.com > Developers > API Credentials.

    .env
    SCALEKIT_ENVIRONMENT_URL=<your-environment-url>
    SCALEKIT_CLIENT_ID=<your-client-id>
    SCALEKIT_CLIENT_SECRET=<your-client-secret>
  3. Create the Tinyfish MCP connection

    In AgentKit > Connections, create a Tinyfish MCP connection. The name you give it is the connection_name your code passes. See Configure connections.

    Scalekit credentials are available for Tinyfish MCP server, so you don't need to register an OAuth app.

  4. Authorize a user and make your first call

    quickstart.mts
    import { ScalekitClient } from '@scalekit-sdk/node'
    import 'dotenv/config'
    import { createInterface } from 'node:readline/promises'
    const scalekit = new ScalekitClient(
    process.env.SCALEKIT_ENVIRONMENT_URL,
    process.env.SCALEKIT_CLIENT_ID,
    process.env.SCALEKIT_CLIENT_SECRET,
    )
    const actions = scalekit.actions
    const connector = 'tinyfishmcp'
    const identifier = 'user_123'
    // Generate an authorization link for the user
    const { link } = await actions.getAuthorizationLink({ connectionName: connector, identifier })
    console.log('Authorize Tinyfish MCP:', link)
    const rl = createInterface({ input: process.stdin, output: process.stdout })
    await rl.question('Press Enter after authorizing...')
    rl.close()
    // Make your first call
    const result = await actions.executeTool({
    connector,
    identifier,
    toolName: 'tinyfishmcp_get_wallet',
    toolInput: {},
    })
    console.log(result)
    Terminal window
    npx tsx quickstart.mts

    Each user signs in once. See Authorize a user for the full flow and statuses.

Tools

Pass the exact name to execute_tool
Try in PlaygroundRequest a tool
  • tinyfishmcp_batch_statusCheck the status, result, and error for up to 8 automation runs by their IDs.Read-only

    Batch Status

    Check the status, result, and error for up to 8 automation runs by their IDs.

    Inputs

    run_idsarrayrequired
    List of run IDs to cancel or check status for (up to 8).
  • tinyfishmcp_discover_runReturn the run ID of the currently active automation for the given session, or null if no run is in progress.Read-only

    Discover Run

    Return the run ID of the currently active automation for the given session, or null if no run is in progress.

    Inputs

    session_idstringrequired
    The browser session ID to look up the running automation for.
  • tinyfishmcp_fetch_contentRender up to 10 URLs in a real browser and return clean structured content (markdown, HTML, or JSON) plus metadata like title, author, and publish date.Read-only

    Fetch Content

    Render up to 10 URLs in a real browser and return clean structured content (markdown, HTML, or JSON) plus metadata like title, author, and publish date. Fetches run in parallel; per-URL errors are reported without blocking the rest.

    Inputs

    formatstringrequired
    Output format for extracted content. "markdown" (default) is ideal for LLM consumption. "html" returns cleaned semantic HTML. "json" returns a structured document tree.one of markdownhtmljsondefault markdown
    iframe_linksbooleanrequired
    Extract the src URLs of <iframe> elements on each page. Useful when a page embeds its main content in a frame (job boards, booking widgets, document viewers): fetch the returned URL to read the embedded content. Iframe links are returned as absolute, deduplicated URLs in the iframe_links array of each result. Script-injected iframes are only present when the page was rendered in a browser.default false
    image_linksbooleanrequired
    Extract all image URLs (<img src>) from each page. Useful for finding visual content or media assets. Image links are returned as absolute URLs in the image_links array of each result.default false
    linksbooleanrequired
    Extract all outbound links (<a href>) from each page. Useful for discovering related pages or navigating to specific content. Links are returned as absolute URLs in the links array of each result.default false
    page_metadatabooleanrequired
    Return page-head metadata for each page in the page_metadata object of each result: canonical URL, favicon, robots directive, generator, viewport, keywords, all Open Graph (og), Twitter card (twitter), and article tags, and remaining named meta tags under `other`. Useful for SEO/technical audits and link-preview generation.default false
    urlsarrayrequired
    Array of URLs to fetch (1-10). All URLs are fetched in parallel. Each URL is processed independently — if one fails, others still return successfully. Errors are reported per-URL in the errors array.
    exclude_selectorsarray
    Array of CSS selectors (1-20 entries, each 1-1000 characters) for elements to remove before extraction — applied before `include_selectors` scopes what remains, so it also prunes inside selected regions. Entries may themselves use CSS comma-grouping. Entries that match nothing are a no-op, never an error, but URLs that resolve to direct PDF/CSV downloads fail with `selector_unsupported`. Invalid CSS selector syntax is rejected with a 422. Applied post-fetch: caching and routing are unchanged.
    if_modified_sincestring
    Last-Modified validator from a prior fetch of this URL, forwarded verbatim as the If-Modified-Since header on the origin request. Only valid with a single URL — combining with a batch of URLs returns a 400. tf-fetch does not persist validators; the caller owns replaying them.
    if_none_matchstring
    ETag validator from a prior fetch of this URL, forwarded verbatim as the If-None-Match header on the origin request. Only valid with a single URL — combining with a batch of URLs returns a 400. tf-fetch does not persist validators; the caller owns replaying them.
    include_etag_and_last_modifiedboolean
    Opt-in to receiving `etag` / `last_modified` validators (and `not_modified` detection) on each result. Defaults to false — tf-fetch omits these fields unless requested. Independent of `if_none_match` / `if_modified_since`: works with a single URL or a batch.
    include_selectorsarray
    Array of CSS selectors (1-20 entries, each 1-1000 characters) that scope extracted content (`text`, `links`, `image_links`) to elements matching ANY entry, concatenated in document order. Tag selectors cover semantic sections (`main`, `article`, `nav`); entries may themselves use CSS comma-grouping. Selected content is returned verbatim in the requested format (scripts/styles stripped) — automatic boilerplate removal is bypassed. Page-level metadata (`title`, `description`, `language`, `author`, `published_date`) still comes from the full document. When some entries match and others do not, the URL still succeeds and the misses are reported in the result's `unmatched_selectors`. When no entry matches anything, that URL fails with the per-URL error code `selector_not_matched` (carrying `unmatched_selectors` and `candidate_selectors` retry hints) — never a silent full-page fallback. URLs that resolve to direct PDF/CSV downloads fail with `selector_unsupported`. Invalid CSS selector syntax is rejected with a 422. Applied post-fetch: caching and routing are unchanged.
    per_url_timeout_msinteger
    Wall-clock timeout budget in milliseconds applied independently to each URL. If one URL exceeds this budget, it returns a per-URL timeout error while other URLs in the same request continue.
    purposestring
    Why these URLs are being fetched — the underlying goal or task the content will be used for. Used to better tailor fetching and extraction to your intent.
    ttlinteger
    Caller freshness tolerance in seconds for the cached entry. Omit (default) for unlimited tolerance — any cached entry is acceptable. Set to 0 to prefer a live fetch; a cached entry is still served if the origin's Cache-Control: max-age covers its age, or the host is in the small allowlist of operator-pinned never-expire domains. Set to N > 0 to accept a cached entry whose age is below N; the upstream Cache-Control: max-age and the never-expire allowlist may extend (never shorten) this tolerance.
  • tinyfishmcp_get_datasetWaits up to about 25 seconds for a dataset started by create_dataset or populate_dataset, then returns its status, row count and the first rows.Read-only

    Get Dataset

    Waits up to about 25 seconds for a dataset started by create_dataset or populate_dataset, then returns its status, row count and the first rows. When output_ready is true the rows stand; call get_dataset_rows for more pages. While status is populating, call get_dataset again with the same dataset_id; filling usually takes a few minutes. Do not create another dataset or cancel because it is slow.

    Inputs

    dataset_idstringrequired
    dataset_id returned by create_dataset or list_datasets.
    waitboolean
    Wait up to about 25 seconds for the run to finish before answering.default true
  • tinyfishmcp_get_dataset_rowsOne page of rows from a dataset, in column order.Read-only

    Get Dataset Rows

    One page of rows from a dataset, in column order. Use after get_dataset reports output_ready, or to read past the first rows; pass the previous next_cursor as after.

    Inputs

    dataset_idstringrequired
    dataset_id returned by create_dataset or list_datasets.
    afterstring
    The previous page's next_cursor.
    limitinteger
    Rows per page, 1 to 500.default 100
  • tinyfishmcp_get_deep_researchWaits up to about 25 seconds for a run started by start_deep_research, then returns its status.Read-only

    Get Deep Research

    Waits up to about 25 seconds for a run started by start_deep_research, then returns its status. When output_ready is true, the result has the cited report. While the run is still going, call get_deep_research again with the same research_run_id; research usually takes several minutes. Do not start a new run or cancel because it is slow.

    Inputs

    research_run_idstringrequired
    Id returned by start_deep_research.
  • tinyfishmcp_get_monitorOnly use when the user asks for one Monitor.Read-only

    Get Monitor

    Only use when the user asks for one Monitor. Requires monitor_id from list_monitors or create_monitor.

    Inputs

    monitor_idstringrequired
    Id returned by list_monitors or create_monitor.
  • tinyfishmcp_get_runRetrieve status, result, error, and metadata for a specific automation run by its ID.Read-only

    Get Run

    Retrieve status, result, error, and metadata for a specific automation run by its ID.

    Inputs

    idstringrequired
    The unique run ID to retrieve or cancel.