Two agents, one limit, one refused.

CRM integration

Attio, in your agent's hands and under your limits.

Let an agent keep your CRM current without free rein over it. It queries and reads records, adds people, companies, notes and tasks, and works your lists through named operations, each write counted against a daily limit and read back from Attio.

Connect

API key

bound to api.attio.com

What you create

  • An access token you create
  • Records, List entries, Notes and Tasks: Read-write
  • Object configuration, List configuration and User management: Read
  1. 01In Attio, open Workspace settings, Developers, and create an access token.
  2. 02Give it Records: Read-write, Object configuration: Read and Notes: Read-write.
  3. 03In Anlyon, open Actions, then Integrations, choose Attio and paste the token.
  4. 04Anlyon checks the token with Attio before storing it. It becomes a secret named ATTIO, bound to api.attio.com.

Connecting allows nothing by itself. No API returns the credential afterwards, to you, to the console or to an agent, and Anlyon refuses to send it anywhere but api.attio.com.

Operations

Each one is a named tool, off until you switch it on, and Anlyon makes every call with the credential your agent never sees. Reads return what Attio answers and change nothing. Writes count against a limit you set, can wait for a person, and are read back from Attio wherever it allows.

Reads

Query people

attio-query-people

Find person records with an Attio filter and optional sorts. Changes nothing. Returns up to 10 records with all their attribute values; when 10 come back, pass offset 10, 20 and so on for the next page (fewer than 10 means the last page).

Query companies

attio-query-companies

Find company records with an Attio filter and optional sorts. Changes nothing. Returns up to 10 records with all their attribute values; when 10 come back, pass offset 10, 20 and so on for the next page (fewer than 10 means the last page).

Get record

attio-get-record

Get one person or company by record id, with all its attribute values and its web_url in Attio.

List attributes

attio-list-attributes

List the attributes of an object (people, companies) or a list: slug, title, type, and whether each is multiselect or unique. Use it to find the slugs a filter, sort or list entry update needs. Returns 25 at a time; pass offset 25, 50 and so on for the next page.

List notes

attio-list-notes

List notes, optionally only those on one record (give parent_object and parent_record_id together). Returns 10 notes with title and full content; pass offset 10, 20 and so on for the next page.

Get note

attio-get-note

Get one note by id: its parent record, title, and content as plain text and markdown.

List lists

attio-list-lists

List every list the key can see, with its id, api_slug, name and parent object, in sidebar order. Attio returns all lists in one response; it has no paging for this endpoint.

List entries

attio-list-entries

Find entries in one list with an optional Attio filter and sorts on the list's attributes. Changes nothing. Returns up to 20 entries with their parent record id and entry values; when 20 come back, pass offset 20, 40 and so on for the next page.

Get entry

attio-get-entry

Get one list entry by id: its parent record and its values for the list's attributes.

List tasks

attio-list-tasks

List tasks, optionally only those linked to one record, assigned to one workspace member, or open or completed, oldest first unless sort says otherwise. Returns 25 tasks; pass offset 25, 50 and so on for the next page.

Get task

attio-get-task

Get one task by id: its content, deadline, whether it is completed, linked records and assignees.

Writes

Create person

attio-create-person

Create one person with an email address and a name.

emailfirst_namelast_name

Read back

Read back by record id; the email address must match.

Create company

attio-create-company

Create one company with a name and a domain.

namedomain

Read back

Read back by record id; the domain must match.

Add note

attio-add-note

Add one plain-text note to a person.

record_idtitlecontent

Read back

Read back by note id; the title must match.

Update person job title

attio-update-person-job-title

Set one person's job title, replacing the current one.

record_idjob_title

Read back

Read back by record id; the job title must match.

Set person company

attio-set-person-company

Set the company a person works at, replacing the current one (the company's team list in Attio changes with it).

record_idcompany_record_id

Read back

Read back by record id; the company's record id must match.

Update company description

attio-update-company-description

Set one company's description, replacing the current one.

record_iddescription

Read back

Read back by record id; the description must match.

Delete record

attio-delete-record

Delete one person or company record.

objectrecord_id

Read back

Read back : getting the record must answer 404.

Delete note

attio-delete-note

Delete one note.

note_id

Read back

Read back : getting the note must answer 404.

Add to list

attio-add-to-list

Add a person or company to a list as a new entry with no entry values (set them with update-entry).

listobjectrecord_id

Read back

Read back by entry id; the parent record id must match.

Update entry

attio-update-entry

Set values on one list entry, e.g. {"stage": "Qualified"} (attribute slugs from list-attributes with target lists). Single-value attributes are replaced; values for multiselect attributes are added to the existing ones.

listentry_identry_values

Acknowledged

Sent once and acknowledged; not read back: the attributes it sets are chosen per call and a read-back must name fixed fields, so check the result with get-entry.

Remove entry

attio-remove-entry

Remove one entry from a list, with its entry values. The record itself stays.

listentry_id

Read back

Read back : getting the entry must answer 404.

Create task

attio-create-task

Create one open plain-text task with a deadline, linked to a person or company, optionally assigned to a workspace member by email address.

contentdeadline_atlinked_objectlinked_record_idassignee

Read back

Read back by task id; the content and the linked record must match.

Update task deadline

attio-update-task-deadline

Move one task's deadline.

task_iddeadline_at

Read back

Read back by task id; the stored deadline must equal the one Attio answered the update with.

Complete task

attio-complete-task

Mark one task completed.

task_id

Read back

Read back by task id; is_completed must be true.

Delete task

attio-delete-task

Delete one task.

task_id

Read back

Read back : getting the task must answer 404.

The brake

Suggested limits

  • 100 people created a day
  • 50 companies created a day
  • 500 notes a day
  • 200 job titles updated a day
  • 200 person companies set a day
  • 100 company descriptions updated a day
  • 20 records deleted a day
  • 50 notes deleted a day
  • 200 list entries added a day
  • 500 list entries updated a day
  • 50 list entries removed a day
  • 200 tasks created a day
  • 200 task deadlines moved a day
  • 300 tasks completed a day
  • 50 tasks deleted a day

Shared by every agent, session and key in the environment. You set the number.

Suggested approvals

  • A person approves creating a company
  • A person approves deleting a record
  • A person approves deleting a note
  • A person approves removing a list entry
  • A person approves deleting a task

Installed turned off. The reviewer sees the exact request, and the approved request is the one that runs.

Before you rely on it

  • Attio refuses a second person with the same email, or company with the same domain, so a retry cannot create a duplicate.
  • These write to Attio's standard people and companies. A custom object needs an action you declare.

Use it

1. Connect, from a terminal
npm install -g @anlyonhq/cli
anlyon auth login

# Shows where to create the key, then asks for it without echoing
anlyon connections add attio --secret ATTIO

# From a clone of github.com/AnlyonHQ/anlyon-platform:
# see what would be installed, then switch on one operation
anlyon packs plan ./packs/attio
anlyon packs install ./packs/attio --action create-person --yes
2. Call it from your agent, TypeScript
import { Client } from "@anlyonhq/sdk";

const anlyon = new Client({ apiKey: process.env.ANLYON_AGENT_KEY! });

const { data } = await anlyon.actions.invoke(
  "attio-create-person",
  {
    "email": "sam@example.com",
    "first_name": "Sam",
    "last_name": "Rivera"
  },
);

if (data?.pendingApproval) {
  console.log("Waiting for a person", data.approvalId);
} else {
  console.log(data?.status, data?.responseStatus);
}
Or hand it to Claude Code over MCP
# Claude Code. Sign in with the browser, no key to paste.
claude mcp add --transport http anlyon https://api.anlyon.com/mcp

# Then ask in plain words. Each operation you switched on is a tool.

Prefer to click?

The console does all of it: connect, switch operations on, set the limit, and copy the setup for your agent.

Free tier, no credit card. One command if you use Claude or Cursor.

$ claude mcp add anlyon -- npx -y @anlyonhq/mcp-server