{"name":"io.github.jtalk22/asana-mcp-server","slug":"jtalk22-asana-mcp-server","title":"Asana MCP Server","description":"Change Asana without opening Asana — custom fields, sections, start dates, rich notes, bulk. PAT.","url":"https://mcp.market/server/jtalk22-asana-mcp-server","rating":null,"grade":"B","score":78,"certified":false,"status":"active","category":"productivity","tags":["productivity"],"presence":{"score":22,"stars":0,"forks":0,"downloads_week":71,"last_push_at":"2026-08-15T23:40:25.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/jtalk22/asana-mcp-server","website":"https://github.com/jtalk22/asana-mcp-server","version":"1.0.1","remotes":[],"packages":[{"registryType":"npm","identifier":"@jtalk22/asana-mcp","version":"1.0.1","transport":{"type":"stdio"},"environmentVariables":[{"description":"Asana Personal Access Token (create at https://app.asana.com/0/my-apps). Optional when stored via `asana-mcp --setup` (macOS Keychain or ~/.asana-mcp.json).","format":"string","isSecret":true,"name":"ASANA_PAT"},{"description":"Workspace GID. Optional — auto-detected when the token sees exactly one workspace.","format":"string","name":"ASANA_WORKSPACE_GID"},{"description":"Tool surface filter: all | read | write | comma-list of tool names.","format":"string","name":"ASANA_MCP_TOOLS"}]}],"tools":[{"name":"asana_add_comment","description":"Add a comment (story) to a task. Prefer text (plain, with real newlines; literal \"\\ \" sequences are auto-converted) — the /stories endpoint escapes html_text into literal tags. Pass html_text only if you accept that.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_add_dependency","description":"Mark a task as depending on one or more other tasks (this task waits on them).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_add_dependent","description":"Mark one or more tasks as dependent on this task (they wait on this one).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_add_enum_option","description":"Add an option to an existing enum/multi_enum custom field (extend a dropdown without recreating the field).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_add_field_to_project","description":"Attach an existing custom field to a project (addCustomFieldSetting), optionally important/positioned. Pairs with asana_create_custom_field to build a board.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_add_follower","description":"Add follower(s) to a task.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_add_project_members","description":"Add member(s) to a project (e.g. add a teammate to a new board).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_add_tag","description":"Add a tag to a task.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_add_to_portfolio","description":"Add a project/portfolio item to a portfolio.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_add_to_project","description":"Add a task to a project, optionally placing it in a specific section. Fixes: no MCP tool for addProject + section placement.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_attach_file","description":"Attach a local file to an Asana task. Requires confirm:true and restricts reads to the current directory or ASANA_MCP_FILE_ROOTS. Max 100MB.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_batch_ops","description":"Execute up to 5 Asana API operations in a single HTTP call. ⚠ GET-with-default-fields ONLY — options (opt_fields/completed_since) + PUT data are dropped by the batch endpoint. For filtered reads use asana_search_tasks/asana_list_*; for writes use the dedicated tools.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_batch_update","description":"Update multiple task fields in a single REST call. Combines assignee, dates, custom fields, notes, name, and completion.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_board_rollup","description":"COMPOSITE: roll up ONE board (project) — active tasks grouped by section, an amount custom field summed per section and in total (e.g. \"Deal $\", \"Claim $\"), an optional secondary amount, and every task whose deadline (any named date custom fields + due_on) has passed, with days overdue and WHICH field fired. Ranked by amount descending. Fields may be given by GID or by exact name (resolved live vi","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_bulk_move_section","description":"Move MANY tasks into one section in a single call (loops section addTask). Returns a per-task summary. Throughput multiplier for triaging a board column.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_bulk_update","description":"Apply the SAME field changes to MANY tasks in one call (assignee, dates, completed, notes/html_notes, custom_fields). Loops PUT per task, continues past individual failures, returns a per-task summary.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_complete_task","description":"Mark a task complete (default) or incomplete (completed:false).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_create_custom_field","description":"Create a workspace custom field (design the board schema). resource_subtype ∈ text|number|enum|multi_enum|date|people. For enum/multi_enum pass enum_options:[{name,color?}].","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_create_portfolio","description":"Create a portfolio (group projects for North-Star-style tracking).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_create_project","description":"Create a project. In an org workspace a team GID is required; otherwise the workspace default is used.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_create_project_status","description":"Post a status update to a project. status_type ∈ on_track|at_risk|off_track|on_hold|complete. text required (html_text optional).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_create_section","description":"Create a new section in a project. Optionally position via insert_before/insert_after (section GIDs).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_create_subtask","description":"Create a subtask under a parent task.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_create_task","description":"Create a general task. Provide either projects[] (workspace inferred) or it lands in the workspace default. Supports assignee, notes/html_notes, dates, followers, tags, custom_fields (dates auto-wrapped).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_delete_project","description":"DESTRUCTIVE — permanently delete a project. Requires confirm:true (C13 gate). No-op + gate message otherwise.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_delete_section","description":"DESTRUCTIVE — delete a section (Asana requires it be empty, or moves its tasks out). Requires confirm:true (C13 gate).","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_delete_task","description":"DESTRUCTIVE — permanently delete (trash) a task. Requires confirm:true (C13 gate). Without confirm it is a no-op that reports the gate.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_duplicate_project","description":"Duplicate an existing project (clone a board with its structure). include = fields to copy (array or comma string, e.g. [\"members\",\"task_notes\",\"task_assignee\"]). Returns an async job.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_duplicate_task","description":"Duplicate a task (template instantiation). include = which fields to copy (array or comma string, e.g. [\"notes\",\"assignee\",\"subtasks\",\"dependencies\"]). Returns an async job.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_find_duplicates","description":"Find TRUE duplicate tasks. Dedupes by GID FIRST — one task on N boards = multi_homed (shared membership, reported separately, NOT a dup; deleting it removes the real task from EVERY board) — then groups DISTINCT gids by name. Scan one project/section, or projects[] for cross-board. Returns {multi_homed, true_duplicate_clusters}. Read-only — reason before you delete.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_get_custom_field","description":"Fetch one custom field by GID — type, precision, and full enum_options (name+GID) list.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_get_custom_field_settings","description":"Fetch a project's custom field settings — live field GIDs, types, and enum option GIDs. Use this to derive field/option GIDs live instead of trusting hand-coded maps that drift.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_get_job","description":"Poll an async job by GID (from duplicate_task/duplicate_project/instantiate_* tools). Returns status (not_started|in_progress|succeeded|failed) and the new_task/new_project GID once done.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_get_portfolio","description":"Fetch one portfolio; set include_items=true to also pull its member projects/portfolios.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_get_project","description":"Fetch one project with its custom_field_settings (field GIDs + enum option GIDs) AND its sections, merged into one response.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_get_task","description":"Fetch one task with rich fields (assignee, projects, section memberships, custom fields, notes, subtask count). Override opt_fields for more/less.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_get_user","description":"Fetch one user by GID (default \"me\" = token owner). Returns name, email, GID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_get_workspace","description":"Fetch workspace metadata (name, is_organization, email_domains).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_instantiate_project_template","description":"Create a new project from a project template (repeatable board setup). Returns an async job whose new_project holds the created project.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_instantiate_task_template","description":"Create a new task from a task template (repeatable intake/ops task). Returns an async job whose new_task holds the created task.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_list_attachments","description":"List a task's attachments with download/permanent URLs and sizes.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_dependencies","description":"Return a task's dependencies (what it waits on) AND dependents (what waits on it), in one call.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_portfolios","description":"List portfolios owned by a user in the workspace. owner defaults to \"me\". Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_project_statuses","description":"List a project's status updates (status_type, title, text, author). Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_projects","description":"List projects in the workspace (or a team). Excludes archived by default; set include_archived=true for all. Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_sections","description":"List the sections of a project (name + GID), in board order.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_stories","description":"List a task's stories (comments + activity log). text field holds comment bodies. Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_subtasks","description":"List a task's subtasks with rich fields. Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_tags","description":"List tags in the workspace (name → GID). Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_task_templates","description":"List a project's task templates (repeatable task blueprints). Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_tasks","description":"List tasks by project, section, tag, OR assignee (provide exactly one anchor). Paginated. assignee uses the workspace default.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_teams","description":"List teams the token owner belongs to in the workspace/organization. Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_users","description":"List workspace members (name → GID resolution). Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_list_workspace_custom_fields","description":"List ALL custom fields defined in the workspace (design discovery — find a field GID to attach to a board). Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_morning_brief","description":"COMPOSITE: one-call daily brief — incomplete tasks bucketed into overdue / due_today / upcoming (within horizon_days) + blocked (due-window tasks waiting on an incomplete dependency), with a summary count. Defaults to \"me\"; pass user=<gid> for a teammate or user=\"all\" for the whole workspace. Built on the search API (caps at 100 by due date).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_move_section","description":"Move a task to a different section within its project. Fixes: no MCP tool for section moves.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_my_tasks","description":"List the TOKEN OWNER's My Tasks (user task list). NOTE: a personal PAT can only read its OWN My Tasks — passing another user returns 403. For other users use asana_search_tasks or asana_list_tasks with assignee=<gid>, or asana_user_queue. Paginated.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_portfolio_rollup","description":"COMPOSITE: per-project health across a portfolio — incomplete, overdue, and completed-in-window counts + current status, sorted by overdue. Scope via projects:[gids] (best), portfolio_gid, or default to all non-archived workspace projects (capped at max_projects). One task-list call per project; caps are reported, never silent.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_remove_field_from_project","description":"Detach a custom field from a project (removeCustomFieldSetting). Symmetric with asana_add_field_to_project.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_remove_follower","description":"Remove follower(s) from a task.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_remove_from_portfolio","description":"Remove an item from a portfolio.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_remove_from_project","description":"Remove a task from a project (un-add a board card). Symmetric with asana_add_to_project.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_remove_tag","description":"Remove a tag from a task.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_reorder_section","description":"Reorder a section within its project (move a board column). Provide before_section or after_section (section GIDs).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_search_tasks","description":"Advanced workspace task search with filters: text, assignee, project, section, tag, completed, due/created date ranges, custom-field filters (filters passthrough), sorting. Single page (search API caps at 100, no offset).","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_set_custom_fields","description":"Set custom fields on a task using correct type handling. Fixes: multi_enum arrays and date object wrappers that fail via official MCP.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_set_dates","description":"Set start_on and/or due_on dates on a task. Fixes: start_on not exposed in official MCP schema, and due_on must be set first.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_set_html_notes","description":"Set rich-text notes on a task using html_notes. Fixes: \"XML is invalid\" error from official MCP.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_set_notes_safe","description":"Set notes AND survive workspace automations that rewrite the task name / parse dates out of notes text (Rules and some integrations do this): write notes, wait settle_ms, then re-assert name + due_on. Use instead of raw notes edits on automated boards.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_set_parent","description":"Re-parent a task: make it a subtask of parent_gid, or detach to top level (parent_gid:null). Optional insert_before/insert_after sibling GIDs.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_triage_inbox","description":"COMPOSITE: bulk-create tasks from a triaged list in ONE call (fills the gap — no bulk CREATE existed). The model reads the inbox/note, extracts items, and passes them here. Per-item project/assignee/section/due override the defaults; default_assignee falls back to ASANA_DEFAULT_ASSIGNEE, else \"me\". Continues past individual failures; returns a per-item created/failed summary with permalinks.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_typeahead","description":"Resolve a partial NAME → GID across the workspace for any resource type (task|project|user|tag|portfolio|project_template|goal). Fast lookup when you do not know the GID.","write_action":false,"price_micros":0,"input_schema":null},{"name":"asana_update_project","description":"Update a project: name, notes, color, archived, public, default_view, dates.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_update_section","description":"Rename a section.","write_action":true,"price_micros":0,"input_schema":null},{"name":"asana_user_queue","description":"COMPOSITE: one person's FULL incomplete queue — paginated (NOT capped at 100 like the search API), bucketed by due (overdue / due_today / this_week / later / no_due) with a per-project count map. Default user = \"me\"; pass user=<gid> for a teammate (the PAT-owner-only restriction on My Tasks does not apply — this uses /tasks?assignee=). The right call for \"what is X sitting on?\" and hand-off review","write_action":false,"price_micros":0,"input_schema":null}],"scan":{"score":78,"grade":"B","scanned_at":"2026-11-03T14:24:00.416Z","report":{"scannerVersion":"0.1.10","scannedAt":"2026-11-03T14:24:00.338Z","components":{"code":{"score":25,"max":25,"notes":["11 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":12,"max":15,"notes":["last push 80 days ago"]},"identity":{"score":8,"max":10,"notes":["registry namespace matches repository owner","GitHub account older than a year"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@jtalk22/asana-mcp","version":"1.0.1","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":1,"publishedAt":"2026-08-15T22:06:07.581Z","repositoryUrl":"git+https://github.com/jtalk22/asana-mcp-server.git","weeklyDownloads":71}],"repo":{"found":true,"owner":"jtalk22","repo":"asana-mcp-server","archived":false,"pushedAt":"2026-08-15T23:40:25Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/141901428?v=4","ownerCreatedAt":"2023-08-10T05:59:22Z","license":"MIT"},"icon":{"url":null,"source":"none"},"presence":{"stars":0,"forks":0,"downloadsWeek":71,"license":"MIT","lastPushAt":"2026-08-15T23:40:25.000Z","score":22}}}},"grade_history":[],"reviews":[]}