01Safety
0.0 / 30
What changed in the harness
Selection accuracy 98→100, token cost up 2%, 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.4 / 30
12.2 / 20
12.6 / 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 image encodes a short URL that redirects to your target URL, and you can change the target URL later without regenerating the QR image. Supports custom colors, dot/corner shapes, logo embedding, gradients, frames, expiration dates, scheduled URL switching, and GTM tracking. Returns the created QR code record with its short ID, the short redirect URL, current target URL, metadata, and timestamps. |
update_qr_destination |
no_return_description |
Change where an existing QR code redirects to without regenerating the QR image: the QR image stays the same, but scanning it now goes to the new URL. Ideal for updating campaigns, fixing broken links, or A/B testing. You can also update the label, expiration (pass null to remove), scheduled URL switch, and GTM tracking. Returns the updated QR code record with its short ID, new target URL, metadata, and timestamps. |
delete_qr_code |
no_return_description |
Permanently delete a QR code and all of its scan analytics; the short URL stops working immediately and the action cannot be undone. Returns a confirmation of the deletion with the deleted short ID. |
bulk_create_qr_codes |
no_return_description |
Create up to 50 QR codes in a single request; each item accepts the same options as create_qr_code (target URL, label, styling, logo, expiration, scheduled URL). The quota check is all-or-nothing: if the batch would exceed your plan limit, no QR codes are created. Ideal for product catalogs, event lists, or batch operations. Returns the created QR code records, each with its short ID, short redirect URL, and metadata. |
bulk_update_qr_codes |
no_return_description |
Update up to 50 QR codes in a single request, changing their target URLs, labels, expiration, and scheduled URLs. Items with non-existent short_ids are reported as not_found without failing the whole batch. Returns per-item results indicating whether each update succeeded or the short_id was not found. |
bulk_delete_qr_codes |
no_return_description |
Delete up to 50 QR codes and their scan analytics in a single request. Items with non-existent short_ids are reported as not_found without failing the whole batch. Returns per-item results indicating whether each QR code was deleted or the short_id was not found. |
create_vcard_qr |
params_unexplained no_return_description |
Create a QR code that encodes a contact card (vCard); scanning it with a phone camera prompts the user to save the contact. Supports standard vCard fields (first/last name, organization, job title, contact email, contact phone number, website, street address, notes) plus custom colors, dot/corner styles, logo embedding, and decorative frames with optional CTA text (text color defaults to #ffffff on a #000000 frame). Returns the created QR code record with its short ID and the short redirect URL; the vCard content is encoded directly in the QR image. |
create_wifi_qr |
params_unexplained no_return_description |
Create a QR code that encodes WiFi credentials; scanning it with a phone camera offers to auto-join the network. The credentials are encoded directly in the QR image, so no internet connection is needed to join. Specify the SSID, password (omit for open networks with encryption=nopass), encryption type, and whether the network is hidden, plus custom colors, dot/corner styles, logo embedding, and decorative frames with optional CTA text (text color defaults to #ffffff on a #000000 frame). Returns the created QR code record with its short ID and the short redirect URL. |
update_vcard_qr |
params_unexplained no_return_description |
Update the contact details of a QR code created with type='vcard'. Partial updates merge with existing data: omit a field to keep its current value. You can update the contact's first/last name, organization, job title, email, phone number, website, street address, notes, and label. Note that changing vCard data re-encodes the QR image content. Returns the updated QR code record with its short ID and timestamps. |
update_wifi_qr |
no_return_description |
Update the WiFi credentials (SSID, password, encryption, hidden) of a QR code created with type='wifi'. Omitted fields keep their current values, and you can also update the label. Note that changing WiFi data re-encodes the QR image content. Returns the updated QR code record with its short ID and timestamps. |
create_email_qr |
params_unexplained no_return_description |
Create a QR code that, when scanned, opens a pre-filled email compose window. You can preset the recipient, subject, body, CC, and BCC, and apply custom colors, dot/corner styles, logo embedding, and decorative frames with optional CTA text (text color defaults to #ffffff on a #000000 frame). Returns the created QR code record with its short ID and the short redirect URL. |
create_sms_qr |
params_unexplained no_return_description |
Create a QR code that, when scanned, opens a pre-filled SMS message to a given phone number, with optional message text. Supports custom colors, dot/corner styles, logo embedding, and decorative frames with optional CTA text (text color defaults to #ffffff on a #000000 frame). Returns the created QR code record with its short ID and the short redirect URL. |
create_phone_qr |
name_restates_behavior params_unexplained no_return_description |
Create a QR code that, when scanned on a mobile device, opens the phone dialer pre-filled with the given number so users can call it with one tap, useful for support lines or offline contact cards. The phone number is encoded directly in the QR image. Supports custom colors, dot/corner styles, logo embedding, and decorative frames with optional CTA text (text color defaults to #ffffff on a #000000 frame). Returns the created QR code record with its short ID and the short redirect URL. |
create_event_qr |
params_unexplained no_return_description |
Create a QR code that encodes a standard iCalendar VEVENT; scanning it with a calendar app offers to add the event. Provide a title, ISO 8601 start and end date-times, and optionally a location and description, plus custom colors, dot/corner styles, logo embedding, and decorative frames with optional CTA text (text color defaults to #ffffff on a #000000 frame). Returns the created QR code record with its short ID and the short redirect URL. |
create_text_qr |
params_unexplained no_return_description |
Create a QR code that encodes plain text; scanning it displays the text directly, useful for messages, notes, or other freeform content. Supports custom colors, dot/corner styles, logo embedding, and decorative frames with optional CTA text (text color defaults to #ffffff on a #000000 frame). Returns the created QR code record with its short ID and the short redirect URL. |
create_location_qr |
params_unexplained no_return_description |
Create a QR code that encodes geographic coordinates; scanning it opens the location in a map app. Provide latitude and longitude, plus an optional place name shown on the map and an optional internal label, along with custom colors, dot/corner styles, logo embedding, and decorative frames with optional CTA text (text color defaults to #ffffff on a #000000 frame). Returns the created QR code record with its short ID and the short redirect URL. |
create_social_qr |
params_unexplained |
Create a QR code that links to social media profiles; scanning its short URL returns a JSON object with all provided platform links. Provide at least one platform link (Facebook, Instagram, Twitter/X, LinkedIn, YouTube, TikTok, GitHub, or website), plus optional styling: custom colors, dot/corner styles, logo embedding, and decorative frames with optional CTA text (text color defaults to #ffffff on a #000000 frame). Returns the created QR code record with its short ID. |
create_app_store_qr |
params_unexplained |
Create a QR code that routes users to the correct app store based on their 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, plus optional styling: custom colors, dot/corner styles, logo embedding, and decorative frames with optional CTA text (text color defaults to #ffffff on a #000000 frame). Returns the created QR code record with its short ID. |
update_social_qr |
name_restates_behavior no_return_description |
Update the social media profile links of a Social QR code (created with create_social_qr). Partial updates merge with existing data: omitted platforms keep their current URLs while provided ones are replaced, and you can also update the label. Returns the updated QR code record with its short ID and timestamps. |
update_app_store_qr |
name_restates_behavior params_unexplained no_return_description |
Update the store links of an App Store QR code (created with create_app_store_qr). You can change the iOS App Store URL, the Android Google Play URL, and the fallback URL used for non-mobile devices (e.g., desktop browsers that match neither platform). Partial updates merge with existing data, and you can also update the label. Returns the updated QR code record with its short ID and timestamps. |
list_webhooks |
no_return_description |
List all registered webhook endpoints for your API key. Returns each endpoint's URL, subscribed events, and creation timestamps; HMAC-SHA256 secrets are not included for security. |
delete_webhook |
name_restates_behavior no_return_description |
Delete a webhook endpoint by ID along with all of its stored delivery logs. The endpoint stops receiving events immediately and its historical deliveries are removed. Returns a confirmation, including the deleted webhook's ID, so the caller can verify which endpoint was removed. Use list_webhooks to find IDs. |
get_usage |
name_restates_behavior no_return_description |
Retrieve usage and quota totals for your calling API key. Returns your current usage figures and the remaining quota on your plan, so you can tell how close you are to your limits. |
set_utm_params |
no_return_description |
Set or update UTM tracking parameters on a URL QR code; they are appended to the target URL on every scan redirect. Use clear=true to remove all UTM parameters. Returns a confirmation that the QR code's UTM parameters were updated or removed. |
set_redirect_rules |
no_return_description |
Set conditional redirect rules on a URL QR code, replacing any existing rules. Rules are evaluated top-to-bottom: each rule's conditions are ANDed, the first matching rule's target_url wins, and the default target_url applies if nothing matches. Pass an empty rules array to clear all rules. Returns a confirmation that the redirect rules were updated for the QR code. |
set_custom_domain |
no_return_description |
Set a custom domain (Pro plan required) so new QR code short URLs use https://your-domain.com/r/... instead of the default. Point your DNS CNAME at the QR Agent server; pass domain=null to remove the custom domain. Returns a confirmation of the domain change and the DNS verification status when applicable. |
record_conversion |
no_return_description |
Record a post-scan conversion (e.g., purchase, signup) for a QR code you own, tracking ROI with an optional monetary value and metadata. Returns a confirmation that the conversion event was recorded for the given QR code. |
Selection evidence
10 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 my 30 products' is ambiguous about count: the agent could call the single create tool repeatedly or the bulk tool once; scope (one vs many) must be inferred from natural language. |
delete_qr_code |
bulk_delete_qr_codes |
medium | Task 'delete these QR codes' (plural) is ambiguous between repeated single deletes and the batch delete tool; both take short IDs and neither name nor default phrasing forces the bulk choice. |
create_email_qr |
create_sms_qr |
medium | Both create QRs opening a pre-filled message when scanned; a vague task like 'make a QR that sends a message to 555-1234' or 'pre-fill a message QR' could be read as either email or SMS since the user may not say the channel. |
create_event_qr |
create_location_qr |
medium | create_event_qr itself has a 'location' parameter, so a task like 'make a QR for the event at this venue/address' could wrongly select the map-location tool instead of the calendar-event tool, or vice versa. |
create_qr_code |
create_text_qr |
medium | A task like 'put this content/text in a QR code' is ambiguous between the URL-redirect QR tool and the plain-text-encoding tool; whether the content is a link or raw text isn't always explicit. |
get_qr_code |
list_qr_codes |
medium | Tasks like 'show me my QR codes' or 'find the QR for my campaign' are ambiguous between fetching one code's details and listing to search; the agent may pick get before knowing a short_id, or list when a specific code was meant. |
get_qr_code |
get_qr_analytics |
medium | 'Get information/report/data on QR abc123' is ambiguous between returning the code's metadata (get_qr_code) and its scan analytics metrics (get_qr_analytics); both take a short_id and both sound like retrieval. |
get_qr_analytics |
get_conversions |
medium | Both are stats endpoints for a QR code taking short_id and period, so a vague task like 'how is my QR performing, give me the numbers' could select scan analytics instead of conversion ROI stats. |
update_qr_destination |
update_social_qr |
medium | Social QRs resolve via a short URL, so 'change where my social QR points to the new page' is ambiguous between the generic redirect-update tool and the social-link update tool; the QR type must be known to disambiguate. |
bulk_create_qr_codes |
bulk_create_from_csv |
medium | Both bulk-create QR codes; a task like 'generate QR codes in bulk from this list/spreadsheet' is ambiguous between the JSON items-array tool and the CSV-content tool, which differ in input format and limits. |
Compare the field