
Get attachment details by GID including download URLs and metadata
Permanently delete an attachment. This action is irreversible. Use list_attachments to find attachment GIDs.
List attachments for task or project with pagination
Create workspace custom field with type: text, number, date, enum, multi-enum, or people. Use list_workspaces to find workspace GIDs.
Get custom field details by GID including type, options, and settings
Update a custom field's name, description, or number precision. Enum options cannot be changed here. Use listcustomfields to find custom field GIDs.
Permanently delete a custom field. This action is irreversible. Use listcustomfields to find custom field GIDs.
List custom fields in workspace with pagination
Create project in workspace with team, privacy, view, dates, and members. Use listworkspaces and listteams to find workspace and team GIDs.
Get complete project details by GID including name, team, members, dates, and settings
Update project properties including name, notes, color, privacy, dates, and owner. Only fields you supply change. Use list_projects to find project GIDs.
Permanently delete a project. This action is irreversible. Use list_projects to find project GIDs.
List projects with workspace, team, or archive filtering. Supports pagination
Get all tasks in a project with optional field selection and pagination
Add members to project for collaboration and access. Use listprojects and listusers to find project and user GIDs.
Remove members from project to revoke access. Use listprojects and listusers to find project and user GIDs.
Associate custom field with project for task metadata. Use listprojects and listcustom_fields to find the GIDs.
Remove custom field from project to clean up metadata. Use listprojects and listcustom_fields to find the GIDs.
List all custom fields configured on a project with pagination support
Advanced task search with text, assignee, project, date, and custom field filters. Requires Premium. This endpoint cannot paginate: it returns at most one page (limit, max 100) and no cursor. resultstruncated=true means matches were cut off -- narrow the filters and search again. Use listtasks for pageable browsing.
Get all comments and activity for task including assignments and status changes
Get story or comment details by GID including text and author
Edit story or comment text and pinned status. Can only edit own stories. Use gettaskstories to find story GIDs.
Delete story or comment. Can only delete own stories. Action is irreversible. Use gettaskstories to find story GIDs.
Add a plain-text or HTML comment to a task, optionally pinned. Provide text or htmltext. Use listtasks to find task GIDs.
List tags in workspace with optional field selection and pagination
Get all tags for a task including names and colors
Create tag in workspace with name, color, and notes. Use list_workspaces to find workspace GIDs.
Get a single tag by GID including name, color, notes, and workspace. Use list_tags to find tag GIDs.
Update a tag's name, color, or notes. Only the fields you supply are changed. Use list_tags to find tag GIDs.
Permanently delete a tag. Removes it from every task it is applied to. This action is irreversible. Use list_tags to find tag GIDs.
Create task in workspace, project, or as subtask with name, assignee, dates, followers, tags, and custom fields. Use listworkspaces or listprojects to find the GIDs.
Get complete task details by GID including name, assignee, dates, status, followers, tags, and custom fields
Update task properties including name, assignee, dates, status, and custom fields. Use list_tasks to find task GIDs.
Permanently delete a task. This action is irreversible. Use list_tasks to find task GIDs.
List tasks filtered by project, tag, section, usertasklist, or assignee+workspace. Supports date filters and pagination. Use listprojects, listtags, listworkspaces, or getusertasklist (a user's My Tasks list) to find valid GIDs. No tool lists sections: take a section GID from its URL in the Asana UI.
Add followers to task for notifications about task updates and changes. Use listtasks and listusers to find task and user GIDs.
Remove followers from task to stop notifications about updates. Use listtasks and listusers to find task and user GIDs.
Get all subtasks of a parent task with optional field selection
Create subtask under parent task with name, assignee, dates, and other properties. Use list_tasks to find the parent task GID.
Add tag to task for categorization and filtering. Use listtasks and listtags to find task and tag GIDs.
Remove tag from task to change categorization. Use listtasks and listtags to find task and tag GIDs.
Get tasks that must complete before this task. Returns up to 30 dependencies
Add dependencies to a task and return the task's resulting dependency list. Asana's write response is empty, so this reads the list back to prove the effect: 2 API calls per invocation. Max 30 dependencies and dependents combined per task. Use list_tasks to find task GIDs.
Remove dependency relationships from a task and return its remaining dependency list. Asana's write response is empty, so this reads the list back to prove the effect: 2 API calls per invocation. Use gettaskdependencies to see current ones, or list_tasks to find task GIDs.
List teams in workspace with optional field selection
Get team details by GID including name and organization
Get all members of a team with user details. Use listteams to find team GIDs. Pass optfields to get those fields in one request; without it this makes one extra request per member. Members whose lookup fails are returned as a bare {gid} ref and counted in degraded_members.
List users in workspace with optional team filtering and field selection
Get user details by GID including name, email, and workspaces
Get current authenticated user details including name, email, and workspaces
Get a user's My Tasks list for one workspace and return its GID. Call this first to obtain the GID for the usertasklist filter on listtasks: that filter needs a user-task-list GID, not a user GID. usergid accepts "me" (default), an email, or a GID from listusers; get workspace GIDs from listworkspaces.
Validate Asana credentials. Verifies credentials during setup.
List all workspaces accessible to the authenticated user
Get workspace details by GID including name and organization status
Update workspace name. Use list_workspaces to find workspace GIDs.

In an mcp.json file, add the configuration below, and restart Cursor.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "url": "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
5 "headers": {
6 "Authorization": "Bearer yMt*****"
7 }
8 }
9 }
10}
11Open your Claude Desktop configuration file and add the server configuration below. You'll also need to restart the application for the changes to take effect.
Make sure Claude is using the Node v20+.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "yMt*****"
14 }
15 }
16 }
17}Open your Windsurf MCP configuration file and add the server configuration below.
Click on the refresh button in the top right of the Manage MCP server page or in the top right of the chat box in the box icon.
Learn more in the official documentation ↗
1{
2 "mcpServers": {
3 "agent-handler": {
4 "command": "npx",
5 "args": [
6 "-y",
7 "mcp-remote@latest",
8 "https://ah-api.merge.dev/api/v1/tool-packs/<tool-pack-id>/registered-users/<registered-user-id>/mcp",
9 "--header",
10 "Authorization: Bearer ${AUTH_TOKEN}"
11 ],
12 "env": {
13 "AUTH_TOKEN": "<ah-production-access-key>"
14 }
15 }
16 }
17 }In Command Palette (Cmd+Shift+P on macOS, Ctrl+Shift+P on Windows), run "MCP: Open User Configuration".
You can then add the configuration below and press "start" right under servers. Enter the auth token when prompted.
Learn more in the official documentation ↗
1{
2 "inputs": [
3 {
4 "type": "promptString",
5 "id": "agent-handler-auth",
6 "description": "Agent Handler AUTH_TOKEN", // "yMt*****" when prompt
7 "password": true
8 }
9 ],
10 "servers": {
11 "agent-handler": {
12 "type": "stdio",
13 "command": "npx",
14 "args": [
15 "-y",
16 "mcp-remote@latest",
17 "https://ah-api-develop.merge.dev/api/v1/tool-packs/{TOOL_PACK_ID}/registered-users/{REGISTERED_USER_ID}/mcp",
18 "--header",
19 "Authorization: Bearer ${input:agent-handler-auth}"
20 ]
21 }
22 }
23}Here are just a few common use cases:
Here are some popular tools across data types:
Projects
Tasks
Teams
Merge Agent Handler provides infrastructure-level capabilities that go beyond a standalone MCP server implementation.
Here are just a few unique benefits of using Merge Agent Handler’s Asana MCP server:
Yes, Merge Agent Handler allows you to configure custom security and DLP rules that inspect Asana tool inputs and responses. These rules can automatically block or modify tool calls based on your organization’s data governance requirements.
Here are just a few examples:
Here are the steps to start using Merge Agent Handler's Asana MCP server:
1. Create an Agent Handler account. You can sign up for a free Merge Agent Handler account here.
2. Set up a Tool Pack (a collection of connectors your agent can use). From the dashboard, navigate to Tool Packs, select "Create New Tool Pack," and choose the Asana connector from the list of available connectors. Give your Tool Pack a descriptive name (e.g., "Task Management Pack").
3. Add a Registered User (an identity your agent uses to execute actions). Go to the Registered Users section in the dashboard and select "Create Registered User."
You'll be asked to provide:
Agent Handler will generate a Registered User ID for use in step 4.
4. Gather your configuration details. You'll need these three items:
5. Set up your IDE or AI platform. Add the MCP server configuration to your development environment (Cursor, Claude Desktop, Windsurf, VS Code, etc.) with the Tool Pack ID, Registered User ID, and API Key.
6. Confirm the connection. Launch your AI assistant or agent interface. The Asana tools should appear in your tools/context menu.
7. Begin using Asana tools. Try prompts like "Show me my Asana tasks due this week" or "Create a new Asana project called Q1 Marketing Campaign."
Whether you're an engineer experimenting with agents or a product manager looking to add tools, you can get started for free now