Sign up

API & MCP

Monti Browser serves a local automation API and an MCP server, so Claude, Codex, or any client can drive real browser sessions. The same 39 capabilities are reachable as MCP tools or over HTTP.

Base URL & auth

Served on loopback by the desktop app (never reachable off the machine). Every request needs an API key from Monti Browser (Settings → API), sent as a bearer token.

curl -s -X POST "http://127.0.0.1:39219/v1/profiles/launch-automation" \
  -H "Authorization: Bearer $MONTI_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"profileId":"<id>"}'

Connect Claude or Codex (MCP)

Register the monti MCP server; its tools mirror the HTTP API plus live page control.

{ "mcpServers": { "monti": { "command": "monti-gate", "args": ["mcp"] } } }

All 39 tools

Profiles

  • monti_list_profilesGET /v1/profiles

    List profiles (optional ?folder=<id>).

  • monti_get_profilePOST /v1/profiles/get

    Read one profile: proxy, status, tags, folder, fingerprint.

  • monti_create_profilePOST /v1/profiles/create

    Create a profile.

  • monti_update_profilePOST /v1/profiles/update

    Update name, status, tags, colour, avatar, folder, proxy mode, start URL or launch automation.

  • monti_update_fingerprintPOST /v1/profiles/update-fingerprint

    Re-roll or override a profile's fingerprint.

  • monti_delete_profilePOST /v1/profiles/delete

    Move a profile to Trash (permanent:true to purge).

  • monti_profile_notesPOST /v1/profiles/notes

    Read a profile's notes, newest first.

  • monti_add_profile_notePOST /v1/profiles/notes/add

    Append a note to a profile.

  • monti_launch_profilePOST /v1/profiles/launch-automation

    Open a profile for automation; returns its CDP url. Reuses a running session unless relaunch is set.

  • monti_profile_sessionPOST /v1/profiles/cdp

    Where a running profile's CDP endpoint is, without launching it.

  • monti_close_profilePOST /v1/profiles/close-automation

    Close a session this key opened.

Proxies

  • monti_list_proxiesGET /v1/proxies

    List the proxies in the account's library.

  • monti_assign_proxyPOST /v1/profiles/assign-proxy

    Put a profile on a proxy from the library.

  • monti_check_proxyPOST /v1/proxies/check

    Check a proxy's reachability and egress IP.

Driving a page

MCP tools that drive an open session over CDP — they resolve a port through /v1/profiles/cdp, so they have no REST route of their own.

  • monti_list_tabsMCP tool

    List the open pages in a running profile.

  • monti_navigateMCP tool

    Point the active page at a URL and wait for it to settle.

  • monti_read_pageMCP tool

    Read a page's visible text — whole body or by CSS selector.

  • monti_screenshotMCP tool

    Capture a screenshot of a running page.

  • monti_evalMCP tool

    Evaluate JavaScript in the context of a running page.

Automations

  • monti_list_automationsGET /v1/automations

    List the org's automations, with step counts.

  • monti_automation_schemaGET /v1/automations/schema

    The step catalogue: every step type, its fields, and how they validate. Read this before authoring one.

  • monti_get_automationPOST /v1/automations/get

    Read one automation, including its full step tree.

  • monti_create_automationPOST /v1/automations/create

    Create an automation. Steps are validated before anything is stored.

  • monti_update_automationPOST /v1/automations/update

    Change an automation's name, description, steps or wiring.

  • monti_delete_automationPOST /v1/automations/delete

    Move an automation to Trash.

  • monti_run_automationPOST /v1/automations/run

    Run an automation against a profile, launching it if needed.

  • monti_automation_runsPOST /v1/automations/runs

    Recent runs of one automation, with status and errors.

Connectors

  • monti_list_connectorsGET /v1/connectors

    The workspace's connectors, and the field list of every kind.

  • monti_create_connectorPOST /v1/connectors/create

    Add a connector (owner-only).

  • monti_update_connectorPOST /v1/connectors/update

    Rename a connector, change its config, or make it the default.

  • monti_delete_connectorPOST /v1/connectors/delete

    Delete a connector.

  • monti_test_connectorPOST /v1/connectors/test

    Send a real test message, or a one-word AI completion.

Workspace & notifications

  • monti_list_foldersGET /v1/folders

    The folders profiles, proxies, cookie sets and automations are filed in.

  • monti_list_statusesGET /v1/statuses

    Every status label a profile, proxy or cookie set can carry.

  • monti_table_columnsGET /v1/tables/columns

    What each table shows, and every column it could show.

  • monti_set_table_columnsPOST /v1/tables/columns

    Show or hide columns on a table.

  • monti_telegram_statusGET /v1/telegram

    Whether the notification bot is set up, and who is subscribed.

  • monti_set_telegram_prefPOST /v1/telegram/pref

    Subscribe the signed-in user to one automation's outcomes.

  • monti_set_telegram_botPOST /v1/telegram/bot

    Set the workspace's notification bot (owner-only).

Example: create and run an automation

#!/usr/bin/env node
// Monti Browser automation API example. Keep Monti Browser open and signed in.
const BASE_URL = "http://127.0.0.1:39219";
const TOKEN = process.env.MONTI_API_TOKEN; // create in Settings -> API

async function monti(method, path, body) {
  const res = await fetch(BASE_URL + path, {
    method,
    headers: { Authorization: "Bearer " + TOKEN, "Content-Type": "application/json" },
    body: body ? JSON.stringify(body) : undefined,
  });
  const text = await res.text();
  if (!res.ok) throw new Error(method + " " + path + " -> " + res.status + " " + text);
  return text ? JSON.parse(text) : null;
}

async function main() {
  const { profiles } = await monti("GET", "/v1/profiles");
  const profile = profiles[0];
  if (!profile) throw new Error("Create a profile in Monti Browser first.");

  // Learn the step vocabulary, then create + run an automation.
  await monti("GET", "/v1/automations/schema");
  const { automation } = await monti("POST", "/v1/automations/create", {
    name: "Read a heading",
    steps: [
      { id: "s1", type: "goto", url: "https://example.com" },
      { id: "s2", type: "waitFor", for: "selector", selector: "h1" },
      { id: "s3", type: "extract", selector: "h1", what: "text", into: "heading" },
    ],
  });
  const run = await monti("POST", "/v1/automations/run", {
    automationId: automation.id,
    profileId: profile.id,
  });
  console.log("Run started:", run.runId);
}
main().catch((e) => { console.error(e); process.exit(1); });

Notes for agents

  • Read GET /v1/automations/schema before authoring a step tree — field names aren't guessable and the server rejects an invalid tree, naming the exact path that failed.
  • Every step needs a unique id you supply; don't reuse one.
  • A key may be scoped to folders. A 403 means the key can't see that profile (or can't write org-wide automations) — don't retry.
  • Read the token from MONTI_API_TOKEN; never hardcode it. Launched profiles are anonymous — never pass them credentials.
  • Profile ids are also on-disk directory names — treat them as immutable.

API access is included on the Team and Enterprise plans. Download Monti Browser to create a key.