Skip to content

Connect Attio to Claude: Automate Pipeline Management via MCP

Step-by-step engineering guide to connecting Attio to Claude using a managed MCP server. Automate CRM pipelines, notes, and task management.

Uday Gajavalli Uday Gajavalli · · 11 min read
Connect Attio to Claude: Automate Pipeline Management via MCP

To connect Attio to Claude, you need a Model Context Protocol (MCP) server that translates the LLM's standardized tool calls into Attio's specific object, record, and list API requests. You can either build, host, and maintain this translation layer yourself (we compare the top options in our guide to the best MCP servers for Attio in 2026), or use a managed integration platform like Truto to dynamically generate a secure, authenticated MCP server URL. If your team uses ChatGPT, check out our guide to connecting Attio to ChatGPT, or explore our broader guide on connecting Attio to AI Agents.

Attio is a highly flexible, data-dense CRM used by AI-native companies. Unlike legacy CRMs with rigid schemas, Attio relies heavily on custom objects, complex attribute types, and a unique list-entry architecture. Exposing this complexity to a Large Language Model (LLM) requires precise tool definitions and strict schema enforcement.

This guide breaks down exactly how to generate a managed MCP server for Attio, connect it natively to Claude, and execute complex CRM workflows using natural language.

The Engineering Reality of Attio's API

A custom MCP server is a self-hosted integration layer. While the Model Context Protocol provides a predictable way for models to discover tools, implementing it against vendor APIs is a massive engineering sink. Just as we've seen when connecting Affinity to Claude, if you decide to build a custom MCP server for Attio, you own the entire API lifecycle.

Attio's API introduces several specific integration challenges that break standard CRUD assumptions:

The Record vs. Entry Hierarchy In Attio, a Record represents the global canonical entity (like a Company or a Person). An Entry represents that entity's presence in a specific workflow List (like an active Sales Pipeline). You cannot simply update the deal stage on the global company object - you must update the specific list entry's attribute values. If you expose a generic "update company" tool to Claude, the LLM will hallucinate list updates that fail. You must provide distinct tools for Records and Entries.

Granular Attribute Values Attio does not accept flat JSON updates for complex fields. Updating a multiselect field or a status requires passing specific nested arrays and option IDs. An LLM needs explicit JSON schemas instructing it how to format these nested attribute payloads, otherwise, the Attio API will reject the request with a 400 Bad Request error.

Custom Object Slugs Because Attio allows entirely custom objects, the API relies heavily on dynamic slugs rather than static endpoints. Your MCP server must be able to dynamically route requests to v2/objects/{object_slug}/records based on the specific workspace configuration, requiring flexible URL path mapping.

Truto handles these quirks automatically by deriving tool definitions directly from the integration's config.resources and documentation records. The tools operate on the integration's native resources and schemas directly through Truto's proxy API handlers, handling auth refresh, rate limiting, and error parsing out of the box.

sequenceDiagram
    participant C as Claude Desktop
    participant T as Truto MCP Router
    participant A as Attio API
    C->>T: JSON-RPC: tools/call<br>(update_a_attio_entry_by_id)
    Note over T: Validates Token &<br>Applies Auth Headers
    T->>A: PATCH /v2/lists/{list}/entries/{entry_id}
    A-->>T: 200 OK (Updated Entry)
    T-->>C: MCP Result (JSON)

How to Generate the Attio MCP Server

Each MCP server in Truto is scoped to a single integrated account. The server URL contains a cryptographic token that encodes which account to use and what tools to expose.

There are two ways to generate this server.

Method 1: Via the Truto UI

  1. Navigate to the Integrated Accounts page in your Truto dashboard and select your connected Attio account.
  2. Click the MCP Servers tab.
  3. Click Create MCP Server.
  4. Select your desired configuration (name, allowed methods, tags, and expiration).
  5. Copy the generated MCP server URL (e.g., https://api.truto.one/mcp/a1b2c3d4e5f6...).

Method 2: Via the Truto API

You can dynamically generate MCP servers programmatically. The API validates that the integration has tools available, generates a secure token, stores it securely, and returns a ready-to-use URL.

Make an authenticated POST request to the MCP endpoint:

curl -X POST https://api.truto.one/integrated-account/{integrated_account_id}/mcp \
  -H "Authorization: Bearer YOUR_TRUTO_API_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Claude Attio Server",
    "config": {
      "methods": ["read", "write"]
    }
  }'

How to Connect the MCP Server to Claude

Once you have the Truto MCP URL, you can connect it to Claude. The URL alone is enough to authenticate and serve tools, with no additional OAuth configuration needed on the client side.

Method A: Via the Claude UI

If you are using Claude for Enterprise or Team plans:

  1. Open Claude and navigate to Settings -> Integrations.
  2. Click Add MCP Server (or Add custom connector).
  3. Paste your Truto MCP URL and click Add.
  4. Claude will immediately discover the Attio tools and make them available in your workspace.

Method B: Via Manual Config File

If you are using Claude Desktop locally, you can add the server by editing your claude_desktop_config.json file. Truto provides an SSE (Server-Sent Events) bridge for local clients.

{
  "mcpServers": {
    "attio-truto": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "https://api.truto.one/mcp/YOUR_TOKEN_HERE"
      ]
    }
  }
}

Restart Claude Desktop, and the tools will appear in your prompt interface.

Security and Access Control

Giving an AI agent write access to your CRM requires strict boundaries. Truto provides four native security controls for MCP servers:

  • Method Filtering: Restrict the MCP server to specific operation types using config.methods. Passing ["read"] ensures Claude can only execute safe get and list operations, preventing accidental deletions or unwanted updates.
  • Tag Filtering: Group and restrict tools by functional area using config.tags. You can scope a server to only expose tools tagged with ["sales"] or ["support"].
  • Token Authentication: For higher-security environments where the MCP URL might be visible in logs, enable require_api_token_auth: true. This forces the MCP client to provide a valid Truto API token in the Authorization header, adding a second layer of defense.
  • Ephemeral Access: Use the expires_at field to create temporary MCP servers. Once the ISO datetime is reached, a TTL mechanism automatically cleans up the token and associated state, revoking access immediately. Useful for contractor agents or short-lived automated tasks.

Hero Tools for Attio

Truto automatically generates comprehensive tool definitions based on Attio's API documentation. Here are the most powerful tools to expose to Claude for pipeline management.

list_all_attio_records

  • Description: Lists records for a specific global object in Attio (e.g., Companies, People). Required to find canonical entity IDs before making list-specific updates.
  • Example Prompt: "Find the record for Acme Corp in the Companies object."

get_single_attio_entry_by_id

  • Description: Gets a specific list entry in Attio using the list identifier and entry identifier. Essential for reading current deal stages and custom attribute values.
  • Example Prompt: "Pull the current status and MRR value for the Acme Corp entry in the Enterprise Sales list."

update_a_attio_entry_by_id

  • Description: Updates a list entry in Attio using list and id. Safely appends new multiselect values and modifies standard attributes without overwriting unrelated data.
  • Example Prompt: "Move the Acme Corp deal to the 'Negotiation' stage in the Enterprise Sales pipeline."

create_a_attio_note

  • Description: Creates a note attached to a parent object or record. Perfect for logging meeting summaries directly from Claude's context window.
  • Example Prompt: "Take the summary of our last call and attach it as a new note to the Acme Corp record."

create_a_attio_task

  • Description: Creates a new task linked to specific records, with content, deadlines, and assignees.
  • Example Prompt: "Create a task on the Acme Corp deal to follow up on the security review next Tuesday."

attio_entries_assert

  • Description: Creates or updates a list entry by parent for the given list. This is a powerful upsert tool that prevents duplicate entries when organizing records into new workflows.
  • Example Prompt: "Ensure Jane Doe is added to the Q3 Marketing Campaign list. If she is already there, update her status to 'Contacted'."

Full Attio Tool Inventory

Here is the complete inventory of additional Attio tools available. For full schema details, visit the Attio integration page.

  • attio_entries_attribute_values: List all values for a specific attribute on an entry.
  • attio_entries_overwrite: Update a list entry, overwriting existing multiselect values.
  • create_a_attio_entry: Create an entry in Attio by adding a record to a list.
  • attio_records_attribute_values: List all values for a specific attribute on a record.
  • attio_records_record_entries: List all entries for which this record is the parent.
  • update_a_attio_record_by_id: Update a record, appending new multiselect attribute values.
  • attio_records_overwrite: Update a specific record, overwriting existing multiselect values.
  • create_a_attio_record: Create a record for a specific object.
  • delete_a_attio_record_by_id: Delete a record by object and id.
  • get_single_attio_record_by_id: Get a specific record using object and id.
  • attio_workspaces_record_entries: List all entries for which the workspace record is the parent.
  • attio_workspaces_attribute_values: List attribute values for a workspace record.
  • attio_workspaces_assert: Create or update a workspace record using a matching attribute.
  • create_a_attio_workspace: Create a workspace record.
  • list_all_attio_workspaces: List workspace records including record IDs and timestamps.
  • get_single_attio_workspace_by_id: Get a specific workspace record.
  • update_a_attio_workspace_by_id: Update a workspace record by id.
  • delete_a_attio_workspace_by_id: Delete a workspace record by id.
  • attio_users_attribute_values: List all values for a specific attribute on a user record.
  • attio_users_record_entries: List all entries for which the user record is the parent.
  • update_a_attio_user_by_id: Update a user record by id.
  • delete_a_attio_user_by_id: Delete a user record.
  • attio_users_assert: Create or update a user record using the matching_attribute parameter.
  • get_single_attio_user_by_id: Get a user record.
  • list_all_attio_users: List user records including workspace and object details.
  • create_a_attio_user: Create a user record.
  • attio_deals_attribute_values: List deal record attribute values.
  • attio_deals_record_entries: List all entries for which the deal record is the parent.
  • get_single_attio_deal_by_id: Get a specific deal record.
  • delete_a_attio_deal_by_id: Delete a deal record.
  • attio_deals_assert: Create or update a deal record using a unique matching_attribute.
  • update_a_attio_deal_by_id: Update a deal record by its unique identifier.
  • attio_companies_record_entries: List all entries for which the company record is the parent.
  • attio_companies_assert: Create or update a company using a unique matching attribute.
  • attio_companies_attribute_values: List attribute values for a company record.
  • delete_a_attio_company_by_id: Delete a company record.
  • attio_people_attribute_values: List all values for a specific attribute on a person record.
  • attio_people_record_entries: List all entries for a specific person record.
  • update_a_attio_person_by_id: Update a person record.
  • get_single_attio_person_by_id: Get a person record.
  • attio_people_assert: Create or update a person record using a matching attribute.
  • delete_a_attio_person_by_id: Delete a person record.
  • list_all_attio_auth_session: Identify the current access token and permissions.
  • delete_a_attio_webhook_by_id: Delete a webhook using its unique identifier.
  • create_a_attio_webhook: Create a webhook by specifying a target URL and subscriptions.
  • update_a_attio_webhook_by_id: Update a webhook.
  • get_single_attio_webhook_by_id: Get detailed information about a specific webhook.
  • list_all_attio_webhooks: List all active webhooks including delivery URLs.
  • get_single_attio_comment_by_id: Get a specific comment including thread details.
  • delete_a_attio_comment_by_id: Delete a comment by id.
  • create_a_attio_comment: Create a comment on a specific thread, record, or entry.
  • get_single_attio_thread_by_id: Get all comments and metadata in a specific thread.
  • list_all_attio_threads: List threads including comment counts.
  • update_a_attio_task_by_id: Update a specific task including content, deadline, and status.
  • get_single_attio_task_by_id: Get a single task including linked records.
  • delete_a_attio_task_by_id: Delete a task by its unique identifier.
  • delete_a_attio_note_by_id: Delete a note by providing its unique identifier.
  • get_single_attio_note_by_id: Get a note including parent record and content.
  • get_single_attio_workspace_member_by_id: Get a workspace member.
  • list_all_attio_attribute_options: List select options for a specific attribute.
  • get_single_attio_attribute_by_id: Get information about a specific attribute.
  • update_a_attio_attribute_by_id: Update a specific attribute for a given object or list.
  • list_all_attio_attributes: List attributes for a specific object or list.
  • create_a_attio_attribute: Create an attribute for a specific object or list.
  • create_a_attio_object: Create a new custom object with specific naming nouns.
  • list_all_attio_objects: List all system-defined and user-defined objects.
  • update_a_attio_object_by_id: Update an object definition including its API slug.
  • get_single_attio_object_by_id: Get an object definition using its unique identifier.
  • list_all_attio_tasks: List all tasks with content and deadline details.
  • list_all_attio_workspace_members: List all members in an Attio workspace.
  • list_all_attio_notes: List notes including titles and parent record IDs.
  • list_all_attio_deals: List deal records with values and record identifiers.
  • create_a_attio_deal: Create a new deal record for sales tracking.
  • create_a_attio_person: Create a person record with contact information.
  • list_all_attio_people: List person records including created timestamps.
  • update_a_attio_company_by_id: Update a company record.
  • get_single_attio_company_by_id: Get a company record.
  • create_a_attio_company: Create a company record including attribute values.
  • delete_a_attio_entry_by_id: Delete an entry from a list.
  • list_all_attio_entries: List entries in a specific list.
  • update_a_attio_status_by_id: Update a status value for a specific attribute.
  • update_a_attio_list_by_id: Update an existing list definition by id.
  • list_all_attio_statuses: List available statuses for a specific status attribute.
  • create_a_attio_status: Create a new status for a specific attribute.
  • create_a_attio_list: Create a new list with workspace access controls.
  • get_single_attio_list_by_id: Get a single list definition by id.
  • list_all_attio_lists: List all lists accessible with the current access token.
  • update_a_attio_attribute_option_by_id: Update a select option on an attribute.
  • create_a_attio_attribute_option: Create a select option on an attribute.
  • list_all_attio_me: Check validity of an access token and see active scopes.
  • list_all_attio_companies: List company records with filtering and sorting options.

Workflows in Action

When Claude is equipped with these tools, it can execute multi-step reasoning to automate complex CRM tasks.

Scenario 1: Post-Meeting Triage and Context Logging

User Prompt: "Read my notes from the Acme Corp discovery call, update their pipeline stage to 'Technical Validation' in the Enterprise Sales list, and attach the call summary to their main record."

Step-by-step execution:

  1. Claude calls list_all_attio_records (filtering by "Acme Corp") to retrieve the canonical Company ID.
  2. Claude calls attio_records_record_entries using the Company ID to locate the specific entry ID within the "Enterprise Sales" list.
  3. Claude calls update_a_attio_entry_by_id to modify the status attribute to "Technical Validation".
  4. Claude calls create_a_attio_note passing the original Company ID and the formatted call summary from the prompt.

Result: The pipeline is advanced, the data is structured correctly, and the historical context is preserved on the canonical record - all without the user opening the CRM.

Scenario 2: Stalled Deal Identification and Task Assignment

User Prompt: "Find all deals in the 'Stalled' stage of the Q3 Renewals list and assign a task to me to follow up next Tuesday."

Step-by-step execution:

  1. Claude calls list_all_attio_entries targeting the "Q3 Renewals" list, filtering for entries where the status attribute equals "Stalled".
  2. Claude iterates through the returned array of entries.
  3. For each entry, Claude calls create_a_attio_task, setting the deadline to the calculated date for next Tuesday, assigning it to the user's ID, and linking it to the parent record of the stalled entry.

Result: The user receives a confirmation message summarizing the stalled deals found and verifying that the follow-up tasks have been successfully created and scheduled.

Next Steps

Connecting Claude to Attio via a managed MCP server removes the burden of handling OAuth flows, rate limits, and nested JSON schemas. By defining strict boundaries using method and tag filtering, you can safely deploy AI agents that actively manage your pipeline and reduce manual data entry.

FAQ

How do I connect Attio to Claude Desktop?
You can connect Attio to Claude Desktop by adding a Model Context Protocol (MCP) server URL to your claude_desktop_config.json file or directly through the Claude UI settings.
Does Truto store my Attio CRM data?
No. Truto operates as a pass-through proxy API. It transforms the MCP JSON-RPC requests into Attio REST API calls and returns the data directly to Claude without caching the payloads.
Can I restrict Claude to read-only access in Attio?
Yes. When generating the MCP server in Truto, you can pass methods: ["read"] in the configuration to ensure the LLM can only execute safe, non-destructive GET and LIST operations.

More from our Blog

Best MCP Server for Attio in 2026
AI & Agents

Best MCP Server for Attio in 2026

Compare the best MCP servers for Attio CRM in 2026. Open-source vs. Attio's hosted MCP vs. Truto's managed server — with setup guides for Claude, ChatGPT, and custom agents.

Uday Gajavalli Uday Gajavalli · · 12 min read