Connect a client
Step-by-step setup for Claude, ChatGPT, Claude Code, Cursor, VS Code, Gemini CLI and others.
Tools
What an assistant can do, which permission each tool needs and whether it is billed.
What you can ask
Once connected, you work in plain language and the assistant picks the tools:- “Find 100 VPs of Marketing at fintech companies in the UK with 200–1,000 employees.”
- “Who works in sales at stripe.com? Save the ones based in Dublin to my EMEA list.”
- “Find the work email of Satya Nadella at microsoft.com.”
- “What do we know about the person behind jane.doe@acme.io?”
- “How many points do I have left, and what would 500 more leads from that search cost?”
- “Analyse acme.io, tell me who we should sell to, and make lead lists for the best two profiles.”
Transport and protocol
- Transport: Streamable HTTP. Clients that only speak SSE or stdio can connect through a proxy
such as
mcp-remote. - Protocol revisions: MCP 2026-07-28 (stateless,
server/discover, multi-round-trip input), with fallback to 2025-11-25, 2025-06-18 and 2025-03-26 for clients that have not moved yet.
Sign-in and permissions
Assistants connect with OAuth 2.1 — you never paste a key into them. When you connect, Loice asks you to sign in (Google or email and password, as in the app) and shows one approval screen:- Who is asking. An app that identifies itself with a Client ID Metadata Document shows its verified domain; any other app is marked Unverified app. Approve an unverified app only if you started the connection yourself.
- Workspace. The connection works in exactly one workspace, and its calls are billed there. If you belong to more than one, you pick it here.
A tool whose permission the connection lacks — the client asked for less, or your role cannot hold
it — is still listed, and answers
insufficient_scope.
Tokens
Access tokens last an hour. Refresh tokens last 30 days, are renewed on use and live at most 90 days. A refresh token that is used twice revokes the whole connection. Standards the server implements: authorization code with PKCE (S256 only), resource indicators (RFC 8707 — tokens work only for/mcp), iss in the authorization response (RFC 9207), Client
ID Metadata Documents with Dynamic Client Registration as a fallback, protected-resource metadata
(RFC 9728), refresh-token rotation with reuse detection, and token revocation (RFC 7009).
API keys
Automations and scripts with no browser can send a workspace API key instead:Authorization: Bearer loice_sk_…, never in the URL. A key acts for the whole workspace, with
every permission, so keep it in a secret store. See Connect MCP → Other clients.
Ending a connection
Revoke a connection any time in the app under MCP → Connected apps. It also ends when you leave the workspace, when your role no longer allows a permission it holds, or when you change your password.Tools
Resources:
loice://runs/{id} and loice://lists/{id} expose a run or a list to clients that
read resources.
Results. Every tool declares an outputSchema, and every result — an answer, a dry_run
quote or an error — returns structuredContent that conforms to it. The text block repeats it:
a short summary for people, a blank line, then the same structuredContent as compact JSON, so a
client that shows the model only the text still shows it the data. A billed tool’s result adds a
billing block (charged_points, quote_points, price_key, replayed). A get_results row
carries its company once, as person.company.
Every tool description carries its current price, and get_account lists all prices. Call a
billed tool with dry_run: true for an exact quote without charging anything.
Closed-set filters (headcount, seniority, job function, years of experience) are listed in each
tool’s schema, so an assistant picks a valid value instead of guessing; industry labels come from
list_filter_values. A value outside the list is refused for free, and the refusal names the
allowed values (or, for industry, the closest labels).
cancel_run is marked destructive and every billed tool is marked not read-only, so assistants that
honour tool annotations ask before calling them.
The ICP Builder is not offered over MCP: use it in the app.
Search results carry no email unless your workspace already bought it. To get emails for people
from a search, the assistant calls find_email in linkedin mode with each person’s LinkedIn URL,
after quoting the total.
Prompts
Assistants that show MCP prompts (often as slash commands) offer three ready-made workflows:
A prompt only writes the plan into the conversation: it spends nothing, and every billed step is
quoted first. Industry, seniority and function arguments offer completion.
A typical session
1
Quote
The assistant calls
get_account (balance, prices), then search_leads with
dry_run: true to get an exact quote and tells you the cost.2
Run and poll
It calls
search_leads for real, receives a run id, and calls get_run until the run
finishes.3
Page
It reads the results with
get_results, 25 rows per page, instead of repeating the search.4
Save or enrich
It saves the people you want with
add_to_lead_list, or finds verified emails for some of
them with find_email.What is charged
Billing is the same as in the app and the API, at the same prices:
Every billed result says what it cost in
billing.charged_points; a dry_run: true call quotes
the most a call can charge (billing.quote_points) and charges nothing.
Limits
- Spending: the workspace balance is the only limit. A connection has no cap of its own and
no confirmation threshold; a call the balance cannot cover answers
insufficient_creditsand is not charged. - One search at a time: a workspace runs one lead or employee search at a time
(
run_already_active). Follow the live one withget_run, or stop it withcancel_run. - Request budgets: each tool family has a per-workspace request budget, shared with the app
and the API (see Rate limits);
get_accountlists each tool’s budget underlimits. A spent budget answersrate_limitedwith the exactretry_after_seconds, before any billable work, and is never charged. - Sizes:
get_resultsandlist_lead_listsreturn 25 rows per page;search_leadsdelivers up to 10,000 leads per run;add_to_lead_listtakes up to 500 rows per call;get_runwaits at most 25 seconds.
Errors
A business outcome is a tool result withisError: true and
structuredContent.error = { code, message, retryable, charged, retry_after_seconds?, details? }.
The codes are the API’s (see Errors) plus:
card_required, trial_ended and insufficient_credits say what to do in message and carry the
Billing page in details.url, with details.action (attach_card, choose_plan, buy_points) and,
when known, details.required and details.available. A run the balance stops mid-way keeps what it
delivered; get_run then adds stopped_by and billing_url.
Unknown arguments are refused, never ignored.
Server instructions
The server sends these instructions, verbatim, to every assistant when it connects:Changelog
The server reports its version inserverInfo; it is 1.0.0.

