Provider REST API

CRM

Connect Claude to Attio

Query records, lists, notes and tasks in Attio's configurable CRM data model. Toolspoke puts 13 of its actions behind one MCP endpoint that Claude, Cursor, and Codex all speak.

Connection
Provider REST API
Authentication
Workspace API key
Actions exposed
13
Cost per call (typical)
1 credit
Adapter
Maintained by Toolspoke

Connected in three steps

  1. 1

    Install Attio

    Open the marketplace in your workspace, add Attio to the project your agents work in, and it appears on the gateway immediately.

  2. 2

    Connect the credential

    Authenticate with workspace api key. Where to get one, and what it has to be able to reach, is the next section.

  3. 3

    Point your agent at the gateway

    Give your client one address, https://toolspoke.com/mcp. Claude Code takes it as a command, Claude and Claude Desktop add it as a custom connector, and Cursor, Codex and VS Code each read it from a config file of their own.

.mcp.json
{
  "mcpServers": {
    "toolspoke": {
      "type": "http",
      "url": "https://toolspoke.com/mcp"
    }
  }
}

One block covers every tool you have installed. Attio shows up in the client as soon as your policy allows it, and so does everything else you install later.

Where the address goes, per client

Claude Code

Run it in your project, then /mcp to sign in

claude mcp add --transport http toolspoke https://toolspoke.com/mcp
Claude and Claude Desktop

Settings, then Connectors, then Add custom connector

https://toolspoke.com/mcp
Cursor

~/.cursor/mcp.json, or .cursor/mcp.json for one project

{ "mcpServers": { "toolspoke": { "url": "https://toolspoke.com/mcp" } } }
Codex

~/.codex/config.toml

[mcp_servers.toolspoke]
url = "https://toolspoke.com/mcp"
VS Code

.vscode/mcp.json, or the MCP: Add Server command

{ "servers": { "toolspoke": { "type": "http", "url": "https://toolspoke.com/mcp" } } }

What Attio asks for

Workspace API key. You provide it once, when you install the connector. Toolspoke encrypts it at rest and decrypts it only for the length of a single call, and the gateway attaches it to the outbound request itself, so it is never part of the arguments an agent sends.

Workspace API keyRequired
Attio → Workspace settings → Developers → API keys → Create key. Tick the scopes the actions you plan to use need: record_permission for reading and writing records, object_configuration and list_configuration for the schema reads, note_permission for notes, task_permission for tasks, and user_management for the member list. The key belongs to one workspace, so a second workspace needs a second install.
64-character key

What Claude can do in Attio

13 actions, each one declared and named by the connector rather than discovered at runtime. A workspace policy grants a person all of them, a hand-picked selection, everything on the read side, everything on the write side, or none.

Reads
10Reads
Writes
3Writes
Destructive
0Destructive

Reads

10

Fetches data and changes nothing.

  • query_records

    Query the records on one object - this is the main way to read anything out of Attio. `object` is the object's slug or id, from list_objects: "people", "companies" and "deals" exist in most workspaces, but a workspace defines its own objects, so check rather than assume. `filter` is Attio's own filter document keyed by attribute slug, and `sorts` is a list of {"direction": "asc"|"desc", "attribute": "<slug>"} entries. Call list_attributes for the attribute slugs this workspace actually has before filtering on anything beyond the obvious ones - a filter naming an attribute that does not exist comes back as an error rather than as an empty result. Pages by offset, not by cursor.

  • get_record

    Fetch one record in full, with every attribute value Attio holds for it. Takes the object slug and the record's own id, both of which query_records returns. Use this after a query when you need the values the query did not show you.

  • list_objects

    List every object this workspace defines, standard and custom, with its slug, singular and plural names and id. Call this first whenever you do not already know what the workspace calls something: Attio ships People, Companies, Deals and Users by default, and a workspace is free to add its own or rename those. The slug is what every other operation here takes as `object`.

  • list_attributes

    List the attributes defined on one object, with each attribute's slug, title, type and whether it is unique. This is the translation table between what a person says and what the API takes - "the company's website" is an attribute with a slug, and query_records, create_record and update_record all speak in slugs. Call it before filtering or writing anything you have not seen this workspace return.

  • list_lists

    List the workspace's lists - Attio's pipelines and saved collections, each with its slug, name, id and which object its entries point at. A list is where a workspace tracks a process (a sales pipeline, an onboarding queue), so this is the operation that finds the pipeline before list_list_entries reads what is in it.

  • list_list_entries

    Read the entries on one list - the records currently in that pipeline or collection, with the per-entry attribute values the list itself holds (stage, owner, dates). Takes the list slug or id from list_lists. `filter` and `sorts` have exactly the same shape as query_records, but the attribute slugs are the list's own, which list_attributes returns when asked about a list rather than an object.

  • list_notes

    List notes, newest first - the written history of what people in the workspace have said about a record. Give `parent_object` and `parent_record_id` together to read one record's notes; leave both off to read the workspace's recent notes across every record, which is a much broader read and should be paged rather than pulled whole.

  • list_workspace_members

    List the people who have access to this Attio workspace, with each member's id, name, email address and access level. Call it to turn a colleague's name into the workspace member id that an owner or assignee attribute takes. These are the caller's own colleagues, not records about anybody the workspace sells to.

  • list_tasks

    List tasks, with their text, deadline, assignees and the records they are linked to. Narrow it with `linked_object` plus `linked_record_id` to see one record's outstanding work, or with `assignee` to see one person's. `sort` takes Attio's own combined field and direction, e.g. "created_at:desc".

  • identify

    Report what this connection's API key actually is: which workspace it belongs to, which workspace member created it, and the exact list of scopes it was granted. It needs no scope of its own, which is why it is the connection check - it answers "is this key real and whose is it" without depending on any permission the key may not have been given. Call it when a write comes back refused, to see whether the scope is missing rather than the record.

Writes

3

Creates or updates something on the other side.

  • create_record

    Create a record on one object. `values` is a map of attribute slug to value, in Attio's own value shape - a text attribute takes a string, a multiselect takes a list, and a record-reference attribute takes a list of {"target_object", "target_record_id"}. Call list_attributes first for the slugs and types this workspace defines. Attio refuses a create that collides with a unique attribute, so query_records first when the record may already exist and use update_record when it does.

  • update_record

    Change attribute values on an existing record. Only the attributes you send are touched. This uses Attio's appending update - a value sent for a multiselect attribute is added to what is already there rather than replacing it, which is the reversible half of the two update verbs Attio offers; the overwriting one is deliberately not exposed. This cannot delete the record.

  • create_note

    Attach a note to a record. The note appears on that record's timeline inside the workspace; it is not sent to anybody outside it, which is why this is a write rather than a destructive action. Say which object the record belongs to and give its id - both come from query_records. `format` is "plaintext" or "markdown"; markdown supports headings, lists, emphasis and links, and image embeds are not accepted through the API. `created_at` back-dates the note and may not be in the future.

What it will not do

Enforced by the gateway rather than left to convention, which is why each of these can be stated flatly.

It cannot call anything else
The 13 actions above are the whole of it. A call to any other name is refused before it reaches Attio rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time.
Nothing here deletes
This connector writes to Attio, but nothing in it deletes or permanently alters anything.
It reaches no further than your credential
Toolspoke holds no access to Attio of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either.
It never hears from Attio
Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Attio. An agent has to ask.
It does not smooth over provider limits
Toolspoke does not retry, queue or back off around Attio's own rate limits. A call that Attio refuses comes back to the agent as a failed call.

Before you connect it

What can Claude do in Attio?

13 named actions: 10 that only read and 3 that write. They include query_records, get_record and create_record. Nothing outside that list is reachable: the connector declares each operation by name rather than proxying whatever an agent asks for.

What credentials does the Attio connector need?

Workspace API key. The connector asks for workspace api key. Values are encrypted at rest and attached to the outbound request by the gateway, so they are never part of the arguments an agent sends and never reach the audit log.

Does the Attio connector work with Cursor and Codex, or only Claude?

Any client that speaks MCP, and every one of them gets the same 13 actions. There is a single address, https://toolspoke.com/mcp. Claude Code adds it with claude mcp add --transport http, Claude and Claude Desktop take it as a custom connector in settings, Cursor reads it from .cursor/mcp.json, Codex from ~/.codex/config.toml, and VS Code from .vscode/mcp.json. Each of them signs in to the gateway itself, so there is no key to paste.

What does the Attio connector not do?

The 13 actions above are the whole of it. A call to any other name is refused before it reaches Attio rather than forwarded on, and connecting your account does not add to the list: it is fixed by the connector, not discovered at run time. This connector writes to Attio, but nothing in it deletes or permanently alters anything. Toolspoke holds no access to Attio of its own. Every call carries the credential you stored and nothing besides, so whatever that credential cannot reach, this connector cannot reach either. Nothing is pushed to it. There is no webhook, no subscription and no polling, so this connector cannot notice by itself that something changed in Attio. An agent has to ask. Toolspoke does not retry, queue or back off around Attio's own rate limits. A call that Attio refuses comes back to the agent as a failed call.

Can I limit which actions an agent can call?

Yes, in two places. The project switches Attio's actions on and off one at a time, for everyone in the project at once, and the screen groups them by read, write and destructive so turning off everything that deletes is one click. An individual agent key can then be narrowed further, to particular toolkits in a project and to particular actions in a toolkit. Whatever it was granted, a key never reaches a project its owner cannot.

What gets recorded when an agent calls Attio?

Every attempt, with the agent that made it and the person that agent belongs to, the full request payload, the response payload, the status, the duration, and the credits spent. Values whose key names a secret are masked out before the record is shown to anyone. An operation the connector marks as not retained never has its response body written at all, so the gateway keeps no second copy of what was read.