mcp-server-surepetcare
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcp-server-surepetcarewhere are my pets right now?"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp-server-surepetcare
MCP (Model Context Protocol) server for the SurePetcare cloud API. Exposes pet location monitoring, SureFlap lock control, device renaming, and hub LED control as MCP tools.
Disclaimer: This project is not affiliated with, endorsed by, or in any way associated with Sure Petcare Ltd. It is an independent, community-developed integration created by happy users of their hardware and software. SurePetcare, SureFlap, and SureFeed are trademarks of Sure Petcare Ltd. Use of this package is at your own risk. The underlying API is unofficial and reverse-engineered by the community - it may change or break without notice.
Tools
Tool | Description |
| List all pets and their current locations (inside/outside) |
| Get raw pet data including microchip tag information |
| List all SurePetcare devices, including live lock state and curfew schedule |
| Set the lock state of a SureFlap cat flap |
| Rename a device, re-asserting any explicit lock override so the rename can't silently unlock it |
| Manually mark a pet inside/outside (e.g. after letting them through a door other than the flap) |
| Set the hub's LED ring brightness (off/bright/dimmed) |
| Get aggregated inside/outside activity stats for a pet over a date range |
Lock state values
Value | Meaning |
| Unlocked (both directions) |
| Locked in (entry only) |
| Locked out (exit only) |
| Locked (both directions) |
LED mode values
Value | Meaning |
| Off |
| Bright |
| Dimmed |
Related MCP server: UniFi MCP
Configuration
Set the following environment variables before starting the server:
export SUREPETCARE_EMAIL="your@email.com"
export SUREPETCARE_PASSWORD="yourpassword"
export SUREPETCARE_DEVICE_ID="stable-uuid" # optional, auto-generated if omittedUsage with Claude Desktop
Add to your claude_desktop_config.json:
{
"mcpServers": {
"surepetcare": {
"command": "npx",
"args": ["mcp-server-surepetcare"],
"env": {
"SUREPETCARE_EMAIL": "your@email.com",
"SUREPETCARE_PASSWORD": "yourpassword"
}
}
}
}Remote use: claude.ai connector (HTTP + OAuth)
To use the server from claude.ai and the Claude mobile apps, run it in HTTP mode on an
always-on machine and add it as a custom connector. claude.ai connects from the
internet, so the server needs a public https:// URL. A Cloudflare Tunnel or
Tailscale Funnel gives you one without opening ports on your router. Private overlay
networks such as ZeroTier or plain Tailscale aren't enough: claude.ai connects from
Anthropic's servers, not from your devices.
HTTP mode is single-user: when you connect Claude, the server shows a page asking for your owner passphrase. Anyone who knows it can authorize a client, and anyone with a token can unlock your cat flap - pick a strong one.
npx mcp-server-surepetcare --http # or MCP_TRANSPORT=httpVariable | Default | |
| (required) | The |
| (required) | Passphrase for authorizing Claude, at least 12 characters |
|
| Interface to listen on; the Docker image sets |
|
| |
|
| Registered clients and refresh-token hashes, so Claude stays connected across restarts |
plus the SUREPETCARE_* variables from Configuration. Set
SUREPETCARE_DEVICE_ID to a fixed UUID, or every restart looks like a new device
logging in.
Docker (e.g. on a Raspberry Pi)
Each release publishes ghcr.io/dirkjanfaber/mcp-server-surepetcare for amd64, arm64
and arm/v7 (32-bit Raspberry Pi OS), tagged with the version and latest. Publish its
port on loopback only, so the tunnel is the only way in:
# docker-compose.yml
services:
surepetcare-mcp:
image: ghcr.io/dirkjanfaber/mcp-server-surepetcare:latest # or pin a version
restart: unless-stopped
env_file: .env # SUREPETCARE_*, MCP_PUBLIC_URL, MCP_OWNER_PASSWORD
ports:
- "127.0.0.1:3200:3000"
volumes:
- surepetcare-data:/data
volumes:
surepetcare-data:With Tailscale Funnel (no domain needed), run sudo tailscale funnel --bg 3200 and
use the URL tailscale funnel status shows as MCP_PUBLIC_URL.
claude.ai only connects on port 443, so Funnel's other ports (8443, 10000) don't work
for a connector. If the machine's own name is already taken by another server, give
this one its own tailnet machine with a Tailscale container next to it. Drop the
ports: mapping above, set MCP_PUBLIC_URL to https://surepet.<tailnet>.ts.net, and add:
surepetcare-tailscale:
image: tailscale/tailscale:latest
hostname: surepet
restart: unless-stopped
environment:
TS_HOSTNAME: surepet
TS_AUTHKEY: ${TS_AUTHKEY} # only used for the first login
TS_STATE_DIR: /var/lib/tailscale
TS_SERVE_CONFIG: /config/serve.json
TS_USERSPACE: "true"
volumes:
- surepetcare-tailscale:/var/lib/tailscale
- ./surepet-ts:/config:rowith surepetcare-tailscale: added under volumes:, and surepet-ts/serve.json:
{
"TCP": { "443": { "HTTPS": true } },
"Web": {
"${TS_CERT_DOMAIN}:443": {
"Handlers": { "/": { "Proxy": "http://surepetcare-mcp:3000" } }
}
},
"AllowFunnel": { "${TS_CERT_DOMAIN}:443": true }
}Generate the auth key in the Tailscale admin console under Settings → Keys. Without one, the container prints a login link that expires after about a minute. Once logged in, the machine stays logged in through the volume and the key can be removed.
With a Cloudflare Tunnel (needs a domain on Cloudflare), point a public hostname at the server instead. Don't put Cloudflare Access in front of it: claude.ai can't get past its login page.
Check the public URL before connecting Claude:
curl https://<your public host>/.well-known/oauth-authorization-serverIt should return JSON whose issuer matches MCP_PUBLIC_URL.
Update with docker compose pull && docker compose up -d. The server trusts one proxy
hop (X-Forwarded-For from the tunnel in front of it) for rate limiting. Don't also
publish its port directly to the internet.
Connecting Claude
In claude.ai: Settings → Connectors → Add custom connector, with URL
https://<your public host>/mcp. Claude registers itself, opens the passphrase page,
and once you allow it, the tools show up in claude.ai and the mobile apps.
References
Reverse-engineered API (PHP): https://github.com/alextoft/sureflap
Python client (surepy): https://github.com/benleb/surepy
Local MQTT alternative (PetHubLocal): https://github.com/PetHubLocal/pethublocal
Available Tools
8 toolsget_pet_detailsC
Get raw pet data including microchip tag information
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden. It implies a read ('Get') and hints at unprocessed output ('raw'), but says nothing about permissions, whether it returns a single pet or a collection, rate limits, or the shape of the response.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single, front-loaded sentence with no filler. It is appropriately sized, though the brevity comes at the cost of the missing context noted elsewhere.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No annotations and no output schema, so the description must explain both behavior and return value on its own. It does not say which pet is fetched (there is no input parameter at all), what 'raw' data contains, or what the response looks like — a significant gap for a tool whose entire contract rests on the description.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is nothing for the description to disambiguate; baseline 4 applies. If anything, the absence of any identifier parameter raises a question the description does not answer, but that is not a parameter-semantics failure.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a verb ('Get') and a resource ('pet data') with a scope qualifier ('raw ... including microchip tag information'). However, 'raw pet data' is vague about what is actually returned, and the description never distinguishes this from the sibling get_pet_report or explains why an agent would pick one over the other.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no when-to-use guidance, no prerequisites, and no mention of any alternative. With siblings like get_pet_report and list_pets present, an agent has no basis for routing beyond the surface verb difference.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_pet_reportA
Get aggregated inside/outside activity stats for a pet over a date range - the same data backing the app's activity view. Omitting fromDate/toDate returns the API's default range; per the underlying report endpoint's own warning, an unbounded query can return a very large response, so prefer passing an explicit range.
| Name | Required | Description | Default |
|---|---|---|---|
| petId | Yes | Numeric pet ID (from list_pets) | |
| toDate | No | End date, YYYY-MM-DD. Must be given together with fromDate. | |
| fromDate | No | Start date, YYYY-MM-DD. Must be given together with toDate. |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose non-obvious behavior: the default-range fallback and the warning that an unbounded query can return a very large response. It does not cover permissions/auth requirements or pagination, so it falls short of complete behavioral disclosure for an unannotated tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the purpose, then immediately states the default-range behavior and the size risk in a single tight passage. There is no filler, though the sentence is long and could be split for scanability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With no output schema and no annotations, an agent needs the description to explain return semantics and risk; it covers the aggregation nature and the large-response hazard. It leaves the shape of the aggregation (time bucketing, fields returned) unstated, which is a minor gap.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds real semantics: omitting both date params is valid and triggers a default range, which the schema only hints at via the 'must be given together' wording. It stops short of describing accepted formats beyond what the schema already states.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('Get aggregated inside/outside activity stats for a pet over a date range') and pins down the granularity, which no sibling tool covers. 'The same data backing the app's activity view' further anchors what the tool actually returns, making it easy to separate from get_pet_details or list_devices.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives clear conditional guidance: omitting fromDate/toDate yields the API default range, and an explicit range is preferred. However, it never contrasts this tool with alternatives or states when not to use it, so the guidance is contextual rather than comparative.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_devicesA
List all SurePetcare devices, including live lock state and curfew schedule
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full burden. It usefully discloses what the operation returns (live lock state and curfew schedule), implying a read-only snapshot, but says nothing about authentication needs, pagination, rate limits, or freshness of the 'live' state.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with no filler; the resource is named first and the returned fields are appended as useful scope detail.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a zero-parameter read tool with no output schema and no annotations, the description adequately covers purpose and partial return content. It could say more about output shape or whether all devices are always returned, but nothing essential for invoking it is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to document; the baseline for a parameterless tool is 4. The description's mention of returned data does not change this.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all SurePetcare devices') and adds scope detail (live lock state, curfew schedule), making it easy to distinguish from set_lock_state or rename_device. It does not explicitly contrast with the other read tools like list_pets or get_pet_details, so it falls just short of a 5.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
There is no statement of when to use this tool versus alternatives, no preconditions, and no exclusions. Usage is only implied by the verb 'List' and the sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_petsA
List all pets and their current locations (inside or outside)
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden. It usefully discloses the shape of the returned data (pets plus their inside/outside location), but says nothing about ordering, pagination, freshness, or whether this reflects all devices/locations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single front-loaded sentence with the resource first and the return detail in parentheses. No filler, no redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
No output schema exists, so the description must hint at returns, and it does by naming locations. Given the tool's simplicity (no params, no annotations, no nesting), this is nearly complete, missing only ordering or scope notes.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters, so there is no parameter semantics to document; the baseline of 4 applies. The description correctly adds no param detail because none exists.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List all pets') and even previews the returned content ('their current locations (inside or outside)'). It does not explicitly differentiate itself from siblings like get_pet_details or get_pet_report, though the 'all pets' scope makes the distinction reasonably inferable.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is only implied: an agent can infer this is the enumeration tool for pets versus the single-pet get_pet_details, but the description never states when to use it or names an alternative. For a trivial zero-parameter list tool this is borderline acceptable, but no explicit guidance is given.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
rename_deviceA
Rename a SurePetcare device (e.g. a cat flap). Automatically re-asserts any explicit lock override (0-3) that was active beforehand, since the underlying rename endpoint has been observed to silently reset it to unlocked otherwise.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | New name for the device | |
| deviceId | Yes | Numeric device ID (from list_devices) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden and does so well: it discloses a non-obvious side effect (the underlying endpoint silently resets the lock override to unlocked) and the mitigation (the tool automatically re-asserts any pre-existing override 0-3). This is exactly the kind of hidden behavior an agent needs to know before invoking.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, front-loaded with what the tool does and followed by the critical side-effect caveat. The longer second sentence is dense but every clause (silent reset, automatic re-assertion, value range 0-3) earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter tool with full schema coverage and no output schema, the description covers purpose and the key behavioral caveat. It does not mention whether the updated device is returned or any permission requirements, but nothing essential to calling it correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters (deviceId, name) are already documented, including the pointer that deviceId comes from list_devices. The description adds no additional parameter syntax or format detail, so the baseline of 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (rename) and resource (SurePetcare device, with a concrete example of a cat flap), making it immediately distinguishable from siblings like set_lock_state or list_devices. An agent can identify the operation without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The purpose makes the usage context clear (renaming an existing device identified by deviceId), and the description adds a contextual warning about lock overrides. It does not name explicit alternatives or exclusions, but no sibling competes for this operation, so the guidance is adequate.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_led_modeC
Set the hub's LED ring brightness
| Name | Required | Description | Default |
|---|---|---|---|
| mode | Yes | LED mode: 0 = off, 1 = bright, 4 = dimmed | |
| deviceId | Yes | Numeric device ID of the hub (from list_devices) |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are provided, so the description carries the full behavioral burden, and it discloses almost nothing. It does not say whether the setting persists across reboots, whether it requires the device to be online, whether other LED behavior is overridden, or whether the change is immediate.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short sentence with no filler, and the core action is front-loaded. It is arguably too terse for a tool with two required parameters, but nothing in it is wasted.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The schema fully documents both parameters and there is no output schema to explain, so the minimum bar is met. However, with zero annotation coverage and a write-style operation, the definition leaves the agent without any statement of effect, persistence, or failure conditions.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the enum values are fully documented in the schema (0 = off, 1 = bright, 4 = dimmed), so the baseline is 3. The description adds nothing beyond the schema and its word 'brightness' is a loose gloss on what is actually a mode selector.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (Set) and resource (the hub's LED ring brightness), and the tool is clearly distinct from siblings like set_lock_state and rename_device. The only wrinkle is that the actual parameter is a discrete mode enum (off/bright/dimmed) rather than a continuous brightness level, so the wording slightly undersells what is being set.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The description gives no when-to-use guidance, no prerequisites (e.g., that the hub must be reachable or already paired), and does not reference any alternative sibling tool. An agent must infer all of this from the name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_lock_stateC
Set the lock state of a SureFlap cat flap
| Name | Required | Description | Default |
|---|---|---|---|
| deviceId | Yes | Numeric device ID (from list_devices) | |
| lockState | Yes | Lock state: 0 = unlocked, 1 = locked-in (entry only), 2 = locked-out (exit only), 3 = locked both ways |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations provided, the description carries the full burden of behavioral disclosure, and it falls short. It does not state whether the operation is idempotent, what permissions or device connectivity are required, whether the lock state persists across sessions, or what confirmation is returned. For a state-mutating device command, these are meaningful gaps.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single short, front-loaded sentence with zero wasted words. It is efficient, though its brevity borders on under-specification rather than optimal conciseness.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
The description is too thin for a state-changing device command with no annotations and no output schema. An agent cannot learn from it what a successful call produces, whether the change is immediate or queued, or what errors to expect, leaving the description incomplete relative to the tool's complexity.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the lockState enum values are fully explained in the schema itself (0 = unlocked, 1 = locked-in, etc.). The description adds no parameter meaning beyond the schema, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Set') and resource ('lock state of a SureFlap cat flap'), making the operation immediately identifiable. It does not reference any sibling tool, but none of the listed siblings (list_devices, set_led_mode, set_pet_location, etc.) overlap with lock control, so differentiation is largely unnecessary.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
No guidance is given on when to use this tool versus alternatives, nor any prerequisites beyond what the schema already states. The only implied usage context is the deviceId reference, which comes from the schema, not the description.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_pet_locationA
Manually mark a pet as inside or outside. Useful when a pet was let through a door other than the flap, so its chip was never read and the app's tracked location is stale.
| Name | Required | Description | Default |
|---|---|---|---|
| petId | Yes | Numeric pet ID (from list_pets) | |
| location | Yes | Where the pet actually is |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full burden, and it does disclose that this overrides a stale automatically-tracked location. However, it omits whether the manual value persists, whether it is overwritten by the next chip read, and whether it affects reports or notifications — meaningful gaps for a state-mutating tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two sentences, zero waste, with the action front-loaded and the rationale following. Every sentence earns its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a two-parameter, enum-constrained tool with no output schema, the description covers purpose and the motivating scenario adequately. The remaining gap is behavioral persistence and side effects, which is minor at this complexity but not fully closed.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum is documented, so the schema already defines both parameters fully (petId sourced from list_pets, location constrained to inside/outside). The description adds no syntax, format, or edge-case detail beyond that, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description names a specific verb and resource ('manually mark a pet as inside or outside') and immediately frames it as a manual override of tracked state. It does not explicitly contrast itself with siblings like get_pet_report or get_pet_details, but the action is unambiguous among the listed tools.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It gives a concrete trigger: a pet was let through a door other than the flap, so the chip was never read and the tracked location is stale. That is a clear when-to-use condition. It stops short of naming an alternative (e.g. checking the report first) or stating when not to use it.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
8 tool updates
v0.3.0- First observed
get_pet_details - First observed
get_pet_report - First observed
list_devices - First observed
list_pets - First observed
rename_device - First observed
set_led_mode - First observed
set_lock_state - First observed
set_pet_location
TDQS
Scored across 8 tools
Each tool has a clearly distinct purpose: pet listing/detail/reporting, device listing, lock control, renaming, manual pet location, and LED brightness. The only near-neighbors are list_pets and get_pet_details, but their descriptions separate current location overview from raw chip/tag data. No two tools appear interchangeable.
All tool names use consistent snake_case with a predictable verb_noun pattern: list_pets, get_pet_details, list_devices, set_lock_state, rename_device, set_pet_location, set_led_mode, get_pet_report. The verbs are standard and the noun targets are clear.
Eight tools is a well-scoped set for a SurePetcare integration covering pets, devices, lock state, location correction, LED control, and activity reporting. Each tool has a distinct role and no obvious filler.
The surface covers core pet tracking and device control workflows, including the important rename/lock-state interaction. Minor gaps remain, such as setting curfew schedules or managing pets beyond reading details, but core CRUD-like operations for the apparent domain are mostly present.
Related MCP Connectors
- GentkeyOAuthcom.gentkey
One MCP URL for all your connectors — scoped writes, enforced constraints, and a full audit trail.
An authenticated remote MCP server for user-owned devices and one-shot capability invocation.
Operator-as-agent MCP hub. 6 tools. First $5 free, then $0.001/call.
Related MCP Servers
- AlicenseNot gradedqualityCmaintenanceEnables MCP-capable clients to interact with UniFi Site Manager and UniFi Dream Machine telemetry, providing tools for client details, ISP metrics, and more.4MIT
- AlicenseNot gradedqualityBmaintenanceEnables AI assistants to manage UniFi Network, Protect, and Access infrastructure through MCP tools, with support for local controllers and cloud relay.MIT
- AlicenseNot gradedqualityBmaintenanceEnables OAuth-authenticated access to Garmin account data through MCP, with a read-only web dashboard for monitoring account connections and activity.MIT

opencodewebofficial
FlicenseBqualityCmaintenanceEnables MCP clients to access the GDBx data mesh, DSGx support, and GDMx payments, providing identity resolution, name lookup, API key verification, and fiat-to-crypto checkout tools.8-