MCP server exposing Azure Storage Queues as agent-to-agent task delegation tools using a pull model with no inbound connections required
AgentQueueMcp has well-structured tool definitions with clear naming (verb_noun pattern: send_task, send_result, get_messages, ack_message, list_agents) and comprehensive parameter descriptions. All 6 tools have input schemas with typed parameters and descriptions. However, output schemas are not formally documented, tools return JSON strings rather than structured objects with declared fields. Error handling is minimal; tools lack recovery guidance and actionable error messages. The server uses Azure Queue Storage as a message broker, which is a valid pattern, but the tool descriptions could better explain the at-least-once delivery semantics and idempotency requirements.
Acknowledge a task message (remove it from the queue permanently). Required after processing a task to prevent redelivery.
Read your own inbox. Non-task messages (result/question/progress/info) are archived and removed immediately. Tasks stay invisible for visibilityTimeoutSec and MUST be ack_message-d after processing, or they reappear (at-least-once — be idempotent on taskId).
List all agents that have ever sent or received messages (discovered from queue names matching the prefix pattern).
Send a free-form message to a named agent: type question (needs an answer), progress (status update), or info (answer / FYI). Use the conversationId of the thread you are replying to.
Send a task result back to the requesting agent (use the 'from' of the task envelope as 'to').
Output schemas not formally documented. Tools return JSON strings (via Out() helper) rather than structured objects with declared field types. LLMs cannot plan downstream tool calls without knowing what fields to expect.
Error handling lacks recovery guidance. Tools throw ArgumentException or InvalidOperationException with minimal context. No guidance on retryability, user-fixable vs fatal errors, or next steps for the LLM.
get_messages description mentions at-least-once delivery and idempotency requirement but does not explain the visibilityTimeoutSec parameter's impact on message redelivery or how to handle duplicate taskIds.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 59 | <=2025-11-25 | v2 |
Send a task to a named agent's inbox. Generates taskId (also used as conversationId unless given). Returns taskId and conversationId.
send_task and send_result descriptions do not clarify that conversationId is optional and auto-generated if omitted. This could lead LLMs to always pass a conversationId when it's not necessary.
No confirmation or dry-run pattern for destructive operations. send_result with status=error and ack_message permanently remove messages from the queue with no undo mechanism.