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/mcpdo { 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.
- 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 - 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 - 03
Make the first call. Check before a write.
Ask in plain words; Claude picks the action. Before anything changes,
checkvalidates 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.0
app.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
Projects
4617 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
Tasks
3413 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)
Time tracking
2312 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
Portfolios
219 read · 8 write · 4 destructive
Get multiple portfolio memberships · Get memberships from a portfolio · Create a portfolio · Duplicate a portfolio
Goals
185 read · 9 write · 4 destructive
Get goal relationships · Create a goal · Get goals · Get parent goals from a goal
Custom fields
148 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
Users
128 read · 4 write · 0 destructive
Get multiple users · Get users in a team · Get users in a workspace or organization · Get a user
Teams
117 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.
| Action | What it does | Effect | Same name in |
|---|---|---|---|
asana.tasks.get_tasksGet multiple tasks | Get multiple tasks | read | work.task.list122 connectors |
asana.users.get_usersGet multiple users | Get multiple users | read | identity.user.list474 connectors |
asana.projects.get_projectsGet multiple projects | Get multiple projects | read | work.project.list109 connectors |
asana.teams.get_teams_for_workspaceGet teams in a workspace | Get teams in a workspace | read | identity.group.list262 connectors |
asana.workspaces.get_workspacesGet multiple workspaces | Get multiple workspaces | read | work.workspace.list50 connectors |
asana.stories.get_stories_for_taskGet stories from a task | Get stories from a task | read | work.task_comment.list27 connectors |
asana.tasks.create_taskCreate a task | Create a task | write | work.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. | write | work.task.create127 connectors |
asana.users.get_users_for_teamGet users in a team | Get users in a team | read | identity.user.list474 connectors |
asana.projects.get_projects_for_taskGet projects a task is in | Get projects a task is in | read | work.project.list109 connectors |
asana.stories.create_story_for_goalCreate a story on a goal | Create a story on a goal | write | work.task_comment.create28 connectors |
asana.tasks.delete_taskDelete a task | Delete a task | destructive | work.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.
- Readread
Which Asana tasks are overdue, and who owns each one?
calls
asana.tasks.get_tasks - Plandestructive
Offboard a departing user from their teams and workspace in Asana. Ask me before anything is sent or changed.
calls
asana.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 - Planwrite
Add a new teammate and give them their starter task list in Asana. Ask me before anything is sent or changed.
calls
asana.teams.get_teamasana.users.get_userasana.teams.add_user_for_teamasana.project_templates.instantiate_projectasana.tasks.create_task_raw - Writewrite
Create a task in Asana. Show me exactly what you will send before you save it.
calls
asana.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.
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.
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 decides
Archive 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.
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 decides
Produce a full export of organisation organization, including every project and task.
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 decides
Grant every pending access request on target to the users listed above.
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 decides
Approve every timesheet in workspace workspace for from date to to date.
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 decides
Post a status color status update to every active project in workspace workspace gid.
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 decides
Duplicate project data as name and add the listed members.
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 decides
Add data to team data and create their onboarding project.
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 decides
Remove data from every team in workspace workspace, effective last day.
account { op: "plans.install", slug: "asana-overdue-task-chase" }
# then ask for it by name; a schedule can run it on a timetableGovernance for Asana
Destructive actions wait for a yes.
39 Asana actions are destructive. The first 10:
- Delete a task
asana.tasks.delete_task - Delete a project
asana.projects.delete_project - Delete a story
asana.stories.delete_story - Delete a time tracking entry
asana.time_tracking_entries.delete_time_tracking_entry - Delete a role
asana.roles.delete_role - Delete a tag
asana.tags.delete_tag - Delete an attachment
asana.attachments.delete_attachment - Remove a user from a team
asana.teams.remove_user_for_team - Delete a membership
asana.memberships.delete_membership - Remove a user from a workspace or organization
asana.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.
Delete a task?
intent: the user asked me to delete a task
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]" } ]}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
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 briefwriteasana.project_briefs.delete_project_briefDelete a project briefdestructiveasana.project_briefs.get_project_briefGet a project briefreadasana.project_briefs.update_project_briefUpdate a project briefwriteasana.project_memberships.get_project_membershipGet a project membershipreadasana.project_memberships.get_project_memberships_for_projectGet memberships from a projectreadasana.project_statuses.create_project_status_for_projectCreate a project statuswriteasana.project_statuses.delete_project_statusDelete a project statusdestructiveasana.project_statuses.get_project_statusGet a project statusreadasana.project_statuses.get_project_statuses_for_projectGet statuses from a projectreadasana.project_templates.delete_project_templateDelete a project templatedestructiveasana.project_templates.get_project_templateGet a project templatereadasana.project_templates.get_project_templatesGet multiple project templatesreadasana.project_templates.get_project_templates_for_teamGet a team's project templatesreadasana.project_templates.instantiate_projectInstantiate a project from a project templatewriteasana.projects.add_custom_field_setting_for_projectAdd a custom field to a projectwriteasana.projects.add_followers_for_projectAdd followers to a projectwriteasana.projects.add_members_for_projectAdd users to a projectwriteasana.projects.create_projectCreate a projectwriteasana.projects.create_project_for_teamCreate a project in a teamwriteasana.projects.create_project_for_team_rawCreate a project in a team Passes the whole `data` object through untouched. (raw)writeasana.projects.create_project_for_workspaceCreate a project in a workspacewriteasana.projects.create_project_for_workspace_rawCreate a project in a workspace Passes the whole `data` object through untouched. (raw)writeasana.projects.create_project_rawCreate a project Passes the whole `data` object through untouched. (raw)writeasana.projects.delete_projectDelete a projectdestructiveasana.projects.duplicate_projectDuplicate a projectwriteasana.projects.get_projectGet a projectreadasana.projects.get_projectsGet multiple projectsreadasana.projects.get_projects_for_taskGet projects a task is inreadasana.projects.get_projects_for_teamGet a team's projectsreadasana.projects.get_projects_for_workspaceGet all projects in a workspacereadasana.projects.get_task_counts_for_projectGet task count of a projectreadasana.projects.project_save_as_templateCreate a project template from a projectwriteasana.projects.remove_custom_field_setting_for_projectRemove a custom field from a projectdestructiveasana.projects.remove_followers_for_projectRemove followers from a projectdestructiveasana.projects.remove_members_for_projectRemove users from a projectdestructiveasana.projects.search_projects_for_workspaceSearch projects in a workspacereadasana.projects.update_projectUpdate a projectwriteasana.projects.update_project_rawUpdate a project Passes the whole `data` object through untouched. (raw)writeasana.sections.add_task_for_sectionAdd task to sectionwriteasana.sections.create_section_for_projectCreate a section in a projectwriteasana.sections.delete_sectionDelete a sectiondestructiveasana.sections.get_sectionGet a sectionreadasana.sections.get_sections_for_projectGet sections in a projectreadasana.sections.insert_section_for_projectMove or Insert sectionswriteasana.sections.update_sectionUpdate a sectionwrite
Tasks34
asana.task_templates.delete_task_templateDelete a task templatedestructiveasana.task_templates.get_task_templateGet a task templatereadasana.task_templates.get_task_templatesGet multiple task templatesreadasana.task_templates.instantiate_taskInstantiate a task from a task templatewriteasana.tasks.add_dependencies_for_taskSet dependencies for a taskwriteasana.tasks.add_dependents_for_taskSet dependents for a taskwriteasana.tasks.add_followers_for_taskAdd followers to a taskwriteasana.tasks.add_project_for_taskAdd a project to a taskwriteasana.tasks.add_tag_for_taskAdd a tag to a taskwriteasana.tasks.create_subtask_for_taskCreate a subtaskwriteasana.tasks.create_subtask_for_task_rawCreate a subtask Passes the whole `data` object through untouched. (raw)writeasana.tasks.create_taskCreate a taskwriteasana.tasks.create_task_rawCreate a task Passes the whole `data` object through untouched. (raw)writeasana.tasks.delete_taskDelete a taskdestructiveasana.tasks.duplicate_taskDuplicate a taskwriteasana.tasks.get_dependencies_for_taskGet dependencies from a taskreadasana.tasks.get_dependents_for_taskGet dependents from a taskreadasana.tasks.get_subtasks_for_taskGet subtasks from a taskreadasana.tasks.get_taskGet a taskreadasana.tasks.get_task_for_custom_idGet a task for a given custom IDreadasana.tasks.get_tasksGet multiple tasksreadasana.tasks.get_tasks_for_projectGet tasks from a projectreadasana.tasks.get_tasks_for_sectionGet tasks from a sectionreadasana.tasks.get_tasks_for_tagGet tasks from a tagreadasana.tasks.get_tasks_for_user_task_listGet tasks from a user task listreadasana.tasks.remove_dependencies_for_taskUnlink dependencies from a taskdestructiveasana.tasks.remove_dependents_for_taskUnlink dependents from a taskdestructiveasana.tasks.remove_follower_for_taskRemove followers from a taskdestructiveasana.tasks.remove_project_for_taskRemove a project from a taskdestructiveasana.tasks.remove_tag_for_taskRemove a tag from a taskdestructiveasana.tasks.search_tasks_for_workspaceSearch tasks in a workspacereadasana.tasks.set_parent_for_taskSet the parent of a taskwriteasana.tasks.update_taskUpdate a taskwriteasana.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 entrywriteasana.ooo_entries.delete_ooo_entryDelete an OOO entrydestructiveasana.ooo_entries.get_ooo_entriesGet OOO entries for a userreadasana.ooo_entries.get_ooo_entryGet an OOO entryreadasana.ooo_entries.update_ooo_entryUpdate an OOO entrywriteasana.time_periods.get_time_periodGet a time periodreadasana.time_periods.get_time_periodsGet time periodsreadasana.time_tracking_categories.create_time_tracking_categoryCreate a time tracking categorywriteasana.time_tracking_categories.delete_time_tracking_categoryDelete a time tracking categorydestructiveasana.time_tracking_categories.get_time_tracking_categoriesGet time tracking categories for a workspacereadasana.time_tracking_categories.get_time_tracking_categoryGet a time tracking categoryreadasana.time_tracking_categories.get_time_tracking_entries_for_time_tracking_categoryGet time tracking entries for a time tracking categoryreadasana.time_tracking_categories.update_time_tracking_categoryUpdate a time tracking categorywriteasana.time_tracking_entries.create_time_tracking_entryCreate a time tracking entrywriteasana.time_tracking_entries.delete_time_tracking_entryDelete a time tracking entrydestructiveasana.time_tracking_entries.get_time_tracking_entriesGet multiple time tracking entriesreadasana.time_tracking_entries.get_time_tracking_entries_for_taskGet time tracking entries for a taskreadasana.time_tracking_entries.get_time_tracking_entryGet a time tracking entryreadasana.time_tracking_entries.update_time_tracking_entryUpdate a time tracking entrywriteasana.timesheet_approval_statuses.create_timesheet_approval_statusCreate a timesheet approval statuswriteasana.timesheet_approval_statuses.get_timesheet_approval_statusGet a timesheet approval statusreadasana.timesheet_approval_statuses.get_timesheet_approval_statusesGet multiple timesheet approval statusesreadasana.timesheet_approval_statuses.update_timesheet_approval_statusUpdate a timesheet approval statuswrite
Portfolios21
asana.portfolio_memberships.get_portfolio_membershipGet a portfolio membershipreadasana.portfolio_memberships.get_portfolio_membershipsGet multiple portfolio membershipsreadasana.portfolio_memberships.get_portfolio_memberships_for_portfolioGet memberships from a portfolioreadasana.portfolios.add_custom_field_setting_for_portfolioAdd a custom field to a portfoliowriteasana.portfolios.add_item_for_portfolioAdd a portfolio itemwriteasana.portfolios.add_members_for_portfolioAdd users to a portfoliowriteasana.portfolios.create_portfolioCreate a portfoliowriteasana.portfolios.delete_portfolioDelete a portfoliodestructiveasana.portfolios.duplicate_portfolioDuplicate a portfoliowriteasana.portfolios.get_items_for_portfolioGet portfolio itemsreadasana.portfolios.get_portfolioGet a portfolioreadasana.portfolios.get_portfoliosGet multiple portfoliosreadasana.portfolios.remove_custom_field_setting_for_portfolioRemove a custom field from a portfoliodestructiveasana.portfolios.remove_item_for_portfolioRemove a portfolio itemdestructiveasana.portfolios.remove_members_for_portfolioRemove users from a portfoliodestructiveasana.portfolios.update_portfolioUpdate a portfoliowriteasana.portfolios.update_portfolio_rawUpdate a portfolio Passes the whole `data` object through untouched. (raw)writeasana.project_portfolio_settings.get_project_portfolio_settingGet a project portfolio settingreadasana.project_portfolio_settings.get_project_portfolio_settings_for_portfolioGet project portfolio settings for a portfolioreadasana.project_portfolio_settings.get_project_portfolio_settings_for_projectGet project portfolio settings for a projectreadasana.project_portfolio_settings.update_project_portfolio_settingUpdate a project portfolio settingwrite
Goals18
asana.goal_relationships.add_supporting_relationshipAdd a supporting goal relationshipwriteasana.goal_relationships.get_goal_relationshipGet a goal relationshipreadasana.goal_relationships.get_goal_relationshipsGet goal relationshipsreadasana.goal_relationships.remove_supporting_relationshipRemoves a supporting goal relationshipdestructiveasana.goal_relationships.update_goal_relationshipUpdate a goal relationshipwriteasana.goals.add_custom_field_setting_for_goalAdd a custom field to a goalwriteasana.goals.add_followersAdd a collaborator to a goalwriteasana.goals.create_goalCreate a goalwriteasana.goals.create_goal_metricCreate a goal metricwriteasana.goals.delete_goalDelete a goaldestructiveasana.goals.get_goalGet a goalreadasana.goals.get_goalsGet goalsreadasana.goals.get_parent_goals_for_goalGet parent goals from a goalreadasana.goals.remove_custom_field_setting_for_goalRemove a custom field from a goaldestructiveasana.goals.remove_followersRemove a collaborator from a goaldestructiveasana.goals.update_goalUpdate a goalwriteasana.goals.update_goal_metricUpdate a goal metricwriteasana.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 fieldsreadasana.custom_field_settings.get_custom_field_settings_for_portfolioGet a portfolio's custom fieldsreadasana.custom_field_settings.get_custom_field_settings_for_projectGet a project's custom fieldsreadasana.custom_field_settings.get_custom_field_settings_for_teamGet a team's custom fieldsreadasana.custom_fields.create_custom_fieldCreate a custom fieldwriteasana.custom_fields.create_enum_option_for_custom_fieldCreate an enum optionwriteasana.custom_fields.delete_custom_fieldDelete a custom fielddestructiveasana.custom_fields.get_custom_fieldGet a custom fieldreadasana.custom_fields.get_custom_fields_for_workspaceGet a workspace's custom fieldsreadasana.custom_fields.insert_enum_option_for_custom_fieldReorder a custom field's enumwriteasana.custom_fields.update_custom_fieldUpdate a custom fieldwriteasana.custom_fields.update_enum_optionUpdate an enum optionwriteasana.custom_types.get_custom_typeGet a custom typereadasana.custom_types.get_custom_typesGet all custom types associated with an objectread
Users12
asana.user_task_lists.get_user_task_listGet a user task listreadasana.user_task_lists.get_user_task_list_for_userGet a user's task listreadasana.users.get_favorites_for_userGet a user's favoritesreadasana.users.get_userGet a userreadasana.users.get_user_for_workspaceGet a user in a workspace or organizationreadasana.users.get_usersGet multiple usersreadasana.users.get_users_for_teamGet users in a teamreadasana.users.get_users_for_workspaceGet users in a workspace or organizationreadasana.users.update_userUpdate a userwriteasana.users.update_user_for_workspaceUpdate a user in a workspace or organizationwriteasana.users.update_user_for_workspace_rawUpdate a user in a workspace or organization Passes the whole `data` object through untouched. (raw)writeasana.users.update_user_rawUpdate a user Passes the whole `data` object through untouched. (raw)write
Teams11
asana.team_memberships.get_team_membershipGet a team membershipreadasana.team_memberships.get_team_membershipsGet team membershipsreadasana.team_memberships.get_team_memberships_for_teamGet memberships from a teamreadasana.team_memberships.get_team_memberships_for_userGet memberships from a userreadasana.teams.add_user_for_teamAdd a user to a teamwriteasana.teams.create_teamCreate a teamwriteasana.teams.get_teamGet a teamreadasana.teams.get_teams_for_userGet teams for a userreadasana.teams.get_teams_for_workspaceGet teams in a workspacereadasana.teams.remove_user_for_teamRemove a user from a teamdestructiveasana.teams.update_teamUpdate a teamwrite
Workspaces9
asana.workspace_memberships.get_workspace_membershipGet a workspace membershipreadasana.workspace_memberships.get_workspace_memberships_for_userGet workspace memberships for a userreadasana.workspace_memberships.get_workspace_memberships_for_workspaceGet the workspace memberships for a workspacereadasana.workspaces.add_user_for_workspaceAdd a user to a workspace or organizationwriteasana.workspaces.get_workspaceGet a workspacereadasana.workspaces.get_workspace_eventsGet workspace eventsreadasana.workspaces.get_workspacesGet multiple workspacesreadasana.workspaces.remove_user_for_workspaceRemove a user from a workspace or organizationdestructiveasana.workspaces.update_workspaceUpdate a workspacewrite
Stories8
asana.reactions.get_reactions_on_objectGet reactions with an emoji base on an object.readasana.stories.create_story_for_goalCreate a story on a goalwriteasana.stories.create_story_for_taskCreate a story on a taskwriteasana.stories.delete_storyDelete a storydestructiveasana.stories.get_stories_for_goalGet stories from a goalreadasana.stories.get_stories_for_taskGet stories from a taskreadasana.stories.get_storyGet a storyreadasana.stories.update_storyUpdate a storywrite
Tags8
asana.tags.create_tagCreate a tagwriteasana.tags.create_tag_for_workspaceCreate a tag in a workspacewriteasana.tags.delete_tagDelete a tagdestructiveasana.tags.get_tagGet a tagreadasana.tags.get_tagsGet multiple tagsreadasana.tags.get_tags_for_taskGet a task's tagsreadasana.tags.get_tags_for_workspaceGet tags in a workspacereadasana.tags.update_tagUpdate a tagwrite
Allocations5
asana.allocations.create_allocationCreate an allocationwriteasana.allocations.delete_allocationDelete an allocationdestructiveasana.allocations.get_allocationGet an allocationreadasana.allocations.get_allocationsGet multiple allocationsreadasana.allocations.update_allocationUpdate an allocationwrite
Budgets5
asana.budgets.create_budgetCreate a budgetwriteasana.budgets.delete_budgetDelete a budgetdestructiveasana.budgets.get_budgetGet a budgetreadasana.budgets.get_budgetsGet all budgetsreadasana.budgets.update_budgetUpdate a budgetwrite
Memberships5
asana.memberships.create_membershipCreate a membershipwriteasana.memberships.delete_membershipDelete a membershipdestructiveasana.memberships.get_membershipGet a membershipreadasana.memberships.get_membershipsGet multiple membershipsreadasana.memberships.update_membershipUpdate a membershipwrite
Rates5
asana.rates.create_rateCreate a ratewriteasana.rates.delete_rateDelete a ratedestructiveasana.rates.get_rateGet a ratereadasana.rates.get_ratesGet multiple ratesreadasana.rates.update_rateUpdate a ratewrite
Roles5
asana.roles.create_roleCreate a rolewriteasana.roles.delete_roleDelete a roledestructiveasana.roles.get_roleGet a rolereadasana.roles.get_rolesGet multiple rolesreadasana.roles.update_roleUpdate a rolewrite
Webhooks5
asana.webhooks.create_webhookEstablish a webhookwriteasana.webhooks.delete_webhookDelete a webhookdestructiveasana.webhooks.get_webhookGet a webhookreadasana.webhooks.get_webhooksGet multiple webhooksreadasana.webhooks.update_webhookUpdate a webhookwrite
Access4
asana.access_requests.approve_access_requestApprove an access requestwriteasana.access_requests.create_access_requestCreate an access requestwriteasana.access_requests.get_access_requestsGet access requestsreadasana.access_requests.reject_access_requestReject an access requestwrite
Attachments4
asana.attachments.create_attachment_for_objectUpload an attachmentwriteasana.attachments.delete_attachmentDelete an attachmentdestructiveasana.attachments.get_attachmentGet an attachmentreadasana.attachments.get_attachments_for_objectGet attachments from an objectread
Exports4
asana.exports.create_graph_exportInitiate a graph exportwriteasana.exports.create_resource_exportInitiate a resource exportwriteasana.organization_exports.create_organization_exportCreate an organization export requestwriteasana.organization_exports.get_organization_exportGet details on an org export requestread
Status updates4
asana.status_updates.create_status_for_objectCreate a status updatewriteasana.status_updates.delete_statusDelete a status updatedestructiveasana.status_updates.get_statusGet a status updatereadasana.status_updates.get_statuses_for_objectGet status updates from an objectread
Agents2
asana.agents.get_agentGet an agentreadasana.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 utilizationreadasana.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.