<!--
Full-page Markdown export (rendered HTML → GFM).
Source: https://neotoma.io/zh/types/contacts
Generated: 2026-04-01T11:48:40.880Z
-->
# 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