# io.github.Propertyscout001/puntersedge (pypi · puntersedge-mcp)

AU/NZ racing and Australian sports odds for AI agents: 36 read-only tools, each stating its cost.

- Trust score: 56/100 (low)
- Change this week: −12
- Registry status: active
- Liveness: live
- Owner verified: no
- Last scored: 2026-11-06

## Components

- remote · `api.puntersedge.online`: 80/100, [markdown](https://verifymcp.io/servers/propertyscout001-puntersedge/api.md), [page](https://verifymcp.io/servers/propertyscout001-puntersedge/api)
- pypi · `puntersedge-mcp`: 56/100 (this document), [markdown](https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp.md), [page](https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp)

## Channel facts

- Registry: `pypi`
- Package: `puntersedge-mcp`
- Version: `0.5.0`
- Transport: `stdio`

## Trust breakdown

How this component scores in each security and reliability category. Every signal is checked automatically from public evidence about the published package, including repeated runs of it in an isolated sandbox, and we only credit what we can confirm. Scores are 0–100 per category. Scoring method: https://verifymcp.io/docs/scoring (what has changed: https://verifymcp.io/docs/scoring/changelog)

Scored 2026-11-06.

- **Supply Chain Security**: 50/100
  - 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.
- **Provenance & Transparency**: 19/100
  - 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.
- **Schema Quality & AI Usability**: 62/100
  - 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.
- **Stability & Change Management**: 77/100
  - Stability observed for 23 of 30 days with no destabilising changes; credit accrues until the full window elapses.
- **Tool Coverage**: 71/100
  - 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.
- **Tool Safety**: 100/100
  - 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.
- **Capabilities**: 100/100
  - Implements a current MCP spec version (2026-07-28).

## Install

### How do I install the io.github.Propertyscout001/puntersedge MCP server?

io.github.Propertyscout001/puntersedge runs locally as a PyPI package, launched with uvx puntersedge-mcp. Ready-made configuration for Claude, Cursor, VS Code, Codex and 5 more is on this page, copied from each client's own documentation.

### Claude

```bash
claude mcp add propertyscout001-puntersedge -- uvx puntersedge-mcp
```

### Cursor

```json
{
  "mcpServers": {
    "propertyscout001-puntersedge": {
      "command": "uvx",
      "args": [
        "puntersedge-mcp"
      ]
    }
  }
}
```

### VS Code

```json
{
  "servers": {
    "propertyscout001-puntersedge": {
      "command": "uvx",
      "args": [
        "puntersedge-mcp"
      ]
    }
  }
}
```

### Codex

```bash
codex mcp add propertyscout001-puntersedge -- uvx puntersedge-mcp
```

### opencode

```json
{
  "$schema": "https://opencode.ai/config.json",
  "mcp": {
    "propertyscout001-puntersedge": {
      "type": "local",
      "command": [
        "uvx",
        "puntersedge-mcp"
      ],
      "enabled": true
    }
  }
}
```

### OpenClaw

```bash
openclaw mcp add propertyscout001-puntersedge --command uvx --arg puntersedge-mcp
```

### Hermes

```yaml
mcp_servers:
  propertyscout001-puntersedge:
    command: "uvx"
    args: ["puntersedge-mcp"]
```

### Netclaw

```json
{
  "McpServers": {
    "propertyscout001-puntersedge": {
      "Transport": "stdio",
      "Command": "uvx",
      "Arguments": [
        "puntersedge-mcp"
      ]
    }
  }
}
```

### Vellum

```bash
assistant mcp add propertyscout001-puntersedge -t stdio -c uvx -a puntersedge-mcp
```

### Other

```json
{
  "mcpServers": {
    "propertyscout001-puntersedge": {
      "command": "uvx",
      "args": [
        "puntersedge-mcp"
      ]
    }
  }
}
```

## Changelog

Every change recorded for this component, newest first. Days that predate change tracking, or that we cannot explain, say so: "we were watching and nothing happened" and "we were not watching" are different claims.

### 2026-11-05 (score 56, +1)

- [security regression] Provenance: unverified → fail

### 2026-11-04 (score 55, −15)

- [security regression] Malware scan: pass → unverified

### 2026-11-03 (score 70, +1)

- [security regression] Provenance: fail → unverified

### 2026-11-01 (score 69, +15)

- [security regression] Provenance: unverified → fail
- [security improvement] Malware scan: unverified → pass
- [functional regression] Security disclosure: unverified → fail

### 2026-10-31 (score 54, −14)

- [security regression] Provenance: fail → unverified
- [security regression] Malware scan: pass → unverified
- [functional regression] Security disclosure: fail → unverified

### 2026-10-29 (score 68, +1)

No change was recorded against any check on this day. Stability & Change Management went from 47 to 50. That category is still filling its 30-day observation window: 14 days of observed history at the previous scan, 15 at this one. The score rises as the window fills, whether or not the server changes.

### 2026-10-28 (score 67, +15)

- [security improvement] Malware scan: unverified → pass

### 2026-10-27 (score 52, −14)

- [security regression] Malware scan: pass → unverified
- [functional regression] Schema quality: 4042 → 4899
- [functional] Package version: 0.4.3 → 0.5.0

## MCP tools (36)

### `racing_next_to_go` (~227 tokens)

Next races to jump, with runners and live per-bookmaker prices. EVERY country
by default, NOT only AU/NZ — much of the catalogue is foreign. Australian races carry
the full panel; the British and Irish card (country=GB,IE) carries the UK-licensed
books ladbrokes_uk, williamhill and betway_uk plus the Australian books that quote it,
with place_price derived from each-way terms; every other country sits at a median of
ONE bookmaker. COST: 2 credits. categories: horse,greyhound,harness (omit for all).
country: ISO codes e.g. AU, AU,NZ or GB,IE — pass country=AU for an Australian card,
adding include_unresolved=true when late-card races are still country-unresolved.
venue/bookmakers: comma-separated, case-insensitive.
Each price carries its own age_seconds and stale flag; prefer fresh quotes.

Input parameters:

- `bookmakers`
- `categories`
- `country`
- `num_races` (integer)
- `venue`

Output parameters:

- `result` (string)

### `racing_best_odds` (~96 tokens)

Best win, place and tote price per runner across every bookmaker, with the book
offering it and the market percentage. COST: 3 credits. market_percentage under 100
means the best prices across books beat the field; over 100 is the bookmakers'
margin, which is the normal case.

Input parameters:

- `bookmakers`
- `categories`
- `country`
- `num_races` (integer)

Output parameters:

- `result` (string)

### `racing_movers` (~141 tokens)

Consensus firmers and drifters in the live racing window. COST: 3 credits.
direction must be 'firming', 'drifting' or omitted — anything else is refused with a
422 (free). min_books only reports a move confirmed by that many bookmakers, which is
how you separate a real move from one book repricing. Use `limit` to cap the page;
there is no num_races on this endpoint.

Input parameters:

- `categories`
- `country`
- `direction`
- `limit`
- `max_mins_to_jump`
- `min_books`
- `min_move_pct`

Output parameters:

- `result` (string)

### `racing_changes` (~184 tokens)

Races and prices that changed since a timestamp. COST: 2 credits.
THE RIGHT WAY TO WATCH A MARKET. Calling racing_next_to_go repeatedly re-downloads
every race every time; this returns only what moved. `since` is an ISO 8601 UTC
timestamp — on the first call use a recent one, then pass back the `server_time` the
response returns. That cursor is set 30s behind the server clock so no in-flight
write is skipped, which means the feed is at-least-once: expect to see a race twice.
Note the shape — `changed_runners` is FLAT, one row per runner per bookmaker with
bookmaker_key on the row, not the nested runners[].bookmakers[] of next-to-go.

Input parameters:

- `categories`
- `country`
- `since` (string, required)

Output parameters:

- `result` (string)

### `racing_events` (~72 tokens)

Scheduled races in a forward window, WITHOUT prices. COST: 1 credit.
Cheaper than next-to-go when you only need the card — what is running, where and
when — rather than what it is paying.

Input parameters:

- `categories`
- `country`
- `hours_ahead` (integer)

Output parameters:

- `result` (string)

### `racing_track_conditions` (~80 tokens)

Track condition, weather and rail position: current state plus the day's change
log. COST: 1 credit. date=YYYY-MM-DD, Australia/Sydney, up to 7 days back. A going
change mid-meeting is one of the few things that moves a whole card at once.

Input parameters:

- `date`
- `venue`

Output parameters:

- `result` (string)

### `racing_acceptances` (~138 tokens)

Full-day AU thoroughbred acceptance card: every meeting, race and runner.
COST: 2 credits. date=YYYY-MM-DD (Australia/Sydney), up to 3 days back or forward.
READ THE COUNTS CAREFULLY. Several are a FLOOR rather than an exact figure wherever a
race reports runner_set_status other than 'checks_passed' — the response's
\`completeness` block and each race's `runner_set_note` state the bound. Say 'at least
N' rather than reporting a field size, unless the status says checks_passed.

Input parameters:

- `date`
- `venue`

Output parameters:

- `result` (string)

### `racing_markets` (~213 tokens)

Every market on ONE race: win, place, Same Race Multi Top 2/3/4, and — once the race
has run — the exotic dividends it paid. COST: 2 credits. Plus plan and above.
Name the race with race_id (exact), or venue + meeting_date (AET, YYYY-MM-DD) +
race_number. Two races sharing those three answer 409 race_ambiguous and cost nothing
rather than silently picking one side of a venue split. bookmakers/markets: comma
separated; markets is a subset of win, place, top2, top3, top4, exotics.
Every book prices win and all but the exchange price place; Top 2/3/4 come from fewer
books, so treat a missing leg as 'not quoted', never as 'no market'.

Input parameters:

- `bookmakers`
- `markets`
- `meeting_date`
- `race_id`
- `race_number`
- `venue`

Output parameters:

- `result` (string)

### `racing_venues` (~80 tokens)

Canonical venue directory: venue_id, display name, physical site, country and the
codes run there. COST: 1 credit. Use venue_id to join across endpoints — spelling
variants of one track ('Sandown Hillside', 'SANDOWN HILLSIDE') share one id, and the
raw `venue` string does not.

Output parameters:

- `result` (string)

### `racing_consensus` (~144 tokens)

Margin-free consensus for ONE race: each runner's fair probability and price, built by
removing every bookmaker's margin and combining the books, with which books were used and
which were left out and why. COST: 3 credits. Name the race with race_id, or venue +
meeting_date (AET, YYYY-MM-DD) + race_number. A runner priced above its consensus by
several books is the honest form of 'value'; one book alone above it usually is not.

Input parameters:

- `bookmakers`
- `meeting_date`
- `min_books`
- `race_id`
- `race_number`
- `venue`

Output parameters:

- `result` (string)

### `us_tote` (~241 tokens)

North American tote odds from TVG: every US and Canadian race on its board with each
runner's morning line and current win odds (odds-to-1 and decimal) and the WIN pool.
COST: 2 credits. A TOTE, NOT A BOOKMAKER: the payoff is whatever the pool pays when it
closes, so a pre-race price is an estimate; settled payoffs are on racing_results with
country=US. win_odds is null until the WIN pool holds money. date=YYYY-MM-DD (US day,
default today); country US or CA; status open, off or official. history=true (how the
odds and pool moved from an hour before post) and exotics=true (probables and will-pays)
each need ONE race: race_id, or TVG's source_race_id tvg_<track>_<YYYY-MM-DD>_<n>.

Input parameters:

- `country`
- `date`
- `exotics` (boolean)
- `history` (boolean)
- `race_id`
- `source_race_id`
- `status`

Output parameters:

- `result` (string)

### `racing_results` (~299 tokens)

Settled AU/NZ race results. COST: 2 credits.
Carries `placings` (the dividend-bearing top three, with win and place prices) AND
\`runners` (the FULL finishing order with jockey, trainer, margin, starting price and,
on every thoroughbred entry, `horse_ref`). Neither alone is the whole picture — join
them on saddlecloth number. Settle only against status=final; interim can change on
protest. JOINING ACROSS MEETINGS: `horse_ref` (`pe:<name>`) is the horse and is the
same value on the live board, the closing-line and price-path archives, horse_form and
horse_runs. `runner_ref` (`ra:<code>`) is the code Racing Australia published on race
day: it joins the rows about one race, and changes from meeting to meeting because
Racing Australia issues a new code for the same horse each day.
Greyhound runner_refs (`grv:`/`grsa:`) are per-dog registry ids and do persist.
date=YYYY-MM-DD for a single meeting day (AET). `field_status` says whether the
finishing order is the complete field.

Input parameters:

- `categories`
- `country`
- `date`
- `hours_back` (integer)
- `limit`
- `offset`
- `status`
- `venue`

Output parameters:

- `result` (string)

### `racing_results_coverage` (~89 tokens)

What the results field coverage actually IS, measured rather than promised.
COST: 1 credit. Call this before telling a user that results are missing — the answer
is often that a race has no results source, not that we dropped it. days: 1-30 (the
endpoint's window; a larger value is sent as 30).

Input parameters:

- `days` (integer)

Output parameters:

- `result` (string)

### `racing_price_history` (~110 tokens)

Recorded per-bookmaker price ticks for one race — the market movement record.
COST: 5 credits (this is one of the expensive ones; do not loop it).
Give race_id, or venue + race_number + date. include_points=false returns
open/close/high/low only, which is usually what a summary needs.

Input parameters:

- `bookmakers`
- `date`
- `include_points`
- `race_id`
- `race_number`
- `venue`

Output parameters:

- `result` (string)

### `racing_closing_lines` (~164 tokens)

The permanent closing-line and result archive — the dataset for measuring closing
line value. COST: 5 credits. Plus and above read the whole archive; Standard reads a
rolling window, and each response's window_days says which applies to the key (null is
the whole archive). Free and Hobby keys get a 403 naming the plans that work, and so
does a Standard request for dates entirely outside its window. Ask
racing_closing_lines_coverage first to learn what the archive actually holds before
reporting that something is missing.

Input parameters:

- `category`
- `country`
- `date`
- `limit`
- `offset`
- `race_id`
- `resulted_only`
- `venue`

Output parameters:

- `result` (string)

### `racing_closing_lines_coverage` (~67 tokens)

What the closing-line archive holds: floor date, row and race counts, how much is
a true closing line and how much is resulted. COST: 1 credit. Cheap, and it is the
honest answer to 'how far back does your history go'.

Output parameters:

- `result` (string)

### `racing_clv` (~286 tokens)

Score bets against the closing line each race actually closed at. COST: 5 credits per
request, up to 200 bets. Plus plan and above (lower tiers get a 403 and are not charged).
Each bet is an object: name the race by `race_id` (from next-to-go, events, results or the
archive) or by `venue` + `meeting_date` (YYYY-MM-DD, AET) + `race_number`; name the runner by
\`runner_ref` (exact), `runner_number` (saddlecloth) or `runner_name`; give `price` (decimal
odds taken), optionally `stake` (default one flat unit), `bookmaker` (measure against THAT
book's close) and `ref` (your id, echoed back). `reference` is `best` (highest close across
books, the strictest test) or `median`, used when a bet names no bookmaker. Returns per bet
the closing prices, clv_pct, beat_close, the result and flat-stake pnl, and a summary with
average and median CLV, beat-the-close rate, win rate and ROI. A bet the archive cannot
resolve comes back with a `reason` and is left out of the averages, not guessed.

Input parameters:

- `bets` (array, required)
- `reference`

Output parameters:

- `result` (string)

### `horse_form` (~225 tokens)

Thoroughbred form, career record and profile for ONE horse, read from Racing
Australia's form page. COST: 3 credits.
\`horse` is a name (matched case- and punctuation-insensitively), the `pe:` horse_ref
every thoroughbred surface publishes (the same thing: the folded name), or an `ra:`
code from runner_ref (prefer the name or horse_ref: Racing Australia issues a new code
each day). A name resolves to ONE horse. The response carries `horse_ref`, the key that
joins this horse across meetings; its `runner_ref` is the code the page was read under.
A 503 saying Racing Australia is refusing fresh reads means call horse_runs
instead: that is our own record and does not depend on the page. DO NOT LOOP THIS
over a field or a list: the upstream rate limits hard and a burst gets the whole
estate flagged. For many horses there is a paced bulk backfill queue, reached from
application code rather than from here.

Input parameters:

- `horse` (string, required)

Output parameters:

- `result` (string)

### `horse_runs` (~170 tokens)

Every run we hold for ONE thoroughbred out of PuntersEdge's OWN settled results,
newest first: position, margin, official SP, jockey, trainer and field size per run,
plus a starts/wins/places summary. COST: 3 credits (a name matching nothing is a free
404). `horse` is a name or its `pe:` horse_ref; an `ra:` code is accepted but pins one
meeting's entry. NOT a career record: it starts at `source.coverage_from` (the first
complete card, 2026-09-01) and only grows. Use it when horse_form cannot be read, or
whenever the question is what happened in the races we settled ourselves.

Input parameters:

- `horse` (string, required)
- `limit`

Output parameters:

- `result` (string)

### `greyhound_form` (~136 tokens)

Greyhound form history for one dog from PuntersEdge's OWN results (Victorian tracks via
FastTrack, every other state via the national results pages), from the 2026-09-13 card.
COST: 3 credits (a name matching nothing is a free 404). `dog` is a name, or a runner_ref
like grv:<id> / grsa:<id> to restrict to one registry. Nothing earlier than 2026-09-13
exists here: the record is since that date, not a career.

Input parameters:

- `dog` (string, required)
- `limit`

Output parameters:

- `result` (string)

### `greyhound_field` (~170 tokens)

Every dog in ONE greyhound race with its recent runs and record, from our own results:
the field's form in one call instead of one greyhound_form per dog. COST: 3 credits
(a race we hold no field for is a free 404). Australian races, and British and Irish ones
from 12 October 2026. Name the race with race_id (from racing_next_to_go, racing_events or
racing_results), or venue + meeting_date (YYYY-MM-DD; AET for Australia, London for GB/IE)
\+ race_number. runs: recent runs per dog, 1-20, default 10.

Input parameters:

- `meeting_date`
- `race_id`
- `race_number`
- `runs`
- `venue`

Output parameters:

- `result` (string)

### `greyhound_stats` (~91 tokens)

One greyhound's record from PuntersEdge's OWN results since 2026-09-13, split by
track, distance, box or any combination (`by=track,distance`); no grade dimension.
COST: 3 credits; a bad `by` is a free 422, an unknown dog a free 404.

Input parameters:

- `by`
- `dog` (string, required)

Output parameters:

- `result` (string)

### `jockey_stats` (~87 tokens)

Jockey premiership leaderboards, or one jockey by (partial) name. COST: 2 credits.
state: AUS (national) or a state. scope: all, metro, provincial, country, picnic.
season: current or previous RA season (1 Aug – 31 Jul).

Input parameters:

- `name`
- `scope`
- `season`
- `state`

Output parameters:

- `result` (string)

### `trainer_stats` (~61 tokens)

Trainer premiership leaderboards, or one trainer by (partial) name.
COST: 2 credits. Same state/scope/season options as jockey_stats.

Input parameters:

- `name`
- `scope`
- `season`
- `state`

Output parameters:

- `result` (string)

### `list_sports` (~47 tokens)

The sport catalogue: every queryable sport_key with its display name.
COST: 1 credit. Racing is NOT in here and has no sport_key — use the racing_* tools.

Output parameters:

- `result` (string)

### `sports_odds` (~161 tokens)

Head-to-head, spread and total prices per bookmaker for one sport's upcoming
fixtures (sport_key=afl, nrl, nba, soccer_epl …).
COST: 1 CREDIT PER MARKET REQUESTED — markets='h2h' is 1, 'h2h,spreads,totals' is 3.
There is no single figure for this tool; ask for the markets you will actually read.
Every market carries a `quality` object (score, status, age in seconds) — trust it
over assumptions. Racing is not a sport key; 'horse-racing' is a 422.

Input parameters:

- `bookmakers`
- `competition`
- `markets`
- `sport_key` (string, required)

Output parameters:

- `result` (string)

### `sports_results` (~152 tokens)

Final scores from the league's own record. COST: 1 credit. Covers afl, aflw, nrl and
nrlw only; another sport_key is a free 422, never an empty list. `event_id` ties a result
to the fixture you hold prices for, and is null when no fixture matched with certainty —
settle only rows that carry one (linked_only=true). Scores stay null until the league calls
the match final, so an abandoned game never reads as a nil-all.

Input parameters:

- `competition`
- `final_only` (boolean)
- `limit`
- `linked_only` (boolean)
- `season`
- `sport_key` (string, required)

Output parameters:

- `result` (string)

### `sports_closing_lines` (~123 tokens)

Each bookmaker's last head-to-head price, handicap line and total before the start of
every match in a range, plus the consensus close. COST: 5 credits. Standard and above
(403 on Free and Hobby). date_from/date_to: ISO dates; default the last 7 days, at most 92
days per call (page by month for a season). Lines exist from 2026-09-29.

Input parameters:

- `bookmakers`
- `date_from`
- `date_to`
- `sport_key` (string, required)

Output parameters:

- `result` (string)

### `best_odds` (~35 tokens)

Best available price per outcome across bookmakers for one sport.
COST: 3 credits.

Input parameters:

- `sport_key` (string, required)

Output parameters:

- `result` (string)

### `arb_best_prices` (~90 tokens)

Cross-book price comparison per selection, with every bookmaker's quote alongside
the best. COST: 2 credits. A word of warning worth passing on: a two-outcome market
that only ONE bookmaker is quoting will look like a large edge and is not one. Check
how many books stand behind each leg before reporting an opportunity.

Input parameters:

- `max_age_minutes`
- `sport_key`

Output parameters:

- `result` (string)

### `check_usage` (~49 tokens)

Current key's plan, monthly credit allowance, credits used and reset date.
COST: free. You rarely need this — every priced result above already carries
credits_remaining, read from the response headers.

Output parameters:

- `result` (string)

### `check_overage` (~126 tokens)

Whether this account may run past its monthly allowance (overage), the rate per 1,000
credits, the ceiling the API actually enforces, and what this period would be invoiced if
it ended now. COST: free. Read this before telling a user they are about to hit a 402: when
overage is on, calls continue up to `ceiling` and the excess is invoiced; when it is off,
\`ceiling` equals the plan's credit limit. Switching it is done by a human in the console,
not from here.

Output parameters:

- `result` (string)

### `bulk_datasets` (~114 tokens)

The catalogue of pre-built dataset FILES: every dataset published as whole-day files and
monthly bundles, with rows, bytes per format (parquet, gzip csv), sha256 digest, when each was
generated and the URL that serves it. COST: free. The files themselves are downloaded from
application code (20 credits a daily file, 100 a monthly bundle; Business and Platform plans
respectively), not from here: this tool tells you what exists and how big it is.

Input parameters:

- `dataset`

Output parameters:

- `result` (string)

### `connector_health` (~86 tokens)

Per-bookmaker feed freshness: last_ok, status, records written. COST: free.
THIS IS HOW YOU TELL A QUIET MARKET FROM A BROKEN FEED. A stalled scraper does not
error — it keeps serving its last value, which looks exactly like a live price. If a
book's prices seem frozen, check here before telling a user the market has settled.

Output parameters:

- `result` (string)

### `demo_next_to_go` (~64 tokens)

Free no-key sandbox sample of racing_next_to_go (3 races, 5 runners, 3 books,
truncated). COST: free. Use it to explore the response shape before spending
credits, and to demonstrate the data to someone who has not signed up.

Output parameters:

- `result` (string)

### `demo_best_odds` (~48 tokens)

Free no-key sandbox sample of sports best-odds with arb detection. COST: free.
\`sport` is optional; a live sport is picked if omitted.

Input parameters:

- `sport`

Output parameters:

- `result` (string)

## Diagnostics

Captured diagnostic sections: Provenance, Install scripts, Dependencies. The full working is on the page: https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp#diagnostics

## Score history

- 2026-11-06: 56
- 2026-11-05: 56
- 2026-11-04: 55
- 2026-11-03: 70
- 2026-11-02: 69
- 2026-11-01: 69
- 2026-10-31: 54
- 2026-10-30: 68
- 2026-10-29: 68
- 2026-10-28: 67
- 2026-10-27: 52
- 2026-10-26: 66
- 2026-10-25: 66
- 2026-10-24: 65
- 2026-10-23: 65
- 2026-10-22: 70
- 2026-10-21: 51
- 2026-10-20: 51
- 2026-10-19: 66
- 2026-10-18: 51
- 2026-10-17: 66
- 2026-10-16: 66
- 2026-10-15: 51
- 2026-10-14: 66
- 2026-10-13: 39
- 2026-10-12: 39
- 2026-10-08: 24

## Common questions

### What is the io.github.Propertyscout001/puntersedge MCP server?

io.github.Propertyscout001/puntersedge is an MCP server listed in the public MCP registry as io.github.Propertyscout001/puntersedge. AU/NZ racing and Australian sports odds for AI agents: 36 read-only tools, each stating its cost. This page covers its PyPI package (puntersedge-mcp).

### Is the io.github.Propertyscout001/puntersedge MCP server safe to use?

io.github.Propertyscout001/puntersedge scores 56 out of 100 on VerifyMCP. We found no known CVEs affecting it as of 6 November 2026. That is a record of what we were able to check automatically, not an endorsement. The category breakdown on this page shows every signal behind the number, including the ones we could not confirm.

### What tools does the io.github.Propertyscout001/puntersedge MCP server expose?

io.github.Propertyscout001/puntersedge exposes 36 tools: racing_next_to_go, racing_best_odds, racing_movers, racing_changes, racing_events, and 31 more. Their descriptions and schemas cost roughly 4,666 tokens of context every time the server is loaded.

### Is the io.github.Propertyscout001/puntersedge MCP server still maintained?

io.github.Propertyscout001/puntersedge is still listed as active in the MCP registry. We last reached this channel on 6 November 2026. Those dates come from our own scans of the registry and the channel itself, not from anything the publisher announced.

### What licence is the io.github.Propertyscout001/puntersedge MCP server under?

io.github.Propertyscout001/puntersedge declares the MIT licence, which is OSI-approved. That covers the source only, and says nothing about the cost of any service it calls.

### What did VerifyMCP test on the io.github.Propertyscout001/puntersedge MCP server?

VerifyMCP ran 15 checks on io.github.Propertyscout001/puntersedge, covering Known CVEs, Install scripts, Dependency health, Source repository and 11 more. One item could not be completed, a gap on our side rather than a finding about io.github.Propertyscout001/puntersedge: Malware scan. Endpoint Security and Transport & Reachability do not apply to a PyPI package, so they were not tested. The score does not measure everything, and the scoring documentation lists what it leaves out.

## Links

- PyPI project: https://pypi.org/project/puntersedge-mcp/
- Socket report: https://socket.dev/pypi/package/puntersedge-mcp
- Website: https://puntersedge.online/developers/remote-mcp?utm_source=mcp-registry&utm_medium=directory&utm_campaign=hosted-mcp
- Changelog RSS feed: https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp.xml
- Changelog JSON feed: https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp/changelog.json
- Trust report (JSON): https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp.json
- HTML version of this page: https://verifymcp.io/servers/propertyscout001-puntersedge/puntersedge-mcp
