Skip to main content
Glama

linkedin_aiark_search

Read-only

Search LinkedIn-sourced B2B data through AI Ark (bought data, per-credit).

Not interchangeable with linkedin_unipile_search: that one drives YOUR connected LinkedIn session (and is rate-limited by LinkedIn); this one queries AI Ark's index and BILLS CREDITS per returned record.

op:

  • "people" (default): people by company + contact filters. Results do NOT include emails — use linkedin_aiark_person(op="export") for one.

  • "companies": companies by firmographics.

Returns the AI Ark page: content[], totalElements, totalPages.

A read timeout is retried ONCE and then raised with retryable: true — a failure, never an empty page (⚠️ the retry can bill a second time if AI Ark had already processed the first attempt).

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_aiark_search"
  }
}

Input Schema

NameRequiredDescriptionDefault
opNo"people" (default) | "companies".people
_orgNoOrg (id) de CET APPEL. `oto_list_orgs()`.
fullNoTrue = the RAW AI Ark record, every block. The DEFAULT is a sourcing view that drops what sourcing never reads — past positions with the full write-up of every company worked at, education, volunteering, awards, skills, badges, statistics, languages, image URLs, the profile `summary`, birth date, non-LinkedIn social links and the `department` sub-blocks — plus the company blocks repeated identically on all 100 people of one firm. A `size=100` page returned ~3 M characters, past any tool-result cap; measured 10/09/2026, 53 % of what the sourcing view still carried was read by nobody.
pageNozero-based page number. size: 0-100 (default 10).
sizeNo
listsNoexclude records already in saved lists.
_groupNoÉquipe (id) de CET APPEL, sous son org parente.
fieldsNokeep ONLY these keys on each record; the envelope (totals, pagination, trackId) always stays — without it you would think you saw everything. Combine with `full=True` to project the raw record. ⚠️ These are the REAL top-level keys. op="people", default view: `id`, `identifier`, `profile`, `link`, `location`, `industry`, `department`, `company`, `last_updated` (with `full=True`, the blocks the view removes are added). op="companies", the same block as a person's `company`, default view: `id`, `summary`, `link`, `location` (+ `industries`, `technologies`, `keywords`, `naics`, `languages`, `last_updated` with `full=True`). An unrecognized name is **silently discarded**, not refused: a projection of invented names returns records that look EMPTY, and the absence reads as "no data" instead of "wrong key" (signal 717). Omitting `company` is in fact the whole point of the projection — it is the block repeated identically on every person of the same company.
_run_idNoOBLIGATOIRE à 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.
accountNofilters on the company. AI Ark nested DSL — each field takes an include/exclude matcher. Examples: - name: {"name": {"any": {"include": {"mode": "SMART", "content": ["Amazon"]}}}} - location: {"location": {"any": {"include": ["United States"]}}} ⚠️ This is the **HEADQUARTERS**, not "has an office there". A company whose HQ is elsewhere returns `0` even if it employs hundreds of people in the requested country, and the failure is indistinguishable from "nobody matches". Measured on 04/09/2026: `account.location = United Kingdom` on a bank headquartered in New York → 0; `contact.location = United Kingdom` on the same → 89 people. For "who works in this country", filter on `contact.location`. - employee size: {"employeeSize": {"type": "RANGE", "range": [{"start": 1000, "end": 5000}]}} - a company's site: {"domain": {"any": {"include": ["example.com"]}}} — plain list, NOT the SMART wrapper (that one is for `name` only). Combine keys in one object. Keys MEASURED to bite on op="companies": `domain`, `employeeSize`, `location`. `industries`, `technologies`, `naics` answered 400 under the forms tried (a loud failure, but their expected shape is unknown). ⚠️ REFUSED because AI Ark accepts them and silently ignores them, returning the whole database as if it were your filtered result: `website` and `linkedin_url` (filter on `domain` instead) and, on op="companies", `keywords` — dead under every form tried (plain list, `any.include`, SMART wrapper). To target a sector, use `lookalike_domains`, or sort client-side on the records' `keywords` (`full=True`).
contactNoop="people" — filters on the person, e.g. {"seniority": {"any": {"include": ["founder"]}}}. Supports seniority and location. ⚠️ `seniority` is a **normalized level, derived from the job title** — not the title itself. In sectors where the title does not follow the hierarchy (investment banking, consulting), it massively discards the right people: measured on 04/09/2026, adding `seniority: "director"` to a query that returned 89 people brought it down to 2, the first of whom was a human resources director. A "Managing Director" does not carry `director`. Use it to reduce pagination, never as a selection criterion. ⚠️ `title` and `department` are REFUSED for the same reason: AI Ark accepts them and silently ignores them, so you get the company's first page and pay for it. Filter on `seniority`, then sort client-side — `department.departments` IS on every record returned, it just cannot be filtered on.
_projectNoProjet (id) de CET APPEL — jeton PRIMAIRE. `oto_project(op='list')`.
_instanceNoInstance de connecteur PRÉCISE (un credential exact). `oto_instance(op='list')`.
lookalike_domainsNoop="companies" — up to 5 company URLs to find similar ones.

Schema Changelog

Changes observed during successful MCP inspections.

No schema history has been recorded yet.

TDQS

A4.6/5.0
Behavior5/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

readOnlyHint=true only covers the safety profile, and the description adds exactly what the annotation cannot: the call is paid (credits billed per returned record), a read timeout is retried once and then raised with `retryable: true`, and the retry may bill a second time. It also preempts the dangerous misread of an empty result ("a failure, never an empty page"). That is behavior beyond annotations and does not contradict them, since billing is orthogonal to mutating data.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Front-loaded with the identity and the sibling distinction, then the `op` breakdown, then the return shape, then the timeout warning, which is good ordering. It is dense and every block carries information, though a few warning-heavy passages duplicate what the schema descriptions already say, which keeps it short of a 5.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a 14-parameter, no-output-schema tool, the description supplies the missing return shape (`content[]`, `totalElements`, `totalPages`), the billing implication, the retry/failure semantics, and the email gap. An agent has everything it needs to call this correctly and to interpret an empty page.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema description coverage is 93%, so the account/contact/fields filter semantics and their many caveats, including silent-ignore traps, are already carried by the schema. The description adds genuine meaning only for `op`, whose schema description is a bare enumeration, by explaining that people results lack emails and by naming the returned envelope. Useful but marginal over an already-rich schema, so baseline 3 rather than higher.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose5/5

Does the description clearly state what the tool does and how it differs from similar tools?

States a specific verb and resource ("Search LinkedIn-sourced B2B data through AI Ark") and immediately names the sibling it is not ("Not interchangeable with `linkedin_unipile_search`"), with the differentiator spelled out (AI Ark's index + per-credit billing vs the user's connected LinkedIn session). The `op` enumeration splits the two search modes, so an agent can distinguish this from apollo_search_people, linkedin_unipile_search and the apify LinkedIn tools without opening any schema.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines5/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Explicit when-to-use routing against the closest alternative, plus a pointer to the right tool for a sub-need ("Results do NOT include emails — use `linkedin_aiark_person(op=\"export\")` for one"). The billing and rate-limit tradeoff between the two LinkedIn sources is stated as the selection criterion, not left implicit.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

Try in Browser

Glama MCP Gateway

Add one secure layer between your agents and this server.

Resources