addrbookFor publishers
← The evidence ledger

Evidence row 309181

Observed , by probe.mcp/1.

Kind
mcp.tools
About
endpoint f3d4f0c4-eec4-461e-9425-3c854fc97884
Recorded
Previous row
None: the first of its kind about this subject
Body SHA-256
d8a240d840f312fef9d1d0e73d17d5460fb92fb2f61c186185cb40baa0e133fb
Leaf
0x5d9b0afba9d29577e2c760c9400d85c8e408871531f11315202beff064ab3c1b

What was observed

{
  "count": 8,
  "tools": [
    {
      "description": "Render a QR code for any of six content types: a link, plain text, a v-card contact, a pre-filled email, a phone number, or a pre-filled SMS. The image is returned as a PNG you can look at. Nothing is stored, so this code is STATIC: it encodes the content directly and cannot be changed after it is printed. If the user wants a code they can repoint later, or wants to count scans, create a short link with create_short_link first and then call get_link_qr_code instead. Link and Text work on every plan; V-card, E-mail, Call and SMS require Flyn Pro, as do custom colours and SVG output. WiFi codes contain the network password, so they are made in the Flyn dashboard's QR builder, not through this tool: never ask the user for a WiFi password.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "bg": {
            "description": "Background colour as 6-digit hex, default #FFFFFF. Requires Flyn Pro.",
            "type": "string"
          },
          "email": {
            "description": "For type 'email': the recipient address.",
            "type": "string"
          },
          "emailBody": {
            "description": "For type 'email': pre-filled message body.",
            "type": "string"
          },
          "emailSubject": {
            "description": "For type 'email': pre-filled subject line.",
            "type": "string"
          },
          "fg": {
            "description": "Foreground colour as 6-digit hex, default Flyn green #14532D. Requires Flyn Pro.",
            "type": "string"
          },
          "format": {
            "description": "Output format: 'png' (default) or 'svg'. SVG requires Flyn Pro.",
            "enum": [
              "png",
              "svg"
            ],
            "type": "string"
          },
          "level": {
            "description": "Error correction level: 'L', 'M' (default), 'Q' or 'H'. Higher levels survive more damage but make the symbol denser.",
            "enum": [
              "L",
              "M",
              "Q",
              "H"
            ],
            "type": "string"
          },
          "margin": {
            "description": "Quiet zone in modules. Minimum and default is 4, as required by ISO/IEC 18004; smaller values are raised to 4 because a short quiet zone is the most common cause of a printed code failing to scan.",
            "maximum": 32,
            "minimum": 4,
            "type": "integer"
          },
          "phone": {
            "description": "For type 'phone': the number to dial. Include the country code, for example +15551234567, or the code only works for people dialling from the same country.",
            "type": "string"
          },
          "size": {
            "description": "Maximum width in pixels, 64 to 2048, default 512. The image is the largest whole-module square that fits, so the real width is usually slightly smaller and is reported back.",
            "maximum": 2048,
            "minimum": 64,
            "type": "integer"
          },
          "smsBody": {
            "description": "For type 'sms': the pre-filled message. The sender still has to press send.",
            "type": "string"
          },
          "smsPhone": {
            "description": "For type 'sms': the number to text. Include the country code.",
            "type": "string"
          },
          "text": {
            "description": "For type 'text': the plain text to show when scanned.",
            "type": "string"
          },
          "type": {
            "description": "What to encode. 'url' and 'text' work on any plan. 'vcard', 'email', 'phone' and 'sms' require Flyn Pro.",
            "enum": [
              "url",
              "text",
              "vcard",
              "email",
              "phone",
              "sms"
            ],
            "type": "string"
          },
          "url": {
            "description": "For type 'url': the URL to encode.",
            "type": "string"
          },
          "vcEmail": {
            "description": "For type 'vcard': email address.",
            "type": "string"
          },
          "vcName": {
            "description": "For type 'vcard': the person's full name. Required for a v-card.",
            "type": "string"
          },
          "vcOrg": {
            "description": "For type 'vcard': organisation or company.",
            "type": "string"
          },
          "vcPhone": {
            "description": "For type 'vcard': phone number. Include the country code, for example +15551234567.",
            "type": "string"
          },
          "vcUrl": {
            "description": "For type 'vcard': website URL.",
            "type": "string"
          }
        },
        "required": [
          "type"
        ],
        "type": "object"
      },
      "name": "create_qr_code"
    },
    {
      "description": "Create a new Flyn short link that redirects to a destination URL. Returns the link id, slug, and full short URL. The destination is scanned with Google Safe Browsing before creation. Free accounts can create 25 links per calendar month; click limits, fallback URLs, weighted rotation, and conversion tracking require Flyn Pro. Password protection is set in the Flyn dashboard, not through this tool, so never ask the user for a link password.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "clickLimit": {
            "description": "Optional maximum number of human clicks before the link stops redirecting (Pro plan only).",
            "minimum": 1,
            "type": "integer"
          },
          "conversionTracking": {
            "description": "Enable per-link conversion tracking (Pro plan only). The redirect then appends an unguessable click id to the destination URL, and the link reports conversions and total conversion value next to its clicks. Nothing is reported until the Flyn tag (or a server-to-server postback) is installed on the destination site, so tell the user that setup step is still theirs.",
            "type": "boolean"
          },
          "domain": {
            "description": "Optional custom domain to mint the link on (must be a verified domain you own; Pro plan only). Omit to use your account default domain.",
            "type": "string"
          },
          "expiresAt": {
            "description": "Optional ISO 8601 datetime after which the link stops redirecting.",
            "type": "string"
          },
          "fallbackUrl": {
            "description": "Optional URL visitors are sent to after the click limit is reached (Pro plan only).",
            "type": "string"
          },
          "forwardParams": {
            "description": "Whether query parameters appended to the short link are forwarded to the destination. Defaults to true.",
            "type": "boolean"
          },
          "rotation": {
            "description": "Optional weighted rotation of destinations, one short link splitting traffic between several URLs (Pro plan only). Up to 12 destinations; sending more is rejected rather than truncated, so nothing is dropped without telling you. Each human visitor is sent to one destination drawn at random in proportion to its weight, so the split settles over many clicks rather than following a strict order. Bots and crawlers always get the primary url, which stays required. Each click records the id of the destination that served it, and that id, not the url and not the list position, is what per-destination stats are keyed on. The Flyn dashboard does report them: the link's own analytics page has a \"Destination Performance\" panel listing every destination with its click count, its actual share of clicks, and the share its weight intended, and it keeps showing a destination you later remove from the rotation. No API or MCP call returns that breakdown, or the per-click destination id, so send the user to that page rather than inventing a tool call for it. The panel counts clicks only, across the clicks that carry a destination id: no conversion or revenue split, and no winner declared. Every destination is Safe Browsing scanned before the link is created.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "id": {
                  "description": "Stable identifier for this destination, recorded as the click variant on each click. Omit it on a brand new destination and Flyn mints one. When editing, send every existing destination back with the id it already has: click history is attributed by id, so a changed id detaches that destination's past clicks and a reused id merges two destinations' stats. Never derive ids from list position.",
                  "type": "string"
                },
                "label": {
                  "description": "Optional human-readable name for this destination. Cosmetic, it does not affect routing.",
                  "type": "string"
                },
                "url": {
                  "description": "Destination URL for this entry. Scanned with Google Safe Browsing like the primary destination.",
                  "type": "string"
                },
                "weight": {
                  "description": "Relative share of traffic, NOT a percentage. Weights are normalised across the list, so [3, 1] sends roughly three quarters of clicks to the first entry and equal weights give an even split. A weight of 0 keeps the destination in the list without ever serving it.",
                  "minimum": 0,
                  "type": "number"
                }
              },
              "required": [
                "url",
                "weight"
              ],
              "type": "object"
            },
            "maxItems": 12,
            "type": "array"
          },
          "slug": {
            "description": "Optional custom slug (letters, numbers, hyphens, underscores; max 100 chars). A random slug is generated when omitted.",
            "type": "string"
          },
          "tags": {
            "description": "Optional tags for organizing links (Pro plan only).",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "description": "Optional human-readable title for the link.",
            "type": "string"
          },
          "url": {
            "description": "The destination URL to shorten (https:// is assumed if no protocol is given).",
            "type": "string"
          }
        },
        "required": [
          "url"
        ],
        "type": "object"
      },
      "name": "create_short_link"
    },
    {
      "description": "Permanently delete a short link. The short URL immediately stops redirecting and this cannot be undone.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "The link id to delete.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "delete_link"
    },
    {
      "description": "Fetch one short link by its id, including destination, settings, total click count, and its conversion counters (conversionTracking, conversions, conversionValueCents).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "The link id (from create_short_link or list_links).",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_link"
    },
    {
      "description": "Fetch click events for a short link, newest first. Every plan sees timestamps and total counts; country, city, device, OS, browser, and referrer detail requires Flyn Pro (fields are null on the free plan). Free plans see the last 30 days of history. Click events carry no conversion data: for conversions and total conversion value, read the link itself with get_link or list_links.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "id": {
            "description": "The link id.",
            "type": "string"
          },
          "limit": {
            "default": 50,
            "description": "Click events per page (max 200 via MCP).",
            "maximum": 200,
            "minimum": 1,
            "type": "integer"
          },
          "page": {
            "default": 1,
            "description": "Page number, starting at 1.",
            "minimum": 1,
            "type": "integer"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_link_analytics"
    },
    {
      "description": "Render a scannable QR code for an existing Flyn short link. Because the code encodes the short link rather than the destination, you can repoint the link later and every printed code follows, and each scan is counted as a click. The image is returned as a PNG you can look at. Custom colours and SVG output require Flyn Pro.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "bg": {
            "description": "Background colour as 6-digit hex, default #FFFFFF. Requires Flyn Pro.",
            "type": "string"
          },
          "fg": {
            "description": "Foreground colour as 6-digit hex, default Flyn green #14532D. Requires Flyn Pro.",
            "type": "string"
          },
          "format": {
            "description": "Output format: 'png' (default) or 'svg'. SVG requires Flyn Pro.",
            "enum": [
              "png",
              "svg"
            ],
            "type": "string"
          },
          "id": {
            "description": "The id of the link to render a QR code for.",
            "type": "string"
          },
          "level": {
            "description": "Error correction level: 'L', 'M' (default), 'Q' or 'H'. Higher levels survive more damage but make the symbol denser.",
            "enum": [
              "L",
              "M",
              "Q",
              "H"
            ],
            "type": "string"
          },
          "margin": {
            "description": "Quiet zone in modules. Minimum and default is 4, as required by ISO/IEC 18004; smaller values are raised to 4 because a short quiet zone is the most common cause of a printed code failing to scan.",
            "maximum": 32,
            "minimum": 4,
            "type": "integer"
          },
          "size": {
            "description": "Maximum width in pixels, 64 to 2048, default 512. The image is the largest whole-module square that fits, so the real width is usually slightly smaller and is reported back.",
            "maximum": 2048,
            "minimum": 64,
            "type": "integer"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "get_link_qr_code"
    },
    {
      "description": "List the account's short links with pagination, search, and filtering. Returns each link's id, slug, short URL, destination, click count, and settings, plus its conversion counters: conversionTracking (whether the link carries a click id), conversions, and conversionValueCents (total value reported for those conversions, in cents, not currency converted).",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "limit": {
            "default": 20,
            "description": "Results per page (max 100).",
            "maximum": 100,
            "minimum": 1,
            "type": "integer"
          },
          "order": {
            "default": "desc",
            "description": "Sort direction.",
            "enum": [
              "asc",
              "desc"
            ],
            "type": "string"
          },
          "page": {
            "default": 1,
            "description": "Page number, starting at 1.",
            "minimum": 1,
            "type": "integer"
          },
          "search": {
            "description": "Optional text search across slug, destination URL, and title.",
            "type": "string"
          },
          "sort": {
            "default": "created_at",
            "description": "Sort column.",
            "enum": [
              "created_at",
              "clicks",
              "slug",
              "title"
            ],
            "type": "string"
          },
          "status": {
            "description": "Optional filter: 'active' (not expired, archived or disabled by Flyn), 'expired' (past its expiry date or set to expired, and not archived), or 'archived'.",
            "enum": [
              "active",
              "expired",
              "archived"
            ],
            "type": "string"
          },
          "tag": {
            "description": "Optional: only return links carrying this tag.",
            "type": "string"
          }
        },
        "type": "object"
      },
      "name": "list_links"
    },
    {
      "description": "Update an existing short link. Can re-point the destination URL without changing the printed/shared short link, plus edit title, slug, tags, expiration, rotation destinations, and Pro settings. Only the provided fields are changed. Link passwords are managed in the Flyn dashboard, not through this tool.",
      "inputSchema": {
        "additionalProperties": false,
        "properties": {
          "clickLimit": {
            "description": "Maximum human clicks before the link stops (Pro plan only).",
            "minimum": 1,
            "type": "integer"
          },
          "conversionTracking": {
            "description": "Enable or disable per-link conversion tracking (Pro plan only). Enabling only makes the redirect append a click id; conversions arrive from the Flyn tag or the server postback on the destination site.",
            "type": "boolean"
          },
          "expiresAt": {
            "description": "New ISO 8601 expiration, or null to remove.",
            "type": [
              "string",
              "null"
            ]
          },
          "fallbackUrl": {
            "description": "URL served after the click limit is reached (Pro plan only).",
            "type": "string"
          },
          "forwardParams": {
            "description": "Forward appended query params to the destination.",
            "type": "boolean"
          },
          "id": {
            "description": "The link id to update.",
            "type": "string"
          },
          "rotation": {
            "description": "Replacement list of weighted rotation destinations (Pro plan only). This REPLACES the whole list, so read the link first and send back every destination you are keeping, each with the id it already has. Pass an empty array to stop rotating and serve the single url again. Up to 12 destinations; sending more is rejected rather than truncated, so nothing is dropped without telling you. Each human visitor is sent to one destination drawn at random in proportion to its weight, so the split settles over many clicks rather than following a strict order. Bots and crawlers always get the primary url, which stays required. Each click records the id of the destination that served it, and that id, not the url and not the list position, is what per-destination stats are keyed on. The Flyn dashboard does report them: the link's own analytics page has a \"Destination Performance\" panel listing every destination with its click count, its actual share of clicks, and the share its weight intended, and it keeps showing a destination you later remove from the rotation. No API or MCP call returns that breakdown, or the per-click destination id, so send the user to that page rather than inventing a tool call for it. The panel counts clicks only, across the clicks that carry a destination id: no conversion or revenue split, and no winner declared.",
            "items": {
              "additionalProperties": false,
              "properties": {
                "id": {
                  "description": "Stable identifier for this destination, recorded as the click variant on each click. Omit it on a brand new destination and Flyn mints one. When editing, send every existing destination back with the id it already has: click history is attributed by id, so a changed id detaches that destination's past clicks and a reused id merges two destinations' stats. Never derive ids from list position.",
                  "type": "string"
                },
                "label": {
                  "description": "Optional human-readable name for this destination. Cosmetic, it does not affect routing.",
                  "type": "string"
                },
                "url": {
                  "description": "Destination URL for this entry. Scanned with Google Safe Browsing like the primary destination.",
                  "type": "string"
                },
                "weight": {
                  "description": "Relative share of traffic, NOT a percentage. Weights are normalised across the list, so [3, 1] sends roughly three quarters of clicks to the first entry and equal weights give an even split. A weight of 0 keeps the destination in the list without ever serving it.",
                  "minimum": 0,
                  "type": "number"
                }
              },
              "required": [
                "url",
                "weight"
              ],
              "type": "object"
            },
            "maxItems": 12,
            "type": "array"
          },
          "slug": {
            "description": "New slug (changes the short URL; the old slug stops working).",
            "type": "string"
          },
          "status": {
            "description": "Link status.",
            "enum": [
              "active",
              "archived"
            ],
            "type": "string"
          },
          "tags": {
            "description": "Replacement tag list.",
            "items": {
              "type": "string"
            },
            "type": "array"
          },
          "title": {
            "description": "New title.",
            "type": "string"
          },
          "url": {
            "description": "New destination URL.",
            "type": "string"
          }
        },
        "required": [
          "id"
        ],
        "type": "object"
      },
      "name": "update_link"
    }
  ]
}

What the leaf hashes

{"body":"d8a240d840f312fef9d1d0e73d17d5460fb92fb2f61c186185cb40baa0e133fb","id":309181,"kind":"mcp.tools","method":"probe.mcp/1","observed_us":1793058728857020,"prev":null,"subject":"f3d4f0c4-eec4-461e-9425-3c854fc97884","subject_kind":"endpoint"}

Proof

Fold these into the leaf in order, hashing each sorted pair with keccak256, to reach the root of (296695 rows).

  1. 0x5d9b0524b52981ec487b7d5e2ce512699bb17be0b16591704170464ba96a8fe7
  2. 0x86f2dd585a1f9a10ffccddc82d6e3e930fe3281f75c4d98d05d820dd50e57305
  3. 0xf5d47a302fdadfee17253cb079660c61bb0154308e873fb28b623350dff13884
  4. 0x7570d739f9fb495c961f849a3fbebbb24d5aa662f27c895810bb41e40bd3fdd1
  5. 0x546f5d45a8e400867185ca7e5803c93826a274001c8dd6a0321357abc74e37e5
  6. 0x9f91f010bce04568f2d92e27c0d46edb266680342c312c1073423a43f315f26f
  7. 0x571b56dec722079a7372d0328dce1ac6bbae7792538bb9fc3fb8f76e28a0bd2e
  8. 0x0cb9f98c1b9a48c215a3c96ff80a7f44ece290abdb371b57d6b8fff220d1dcec
  9. 0x61b8914b5f3683b2252f7f6604f26cad2c43f3ce902bf742c07916c03fa1a231
  10. 0x116728891cb4c83d2e8172d6192a92a31125d01dcb46174186e930ee9a03ea1a
  11. 0xb91bf0ba3ebff769d1b88f93fcb076477149787a7e31c3c28ce4fe8823b7c144
  12. 0x2121cc2dbcb8663af57743dc445c8a59e5bbfffe89703f0606c9843f0d35aff8
  13. 0x66883b42f4167ade51c4909f050c5478524e23786fb0b5c48bd1a53580960a68
  14. 0x216cebb9ae5414599109a02297c4817d7d1c6b1394afeb97efe38e32f0053974
  15. 0x7726154b91b2ad65b13849ef6cb6443b1f0ff113a3089c9bd5f2bcfc16be099d
  16. 0x47b89901b0f07938a6b9a66ddf35683903f79d756a7c7763665fd632758b08d0
  17. 0x9a83be955a206deb65b995adfd92c58fa31c95fbbf926bd199d300e70b08b26d
  18. 0x20704208aa6923d6b2450ef74ede87a6e0265d46447926038fe9506e9e154b2d
  19. 0x9b9ce5b74b9bab5121612ef6b64920a8d453cbf311096a423eef9702747e868a
Day root
0xf43e8dcc3d451a4788b26be904c55e8c4c0fa75c9666796c51db38d37e2c0df8
Chained
0x702d5ac508f08b0d1accf36af25822d8e5660367494edd17a642fb61e158a57a
Published
On Arc Testnet, block 69251483: 0x495162f8936e19f0039918feebe6c307f327cd6bf8c37219620b1970041fa9ae

How to check it · This row as JSON