Attio Agent Rules
Behavioral rules for querying and presenting Attio people data
Attio People Agent Rules
Attio Profile
The profile at <a href="/ui/context.connections.profiles" class="bullet-pill"><img src="/icons/bullets/ui.svg" alt="ui" class="bullet-pill-icon" /><span class="pill-name">Connection Profiles</span></a> shows:
- People attributes — which attributes exist and how populated they are
- Linked objects — what other objects (companies, etc.) are connected to people
- Data patterns — common job titles, sample values
Check the profile before querying to know which attributes are actually populated in this workspace. Don't filter on attributes with 0% population.
Interpret Intent, Not Just Words
Users say "people at Stripe" not {"company": {"$contains": "rec_abc"}}. They say "engineers" not {"job_title": {"$contains": "Engineer"}}.
The pattern: Understand what they want → construct filters → run the query → present results clearly.
Query Mapping
Translate natural language to Attio filters:
| User says | Filter |
|---|---|
| "at [company]" | {"company": {"$contains": "..."}}* |
| "with email" | {"email_addresses": {"$not_empty": true}} |
| "without email" | {"email_addresses": {"$is_empty": true}} |
| "engineers" / "developers" | {"job_title": {"$contains": "Engineer"}} |
| "CEOs" / "founders" | Use $or with multiple title patterns |
| "added recently" / "new" | {"created_at": {"$gt": "date"}} |
| "@domain.com emails" | {"email_addresses": {"$contains": "@domain.com"}} |
*For company filters, you'd need the company record ID. If unknown, note this limitation.
Presenting Results
Lead with what matters. For people: name, email, job title, company.
Keep it scannable. For small results (≤10), list each person. For larger results, summarize with counts and offer to show details.
Format consistently:
👤 Jane Smith
Senior Engineer at Acme Corp
jane@acme.com
👤 John Doe
CEO at Startup Inc
john@startup.io
Pagination
The code handles pagination automatically. For large result sets:
- Report total count: "Found 150 people matching your criteria"
- Show a sample: first 5-10 results
- Offer options: "Want me to show more, or narrow the search?"
Limitations
No company lookup by name. Company filters need record IDs. If user asks for "people at Acme Corp" and you don't have the ID, explain: "I'd need to look up Acme Corp's record ID first. For now, I can search by job title, email domain, or other attributes."
Read-only. This skill queries people, it doesn't create or modify records.
Error Handling
- No results: "No people found matching those criteria. Want to broaden the search?"
- API error: Report the issue clearly, suggest retrying
- Invalid filter: Explain what went wrong with the filter syntax
When Results Are Exported
Full query results are saved to the session folder. Mention this when relevant: "Full results saved if you need the raw data."
# Attio People Agent Rules
## Attio Profile
The profile at ``./documents/connections/[service-name].md`` shows:
- **People attributes** — which attributes exist and how populated they are
- **Linked objects** — what other objects (companies, etc.) are connected to people
- **Data patterns** — common job titles, sample values
Check the profile before querying to know which attributes are actually populated in this workspace. Don't filter on attributes with 0% population.
## Interpret Intent, Not Just Words
Users say "people at Stripe" not `{"company": {"$contains": "rec_abc"}}`. They say "engineers" not `{"job_title": {"$contains": "Engineer"}}`.
**The pattern:** Understand what they want → construct filters → run the query → present results clearly.
## Query Mapping
Translate natural language to Attio filters:
| User says | Filter |
| -------------------------- | --------------------------------------------------- |
| "at [company]" | `{"company": {"$contains": "..."}}`\* |
| "with email" | `{"email_addresses": {"$not_empty": true}}` |
| "without email" | `{"email_addresses": {"$is_empty": true}}` |
| "engineers" / "developers" | `{"job_title": {"$contains": "Engineer"}}` |
| "CEOs" / "founders" | Use `$or` with multiple title patterns |
| "added recently" / "new" | `{"created_at": {"$gt": "date"}}` |
| "@domain.com emails" | `{"email_addresses": {"$contains": "@domain.com"}}` |
\*For company filters, you'd need the company record ID. If unknown, note this limitation.
## Presenting Results
**Lead with what matters.** For people: name, email, job title, company.
**Keep it scannable.** For small results (≤10), list each person. For larger results, summarize with counts and offer to show details.
**Format consistently:**
```
👤 Jane Smith
Senior Engineer at Acme Corp
jane@acme.com
👤 John Doe
CEO at Startup Inc
john@startup.io
```
## Pagination
The code handles pagination automatically. For large result sets:
- Report total count: "Found 150 people matching your criteria"
- Show a sample: first 5-10 results
- Offer options: "Want me to show more, or narrow the search?"
## Limitations
**No company lookup by name.** Company filters need record IDs. If user asks for "people at Acme Corp" and you don't have the ID, explain: "I'd need to look up Acme Corp's record ID first. For now, I can search by job title, email domain, or other attributes."
**Read-only.** This skill queries people, it doesn't create or modify records.
## Error Handling
- **No results:** "No people found matching those criteria. Want to broaden the search?"
- **API error:** Report the issue clearly, suggest retrying
- **Invalid filter:** Explain what went wrong with the filter syntax
## When Results Are Exported
Full query results are saved to the session folder. Mention this when relevant: "Full results saved if you need the raw data."