flyweel.co WebMCP audit

audited Aug 28, 2026in 8s
54/ 100

2 tools registered. Strongest in WebMCP use, weakest in human experience.

WebMCP use79
Usefulness50
Human experience0
about:blank

No agent run recorded yet.

No steps recorded

Tools

/
calculate_ad_reconciliation_cost: fail

calculate_ad_reconciliation_cost

Calculate the hidden cost of manually reconciling ad platform invoices. Returns monthly/annual cost, hours spent, invoices generated, and industry benchmark comparison. Use this to show businesses how much time and money they waste on manual invoice reconciliation.Takes an action on the site.
pagehttps://www.flyweel.co/
implementation
viaimperative
entry pointnavigator
registered after812ms
executepresent
api surface
reconciler_rolerequired
hourly_rateoptional
platformsrequired
monthly_spendrequired
annotations
read onlynot declared
destructivenot declared
idempotentnot declared
open worldnot declared
untrusted contentnot declared
titlenot declared
4 findings
failCanonical entry point
0 / 4
Every tool registers through the deprecated navigator.modelContext alias; move them to document.modelContext before the alias is removed.
fix
// Use the canonical entry point - navigator.modelContext is deprecated.
document.modelContext.provideContext({ tools: [/* ... */] });
warningNaming quality
1 / 2
Tool naming makes selection harder than it needs to be: 2 names are over Chrome's 30-character guidance; 1 name does not start with a verb (join_performance_capital_waitlist).
fix
{ name: "calculate_ad_reconciliation_cost" /* short, unique, verb-based */ }
failAnnotations present
0 / 4
2 of 2 tools declare no readOnlyHint, so an agent cannot tell a read from a write without guessing from the name.
calculate_ad_reconciliation_cost, join_performance_capital_waitlist
fix
{
  name: "calculate_ad_reconciliation_cost",
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true }
}
warningHuman parity
0 / 8
2 of 2 tools run through the JavaScript API with no visible counterpart, so the person co-browsing cannot see what the agent is offered. Declarative forms (or at least a title annotation) close the gap.
calculate_ad_reconciliation_cost, join_performance_capital_waitlist
fix
<!-- Give the tool a visible counterpart: a declarative form is one the person can see and use too. -->
<form toolname="calculate_ad_reconciliation_cost" tooldescription="...">
  <!-- the same action, as UI -->
</form>
tool json
{
  "name": "calculate_ad_reconciliation_cost",
  "description": "Calculate the hidden cost of manually reconciling ad platform invoices. Returns monthly/annual cost, hours spent, invoices generated, and industry benchmark comparison. Use this to show businesses how much time and money they waste on manual invoice reconciliation.",
  "inputSchema": {
    "type": "object",
    "properties": {
      "reconciler_role": {
        "type": "string",
        "enum": [
          "founder",
          "bookkeeper",
          "accountant",
          "finance"
        ],
        "description": "Who handles invoice reconciliation"
      },
      "hourly_rate": {
        "type": "number",
        "description": "Hourly rate in USD (optional — defaults based on role: founder $120, accountant $100, bookkeeper $80, finance $60)"
      },
      "platforms": {
        "type": "array",
        "items": {
          "type": "string",
          "enum": [
            "Google Ads",
            "Meta",
            "LinkedIn",
            "TikTok",
            "Bing",
            "X",
            "Pinterest"
          ]
        },
        "description": "Ad platforms used (e.g. [\"Google Ads\", \"Meta\"])"
      },
      "monthly_spend": {
        "type": "number",
        "description": "Total monthly ad spend in USD across all platforms"
      }
    },
    "required": [
      "reconciler_role",
      "platforms",
      "monthly_spend"
    ]
  },
  "annotations": {}
}
Showing calculate_ad_reconciliation_cost

Findings

WebMCP use

79 / 100 · weight 50
passTools registered
4 / 4
2 tools registered across 1 page. Capture caveat (not scored against the site): the page replaced modelContext on navigator, so imperative tools may be under-reported
passReal-browser eligible
8 / 8
A real browser exposes modelContext natively on this page, so the tools registered here are visible to an agent today.
passRegistration timing
4 / 4
Every measured tool registered within 813ms of navigation.
tooljoin_performance_capital_waitlist
failCanonical entry point
0 / 4
Every tool registers through the deprecated navigator.modelContext alias; move them to document.modelContext before the alias is removed.
toolcalculate_ad_reconciliation_cost
fix
// Use the canonical entry point - navigator.modelContext is deprecated.
document.modelContext.provideContext({ tools: [/* ... */] });
passSchema validity
5 / 5
All 2 tools declare a structurally valid object input schema.
passSchema quality
4 / 4
All 2 tool schemas describe their parameters and stay within Chrome's size guidance.
passStub detection
5 / 5
All 2 tools declare an execute handler.
failAnnotations present
0 / 4
2 of 2 tools declare no readOnlyHint, so an agent cannot tell a read from a write without guessing from the name.
toolcalculate_ad_reconciliation_cost
calculate_ad_reconciliation_cost, join_performance_capital_waitlist
fix
{
  name: "calculate_ad_reconciliation_cost",
  annotations: { readOnlyHint: true, destructiveHint: false, idempotentHint: true }
}
not applicableAnnotation mismatch
0 / 3
No tool declares a readOnlyHint, so there is no safety claim to contradict.
not applicableUntrusted content hint
0 / 2
No tool's contract suggests it returns text written by somebody other than the site, so there is nothing to flag as untrusted.
passRegistration errors
2 / 2
No tool registration threw during the capture. Capture caveat (not scored against the site): the page replaced modelContext on navigator, so imperative tools may be under-reported
warningToolchange coherence
1 / 2
2 tools were registered but the page never dispatched a toolchange event, so an agent subscribed to registry updates never learns they exist.
fix
document.modelContext.dispatchEvent(new Event("toolchange"));
not applicableInjection surface
0 / 3
The injection-surface model hop returned no usable result, so tool contracts were not reviewed for injection surface.

Usefulness

50 / 100 · weight 30
warningNaming quality
1 / 2
Tool naming makes selection harder than it needs to be: 2 names are over Chrome's 30-character guidance; 1 name does not start with a verb (join_performance_capital_waitlist).
toolcalculate_ad_reconciliation_cost
fix
{ name: "calculate_ad_reconciliation_cost" /* short, unique, verb-based */ }
not applicableDescription quality
0 / 6
The description-quality model hop returned no usable result, so descriptions were not rated.
not applicableTool selection
0 / 14
The tool-selection model hop returned no usable result.
not applicableCoverage vs. site type
0 / 8
This tool set does not place the site in a category with a known expected tool shape, so there is no coverage baseline to score it against.

Human experience

0 / 100 · weight 20
warningHuman parity
0 / 8
2 of 2 tools run through the JavaScript API with no visible counterpart, so the person co-browsing cannot see what the agent is offered. Declarative forms (or at least a title annotation) close the gap.
toolcalculate_ad_reconciliation_cost
calculate_ad_reconciliation_cost, join_performance_capital_waitlist
fix
<!-- Give the tool a visible counterpart: a declarative form is one the person can see and use too. -->
<form toolname="calculate_ad_reconciliation_cost" tooldescription="...">
  <!-- the same action, as UI -->
</form>
not applicablePage experience
0 / 12
The page-experience model hop returned no usable result, so the page was not graded.

Tool selection

The tool-selection model hop returned no usable result.
how this was captured
chrome
148.0.7778.96
capture shim
v1
spec snapshot
2026-08
mode
fast
pages
1
tools
2
run time
8s
finished
Aug 28, 2026