MCP server that gives AI assistants full access to the Asana API — 86 tools, 35 prompt templates, and browsable resources
17 sampled tools evaluated from explicit source. Naming is action-verb consistent and mostly clear (asana_get_*, asana_create_*, asana_delete_*, asana_update_*). Descriptions are detailed (100-300 chars typical) and include context about when/why to use each tool. Input schemas are present with proper JSON Schema types and structured enums (e.g. asana_create_custom_field type enum, asana_create_enum_option color enum). However, several tools lack adequate parameter descriptions for complex multi-field scenarios, and output schemas are not formally documented. Error handling guidance is minimal, most tools lack recovery hints. Tool composition is strong (one job per tool, proper chaining via IDs), but parameter relationships (e.g. conditional field_value_* params) are under-documented. Security pattern present (no credentials in parameters, server-side token injection via AsanaClientWrapper). Pagination support observed (limit, offset). Per-tool variations in quality; best performers are attachment and custom-field tools with clear enums and constraint hints.
Attach an external URL link to a task or project. Creates a named link that appears in the task's attachments panel. Use this to link GitHub PRs, documents, design files, or any external resource to a task. Note: file upload (binary) is not supported through this tool — only URL-based (external) attachments.
Create a new custom field in a workspace. Supported types: `text`, `number`, `enum`, `multi_enum`, `date`, `people`. For `enum`/`multi_enum` fields, add options after creation using asana_create_enum_option. Returns the created custom field object.
Add a new option to an enum or multi_enum custom field. New options are appended to the end of the list by default. Returns the created enum option with its GID. Use the GID to set this option on tasks via asana_update_task.
Create a new goal in a workspace. IMPORTANT: `time_period` is required by the Asana API — get valid GIDs from asana_get_time_periods. Returns the created goal object. Note: `status` can only be set after a goal metric is configured.
Delete an attachment from a task or project. Returns an empty object `{}` on success. This action is permanent. Get attachment GIDs from asana_get_attachments_for_object.
Output schemas not formally documented. Tool descriptions state what fields are returned (e.g. 'Returns gid, name, resource_subtype, created_at, and host') but no structured JSON Schema definitions provided. LLMs cannot verify downstream parameter compatibility or plan multi-step chains confidently.
Conditional parameter relationships under-documented. asana_create_custom_field has type-dependent params (precision/format/currency_code only apply to 'number' type; enum_options only apply to 'enum'/'multi_enum'). No description clarifies these constraints. LLMs will pass invalid combinations.
Destructive operations (delete_attachment, delete_custom_field, delete_goal) lack confirmation/dry-run flow. No description suggests checking before permanent deletion or recovering from mistakes. Pattern:confirmation-request missing.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-22 | C | 63 | <=2025-11-25 | v2 |
| 2026-03-09 | F | 0 | - | v1 |
Permanently delete a custom field from the workspace. This removes the field from all tasks and projects. Locked fields can only be deleted by the user who locked them. Returns an empty object `{}` on success.
Permanently delete a goal. This cannot be undone. Returns a success message.
Get full details for a single attachment by GID. Returns name, download_url, view_url, size, host, created_at, and parent. Use the download_url to access the file. Use asana_get_attachments_for_object to list all attachments on a task.
List all attachments on a task or project. Returns gid, name, resource_subtype, created_at, and host for each attachment. Use asana_get_attachment to get the download URL for a specific file.
Get full details for a custom field by GID. Returns name, type, description, enum_options (with gid, name, color, enabled), precision, and format. Use this to get enum option GIDs before setting custom field values on tasks.
List all custom field definitions in a workspace. Returns gid, name, type, and enum_options for each field. Use this to discover available custom fields and their GIDs before reading or writing custom field values on tasks.
Get full details for a goal by GID. Returns name, status, notes, owner, team, time_period, followers, and workspace. Use asana_get_goals to list goals and find GIDs.
List goals in a workspace. Returns an array of goal objects with gid, name, status, owner, and team. Filter by team or time period using optional params. Supports pagination.
Resolve code references — branch names, commit subjects, PR titles — to the Asana tasks they refer to. Recognizes bare GIDs, Asana URLs, `#1234` / `ASANA-1234` conventions, and falls back to a conservative fuzzy name match that only accepts a single unambiguous hit. Use this to connect repository history to Asana work, e.g. to find which tasks have no code behind them or which commits have no tracked task.
Update a custom field's name, description, or settings. Note: the `type` field cannot be changed after creation. To add/update enum options, use asana_create_enum_option or asana_update_enum_option. Returns the updated custom field.
Update an enum option's name, color, or enabled status. Use this to rename options, change their color, or disable/enable them. Disabled options are hidden from users but existing values are preserved. Returns the updated enum option.
Update fields on an existing goal. Only supply the fields to change. Returns the updated goal object. Note: setting `status` requires the goal to have a metric configured first — otherwise the API returns an error.
Error recovery guidance absent. No tool descriptions explain what to do on failure: 'If workspace not found, call asana_list_workspaces'. Only asana_match_tasks_to_refs mentions fallback behavior ('conservative fuzzy name match'). Others omit recovery hints.
Result limiting not explicit. Pagination is supported (limit, offset), but no tool description states default or maximum result cap. asana_get_attachments_for_object, asana_get_goals, asana_get_custom_fields_for_workspace should declare 'limit defaults to 20, max 100' to prevent context-window exhaustion.
asana_match_tasks_to_refs description mentions 'falls back to a conservative fuzzy name match that only accepts a single unambiguous hit' but does not explain what 'unambiguous' means or how the LLM should handle ambiguous results. Return structure should clarify rejection reasons.