<!--
  Full-page Markdown export (rendered HTML → GFM).
  Source: https://neotoma.io/ar/types/contacts
  Generated: 2026-04-01T11:48:41.077Z
-->
# Contacts

People, companies, roles, and the relationships between them. Contacts are a common entity type in Neotoma - they anchor relationships, tasks, transactions, and decisions to real-world identities.

## Store[#](#store)

Store a contact with any fields that describe it. Neotoma auto-discovers the schema from the first observation - no migration required.

MCP

store\_structured({ entities: \[ { entity\_type: "contact", name: "Sarah Chen", email: "sarah@example.com", company: "Acme Corp", role: "VP Engineering", relationship: "client" } \], idempotency\_key: "contact-sarah-chen-1710268800" })

CLI

neotoma store --json='\[{ "entity\_type": "contact", "name": "Sarah Chen", "email": "sarah@example.com", "company": "Acme Corp", "role": "VP Engineering", "relationship": "client" }\]'

REST API

curl -X POST http://localhost:3080/api/store \\ -H "Content-Type: application/json" \\ -d '{ "entities": \[{ "entity\_type": "contact", "name": "Sarah Chen", "email": "sarah@example.com", "company": "Acme Corp", "role": "VP Engineering", "relationship": "client" }\] }'

Common fields for `contact`:

| Field | Example |
| --- | --- |
| name | "Sarah Chen" |
| email | "sarah@example.com" |
| company | "Acme Corp" |
| role | "VP Engineering" |
| relationship | "client" |

Fields are flexible - add any property your workflow needs. The schema evolves automatically via [progressive schema enforcement](/schema-management).

## Retrieve[#](#retrieve)

Query contacts by type, search by keyword, inspect version history, and traverse relationships.

CLI

\# List all contacts neotoma entities list --type contact # Search by name or identifier neotoma entities search --query "Sarah Chen" --type contact # Inspect full history for one contact neotoma observations list --entity-id <entity\_id> # See related entities (tasks, transactions, etc.) neotoma relationships list --entity-id <entity\_id>

MCP

// Find by identifier retrieve\_entity\_by\_identifier({ identifier: "Sarah Chen", entity\_type: "contact" }) // List contacts with filters retrieve\_entities({ entity\_type: "contact", limit: 20 }) // Expand relationships retrieve\_related\_entities({ entity\_id: "<entity\_id>", relationship\_types: \["REFERS\_TO", "PART\_OF"\] })

## What your agent can answer[#](#example-queries)

With contacts stored in Neotoma, your agent can answer questions like:

-   “Who did I last meet with at Acme Corp?”
-   “Show all contacts linked to the Q4 proposal”
-   “What changed about Sarah's record since January?”

## What Neotoma guarantees[#](#guarantees)

Every contact stored in Neotoma gets the same set of integrity guarantees:

-   Versioned history - Every change creates a new version. Previous states are always accessible.
-   Deterministic state - Same observations always produce the same entity snapshot.
-   Auditable provenance - Every field traces back to the observation that set it.
-   Schema validation - Fields conform to the discovered or defined schema.

See all [memory guarantees](/memory-guarantees) compared across memory models.

## Next steps[#](#next-steps)

-   [Install Neotoma](/install) \- get started in 5 minutes
-   [Walkthrough](/developer-walkthrough) \- full multi-session example
-   [CRM use case](/crm) \- see how contacts fit into a broader workflow