MCP · Claude Code · Cursor · VS Code · Codex

Ask your own agent.It knows your Lotse project.

Connect Claude Code, Cursor, VS Code or Codex to one Lotse project. Your agent reads numbers, feedback and links and, if you let it, creates links and segments or answers feedback.

LiveLive on the production instance. Accepted with Claude Code and Codex.

Your agent, your project.Lotse runs no AI of its own.

Reads what the console shows

Overview, funnels, retention, events, devices, links, campaigns, feedback, surveys and heatmaps, with the same numbers and time ranges as the console. Ask “why does the checkout funnel drop off?” right in your editor.

Acts only where it is harmless

With a write token it saves segments, which only your team sees. Answering feedback, setting the status of feedback and ideas, adding ideas to the board and creating links reach your users, so they need a publish token. It cannot send a campaign and cannot delete anything.

Bound to one project

A token belongs to exactly one project. No tool takes a project parameter, so an agent cannot ask for anyone else’s data. Which agent and which AI provider you use is up to you.

Get a token

Every member of a project can create one in the console, up to ten active tokens per project.

  1. 1

    Open AI agents

    In the console, open the project settings and scroll to the section AI agents. Choose Create token and give it a name you will recognise later, such as the tool and your name.

  2. 2

    Pick level and lifetime

    Read lets the agent use every read tool. Read and write adds the write tools only your team sees. Read, write and publish adds the tools that reach your users: replies to feedback, ideas on the board and links. Pick the lowest level that does the job. The token expires after 30, 90 or 365 days; there is no token without an expiry date.

  3. 3

    Copy it, once

    The token starts with lt_at_ and is shown exactly once, next to the snippets below. Lotse keeps only a hash of it. Revoke it in the same place. It also stops working when it expires, and is revoked when you leave the project or are removed from it.

Connect your agent

The same snippets the console shows. None of them holds your token: the configs name a variable, and the token goes into it when you start your agent.

Claude Code

Run once in a terminal, in your app’s folder.

Terminal
claude mcp add --transport http --scope local lotse https://api.lotse.dev/mcp --header 'Authorization: Bearer ${LOTSE_MCP_TOKEN}'

Then start it from a terminal and paste your token; it is not shown:

Terminal
printf 'Lotse token: ' && read -rs LOTSE_MCP_TOKEN && echo && export LOTSE_MCP_TOKEN && claude

Claude Code stores only the variable name, in ~/.claude.json for this folder. Keep the single quotes, or the shell writes the token itself into the config.

Cursor

~/.cursor/mcp.json, or .cursor/mcp.json in your project.

.cursor/mcp.json
{
  "mcpServers": {
    "lotse": {
      "url": "https://api.lotse.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${env:LOTSE_MCP_TOKEN}"
      }
    }
  }
}

Then start it from a terminal and paste your token; it is not shown:

Terminal
printf 'Lotse token: ' && read -rs LOTSE_MCP_TOKEN && echo && export LOTSE_MCP_TOKEN && cursor .

The file only names the variable. Quit Cursor first: started from the Dock or a menu, it does not see the variable.

VS Code

.vscode/mcp.json in your project.

.vscode/mcp.json
{
  "inputs": [
    {
      "type": "promptString",
      "id": "lotse-token",
      "description": "Lotse agent token",
      "password": true
    }
  ],
  "servers": {
    "lotse": {
      "type": "http",
      "url": "https://api.lotse.dev/mcp",
      "headers": {
        "Authorization": "Bearer ${input:lotse-token}"
      }
    }
  }
}

VS Code asks for the token on first start and keeps it in its secret storage.

Codex

~/.codex/config.toml.

~/.codex/config.toml
[mcp_servers.lotse]
url = "https://api.lotse.dev/mcp"
bearer_token_env_var = "LOTSE_MCP_TOKEN"

Then start it from a terminal and paste your token; it is not shown:

Terminal
printf 'Lotse token: ' && read -rs LOTSE_MCP_TOKEN && echo && export LOTSE_MCP_TOKEN && codex

The file only names the variable; Codex sends its value as the bearer token.

Keep the token off the command line and out of your shell profile: shell history keeps every command, and other programs can see the arguments of a running one. To skip pasting it at every start, keep it in the keychain. On a Mac, store it once; security asks for it:

Terminal · macOS
security add-generic-password -a "$USER" -s lotse-mcp-token -w

Then start your agent with it, here Claude Code:

Terminal · macOS
LOTSE_MCP_TOKEN="$(security find-generic-password -a "$USER" -s lotse-mcp-token -w)" claude

35 tools.Grouped by pillar.

Read tools work with every token. Write tools need Read and write, the ones that reach your users need Read, write and publish, and both are refused while the project is suspended. Each one does what the console does, with the same quotas and checks.

Foundation

  • get_projectRead

    Name, handle, link domain, apps, suspension and quotas.

  • list_segmentsRead

    Your saved segments.

  • count_segmentRead

    How many devices match a saved segment or a predicate.

  • create_segmentWrite

    Saves a segment and tells how many devices it holds.

  • list_webhook_deliveriesRead

    The webhook delivery log: event, endpoint up to the host, status, attempts and last status code. Never the payload or a secret.

Acquire

  • diagnose_setupRead

    The setup diagnosis: App Links, fingerprints, traffic and APNs. Up to 10 runs an hour per project for all agents, apart from the console’s.

  • list_linksRead

    Short links with their click counts.

  • get_linkRead

    One link, its target and its clicks.

  • get_acquisitionRead

    Clicks, installs, still active after seven days and goal events, per campaign, source and medium.

  • create_linkPublish

    Creates a short link, within the link quota.

Understand

  • get_overviewRead

    Active devices, installs, sessions, top events and screens.

  • get_funnelRead

    Conversion between ordered events, split by campaign or platform.

  • get_retentionRead

    Cohorts by install week, back on day 1, 7 and 30.

  • explore_eventsRead

    One event over time, split by property, platform, version or campaign.

  • list_eventsRead

    The raw event stream, newest first.

  • list_devicesRead

    Installs, most recently seen first.

  • get_device_timelineRead

    Everything about one device: origin, events, feedback, pushes.

  • list_usersRead

    Identified users with their traits and devices.

  • get_user_timelineRead

    Everything about one user, across devices.

  • list_heatmap_screensRead

    Screens with recorded taps and rage taps, most tapped first.

  • get_heatmapRead

    Taps per screen as a grid of numbers, without the background image.

Listen

  • list_feedbackRead

    The inbox, filtered like in the console.

  • get_feedbackRead

    One message with its context, the events before it and the conversation. No screenshot, no replay.

  • reply_to_feedbackPublish

    Answers the one person who wrote, as a push to their device.

  • set_feedback_statusPublish

    Open, in progress, done or dismissed. The sender sees the status in the conversation.

  • list_feature_requestsRead

    The feature board with its votes.

  • create_feature_requestPublish

    Adds an idea to the board, within the quota.

  • set_feature_request_statusPublish

    Moves an idea, for example to planned or shipped.

  • list_surveysRead

    Surveys and their state.

  • get_survey_reportRead

    Results of one survey and its newest comments.

Engage

  • list_campaignsRead

    Push campaigns with their delivery state.

  • get_campaign_reportRead

    Recipients, sent, opened and reached the goal.

  • list_in_app_messagesRead

    In-app messages and their state.

  • get_in_app_reportRead

    How many devices saw, tapped and dismissed one message.

  • list_messagesRead

    Pushes your backend sent to one user or install through the server API, with status, deliveries and opens.

Deliberately not

  • Creating, sending or scheduling a campaign. An agent that gets it wrong should not reach ten thousand phones.

  • Activating an in-app message or a survey.

  • Deleting anything.

  • API keys, members, push credentials, new projects.

  • CSV export, screenshots and replays.

Limits

Generous for real work, tight enough that an agent stuck in a loop is slowed down. Over a limit, the tool says how long to wait.

600 calls an hour

Per token. Failed and refused calls count too; listing the tools does not.

60 writes an hour

Per token, counted within the 600. A typo in an argument does not cost a write.

6,000 calls an hour

Per project, shared by all its tokens. A new token gets a fresh budget, the project does not.

Results up to 100 KiB

A larger result is trimmed from the end of its longest list and says how to continue: the next offset or cursor, or a narrower question.

Suspended means read only

While a project is suspended, its tokens still read but every write tool is refused, even the ones the console allows for tidying up.

Replies in your name

A reply to feedback sent by an agent appears in the console under the name of the member who created the token. The app user sees a reply from your team.

Data protection

What the agent reads goes to your AI provider

Lotse runs no AI. Your agent sees what your app sent to Lotse, as it was sent: user IDs, traits, event properties, feedback texts and the metadata your app attaches to feedback. All of it goes to the AI provider you use with the agent. As the controller of your users’ data, you choose that provider and decide whether it is right for them. Prefer pseudonymous user IDs over e-mail addresses.

What an agent never gets

What Lotse collects itself stays with Lotse: screenshots, replays, heatmap images and the contact e-mail of a feedback message, push tokens, install IDs, the hashed IP addresses of link clicks and user agents. Keys neither.

What Lotse stores

Tokens only as a hash, with name, level, creator, expiry and last use. Every call is logged with tool, project, token ID, duration and outcome, never with the token or the arguments.

Privacy policy

Skills for your agent

Seven skills teach a coding agent to build Lotse into a Flutter app and its backend the right way, with only the public SDK API and the server API. They ship with the SDK, lotse-server-api from lotse 0.2.0 on.

In your app, the skills CLI installs them from the lotse package, and again after every update.

Terminal
dart pub global activate skills
skills get --package lotse --all
lotse-setup
Lotse.init, the public key, the Android manifest and App Links, Firebase, and the setup diagnosis.
lotse-events
track, naming events, props without personal data, screen views with go_router, identify and reset.
lotse-deep-links
Links and target routes, deferred deep linking, testing with adb.
lotse-push
The token, the lotse_push channel, payload targets, APNs.
lotse-feedback
showFeedback, LotseConfidential and LotseUnmasked, replay, conversations, the board and surveys.
lotse-mcp
Connecting to the MCP server, the tools, and recipes such as “why does the funnel drop off?”.
lotse-server-api
Your backend and Lotse: server keys, pushes to one user, server events, deleting users, and webhooks with their signatures.

Set your course.First project in ten minutes.

Free during the beta. Sign up, create a project, add the SDK.