> ## Documentation Index
> Fetch the complete documentation index at: https://docs.syrto.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Find person

> Resolve a person's name to one or more person IDs, with the companies they are involved in.

`syrto_find_person` resolves a human name into person IDs. Use those IDs in the `people` section of [`syrto_search_companies`](/mcp/tools/search-companies) or [`syrto_aggregate_companies`](/mcp/tools/aggregate-companies) to find every company a person is an officer, shareholder, or beneficial owner of.

## Use this tool to

* Look up a person by name and get their person ID
* Tell apart several people who share a name, using birth date, gender, and their company involvements
* Build the `people` filter for a company search

**Related tools:** For companies rather than people, use [Find company](/mcp/tools/find-company). For a person's contact details, use [Person contacts](/mcp/tools/person-contacts).

<Tip>
  When the person you want is an officer, shareholder or beneficial owner of a company you already have, [`syrto_get_company_structure`](/mcp/tools/company-structure) returns their `person_id` directly. Prefer that: this tool is a name search, so it can land on a namesake.
</Tip>

## Arguments

<ParamField query="name" type="string" required>
  Full name to resolve (max 200 characters). The registry stores names **surname-first** - `"Rossi Mario"`, not `"Mario Rossi"` - and matching is on exact spelling, with no fuzzy matching, so a misspelled name returns nothing.

  Capitalise the name as it is stored. Only the exact-match rung is case-sensitive, so a lower-cased name skips it and answers from the prefix rung instead, losing exact-first ranking.

  Word order is handled for you: when the given order finds nobody, reversed orders are retried automatically.
</ParamField>

<ParamField query="match" type="string">
  How the name is matched.

  | Value      | Behaviour                                                                                                                             |
  | ---------- | ------------------------------------------------------------------------------------------------------------------------------------- |
  | `auto`     | Default. Returns exact full-name matches when there are any, else names starting with the query, else names containing it.            |
  | `exact`    | Only people whose full name is exactly the query. Case-sensitive.                                                                     |
  | `prefix`   | Only names starting with the query.                                                                                                   |
  | `contains` | Names containing the query anywhere. This is the rung that finds compound surnames - `"Conti Marco"` matches `"Bonanno Conti Marco"`. |
</ParamField>

<ParamField query="after" type="string">
  Pagination cursor. Pass `end_cursor` from the prior response with the same name to fetch the next page. A cursor is bound to the match rung it was issued for - pair it with that same `match` value, or drop it to start a new search.
</ParamField>

<ParamField query="language" type="string">
  `"en"` for English (default) or `"it"` for Italian.
</ParamField>

## How matching works

Exactly one of three rungs answers each call: the name matched exactly if anybody carries it, else as a prefix, else as a substring. This is what puts the person you asked for at the top of page 1 - a search for `"Conti Marco"` returns the people actually called that, instead of burying them behind the `"Arconti Marco"` and `"Buoninconti Marco"` that alphabetical order puts first.

The trade-off is that only one rung answers at a time. `warning` names the rung whenever it is not the widest one and says how to widen; widening re-lists the narrower matches alongside the rest.

## Returns

Paginated results:

<ResponseField name="has_next_page" type="boolean">
  Whether another page is available. This tool returns up to 20 people per page.
</ResponseField>

<ResponseField name="end_cursor" type="string | null">
  Cursor for the next page. Pass it back as `after`, together with the name these results were found under - when `warning` names a different word order, use that reordered name.
</ResponseField>

<ResponseField name="items" type="object[]">
  Matching people, each with:

  * `id` - the person ID to use in the `people` search filter
  * `full_name` - name as stored, surname-first
  * `birth_date` and `gender` - raw values, to tell namesakes apart
  * `officerships`, `shareholdings`, `beneficial_ownerships` - up to five each, giving the companies the person is involved with
</ResponseField>

<ResponseField name="warning" type="string | null">
  Present when the match rung was narrower than the widest, when a reversed word order answered instead of the one you typed, or when nothing matched at all.
</ResponseField>

<ResponseField name="credit_balance" type="object | null">
  Beside the results, the response carries the organization's credit balance - `{ "available": ..., "reserved": ... }` - which is what [official documents](/mcp/tools/official-documents) and [person contacts](/mcp/tools/person-contacts) are bought with.

  Absent when no viewer could be resolved for the credential. Absent means "not known", never "none left".
</ResponseField>

<Note>
  The company entries under `officerships`, `shareholdings`, and `beneficial_ownerships` identify their company by `tax_id`, not by company ID. To analyse those companies, collect the tax IDs and pass them to [`syrto_lookup_companies_by_tax_id`](/mcp/tools/lookup-companies-by-tax-id) (up to 20 in one call), then use the company IDs it returns.

  `tax_id` is omitted on the rare entry the registry has no tax ID for, and a tax ID may come back `not_found`. In both cases that company is identifiable by `legal_name` only.
</Note>

<Note>
  When nothing matches, the result is an empty `items` list with guidance in `warning` - not an error.
</Note>

## Example

**Look up a person:**

```json theme={null}
{
  "name": "Rossi Mario"
}
```

**Widen to compound surnames:**

```json theme={null}
{
  "name": "Conti Marco",
  "match": "contains"
}
```

Returns the people called exactly `"Conti Marco"` alongside longer names containing it, such as `"Bonanno Conti Marco"`.
