listam-mcp
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., "@listam-mcpFind 2-room apartments for rent in Arabkir under $700"
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.
listam-mcp
An MCP server for list.am, Armenia's largest classifieds site. It lets Claude (or any MCP client) search listings in every category, read full ad details and track saved searches for new ads.
Unofficial project, not affiliated with list.am. list.am has no public API, so this server reads the public website. Use it for personal, low-volume purposes and respect list.am's Terms of Service.
What you can ask
"Find 2-room apartments for rent in Arabkir under $700 a month, owners only, and compare the best five."
"Search for a used iPhone 15 under 350,000 AMD and tell me which ads look like the best deal."
"Save this search as
kentron-rentand tell me tomorrow what's new.""Open ad 24201365 and summarize the pros and cons."
Related MCP server: ss-ge-mcp
Tools
Tool | Description |
| Search any category by text, category, region and price (AMD/USD/EUR/RUB), optionally excluding agencies. Returns compact rows by default; pass |
| Run a search URL copied from the browser, keeping every filter list.am supports. |
| A category's own filters (condition, rooms, mileage, transmission...) and their values, for |
| Full details of an ad: price, attributes, description, seller, images, posted/renewed dates. |
| Full details of several ads in one call (fetched one at a time, throttled) — for checking a handful of candidates at once. |
| Discover category IDs (top level, or the subcategories of a category). |
| Save a search and later get only the listings that are new since the last check. |
| Manage saved searches (stored in SQLite). |
Tip: get_filters(category_id) returns each category's own filters (rooms, floor, mileage, renovation...) and the param/value to pass in search_listings' extra_params. A multi: true filter accepts more than one value on list.am, but extra_params can only set one value per key — for more than one, apply the filter on list.am in a browser and use search_by_url or save_search with the resulting URL.
Installation
Requires Python 3.10+. The easiest way is uv, which runs the server straight from GitHub:
uvx --from git+https://github.com/<your-username>/listam-mcp listam-mcp --helpOr install it locally:
git clone https://github.com/<your-username>/listam-mcp
cd listam-mcp
pip install -e .Claude Desktop
Add this to claude_desktop_config.json (Settings → Developer → Edit Config) and restart Claude:
{
"mcpServers": {
"listam": {
"command": "uvx",
"args": ["--from", "git+https://github.com/<your-username>/listam-mcp", "listam-mcp"]
}
}
}Claude Code
claude mcp add listam -- uvx --from git+https://github.com/<your-username>/listam-mcp listam-mcpRemote (HTTP) mode
listam-mcp --transport streamable-http --host 127.0.0.1 --port 8000
# MCP endpoint: http://127.0.0.1:8000/mcpConfiguration
All settings are optional environment variables:
Variable | Default | Meaning |
|
| Site language: |
|
| Minimum seconds between requests to list.am. |
|
| Seconds to cache fetched pages. |
|
| HTTP timeout in seconds. |
|
| Retries (with growing backoff) after a 403/429 before giving up. |
|
| Approximate AMD per currency unit, used for cross-currency price filters. |
|
| Where the saved-search database lives. |
| browser-like UA | User-Agent header. |
Development
pip install -e ".[dev]"
pytest
ruff check .
# Debug commands hit the live site and print JSON — handy when list.am changes its HTML:
listam-mcp search "iphone 15"
listam-mcp search --category 56
listam-mcp get 24201365
listam-mcp categoriesYou can also explore the tools interactively with the MCP Inspector:
npx @modelcontextprotocol/inspector listam-mcpHow it works
src/listam_mcp/
├── server.py # MCP tools + CLI entry point
├── client.py # async HTTP client: rate limiting, caching, list.am-only URL guard
├── parsing.py # HTML → data models (the only place that knows the page layout)
├── storage.py # SQLite for saved searches and seen listing IDs
├── models.py # dataclasses returned by tools
└── config.py # environment-based settingsThe parser relies on stable signals (/item/<id> and /category/<id> links, <h1>, og: meta tags and visible text) rather than CSS class names. Each listing also carries its raw card text and attribute lines, so the model can still read the data if a heuristic misses a field. When list.am changes its layout, update parsing.py, refresh the fixtures in tests/fixtures/ and run the tests.
Responsible use
Requests are serialized and throttled, and results are cached.
Only
list.amURLs can be fetched, so the tools can't be used to reach other hosts.Don't use it for bulk data collection, reselling data or contacting sellers at scale.
License
Available Tools
10 toolscheck_saved_searchA
Return listings that appeared since the last check of a saved search.
The first check records a baseline and returns everything currently listed.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes | ||
| max_pages | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
With only openWorldHint in annotations, the description carries most of the burden and does disclose the key non-obvious trait: this tool is stateful, and the first invocation behaves differently (baseline + full return) from subsequent ones. It omits anything about pagination limits or failure modes for unknown names, so it stops short of full coverage.
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 short sentences, front-loaded with the core behavior and followed by the one edge case that would otherwise surprise a caller. No filler, no restatement of the tool name.
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?
An output schema exists, so return-value detail is rightly omitted, and the stateful first-check behavior is covered. However, for a tool whose schema is entirely undocumented, leaving max_pages and the meaning of 'name' unexplained is a real gap an agent would hit at invocation time.
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% for both parameters. The description never mentions the required 'name' parameter or explains that it identifies the saved search, and 'max_pages' (default 2, max 5) is completely unaddressed despite directly governing result volume. A 0%-coverage schema needed the description to compensate and it does not.
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 ('Return listings') scoped to a saved search's check history, which cleanly separates it from siblings like search_listings, get_listings, and list_saved_searches. It does not name an alternative explicitly, but the resource qualifier does the differentiation work.
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 first-check semantics ('records a baseline and returns everything currently listed') give useful implied guidance about state and expected results, but there is no explicit when-to-use versus search_listings/get_listings, nor any prerequisite about the saved search needing to exist first.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_saved_searchBDestructive
Delete a saved search and its seen-listing history.
| Name | Required | Description | Default |
|---|---|---|---|
| name | Yes |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
The destructiveHint annotation already flags this as a mutating operation, but the description adds real value by disclosing the cascading effect: the associated seen-listing history is also deleted. It does not state whether the deletion is reversible or requires special permissions, so it stops short of 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?
A single tightly worded sentence that front-loads the action and includes the cascade effect without padding. No wasted clauses, though it is very sparse.
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?
An output schema exists, so return-value detail is unnecessary, and the destructive annotation plus the cascade disclosure cover the key behavioral risk. The remaining gap is the unnamed/unexplained parameter and the absence of any irreversibility or error-condition context.
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 single parameter 'name' has 0% schema description coverage and the description never clarifies that it is the saved search's name, whether it is case-sensitive, or what happens on a mismatch. With low coverage, the description should compensate and does not.
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 (delete) and resource (saved search) plus an important secondary effect (seen-listing history). It is clearly distinguishable from save_search, check_saved_search, and list_saved_searches, though it never explicitly names a sibling for differentiation.
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?
"Delete" implies the use case, but there is no guidance on when to use this versus check_saved_search or list_saved_searches, no prerequisites, and no warning about conditions under which deletion should be avoided.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_filtersARead-only
List a category's own filters (condition, rooms, mileage, transmission...) and their values.
Each filter's param is a key to set in search_listings' extra_params (or in a
URL for search_by_url/save_search). A "select" filter takes one of options'
values. A "range" filter instead has a param/to_param pair for the from/to
bounds (e.g. floor-from, floor-to) and no options. A multi: true filter accepts
more than one value on list.am, but extra_params can only set one value per key;
for more than one, apply the filter on list.am in a browser and use search_by_url.
| Name | Required | Description | Default |
|---|---|---|---|
| category_id | Yes | Category ID from list_categories. Works best on a leaf category (e.g. 'Passenger Cars', not 'Vehicles'). |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already cover read-only and open-world behavior. The description adds substantial context beyond that: filter types (select, range, multi), the param/to_param pairing for range filters, and the limitation that extra_params can only set one value per key, requiring a browser workaround for multi-value filters.
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 dense and front-loaded: purpose first, then the mechanics of filter types and downstream usage. Every sentence earns its place, with no redundant or vague phrasing.
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?
Given a read-only list tool with an output schema and annotations, the description fully equips an agent to call it and use the results. It explains filter structure, the param mechanism, and special cases like multi-value filters, leaving no critical gaps for correct invocation.
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 the single category_id parameter is already documented in the schema. The main description does not add further meaning or formatting details for this parameter, so baseline 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?
States a specific verb and resource: 'List a category's own filters ... and their values.' It also distinguishes itself from siblings by explaining that filter params are used in search_listings' extra_params or in a URL for search_by_url/save_search.
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?
Explains the context for using the tool: filter params feed into search_listings, search_by_url, or save_search. It also gives a clear alternative for multi-value filters (use browser + search_by_url). However, it does not explicitly state when to use get_filters versus list_categories or get_listings.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listingARead-only
Get full details of one listing: price, attributes, description, seller, images, dates.
| Name | Required | Description | Default |
|---|---|---|---|
| item | Yes | Listing ID (e.g. '24201365') or full list.am item URL. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the read-only, external-fetch nature is covered. The description adds the list of returned facets, which is useful, but says nothing about auth requirements, rate limits, or error behavior for a missing listing.
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 tightly written sentence that front-loads the verb and resource and then lists the payload. No filler, no redundancy with the schema.
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 an output schema carrying return values and annotations covering the safety profile, the description only needs to convey purpose and scope, which it does. The only omission is any routing guidance versus the many sibling listing tools.
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 single 'item' parameter is already documented as a listing ID or full URL. The description adds no syntax, format, or lookup detail beyond the schema, 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?
States a specific verb ('Get') plus resource ('one listing') and enumerates the returned content (price, attributes, description, seller, images, dates). The singular 'one listing' implicitly distinguishes it from the sibling get_listings, but the description never names that sibling explicitly.
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 by 'one listing' – an agent can infer this is for fetching a single known listing rather than searching. No explicit when-to-use, when-not, or pointer to siblings like search_listings or get_listings, so guidance is thin.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listingsARead-only
Get full details of several listings in one call (fetched one at a time, throttled).
Use this to check a handful of candidates from a search instead of calling get_listing repeatedly.
| Name | Required | Description | Default |
|---|---|---|---|
| items | Yes | Listing IDs or URLs, e.g. from a search result. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds genuinely new operational context: items are 'fetched one at a time, throttled', which warns the agent about latency/rate behavior. It does not, however, say what happens on partial failure or invalid IDs.
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 short sentences with zero filler; the scope statement comes first and the usage rule second. Every clause 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 one-parameter batch read with an output schema, the description supplies the usage rule and the throttling caveat, which is everything an agent needs. Return-shape explanation is correctly omitted since an output schema exists.
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 single parameter is fully documented in the schema ('Listing IDs or URLs, e.g. from a search result'), so the description adds no syntax or format detail beyond the word 'listings'. Baseline 3 applies when the schema carries the semantics.
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 ('Get full details of several listings') plus the batching scope ('in one call'), which cleanly separates it from the singular sibling get_listing. An agent can pick it without inspecting 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?
Explicitly names the alternative it replaces ('instead of calling get_listing repeatedly') and the triggering condition ('check a handful of candidates from a search'), so the selection rule is unambiguous.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_categoriesARead-only
List list.am categories (ID and name). Pass a category_id to see its subcategories.
| Name | Required | Description | Default |
|---|---|---|---|
| category_id | No | Parent category ID. Omit for the top-level categories. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, covering the safety and network profile. The description adds the hierarchical listing behavior but says nothing about pagination, limits, or return ordering. Adequate but not rich.
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 short sentences, the core listing behavior front-loaded and the parameter effect second. Zero wasted words.
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?
An output schema exists so return values need no explanation, and the tool has a single optional parameter. The description covers what is listed and how the parameter alters scope; only minor operational details (ordering, item limits) are absent.
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 goes beyond the schema field text by explaining that a category_id switches the call from top-level categories to that category's subcategories, clarifying the semantic effect of the parameter.
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 (List) and resource (list.am categories) and even states what is returned (ID and name). No sibling tool handles categories, so an agent can select this 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?
It gives a clear conditional: pass a category_id to get subcategories, omit it implicitly for top-level. There is no explicit when-not or named alternative, but the sibling set contains no competing category tool, so the guidance is sufficient for correct invocation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_saved_searchesBRead-only
List saved searches with their last check time.
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
| result | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
readOnlyHint=true already tells the agent this is a safe read, so the bar is lower. The description adds the useful detail that each entry carries a last check time, but says nothing about ordering, volume, or whether unchecked searches are included.
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 or redundancy. It is appropriately sized for a simple read tool, though it is terse enough that nothing beyond the bare minimum is conveyed.
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?
An output schema exists, so return-value detail need not be repeated here, and with zero parameters there is little else to cover. The definition is complete enough to call correctly, missing only routing guidance relative to its siblings.
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; there is nothing for the description to disambiguate. Schema coverage is 100% and the empty argument object matches the description's no-argument framing.
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+resource (list saved searches) and adds the returned attribute (last check time). It does not distinguish itself from siblings like check_saved_search or get_listings, which is where a 5 would require explicit differentiation.
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 indication of when to use this versus the closely related check_saved_search, save_search, or delete_saved_search siblings, and no prerequisites or exclusions are given. Usage must be inferred entirely from the name.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
save_searchC
Save a search so check_saved_search can report only new listings later.
| Name | Required | Description | Default |
|---|---|---|---|
| url | No | list.am search URL. Alternatively pass query/category_id/region_id. | |
| name | Yes | Short unique name, e.g. 'arabkir-2room'. | |
| query | No | ||
| region_id | No | ||
| category_id | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output 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 for a state-creating operation, yet it only states the end goal. It omits whether saving is idempotent, what happens on a duplicate name (the schema calls name 'unique' but the description never addresses collisions), whether the record persists server-side, and what errors can occur.
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, and the purpose is stated before the mechanism. It is efficient, though arguably too terse for a five-parameter creation tool.
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?
An output schema exists, so return values need not be described, but for a 5-parameter mutation with no annotations and 40% schema coverage the description is too thin. It never covers the alternative parameter modes, name uniqueness behavior, or failure cases.
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 only 40%: url and name are documented, but query, region_id, and category_id are bare. The description adds nothing about parameters and does not explain the two mutually exclusive input modes (a full URL vs. query/category_id/region_id) that the schema only hints at in the url field.
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+resource ('Save a search') and adds the downstream purpose (enabling check_saved_search to report only new listings), which distinguishes it from sibling read tools like search_listings and list_saved_searches. It stops short of explicitly contrasting with the other save/delete siblings, but the intent is 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?
Usage is implied through the causal link to check_saved_search ('so check_saved_search can report only new listings later'), which tells the agent when this tool matters. There is no explicit when-not guidance, no mention of prerequisites, and no statement about what to do if the search already exists.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_by_urlARead-only
Fetch results for an existing list.am search URL, keeping all its filters.
| Name | Required | Description | Default |
|---|---|---|---|
| url | Yes | A list.am search/category URL, e.g. copied from the browser with filters applied. | |
| full | No | Return every field instead of compact rows. | |
| limit | No | ||
| max_pages | No |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so safety and external-access profile are covered. The description adds one useful behavioral fact — filters in the URL are preserved — but says nothing about pagination (limit/max_pages), row compaction, or failure behavior on malformed URLs.
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 short sentence, front-loaded with the action and resource, and every word earns its place. No redundancy with the schema or annotations.
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?
An output schema exists, so return values need not be explained, and annotations cover the read/open-world profile. Still missing are pagination semantics for limit and max_pages and any hint about how URL-embedded filters interact with those caps, which matters for a 4-parameter tool.
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 50%: url and full are documented, while limit and max_pages have no descriptions anywhere. 'Keeping all its filters' reinforces what the url parameter does, but the description does not compensate for the two undocumented pagination parameters.
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 (fetch) and resource (results for a list.am search URL) and adds the key qualifier 'keeping all its filters', so an agent understands this replays a saved URL rather than building a new query. It does not name search_listings as the alternative, but the URL-driven distinction is evident.
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 existing list.am search URL' tells the agent it needs a ready-made URL, which implies this is for replaying a search rather than constructing one. It never states when to prefer this over search_listings or get_listings, nor what happens without a valid list.am URL.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
search_listingsARead-only
Search list.am listings in any category.
Price filters are applied locally to the fetched pages using approximate exchange rates, so fetch more pages when filtering heavily.
| Name | Required | Description | Default |
|---|---|---|---|
| full | No | Return every field (images, seller badges, raw card text) instead of compact rows. | |
| page | No | Result page to start from (only with category_id). | |
| limit | No | Max listings to return. | |
| query | No | Free-text search, e.g. 'iphone 15' or 'toyota camry'. | |
| currency | No | Currency of price_min/price_max: AMD, USD, EUR or RUB. | AMD |
| max_pages | No | How many result pages to fetch (each ~1.5s). | |
| price_max | No | Maximum price in `currency`. | |
| price_min | No | Minimum price in `currency`. | |
| region_id | No | list.am location ID. Yerevan districts: {'Ajapnyak': 2, 'Arabkir': 3, 'Avan': 4, 'Davtashen': 5, 'Erebuni': 6, 'Kanaker-Zeytun': 7, 'Kentron': 8, 'Malatia-Sebastia': 9, 'Nor Nork': 10, 'Nork-Marash': 11, 'Nubarashen': 12, 'Shengavit': 13}. | |
| category_id | No | list.am category ID from list_categories. Omit to search all categories. | |
| extra_params | No | Raw list.am URL query params. See get_filters for a category's own filters. | |
| exclude_agencies | No | Drop ads marked as posted by an agency. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already establish readOnlyHint=true and openWorldHint=true. The description goes beyond that by disclosing that price filters are applied locally with approximate exchange rates — a non-obvious behavioral trait that explains result imperfection and motivates max_pages tuning.
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 tight sentences, purpose front-loaded, followed immediately by the one caveat that changes how an agent should call it. No filler.
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?
An output schema exists, so return values need no explanation, and all params are documented in the schema. The description covers the key non-obvious behavior; only sibling routing is missing for a 12-param open-world search tool.
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 the schema already documents all twelve parameters thoroughly. The description reinforces the price_min/price_max semantics by explaining local application and approximate rates, but adds no format or syntax detail. 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?
States a specific verb and resource ('Search list.am listings') plus scope ('in any category'), so the agent knows exactly what it does. However, it never distinguishes itself from the sibling get_listings or search_by_url, which an agent facing nine sibling tools would need.
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 implies when to use it via the note about fetching more pages when filtering heavily, which is actionable operational advice. But there is no explicit when-not guidance or any routing to alternatives such as search_by_url or get_filters.
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.
10 tool updates
v0.1.0- First observed
check_saved_search - First observed
delete_saved_search - First observed
get_filters - First observed
get_listing - First observed
get_listings - First observed
list_categories - First observed
list_saved_searches - First observed
save_search - First observed
search_by_url - First observed
search_listings
TDQS
Scored across 10 tools
Tools are largely distinct by resource+action. The main potential confusion is between get_listing and get_listings, and between search_listings and search_by_url, but descriptions explicitly clarify when to use each (bulk vs single, native filters vs existing URL).
All tools use a consistent snake_case verb_noun pattern (get_listing, list_categories, save_search, delete_saved_search, etc.). Singular/plural variants are intentional and clear.
Ten tools is well-scoped for a listing-site client: search, detail retrieval, metadata helpers, and saved-search lifecycle. Each tool maps to a distinct user workflow without excess.
The surface covers search (two modes), listing details (single and bulk), categories, filters, and saved-search CRUD. Minor gap: no direct way to update an existing saved search's parameters (must delete and recreate), but core read workflows are complete.
Maintenance
Related MCP Connectors
Search Meta, Google Ads, LinkedIn, and TikTok ad libraries plus creative analysis via MCP.
AI-agent-first offers directory: search and publish listings via MCP.
Public Data Ukraine Mcp connects AI agents to real public APIs via MCP. Tools include
APIs and MCP for structured public data, web research, CAPTCHA, and source-bound data cleanup.
Related MCP Servers
- AlicenseNot gradedqualityDmaintenanceA read-only MCP server that gives LLM agents live access to OpenSooq, the largest classifieds marketplace in Kuwait, enabling search, pricing, seller reputation, and deal finding.2MIT
- AlicenseAqualityCmaintenanceEnables searching and browsing ss.ge real estate listings with filters, counters, full card details, and geo/city data via MCP tools.645 npmMIT
- AlicenseAqualityCmaintenanceEnables querying livo.ge real estate listings through MCP, including search, listing details, geo lookups, reference dictionaries, and new development projects.710 npmMIT
- AlicenseAqualityCmaintenanceEnables searching Moldova's largest classifieds board from an AI client without an account or API key, covering listings such as apartments, cars and phones with category, filter, price and currency controls. Also retrieves full ad details, photos as visible images, seller profiles and phone numbers, dependent options like city sectors or car models, and 999.md's own price statistics.48MIT