# Petnecto

> Paw to paw. Shelter pets, one question away: adoptable pets near you, and how to reach the rescue.

- name: com.petnecto/pets
- version: 1.0.2
- connection class: R0 (autonomous)
- trust: 83/100 flags: no-repository
- quality: 79/100 (good)
- owner: not claimed
- descriptor: https://api.protogrid.dev/v1/servers/com.petnecto%2Fpets
- tools: https://api.protogrid.dev/v1/servers/com.petnecto%2Fpets/tools

**An agent can connect right now, no human step.** Remote endpoint, no authentication, reachable on the last probe.

## Connection (mcpServers)

```json
{
  "mcpServers": {
    "pets": {
      "type": "http",
      "url": "https://petnecto.com/mcp"
    }
  }
}
```


## Trust

- hygiene: 80
- liveness: 100
- freshness: 100
- provenance: 55
- drivers: +dns-namespace +website +reachable +uptime-100% +updated-4d-ago -no-repository
- Derived from observable signals (official registry feed and our own credential-free probes); no code audit performed.

## Quality 79/100 (good)

### protocol: 88 (weight 25)

- pass `protocol.modern`: supports 2026-07-28 (server/discover)
- pass `protocol.stateless`: answers without a session
- pass `protocol.transport`: streamable HTTP
- warn `protocol.list_ttl`: tools/list declares ttlMs 0, so clients re-fetch it on every use

### authorization: n/a (weight 15)

- n/a `auth.prm`, `auth.as_metadata`, `auth.cimd`: no remote uses OAuth
- n/a `auth.secret_in_url`: no templated URL

### tool hygiene: 100 (weight 30)

- pass `tools.descriptions`: every tool has a description
- pass `tools.description_length`: descriptions are concise
- pass `tools.schemas`: every tool has an object input schema
- pass `tools.annotations`: 11 of 11 tools declare readOnlyHint or destructiveHint
- pass `tools.directory_hints`: every tool declares readOnlyHint, destructiveHint, idempotentHint and openWorldHint
- pass `tools.token_cost`: about 3,215 tokens to load every tool
- pass `tools.api_dump`: tools are not a one-to-one API dump

### stability: 25 (weight 15)

- warn `stability.changes`: 35 tool changes in 30 days
- fail `stability.rug_pull`: 2 tools kept their name but changed most of their description in 30 days; review before trusting them

### dependencies: n/a (weight 15)

- n/a `deps.known_vulns`, `deps.mcp_sdk_version`, `deps.resolvable`: no npm or PyPI package

- tools: 11, about 3,215 tokens to load them all
- tool set hash: 6a280cea20fbf1b3754aa389d0752b0f
- tools last changed: 2026-10-18T13:58:50.124Z
- badge: [![protogrid quality](https://protogrid.dev/badge/com.petnecto/pets.svg)](https://protogrid.dev/servers/com.petnecto/pets)
- Checks run on what our credential-free, read-only probes observe; tools are never called and no code audit is performed.

### Tool changes

- 2026-10-18 `search_by_description` changed (description)
  - before: Find pets from wishes in the person's own words, in any language (“a calm small dog good with kids near Seattle”). Use it for wishes listings rarely state, like calm or good with kids: each pet's match says, per wish, stated or not_stated, and pets that do not say are left out and counted in not_stated unless include_unknown=true. The answer's understood.chips say what was searched; drop a wrong one with off=[chip id]; a chip noted approx or hint is not a fact about any pet. Found pets (found:true) are not adoptable. Prefer find_pets for structured values.
  - after: Find pets from wishes in the person's own words, in any language (“a calm small dog good with kids near Seattle”). Use it for wishes listings rarely state, like calm or good with kids: each pet's match says, per wish, stated, inferred (read from its text, with a %) or not_stated, and pets that do not say are left out and counted in not_stated unless include_unknown=true. The answer's understood.chips say what was searched; drop a wrong one with off=[chip id]; a chip noted approx or hint is not a fact about any pet. Found pets (found:true) are not adoptable. Prefer find_pets for structured values.
- 2026-10-18 `get_pet` changed (description, inputSchema) **meaning changed**
  - before: One pet by id (from find_pets): photos, what its listing says (temperament and good-with only where stated), adoption fee, the rescue and how to reach it.
  - after: One pet by Petnecto ID, shelter pet ID, or PetHarbor listing URL: photos, stated facts, adoption fee, the shelter and how to reach it. Lists choices when an ID is shared.
- 2026-10-18 `find_shelters_near` added
  - Shelters and rescues near a US ZIP, 'town, ST' or lat,lon that are not on Petnecto yet, nearest first: address, phone, website, their own adoptable-pets page, hours, directions, source and licence. Use it when find_pets finds nothing near the person.
- 2026-10-17 `search_by_description` changed (description)
  - before: Find pets from wishes in the person's own words, in any language (“a calm small dog good with kids near Seattle”). Use it for wishes listings rarely state, like calm or good with kids: each pet's match[] says stated or not_stated, and pets that do not say are left out and counted in not_stated unless include_unknown=true. The answer's understood.chips say what was searched; drop a wrong one with off=[chip id]. Found pets (found:true) are not adoptable. Prefer find_pets for structured values.
  - after: Find pets from wishes in the person's own words, in any language (“a calm small dog good with kids near Seattle”). Use it for wishes listings rarely state, like calm or good with kids: each pet's match says, per wish, stated or not_stated, and pets that do not say are left out and counted in not_stated unless include_unknown=true. The answer's understood.chips say what was searched; drop a wrong one with off=[chip id]; a chip noted approx or hint is not a fact about any pet. Found pets (found:true) are not adoptable. Prefer find_pets for structured values.
- 2026-10-17 `search_by_description` changed (description) **meaning changed**
  - before: Find pets to adopt from a sentence in any language (found pets, marked found:true, are not adoptable yet): “a calm small dog that is good with kids, under 10 kg, near Seattle”. Returns the pets AND what was understood (understood.chips: species, breed, age, size, good-with, place, radius...), so you can tell the person what was searched and drop a wrong one with off=[chip id]. Good-with is only matched where a listing states it: pets that do not say are left out and counted in not_stated (include_unknown=true adds them, marked not_stated), and when no listing in scope states it at all they are shown instead, with a note. A size no listing in scope states (King County, Vienna) is not used as a filter, with a note. Each pet has match[] saying stated / not_stated for what was asked. Weight caps are approximated by size group and energy is only a hint. If the AI parts are unavailable it still answers from the words (degraded says so). total counts the matches and reachable how many of them page= (1-100) can reach; capped:true means more pets matched than one search ranks, so add a word or a filter. words_unmatched lists words no listing contains: the pets then match the other filters only (none when there were none). Prefer find_pets when you already have structured values.
  - after: Find pets from wishes in the person's own words, in any language (“a calm small dog good with kids near Seattle”). Use it for wishes listings rarely state, like calm or good with kids: each pet's match[] says stated or not_stated, and pets that do not say are left out and counted in not_stated unless include_unknown=true. The answer's understood.chips say what was searched; drop a wrong one with off=[chip id]. Found pets (found:true) are not adoptable. Prefer find_pets for structured values.
- 2026-10-17 `find_pets` changed (description, inputSchema)
  - before: Search pets to adopt at shelters in Taiwan (every public shelter), two US counties (King County WA, Montgomery County MD; no photos there, each links to the shelter's listing), Zaragoza, and Vienna (found pets only: marked found:true, announced for their owners first, not adoptable yet; found=exclude leaves them out). Nowhere else yet. Search near a place (98101, 20850, 臺北市, Xinyi, Zaragoza, Wien, or lat,lon; with miles or km; nearest first), by species, age, size, sex, breed and color, or by words in any of 10 languages (q). No place and no country = everything we list. Returns names, short facts, distance, the rescue and a link to each listing, plus what q was understood as; an empty answer says what we do list.
  - after: Search pets to adopt in the places we list (Taiwan, King County WA, Montgomery County MD, Zaragoza, and Vienna, found pets only: marked found:true, not adoptable yet; found=exclude leaves them out). Nowhere else yet. Search near a place (nearest first), by species, age, size, sex, breed and color, or by words in any of 10 languages (q). No place and no country = everything we list. Returns names, short facts, distance, the rescue and a link to each listing, plus what q was understood as; an empty answer says what we do list.
- 2026-10-17 `show_pets` changed (description, inputSchema)
  - before: Show pets to adopt near a place as an interactive view: photos, facts, and a button to meet one at its rescue. Use it when someone wants to look at pets to adopt in a place we list (Taiwan, King County WA, Montgomery County MD, Zaragoza, Vienna: see the server instructions). Apps without interactive views get the same list as text.
  - after: Show pets to adopt near a place as an interactive view: photos, facts, and a button to meet one at its rescue. Use it when someone wants to look at pets in a place we list (see the server instructions). Apps without interactive views get the same list as text.
- 2026-10-17 `about_this_service` changed (annotations)
- 2026-10-17 `similar_pets` changed (annotations)
- 2026-10-17 `search_by_description` changed (annotations)

Full history: https://api.protogrid.dev/v1/servers/com.petnecto%2Fpets/changes

## Remotes

- https://petnecto.com/mcp (streamable-http, auth none, reachable true, uptime30d 1)

## Packages

_none_

## Tools (11)

- `about_this_service`: Where we list pets (places and counts), where the listings come from, who runs this service, what it keeps, and how a rescue changes or removes its listings.
- `find_pets`: Search pets to adopt in the places we list (Taiwan, King County WA, Montgomery County MD, Zaragoza, and Vienna, found pets only: marked found:true, not adoptable yet; found=exclude leaves them out). Nowhere else yet. Search near a place (nearest first), by species, age, size, sex, breed and color, or by words in any of 10 languages (q). No place and no country = everything we list. Returns names, short facts, distance, the rescue and a link to each listing, plus what q was understood as; an empty answer says what we do list.
- `find_shelters_near`: Shelters and rescues near a US ZIP, 'town, ST' or lat,lon that are not on Petnecto yet, nearest first: address, phone, website, their own adoptable-pets page, hours, directions, source and licence. Use it when find_pets finds nothing near the person.
- `get_pet`: One pet by Petnecto ID, shelter pet ID, or PetHarbor listing URL: photos, stated facts, adoption fee, the shelter and how to reach it. Lists choices when an ID is shared.
- `get_rescue`: One rescue or shelter by id (from a pet's rescue.id): where it is, its adoption page, email and phone.
- `list_filters`: The countries and places we hold listings for, and per country how many live pets state each species, age, size, sex, colour and good-with value. Taiwan states no Baby or Senior ages, Vienna no sizes, and few listings anywhere say good-with: check here before suggesting a filter.
- `resolve_breed`: Turn a breed name in any language (貴賓犬, pit bull, perro salchicha, 시바견) into Wikidata breed ids, to pass to find_pets as breed or to compare listings across countries.
- `resolve_place`: Turn a US ZIP, lat,lon, a Taiwan county or township name (any language), Zaragoza or Wien into the point find_pets would search around, to confirm with the person before searching. It finds places we list no pets near too: find_pets then says so. Positions are rounded to about 1 km and nothing is stored.
- `search_by_description`: Find pets from wishes in the person's own words, in any language (“a calm small dog good with kids near Seattle”). Use it for wishes listings rarely state, like calm or good with kids: each pet's match says, per wish, stated, inferred (read from its text, with a %) or not_stated, and pets that do not say are left out and counted in not_stated unless include_unknown=true. The answer's understood.chips say what was searched; drop a wrong one with off=[chip id]; a chip noted approx or hint is not a fact about any pet. Found pets (found:true) are not adoptable. Prefer find_pets for structured values.
- `show_pets`: Show pets to adopt near a place as an interactive view: photos, facts, and a button to meet one at its rescue. Use it when someone wants to look at pets in a place we list (see the server instructions). Apps without interactive views get the same list as text.
- `similar_pets`: Pets similar to one pet id (from search results): same kind of pet and size, nearest in meaning of their listings. Use it after the person likes one pet.
