Subito Monitoring
Sends direct Telegram notifications for new matching listings from monitored Subito.it searches, with queued delivery that persists across restarts and watch changes.
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., "@Subito Monitoringmonitor ThinkCentre i5 listings under €150 every five minutes"
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.
Subito Monitoring
A single-user, open source Subito.it search and watch service: autonomous polling, SQLite state and delivery queue, direct Telegram notifications, and eight MCP tools for Hermes or any MCP client. No LLM, dashboard, external database or Vinted runtime. MIT licensed; the monitoring core is adapted from Vinted Monitoring with attribution.
Integration status (2026-11-03): limited live validation passed. The production
provider now uses ordinary system curl, which succeeded on macOS and in the Linux
container. Page 2, all four orders, Motori, Immobili, valid empty results and a narrow
Market silent baseline/rescan were checked against actual Subito responses. Chrome
also confirmed page 2 and the site's real ordering URL. No Telegram message was sent;
long-running availability is not guaranteed. See verification.
Subito's terms prohibit automated extraction without permission. Network access is
disabled by default (SM_UPSTREAM_ENABLED=false). Obtain appropriate permission
before enabling it; this switch does not grant permission or bypass a block.
401/403/challenges persistently suspend access until an administrator investigates.
Quick start with Docker
Public image: ghcr.io/alexxanddr/subito-monitoring:latest, Linux amd64/arm64.
Use a version or commit tag for a repeatable deployment; see publishing.
The image includes Python, curl and CA certificates. Chrome is not required.
git clone https://github.com/Alexxanddr/subito-monitoring.git
cd subito-monitoring
cp .env.example .env
# Edit .env privately before starting:
# - replace SM_HTTP_TOKEN with a random secret of at least 32 characters;
# - set both Telegram variables for watches, or leave both unset for search only;
# - set SM_UPSTREAM_ENABLED=true only after reviewing Subito access permission.
chmod 600 .env
docker compose pull
docker compose up -d --no-build
curl --fail http://127.0.0.1:8000/health/readyThe example bearer value is intentionally invalid: startup refuses the unchanged
placeholder. Compose binds HTTP to loopback on port 8000 and mounts a persistent
named volume at /data. Never use docker compose down -v on real state.
Set actual service DNS in SM_ALLOWED_HOSTS before connecting remote MCPHub.
Every MCP call requires the bearer token; health probes contain booleans only.
Readiness proves the polling task is running, not that Subito scans are fresh.
Related MCP server: Avito Monitor MCP
Local installation and development
Python 3.12–3.14, system curl >=8.4, and a local filesystem with POSIX locks
are required (Linux/macOS). On Debian/Ubuntu install curl and ca-certificates;
macOS ships curl, which can be checked with curl --version.
uv sync --frozen --no-editable --extra dev
uv run --no-sync subito-monitoringThe default transport is MCP stdio, state is data/monitor.sqlite3, and Subito
network access is off. Inject environment settings through your supervisor/client;
the local CLI does not automatically load .env. Stdio owns the database until
stdin closes. For Hermes-independent monitoring use supervised HTTP or Compose.
Do not run a second stdio owner alongside the HTTP service on the same database.
To build the image locally instead of pulling the published image:
docker compose up --build -dSee all environment variables and MCP examples and backup, restore, upgrades and troubleshooting.
MCP tools
Tool | Effect |
| Immediate one native page; no watch, state baseline or Telegram send |
| Persistent query, silent initial complete baseline |
| Queries, baseline, errors and last successful scan |
| Replace query or change name/interval; query change resets baseline |
| Change polling; queued deliveries remain |
| Delete watch; retain global history and queued deliveries |
| Freshness, incomplete coverage, suspension and delivery backlog |
“Show the 10 newest ThinkCentre i5 under EUR 150” → search_items:
{"query":{"text":"ThinkCentre i5","section":"market","max_price":"150","order":"newest_first"},"limit":10,"page":1}“Monitor ThinkCentre i5 under EUR 150 every five minutes” → create_watch:
{"name":"ThinkCentre i5","query":{"text":"ThinkCentre i5","section":"market","max_price":"150","order":"newest_first"},"interval_seconds":300}Watches default to 600 seconds, validated 60–604800. Supported query orders:
newest_first, relevance, price_low_to_high, price_high_to_low; watches require
newest_first. Text searches Italy sale listings. section selects market,
motori or immobili; default all combines known supported categories and
excludes Lavoro, including jobs, services and work equipment. marketplace: IT
is the legacy country field, not a Subito section. Motori/Immobili use the observed
category paths; Market/all are filtered locally by the first-party category catalog.
Motori/Immobili and a narrow Market query have limited live validation.
relevance is available for Market/all, not Motori/Immobili.
Price filtering is local:
missing prices are excluded when a range is set. Native pages contain at most 30
ordinary listings; promoted gallery listings are intentionally excluded. A limit
of 1–30 truncates the current native page, and incrementing page skips its unused
remainder. Sparse price matches can return fewer than requested. No individual subcategory,
location, radius, time filters, photos or price-drop alerts in this version.
Reliability and operations
Baseline and associations commit atomically only after reaching an explicit last page within the scan budget and checking the first page for newly arrived IDs. Failures never advance state. IDs are the numeric listing ID validated against its URN and URL; there is no maximum-ID/timestamp heuristic. Global ID/destination history suppresses reposted IDs across overlapping watches; a different ID is new. Baseline records are distinguished from successfully sent messages. Pending sends survive restart, pause, edits and deletion. A crash after Telegram accepted a message but before the SQLite commit can duplicate it: delivery is at least once.
A mutable paginated site is not an exhaustive snapshot. The default scan budget is five native pages plus a first-page check; broad searches may never complete a baseline. Narrow the text query. Downtime can lose ads that disappear before a successful scan; no timestamp recovery window is promised. Process health does not prove scan freshness or Telegram delivery.
Build and check
uv run --no-sync pytest -q
uv run --no-sync ruff check .
uv run --no-sync ruff format --check .
docker build -t subito-monitoring:test .
python3 scripts/container_check.pyPull requests run offline tests, lint, a full-history secret scan, a locked-dependency
export check, and container/volume verification. Pushes to master additionally
build and test native amd64 and arm64 images before publishing the multi-platform
latest and sha-<commit> tags. Release tags publish versioned images only after
the same checks; version tags must match pyproject.toml. CI never contacts Subito
or Telegram and needs no personal registry token.
See publishing and release procedure, verification evidence, and dependency license inventory. This project is unaffiliated with Subito. No cluster, MCPHub or Hermes installation is implied by a public image; those are separate administrator operations.
Available Tools
8 toolscreate_watchB
Create persistent polling independent of Hermes; silent initial complete baseline.
Telegram destination is administrator configured. New IDs only, not price drops. Polling defaults to 600 seconds. Watch queries must use newest_first.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| query | Yes | ||
| interval_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does well: it discloses that the initial baseline is silent (no notification burst on creation), that polling is persistent and independent of the calling process, that the Telegram destination is administrator-configured rather than caller-specified, and what triggers a notification. It omits auth requirements, any cap on concurrent watches, and failure/retry behavior, which keeps it from a 5.
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?
Five short, front-loaded sentences with no filler; the most important behavioral facts (persistence, silent baseline, notification scope) come first. The fragmentary style and the unexplained 'Hermes' reference cost it a point.
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 mutation-style tool with zero annotations and no output schema, the description covers runtime behavior well but leaves the agent guessing about parameter meaning and about what is returned on success (presumably a watch identifier). Adequate but with clear gaps given the 0% schema coverage on a nested-object parameter.
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 0%, so the description must compensate and largely does not. It only addresses 'interval_seconds' (default 600, which the schema already states as a default) and constrains 'query.order' to newest_first — a genuinely new constraint since the enum allows other values. The 'name' parameter and the price/section/currency/marketplace fields of the nested query get no explanation at all.
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 opens with a concrete verb+resource: 'Create persistent polling', and adds scope that separates it from one-shot siblings like search_items ('persistent', 'silent initial complete baseline'). It never names a sibling explicitly, and 'independent of Hermes' is opaque jargon that assumes prior knowledge, so it falls 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?
'New IDs only, not price drops' and 'Watch queries must use newest_first' give the agent real constraints on when this tool is appropriate and how it behaves once active. However, there is no explicit statement of when to choose create_watch over search_items or how it relates to list_watches/update_watch, so usage is only implied.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_watchC
Delete a watch and its seen IDs; retain global deduplication and queued deliveries.
| Name | Required | Description | Default |
|---|---|---|---|
| watch_id | Yes |
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 sometimes delivers: it discloses the real side effect that seen IDs are removed while global deduplication and queued deliveries survive, which is behavior an agent could not infer from the schema. However, it never states whether the deletion is irreversible, what permissions are required, or what happens if the watch_id is unknown.
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 zero filler, split cleanly between what is destroyed and what is preserved. It is arguably too terse for a destructive tool, but every word 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 an irreversible mutation with no annotations, no output schema, and an undocumented required parameter, the description is thin. It omits irreversibility, error semantics, and any hint about prerequisites such as locating the watch_id via list_watches.
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 0%, so the description needs to compensate, but it says nothing about watch_id — not its origin, how to obtain it (e.g., from list_watches), or whether the watch must be paused first. Only the schema's integer type and minimum 1 constrain the argument.
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 and resource ("Delete a watch") and names what is removed alongside it ("its seen IDs"), which distinguishes it from siblings like pause_watch or update_watch. It stops short of explicitly naming those alternatives, so it does not reach the top of the scale.
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 or when-not-to-use guidance at all, even though pause_watch is an obvious softer alternative that an agent might prefer. The agent must infer the delete-versus-pause decision entirely from sibling names.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_watchesB
List persistent searches, baseline state, scan freshness and errors. No credentials.
| 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 discloses that no credentials are required and names some state fields returned, but it does not explicitly state read-only behavior, pagination, ordering, or error-handling semantics; the 'List' verb weakly implies a read operation.
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 short and front-loads the main list action before listing returned state categories. The fragment 'No credentials' is slightly telegraphic but still useful, and there is no wasted wording.
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 list tool with no output schema, the description gives the main return categories but omits result shape, ordering, pagination, and how it relates to sibling read/status tools. It is adequate but leaves gaps an agent would need to infer.
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?
There are zero parameters, so there is no parameter semantics to document. The schema is empty and the description does not need to compensate for missing parameter documentation.
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 uses the verb 'List' with the resource 'persistent searches' and enumerates returned state categories such as baseline state, scan freshness, and errors. It distinguishes the tool from mutation/control siblings like create_watch and pause_watch, though it does not explicitly differentiate it from monitoring_status or search_items.
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 list operation implies its usage, and the phrase 'No credentials' hints at access conditions. However, there is no explicit when-to-use guidance, no exclusion of monitoring_status or search_items, and no prerequisites or routing advice.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
monitoring_statusC
Authenticated scan freshness, errors and persistent Telegram backlog.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
No annotations are supplied, so the description must carry the full behavioral burden. It mentions authentication and the data points checked, but omits whether the tool is read-only, what permissions are required, and whether it triggers external actions such as contacting Telegram.
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 a single compact sentence with no filler, and the three monitored items are front-loaded. The fragment style leaves some ambiguity, but it is not verbose or structurally wasteful.
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 annotations and no output schema, the description should explain the return shape or at least what the status report includes. It lists three signals but leaves the agent unable to interpret freshness thresholds, error format, or backlog semantics.
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 the baseline is 4. The description does not need to explain parameter usage, and the empty schema is sufficient.
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 the monitored signals—scan freshness, errors, and Telegram backlog—so the general purpose is inferable. However, it is a noun phrase with no verb, and 'authenticated scan' is ambiguous without context. It is still distinguishable from the watch-management siblings.
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 explicit guidance on when to use this tool versus alternatives. Usage is only implied by the listed data points, and no exclusions or sibling routing are provided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
pause_watchC
Pause scans; previously queued notifications still deliver.
| Name | Required | Description | Default |
|---|---|---|---|
| watch_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden and does add one useful detail: previously queued notifications still deliver. However, it does not explain the resulting watch state, permissions, reversibility, idempotency, or what happens to scans already in progress.
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 short, front-loaded with the main action, and avoids unnecessary wording. The semicolon cleanly adds the queued-notification behavior, though the term "scans" is slightly ambiguous.
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?
This is a mutation tool with no annotations, no output schema, and an undocumented required parameter. The description mentions one important side effect, but it is not complete enough for an agent to understand the state change, permissions, or recovery path.
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 0%, so the description should compensate by explaining watch_id, but it never mentions the parameter. Its meaning as the identifier of the watch to pause is only inferable from the tool name and schema field name.
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 gives a specific verb, "Pause," but the resource is described only as "scans" rather than clearly as a watch. The watch context is inferable from the tool name and sibling tools, but the description itself does not explicitly tie the action to a watch.
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 explicit guidance about when to use pause_watch versus resume_watch, delete_watch, or update_watch. Usage is only indirectly implied by the verb "Pause."
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
resume_watchC
Resume scans with existing baseline, bounded recovery and ID deduplication.
| Name | Required | Description | Default |
|---|---|---|---|
| watch_id | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations, the description carries the full behavioral burden, and it only gestures at traits via unexplained jargon: 'bounded recovery' and 'ID deduplication' hint that replay is limited and duplicate items are filtered, but no bounds, error behavior, idempotency, or resulting state change is disclosed. Nothing tells the agent what happens if the watch is already running or if the watch_id does not exist.
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?
One front-loaded sentence with no filler or repetition. It loses a point only because the compact phrasing spends its words on unexplained jargon rather than on information the agent can act on.
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?
This is a state-changing operation with no annotations, no output schema, and an undocumented parameter, so the description should do more work. Key facts are missing: preconditions, failure modes, whether resumption is idempotent, and what 'bounded recovery' or 'ID deduplication' concretely mean for the caller.
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 0% and the single parameter watch_id is not mentioned in the description at all. The name is self-explanatory enough to prevent total failure, but the description adds no meaning such as required watch state, expected errors, or what the integer identifies.
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 ('Resume') against the resource implied by the watch family, and the antonym relationship with sibling pause_watch makes the intent readable. The object of the verb is 'scans' rather than 'a watch', which adds slight ambiguity, but an agent can still tell what operation this performs.
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 explicit when-to-use guidance, no statement that the watch must currently be paused, and no naming of alternatives (e.g. create_watch or update_watch for cases where no paused watch exists). The agent must infer the precondition from the tool name alone.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_itemsA
Immediate one-page Italy/EUR search, no watch or Telegram message.
Set section to market, motori or immobili; all (default) excludes Lavoro. Market is filtered locally; Motori/Immobili use category paths. Set order explicitly for the desired ranking (default newest_first). Newest is ordering, not a time filter. Page results can move or repeat. No reliable listing timestamp, exhaustive coverage, or price-drop detection.
| Name | Required | Description | Default |
|---|---|---|---|
| page | No | ||
| limit | No | ||
| query | Yes |
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 substantial work: it discloses local vs. category-path filtering per section, that paginated results can move or repeat, and the absence of reliable timestamps, exhaustive coverage, and price-drop detection. These are exactly the operational caveats an agent needs before trusting results.
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 most important constraint (immediate, one page, no watch) is front-loaded, and each subsequent line adds a distinct caveat rather than repeating. The telegraphic fragment style is dense but slightly reads as notes rather than prose.
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 search tool with no output schema, it covers the behavioral limits (pagination instability, coverage gaps) that would otherwise mislead a caller. It omits any indication of the result shape and the price-filter semantics, which are the remaining gaps.
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 0%, so the description must compensate, and it partially does: it explains section semantics (all excludes Lavoro), the order default, and that ordering is not filtering. It says nothing about min_price/max_price, page, or limit semantics, leaving a meaningful portion of the nested query object undocumented.
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?
"Immediate one-page Italy/EUR search" names a specific verb and a tightly constrained scope, and "no watch or Telegram message" distinguishes it from the sibling family of watch-management tools. It stops short of a crisp one-line statement of what it returns, but an agent can tell what it is for.
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 "no watch" phrasing implies this is the one-shot alternative to create_watch, and it instructs the caller to set section and order explicitly and warns that newest is ordering rather than a time filter. However, it never names an alternative tool or states an explicit when-not-to-use condition, leaving the routing inference implicit.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_watchA
Replace the entire query, or change interval/name. Filter changes reset a silent baseline.
Existing queued notifications are retained. No price-drop or time filter support.
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| query | No | ||
| watch_id | Yes | ||
| interval_seconds | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With no annotations at all, the description carries the full burden and does add real behavioral context: filter changes reset a silent baseline, queued notifications survive the update, and unsupported filter types are called out. It still omits error behavior for an invalid watch_id, whether a name/interval-only change also touches the baseline, and what the call returns.
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?
Four short sentences, front-loaded with the mutation semantics, no filler. The phrase 'silent baseline' is slightly jargon-y but is the key operational detail and is placed early rather than buried.
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 no-annotation, no-output-schema mutation tool with an undocumented nested Query object, the description covers the important side effects but leaves interval units, watch_id validity handling, and response shape unaddressed. Adequate, not complete.
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 0%, so the description must compensate; it correctly conveys that query is a whole-object replacement (not a merge), which is genuinely non-obvious from the schema. But watch_id is never mentioned, and interval_seconds is left without units or the 60–604800 bounds, so the compensation is partial.
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 the three mutable facets (query, interval, name) and makes clear the query is fully replaced rather than patched, which distinguishes it from create_watch. It never states plainly that this modifies an existing watch identified by watch_id, but the verb 'replace' plus the sibling set makes the intent unambiguous.
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 implicitly steers the agent toward create_watch for new watches and away from this tool for price-drop or time-filter needs by declaring those filters unsupported. However, it never names an alternative tool or states a when-not condition (e.g., use pause_watch to suspend rather than editing), so the routing guidance is only implied.
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.1.0- First observed
create_watch - First observed
delete_watch - First observed
list_watches - First observed
monitoring_status - First observed
pause_watch - First observed
resume_watch - First observed
search_items - First observed
update_watch
TDQS
Scored across 8 tools
list_watches and monitoring_status both report freshness/errors, creating some overlap, though one is explicitly unauthenticated and the other is authenticated with Telegram backlog. search_items is clearly immediate versus persistent watches, and pause/resume/update/delete are distinct lifecycle actions.
Seven of eight tools follow a clear verb_noun pattern: list_watches, pause_watch, search_items, create_watch, update_watch, resume_watch, delete_watch. monitoring_status breaks the verb pattern as a noun phrase, but the overall convention remains readable and predictable.
Eight tools is well-scoped for this domain, covering the full watch lifecycle, status inspection, and an immediate search path. Each tool has a clear role without obvious bloat.
The surface covers create/list/update/delete plus pause/resume and status for persistent searches, and list_watches exposes baseline and freshness state. A dedicated get_watch by ID is absent, but it is a minor gap agents can work around via list_watches.
Maintenance
Related MCP Connectors
Your own WhatsApp as an MCP server: read, search and send from any MCP client.
Hosted Telegram MCP server for Claude, ChatGPT and Cursor, with each action switched per account.
Remote streamable-HTTP MCP server running on a single Cloudflare Worker. Your assistant gets live Airbnb, Amazon, Booking.com, Google Flights, Maps and Reddit data, social search on X, Instagram and TikTok, the Meta Ad Library, and image/video generation without any keys. Connect your own accounts to let it send WhatsApp or Telegram messages, work an IMAP inbox, manage Meta Ads campaigns and publish to X and LinkedIn. OAuth 2.1 with PKCE; stored credentials are AES-256-GCM encrypted.
Telegram bridge for your MCP-compatible agent. Bidirectional, no LLM in our stack.
Related MCP Servers
- FlicenseNot gradedqualityBmaintenanceAn MCP server that connects to a Telegram group chat, persists messages to a local SQLite database, and exposes tools to search, retrieve, and send messages via SSE.-
- FlicenseNot gradedqualityDmaintenanceA remote MCP server that searches Avito for new classified ads, filtering by price and returning only previously unseen listings. Designed for scheduled monitoring via ChatGPT tasks.-
- FlicenseNot gradedqualityDmaintenanceCaches Telegram channel posts locally in SQLite and exposes them via MCP tools for querying and management.-
- FlicenseAqualityDmaintenanceLocal SQLite archive and MCP search service for the Telegram channel @markettwits, enabling users to query asset-specific twits by instrument and time range.1-