CONNECT APP
Build with Attio
CRM
- OAuth
MCP
Give your agent Attio tools
Every Attio action is exposed as an MCP tool on Pipedream's remote server. Point a client at it with your end user's ID and Connect resolves that user's Attio account for each tool call — you store no tokens.
// accessToken: mint a short-lived token with the Connect SDK — see the MCP guide
const transport = new StreamableHTTPClientTransport(
new URL("https://remote.mcp.pipedream.net/v3"),
{
requestInit: {
headers: {
Authorization: `Bearer ${accessToken}`,
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", // any stable ID for this user in your system
"x-pd-app-slug": "attio",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// e.g. run Create Note:
const result = await mcp.callTool({
name: "attio-create-note",
arguments: {
parentObject: "Parent Object",
parentRecordId: "Parent Record ID",
},
})# access_token: mint a short-lived token with the Connect SDK — see the MCP guide
headers = {
"Authorization": f"Bearer {access_token}",
"x-pd-project-id": "{project_id}",
"x-pd-environment": "production",
"x-pd-external-user-id": "{external_user_id}", # any stable ID for this user in your system
"x-pd-app-slug": "attio",
}
async with streamablehttp_client("https://remote.mcp.pipedream.net/v3", headers=headers) as (read, write, _):
async with ClientSession(read, write) as session:
await session.initialize()
tools = await session.list_tools()
# e.g. run Create Note:
result = await session.call_tool("attio-create-note", {
"parentObject": "Parent Object",
"parentRecordId": "Parent Record ID",
})API PROXY
Call the Attio API directly
For an endpoint with no pre-built tool, the Connect proxy forwards your request to the Attio API with the connected user's credentials attached. You store no tokens and write no refresh logic.
const resp = await pd.proxy.get({
externalUserId: "{external_user_id}", // any stable ID for this user in your system
accountId: "apn_xxxxxxx",
url: "https://api.attio.com/v2/self",
})
// Any allowed Attio endpoint works here. Pipedream attaches the
// connected account's credentials to the outgoing request.# The path segment is the target URL, URL-safe base64 encoded:
# https://api.attio.com/v2/self
curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9hcGkuYXR0aW8uY29tL3YyL3NlbGY?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: production"SDK
Run Attio actions from your backend
Connect a user's Attio account once, then run Create Note on their behalf from your own code — TypeScript, Python, or plain HTTP.
import { PipedreamClient } from "@pipedream/sdk"
const pd = new PipedreamClient({
projectId: process.env.PIPEDREAM_PROJECT_ID!,
clientId: process.env.PIPEDREAM_CLIENT_ID!,
clientSecret: process.env.PIPEDREAM_CLIENT_SECRET!,
projectEnvironment: "production",
})
const result = await pd.actions.run({
id: "attio-create-note",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
attio: { authProvisionId: "apn_xxxxxxx" },
parentObject: "Parent Object",
parentRecordId: "Parent Record ID",
},
})from pipedream import Pipedream
pd = Pipedream(
client_id="{oauth_client_id}",
client_secret="{oauth_client_secret}",
project_id="{project_id}",
project_environment="production",
)
result = pd.actions.run(
id="attio-create-note",
external_user_id="{external_user_id}", # any stable ID for this user in your system
configured_props={
"attio": {"authProvisionId": "apn_xxxxxxx"},
"parentObject": "Parent Object",
"parentRecordId": "Parent Record ID",
},
)curl -X POST https://api.pipedream.com/v1/connect/{project_id}/actions/run \
-H "Content-Type: application/json" \
-H "X-PD-Environment: production" \
-H "Authorization: Bearer {access_token}" \
-d '{
"external_user_id": "{external_user_id}",
"id": "attio-create-note",
"configured_props": {
"attio": { "authProvisionId": "apn_xxxxxxx" },
"parentObject": "Parent Object",
"parentRecordId": "Parent Record ID"
}
}'TOOLS
Attio actions
On-demand operations your product or agent can configure and run on behalf of a connected user.
-
Create Note
actionCreate a plaintext note attached to a record (person, company, deal, or any object). Use when you want to log context on a record. Set Parent Object, Parent Record ID, Title, and Content. Example: Parent Objectpeople, Parent Record ID891dcbfc-9141-415d-9b2a-2238a6cc012d, TitleIntro call, ContentDiscussed the Q3 rollout timeline. Returns the created note with its id. See the documentationWritev0.0.8 -
Create or Update Record
actionCreates or updates a specific record such as a person or a company. If a record with the same matching attribute already exists, it's updated; otherwise a new record is created. Objects without a unique attribute to match on (e.g. deals) are not available here. Example: Objectcompanies, Matching Attributedomains, Values{ "domains": ["acme.com"], "name": "Acme" }. Returns the created or updated record with its id. See the documentationWritev0.1.1 -
Create Person
actionCreate a new person record in Attio. Use when adding a contact. Set any of the person fields (name, email, job title, phone, socials) and optionally link a company by its record id. Example: First NameAda, Last NameLovelace, Emailada@example.com, Job TitleAnalyst. Returns the created person record with its id. See the documentation.Writev0.0.6 -
Create Task
actionCreate a task in Attio with content, a deadline, completion state, optional assignees, and optional linked records. Use when you need a follow-up or to-do. Example: ContentEmail the signed contract to Ada, Deadline2026-09-01T17:00:00Z, Is Completedfalse. Returns the created task with its id. See the documentationWritev0.1.1 -
Delete List Entry
actionDelete an entry from a list (this removes the record from the list, not the underlying record itself). Destructive — confirm the entry before deleting. Use List List ID Options to find a List ID, then choose the Entry ID to remove. Example: List ID33ebdbe9-e529-47c9-b894-0ba25e9c15c0, Entry ID2e6e29ea-c4e9-4f4b-9b1e-7f2c1a0d9c11. Returns the API confirmation. See the documentationWritev0.0.8 -
Get Record
actionRetrieve a single record by its ID from a given object (people, companies, deals, or a custom object). Use when you have a record's id and need its attribute values. Example: Objectpeople, Record ID891dcbfc-9141-415d-9b2a-2238a6cc012d. Returns the record with its attribute values. See the documentationRead-onlyv0.0.5 -
List List ID Options
actionList the workspace's lists as {value, label} options, to discover a List ID to pass to other actions (e.g. Delete List Entry). Use when you need a list's id and don't have it. Takes no input. Example: call with no arguments; returns e.g.[{ "value": "33ebdbe9-e529-47c9-b894-0ba25e9c15c0", "label": "Hot Leads" }]. See the documentationRead-onlyv0.0.3 -
List Records
actionList records for an object (people, companies, deals, or a custom object), most recent first. Use when you need to find or enumerate records and don't have a specific id. Set Object and optionally a Limit and Fields. Example: Objectcompanies, Limit20. Returns an array of records with their attribute values. If the number of records returned equals the Limit, call again with Offset advanced by the limit to fetch the next page. See the documentationRead-onlyv0.0.2 -
Update Person
actionUpdate an existing person record by its ID; only the fields you set are changed. Use Get Record (objectpeople) or the Person ID lookup to find the Person ID first. Example: Person ID891dcbfc-9141-415d-9b2a-2238a6cc012d, Job TitleVP Sales, Emailada@example.com. Returns the updated person record. See the documentation.Writev0.0.6
-
New Activity Created (Instant)
triggerEmit new event when a note, task, or comment is created, useful for tracking engagement in real time.Instantv0.0.4 -
New List Entry (Instant)
triggerEmit new event when a record, such as person, company, or deal, is added to a listInstantv0.0.6 -
New List Entry Deleted (Instant)
triggerEmit new event when a list entry is deleted (i.e. when a record is removed from a list).Instantv0.0.5 -
New List Entry Updated (Instant)
triggerEmit new event when an existing list entry is updated (i.e. when a list attribute is changed for a specific list entry, e.g. when setting "Owner")Instantv0.0.5 -
New Note (Instant)
triggerEmit new event when a new note is created.Instantv0.0.5 -
New Note Updated (Instant)
triggerEmit new event when a note is updated. Fires when the title is modified (note.updated) and when the body content is edited (note-content.updated).Instantv0.0.6 -
New Object Attribute (Instant)
triggerEmit new event when an object attribute is created (e.g. when defining a new attribute "Rating" on the company object)Instantv0.0.5 -
New Object Attribute Updated (Instant)
triggerEmit new event when an object attribute is updated (e.g. when renaming the "Rating" attribute to "Score" on the company object)Instantv0.0.5 -
New Record Created (Instant)
triggerEmit new event when new record, such as person, company or deal gets createdInstantv0.0.6 -
New Record Updated (Instant)
triggerEmit new event when values on a record, such as person, company or deal, are updatedInstantv0.0.6
MULTI-APP
Use Attio with other popular apps
Most products don't stop at one integration. Pair Attio with the other apps your users rely on, and ship use cases that span both.
- App slug
- attio
- Authentication
- OAuth
- Categories
- CRM
- Actions
- 9
- Triggers
- 10
- API proxy
- Available