From attio-pack
Demonstrates Attio API calls to list objects/attributes, create person records, and query companies. For starting integrations or learning the CRM API.
npx claudepluginhub jeremylongshore/claude-code-plugins-plus-skills --plugin attio-packThis skill is limited to using the following tools:
Five progressively deeper API calls that exercise the Attio object/record model. Every call targets `https://api.attio.com/v2` and returns JSON.
Performs full CRUD operations—create, read, update, delete, search—on Attio records for people, companies, deals, and custom objects via REST API.
Manages Attio CRM records (companies, people, deals), lists/pipelines, notes, tasks via CLI. Use for searching contacts, updating pipelines, creating tasks.
Automates Attio CRM operations: fuzzy search records by name/email/domain, advanced filtered queries on contacts/companies, manage notes, list attributes, and navigate data using natural language via Composio MCP.
Share bugs, ideas, or general feedback.
Five progressively deeper API calls that exercise the Attio object/record model. Every call targets https://api.attio.com/v2 and returns JSON.
attio-install-auth (valid ATTIO_API_KEY in env)object_configuration:read, record_permission:read, record_permission:read-writeEvery Attio workspace has system objects (people, companies) and optional objects (deals, users, workspaces). Custom objects can be created.
curl -s https://api.attio.com/v2/objects \
-H "Authorization: Bearer ${ATTIO_API_KEY}" | jq '.data[] | {slug: .api_slug, singular: .singular_noun}'
{"slug": "people", "singular": "Person"}
{"slug": "companies", "singular": "Company"}
{"slug": "deals", "singular": "Deal"}
Objects have attributes (fields). Use the slug from Step 1.
curl -s "https://api.attio.com/v2/objects/people/attributes" \
-H "Authorization: Bearer ${ATTIO_API_KEY}" | jq '.data[] | {slug: .api_slug, type: .type}'
Common people attributes: name (personal-name), email_addresses (email-address), phone_numbers (phone-number), description (text), primary_location (location), company (record-reference).
const person = await attioFetch<{ data: { id: { record_id: string } } }>({
method: "POST",
path: "/objects/people/records",
body: {
data: {
values: {
email_addresses: ["ada@example.com"],
name: [
{
first_name: "Ada",
last_name: "Lovelace",
full_name: "Ada Lovelace",
},
],
description: ["First computer programmer"],
},
},
},
});
console.log("Created person:", person.data.id.record_id);
Key detail: Values are keyed by attribute slug. Most attributes accept an array (Attio supports multiselect by default). String shortcuts work for emails and domains.
// List people whose email contains "example.com"
const results = await attioFetch<{
data: Array<{ id: { record_id: string }; values: Record<string, any> }>;
}>({
method: "POST",
path: "/objects/people/records/query",
body: {
filter: {
email_addresses: {
email_address: { $contains: "example.com" },
},
},
sorts: [
{
attribute: "created_at",
field: "created_at",
direction: "desc",
},
],
limit: 10,
},
});
console.log(`Found ${results.data.length} people`);
// Create company
const company = await attioFetch<{ data: { id: { record_id: string } } }>({
method: "POST",
path: "/objects/companies/records",
body: {
data: {
values: {
name: ["Acme Corp"],
domains: ["acme.com"],
description: ["Enterprise widget manufacturer"],
},
},
},
});
// Update person to link to company via record-reference
await attioFetch({
method: "PATCH",
path: `/objects/people/records/${person.data.id.record_id}`,
body: {
data: {
values: {
company: [
{
target_object: "companies",
target_record_id: company.data.id.record_id,
},
],
},
},
},
});
Workspace
└── Objects (people, companies, deals, custom)
├── Attributes (name, email, phone, custom)
└── Records (individual people, companies)
└── Values (attribute data on each record)
└── Lists (pipelines, boards, custom groupings)
└── Entries (records added to a list with list-specific attributes)
| Error | Status | Cause | Solution |
|---|---|---|---|
not_found | 404 | Wrong object slug or record ID | Verify slug with GET /v2/objects |
validation_error | 422 | Invalid attribute value format | Check attribute type in docs |
insufficient_scopes | 403 | Token missing write scope | Add record_permission:read-write |
duplicate_record | 409 | Record with same unique field exists | Use PUT (assert) instead |
Proceed to attio-local-dev-loop for development workflow, or attio-core-workflow-a for record CRUD patterns.