{"$schema":"https://verifymcp.io/schemas/trust-report.json","schemaVersion":1,"license":{"name":"CC BY-NC 4.0","url":"https://creativecommons.org/licenses/by-nc/4.0/"},"generatedAt":"2026-11-06T11:37:10.567Z","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp","markdownUrl":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp.md","server":{"slug":"propertyscout001-puntersedge","name":"io.github.Propertyscout001/puntersedge","registryName":"io.github.Propertyscout001/puntersedge","description":"AU/NZ racing and Australian sports odds for AI agents: 36 read-only tools, each stating its cost.","registryStatus":"active","deletedAt":null,"statusMessage":null,"liveness":"live","publisher":{"class":"unknown","claimed":false}},"component":{"slug":"puntersedge-mcp","type":"pypi","identifier":"puntersedge-mcp","withdrawn":false,"url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp","version":"0.5.0","transport":"stdio","scoredAt":"2026-11-06T03:34:44.812Z"},"score":{"total":56,"tier":"low","status":"scored","weekDelta":-12,"history":[{"date":"2026-11-06","total":56},{"date":"2026-11-05","total":56},{"date":"2026-11-04","total":55},{"date":"2026-11-03","total":70},{"date":"2026-11-02","total":69},{"date":"2026-11-01","total":69},{"date":"2026-10-31","total":54},{"date":"2026-10-30","total":68},{"date":"2026-10-29","total":68},{"date":"2026-10-28","total":67},{"date":"2026-10-27","total":52},{"date":"2026-10-26","total":66},{"date":"2026-10-25","total":66},{"date":"2026-10-24","total":65},{"date":"2026-10-23","total":65},{"date":"2026-10-22","total":70},{"date":"2026-10-21","total":51},{"date":"2026-10-20","total":51},{"date":"2026-10-19","total":66},{"date":"2026-10-18","total":51},{"date":"2026-10-17","total":66},{"date":"2026-10-16","total":66},{"date":"2026-10-15","total":51},{"date":"2026-10-14","total":66},{"date":"2026-10-13","total":39},{"date":"2026-10-12","total":39},{"date":"2026-10-08","total":24}]},"categories":[{"name":"Supply Chain Security","score":50,"verdict":"partial","reasons":["Malware scan not yet available for this package.","No known CVEs affecting this package version or its production dependencies.","Runs hatchling.build at install time, a recognised build step with no custom scripting around it.","1 of 28 dependencies flagged as unhealthy."],"codes":[{"code":"supplychain.malware_inconclusive","args":{"reason":"vendor_no_verdict"}},{"code":"cve.none","args":{}},{"code":"installscript.allowlisted","args":{"tool":"hatchling.build","hooks":"build_backend"}},{"code":"dephealth.assessed","args":{"deps":"28","unhealthy":"1"}}]},{"name":"Provenance & Transparency","score":19,"verdict":"fail","reasons":["Repository check failed: the declared repository URL redirects; it must resolve directly.","Provenance check failed: no build-provenance attestation is published.","Clear OSI-approved license (MIT).","Actively maintained (last published 9 days ago).","Disclosure check failed: no security disclosure policy was found in the source repository."],"codes":[{"code":"provenance.repo_redirected","args":{}},{"code":"provenance.none","args":{}},{"code":"license.osi","args":{"spdx":"MIT"}},{"code":"maintenance.recent","args":{"age_days":"9"}},{"code":"disclosure.absent","args":{}}]},{"name":"Schema Quality & AI Usability","score":62,"verdict":"fail","reasons":["AI-judged instruction clarity (good).","Context-footprint check failed: tool/resource definitions use about 4899 tokens (~136/item across 36 items; 36 tools + 0 resources), over budget; trim descriptions and params.","Usage-examples check failed: none of the tools include examples."],"codes":[{"code":"schema.ai_quality","args":{"band":"good"}},{"code":"schema.footprint_heavy","args":{"avg":"136","items":"36","tools":"36","tokens":"4899","resources":"0"}},{"code":"schema.examples_absent","args":{}}]},{"name":"Stability & Change Management","score":77,"verdict":"partial","reasons":["Stability observed for 23 of 30 days with no destabilising changes; credit accrues until the full window elapses."],"codes":[{"code":"stability.building_history","args":{"days":"23"}}]},{"name":"Tool Coverage","score":71,"verdict":"fail","reasons":["100% of tools have a non-trivial description (not blank, and not just the tool's name).","0% of tool parameters carry a description.","Structured output schemas are declared (100% of tools); any adoption earns full credit."],"codes":[{"code":"toolquality.descriptions","args":{"pct":"100"}},{"code":"toolquality.param_docs","args":{"pct":"0"}},{"code":"toolquality.output_present","args":{"pct":"100"}}]},{"name":"Tool Safety","score":100,"verdict":"pass","reasons":["No prompt-injection markers were found in the server instructions, tool names or descriptions we captured.","We read all 36 captured tool definition(s), and no name or description among them implies an irreversible operation.","An AI judge read all 37 captured unit(s) of tool text and found none that tries to manipulate the model reading it."],"codes":[{"code":"toolsafety.injection_clean","args":{}},{"code":"toolsafety.destructive_none","args":{"tools":"36"}},{"code":"toolsafety.manipulation_clean","args":{"units":"37","judged":"37"}}]},{"name":"Capabilities","score":100,"verdict":"pass","reasons":["Implements a current MCP spec version (2026-07-28)."],"codes":[{"code":"protocol.current","args":{"version":"2026-07-28"}}]}],"inconclusive":["Malware scan not yet available for this package."],"malware":[],"components":[{"slug":"api","type":"remote","identifier":"https://api.puntersedge.online/mcp","withdrawn":false,"score":80,"current":false,"url":"https://verifymcp.io/servers/propertyscout001-puntersedge/api","markdownUrl":"https://verifymcp.io/servers/propertyscout001-puntersedge/api.md"},{"slug":"puntersedge-mcp","type":"pypi","identifier":"puntersedge-mcp","withdrawn":false,"score":56,"current":true,"url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp","markdownUrl":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp.md"}],"facts":[{"label":"Registry","value":"pypi"},{"label":"Package","value":"puntersedge-mcp"},{"label":"Version","value":"0.5.0"},{"label":"Transport","value":"stdio"}],"install":{"available":true,"bundleSha256":null},"tools":[{"name":"racing_next_to_go","title":null,"description":"Next races to jump, with runners and live per-bookmaker prices. EVERY country\nby default, NOT only AU/NZ — much of the catalogue is foreign. Australian races carry\nthe full panel; the British and Irish card (country=GB,IE) carries the UK-licensed\nbooks ladbrokes_uk, williamhill and betway_uk plus the Australian books that quote it,\nwith place_price derived from each-way terms; every other country sits at a median of\nONE bookmaker. COST: 2 credits. categories: horse,greyhound,harness (omit for all).\ncountry: ISO codes e.g. AU, AU,NZ or GB,IE — pass country=AU for an Australian card,\nadding include_unresolved=true when late-card races are still country-unresolved.\nvenue/bookmakers: comma-separated, case-insensitive.\nEach price carries its own age_seconds and stale flag; prefer fresh quotes.","inputs":[{"name":"bookmakers","type":null,"required":false,"description":null},{"name":"categories","type":null,"required":false,"description":null},{"name":"country","type":null,"required":false,"description":null},{"name":"num_races","type":"integer","required":false,"description":null},{"name":"venue","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":227},{"name":"racing_best_odds","title":null,"description":"Best win, place and tote price per runner across every bookmaker, with the book\noffering it and the market percentage. COST: 3 credits. market_percentage under 100\nmeans the best prices across books beat the field; over 100 is the bookmakers'\nmargin, which is the normal case.","inputs":[{"name":"bookmakers","type":null,"required":false,"description":null},{"name":"categories","type":null,"required":false,"description":null},{"name":"country","type":null,"required":false,"description":null},{"name":"num_races","type":"integer","required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":96},{"name":"racing_movers","title":null,"description":"Consensus firmers and drifters in the live racing window. COST: 3 credits.\ndirection must be 'firming', 'drifting' or omitted — anything else is refused with a\n422 (free). min_books only reports a move confirmed by that many bookmakers, which is\nhow you separate a real move from one book repricing. Use `limit` to cap the page;\nthere is no num_races on this endpoint.","inputs":[{"name":"categories","type":null,"required":false,"description":null},{"name":"country","type":null,"required":false,"description":null},{"name":"direction","type":null,"required":false,"description":null},{"name":"limit","type":null,"required":false,"description":null},{"name":"max_mins_to_jump","type":null,"required":false,"description":null},{"name":"min_books","type":null,"required":false,"description":null},{"name":"min_move_pct","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":141},{"name":"racing_changes","title":null,"description":"Races and prices that changed since a timestamp. COST: 2 credits.\nTHE RIGHT WAY TO WATCH A MARKET. Calling racing_next_to_go repeatedly re-downloads\nevery race every time; this returns only what moved. `since` is an ISO 8601 UTC\ntimestamp — on the first call use a recent one, then pass back the `server_time` the\nresponse returns. That cursor is set 30s behind the server clock so no in-flight\nwrite is skipped, which means the feed is at-least-once: expect to see a race twice.\nNote the shape — `changed_runners` is FLAT, one row per runner per bookmaker with\nbookmaker_key on the row, not the nested runners[].bookmakers[] of next-to-go.","inputs":[{"name":"categories","type":null,"required":false,"description":null},{"name":"country","type":null,"required":false,"description":null},{"name":"since","type":"string","required":true,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":184},{"name":"racing_events","title":null,"description":"Scheduled races in a forward window, WITHOUT prices. COST: 1 credit.\nCheaper than next-to-go when you only need the card — what is running, where and\nwhen — rather than what it is paying.","inputs":[{"name":"categories","type":null,"required":false,"description":null},{"name":"country","type":null,"required":false,"description":null},{"name":"hours_ahead","type":"integer","required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":72},{"name":"racing_track_conditions","title":null,"description":"Track condition, weather and rail position: current state plus the day's change\nlog. COST: 1 credit. date=YYYY-MM-DD, Australia/Sydney, up to 7 days back. A going\nchange mid-meeting is one of the few things that moves a whole card at once.","inputs":[{"name":"date","type":null,"required":false,"description":null},{"name":"venue","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":80},{"name":"racing_acceptances","title":null,"description":"Full-day AU thoroughbred acceptance card: every meeting, race and runner.\nCOST: 2 credits. date=YYYY-MM-DD (Australia/Sydney), up to 3 days back or forward.\nREAD THE COUNTS CAREFULLY. Several are a FLOOR rather than an exact figure wherever a\nrace reports runner_set_status other than 'checks_passed' — the response's\n`completeness` block and each race's `runner_set_note` state the bound. Say 'at least\nN' rather than reporting a field size, unless the status says checks_passed.","inputs":[{"name":"date","type":null,"required":false,"description":null},{"name":"venue","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":138},{"name":"racing_markets","title":null,"description":"Every market on ONE race: win, place, Same Race Multi Top 2/3/4, and — once the race\nhas run — the exotic dividends it paid. COST: 2 credits. Plus plan and above.\nName the race with race_id (exact), or venue + meeting_date (AET, YYYY-MM-DD) +\nrace_number. Two races sharing those three answer 409 race_ambiguous and cost nothing\nrather than silently picking one side of a venue split. bookmakers/markets: comma\nseparated; markets is a subset of win, place, top2, top3, top4, exotics.\nEvery book prices win and all but the exchange price place; Top 2/3/4 come from fewer\nbooks, so treat a missing leg as 'not quoted', never as 'no market'.","inputs":[{"name":"bookmakers","type":null,"required":false,"description":null},{"name":"markets","type":null,"required":false,"description":null},{"name":"meeting_date","type":null,"required":false,"description":null},{"name":"race_id","type":null,"required":false,"description":null},{"name":"race_number","type":null,"required":false,"description":null},{"name":"venue","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":213},{"name":"racing_venues","title":null,"description":"Canonical venue directory: venue_id, display name, physical site, country and the\ncodes run there. COST: 1 credit. Use venue_id to join across endpoints — spelling\nvariants of one track ('Sandown Hillside', 'SANDOWN HILLSIDE') share one id, and the\nraw `venue` string does not.","inputs":[],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":80},{"name":"racing_consensus","title":null,"description":"Margin-free consensus for ONE race: each runner's fair probability and price, built by\nremoving every bookmaker's margin and combining the books, with which books were used and\nwhich were left out and why. COST: 3 credits. Name the race with race_id, or venue +\nmeeting_date (AET, YYYY-MM-DD) + race_number. A runner priced above its consensus by\nseveral books is the honest form of 'value'; one book alone above it usually is not.","inputs":[{"name":"bookmakers","type":null,"required":false,"description":null},{"name":"meeting_date","type":null,"required":false,"description":null},{"name":"min_books","type":null,"required":false,"description":null},{"name":"race_id","type":null,"required":false,"description":null},{"name":"race_number","type":null,"required":false,"description":null},{"name":"venue","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":144},{"name":"us_tote","title":null,"description":"North American tote odds from TVG: every US and Canadian race on its board with each\nrunner's morning line and current win odds (odds-to-1 and decimal) and the WIN pool.\nCOST: 2 credits. A TOTE, NOT A BOOKMAKER: the payoff is whatever the pool pays when it\ncloses, so a pre-race price is an estimate; settled payoffs are on racing_results with\ncountry=US. win_odds is null until the WIN pool holds money. date=YYYY-MM-DD (US day,\ndefault today); country US or CA; status open, off or official. history=true (how the\nodds and pool moved from an hour before post) and exotics=true (probables and will-pays)\neach need ONE race: race_id, or TVG's source_race_id tvg_<track>_<YYYY-MM-DD>_<n>.","inputs":[{"name":"country","type":null,"required":false,"description":null},{"name":"date","type":null,"required":false,"description":null},{"name":"exotics","type":"boolean","required":false,"description":null},{"name":"history","type":"boolean","required":false,"description":null},{"name":"race_id","type":null,"required":false,"description":null},{"name":"source_race_id","type":null,"required":false,"description":null},{"name":"status","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":241},{"name":"racing_results","title":null,"description":"Settled AU/NZ race results. COST: 2 credits.\nCarries `placings` (the dividend-bearing top three, with win and place prices) AND\n`runners` (the FULL finishing order with jockey, trainer, margin, starting price and,\non every thoroughbred entry, `horse_ref`). Neither alone is the whole picture — join\nthem on saddlecloth number. Settle only against status=final; interim can change on\nprotest. JOINING ACROSS MEETINGS: `horse_ref` (`pe:<name>`) is the horse and is the\nsame value on the live board, the closing-line and price-path archives, horse_form and\nhorse_runs. `runner_ref` (`ra:<code>`) is the code Racing Australia published on race\nday: it joins the rows about one race, and changes from meeting to meeting because\nRacing Australia issues a new code for the same horse each day.\nGreyhound runner_refs (`grv:`/`grsa:`) are per-dog registry ids and do persist.\ndate=YYYY-MM-DD for a single meeting day (AET). `field_status` says whether the\nfinishing order is the complete field.","inputs":[{"name":"categories","type":null,"required":false,"description":null},{"name":"country","type":null,"required":false,"description":null},{"name":"date","type":null,"required":false,"description":null},{"name":"hours_back","type":"integer","required":false,"description":null},{"name":"limit","type":null,"required":false,"description":null},{"name":"offset","type":null,"required":false,"description":null},{"name":"status","type":null,"required":false,"description":null},{"name":"venue","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":299},{"name":"racing_results_coverage","title":null,"description":"What the results field coverage actually IS, measured rather than promised.\nCOST: 1 credit. Call this before telling a user that results are missing — the answer\nis often that a race has no results source, not that we dropped it. days: 1-30 (the\nendpoint's window; a larger value is sent as 30).","inputs":[{"name":"days","type":"integer","required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":89},{"name":"racing_price_history","title":null,"description":"Recorded per-bookmaker price ticks for one race — the market movement record.\nCOST: 5 credits (this is one of the expensive ones; do not loop it).\nGive race_id, or venue + race_number + date. include_points=false returns\nopen/close/high/low only, which is usually what a summary needs.","inputs":[{"name":"bookmakers","type":null,"required":false,"description":null},{"name":"date","type":null,"required":false,"description":null},{"name":"include_points","type":null,"required":false,"description":null},{"name":"race_id","type":null,"required":false,"description":null},{"name":"race_number","type":null,"required":false,"description":null},{"name":"venue","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":110},{"name":"racing_closing_lines","title":null,"description":"The permanent closing-line and result archive — the dataset for measuring closing\nline value. COST: 5 credits. Plus and above read the whole archive; Standard reads a\nrolling window, and each response's window_days says which applies to the key (null is\nthe whole archive). Free and Hobby keys get a 403 naming the plans that work, and so\ndoes a Standard request for dates entirely outside its window. Ask\nracing_closing_lines_coverage first to learn what the archive actually holds before\nreporting that something is missing.","inputs":[{"name":"category","type":null,"required":false,"description":null},{"name":"country","type":null,"required":false,"description":null},{"name":"date","type":null,"required":false,"description":null},{"name":"limit","type":null,"required":false,"description":null},{"name":"offset","type":null,"required":false,"description":null},{"name":"race_id","type":null,"required":false,"description":null},{"name":"resulted_only","type":null,"required":false,"description":null},{"name":"venue","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":164},{"name":"racing_closing_lines_coverage","title":null,"description":"What the closing-line archive holds: floor date, row and race counts, how much is\na true closing line and how much is resulted. COST: 1 credit. Cheap, and it is the\nhonest answer to 'how far back does your history go'.","inputs":[],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":67},{"name":"racing_clv","title":null,"description":"Score bets against the closing line each race actually closed at. COST: 5 credits per\nrequest, up to 200 bets. Plus plan and above (lower tiers get a 403 and are not charged).\nEach bet is an object: name the race by `race_id` (from next-to-go, events, results or the\narchive) or by `venue` + `meeting_date` (YYYY-MM-DD, AET) + `race_number`; name the runner by\n`runner_ref` (exact), `runner_number` (saddlecloth) or `runner_name`; give `price` (decimal\nodds taken), optionally `stake` (default one flat unit), `bookmaker` (measure against THAT\nbook's close) and `ref` (your id, echoed back). `reference` is `best` (highest close across\nbooks, the strictest test) or `median`, used when a bet names no bookmaker. Returns per bet\nthe closing prices, clv_pct, beat_close, the result and flat-stake pnl, and a summary with\naverage and median CLV, beat-the-close rate, win rate and ROI. A bet the archive cannot\nresolve comes back with a `reason` and is left out of the averages, not guessed.","inputs":[{"name":"bets","type":"array","required":true,"description":null},{"name":"reference","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":286},{"name":"horse_form","title":null,"description":"Thoroughbred form, career record and profile for ONE horse, read from Racing\nAustralia's form page. COST: 3 credits.\n`horse` is a name (matched case- and punctuation-insensitively), the `pe:` horse_ref\nevery thoroughbred surface publishes (the same thing: the folded name), or an `ra:`\ncode from runner_ref (prefer the name or horse_ref: Racing Australia issues a new code\neach day). A name resolves to ONE horse. The response carries `horse_ref`, the key that\njoins this horse across meetings; its `runner_ref` is the code the page was read under.\nA 503 saying Racing Australia is refusing fresh reads means call horse_runs\ninstead: that is our own record and does not depend on the page. DO NOT LOOP THIS\nover a field or a list: the upstream rate limits hard and a burst gets the whole\nestate flagged. For many horses there is a paced bulk backfill queue, reached from\napplication code rather than from here.","inputs":[{"name":"horse","type":"string","required":true,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":225},{"name":"horse_runs","title":null,"description":"Every run we hold for ONE thoroughbred out of PuntersEdge's OWN settled results,\nnewest first: position, margin, official SP, jockey, trainer and field size per run,\nplus a starts/wins/places summary. COST: 3 credits (a name matching nothing is a free\n404). `horse` is a name or its `pe:` horse_ref; an `ra:` code is accepted but pins one\nmeeting's entry. NOT a career record: it starts at `source.coverage_from` (the first\ncomplete card, 2026-09-01) and only grows. Use it when horse_form cannot be read, or\nwhenever the question is what happened in the races we settled ourselves.","inputs":[{"name":"horse","type":"string","required":true,"description":null},{"name":"limit","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":170},{"name":"greyhound_form","title":null,"description":"Greyhound form history for one dog from PuntersEdge's OWN results (Victorian tracks via\nFastTrack, every other state via the national results pages), from the 2026-09-13 card.\nCOST: 3 credits (a name matching nothing is a free 404). `dog` is a name, or a runner_ref\nlike grv:<id> / grsa:<id> to restrict to one registry. Nothing earlier than 2026-09-13\nexists here: the record is since that date, not a career.","inputs":[{"name":"dog","type":"string","required":true,"description":null},{"name":"limit","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":136},{"name":"greyhound_field","title":null,"description":"Every dog in ONE greyhound race with its recent runs and record, from our own results:\nthe field's form in one call instead of one greyhound_form per dog. COST: 3 credits\n(a race we hold no field for is a free 404). Australian races, and British and Irish ones\nfrom 12 October 2026. Name the race with race_id (from racing_next_to_go, racing_events or\nracing_results), or venue + meeting_date (YYYY-MM-DD; AET for Australia, London for GB/IE)\n+ race_number. runs: recent runs per dog, 1-20, default 10.","inputs":[{"name":"meeting_date","type":null,"required":false,"description":null},{"name":"race_id","type":null,"required":false,"description":null},{"name":"race_number","type":null,"required":false,"description":null},{"name":"runs","type":null,"required":false,"description":null},{"name":"venue","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":170},{"name":"greyhound_stats","title":null,"description":"One greyhound's record from PuntersEdge's OWN results since 2026-09-13, split by\ntrack, distance, box or any combination (`by=track,distance`); no grade dimension.\nCOST: 3 credits; a bad `by` is a free 422, an unknown dog a free 404.","inputs":[{"name":"by","type":null,"required":false,"description":null},{"name":"dog","type":"string","required":true,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":91},{"name":"jockey_stats","title":null,"description":"Jockey premiership leaderboards, or one jockey by (partial) name. COST: 2 credits.\nstate: AUS (national) or a state. scope: all, metro, provincial, country, picnic.\nseason: current or previous RA season (1 Aug – 31 Jul).","inputs":[{"name":"name","type":null,"required":false,"description":null},{"name":"scope","type":null,"required":false,"description":null},{"name":"season","type":null,"required":false,"description":null},{"name":"state","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":87},{"name":"trainer_stats","title":null,"description":"Trainer premiership leaderboards, or one trainer by (partial) name.\nCOST: 2 credits. Same state/scope/season options as jockey_stats.","inputs":[{"name":"name","type":null,"required":false,"description":null},{"name":"scope","type":null,"required":false,"description":null},{"name":"season","type":null,"required":false,"description":null},{"name":"state","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":61},{"name":"list_sports","title":null,"description":"The sport catalogue: every queryable sport_key with its display name.\nCOST: 1 credit. Racing is NOT in here and has no sport_key — use the racing_* tools.","inputs":[],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":47},{"name":"sports_odds","title":null,"description":"Head-to-head, spread and total prices per bookmaker for one sport's upcoming\nfixtures (sport_key=afl, nrl, nba, soccer_epl …).\nCOST: 1 CREDIT PER MARKET REQUESTED — markets='h2h' is 1, 'h2h,spreads,totals' is 3.\nThere is no single figure for this tool; ask for the markets you will actually read.\nEvery market carries a `quality` object (score, status, age in seconds) — trust it\nover assumptions. Racing is not a sport key; 'horse-racing' is a 422.","inputs":[{"name":"bookmakers","type":null,"required":false,"description":null},{"name":"competition","type":null,"required":false,"description":null},{"name":"markets","type":null,"required":false,"description":null},{"name":"sport_key","type":"string","required":true,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":161},{"name":"sports_results","title":null,"description":"Final scores from the league's own record. COST: 1 credit. Covers afl, aflw, nrl and\nnrlw only; another sport_key is a free 422, never an empty list. `event_id` ties a result\nto the fixture you hold prices for, and is null when no fixture matched with certainty —\nsettle only rows that carry one (linked_only=true). Scores stay null until the league calls\nthe match final, so an abandoned game never reads as a nil-all.","inputs":[{"name":"competition","type":null,"required":false,"description":null},{"name":"final_only","type":"boolean","required":false,"description":null},{"name":"limit","type":null,"required":false,"description":null},{"name":"linked_only","type":"boolean","required":false,"description":null},{"name":"season","type":null,"required":false,"description":null},{"name":"sport_key","type":"string","required":true,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":152},{"name":"sports_closing_lines","title":null,"description":"Each bookmaker's last head-to-head price, handicap line and total before the start of\nevery match in a range, plus the consensus close. COST: 5 credits. Standard and above\n(403 on Free and Hobby). date_from/date_to: ISO dates; default the last 7 days, at most 92\ndays per call (page by month for a season). Lines exist from 2026-09-29.","inputs":[{"name":"bookmakers","type":null,"required":false,"description":null},{"name":"date_from","type":null,"required":false,"description":null},{"name":"date_to","type":null,"required":false,"description":null},{"name":"sport_key","type":"string","required":true,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":123},{"name":"best_odds","title":null,"description":"Best available price per outcome across bookmakers for one sport.\nCOST: 3 credits.","inputs":[{"name":"sport_key","type":"string","required":true,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":35},{"name":"arb_best_prices","title":null,"description":"Cross-book price comparison per selection, with every bookmaker's quote alongside\nthe best. COST: 2 credits. A word of warning worth passing on: a two-outcome market\nthat only ONE bookmaker is quoting will look like a large edge and is not one. Check\nhow many books stand behind each leg before reporting an opportunity.","inputs":[{"name":"max_age_minutes","type":null,"required":false,"description":null},{"name":"sport_key","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":90},{"name":"check_usage","title":null,"description":"Current key's plan, monthly credit allowance, credits used and reset date.\nCOST: free. You rarely need this — every priced result above already carries\ncredits_remaining, read from the response headers.","inputs":[],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":49},{"name":"check_overage","title":null,"description":"Whether this account may run past its monthly allowance (overage), the rate per 1,000\ncredits, the ceiling the API actually enforces, and what this period would be invoiced if\nit ended now. COST: free. Read this before telling a user they are about to hit a 402: when\noverage is on, calls continue up to `ceiling` and the excess is invoiced; when it is off,\n`ceiling` equals the plan's credit limit. Switching it is done by a human in the console,\nnot from here.","inputs":[],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":126},{"name":"bulk_datasets","title":null,"description":"The catalogue of pre-built dataset FILES: every dataset published as whole-day files and\nmonthly bundles, with rows, bytes per format (parquet, gzip csv), sha256 digest, when each was\ngenerated and the URL that serves it. COST: free. The files themselves are downloaded from\napplication code (20 credits a daily file, 100 a monthly bundle; Business and Platform plans\nrespectively), not from here: this tool tells you what exists and how big it is.","inputs":[{"name":"dataset","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":114},{"name":"connector_health","title":null,"description":"Per-bookmaker feed freshness: last_ok, status, records written. COST: free.\nTHIS IS HOW YOU TELL A QUIET MARKET FROM A BROKEN FEED. A stalled scraper does not\nerror — it keeps serving its last value, which looks exactly like a live price. If a\nbook's prices seem frozen, check here before telling a user the market has settled.","inputs":[],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":86},{"name":"demo_next_to_go","title":null,"description":"Free no-key sandbox sample of racing_next_to_go (3 races, 5 runners, 3 books,\ntruncated). COST: free. Use it to explore the response shape before spending\ncredits, and to demonstrate the data to someone who has not signed up.","inputs":[],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":64},{"name":"demo_best_odds","title":null,"description":"Free no-key sandbox sample of sports best-odds with arb detection. COST: free.\n`sport` is optional; a live sport is picked if omitted.","inputs":[{"name":"sport","type":null,"required":false,"description":null}],"outputs":[{"name":"result","type":"string","required":true,"description":null}],"hasOutputSchema":true,"hasExamples":false,"tokenEstimate":48}],"toolsTruncatedAtCapture":false,"diagnostics":{"capturedAt":"2026-11-06T03:34:44.000Z","track":"package","endpoint":null,"declaredUrl":null,"truncated":false,"tls":null,"dnssec":null,"auth":null,"httpsRedirect":null,"transports":[],"provenance":{"outcome":"none","label":"No attestation","reason":"no_attestation","reasonLabel":"No attestation published","discovery":null,"discoveryLabel":null,"sourceRepo":null,"attestationSkipped":null,"attestationSkippedLabel":null},"installScripts":[{"hook":"build_backend","tier":"allowlisted"}],"installScriptsTotal":null,"vulnerabilities":[],"vulnerabilitiesTotal":null,"dependencies":{"nodes":28,"partial":false,"deprecated":null,"stale":null,"noRepo":1}},"mismatches":[],"changelog":{"trackingSince":"2026-10-08","recent":[{"id":"chg_01a1a9cd-0834-7118-ae7a-fd16a725aa75","kind":"check.reverified","summary":"Provenance (unverified → fail)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a1a9cd-0834-7118-ae7a-fd16a725aa75"},{"id":"chg_01a1a9cd-0835-7e78-84b4-92785454886b","kind":"score.total_changed","summary":"Trust score (55 → 56)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-05","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a1a9cd-0835-7e78-84b4-92785454886b"},{"id":"chg_01a1a4e7-29e9-7aba-81fc-abb70ca82431","kind":"check.unverifiable","summary":"Malware scan (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a1a4e7-29e9-7aba-81fc-abb70ca82431"},{"id":"chg_01a1a4e7-29ea-7d3e-9110-df52af2c3907","kind":"score.total_changed","summary":"Trust score (70 → 55)","materiality":"functional","direction":"regression","scoreDelta":-15,"occurredOn":"2026-11-04","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a1a4e7-29ea-7d3e-9110-df52af2c3907"},{"id":"chg_01a19fc7-858c-74fe-9c80-90e309c008d9","kind":"check.unverifiable","summary":"Provenance (fail → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a19fc7-858c-74fe-9c80-90e309c008d9"},{"id":"chg_01a19fc7-8590-7406-8df7-775a44bc5a74","kind":"score.total_changed","summary":"Trust score (69 → 70)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-11-03","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a19fc7-8590-7406-8df7-775a44bc5a74"},{"id":"chg_01a19499-6757-76f5-972d-e665654ff98f","kind":"check.reverified","summary":"Provenance (unverified → fail)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a19499-6757-76f5-972d-e665654ff98f"},{"id":"chg_01a19499-6758-7bd4-8058-4ad8e38cc54b","kind":"check.reverified","summary":"Malware scan (unverified → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a19499-6758-7bd4-8058-4ad8e38cc54b"},{"id":"chg_01a19499-6759-7224-834e-6e8a4a8d37a6","kind":"check.reverified","summary":"Security disclosure (unverified → fail)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a19499-6759-7224-834e-6e8a4a8d37a6"},{"id":"chg_01a19499-6759-7911-a0a5-75e7a36cac48","kind":"score.total_changed","summary":"Trust score (54 → 69)","materiality":"functional","direction":"improvement","scoreDelta":15,"occurredOn":"2026-11-01","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a19499-6759-7911-a0a5-75e7a36cac48"},{"id":"chg_01a19049-28f5-7e63-9ac0-c689ad66bcf7","kind":"check.unverifiable","summary":"Provenance (fail → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a19049-28f5-7e63-9ac0-c689ad66bcf7"},{"id":"chg_01a19049-28f6-7f28-8b2c-ce607af052da","kind":"score.total_changed","summary":"Trust score (68 → 54)","materiality":"functional","direction":"regression","scoreDelta":-14,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a19049-28f6-7f28-8b2c-ce607af052da"},{"id":"chg_01a19049-28f6-784f-949f-6afd59eb9493","kind":"check.unverifiable","summary":"Security disclosure (fail → unverified)","materiality":"functional","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a19049-28f6-784f-949f-6afd59eb9493"},{"id":"chg_01a19049-28f4-7125-b926-dfa42ecdabbf","kind":"check.unverifiable","summary":"Malware scan (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-31","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a19049-28f4-7125-b926-dfa42ecdabbf"},{"id":"chg_01a18557-cf59-70a5-91ef-8fba4494afe5","kind":"score.total_changed","summary":"Trust score (67 → 68)","materiality":"functional","direction":"improvement","scoreDelta":1,"occurredOn":"2026-10-29","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a18557-cf59-70a5-91ef-8fba4494afe5"},{"id":"chg_01a18022-6530-750d-96f6-2b3a54fb5e93","kind":"check.reverified","summary":"Malware scan (unverified → pass)","materiality":"security","direction":"improvement","scoreDelta":null,"occurredOn":"2026-10-28","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a18022-6530-750d-96f6-2b3a54fb5e93"},{"id":"chg_01a18022-6531-78c6-8c68-8578ec614f87","kind":"score.total_changed","summary":"Trust score (52 → 67)","materiality":"functional","direction":"improvement","scoreDelta":15,"occurredOn":"2026-10-28","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a18022-6531-78c6-8c68-8578ec614f87"},{"id":"chg_01a17cf7-6bea-7b2f-a438-7921a9248866","kind":"check.unverifiable","summary":"Malware scan (pass → unverified)","materiality":"security","direction":"regression","scoreDelta":null,"occurredOn":"2026-10-27","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a17cf7-6bea-7b2f-a438-7921a9248866"},{"id":"chg_01a17cf7-6bec-7ba7-a5a7-8737716bd3d9","kind":"score.total_changed","summary":"Trust score (67 → 52)","materiality":"functional","direction":"regression","scoreDelta":-15,"occurredOn":"2026-10-27","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a17cf7-6bec-7ba7-a5a7-8737716bd3d9"},{"id":"chg_01a17cf7-6bec-7676-a325-c1cd1825e66f","kind":"package.version_changed","summary":"Package version (0.4.3 → 0.5.0)","materiality":"functional","direction":"neutral","scoreDelta":null,"occurredOn":"2026-10-27","url":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#chg-chg_01a17cf7-6bec-7676-a325-c1cd1825e66f"}],"truncated":true,"feedUrl":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp/changelog.json"},"links":{"html":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp","markdown":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp.md","changelogJson":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp/changelog.json","changelogRss":"https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp.xml","external":[{"label":"PyPI project","href":"https://pypi.org/project/puntersedge-mcp/"},{"label":"Socket report","href":"https://socket.dev/pypi/package/puntersedge-mcp"},{"label":"Website","href":"https://puntersedge.online/developers/remote-mcp?utm_source=mcp-registry&utm_medium=directory&utm_campaign=hosted-mcp"}]}}