@duytnb79/asana-mcp
The server provides Asana access via a local MCP server using a personal access token. Although the README claims it is read-only, the actual schema includes write tools.
Read operations:
List projects in a workspace (filter by archived status, paginate, custom fields via
opt_fields)List sections in a project (paginate,
opt_fields)List tasks in a project (priority order, completion filter, paginate,
opt_fields)Get task details by GID (
opt_fields)Search tasks across a workspace (by text, assignee, completion state, modified time, project; up to 100 results)
List task comments (human comments only, exclude system activity, paginate)
List task attachment metadata (paginate; no temporary download URLs)
Download and view image attachments (PNG, JPEG, WebP, GIF; default max 10 MiB)
Write operations:
Add a comment to a task
Create a new task (name, notes, assignee, projects, due dates, start dates, subtask parent, followers, tags, custom fields, resource subtype)
Update an existing task (name, notes, assignee, completion status, due/start dates, custom fields, approval status)
All list and search tools support opt_fields and pagination via Asana's next_page.offset.
Allows interaction with Asana's API, providing tools for managing projects, tasks, sections, and comments in Asana workspaces.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@@duytnb79/asana-mcpList all projects in my Asana workspace"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
@duytnb79/asana-mcp
A read-only local MCP server for Asana that uses an Asana personal access token (PAT).
It runs over stdio and calls GET endpoints in the standard Asana REST API at https://app.asana.com/api/1.0. It is separate from Asana's hosted MCP server at https://mcp.asana.com/v2/mcp, which requires a registered MCP app and OAuth.
Requirements
Node.js 24+
An Asana personal access token
Access to the Asana workspaces, projects, and tasks you want to use
Create a PAT in the Asana developer console and treat it like a password. The server can only access data and perform actions allowed for the Asana user who owns the token.
Related MCP server: asana-mcp
Installation
Local clone
npm install
npm run build
cp .env.example .env
node dist/index.jsPublished package
After this package is published, it can be run with:
npx -y @duytnb79/asana-mcpOr installed globally:
npm install -g @duytnb79/asana-mcp
asana-mcpConfiguration
Create a .env file or provide environment variables through your MCP client:
ASANA_ACCESS_TOKEN="your_asana_personal_access_token"
ASANA_TIMEOUT_MS="10000"
ASANA_MAX_PAGE_SIZE="100"
ASANA_MAX_IMAGE_BYTES="10485760"Required:
ASANA_ACCESS_TOKEN
Optional:
ASANA_TIMEOUT_MS— request timeout in milliseconds; defaults to10000ASANA_MAX_PAGE_SIZE— maximum page size exposed by list/search tools; defaults to100and must be between1and100ASANA_MAX_IMAGE_BYTES— maximum downloaded image size in bytes; defaults to10485760(10 MiB)
The server automatically loads .env when running locally.
Test the Asana connection
Copy the example environment file, replace the placeholder with your real PAT, then run the read-only connection test:
cp .env.example .env
# Edit .env and set ASANA_ACCESS_TOKEN
npm run test:connectionA successful response starts with:
Asana connection successful.It then prints the authenticated user and accessible workspaces. This test calls only GET /users/me; it does not create or modify Asana data.
MCP client configuration
Local build
{
"mcpServers": {
"asana": {
"command": "node",
"args": [
"/absolute/path/to/asana-mcp-server/dist/index.js"
],
"env": {
"ASANA_ACCESS_TOKEN": "your_asana_personal_access_token"
}
}
}
}Alternatively, run through npm from the project directory:
{
"mcpServers": {
"asana": {
"command": "npm",
"args": ["start"],
"cwd": "/absolute/path/to/asana-mcp-server",
"env": {
"ASANA_ACCESS_TOKEN": "your_asana_personal_access_token"
}
}
}
}Published package
{
"mcpServers": {
"asana": {
"command": "npx",
"args": ["-y", "@duytnb79/asana-mcp"],
"env": {
"ASANA_ACCESS_TOKEN": "your_asana_personal_access_token"
}
}
}
}Available tools
Read tools
list_projectsLists projects in a workspace.
Supports
archived,limit,offset, andopt_fields.
list_tasksLists tasks in a project in project priority order.
Supports
completed_since,limit,offset, andopt_fields.
get_taskGets one task by GID.
search_tasksSearches a workspace by assignee, completion state, modified time, project, or text.
Asana search is eventually consistent and may lag recent writes by 10–60 seconds.
The search endpoint does not support normal Asana offset pagination and returns at most 100 items.
list_sectionsLists sections in a project.
Supports
limit,offset, andopt_fields.
list_task_commentsReturns the newest human comments from one task, excluding assignment, due-date, and other system activity stories.
Accepts
task_gidand an optionallimitfrom 1 to 100; the default is 20.Scans the task's paginated story history, filters comments, and returns the requested number in newest-first order.
list_task_attachmentsLists attachment metadata for a task with offset pagination; temporary download URLs are not exposed.
read_attachment_imageDownloads one attachment by GID and returns MCP image content for visual analysis.
Supports PNG, JPEG, WebP, and GIF up to
ASANA_MAX_IMAGE_BYTES; SVG and non-image files are rejected.
The server does not register task creation, task update, or comment-writing tools. Its Asana client issues GET requests only.
Pagination
Asana list endpoints return an opaque next_page.offset. The MCP response exposes it as meta.next_offset.
Pass that value back as offset to retrieve the next page. Only use offsets returned by Asana; they can expire when underlying data changes.
Input/output fields
Asana returns compact objects by default. Use opt_fields to request additional properties, for example:
{
"project_gid": "12345",
"limit": 50,
"opt_fields": [
"name",
"completed",
"assignee.name",
"due_on",
"permalink_url"
]
}Keep opt_fields focused. Very broad or deeply nested responses are more expensive and may be rate-limited.
Rate limits and errors
Asana returns HTTP
429when a token is rate-limited.The server reports the
Retry-Aftervalue when Asana provides it and does not retry requests automatically.Authentication, permission, validation, not-found, timeout, and server errors are converted into readable MCP errors.
The PAT is sent only in the
Authorization: Bearerheader and is never placed in request URLs.
Security
Never commit
.envor a PAT.Prefer a dedicated PAT with the minimum user permissions needed for this integration.
Rotate the PAT if it is exposed.
The PAT still inherits the permissions of its Asana account; read-only behavior is enforced by this server's GET-only client and exposed tools, not by changing the PAT itself.
This server intentionally exposes specific read operations rather than a generic HTTP passthrough tool.
Image downloads never receive the Asana authorization header, validate redirects, reject local/private IP literals, verify image signatures, and enforce a bounded in-memory size.
Development
npm run dev
npm run typecheck
npm run build
npm startAvailable Tools
8 toolsadd_commentAdd commentB
Add a plain-text comment to an Asana task. This operation writes to Asana.
| Name | Required | Description | Default |
|---|---|---|---|
| text | Yes | Plain-text comment to add to the task. | |
| task_gid | Yes | Task GID. | |
| opt_fields | No | Additional story fields to return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description discloses that the operation writes to Asana, which is useful for a mutation tool, but with no annotations, it fails to elaborate on permissions, whether comments are appended, or if the operation is reversible. This is a significant transparency gap for a write operation.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two short sentences with no filler. Every word contributes to the core meaning, making it highly efficient and appropriately front-loaded.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple, but the description does not mention return values or how opt_fields affects the response. With no output schema and no annotations, the agent may be left uncertain about the outcome format. However, the core purpose is sufficiently covered for an add operation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides full documentation for all three parameters (100% coverage), so the description adds minimal value. The mention of 'plain-text' is redundant with the schema's own description of the 'text' parameter, keeping this at the baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Add a plain-text comment') and target ('Asana task'), using a specific verb and resource. It distinguishes from siblings like create_task and update_task, though it doesn't explicitly name alternatives, so it falls short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives. It does not mention scenarios, exclusions, or when a different tool (e.g., update_task) might be more appropriate, leaving the agent without decision-making context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
create_taskCreate taskC
Create an Asana task. This operation writes to Asana.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | Task name. | |
| tags | No | ||
| liked | No | ||
| notes | No | Plain-text task description. | |
| due_at | No | ||
| due_on | No | ||
| parent | No | Parent task GID when creating a subtask. | |
| assignee | No | User GID, email, 'me', or null to leave unassigned. | |
| projects | No | Project GIDs to add the new task to. | |
| start_at | No | ||
| start_on | No | ||
| completed | No | ||
| followers | No | ||
| workspace | No | Workspace GID. Required unless projects or parent identifies the workspace. | |
| opt_fields | No | Additional fields to return for the created task. | |
| custom_fields | No | ||
| approval_status | No | ||
| resource_subtype | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description must disclose behavioral traits. It only notes 'This operation writes to Asana,' which is already implied by 'Create,' and omits details about permissions, rate limits, or response behavior. Significant gaps remain.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is very brief and front-loaded with the core purpose. However, the second sentence 'This operation writes to Asana' is redundant and does not add value, slightly reducing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's 18 parameters, nested objects, no annotations, and no output schema, this description is severely under-specified. It fails to mention required parameters, return structure, or behavioral nuances, making it inadequate for reliable tool invocation.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is only 39%, leaving many parameters like tags, liked, followers, and custom_fields undocumented. The tool description adds no parameter explanations, failing to compensate for the low coverage and leaving the agent without sufficient guidance.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description opens with 'Create an Asana task,' which clearly specifies the verb and resource. This distinguishes it from siblings like list_tasks, update_task, and get_task. The purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives such as update_task or search_tasks. It does not mention prerequisites or typical use cases, leaving the agent without context for tool selection.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_taskGet taskB
Get details for one Asana task.
| Name | Required | Description | Default |
|---|---|---|---|
| gid | Yes | Task GID. | |
| opt_fields | No | Additional Asana task fields to return. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only restates the purpose and fails to mention that this is a read-only operation, what fields are returned, how opt_fields affects the response, or any edge cases/errors. This leaves significant behavioral uncertainty.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single concise sentence with no filler, front-loading the core purpose. It is appropriately sized for the simple operation it describes, earning maximum conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool is simple (2 params, no output schema, no annotations), and the description is minimally adequate. However, it does not explain what 'details' include or whether the response is a full task object. Since no output schema exists, the description should compensate by describing the return shape, which it does not.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema already provides descriptions for both parameters (gid and opt_fields) with 100% coverage. The description adds no additional parameter semantics, so the baseline of 3 is appropriate; the schema does the heavy lifting.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description uses a specific verb 'Get' with a clear resource ('details for one Asana task'), distinguishing it from siblings like list_tasks (multiple tasks) and update_task (modification). It is unambiguous and directly states the tool's function.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is provided on when to use get_task versus alternatives like list_tasks or search_tasks. The description merely implies 'one task' but does not state prerequisites, exclusions, or scenarios where this tool is preferred.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_projectsList projectsA
List Asana projects in a workspace with offset pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Results per page, from 1 to 100. | |
| offset | No | Offset returned by a previous list_projects call. | |
| archived | No | Return only archived or active projects. | |
| opt_fields | No | Additional Asana project fields to return. | |
| workspace_gid | Yes | Workspace or organization GID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the burden. It discloses a read-only nature (via 'list') and offset pagination, but does not mention default archived behavior, response format, or rate limits, leaving some ambiguity.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, concise sentence that front-loads the verb and resource, with no wasteful words. It is perfectly scoped for the tool's simplicity.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema fully documents parameters, and the description is adequate for a straightforward list operation. However, without an output schema, it would benefit from mentioning default return fields or pagination behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% for all five parameters. The description adds no extra parameter meaning beyond restating workspace and offset pagination, which are already documented in the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Description states the exact verb (List), resource (Asana projects), scope (in a workspace), and method (offset pagination). It clearly distinguishes from siblings like list_tasks and list_sections.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description implies usage for listing projects in a workspace but provides no explicit alternatives, exclusions, or when-not-to-use guidance. The context is clear but minimal.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_sectionsList sectionsA
List sections in an Asana project with offset pagination.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Results per page, from 1 to 100. | |
| offset | No | Offset returned by a previous list_sections call. | |
| opt_fields | No | Additional Asana section fields to return. | |
| project_gid | Yes | Project GID. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The description highlights offset pagination, a behavioral detail beyond the tool's name. However, with no annotations provided, the description carries the full burden for behavioral transparency. It does not explicitly state that the operation is read-only or describe error cases, auth requirements, or response behavior—leaving some gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, front-loaded sentence with no wasted words. It states the operation, the resource scope, and a key behavior (offset pagination) in a concise and well-structured manner.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The tool has 4 parameters, no annotations, and no output schema. The description adequately identifies the operation and pagination but does not describe the return format, default fields, or how pagination responses are structured. While it is sufficient for a simple list operation, it leaves some contextual gaps for an agent needing to parse responses.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so the baseline is 3. The description adds the concept of 'offset pagination,' which reinforces the purpose of the offset parameter, but this is minimal and largely redundant with the schema's own parameter descriptions (e.g., 'Offset returned by a previous list_sections call').
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the tool's purpose: 'List sections in an Asana project with offset pagination.' It uses a specific verb ('List'), a specific resource ('sections in an Asana project'), and uniquely distinguishes from sibling tools like list_tasks and list_projects, which cover different resources.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context for when to use the tool: it lists sections within a specific Asana project. Although it does not explicitly mention exclusions or alternatives, the sibling tool names (get_task, list_tasks, etc.) confirm there is no other section-listing tool, making the usage context clear.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_tasksList tasksA
List tasks in an Asana project in project priority order.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Results per page, from 1 to 100. | |
| offset | No | Offset returned by a previous list_tasks call. | |
| opt_fields | No | Additional Asana task fields to return. | |
| project_gid | Yes | Project GID. | |
| completed_since | No | Return incomplete tasks and tasks completed since this ISO timestamp; use 'now' for incomplete tasks only. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It discloses ordering ('project priority order') and scope ('in an Asana project'), but it omits key behavioral traits such as pagination via limit/offset, the default inclusion of completed tasks, and the response shape. These gaps are significant for a tool with no annotation safety hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is a single, well-structured sentence that front-loads the action and resource. Every word adds value, with no redundant or filler content.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given 5 parameters, no output schema, and no annotations, the description covers the core purpose but does not mention pagination, filtering via completed_since, or the default behavior for completed tasks. The schema compensates for parameter details, but the overall description could be more complete for an agent to understand the full behavior.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The input schema provides descriptions for all 5 parameters (100% coverage), so the baseline is 3. The tool description adds no additional parameter semantics beyond what the schema already documents.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('List tasks'), the resource ('in an Asana project'), and a specific behavior ('in project priority order'). This distinguishes it from sibling tools like list_projects, list_sections, and search_tasks.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides clear context that this tool is for listing tasks within a specific project, which implies its primary use. However, it does not explicitly mention when to use alternatives such as search_tasks for filtered searches or get_task for a single task, leaving some ambiguity regarding exclusions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_tasksSearch tasksB
Search tasks in an Asana workspace. Search indexing is eventually consistent and may lag writes by 10-60 seconds.
| Name | Required | Description | Default |
|---|---|---|---|
| text | No | Search task names and descriptions. | |
| limit | No | Maximum search results, from 1 to 100. | |
| project | No | One project GID or a list of project GIDs. | |
| sort_by | No | ||
| assignee | No | One assignee identifier or a list of assignee identifiers. | |
| completed | No | ||
| opt_fields | No | Additional Asana task fields to return. | |
| workspace_gid | Yes | Workspace or organization GID. | |
| modified_since | No | Only tasks modified after this ISO timestamp. | |
| sort_ascending | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden. It does disclose a meaningful behavioral nuance—eventual consistency and indexing delay—which is useful. However, it omits other relevant behaviors such as pagination, rate limits, or whether empty text returns all tasks, so transparency is only partially addressed.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise: two sentences with no redundant wording. The main purpose is front-loaded, and the behavioral caveat follows naturally. Every word earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a search tool with 10 parameters and no output schema, the description is incomplete. It does not mention return values, default behavior, or how results are ordered/paginated. The eventual consistency note is helpful but does not compensate for the lack of operational detail.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 70%, below the high threshold, so the description should compensate for undocumented parameters. It does not add any parameter-level detail. However, most parameters have schema descriptions, so the description's lack of param info is not critical; it neither helps nor harms, leading to a baseline score.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states a specific action ('Search tasks') with a resource and scope ('in an Asana workspace'). This distinguishes it from sibling tools like list_tasks, which imply listing rather than querying, and get_task, which targets a single task.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use search_tasks versus alternatives like list_tasks. The description implies its purpose but does not mention alternatives or exclusions, leaving the agent guessing about the appropriate context.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_taskUpdate taskC
Update fields on an Asana task. This operation writes to Asana.
| Name | Required | Description | Default |
|---|---|---|---|
| gid | Yes | Task GID. | |
| name | No | ||
| liked | No | ||
| notes | No | Plain-text task description; use an empty string to clear it. | |
| due_at | No | ||
| due_on | No | ||
| assignee | No | User GID, email, 'me', or null to unassign. | |
| start_at | No | ||
| start_on | No | ||
| completed | No | ||
| opt_fields | No | Additional fields to return for the updated task. | |
| custom_fields | No | ||
| approval_status | No | ||
| resource_subtype | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden of behavioral disclosure. It only states 'This operation writes to Asana,' which is useful but minimal. It does not disclose whether updates are partial or full-replacement, permission requirements, side effects on related data, or what the return value contains. For a mutation tool with complex fields, this is insufficient.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is extremely concise (two sentences) and front-loaded with the essential action. Every word earns its place, and there is no redundancy or filler. It is appropriately brief for a tool whose details are largely in the schema, though it could be expanded slightly without losing conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's complexity (14 parameters, nested objects, no output schema, no annotations), the description is grossly inadequate. It does not explain return values, side effects, partial update behavior, or any prerequisites. This is a complex mutation tool that needs substantially more context for an agent to use it safely and correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is only 29%, and the description does nothing to compensate. It simply says 'Update fields' without explaining any of the 14 parameters, their meaning, or how they interact. The description adds no value beyond the schema's sparse field descriptions, leaving most parameters opaque.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description clearly states the action ('Update fields on an Asana task') and identifies the resource (Asana task), and adds the important context that it writes to Asana, distinguishing it from read-only tools like get_task or list_tasks. It could be more specific about updating existing tasks versus creating, but the core purpose is unambiguous.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description provides no guidance on when to use this tool versus alternatives like create_task, get_task, or search_tasks. It does not mention prerequisites, typical use cases, or exclusions, leaving the agent to infer usage from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.1.0- First observed
add_comment - First observed
create_task - First observed
get_task - First observed
list_projects - First observed
list_sections - First observed
list_tasks - First observed
search_tasks - First observed
update_task
TDQS
Scored across 8 tools
Most tools target distinct resources (sections, comments, projects) or distinct actions (list vs. get vs. create vs. update vs. search). The main potential confusion is between list_tasks and search_tasks, but their descriptions clarify the scope (project-scoped vs. workspace-wide search).
All tool names follow a consistent verb_noun pattern in snake_case: list_sections, add_comment, list_tasks, get_task, create_task, update_task, search_tasks. The sole exception is 'add_comment' rather than 'create_comment', but it still adheres to the same grammatical style.
Eight tools is well-scoped for an Asana integration, covering the essential operations on tasks, projects, sections, and comments without redundancy. This is within the typical 3-15 range and each tool earns its place.
The tool surface covers the core task lifecycle (create, get, update, list, search) plus project listing, section listing, and comment creation. Missing operations like task deletion or project creation are notable gaps, but agents can work around them for most workflows.
Maintenance
Related MCP Connectors
Nifty's MCP server — exposes tasks, projects, messages, and files as tools for AI agents.
A MCP server built for developers enabling Git based project management with project and personal…
An MCP server that provides read access to your cloud storage providers, bank accounts and more.
Related MCP Servers
- FlicenseNot gradedqualityCmaintenanceAn MCP (Multi-Agent Conversation Protocol) server that enables interacting with the Asana API through natural language commands for task management, project organization, and team collaboration.-
- AlicenseBqualityCmaintenanceMCP server for the Asana API that allows AI agents to read and optionally write to Asana tasks, comments, and custom fields, with tiered access controls and no delete tools.834 npmMIT
- AlicenseBqualityDmaintenanceA Model Context Protocol (MCP) server that connects AI assistants to the Asana API for task, project, and workspace management.33MIT
- AlicenseAqualityCmaintenanceA local MCP server for Asana that uses a personal access token to read and manage Asana projects, tasks, sections, and comments via the standard Asana REST API.819 npmMIT