{"formatVersion":"1","kind":"dock_integration","slug":"asana-api","title":"Asana API","summary":"Import a Harbor-safe Asana starter set for project discovery, task listing, and approval-friendly task creation.","description":"A Dock-hosted Asana API starter integration for Harbor. Importing it creates a local http_api port shell plus a Harbor-safe Asana action set for listing projects, listing tasks with bounded filters, and creating tasks with explicit approval. Tokens remain local to Harbor Node.","version":"0.1.0","publisher":{"slug":"asana","name":"Asana","websiteUrl":"https://developers.asana.com/"},"category":"Work Management","tags":["asana","tasks","projects","planning","productivity"],"compatibility":{"harborNode":">=0.1.0","notes":"Requires local operator-configured auth after import. Asana reads use typed input.query values and task creation uses input.body JSON payloads."},"requiredPlan":"community","portTemplates":[{"kind":"http_api","label":"Asana API","description":"Asana API connection managed locally through Harbor.","baseUrl":"https://app.asana.com/api/1.0/","authMode":"header_token","authHeaderName":"Authorization","authTokenPrefix":"Bearer"}],"actionTemplates":[{"slug":"list-projects","label":"List Projects","description":"List Asana projects with explicit workspace and archived-state filters.","method":"GET","path":"/projects","inputs":{"parameters":[{"name":"workspace","in":"query","schema":{"type":"string","minLength":1},"description":"Optional Asana workspace GID to scope project results."},{"name":"archived","in":"query","schema":{"type":"boolean"},"description":"Whether to include archived projects."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":50,"description":"Maximum number of projects to return."},{"name":"offset","in":"query","schema":{"type":"string"},"description":"Pagination offset token from a previous Asana response."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-tasks","label":"List Tasks","description":"List Asana tasks using bounded project, assignee, workspace, and completion filters.","method":"GET","path":"/tasks","inputs":{"parameters":[{"name":"project","in":"query","schema":{"type":"string","minLength":1},"description":"Optional Asana project GID to scope tasks."},{"name":"workspace","in":"query","schema":{"type":"string","minLength":1},"description":"Optional Asana workspace GID when listing tasks outside a specific project."},{"name":"assignee","in":"query","schema":{"type":"string","minLength":1},"description":"Optional assignee GID or `me`."},{"name":"completed_since","in":"query","schema":{"type":"string","maxLength":80},"description":"Completion filter such as `now` for incomplete tasks only."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":50,"description":"Maximum number of tasks to return."},{"name":"offset","in":"query","schema":{"type":"string"},"description":"Pagination offset token from a previous Asana response."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-users","label":"List Users","description":"List users in an explicit Asana workspace using typed pagination inputs.","method":"GET","path":"/workspaces/{workspace_gid}/users","inputs":{"parameters":[{"name":"workspace_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana workspace GID."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":50,"description":"Maximum number of users to return."},{"name":"offset","in":"query","schema":{"type":"string"},"description":"Pagination offset token from a previous Asana response."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-project","label":"Get Project","description":"Fetch a single Asana project using an explicit project GID.","method":"GET","path":"/projects/{project_gid}","inputs":{"parameters":[{"name":"project_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana project GID."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"get-task","label":"Get Task","description":"Fetch a single Asana task using an explicit task GID.","method":"GET","path":"/tasks/{task_gid}","inputs":{"parameters":[{"name":"task_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana task GID."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-project-tasks","label":"List Project Tasks","description":"List tasks for a specific project using an explicit project GID and bounded pagination inputs.","method":"GET","path":"/projects/{project_gid}/tasks","inputs":{"parameters":[{"name":"project_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana project GID."},{"name":"limit","in":"query","schema":{"type":"integer","minimum":1,"maximum":100},"default":50,"description":"Maximum number of tasks to return."},{"name":"offset","in":"query","schema":{"type":"string"},"description":"Pagination offset token from a previous Asana response."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-project-sections","label":"List Project Sections","description":"List sections in a specific Asana project using an explicit project GID.","method":"GET","path":"/projects/{project_gid}/sections","inputs":{"parameters":[{"name":"project_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana project GID."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-task-stories","label":"List Task Stories","description":"List stories and comments for a specific Asana task using an explicit task GID.","method":"GET","path":"/tasks/{task_gid}/stories","inputs":{"parameters":[{"name":"task_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana task GID."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"list-project-memberships","label":"List Project Memberships","description":"List memberships for a specific Asana project using an explicit project GID.","method":"GET","path":"/projects/{project_gid}/project_memberships","inputs":{"parameters":[{"name":"project_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana project GID."}]},"approvalMode":"automatic","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-task","label":"Create Task","description":"Create an Asana task using a bounded JSON request body under input.body.","method":"POST","path":"/tasks","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"create-webhook","label":"Create Webhook","description":"Create an Asana webhook using a bounded JSON request body.","method":"POST","path":"/webhooks","approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"add-project-member","label":"Add Project Member","description":"Add members to an Asana project using an explicit project GID and a bounded JSON request body.","method":"POST","path":"/projects/{project_gid}/addMembers","inputs":{"parameters":[{"name":"project_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana project GID."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"update-task","label":"Update Task","description":"Update a specific Asana task using an explicit task GID and a bounded JSON request body.","method":"PUT","path":"/tasks/{task_gid}","inputs":{"parameters":[{"name":"task_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana task GID."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"delete-task","label":"Delete Task","description":"Delete a specific Asana task using an explicit task GID.","method":"DELETE","path":"/tasks/{task_gid}","inputs":{"parameters":[{"name":"task_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana task GID."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"},{"slug":"create-task-story","label":"Create Task Story","description":"Add a story or comment to a specific Asana task using an explicit task GID and a bounded JSON request body.","method":"POST","path":"/tasks/{task_gid}/stories","inputs":{"parameters":[{"name":"task_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana task GID."}]},"approvalMode":"require_approval","requestBodyMode":"json","resultMode":"json_summary"},{"slug":"delete-webhook","label":"Delete Webhook","description":"Delete an Asana webhook using an explicit webhook GID.","method":"DELETE","path":"/webhooks/{webhook_gid}","inputs":{"parameters":[{"name":"webhook_gid","in":"path","required":true,"schema":{"type":"string","minLength":1},"description":"Asana webhook GID."}]},"approvalMode":"require_approval","requestBodyMode":"none","resultMode":"json_summary"}],"helpText":"Import to Harbor, configure local auth, then validate and test list-projects and list-tasks before enabling create-task. Use explicit project, workspace, or assignee filters instead of widening into Asana's larger search surface. Keep create-task on approval unless your local policy explicitly allows it.","installNotes":"Dock shares only safe metadata. Hidden auth must be configured locally inside Harbor after import. Asana list actions use input.query for bounded filters and pagination values, and create-task uses input.body for the new task payload."}