linkedin_unipile
Reads LinkedIn messaging (DM) via Unipile. Sending, reacting and changing a
thread — like every act on LinkedIn — is linkedin_unipile_act.
op:
"list" (default): the conversations, paginated (
limit+cursor) — 25 at most per page (LinkedIn's limit): beyond that, paginate bycursor. Each 1-to-1 thread is enriched withattendee_name/attendee_headline/attendee_profile_url(resolved in batch — the rawnameof 1-to-1 threads is null andattendee_provider_idis opaque).with_names=Falseturns off this enrichment (raw payload, one API call fewer). ⚠️ The enrichment may not happen, and the response SAYS so: anattendee_namesfield then appears, with itsstatusand its reason. An absentattendee_nameon a thread therefore does NOT mean "no counterpart" — readattendee_namesbefore concluding, and fall back onnameorlast_message.sender. ⚠️ Do NOT uselast_message.is_senderto know whether YOU wrote last. Observed asfalseon all of an account's threads on 03/09/2026 — including the 22 whose last message came from the account itself, exactly like the threads where the counterpart had replied. The field distinguishes nothing: relying on it leads to concluding a reply on every thread, or the opposite. Comparelast_message.sender_id(orlast_message.sender.display_name) with the account's identity."read": the messages of a thread (
chat_id). Each attachment carries asource: pass it tooto_import(target="project_file") to file it, or to any tool taking asource— the server fetches the file."attendees": participants of a thread (
chat_id)."contacts": your messaging contact book (counterparts). Paginated.
A page of threads with their full last message is heavy (~100,000 characters
for 20): for a sweep, slim it with fields (e.g. ["id", "name", "timestamp", "last_message.sender_id", "last_message.text"]) and
text_max_chars (e.g. 200) — op="list" and op="read".
Tool call template
This tool declares no required parameters. Add optional parameters from the input schema as needed.
{
"id": 1,
"jsonrpc": "2.0",
"method": "tools/call",
"params": {
"arguments": {},
"name": "linkedin_unipile"
}
}Input Schema
| Name | Required | Description | Default |
|---|---|---|---|
| op | No | list (default) | read | attendees | contacts. | list |
| _org | No | Org (id) de CET APPEL. `oto_list_orgs()`. | |
| limit | No | page size (list, read, contacts). | |
| _group | No | Équipe (id) de CET APPEL, sous son org parente. | |
| cursor | No | pagination (list, contacts). | |
| fields | No | op="list"/"read" — keys kept per item (`parent.key` for a sub-key; `id` always kept); a key absent from the whole page is refused. Omitted = every field. | |
| _run_id | No | OBLIGATOIRE à chaque appel dès `run_start` ou `data_claim_next` : sans lui, l'écriture sur une ligne réservée est refusée. Hérité seulement si le serveur tient un run actif — n'y compte pas. | |
| chat_id | No | thread id (read, attendees). | |
| _account | No | Compte à OPÉRER quand plusieurs existent. `oto_identity(op='list')`. | |
| _project | No | Projet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`. | |
| _instance | No | Instance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`. | |
| with_names | No | op="list" — enrichment of counterpart names. | |
| text_max_chars | No | op="list"/"read" — excerpt length of `text` and `last_message.text`, the cut marked `text_truncated`. Omitted = full. |