Skip to content

Connect Asana to Claude: Automate Task Management via MCP

Learn how to connect Asana to Claude using a managed MCP server. Automate task tracking, project triage, and cross-functional workflows with AI agents.

Uday Gajavalli Uday Gajavalli · · 9 min read
Connect Asana to Claude: Automate Task Management via MCP

A 2025 Forrester report indicates that 73% of enterprise automation initiatives fail to scale because AI agents lack secure, authenticated access to core project management systems. You want to connect Asana to Claude so your AI agents can query project statuses, assign tasks, and manage cross-functional workflows entirely through natural language. If your team uses OpenAI, check out our guide on connecting Asana to ChatGPT, or read our broader architectural overview on connecting Asana to AI Agents.

To connect Asana to Claude, you need a Model Context Protocol (MCP) server. This server acts as a translation layer, converting an LLM's standardized tool calls into Asana's specific REST API requests, while handling OAuth token management and schema validation.

You have two options: spend weeks building, hosting, and maintaining a custom MCP server, or use a managed infrastructure layer that handles the boilerplate dynamically. This guide breaks down exactly how to use Truto to generate a secure, managed MCP server for Asana, connect it natively to Claude, and execute complex project management workflows using natural language.

The Engineering Reality of the Asana API

A custom MCP server is a self-hosted integration layer. While the Model Context Protocol provides a predictable way for models to discover tools, implementing it against vendor APIs requires heavy engineering lifting, similar to the challenges of connecting Jira to Claude. Asana's REST API has specific quirks that make building a reliable agent integration difficult.

First, Asana relies heavily on opt_fields. By default, querying an Asana task returns a highly truncated object. If your AI agent needs to read custom fields, subtasks, or dependency relationships, your MCP server must explicitly request those nested attributes via query parameters. If you miss a field in your schema definition, the agent flies blind.

Second, the data model hierarchy requires strict context. Tasks belong to Projects, which belong to Workspaces or Organizations. An AI agent cannot simply "create a task" - it must resolve the target Workspace GID (Global ID) and Project GID first. If your MCP server lacks the tools to query this hierarchy, the agent will hallucinate invalid IDs and fail.

Finally, Asana enforces strict rate limits. Truto does not automatically retry, throttle, or apply backoff on rate limit errors. When the Asana API returns an HTTP 429, Truto passes that error directly to the caller, normalizing the rate limit information into standardized headers (ratelimit-limit, ratelimit-remaining, ratelimit-reset) per the IETF spec. Your AI agent or MCP client is responsible for implementing exponential backoff.

Truto solves the schema and routing problems by making tool generation dynamic. Rather than hand-coding tool definitions for Asana, Truto derives them directly from the integration's resource definitions and documentation records.

sequenceDiagram
    participant C as Claude Desktop
    participant M as MCP Server (Truto)
    participant A as Asana API
    C->>M: JSON-RPC: tools/call (list_all_asana_tasks)
    Note over M: Validates cryptographic token,<br>Applies tag/method filters
    M->>A: GET /tasks?opt_fields=gid,name,completed...
    A-->>M: Raw JSON response
    M-->>C: Formatted MCP Tool Result

How to Create the Asana MCP Server

Truto scopes each MCP server to a single integrated account. The server URL contains a cryptographic token that encodes which Asana account to use, what tools to expose, and when the server expires. You can create this server via the Truto UI or programmatically via the API.

Method 1: Via the Truto UI

For quick testing or manual provisioning, use the dashboard:

  1. Navigate to the integrated account page for your connected Asana instance.
  2. Click the MCP Servers tab.
  3. Click Create MCP Server.
  4. Select your desired configuration (name, allowed methods, tags, and expiration).
  5. Copy the generated MCP server URL.

Method 2: Via the API

For automated provisioning, you can generate the MCP server programmatically. The API validates that the integration has tools available, generates a secure token, stores it in distributed storage, and returns a ready-to-use URL.

Make a POST request to /integrated-account/:id/mcp:

curl -X POST https://api.truto.one/integrated-account/<ASANA_ACCOUNT_ID>/mcp \
  -H "Authorization: Bearer <YOUR_TRUTO_API_TOKEN>" \
  -H "Content-Type: application/json" \
  -d '{
    "name": "Claude Asana Assistant",
    "config": {
      "methods": ["read", "write"]
    }
  }'

Expected Response:

{
  "id": "mcp_abc123",
  "name": "Claude Asana Assistant",
  "config": {
    "methods": ["read", "write"]
  },
  "expires_at": null,
  "url": "https://api.truto.one/mcp/a1b2c3d4e5f67890"
}

Keep this URL secure. It acts as the self-contained authentication mechanism for the MCP server.

How to Connect the MCP Server to Claude

Once you have your Truto MCP URL, you need to register it with Claude. You can do this through the Claude UI or by manually editing the configuration file.

Method A: Via the Claude UI

If you are using Claude's web interface or enterprise workspace:

  1. Navigate to Settings -> Integrations (or Connectors, depending on your plan).
  2. Click Add MCP Server or Add custom connector.
  3. Paste the Truto MCP URL.
  4. Click Add. Claude will immediately perform a handshake and discover the available Asana tools.

Method B: Via Manual Config File (Claude Desktop)

If you are using the Claude Desktop application for local agent development, you must edit the claude_desktop_config.json file. Truto MCP servers communicate over Server-Sent Events (SSE).

Add the following configuration to your file:

{
  "mcpServers": {
    "asana-truto": {
      "command": "npx",
      "args": [
        "-y",
        "@modelcontextprotocol/server-sse",
        "--url",
        "https://api.truto.one/mcp/<YOUR_TOKEN>"
      ]
    }
  }
}

Restart Claude Desktop. The application will initialize the connection, and you will see the Asana tools appear in the interface.

Security and Access Control

Giving an LLM unrestricted access to your company's Asana instance is a massive security risk. Truto provides granular controls to restrict exactly what an AI agent can do.

  • Method Filtering: Restrict the MCP server to read-only operations. By setting config.methods: ["read"], you allow Claude to execute list and get requests, entirely blocking create, update, and delete operations.
  • Tag Filtering: Scope access to specific functional areas. If you only want Claude to access attachments, set config.tags: ["attachments"]. Tools unrelated to this tag will be omitted during tool generation.
  • Token Authentication: For strict enterprise environments, enable require_api_token_auth: true. This forces the MCP client to provide a valid Truto API token in the Authorization header, ensuring that possession of the URL alone is not enough to access the data.
  • Ephemeral Access: Use the expires_at field to generate short-lived servers. The platform schedules background work to automatically revoke the token and clean up storage once the expiration time is reached.

Asana Tool Inventory

Truto automatically generates a comprehensive suite of tools based on Asana's API documentation. Here are the most useful tools for agentic workflows.

list_all_asana_tasks

  • Description: Get multiple tasks in Asana. Returns compact task records with key fields such as task ID, name, and completion status.
  • Example Prompt: "Pull a list of all incomplete tasks in the Q3 Marketing project and group them by assignee."

create_a_asana_task

  • Description: Create a new task in Asana by providing task details. Returns the created task's GID, name, completion status, due dates, assignee, and workspace.
  • Example Prompt: "Create a new task for John to review the API documentation. Set the due date to next Friday and add it to the Engineering workspace."

update_a_asana_task_by_id

  • Description: Update a specific task in Asana by its GID. Modify approval status, completion state, due dates, assignees, or custom fields.
  • Example Prompt: "Find the task named 'Database Migration' and mark it as completed."

list_all_asana_projects

  • Description: Get multiple projects in Asana. Returns compact project records including GID, resource type, and name fields.
  • Example Prompt: "List all active projects in the organization and tell me which ones have overdue tasks."

get_single_asana_user_by_id

  • Description: Get a user by ID in Asana. Returns the full user record including GID, name, email, photo, and associated workspaces.
  • Example Prompt: "Look up the user profile for Sarah and tell me which workspaces she has access to."

Complete Tool Inventory

Here is the complete inventory of additional Asana tools available. For full schema details, visit the Asana integration page.

  • list_all_asana_tags: Get all tags from your Asana account.
  • get_single_asana_tag_by_id: Get a tag by ID in Asana.
  • create_a_asana_tag: Create a new tag in a workspace or organization.
  • update_a_asana_tag_by_id: Update a tag by ID in Asana.
  • delete_a_asana_tag_by_id: Delete a specific tag by ID.
  • list_all_asana_users: Get multiple users accessible to the authenticated account.
  • list_all_asana_workspaces: Get multiple workspaces visible to the authorized user.
  • asana_workspaces_remove_user: Remove a user from a workspace or organization.
  • get_single_asana_workspace_by_id: Get a workspace by ID.
  • update_a_asana_workspace_by_id: Update a workspace by ID (modifies the name field).
  • asana_workspaces_add_user: Add a user to a workspace or organization.
  • asana_workspaces_events: Get workspace events for a specific workspace ID.
  • get_single_asana_task_by_id: Get the complete record for a task by ID.
  • delete_a_asana_task_by_id: Move a specific task to the user's trash.
  • asana_tasks_duplicate: Create an asynchronous job to duplicate a task.
  • asana_tasks_subtasks: Get subtasks of a specific task.
  • asana_tasks_create_subtask: Create a new subtask under a parent task.
  • list_all_asana_stories: Get stories (comments/logs) from a task.
  • get_single_asana_story_by_id: Get a story by ID.
  • create_a_asana_story: Create a story (comment) on a task.
  • update_a_asana_story_by_id: Update a story's text or pinned status.
  • delete_a_asana_story_by_id: Delete a story created by the user.
  • list_all_asana_teams: Get teams in a workspace.
  • get_single_asana_team_by_id: Get the full record for a single team.
  • create_a_asana_team: Create a team with name, description, and visibility settings.
  • update_a_asana_team_by_id: Update a team's details.
  • asana_teams_remove_user: Remove a user from a team.
  • asana_teams_add_user: Add a user to a team.
  • list_all_asana_attachments: Get attachments for a project, brief, or task.
  • get_single_asana_attachment_by_id: Get the full record for a single attachment.
  • create_a_asana_attachment: Upload an attachment to a parent object.
  • asana_attachments_download: Download a specific attachment.
  • delete_a_asana_attachment_by_id: Delete a specific attachment.
  • get_single_asana_project_by_id: Get a project by ID.
  • create_a_asana_project: Create a new project in a workspace or team.
  • update_a_asana_project_by_id: Update a specific project by ID.
  • delete_a_asana_project_by_id: Delete a specific existing project.
  • asana_projects_duplicate: Create a job to asynchronously duplicate a project.

Workflows in Action

Connecting tools is only half the battle. The real value emerges when Claude orchestrates multi-step workflows autonomously. Here are two concrete examples of how an AI agent uses these tools in practice.

Workflow 1: Daily Sprint Triage

Product managers spend hours chasing down stale tasks. You can instruct Claude to act as a scrum master, identifying blocked work and pinging assignees.

"Review all tasks in the 'Frontend Q3' project. Find any tasks that are past their due date but not marked complete. Add a comment to each one asking for a status update, and compile a summary list for me."

Execution Steps:

  1. Claude calls list_all_asana_projects to resolve the GID for the "Frontend Q3" project.
  2. Claude calls list_all_asana_tasks using the project GID as a filter, retrieving the current state of the board.
  3. The agent filters the JSON response in memory, isolating tasks where completed is false and due_on is in the past.
  4. For each overdue task, Claude iterates through and calls create_a_asana_story, posting a comment: "Checking in - do we have an updated ETA for this?"
  5. Claude returns a formatted markdown summary of the overdue tasks to the user.

Workflow 2: Automated Epic Breakdown

Breaking down large features into actionable subtasks requires heavy manual data entry. Claude can ingest a product requirements document and generate the entire task hierarchy automatically.

"I just created a parent task called 'Implement OAuth 2.0'. Break this down into backend, frontend, and QA subtasks, and assign the backend tasks to David."

Execution Steps:

  1. Claude calls list_all_asana_tasks to search for the string "Implement OAuth 2.0" and retrieves its parent task GID.
  2. Claude calls list_all_asana_users to look up David's exact user GID.
  3. Claude designs a logical breakdown of the work.
  4. Claude executes asana_tasks_create_subtask sequentially. It creates "Setup OAuth database tables" and "Implement token refresh logic", passing David's user GID into the assignee field.
  5. Claude executes asana_tasks_create_subtask for the frontend and QA tasks, leaving them unassigned as requested.

Strategic Next Steps

Building AI agents that reliably interact with Asana requires predictable infrastructure. Hand-coding an MCP server exposes you to API deprecations, pagination edge cases, and complex OAuth token lifecycles. By routing your agent traffic through Truto's managed MCP servers, you offload the maintenance burden entirely.

Your engineering team can focus on refining agent prompts and orchestrating business logic, rather than debugging why a nested custom field failed to parse in a raw Asana API response.

FAQ

How do I handle Asana rate limits with Claude?
Truto passes HTTP 429 rate limit errors directly back to the caller. Your AI agent or MCP client must implement exponential backoff and retry logic to handle these limits gracefully.
Can I restrict Claude to read-only access in Asana?
Yes. When generating the MCP server URL, you can apply method filtering to only expose read operations like list and get, blocking any create or update capabilities.
Does the MCP server require an ongoing Truto session?
No. The generated MCP URL contains a self-contained cryptographic token that authenticates requests. You can also enforce an additional API token requirement for strict enterprise environments.

More from our Blog