Fast Asana task and project management via FGP daemon. Use when user needs to manage tasks, list projects, search workspaces, or track work in Asana. Triggers on "asana task", "create asana", "asana project", "list tasks", "asana search".
Resources
1Install
npx skillscat add fast-gateway-protocol/fgp-skills/asana-daemon Install via the SkillsCat registry.
FGP Asana Daemon
Fast Asana task and project management using a persistent daemon architecture. Eliminates cold-start latency from spawning Python/Node API clients on every request.
Why FGP?
FGP daemons maintain persistent connections and avoid cold-start overhead. Instead of spawning a new API client for each request, the daemon stays warm and ready.
Benefits:
- No cold-start latency
- Connection pooling
- Persistent authentication
Installation
# Via Homebrew (recommended)
brew tap fast-gateway-protocol/fgp
brew install fgp-asana
# Via npx
npx add-skill fgp-asanaQuick Start
# Set your Asana personal access token
export ASANA_ACCESS_TOKEN="1/12345..."
# Start the daemon
fgp start asana
# List tasks in a project
fgp call asana.list_tasks --project_gid "12345"
# Create a task
fgp call asana.create_task --workspace_gid "ws123" --name "Review PR" --due_on "2026-01-20"Authentication
Get a Personal Access Token from Asana:
- Go to https://app.asana.com/0/my-apps
- Click "Create new token"
- Copy the token and set
ASANA_ACCESS_TOKEN
For OAuth2 apps, set ASANA_CLIENT_ID and ASANA_CLIENT_SECRET instead.
Methods
Tasks
asana.get_task- Retrieve a task by GIDtask_gid(string, required): The task GIDopt_fields(array, optional): Fields to return
asana.create_task- Create a new taskworkspace_gid(string, required): Workspace GIDname(string, required): Task nameprojects(array, optional): Project GIDs to add task toassignee(string, optional): Assignee user GID or emaildue_on(string, optional): Due date (YYYY-MM-DD)notes(string, optional): Task description
asana.update_task- Update task fieldstask_gid(string, required): The task GIDname(string, optional): New task namecompleted(boolean, optional): Mark complete/incompletedue_on(string, optional): New due dateassignee(string, optional): New assignee
asana.delete_task- Delete a tasktask_gid(string, required): The task GID
asana.list_tasks- List tasks in a project or assigned to userproject_gid(string, optional): Project to list tasks fromassignee(string, optional): User GID or "me"workspace_gid(string, required if using assignee): Workspace GIDcompleted_since(string, optional): ISO datetime filter
Projects
asana.get_project- Retrieve project detailsproject_gid(string, required): The project GID
asana.list_projects- List projects in a workspaceworkspace_gid(string, required): Workspace GIDarchived(boolean, optional): Include archived projects
asana.create_project- Create a new projectworkspace_gid(string, required): Workspace GIDname(string, required): Project nameteam_gid(string, optional): Team GID for team projects
Comments & Stories
asana.add_comment- Add a comment to a tasktask_gid(string, required): The task GIDtext(string, required): Comment text (supports @mentions)
asana.get_stories- Get task activity/commentstask_gid(string, required): The task GID
Search
asana.search_tasks- Search tasks in a workspaceworkspace_gid(string, required): Workspace GIDtext(string, optional): Text to search forassignee(string, optional): Filter by assigneeprojects(array, optional): Filter by project GIDscompleted(boolean, optional): Filter by completion status
Workspaces
asana.list_workspaces- List all accessible workspaces- No parameters required
Examples
Get my tasks due this week
fgp call asana.search_tasks \
--workspace_gid "12345" \
--assignee "me" \
--due_on.before "2026-01-24" \
--completed falseCreate a task with subtasks
# Create parent task
TASK=$(fgp call asana.create_task --workspace_gid "12345" --name "Ship feature X" --projects '["proj-123"]')
TASK_GID=$(echo $TASK | jq -r '.result.gid')
# Add subtasks
fgp call asana.create_task --workspace_gid "12345" --name "Write tests" --parent "$TASK_GID"
fgp call asana.create_task --workspace_gid "12345" --name "Update docs" --parent "$TASK_GID"Mark task complete with comment
fgp call asana.update_task --task_gid "task-123" --completed true
fgp call asana.add_comment --task_gid "task-123" --text "Completed! PR merged: https://github.com/..."Error Handling
The daemon returns structured errors:
{
"ok": false,
"error": {
"code": "not_found",
"message": "task: Unknown object: 12345"
}
}Common error codes:
not_authorized- Invalid token or insufficient permissionsnot_found- Task/project not foundinvalid_request- Malformed request parametersrate_limited- Too many requests (daemon handles backoff)