Queue login for external agents

Trying to solve this.
We have a client with a queue of dynamic agents. Agents are not using any app, just mobile phone numbers as followme. We can login/logout them into the queue using Switchboard, but is there a way they can do it remotely using just IVR on the inbound number? The reason is we want to allow each user or manager be able to login/logout extension from a queue just using a phone call.
Thanks for any hints.

Hi, only possible with custom context (custom dialplans):

As there was no other way except for custom context. Here is what I have created, hopefully, it will help someone.
This custom context is made on the Tenanted system, it asks you for the QUEUE number and EXTENSION. Extension has to be a Dynamic queue member. This context was based on the original login/logout queue context.

[external-queue-agent]
exten => s,1,Verbose(LOGIN/LOGOUT QUEUE AND MEMBER )
same => n,Answer
same => n,Wait(1)
same => n(read_q_number),Read(QUEUE_NUMBER,please-enter-the&vpbx/vital-agent-queue-number&followed_pound)
same => n,GotoIf($[“${QUEUE_NUMBER}”=“”]?read_q_number)
same => n(read_ext_number),Read(EXT_NUMBER,please-enter-the&extension&followed_pound)
same => n,GotoIf($[“${EXT_NUMBER}”=“”]?read_ext_number)
same => n,Set(QUEUE_NAME=${DB(${TENANT}/queues/${QUEUE_NUMBER}/name)})
same => n,GotoIf($[“${QUEUE_NAME}”=“”]?read_q_number)
same => n,GotoIf(${QUEUE_EXISTS(${QUEUE_NAME})}?:read_q_number)
same => n,Set(MEMBER_TYPE=${DB(${TENANT}/queues/${QUEUE_NUMBER}/member/${EXT_NUMBER}/type)})
same => n,GotoIf($[“${MEMBER_TYPE}”=“dynamic”]?continue)
same => n,Playback(vpbx/vital-queue-no-dyn-member)
same => n,Goto(read_q_number)
same => n(continue),Set(MEMBER_PENALTY=${DB(${TENANT}/queues/${QUEUE_NUMBER}/member/${EXT_NUMBER}/penalty)})
same => n,Set(CoS=${DB(${TENANT}/extensions/${EXT_NUMBER}/context)})
same => n,Set(INTERFACE=Local/${EXT_NUMBER}@${CoS})
same => n,Set(LOGIN_STATUS=${DEVICE_STATE(Custom:${TENANT_PREFIX}QAL_${EXT_NUMBER}${QUEUE_NUMBER})})
same => n,GotoIf($[“${LOGIN_STATUS}”=“BUSY”]?turn_off)
same => n,Set(RING_UNAVAILABLE=${DB(${TENANT}/queues/${QUEUE_NUMBER}/ring_unavailable)})
same => n,Set(AGENT_HINT=${IF($[“${RING_UNAVAILABLE}”=“yes”]?Agent${EXT_NUMBER}@${HINTS_CONTEXT}:QA
${EXT_NUMBER}@${HINTS_CONTEXT})})
same => n,AddQueueMember(${QUEUE_NAME},Local/${EXT_NUMBER}@${QUEUE_AGENTS_CONTEXT}/n,${MEMBER_PENALTY},${EXT_NUMBER},hint:${AGENT_HINT})
same => n,ExecIf($[“${AQMSTATUS}”=“ADDED”]?Set(DEVICE_STATE(Custom:${TENANT_PREFIX}QAL_${EXT_NUMBER}${QUEUE_NUMBER})=BUSY):Goto(invalid))
same => n,Playback(vpbx/vital-agent-login)
same => n,Goto(end)
same => n(turn_off),RemoveQueueMember(${QUEUE_NAME},${INTERFACE});Legacy
same => n,RemoveQueueMember(${QUEUE_NAME},Local/${EXT_NUMBER}@${QUEUE_AGENTS_CONTEXT}/n)
same => n,Set(DEVICE_STATE(Custom:${TENANT_PREFIX}QAL
${EXT_NUMBER}${QUEUE_NUMBER})=NOT_INUSE)
same => n,Set(DEVICE_STATE(Custom:${TENANT_PREFIX}QAP
${EXT_NUMBER}_${QUEUE_NUMBER})=NOT_INUSE)
same => n,Playback(vpbx/vital-agent-logoff)
same => n,Goto(end)
same => n(invalid),Playback(invalid)
same => n(end),Hangup()

Enjoy
Pavel