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.
MCP · Claude Code · Cursor · VS Code · Codex
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.
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.
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.
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.
Every member of a project can create one in the console, up to ten active tokens per project.
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.
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.
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.
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.
Run once in a terminal, in your app’s folder.
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:
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/mcp.json, or .cursor/mcp.json in your project.
{
"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:
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.
.vscode/mcp.json in your project.
{
"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/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:
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:
security add-generic-password -a "$USER" -s lotse-mcp-token -w
Then start your agent with it, here Claude Code:
LOTSE_MCP_TOKEN="$(security find-generic-password -a "$USER" -s lotse-mcp-token -w)" claude
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.
get_projectReadName, handle, link domain, apps, suspension and quotas.
list_segmentsReadYour saved segments.
count_segmentReadHow many devices match a saved segment or a predicate.
create_segmentWriteSaves a segment and tells how many devices it holds.
list_webhook_deliveriesReadThe webhook delivery log: event, endpoint up to the host, status, attempts and last status code. Never the payload or a secret.
diagnose_setupReadThe 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_linksReadShort links with their click counts.
get_linkReadOne link, its target and its clicks.
get_acquisitionReadClicks, installs, still active after seven days and goal events, per campaign, source and medium.
create_linkPublishCreates a short link, within the link quota.
get_overviewReadActive devices, installs, sessions, top events and screens.
get_funnelReadConversion between ordered events, split by campaign or platform.
get_retentionReadCohorts by install week, back on day 1, 7 and 30.
explore_eventsReadOne event over time, split by property, platform, version or campaign.
list_eventsReadThe raw event stream, newest first.
list_devicesReadInstalls, most recently seen first.
get_device_timelineReadEverything about one device: origin, events, feedback, pushes.
list_usersReadIdentified users with their traits and devices.
get_user_timelineReadEverything about one user, across devices.
list_heatmap_screensReadScreens with recorded taps and rage taps, most tapped first.
get_heatmapReadTaps per screen as a grid of numbers, without the background image.
list_feedbackReadThe inbox, filtered like in the console.
get_feedbackReadOne message with its context, the events before it and the conversation. No screenshot, no replay.
reply_to_feedbackPublishAnswers the one person who wrote, as a push to their device.
set_feedback_statusPublishOpen, in progress, done or dismissed. The sender sees the status in the conversation.
list_feature_requestsReadThe feature board with its votes.
create_feature_requestPublishAdds an idea to the board, within the quota.
set_feature_request_statusPublishMoves an idea, for example to planned or shipped.
list_surveysReadSurveys and their state.
get_survey_reportReadResults of one survey and its newest comments.
list_campaignsReadPush campaigns with their delivery state.
get_campaign_reportReadRecipients, sent, opened and reached the goal.
list_in_app_messagesReadIn-app messages and their state.
get_in_app_reportReadHow many devices saw, tapped and dismissed one message.
list_messagesReadPushes your backend sent to one user or install through the server API, with status, deliveries and opens.
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.
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.
Per token. Failed and refused calls count too; listing the tools does not.
Per token, counted within the 600. A typo in an argument does not cost a write.
Per project, shared by all its tokens. A new token gets a fresh budget, the project does not.
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.
While a project is suspended, its tokens still read but every write tool is refused, even the ones the console allows for tidying up.
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.
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 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.
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.
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.
dart pub global activate skills
skills get --package lotse --all
lotse-setuplotse-eventslotse-deep-linkslotse-pushlotse-feedbacklotse-mcplotse-server-apiFree during the beta. Sign up, create a project, add the SDK.