AI agent system for monitoring and reserving Oktoberfest beer tent tables via MCP protocol
Server has 15 tools with basic schemas and descriptions, but significant gaps limit production readiness. Most tools lack parameter descriptions (e.g., 'timeout' in wait_for_element has no guidance on units or range). Descriptions are present but often generic or incomplete, many under 100 chars, some lacking context on when to use vs. similar tools. No output schemas documented. Error handling is minimal; most tools return JSON with 'error' fields but no recovery guidance. Tool naming is reasonable (verb-first), but composition issues exist: detect_forms appears twice (tools 3 and 15) with identical names but different descriptions, creating ambiguity. No tool annotations (readOnlyHint, destructiveHint, idempotentHint). WRITE-risk tools (fill_field, click_button, run_js) lack confirmation or dry-run patterns. Notification tools expose event_type as free-form string instead of enum. Overall, definitions are functional but would not pass code review for production agent deployment.
Check ALL configured portals for changes. Goes through each enabled portal and reports its status.
Navigate to a booking portal and check if it has changed. Returns the page title, whether the page changed, and the page content.
Click a button or link.
Detect all forms on the page and return their fields.
Detect all forms and interactive fields on the current page. Supports: Classic HTML forms, Filament/Livewire-based wizard forms (FestZelt OS), Progressive-reveal selects (Livewire: empty first, populate after selection), Ratskeller.com-style booking forms (appvars[...] fields), Iframes with embedded forms, Fields outside <form> tags (wire:model bound)
Fill a form field.
Duplicate tool name 'detect_forms' (tools 3 and 15) with different descriptions creates ambiguity. LLM cannot distinguish which to call.
WRITE-risk tools (fill_field, click_button, run_js, select_option) lack confirmation, dry-run, or idempotent hints. Agents may execute destructive actions without safeguards.
No output schemas documented for any tool. LLMs cannot predict response structure, forcing runtime parsing and increasing hallucination risk.
Parameter 'timeout' in wait_for_element lacks description of units (milliseconds assumed but not stated) and valid range. LLM may pass invalid values.
Inferred effective spec: <=2025-11-25.
| Scored | Grade | Overall | Spec posture | Rubric |
|---|---|---|---|---|
| 2026-09-23 | D | 50 | <=2025-11-25 | v2 |
Return the text content of a page section.
Navigate the browser to a URL and return the page title.
Execute JavaScript in the browser and return the result. Useful for Livewire/Alpine.js interactions: Set element values: document.getElementById('id').value = 'x', Dispatch events: el.dispatchEvent(new Event('change', {bubbles: true})), Livewire: wait ~2.5s after select change for server roundtrip
Select an option in a dropdown menu.
Desktop notification (legacy-compatible, now uses unified sender).
Send a notification to all configured services. Returns JSON with status: 'sent' | 'partial' | 'failed' | 'skipped' | 'error'. notify_type: 'info', 'success', 'warning', 'failure' (Apprise severity). event_type: optional key for emoji lookup (e.g. 'evening_slot', 'form_filled')
Switch into an iframe (e.g. for Käfer, Festzelt Tradition). After switching, the bound 'page' is replaced with the iframe's content frame so subsequent tool calls target the iframe content. Note: This only works in workflow mode (with bind_tools). In MCP mode, use the MCP switch_to_iframe tool which handles page swapping via WiesnContext.
Take a screenshot of the current page.
Wait until an element becomes visible on the page.
send_notification tool accepts 'event_type' as free-form string instead of enum. No guidance on valid values; LLM may hallucinate invalid event types.