Skip to main content
Loice runs a remote MCP server. An AI assistant that speaks MCP can search for leads, find a company’s employees, find verified emails, enrich contacts and save people to your lead lists — spending points from your workspace at the same prices as the app and the API.

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.”
A good assistant quotes the cost of a large operation before running it; the server tells it to.

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.
There is nothing else to choose. Approving grants every permission your role in that workspace allows, and the connection spends from the workspace balance like the app and the API: no per-connection spend cap and no confirmation threshold. The balance is the only limit. 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_credits and 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 with get_run, or stop it with cancel_run.
  • Request budgets: each tool family has a per-workspace request budget, shared with the app and the API (see Rate limits); get_account lists each tool’s budget under limits. A spent budget answers rate_limited with the exact retry_after_seconds, before any billable work, and is never charged.
  • Sizes: get_results and list_lead_lists return 25 rows per page; search_leads delivers up to 10,000 leads per run; add_to_lead_list takes up to 500 rows per call; get_run waits at most 25 seconds.

Errors

A business outcome is a tool result with isError: 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 in serverInfo; it is 1.0.0.