01Safety
0.0 / 30
What changed in the harness
Selection accuracy 100→98, token cost up 4%, unconfirmed writes 0%→0%.
Category breakdown
Earned points across the four signals Gradable measures. Safety and Legibility are scored out of 30; Economics and Discoverability are scored out of 20.
0.0 / 30
19.9 / 30
11.8 / 20
13.4 / 20
Highest-impact fix
Estimated gain +30 pointsExpose machine-readable principal/tenant confirmation and a non-mutating permission check so agents can verify both before destructive actions.
Description evidence
27 defects found across the exposed tool descriptions. Suggested rewrites make purpose, inputs, boundaries, and returns easier for an agent to understand.
| Tool | Defect types | Suggested rewrite |
|---|---|---|
create_qr_code |
no_return_description |
Create a new managed QR code with optional custom styling. The QR code points to a short URL that redirects to your target URL. You can change the target URL later without regenerating the QR image. Supports custom colors, dot shapes, corner shapes, and logo embedding. Returns the created QR code's short_id, short URL, and the QR image data in the requested format. |
update_qr_destination |
no_return_description |
Change where an existing QR code redirects to. This is the key 'dynamic link' feature: the QR image stays the same, but scanning it will now go to the new URL. Ideal for updating campaigns, fixing broken links, or A/B testing. Returns the updated QR code record with its new target URL and other fields. |
delete_qr_code |
no_return_description |
Permanently delete a QR code and all its scan analytics. The short URL will stop working immediately. This cannot be undone. Returns a confirmation of deletion. |
bulk_create_qr_codes |
no_return_description |
Create multiple QR codes in a single request (up to 50). Each item supports the same options as create_qr_code. The quota check is all-or-nothing: if the batch would exceed your plan limit, no QR codes are created. Ideal for generating QR codes for product catalogs, event lists, or batch operations. Returns an array of the created QR codes, each with its short_id, short URL, and image data. |
bulk_update_qr_codes |
no_return_description |
Update multiple QR codes in a single request (up to 50). Change target URLs and/or labels. Items with non-existent short_id are reported as not_found without failing the whole batch. Returns an array of per-item results indicating each update's success or not_found status. |
bulk_delete_qr_codes |
no_return_description |
Delete multiple QR codes and their scan analytics in a single request (up to 50). Items with non-existent short_id are reported as not_found without failing the whole batch. Returns an array of per-item results indicating each deletion's success or not_found status. |
create_vcard_qr |
params_unexplained no_return_description |
Create a QR code that encodes a contact card (vCard). When scanned by a phone camera, it prompts the user to save the contact. Supports all standard vCard fields (including phone, the contact's phone number) and custom QR styling such as frame_text_color (hex color for the CTA text on the decorative frame). Returns the created QR code's short_id, short URL, and image data. |
create_wifi_qr |
params_unexplained no_return_description |
Create a QR code that encodes WiFi credentials. When scanned by a phone camera, it offers to auto-join the WiFi network. No internet connection needed to join — the credentials are encoded directly in the QR image. frame_text_color sets the hex color of the CTA text on the decorative frame, if one is used. Returns the created QR code's short_id, short URL, and image data. |
update_vcard_qr |
params_unexplained no_return_description |
Update the contact details of a vCard QR code, including phone (the contact's phone number). Only works on QR codes created with type='vcard'. Partial updates merge with existing data. Note: updating vCard data changes the QR image content. Returns the updated QR code record. |
update_wifi_qr |
no_return_description |
Update the WiFi credentials of a WiFi QR code. Only works on QR codes created with type='wifi'. Note: updating WiFi data changes the QR image content. Returns the updated QR code record. |
create_email_qr |
params_unexplained no_return_description |
Create a QR code that opens a pre-filled email when scanned. The recipient, subject, body, CC, and BCC can all be pre-set, and the QR can be styled with a decorative frame, including frame_text_color for the CTA text's hex color. Returns the created QR code's short_id, short URL, and image data. |
create_sms_qr |
params_unexplained no_return_description |
Create a QR code that opens a pre-filled SMS message when scanned. Set the phone number and optional message text, and optionally style a decorative frame, including frame_text_color for the CTA text's hex color. Returns the created QR code's short_id, short URL, and image data. |
create_phone_qr |
name_restates_behavior params_unexplained no_return_description |
Create a QR code that initiates a phone call to the given phone_number when scanned by a phone camera. Supports custom styling including a decorative frame, where frame_text_color sets the CTA text's hex color. Returns the created QR code's short_id, short URL, and image data. |
create_event_qr |
params_unexplained no_return_description |
Create a QR code that adds a calendar event when scanned. Encodes a standard iCalendar VEVENT that calendar apps can import, with optional decorative frame styling including frame_text_color for the CTA text's hex color. Returns the created QR code's short_id, short URL, and image data. |
create_text_qr |
params_unexplained no_return_description |
Create a QR code that contains plain text. When scanned, the text is displayed directly. Useful for messages, notes, or any freeform content, with optional decorative frame styling including frame_text_color for the CTA text's hex color. Returns the created QR code's short_id, short URL, and image data. |
create_location_qr |
params_unexplained no_return_description |
Create a QR code that opens a map location when scanned. Encodes geographic coordinates that map apps can parse, with optional decorative frame styling including frame_text_color for the CTA text's hex color. Returns the created QR code's short_id, short URL, and image data. |
create_social_qr |
params_unexplained |
Create a QR code that links to social media profiles. When scanned via the short URL, returns a JSON object with all platform links. Provide at least one platform link. Supports decorative frame styling, including frame_text_color for the CTA text's hex color. |
create_app_store_qr |
params_unexplained |
Create a QR code that redirects to the correct app store based on the device. iPhones go to the App Store, Android devices go to Google Play, and other devices go to the fallback URL. Provide at least one store URL. Supports decorative frame styling, including frame_text_color for the CTA text's hex color. |
update_social_qr |
name_restates_behavior no_return_description |
Update the social media profile links (Facebook, Instagram, Twitter/X, LinkedIn, YouTube, TikTok, GitHub, website) of an existing Social QR code. Partial updates merge with existing data. Returns the updated QR code record. |
update_app_store_qr |
name_restates_behavior params_unexplained no_return_description |
Update the app store URLs of an existing App Store QR code, including fallback_url (where non-mobile devices are sent). Partial updates merge with existing data. Returns the updated QR code record. |
list_webhooks |
no_return_description |
List all registered webhook endpoints for your API key. The HMAC secret is not included for security. Returns an array of webhook records with their IDs, URLs, and subscribed events. |
delete_webhook |
name_restates_behavior no_return_description |
Remove a registered webhook endpoint, identified by webhook_id (use list_webhooks to find IDs), and delete all its delivery logs. The endpoint stops receiving events immediately. Returns a confirmation of deletion. |
get_usage |
name_restates_behavior no_return_description |
Check how much of your plan's quota has been consumed. Returns current usage counts (QR codes, scans, webhooks) alongside your plan's limits. |
set_utm_params |
no_return_description |
Set UTM tracking parameters on a URL QR code. These parameters are automatically appended to the target URL on every scan redirect. Use this to track QR code scans in Google Analytics or other analytics tools. Set 'clear' to true to remove all UTM parameters. Returns the updated QR code record with its current UTM configuration. |
set_redirect_rules |
no_return_description |
Set conditional redirect rules on a URL QR code. Rules are evaluated top-to-bottom; each rule has an array of conditions (AND logic) — all must match. First matching rule's URL is used. If no rule matches, the default target_url applies. Conditions: 'device' (mobile/tablet/desktop), 'os' (iOS/Android/Windows/macOS/Linux), 'country' (ISO alpha-2 like 'FR'), 'language' (ISO 639-1 like 'fr'), 'time_range' ({start:'09:00',end:'17:00',timezone:'Europe/Paris'}), 'ab_split' ({percentage:50}). Combine conditions in a single rule for AND logic (e.g. mobile + FR). Pass an empty array to remove all rules. Returns the updated QR code record with its current redirect rules. |
set_custom_domain |
no_return_description |
Set a custom domain for your QR code short URLs (Pro plan required). When set, all new QR codes will use https://your-domain.com/r/... instead of the default URL. You must configure DNS (CNAME) to point to the QR Agent server. Pass domain=null to remove the custom domain. Returns the current custom domain configuration and its DNS verification status. |
record_conversion |
no_return_description |
Record a post-scan conversion event (purchase, signup, etc.) for a QR code you own. Use this to track ROI — e.g., when a user scans a QR code and then makes a purchase, record a 'purchase' conversion with the order value. For client-side tracking without code, use the tracking pixel: <img src="https://yourhost/t/{short_id}?event=purchase&value=49.99">. Returns the recorded conversion event. |
Selection evidence
16 pairs where similar names or overlapping descriptions may send an agent toward the wrong tool.
| Tool A | Tool B | Confidence | Why they collide |
|---|---|---|---|
create_qr_code |
bulk_create_qr_codes |
medium | A task like 'create QR codes for these 3 URLs' could be done with repeated create_qr_code calls or a single bulk_create_qr_codes call; agent may not realize bulk exists or may misuse single-item bulk call. |
delete_qr_code |
bulk_delete_qr_codes |
medium | A request to delete a single QR code could be routed to bulk_delete_qr_codes with a one-element array, or a request to delete 'a few' codes might be handled with repeated single deletes instead of the bulk tool. |
bulk_create_qr_codes |
bulk_update_qr_codes |
low | Both are bulk batch operations on QR codes but one creates new codes and the other updates existing ones by short_id; wording like 'set up these QR codes' could be ambiguous between creating new vs updating existing if context is unclear, though required fields (target_url vs short_id) differ enough to usually disambiguate. |
bulk_create_qr_codes |
bulk_delete_qr_codes |
low | Different verbs (create vs delete) make confusion unlikely except in careless parsing, but both are 'bulk QR code' batch tools with similar structure. |
bulk_update_qr_codes |
bulk_delete_qr_codes |
low | Different verbs (update vs delete) reduce confusion, but both are same-shape bulk QR batch tools. |
create_app_store_qr |
update_app_store_qr |
low | A task like 'set the iOS URL for this app store QR code' could be ambiguous between creating a new one with ios_url vs updating an existing one, especially if short_id context is missing. |
create_email_qr |
create_sms_qr |
low | Both create pre-filled messaging QR codes with similar description patterns ('opens a pre-filled X'), but distinct required fields (to vs phone_number) and clear semantic difference (email vs SMS) make confusion unlikely. |
create_social_qr |
update_social_qr |
medium | A task like 'add my Instagram link to this QR code' is ambiguous between creating a new social QR with instagram field vs updating an existing one via update_social_qr, especially without an explicit short_id in the request. |
create_wifi_qr |
update_wifi_qr |
medium | A request like 'change the WiFi password on this QR code' could be misrouted to create_wifi_qr instead of update_wifi_qr if the agent doesn't recognize an existing QR code is referenced, or vice versa for ambiguous 'set up wifi QR with new password' phrasing. |
create_vcard_qr |
update_vcard_qr |
medium | A task like 'update the contact QR with a new phone number' is ambiguous between creating a fresh vCard QR and updating an existing one via update_vcard_qr if short_id isn't explicit in the request. |
get_qr_code |
get_qr_analytics |
low | A vague request like 'get info on this QR code' could be routed to either get_qr_code (metadata) or get_qr_analytics (scan stats), though 'analytics'/'scans' wording usually disambiguates. |
get_qr_code |
list_qr_codes |
low | A request like 'show me my QR code' without specifying single vs all could be ambiguous, though get_qr_code requires a short_id which usually clarifies intent. |
update_qr_destination |
update_social_qr |
low | Both update an existing QR's target, but update_qr_destination is for generic URL redirect QR codes while update_social_qr is specific to social platform links; a vague 'update this QR's link' could be misrouted if QR type is unclear. |
update_qr_destination |
update_vcard_qr |
low | update_qr_destination targets simple redirect QR codes while update_vcard_qr updates contact-card content; a vague 'update this QR code's info' could be ambiguous if the underlying QR type isn't clear to the agent. |
update_qr_destination |
update_wifi_qr |
low | Both are 'update' tools for existing QR codes, but one changes redirect target_url and the other changes WiFi credentials; ambiguous only if the QR type is unspecified in the request. |
set_utm_params |
set_redirect_rules |
low | Both configure additional behavior on an existing URL-type QR code and share 'set' naming, but UTM tracking parameters vs conditional redirect rules are functionally distinct enough that confusion is unlikely except in very vague 'configure tracking/routing' requests. |
Compare the field