CONNECT APP
Build with Asana
Productivity
- OAuth
MCP
Give your agent Asana tools
Every Asana 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 Asana 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": "asana",
},
},
},
)
const mcp = new Client({ name: "my-agent", version: "1.0.0" })
await mcp.connect(transport)
const { tools } = await mcp.listTools()
// e.g. run Add Task To Section:
const result = await mcp.callTool({
name: "asana-add-task-to-section",
arguments: {
task: "Task",
section_gid: "Section GID",
},
})# 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": "asana",
}
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 Add Task To Section:
result = await session.call_tool("asana-add-task-to-section", {
"task": "Task",
"section_gid": "Section GID",
})API PROXY
Call the Asana API directly
For an endpoint with no pre-built tool, the Connect proxy forwards your request to the Asana 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://app.asana.com/api/1.0/users/me",
})
// Any allowed Asana 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://app.asana.com/api/1.0/users/me
curl "https://api.pipedream.com/v1/connect/{project_id}/proxy/aHR0cHM6Ly9hcHAuYXNhbmEuY29tL2FwaS8xLjAvdXNlcnMvbWU?external_user_id={external_user_id}&account_id=apn_xxxxxxx" \
-H "Authorization: Bearer {access_token}" \
-H "x-pd-environment: production"SDK
Run Asana actions from your backend
Connect a user's Asana account once, then run Add Task To Section 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: "asana-add-task-to-section",
externalUserId: "{external_user_id}", // any stable ID for this user in your system
configuredProps: {
asana: { authProvisionId: "apn_xxxxxxx" },
task: "Task",
section_gid: "Section GID",
},
})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="asana-add-task-to-section",
external_user_id="{external_user_id}", # any stable ID for this user in your system
configured_props={
"asana": {"authProvisionId": "apn_xxxxxxx"},
"task": "Task",
"section_gid": "Section GID",
},
)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": "asana-add-task-to-section",
"configured_props": {
"asana": { "authProvisionId": "apn_xxxxxxx" },
"task": "Task",
"section_gid": "Section GID"
}
}'TOOLS
Asana actions
On-demand operations your product or agent can configure and run on behalf of a connected user.
-
Add Task To Section
actionMoves a task into a specific section within an Asana project, removing it from any other section it currently occupies in that project. Use Search Sections to find the section GID and Search Tasks to find the task GID. Returns an empty object{}on success. Example: call withproject: '1204567890123456',task: '1202345678901234',section_gid: '1203456789012345'→ task is moved into that section and returns{}. See the documentationWritev1.0.0 -
Create Project
actionCreates a new project in an Asana workspace or team. Use this to set up a new initiative, sprint, or work stream. For organization workspaces you must supply ateamGID (use List Teams to find it). Returns the new project record including itsgid. Example: call withprojectName: 'Q4 Marketing Campaign',workspace: '1200123456789012',team: '1203456789012345',defaultView: 'board'→ returns{gid: '1204567890123456', name: 'Q4 Marketing Campaign'}. See the documentationWritev1.0.0 -
Create Subtask
actionCreates a new subtask nested under an existing parent task. Use this when the work is a sub-item of another task; for top-level tasks use Create Task. The parent task GID is required. Returns the new subtask record including itsgid. Example: call withtask_gid: '1202345678901234',subtaskName: 'Write first draft',due_on: '2026-10-05'→ returns{gid: '1207890123456789', name: 'Write first draft', resource_type: 'task'}. See the documentationWritev1.0.0 -
Create Task
actionCreates a new task in Asana. Use this to add a standalone task to a workspace or project. For subtasks, use Create Subtask instead; for template-based tasks, use Create Task from Template. Returns the new task record including itsgid. Example: call withtaskName: 'Review Q3 report',workspace: '1200123456789012',due_on: '2026-10-01'→ returns{gid: '1202345678901234', name: 'Review Q3 report', resource_type: 'task'}. See the documentationWritev1.0.0 -
Create Task Comment
actionAdds a comment (story) to an existing Asana task. Use this to post a text update or pinned note visible to task followers. Provide eithertext(plain text) orhtml_text(HTML-formatted), but not both. Returns the new story record including itsgidandtype. Example: call withtask_gid: '1202345678901234',text: 'Approved — ready to ship!'→ returns{gid: '1209012345678901', type: 'comment', text: 'Approved — ready to ship!'}. See the documentationWritev1.0.0 -
Create Task from Template
actionCreates a new Asana task by instantiating an existing task template. Use this when a team has a reusable task structure (e.g. a bug-report or onboarding template); for ad-hoc tasks use Create Task. Use List Task Templates to find the template GID. This kicks off an asynchronous job — the response is a job resource, not the finished task;new_task.gidis available immediately but the task's fields may still be populating, so use Find Task by ID if you need to confirm it's ready. The new task's project and memberships are determined by the template itself, not by any project passed here. Example: call withtaskTemplateId: '1205678901234567',name: 'Bug: Login page crash'→ returns{gid: '1205555555555555', resource_type: 'job', new_task: {gid: '1206789012345678'}}. See the documentationWritev1.0.0 -
Delete Task
actionDeletes an Asana task. This moves the task to the deleting user's trash and removes it from active views immediately; it can be recovered for 30 days before Asana permanently removes it. Use Find Task by ID to confirm the task GID before deleting. Returns an empty data object{}on success. Example: call withtask_gid: '1202345678901234'→ returns{}. See the documentationWritev1.0.0 -
Find Task by ID
actionRetrieves the complete record for a single Asana task by its GID. Use this to fetch full task details (description, assignee, due date, custom fields) after obtaining a task GID from Search Tasks. UseoptFieldsto request additional fields not returned by default. Example: call withtask_gid: '1202345678901234',optFields: ['due_on','assignee','custom_fields']→ returns the full task record for that GID. See the documentationRead-onlyv1.0.0 -
Get list of user projects
actionReturns all projects in an Asana workspace where the specified user is a member. Omituser(or pass"me") for the authenticated user's own projects — don't guess a GID from List Users when the request is about "my" projects. Results are workspace-wide and not scoped to any portfolio; archived projects may be included. If you need portfolio-scoped results, use List Portfolios and List Portfolio Items instead. Example: call withworkspace: '1200123456789012'(nouser) → returns[{gid: '1204567890123456', name: 'Website Redesign'}, ...]for projects the authenticated user is a member of. See the documentationRead-onlyv0.7.0 -
Get Portfolio
actionReturns the complete portfolio record for a single portfolio. Use this after List Portfolios to retrieve full portfolio details including custom fields, members, and owner; theoptFieldsprop requests specific properties (e.g.custom_field_settings,members,start_on,due_on). Example: call withportfolioId: '1208901234567890',optFields: ['members','owner','due_on']→ returns{gid: '1208901234567890', name: 'Product Launch', owner: {...}, members: [...]}. See the documentationRead-onlyv0.0.3 -
Get Tasks From Task List
actionReturns tasks from the authenticated user's personal My Tasks inbox — NOT a project task list. Use this when the user asks for 'my tasks', 'my task list', or 'My Tasks'. Only a workspace GID is needed; no project GID required. Example: call withworkspace: '1200123456789012'→ returns all tasks in the authenticated user's My Tasks list, e.g.[{gid: '1202345678901234', name: 'Review Q3 report'}]. See the documentationRead-onlyv1.1.2 -
List Organizations Options
actionReturns all Asana workspaces for the authenticated account that are organizations (i.e.is_organization: true). Use this to obtain organization GIDs for org-scoped actions. Prefer List Workspaces when you need all workspaces including non-organization ones. Returns an array of{label, value}pairs wherevalueis the organization GID. Example: returns[{label: 'Acme Corp', value: '1200123456789012'}]. See the documentationRead-onlyv0.0.4 -
List Portfolio Items
actionReturns a list of the projects in an Asana portfolio. Use this after List Portfolios to enumerate projects within a portfolio and answer count, timing, and spend questions; the default Opt Fields includecreated_at,start_on,due_on, andcustom_fields. Archived filtering happens client-side. Example: call withportfolioId: '1208901234567890',excludeArchived: true→ returns active projects like[{gid: '1204567890123456', name: 'Website Redesign', start_on: '2026-01-01', due_on: '2026-06-30'}]. See the documentationRead-onlyv0.0.3 -
List Portfolios
actionReturns a list of portfolios in an Asana workspace owned by the given user. Use this to discover portfolio GIDs before calling Get Portfolio or List Portfolio Items. Owner defaults to the authenticated user; regular API users can only list portfolios they own. Example: call withworkspace: '1200123456789012'→ returns[{gid: '1208901234567890', name: 'Product Launch'}, ...]. See the documentationRead-onlyv0.0.3 -
List Tags
actionReturns tags in an Asana workspace, up to 100 by default (increasemaxResultsfor more) — not guaranteed to include every tag in a large workspace. Use this to discover tag GIDs before applying tags to tasks with Create Task or Create Subtask (thetagsprop). Example: call withworkspace: '1200123456789012'→ returns tags like[{gid: '1202345678901234', name: 'urgent'}]. See the documentationRead-onlyv0.0.1 -
List Task Stories
actionReturns all stories (comments, activity log entries, system messages) for an Asana task. Use this to retrieve the comment history and audit trail for a task. SetcommentsOnly: trueto filter to only comment stories. Returns an array of story records each withgid,type,text, andcreated_at. Example: call withproject: '1204567890123456',taskId: '1202345678901234'→ returns stories including{gid: '1209012345678901', type: 'comment', text: 'Approved!', created_at: '2026-09-01T10:00:00Z'}. See the documentationRead-onlyv1.0.0 -
List Task Templates
actionReturns task templates in an Asana project, up to 100 by default (increasemaxResultsfor more) — not guaranteed to include every template in a project with many. Use this to discover task template GIDs before calling Create Task from Template (thetaskTemplateprop). Example: call withproject: '1204567890123456'→ returns templates like[{gid: '1205678901234567', name: 'Bug Report Template'}]. See the documentationRead-onlyv0.0.1 -
List Teams
actionRetrieves all teams in a specified Asana workspace. Use this action to discover available team GIDs for creating projects or organizing work by department. Requires a workspace GID from List Workspaces. Results are paginated (default 25 per page); pass the returnednext_offsetasoffsetto fetch additional pages. Consider following up with Create Project to create a project under a team. Example: call withworkspace: '1200123456789012'→ returns{data: [{gid: '1203456789012345', name: 'Design'}, ...], next_offset: null}. See the documentationRead-onlyv1.0.3 -
List Users
actionRetrieves all users in a specified Asana workspace. Use this to get user GIDs for assignee or owner fields in Create Task or Update Task. Requires a workspace GID from List Workspaces. Results are paginated; pass the returnednext_offsetasoffsetto fetch additional pages. Example: call withworkspace: '1200123456789012',optFields: ['name','email']→ returns{data: [{gid: '1198765432109876', name: 'Jane Doe', email: 'jane@acme.com'}, ...]}. See the documentationRead-onlyv1.0.3 -
List Workspaces
actionLists all Asana workspaces available to the authenticated account. Use this to get workspace GIDs required by List Teams, List Users, Search Tasks, Create Task, and other workspace-scoped actions. Pass a returnednext_offsetasoffsetto fetch additional pages. Example: call with no params → returns{data: [{gid: '1200123456789012', name: 'Acme Corp'}, ...]}(passoptFields: ['is_organization']to also get whether each workspace is an organization). See the documentationRead-onlyv1.0.3 -
Search Projects
actionFinds projects across an entire Asana workspace, optionally filtered by name (e.g.Website Redesign). Results are workspace-wide and are not limited to any portfolio, and there is no due-date filter. Archived projects are included unless you setarchived: false. Every result includesworkspace.gid— reuse that value directly for theworkspaceparam on a follow-up action like Create Task, no need to look it up separately. If you need portfolio-scoped results, use List Portfolios and List Portfolio Items instead. Example: call withworkspace: '1200123456789012',name: 'Marketing'→ returns[{gid: '1204567890123456', name: 'Q4 Marketing Campaign', workspace: {gid: '1200123456789012'}}, ...]. See the documentationRead-onlyv0.3.4 -
Search Sections
actionSearches for sections by name within an Asana project. Use this to find section GIDs before calling Add Task to Section or when filtering tasks by section. ThesectionNamefilter is a client-side substring match. Returns section records withgidandname. Example: call withproject: '1204567890123456',sectionName: 'In Progress'→ returns[{gid: '1203456789012345', name: 'In Progress'}]. See the documentationRead-onlyv1.0.0 -
Search Tasks
actionSearches for Asana tasks by name within a project, section, or by assignee. Must specify exactly one of:project,section, orassignee(project + section together is also valid). Thenamefilter is a client-side substring match applied after fetching. For cross-project full-text search, use Search Tasks Premium instead. Returns task records withgidandname(plus any requestedoptFields). Example: call withworkspace: '1200123456789012',project: '1204567890123456',name: 'Q3'→ returns tasks in that project whose names contain 'Q3'. See the documentationRead-onlyv0.5.1 -
Search Tasks Premium
actionSearches for tasks across an Asana workspace by name, assignee, section, project, completed since, and/or modified since. Requires a Premium Asana account. Use this over Search Tasks when you need cross-project full-text search or date-range filters not available on the basic endpoint. Results are capped at 100 by the Asana search API — pagination is not supported on this endpoint; narrow your filters (name, assignee, modified_since) if you expect more than 100 matches. Example: call withworkspace: '1200123456789012',name: 'Q3',assignee: '1198765432109876'→ returns up to 100 tasks whose text contains 'Q3' assigned to that user. See the documentationRead-onlyv0.0.6 -
Update Task
actionUpdates one or more fields on an existing Asana task (name, assignee, due date, completion status, notes, custom fields, etc.). All fields are optional — supply only the ones you want to change; unchanged fields retain their current values. Use Find Task by ID or Search Tasks to obtain the task GID first. Returns the updated task record. Example: call withtask_gid: '1202345678901234',completed: true→ marks the task complete and returns the updated record. See the documentationWritev0.4.9
-
New Project Added To Workspace (Instant)
triggerEmit new event for each new project added to a workspace.Instantv0.1.15 -
New Story Added To Project (Instant)
triggerEmit new event for each story added to a project.Instantv0.1.15 -
New Subtask (Instant)
triggerEmit new event for each subtask added to a project.Instantv1.0.15 -
New Completed Task (Instant)
triggerEmit new event for each task completed in a project.Instantv0.1.15 -
New Tag
triggerEmit new event for each tag created in a workspace.v0.0.17 -
New Tag Added To Task (Instant)
triggerEmit new event for each new tag added to a task.Instantv0.1.15 -
New Tags added to any task (Instant)
triggerEmit new event each time a tag is added to any task, optionally filtering by a given set of tags.Instantv0.0.14 -
New Task (Instant)
triggerEmit new event for each task added to a project. See docs hereInstantv0.1.15 -
New Task Assigned in Project (Instant)
triggerEmit new event each time a task is assigned, reassigned or unassigned.Instantv0.1.8 -
New Task Field Updated In Project (Instant)
triggerEmit new event whenever given task fields are updated.Instantv0.0.14 -
New Task Updated In Project (Instant)
triggerEmit new event for each update to a task.Instantv1.1.14 -
New Team
triggerEmit new event for each team added to an organization.v0.1.16 -
New User (Instant)
triggerEmit new event for each user added to a workspace.Instantv0.1.15 -
New Workspace Added
triggerEmit new event each time you add a new workspace/organization.v0.1.16
MULTI-APP
Use Asana with other popular apps
Most products don't stop at one integration. Pair Asana with the other apps your users rely on, and ship use cases that span both.
- App slug
- asana
- Authentication
- OAuth
- Categories
- Productivity
- Actions
- 25
- Triggers
- 14
- API proxy
- Available