MCP server for AI assistants
Incogniton runs a hosted Model Context Protocol (MCP) server. Connect an AI assistant to it, such as Claude Code, Claude Desktop, Cursor, VS Code or Windsurf, and the assistant can search, create and edit your profiles, proxies, groups and tags, and launch and stop profiles in your Incogniton desktop app.
Unlike the local automation API, the MCP server runs in the cloud and works with your Incogniton account through a personal token. When the assistant launches a profile, the request goes to your desktop app, which must be running and logged in.
MCP manages and launches profiles, but it doesn't browse: there are no tools to open pages, click or read content. To work inside a page, attach Playwright or Puppeteer to the cdp_url that a launch returns, as shown in Launch a profile and attach Playwright.
Get a token
In the Incogniton app, go to My Account → Settings → MCP Token and click Generate Token. The token starts with mcp_live_.
Treat the token like a password: anyone who has it can create, change, delete and launch your profiles. Keep it in your MCP client's config, never in code or chat. If it leaks, generate a new one in the app; the old one stops working.
Connect your AI client
Every client runs the stdio bridge @incogniton/mcp through npx (Node.js 18 or later). The bridge forwards requests to https://v5api.incogniton.com/mcp. Replace mcp_live_YOUR_TOKEN with your token.
Add the Incogniton MCP server
claude mcp add incogniton --scope user --env INCOGNITON_MCP_TOKEN=mcp_live_YOUR_TOKEN -- npx -y @incogniton/mcp
For Claude Desktop, Cursor and Windsurf, add the JSON to the client's MCP config file, for example claude_desktop_config.json for Claude Desktop or ~/.cursor/mcp.json for Cursor. For VS Code, add it to .vscode/mcp.json in your workspace. The Incogniton app can also generate these snippets with your token already filled in, under Settings → Automation → MCP.
To check that the bridge can reach the server, run:
Terminal
npx -y @incogniton/mcp --health
Then restart your AI client. The Incogniton tools appear in its tool list.
Tools
The server provides 19 tools:
| Area | Tools | Notes |
|---|---|---|
| Profiles | search_profiles, create_profiles, edit_profile, clone_profile | create_profiles needs only profile_names; proxy, fingerprint, group and tags are optional |
| Proxies | search_proxies, create_proxies | create_proxies needs proxy_urls and proxy_schemes |
| Organisation | search_profile_groups, create_profile_groups, search_proxy_groups, create_proxy_groups, search_tags, create_tags, search_team_members | |
| Helpers | get_all_creation_info, get_profile_languages | List the groups, tags, proxies and language codes you can use when creating profiles |
| Launching | get_eligible_sessions, launch_profile, get_launch_status, stop_profile | See Launch a profile and attach Playwright |
Tool results are written for the model: usually a sentence followed by a JSON block. If you call the tools from your own code, parse the JSON block. The automation examples repository has a helper for this, extractJson.
Launch a profile and attach Playwright
- Launch. Call
launch_profilewith the profile'sprofile_browser_ID. This creates a launch request, which your desktop app picks up within seconds. The request expires aftertimeout_seconds(30 to 300, default 300). - Get the DevTools URL. Call
get_launch_statuswith the sameprofile_browser_ID. When your request isLAUNCHEDand the browser is still running, its entry has acdp_url, for examplehttp://127.0.0.1:55923. If it doesn't,cdp_unavailable_reasonsays why (for example, the browser was closed). Query by profile, not byrequest_id: by request id, the tool returns a text summary withoutcdp_url. - Attach Playwright or Puppeteer to the
cdp_url. In Playwright, use the profile's own context,browser.contexts()[0], so its cookies and storage are there. - Stop. Close the browser over CDP with
Browser.close, as in the snippet below. Alternatively, callstop_profile, which works only for profiles launched through MCP. It returns a stop request id; pollget_launch_statuswithinclude_stop_requestsuntil that stop request isSTOPPED, and match on the stop request's own id rather than the launch's.
Attach to a profile launched through MCP
import { chromium } from 'playwright'
// cdpUrl: the cdp_url from get_launch_status
const browser = await chromium.connectOverCDP(cdpUrl)
// The profile's own context, with its cookies and storage.
// browser.newContext() would start an empty one.
const context = browser.contexts()[0]
const page = await context.newPage()
await page.goto('https://example.com')
// Close the browser itself; browser.close() would only disconnect.
const cdp = await browser.newBrowserCDPSession()
await cdp.send('Browser.close')
Closing over CDP is the safer way to stop: current app versions terminate the browser on stop_profile, which can lose cookies and localStorage written in the last few seconds. A normal close doesn't.
If your account has more than one logged-in desktop session, launch_profile doesn't launch. It asks for a target_session_id instead. List the sessions with get_eligible_sessions. Device names can show as "Unknown Device", and a launch sent to another session opens the profile on that device. This computer's session id is in the Incogniton app log, on the line authenticated successfully (session_id=...).
cdp_url is a loopback address on the computer that runs the Incogniton app, and its port changes on every launch. Only code running on that same computer can connect to it: Claude Code or a script in a terminal there works, Claude Desktop on another computer doesn't. Returning cdp_url also needs a desktop app version that reports the DevTools port for MCP launches. With older versions, launching and stopping work, but get_launch_status returns only cdp_unavailable_reason.
A complete, runnable version of this flow is the launch-with-mcp-and-attach-playwright example in the automation examples repository. For how profiles keep cookies and storage between runs, see Lifecycle and persistence.
Example prompts
These work in any MCP client. The tools in brackets are the ones the assistant is expected to call.
- "Create 3 profiles called shop-1 to shop-3 in the group Shops, Windows, latest browser." [
search_profile_groups→create_profiles] - "Which profiles use the proxy at 203.0.113.10?" [
search_proxies→search_profiles] - "Clone the profile shop-1 twice." [
search_profiles→clone_profile] - "Launch shop-1 on this computer and give me its DevTools URL." [
search_profiles→launch_profile→get_launch_status] - "Stop shop-1." [
stop_profile→get_launch_status]
For work inside pages, a coding agent on the same computer, such as Claude Code, can take the cdp_url and run Playwright, as in the snippet above.
Troubleshooting
| Symptom | Cause | Fix |
|---|---|---|
| The tools don't appear in the client | The bridge didn't start, or the token is missing | Run npx -y @incogniton/mcp --health, check INCOGNITON_MCP_TOKEN in the client config, and restart the client |
401 or 403 from the server | The token was revoked or mistyped | Generate a new token in the app |
The launch stays PENDING, then EXPIRED | The target session's app isn't running or logged in, or the session is on another device | Start the app on that computer, or target this computer's session |
LAUNCHED, but no cdp_url | The browser is already closed, or the app exposes no DevTools port for it | Read cdp_unavailable_reason, allow browser remote control in the app, or update the app |
Connection refused on cdp_url | The connecting code runs on a different computer, or the browser closed | Run the code on the computer with the Incogniton app, and check get_launch_status again |
stop_profile says the profile wasn't launched through MCP | It was opened from the app or the local API | Close it in the app, or stop it with the local API |