Skip to content

Connectors · Work & projects

Asana MCP server for AI agents.

actionlake is an MCP gateway: one remote MCP server that connects Claude and other MCP clients to Asana and the rest of your systems. It gives your agent 260 Asana actions (119 reads, 102 writes and 39 that wait for a confirmation) and holds the Asana credential itself, so the agent never does. It paces Asana's limits and records every call.

100,000 free calls a month. No card, no email, no password: press Start a free sandbox on the next screen and keep the key it shows you.

claude mcp add --transport http actionlake https://connect.actionlake.com/mcp
the first call
do {  action: "asana.tasks.get_tasks",  intent: "check which Asana account is connected"}# Get multiple tasks · read · 1 upstream call
  • 260actionsin one signed file
  • 119readlook, never change
  • 102writecreate and update
  • 39wait for a yesdestructive, confirmed first

Set up

Connect Asana in three steps.

  1. 01

    Add actionlake to Claude.

    Run the command once in Claude Code; its consent page can create a free sandbox: 100,000 calls a month, no card. In the Claude app, add a custom connector with the URL below and paste your key on the consent page. Creating a new sandbox from the Claude app is not yet tested by us.

    https://connect.actionlake.com/mcp
  2. 02

    Connect Asana.

    Bearer token. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead. actionlake stores what you paste write-only, sealed under your tenant's key.

    • access_tokenAsana personal access token
    account { op: "connections.requirements", service: "asana" }
    # free: exactly what to paste, and what is found for you
  3. 03

    Make the first call. Check before a write.

    Ask in plain words; Claude picks the action. Before anything changes, check validates the call and prices it, for free.

    do    { action: "asana.tasks.get_tasks" }# get multiple tasks · read · 1 upstream callcheck { action: "asana.tasks.create_task", input: { … } }# free: inputs, permissions, cost and confirmations, nothing sent

Asana at a glance

Sign-in
Bearer token. No consent screen: your agent can connect it for you, but the key then passes through your chat. To keep it out of the model's context, paste it in the console instead.
You provide
access_token
Limits we pace to
150 calls a minute, per connection
API covered
Asana API 1.0app.asana.com/api/1.0
Built from
Asana's documentation, read 15 September 2026OpenAPI spec (GitHub)
Service file
Version 2.0.0, signed (Ed25519)
Cached reads
119 of 119 reads, for up to an hour; a write clears what it affects
Ready-made plans
9 in the store
Shared entities
6, so ask can line Asana up with your other systems
Data
Processed and stored in Sydney, Australia. No US region yet

Capabilities

What an AI agent can do in Asana.

260 actions in 29 areas. Every one carries its effect, so a key can allow the reads and hold the rest.

  • 119readlook, never change
  • 102writecreate and update
  • 39destructivewait for a confirmation
  1. Projects

    46

    17 read · 21 write · 8 destructive

    Get multiple projects · Get projects a task is in · Get a team's projects · Get all projects in a workspace

  2. Tasks

    34

    13 read · 14 write · 7 destructive

    Get multiple tasks · Instantiate a task from a task template · Create a subtask · Create a subtask Passes the whole `data` object through untouched. (raw)

  3. Time tracking

    23

    12 read · 8 write · 3 destructive

    Get time tracking entries for a time tracking category · Get multiple time tracking entries · Get time tracking entries for a task · Create a time tracking entry

  4. Portfolios

    21

    9 read · 8 write · 4 destructive

    Get multiple portfolio memberships · Get memberships from a portfolio · Create a portfolio · Duplicate a portfolio

  5. Goals

    18

    5 read · 9 write · 4 destructive

    Get goal relationships · Create a goal · Get goals · Get parent goals from a goal

  6. Custom fields

    14

    8 read · 5 write · 1 destructive

    Get a goal's custom fields · Get a portfolio's custom fields · Get a project's custom fields · Get a team's custom fields

  7. Users

    12

    8 read · 4 write · 0 destructive

    Get multiple users · Get users in a team · Get users in a workspace or organization · Get a user

  8. Teams

    11

    7 read · 3 write · 1 destructive

    Get teams in a workspace · Get teams for a user · Create a team · Get a team

21 more areas · 81 actions
  • Workspaces 9
  • Stories 8
  • Tags 8
  • Allocations 5
  • Budgets 5
  • Memberships 5
  • Rates 5
  • Roles 5
  • Webhooks 5
  • Access 4
  • Attachments 4
  • Exports 4
  • Status updates 4
  • Agents 2
  • Usage 2
  • Audit 1
  • Batch 1
  • Events 1
  • Jobs 1
  • Rules 1
  • Search 1

Asana's own MCP server

Asana's MCP server, or actionlake?

Asana runs a remote MCP server at mcp.asana.com, signed in with OAuth.

Use Asana's server when one person wants to work in Asana from their own AI client. Use actionlake when you also want Asana behind the same endpoint as your other systems: a key per agent with allowed actions and a spending cap, a named person's approval before destructive actions, a sealed record of every call, and one ask across Asana and another system.

Source: Asana's documentation, checked 22 October 2026.

Top actions

The Asana API, shaped for agents.

The ids your agent types, what each does, and the one name it shares with other systems. 169 of Asana's 169 action names are shared with at least one other connector, so an agent learns them once.

ActionWhat it doesEffectSame name in
asana.tasks.get_tasksGet multiple tasksGet multiple tasksreadwork.task.list122 connectors
asana.users.get_usersGet multiple usersGet multiple usersreadidentity.user.list474 connectors
asana.projects.get_projectsGet multiple projectsGet multiple projectsreadwork.project.list109 connectors
asana.teams.get_teams_for_workspaceGet teams in a workspaceGet teams in a workspacereadidentity.group.list262 connectors
asana.workspaces.get_workspacesGet multiple workspacesGet multiple workspacesreadwork.workspace.list50 connectors
asana.stories.get_stories_for_taskGet stories from a taskGet stories from a taskreadwork.task_comment.list27 connectors
asana.tasks.create_taskCreate a taskCreate a taskwritework.task.create127 connectors
asana.tasks.create_task_rawCreate a task Passes the whole `data` object through untouched. (raw)Create a task Passes the whole `data` object through untouched.writework.task.create127 connectors
asana.users.get_users_for_teamGet users in a teamGet users in a teamreadidentity.user.list474 connectors
asana.projects.get_projects_for_taskGet projects a task is inGet projects a task is inreadwork.project.list109 connectors
asana.stories.create_story_for_goalCreate a story on a goalCreate a story on a goalwritework.task_comment.create28 connectors
asana.tasks.delete_taskDelete a taskDelete a taskdestructivework.task.delete107 connectors

Try it

Prompts to paste into Claude.

Each one names the Asana actions it will call, so you know what it reads and what it changes before you send it.

  1. Readread

    Which Asana tasks are overdue, and who owns each one?

    callsasana.tasks.get_tasks

  2. Plandestructive

    Offboard a departing user from their teams and workspace in Asana. Ask me before anything is sent or changed.

    callsasana.users.get_userasana.team_memberships.get_team_memberships_for_userasana.workspace_memberships.get_workspace_memberships_for_userasana.ooo_entries.create_ooo_entryasana.memberships.delete_membership

  3. Planwrite

    Add a new teammate and give them their starter task list in Asana. Ask me before anything is sent or changed.

    callsasana.teams.get_teamasana.users.get_userasana.teams.add_user_for_teamasana.project_templates.instantiate_projectasana.tasks.create_task_raw

  4. Writewrite

    Create a task in Asana. Show me exactly what you will send before you save it.

    callsasana.tasks.create_task

The plan store

Ready-made plans for Asana.

9 plans in the store. Install one and your agent runs it by name; the reply says which connections are still missing. A schedule can run a plan on a timetable. There are no triggers or webhooks, by design.

  1. Find overdue tasks and nudge their assignees

    Use it when A lead wants every late task in a workspace commented on to chase the owner.

    Effect
    write
    Steps
    2 · loops
    Needs
    message, text and workspace gid
    Install
    asana-overdue-task-chase
  2. Archive projects that have no work left in them

    Use it when Someone wants to clean up a workspace by archiving finished projects without hunting them down by hand.

    A person decidesArchive projects in workspace workspace gid. Task counts for each project were read in the previous step — review them and decline if any project still has incomplete work. Up to 100 projects will be archived.

    Effect
    write
    Steps
    4 · loops
    Needs
    workspace gid
    Install
    asana-archive-stale-projects
  3. Request an organisation export and wait for the download

    Use it when Someone needs a complete organisation export produced and the resulting download link returned.

    A person decidesProduce a full export of organisation organization, including every project and task.

    Effect
    write
    Steps
    4
    Needs
    organization
    Install
    asana-export-workspace-and-wait
  4. Review and approve pending access requests on a resource

    Use it when Access requests have piled up on a resource and someone needs them reviewed and granted in one pass.

    A person decidesGrant every pending access request on target to the users listed above.

    Effect
    write
    Steps
    4 · loops
    Needs
    target
    Install
    asana-grant-pending-access-requests
  5. Review a week of time entries and approve the timesheets

    Use it when It is the end of a pay period and a manager needs the week's timesheets reviewed and marked approved.

    A person decidesApprove every timesheet in workspace workspace for from date to to date.

    Effect
    write
    Steps
    4 · loops
    Needs
    from date, to date and workspace
    Install
    asana-timesheet-approval-run
  6. Post a weekly status update on every active project

    Use it when Someone wants the Monday status update written onto every live project in a workspace at once.

    A person decidesPost a status color status update to every active project in workspace workspace gid.

    Effect
    write
    Steps
    4 · loops
    Needs
    status color, status text and workspace gid
    Install
    asana-weekly-project-status-roundup
  7. Clone a delivery project for a new client

    Use it when A new client is starting and their delivery project should be cloned from a proven one.

    A person decidesDuplicate project data as name and add the listed members.

    Effect
    write
    Steps
    5
    Needs
    members, name and project gid
    Install
    asana-duplicate-project-for-new-client
  8. Add a new teammate and give them their starter task list

    Use it when A new hire needs to be placed on a team with their standard onboarding project spun up.

    A person decidesAdd data to team data and create their onboarding project.

    Effect
    write
    Steps
    6
    Needs
    project name, project template gid, team gid and user gid
    Install
    asana-onboard-new-teammate
  9. Offboard a departing user from their teams and workspace

    Use it when Someone is leaving and their Asana team memberships need removing in one controlled pass.

    A person decidesRemove data from every team in workspace workspace, effective last day.

    Effect
    destructive
    Steps
    6 · loops
    Needs
    last day, user gid and workspace
    Install
    asana-offboard-departing-user
install a plan
account { op: "plans.install", slug: "asana-overdue-task-chase" }
# then ask for it by name; a schedule can run it on a timetable

Governance for Asana

Destructive actions wait for a yes.

39 Asana actions are destructive. The first 10:

  • Delete a taskasana.tasks.delete_task
  • Delete a projectasana.projects.delete_project
  • Delete a storyasana.stories.delete_story
  • Delete a time tracking entryasana.time_tracking_entries.delete_time_tracking_entry
  • Delete a roleasana.roles.delete_role
  • Delete a tagasana.tags.delete_tag
  • Delete an attachmentasana.attachments.delete_attachment
  • Remove a user from a teamasana.teams.remove_user_for_team
  • Delete a membershipasana.memberships.delete_membership
  • Remove a user from a workspace or organizationasana.workspaces.remove_user_for_workspace

A destructive action runs only with confirm: true. Under the human policy the agent cannot confirm for itself: the run stops until a named person approves, in the console or from a signed link in an email. The cap on a key is refused before the call is sent, never after.

doasana.tasks.delete_taskconfirm_policy: human

Delete a task?

intent: the user asked me to delete a task

run suspended · waiting for a named person · key asana-agent cannot confirm itself
In the console, or from an emailed signed link.
a key for this connector
account {  op: "keys.create", name: "asana-agent",  allowed_actions: ["asana.*"], cap_calls: 2000,  confirm_policy: "human_for_writes",  approval_rules: [    { match: "asana.tasks.delete_task", approver: "[email protected]" },    { match: "asana.projects.delete_project", approver: "[email protected]" },    { match: "asana.stories.delete_story", approver: "[email protected]" }  ]}
Illustrative. Scoped to Asana only, capped at 2,000 upstream calls, every write confirmed, and the destructive ones approved by a named person.

Cost

What Asana costs on actionlake.

Every Asana action is one upstream call, the only thing actionlake bills. Searching, check, cost, account and any call Asana refused with 401, 403, 429 or a 5xx are free. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

  • 1upstream call per actionall 260 Asana actions
  • 260actions pageeach page of a long list is one call
  • 119reads can be cacheda cache hit costs nothing
  • 100,000calls a month, freepaid plans from US$49 a month for 250,000

See pricing

Action index

Every Asana action.

260 actions by area: the id your agent calls, what it does, and its effect.

Projects46
  • asana.project_briefs.create_project_briefCreate a project briefwrite
  • asana.project_briefs.delete_project_briefDelete a project briefdestructive
  • asana.project_briefs.get_project_briefGet a project briefread
  • asana.project_briefs.update_project_briefUpdate a project briefwrite
  • asana.project_memberships.get_project_membershipGet a project membershipread
  • asana.project_memberships.get_project_memberships_for_projectGet memberships from a projectread
  • asana.project_statuses.create_project_status_for_projectCreate a project statuswrite
  • asana.project_statuses.delete_project_statusDelete a project statusdestructive
  • asana.project_statuses.get_project_statusGet a project statusread
  • asana.project_statuses.get_project_statuses_for_projectGet statuses from a projectread
  • asana.project_templates.delete_project_templateDelete a project templatedestructive
  • asana.project_templates.get_project_templateGet a project templateread
  • asana.project_templates.get_project_templatesGet multiple project templatesread
  • asana.project_templates.get_project_templates_for_teamGet a team's project templatesread
  • asana.project_templates.instantiate_projectInstantiate a project from a project templatewrite
  • asana.projects.add_custom_field_setting_for_projectAdd a custom field to a projectwrite
  • asana.projects.add_followers_for_projectAdd followers to a projectwrite
  • asana.projects.add_members_for_projectAdd users to a projectwrite
  • asana.projects.create_projectCreate a projectwrite
  • asana.projects.create_project_for_teamCreate a project in a teamwrite
  • asana.projects.create_project_for_team_rawCreate a project in a team Passes the whole `data` object through untouched. (raw)write
  • asana.projects.create_project_for_workspaceCreate a project in a workspacewrite
  • asana.projects.create_project_for_workspace_rawCreate a project in a workspace Passes the whole `data` object through untouched. (raw)write
  • asana.projects.create_project_rawCreate a project Passes the whole `data` object through untouched. (raw)write
  • asana.projects.delete_projectDelete a projectdestructive
  • asana.projects.duplicate_projectDuplicate a projectwrite
  • asana.projects.get_projectGet a projectread
  • asana.projects.get_projectsGet multiple projectsread
  • asana.projects.get_projects_for_taskGet projects a task is inread
  • asana.projects.get_projects_for_teamGet a team's projectsread
  • asana.projects.get_projects_for_workspaceGet all projects in a workspaceread
  • asana.projects.get_task_counts_for_projectGet task count of a projectread
  • asana.projects.project_save_as_templateCreate a project template from a projectwrite
  • asana.projects.remove_custom_field_setting_for_projectRemove a custom field from a projectdestructive
  • asana.projects.remove_followers_for_projectRemove followers from a projectdestructive
  • asana.projects.remove_members_for_projectRemove users from a projectdestructive
  • asana.projects.search_projects_for_workspaceSearch projects in a workspaceread
  • asana.projects.update_projectUpdate a projectwrite
  • asana.projects.update_project_rawUpdate a project Passes the whole `data` object through untouched. (raw)write
  • asana.sections.add_task_for_sectionAdd task to sectionwrite
  • asana.sections.create_section_for_projectCreate a section in a projectwrite
  • asana.sections.delete_sectionDelete a sectiondestructive
  • asana.sections.get_sectionGet a sectionread
  • asana.sections.get_sections_for_projectGet sections in a projectread
  • asana.sections.insert_section_for_projectMove or Insert sectionswrite
  • asana.sections.update_sectionUpdate a sectionwrite
Tasks34
  • asana.task_templates.delete_task_templateDelete a task templatedestructive
  • asana.task_templates.get_task_templateGet a task templateread
  • asana.task_templates.get_task_templatesGet multiple task templatesread
  • asana.task_templates.instantiate_taskInstantiate a task from a task templatewrite
  • asana.tasks.add_dependencies_for_taskSet dependencies for a taskwrite
  • asana.tasks.add_dependents_for_taskSet dependents for a taskwrite
  • asana.tasks.add_followers_for_taskAdd followers to a taskwrite
  • asana.tasks.add_project_for_taskAdd a project to a taskwrite
  • asana.tasks.add_tag_for_taskAdd a tag to a taskwrite
  • asana.tasks.create_subtask_for_taskCreate a subtaskwrite
  • asana.tasks.create_subtask_for_task_rawCreate a subtask Passes the whole `data` object through untouched. (raw)write
  • asana.tasks.create_taskCreate a taskwrite
  • asana.tasks.create_task_rawCreate a task Passes the whole `data` object through untouched. (raw)write
  • asana.tasks.delete_taskDelete a taskdestructive
  • asana.tasks.duplicate_taskDuplicate a taskwrite
  • asana.tasks.get_dependencies_for_taskGet dependencies from a taskread
  • asana.tasks.get_dependents_for_taskGet dependents from a taskread
  • asana.tasks.get_subtasks_for_taskGet subtasks from a taskread
  • asana.tasks.get_taskGet a taskread
  • asana.tasks.get_task_for_custom_idGet a task for a given custom IDread
  • asana.tasks.get_tasksGet multiple tasksread
  • asana.tasks.get_tasks_for_projectGet tasks from a projectread
  • asana.tasks.get_tasks_for_sectionGet tasks from a sectionread
  • asana.tasks.get_tasks_for_tagGet tasks from a tagread
  • asana.tasks.get_tasks_for_user_task_listGet tasks from a user task listread
  • asana.tasks.remove_dependencies_for_taskUnlink dependencies from a taskdestructive
  • asana.tasks.remove_dependents_for_taskUnlink dependents from a taskdestructive
  • asana.tasks.remove_follower_for_taskRemove followers from a taskdestructive
  • asana.tasks.remove_project_for_taskRemove a project from a taskdestructive
  • asana.tasks.remove_tag_for_taskRemove a tag from a taskdestructive
  • asana.tasks.search_tasks_for_workspaceSearch tasks in a workspaceread
  • asana.tasks.set_parent_for_taskSet the parent of a taskwrite
  • asana.tasks.update_taskUpdate a taskwrite
  • asana.tasks.update_task_rawUpdate a task Passes the whole `data` object through untouched. (raw)write
Time tracking23
  • asana.ooo_entries.create_ooo_entryCreate an OOO entrywrite
  • asana.ooo_entries.delete_ooo_entryDelete an OOO entrydestructive
  • asana.ooo_entries.get_ooo_entriesGet OOO entries for a userread
  • asana.ooo_entries.get_ooo_entryGet an OOO entryread
  • asana.ooo_entries.update_ooo_entryUpdate an OOO entrywrite
  • asana.time_periods.get_time_periodGet a time periodread
  • asana.time_periods.get_time_periodsGet time periodsread
  • asana.time_tracking_categories.create_time_tracking_categoryCreate a time tracking categorywrite
  • asana.time_tracking_categories.delete_time_tracking_categoryDelete a time tracking categorydestructive
  • asana.time_tracking_categories.get_time_tracking_categoriesGet time tracking categories for a workspaceread
  • asana.time_tracking_categories.get_time_tracking_categoryGet a time tracking categoryread
  • asana.time_tracking_categories.get_time_tracking_entries_for_time_tracking_categoryGet time tracking entries for a time tracking categoryread
  • asana.time_tracking_categories.update_time_tracking_categoryUpdate a time tracking categorywrite
  • asana.time_tracking_entries.create_time_tracking_entryCreate a time tracking entrywrite
  • asana.time_tracking_entries.delete_time_tracking_entryDelete a time tracking entrydestructive
  • asana.time_tracking_entries.get_time_tracking_entriesGet multiple time tracking entriesread
  • asana.time_tracking_entries.get_time_tracking_entries_for_taskGet time tracking entries for a taskread
  • asana.time_tracking_entries.get_time_tracking_entryGet a time tracking entryread
  • asana.time_tracking_entries.update_time_tracking_entryUpdate a time tracking entrywrite
  • asana.timesheet_approval_statuses.create_timesheet_approval_statusCreate a timesheet approval statuswrite
  • asana.timesheet_approval_statuses.get_timesheet_approval_statusGet a timesheet approval statusread
  • asana.timesheet_approval_statuses.get_timesheet_approval_statusesGet multiple timesheet approval statusesread
  • asana.timesheet_approval_statuses.update_timesheet_approval_statusUpdate a timesheet approval statuswrite
Portfolios21
  • asana.portfolio_memberships.get_portfolio_membershipGet a portfolio membershipread
  • asana.portfolio_memberships.get_portfolio_membershipsGet multiple portfolio membershipsread
  • asana.portfolio_memberships.get_portfolio_memberships_for_portfolioGet memberships from a portfolioread
  • asana.portfolios.add_custom_field_setting_for_portfolioAdd a custom field to a portfoliowrite
  • asana.portfolios.add_item_for_portfolioAdd a portfolio itemwrite
  • asana.portfolios.add_members_for_portfolioAdd users to a portfoliowrite
  • asana.portfolios.create_portfolioCreate a portfoliowrite
  • asana.portfolios.delete_portfolioDelete a portfoliodestructive
  • asana.portfolios.duplicate_portfolioDuplicate a portfoliowrite
  • asana.portfolios.get_items_for_portfolioGet portfolio itemsread
  • asana.portfolios.get_portfolioGet a portfolioread
  • asana.portfolios.get_portfoliosGet multiple portfoliosread
  • asana.portfolios.remove_custom_field_setting_for_portfolioRemove a custom field from a portfoliodestructive
  • asana.portfolios.remove_item_for_portfolioRemove a portfolio itemdestructive
  • asana.portfolios.remove_members_for_portfolioRemove users from a portfoliodestructive
  • asana.portfolios.update_portfolioUpdate a portfoliowrite
  • asana.portfolios.update_portfolio_rawUpdate a portfolio Passes the whole `data` object through untouched. (raw)write
  • asana.project_portfolio_settings.get_project_portfolio_settingGet a project portfolio settingread
  • asana.project_portfolio_settings.get_project_portfolio_settings_for_portfolioGet project portfolio settings for a portfolioread
  • asana.project_portfolio_settings.get_project_portfolio_settings_for_projectGet project portfolio settings for a projectread
  • asana.project_portfolio_settings.update_project_portfolio_settingUpdate a project portfolio settingwrite
Goals18
  • asana.goal_relationships.add_supporting_relationshipAdd a supporting goal relationshipwrite
  • asana.goal_relationships.get_goal_relationshipGet a goal relationshipread
  • asana.goal_relationships.get_goal_relationshipsGet goal relationshipsread
  • asana.goal_relationships.remove_supporting_relationshipRemoves a supporting goal relationshipdestructive
  • asana.goal_relationships.update_goal_relationshipUpdate a goal relationshipwrite
  • asana.goals.add_custom_field_setting_for_goalAdd a custom field to a goalwrite
  • asana.goals.add_followersAdd a collaborator to a goalwrite
  • asana.goals.create_goalCreate a goalwrite
  • asana.goals.create_goal_metricCreate a goal metricwrite
  • asana.goals.delete_goalDelete a goaldestructive
  • asana.goals.get_goalGet a goalread
  • asana.goals.get_goalsGet goalsread
  • asana.goals.get_parent_goals_for_goalGet parent goals from a goalread
  • asana.goals.remove_custom_field_setting_for_goalRemove a custom field from a goaldestructive
  • asana.goals.remove_followersRemove a collaborator from a goaldestructive
  • asana.goals.update_goalUpdate a goalwrite
  • asana.goals.update_goal_metricUpdate a goal metricwrite
  • asana.goals.update_goal_rawUpdate a goal Passes the whole `data` object through untouched. (raw)write
Custom fields14
  • asana.custom_field_settings.get_custom_field_settings_for_goalGet a goal's custom fieldsread
  • asana.custom_field_settings.get_custom_field_settings_for_portfolioGet a portfolio's custom fieldsread
  • asana.custom_field_settings.get_custom_field_settings_for_projectGet a project's custom fieldsread
  • asana.custom_field_settings.get_custom_field_settings_for_teamGet a team's custom fieldsread
  • asana.custom_fields.create_custom_fieldCreate a custom fieldwrite
  • asana.custom_fields.create_enum_option_for_custom_fieldCreate an enum optionwrite
  • asana.custom_fields.delete_custom_fieldDelete a custom fielddestructive
  • asana.custom_fields.get_custom_fieldGet a custom fieldread
  • asana.custom_fields.get_custom_fields_for_workspaceGet a workspace's custom fieldsread
  • asana.custom_fields.insert_enum_option_for_custom_fieldReorder a custom field's enumwrite
  • asana.custom_fields.update_custom_fieldUpdate a custom fieldwrite
  • asana.custom_fields.update_enum_optionUpdate an enum optionwrite
  • asana.custom_types.get_custom_typeGet a custom typeread
  • asana.custom_types.get_custom_typesGet all custom types associated with an objectread
Users12
  • asana.user_task_lists.get_user_task_listGet a user task listread
  • asana.user_task_lists.get_user_task_list_for_userGet a user's task listread
  • asana.users.get_favorites_for_userGet a user's favoritesread
  • asana.users.get_userGet a userread
  • asana.users.get_user_for_workspaceGet a user in a workspace or organizationread
  • asana.users.get_usersGet multiple usersread
  • asana.users.get_users_for_teamGet users in a teamread
  • asana.users.get_users_for_workspaceGet users in a workspace or organizationread
  • asana.users.update_userUpdate a userwrite
  • asana.users.update_user_for_workspaceUpdate a user in a workspace or organizationwrite
  • asana.users.update_user_for_workspace_rawUpdate a user in a workspace or organization Passes the whole `data` object through untouched. (raw)write
  • asana.users.update_user_rawUpdate a user Passes the whole `data` object through untouched. (raw)write
Teams11
  • asana.team_memberships.get_team_membershipGet a team membershipread
  • asana.team_memberships.get_team_membershipsGet team membershipsread
  • asana.team_memberships.get_team_memberships_for_teamGet memberships from a teamread
  • asana.team_memberships.get_team_memberships_for_userGet memberships from a userread
  • asana.teams.add_user_for_teamAdd a user to a teamwrite
  • asana.teams.create_teamCreate a teamwrite
  • asana.teams.get_teamGet a teamread
  • asana.teams.get_teams_for_userGet teams for a userread
  • asana.teams.get_teams_for_workspaceGet teams in a workspaceread
  • asana.teams.remove_user_for_teamRemove a user from a teamdestructive
  • asana.teams.update_teamUpdate a teamwrite
Workspaces9
  • asana.workspace_memberships.get_workspace_membershipGet a workspace membershipread
  • asana.workspace_memberships.get_workspace_memberships_for_userGet workspace memberships for a userread
  • asana.workspace_memberships.get_workspace_memberships_for_workspaceGet the workspace memberships for a workspaceread
  • asana.workspaces.add_user_for_workspaceAdd a user to a workspace or organizationwrite
  • asana.workspaces.get_workspaceGet a workspaceread
  • asana.workspaces.get_workspace_eventsGet workspace eventsread
  • asana.workspaces.get_workspacesGet multiple workspacesread
  • asana.workspaces.remove_user_for_workspaceRemove a user from a workspace or organizationdestructive
  • asana.workspaces.update_workspaceUpdate a workspacewrite
Stories8
  • asana.reactions.get_reactions_on_objectGet reactions with an emoji base on an object.read
  • asana.stories.create_story_for_goalCreate a story on a goalwrite
  • asana.stories.create_story_for_taskCreate a story on a taskwrite
  • asana.stories.delete_storyDelete a storydestructive
  • asana.stories.get_stories_for_goalGet stories from a goalread
  • asana.stories.get_stories_for_taskGet stories from a taskread
  • asana.stories.get_storyGet a storyread
  • asana.stories.update_storyUpdate a storywrite
Tags8
  • asana.tags.create_tagCreate a tagwrite
  • asana.tags.create_tag_for_workspaceCreate a tag in a workspacewrite
  • asana.tags.delete_tagDelete a tagdestructive
  • asana.tags.get_tagGet a tagread
  • asana.tags.get_tagsGet multiple tagsread
  • asana.tags.get_tags_for_taskGet a task's tagsread
  • asana.tags.get_tags_for_workspaceGet tags in a workspaceread
  • asana.tags.update_tagUpdate a tagwrite
Allocations5
  • asana.allocations.create_allocationCreate an allocationwrite
  • asana.allocations.delete_allocationDelete an allocationdestructive
  • asana.allocations.get_allocationGet an allocationread
  • asana.allocations.get_allocationsGet multiple allocationsread
  • asana.allocations.update_allocationUpdate an allocationwrite
Budgets5
  • asana.budgets.create_budgetCreate a budgetwrite
  • asana.budgets.delete_budgetDelete a budgetdestructive
  • asana.budgets.get_budgetGet a budgetread
  • asana.budgets.get_budgetsGet all budgetsread
  • asana.budgets.update_budgetUpdate a budgetwrite
Memberships5
  • asana.memberships.create_membershipCreate a membershipwrite
  • asana.memberships.delete_membershipDelete a membershipdestructive
  • asana.memberships.get_membershipGet a membershipread
  • asana.memberships.get_membershipsGet multiple membershipsread
  • asana.memberships.update_membershipUpdate a membershipwrite
Rates5
  • asana.rates.create_rateCreate a ratewrite
  • asana.rates.delete_rateDelete a ratedestructive
  • asana.rates.get_rateGet a rateread
  • asana.rates.get_ratesGet multiple ratesread
  • asana.rates.update_rateUpdate a ratewrite
Roles5
  • asana.roles.create_roleCreate a rolewrite
  • asana.roles.delete_roleDelete a roledestructive
  • asana.roles.get_roleGet a roleread
  • asana.roles.get_rolesGet multiple rolesread
  • asana.roles.update_roleUpdate a rolewrite
Webhooks5
  • asana.webhooks.create_webhookEstablish a webhookwrite
  • asana.webhooks.delete_webhookDelete a webhookdestructive
  • asana.webhooks.get_webhookGet a webhookread
  • asana.webhooks.get_webhooksGet multiple webhooksread
  • asana.webhooks.update_webhookUpdate a webhookwrite
Access4
  • asana.access_requests.approve_access_requestApprove an access requestwrite
  • asana.access_requests.create_access_requestCreate an access requestwrite
  • asana.access_requests.get_access_requestsGet access requestsread
  • asana.access_requests.reject_access_requestReject an access requestwrite
Attachments4
  • asana.attachments.create_attachment_for_objectUpload an attachmentwrite
  • asana.attachments.delete_attachmentDelete an attachmentdestructive
  • asana.attachments.get_attachmentGet an attachmentread
  • asana.attachments.get_attachments_for_objectGet attachments from an objectread
Exports4
  • asana.exports.create_graph_exportInitiate a graph exportwrite
  • asana.exports.create_resource_exportInitiate a resource exportwrite
  • asana.organization_exports.create_organization_exportCreate an organization export requestwrite
  • asana.organization_exports.get_organization_exportGet details on an org export requestread
Status updates4
  • asana.status_updates.create_status_for_objectCreate a status updatewrite
  • asana.status_updates.delete_statusDelete a status updatedestructive
  • asana.status_updates.get_statusGet a status updateread
  • asana.status_updates.get_statuses_for_objectGet status updates from an objectread
Agents2
  • asana.agents.get_agentGet an agentread
  • asana.agents.get_agents_for_workspaceGet a list of agents in a workspaceread
Usage2
  • asana.ai_studio_usage_api.get_ai_studio_runsGet AI Studio credit utilizationread
  • asana.ai_studio_usage_api.get_ai_studio_seatsGet AI Studio seatsread
Audit1
  • asana.audit_log_api.get_audit_log_eventsGet audit log eventsread
Batch1
  • asana.batch_api.create_batch_requestSubmit parallel requestswrite
Events1
  • asana.events.get_eventsGet events on a resourceread
Jobs1
  • asana.jobs.get_jobGet a job by idread
Rules1
  • asana.rules.trigger_ruleTrigger a rulewrite
Search1
  • asana.typeahead.typeahead_for_workspaceGet objects via typeaheadread

Questions

The Asana MCP server, answered.

Is there an Asana MCP server for Claude?

Yes. actionlake is an MCP gateway: a remote MCP server that gives Claude, or another MCP client, 260 Asana actions across projects, tasks, time tracking and portfolios, through the same eight tools it uses for every other connector. actionlake is independent; it is not made or endorsed by Asana.

Does Asana have its own MCP server?

Asana runs a remote MCP server at mcp.asana.com, signed in with OAuth. (Asana's documentation, checked 22 October 2026.) Use Asana's server when one person wants to work in Asana from their own AI client. Use actionlake when you also want Asana behind the same endpoint as your other systems: a key per agent with allowed actions and a spending cap, a named person's approval before destructive actions, a sealed record of every call, and one ask across Asana and another system.

What do I need to connect Asana?

Asana personal access token. The free call account { op: "connections.requirements", service: "asana" } lists exactly what to paste.

Can an AI agent delete or change things in Asana?

Only if its key allows it, and only with an explicit confirmation. 39 Asana actions are destructive, including delete a task, delete a project and delete a story. Each runs only with confirm: true. Under the human confirm policy, or an approval rule on the key, the run waits until a named person approves it.

Will an AI agent use up my Asana API limit?

actionlake paces every call to the limits in the Asana service file: 150 calls a minute per connection. Repeated reads are answered from cache (119 Asana actions can be), which never reaches Asana.

What does an Asana action cost?

One upstream call, the only unit actionlake bills. A list that pages bills one call per page (260 Asana actions page). Cache hits, searches, dry runs and calls Asana refused with 401, 403, 429 or a 5xx are free. The Free plan includes 100,000 calls a month with no card. Paid plans start at US$49 a month for 250,000 calls, with overage from US$0.30 down to US$0.18 per 1,000.

Which Asana API does it cover?

The Asana API 1.0 at app.asana.com/api/1.0. It is built from Asana's documentation as read on 15 September 2026. 260 actions in 29 areas, each one in the signed service file (version 2.0.0).

Does actionlake keep my Asana data, and where?

actionlake processes and stores data in Sydney, Australia; there is no US region yet. Reads may be cached for up to an hour, and a write clears the reads it affects. Each run's request and response is kept, sealed, for your plan's trace window: 1 day on Free, 3 days on Starter, 7 days on Pro, 14 days on Team, 30 days on Business and 30 days on Enterprise. Your Asana credential is sealed under your tenant's key, never logged and never returned. Your traffic is not used to train models.

Which AI clients can use it?

Claude Code, tested by us end to end, and the Claude app as a custom connector, tested by us with an existing key. Other MCP clients that support remote servers over Streamable HTTP (MCP revisions 2025-06-18 and 2025-11-25) and OAuth dynamic client registration, or a bearer header, should connect the same way; we have not tested them. Or plain REST, under the same action names.

Give your agent Asana today.

Start free - 100,000 calls/month, no card. No signup. Hard caps on every key. Cached answers are free.