Skip to main content
Glama

armut-mcp 🇹🇷

mcp-name: io.github.mohammad-abbasi-sh/armut-mcp

Unofficial read-only MCP server for armut.com, Türkiye's local-services marketplace — search 6,759 services (cleaning, moving, repairs, lessons and more), browse top professionals with ratings and reviews, read service FAQs, and get price guides with 12 months of average prices and real quote examples.

Built by Mohammad Abbasi as part of the "Turkey MCP factory" (Sepehr-style pipeline). Not affiliated with armut.com.

For AI agents

Add to your MCP client config (stdio):

{
  "mcpServers": {
    "armut": {
      "command": "uvx",
      "args": ["armut-mcp"]
    }
  }
}

Or run locally: python -m armut_mcp.server (needs mcp<2, httpx).

Related MCP server: RapidAPI Marketplace API MCP Server

Tools

Tool

Description

armut_search_services

Search the 6,759-service catalogue by keyword — query ("temizlik", "nakliyat", "boyaci"), Turkish letters fine; returns slug, service_id, price-guide and service-page URLs

armut_service_detail

Detail of one service (slug e.g. "ev-temizligi"): name, description, pro count, average rating, review count, service_id

armut_list_pros

Top professionals for a service: name, city/district, member since, bio, rating, review count, profile URL; city ("istanbul") filters to that city; limit 1..40

armut_service_faq

Frequently asked questions for a service, with answers

armut_price_guide

Price guide for a service: page-listed min/max price (TRY), 12 months of average/min/max prices with quote counts, total quotes, pro count, rating, real example jobs with winning prices, recent reviews; city ("adana") for that city's guide

armut_trending_services

What's popular right now: service groups, trending/popular services with pro counts and ratings, most-searched city+service combos

Example output (armut_search_services / "temizlik"):

{"query": "temizlik", "count": 10, "services": [
  {"slug": "ev-temizligi", "name": "Ev Temizligi", "service_id": 191,
   "price_url": "https://armut.com/fiyatlari/ev-temizligi_191",
   "service_url": "https://armut.com/ev-temizligi"}, …]}

Example output (armut_service_detail / "ev-temizligi"):

{"name": "Ev Temizliği", "service_id": 191, "pro_count": 10141,
 "rating_average": 4.6, "review_count": 415591,
 "description": "Güvenilir Ev Temizliği hizmeti al, zaman kazan, garantide ol. …",
 "url": "https://armut.com/ev-temizligi"}

Example output (armut_list_pros / "ev-temizligi", istanbul, 1):

{"service": "Ev Temizliği", "city": "istanbul", "count": 1, "pros": [
  {"name": "Nermin K.", "location": "Şişli, İstanbul", "since": "…",
   "bio": "…", "rating": 4.1, "review_count": 162,
   "profile_url": "https://armut.com/hizmetveren/…"}]}

Example output (armut_price_guide / "ev-temizligi", adana):

{"service": "Ev Temizliği", "service_id": 191, "city": "Adana",
 "currency": "TRY", "min_price_try": 479, "max_price_try": 1024,
 "quote_count": 790, "pro_count": 433, "rating_average": 4.6,
 "monthly_average_try": [
  {"month": "2025-11", "avg_try": 2756.39, "min_try": 1763,
   "max_try": 3806, "quotes": 88}, …]}

Notes:

  • Data comes from armut.com's public server-rendered pages (schema.org Product/ItemList/FAQPage JSON-LD on service pages, __NEXT_DATA__ on the homepage and price-guide pages, the public price sitemap) — no key, no login, read-only.

  • Turkish -lik nouns surface as -ligi in slugs ("temizlik" → "ev-temizligi"); the search handles that, so a plain "temizlik" query finds "ev-temizligi".

  • The page-listed min/max price and the 12 monthly averages come from different page fields; the monthly averages (with quote counts) are the more reliable price signal.

  • Requests are spaced ~0.8s apart to stay polite.

  • Environments behind an MITM proxy: set SSL_CERT_FILE to a CA bundle that trusts the proxy.

Development

python3 -m venv .venv && .venv/bin/pip install "mcp<2" httpx pytest
.venv/bin/pip install -e .
.venv/bin/python -m pytest tests/ -q
  • tests/test_services.py — offline, parses real captured fixtures (29 tests)

  • tests/test_live.py — 8 cautious live requests against armut.com (needs SSL_CERT_FILE behind the lab proxy)

License

MIT

Available Tools

6 tools
armut_list_prosA

Top professionals for a service, with name, city/district, member since, bio, rating and review count, profile URL. service_slug: e.g. "ev-temizligi"; city: optional slug like "istanbul" to filter pros to that city; limit: 1..40 (the page lists up to 40).

NameRequiredDescriptionDefault
cityNo
limitNo
service_slugYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.7/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden; it does at least imply a read-only browse operation and discloses an important behavioral bound ('the page lists up to 40', limit 1..40), which prevents pointless limit values. It does not cover pagination beyond the single page, whether results are ranked by rating, rate limits, or whether an unknown city returns empty versus error.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

It is a single dense paragraph with the resource description front-loaded and semicolon-separated per-parameter notes, so an agent can scan it quickly with zero filler sentences. The only waste is the enumerated list of return fields, which duplicates information already carried by the output schema.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness5/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a three-parameter list tool with an output schema, the description covers the resource, all three parameters with examples and bounds, and the page-size limit. Return values are covered by the output schema, so the field listing is a bonus rather than a necessity; nothing needed to call the tool correctly is missing.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 does for all three params: service_slug gets a concrete example, city is marked optional with a slug example ('istanbul'), and limit gets an inclusive range tied to the underlying page size. The remaining gap is that the schema default of 10 for limit is not restated and there is no note on whether city accepts display names versus slugs only.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource and scope: 'Top professionals for a service', and enumerates the returned fields (name, city/district, bio, rating, review count, profile URL). This is clearly distinct from the sibling tools (search_services, service_detail, faq, price_guide, trending_services), which all operate on services rather than professionals, although the description never names those alternatives explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied rather than stated: 'Top professionals for a service' plus an optional city filter tells an agent roughly when this fits, and the service_slug example ('ev-temizligi') shows the expected input style. There is no explicit when-to-use or when-not-to-use guidance, no mention of alternatives for city-wide browsing, and no statement about what happens when the city has no matching pros.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

armut_price_guideA

Price guide for a service: page-listed min/max price (TRY), 12 months of average/min/max prices with quote counts, total quotes and pro count, average rating, real example jobs with winning prices, and recent customer reviews. service_slug: e.g. "ev-temizligi"; city: optional slug like "adana" for that city's guide (default: all Türkiye).

NameRequiredDescriptionDefault
cityNo
service_slugYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden; it does disclose key behavioral facts an agent needs — currency (TRY), the 12-month window, the national default when city is omitted, and the shape of the returned data. It does not address whether data is cached/live, any rate limits, or error behavior for an invalid slug, so the read-only safe-lookup profile has to be inferred.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with no filler; the payload contents are front-loaded and the parameter guidance is appended where an agent looks for it. The dense enumeration is long but each item conveys distinct returned data, so it earns its space.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

Both parameters are explained despite zero schema coverage, and an output schema exists so return values need not be spelled out — yet the description still summarises them usefully. The remaining gap is sibling differentiation, which matters given four other armut_* tools that could plausibly return price or pro information.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 largely does: it gives a concrete service_slug example ('ev-temizligi') and explains that city is an optional slug ('adana') defaulting to all of Türkiye. The only shortfall is that it does not say how to obtain a valid slug or what happens if one is wrong.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description states a specific resource — a price guide for a service — and enumerates exactly what it contains (page-listed min/max price in TRY, 12-month averages with quote counts, pro count, rating, example jobs, reviews). That is well beyond a restatement of the name, but it never explicitly contrasts itself with siblings such as armut_service_detail or armut_list_pros, which likely overlap on pricing and pro data.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines3/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

Usage is implied by the content list plus the city default ('default: all Türkiye'), which tells an agent how to get national vs city-level results. There is, however, no explicit when-to-use guidance and no statement of when another sibling tool would be the better choice.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

armut_search_servicesA

Search Armut's service catalogue (6,759 services) by keyword. query: Turkish or ASCII, e.g. "temizlik", "nakliyat", "boyaci" — matches service names/slugs; returns slug, service_id, price-guide URL and service-page URL for each match (use the slug with the other tools).

NameRequiredDescriptionDefault
limitNo
queryYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.6/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations, the description carries the full behavioral burden. It does disclose matching semantics (Turkish or ASCII input, matches names/slugs rather than descriptions) and enumerates returned fields, which is useful context. It says nothing about limit behavior, result ranking, case/diacritic handling, or pagination, which an agent needs to invoke it predictably.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

A single compact block, front-loaded with the action and resource, then query semantics, then return shape. Every clause carries information; the only cost is density — the return-value parenthetical is packed into the same run-on sentence rather than separated.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

An output schema exists, so the description did not need to enumerate return fields (though it helpfully does). It covers the hard part — multilingual query matching — and its only real omission is `limit`, which leaves the agent guessing about result-size control for a 6,759-item catalogue.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

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 handles `query` well (language/encoding tolerance, concrete Turkish examples, what the string is matched against) but leaves `limit` completely unexplained — no mention of its default of 10 or its effect on result volume.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

Names a specific verb and resource ('Search Armut's service catalogue ... by keyword') and scopes it with the catalogue size and matching target (service names/slugs). It also signals the entry-point role ('use the slug with the other tools'), which implicitly separates it from armut_service_detail and armut_price_guide, though no sibling is named explicitly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

'Use the slug with the other tools' tells the agent this is the starting point of a workflow, which is genuine when-to-use guidance. It stops short of stating when NOT to use it — e.g. browsing by popularity (armut_trending_services) or when a slug is already known — so there is no explicit alternative routing.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

armut_service_detailA

Detail of one service: name, description, pro count, average rating and review count, service_id (needed for the price guide). service_slug: e.g. "ev-temizligi" (find slugs with armut_search_services).

NameRequiredDescriptionDefault
service_slugYes

Output Schema

NameRequiredDescription
resultYes

TDQS

A3.8/5.0
Behavior3/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

With no annotations supplied, the description carries the full burden. It does useful work by disclosing the returned fields and the downstream dependency on service_id, and read-only behavior is implied by 'detail'. However, it says nothing about authentication, rate limits, failure modes for invalid slugs, or whether a single record is always returned.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two sentences, front-loaded with what the tool returns and followed by the single parameter's meaning and discovery path. No filler; the parenthetical about the price guide earns its place by linking to a sibling workflow.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness4/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

For a one-parameter read tool with an output schema, this is nearly complete: the description covers purpose, the parameter's format, and its role in the broader workflow, so the output schema handles return structure. Only edge-case behavior for invalid or missing slugs is left unaddressed.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters4/5

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 does: it explains that service_slug is a slug string, provides a concrete format example ('ev-temizligi'), and tells the agent where to find valid values. It does not specify error behavior for unknown slugs, but the semantic gap is largely closed.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose4/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description opens with a specific verb-and-resource: fetching the detail of one service, and enumerates exactly which fields come back (name, description, pro count, rating, review count, service_id). It also implicitly distinguishes itself from armut_search_services, which it names as the lookup path for slugs, though it never states the sibling boundary directly.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines4/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

It gives concrete workflow context by naming armut_search_services as the way to obtain a valid service_slug and flagging that service_id is needed for the price guide, so an agent knows how this tool fits between discovery and pricing. It stops short of stating when not to call it or listing alternative routes explicitly.

Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.

armut_service_faqC

Frequently asked questions for a service, with answers (from the service page's FAQ schema). service_slug: e.g. "ev-temizligi".

NameRequiredDescriptionDefault
service_slugYes

Output Schema

NameRequiredDescription
resultYes

TDQS

C2.7/5.0
Behavior2/5

Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?

No annotations are supplied, so the description carries the full burden. It discloses the data source, which is a small plus, but says nothing about whether the lookup fails on unknown slugs, whether a service may have zero FAQs, rate limits, or auth requirements. For a tool with zero annotation coverage this leaves notable behavioral gaps.

Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.

Conciseness4/5

Is the description appropriately sized, front-loaded, and free of redundancy?

Two compact sentences with no filler, and the resource definition is front-loaded ahead of the parameter hint. The parameter note is somewhat awkwardly appended inside the description rather than integrated, which keeps it just short of top marks.

Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.

Completeness3/5

Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?

The tool is simple: one required parameter and an output schema that already documents return values, so the description does not need to explain the response shape. It is still missing how to source a valid slug and any failure/empty-result behavior, which are the remaining things an agent needs to call it correctly.

Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.

Parameters3/5

Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?

Schema coverage is 0%, so the description must compensate, and it does partially by giving a concrete slug example ("ev-temizligi"), which signals the expected lowercase, hyphenated, Turkish format. It does not explain how to obtain a valid slug (e.g. from armut_search_services) or what happens with an invalid one.

Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.

Purpose3/5

Does the description clearly state what the tool does and how it differs from similar tools?

The description identifies the resource clearly ("frequently asked questions for a service, with answers") and its provenance (the service page's FAQ schema), so an agent knows what data comes back. However, it is a bare noun phrase with no verb and no differentiation from sibling armut_service_detail, which plausibly also returns service-page content. Adequate but not sharply distinguishable.

Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.

Usage Guidelines2/5

Does the description explain when to use this tool, when not to, or what alternatives exist?

There is no when-to-use guidance, no when-not, and no mention of alternatives such as armut_service_detail or armut_price_guide. The agent must infer that this is the right call when a user asks service-specific FAQ questions, and must guess whether to use it alongside or instead of the detail tool.

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.

  1. 6 tool updatesv0.1.0
    • First observedarmut_list_pros
    • First observedarmut_price_guide
    • First observedarmut_search_services
    • First observedarmut_service_detail
    • First observedarmut_service_faq
    • First observedarmut_trending_services

TDQS

A3.5/5.0

Scored across 6 tools

Disambiguation4/5

Each tool targets a distinct facet of the service catalogue: keyword search, service detail, pros, FAQ, pricing, and trending. The only mild overlap is between armut_search_services and armut_trending_services, both of which surface services, but the descriptions make the discovery-vs-popularity distinction clear.

Naming Consistency4/5

All six tools share the armut_ prefix and snake_case, with a predictable resource-oriented pattern (search_services, service_detail, list_pros, price_guide). The mix of verb-first (search, list) and noun-first (service_detail, price_guide) forms is natural and readable rather than inconsistent.

Tool Count5/5

Six tools is well within the sweet spot and each one covers a distinct capability of a read-only marketplace catalogue. No tool feels redundant or padding.

Completeness4/5

The surface covers the main research journey: find a service, inspect it, see pros, read FAQs, check prices, and see trends. Minor gaps remain, such as no standalone professional-profile detail tool (armut_list_pros only returns a profile URL) and no category or city enumeration, but agents can work around these via search and optional city slugs.

Maintenance

ActivityMaintained
ResponsivenessNo recent community issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    Enables searching 580K+ Turkish businesses and 90K+ mosques by name, city, category, or attributes, retrieving full details and canonical profile URLs. It lets AI agents answer location and business questions about Turkey with current, sourced data.
    MIT
  • A
    license
    A
    quality
    C
    maintenance
    Enables AI assistants and agents to search Akakçe products, compare seller prices with shipping and ratings, browse categories and deals, and manage authenticated favorites and price-drop alerts.
    20
    MIT