Skip to main content
Glama
bibo242

haraj-mcp

by bibo242

haraj-mcp

haraj.com.sa를 위한 Model Context Protocol (MCP) 서버 — 사우디아라비아 최대의 중고 광고 마켓플레이스입니다.

이 서버는 MCP를 지원하는 모든 에이전트(Claude Desktop, Cursor, opencode, Zed 등)에 21개 도구를 제공하여, curl 명령을 복사해서 붙여넣을 필요 없이 마켓플레이스 목록을 실시간으로 검색하고 가져올 수 있습니다.

모든 도구는 실제 haraj.com.sa 운영 방식을 그대로 반영합니다. 실제 브라우저 세션(2026-08-17)에서 캡처했습니다. 환각으로 생성된 필터는 없습니다 — 모든 인자는 실제 프런트엔드가 GraphQL 호출에서 보내는 값과 일치합니다.

Claude Desktop / Cursor / opencode
        │
        │  MCP (JSON-RPC over stdio)
        ▼
   ┌──────────────┐
   │  haraj-mcp   │ ── HTTPS ──▶  graphql.haraj.com.sa
   │  (Python)    │                + livestream.haraj.com.sa
   └──────────────┘

제공되는 도구 (21)

탐색

도구

용도

trending_keywords(range_in_days)

인기 급상승 검색어 (기본 7일)

search_suggest(prefix)

실시간 검색창 자동 완성 (상위 10개)

related_tags(tag)

특정 태그에 대한 도시별 개수

live_streams(limit)

현재 진행 중인 haraj 라이브 쇼핑 스트림

피드 / 검색

도구

용도

fetch_feed(tag, city?, cities?, page?, before_update_date?, limit?)

태그 기반 피드(홈페이지 + 카테고리 페이지). before_update_date가 커서입니다 — 다음 페이지를 가져오려면 마지막 항목의 updateDate를 전달하세요.

search(keyword, cities?, city?, tag?, tags?, during_date?, near?, ...)

키워드 검색. during_date는 1days/3days/1week/1months를 받습니다. near는 지오해시 @lat,lon입니다.

promoted_posts(tag)

태그에 대한 프로모션 게시물 캐러셀

sellers_list(tags, page?)

태그별 판매자 목록(부동산 등)

게시물 상세

도구

용도

get_post_details(post_id)

게시물 + 관련 그룹 3개 (실제 similarPosts 엔드포인트 경유 — 표준 'ID로 가져오기')

post_like_info(post_id)

{is_like, total, is_following}

comments(post_id)

댓글 목록

post_contact(post_id)

{contactText, contactMobile, shouldEnableWhatsApp}

locker_shipment_offer(post_id)

{offerId, isEligible, price} (Locker 배송)

사용자

도구

용도

user(username?, user_id?, rating_summary_only?)

전체 프로필(평점, 팔로워, 위치 기록, 배지)

is_following_user(username)

bool

follow_user(username)

뮤테이션: 팔로우 토글

user_mention_suggestions()

@멘션용

계정

도구

용도

notes(set_read?)

알림(벨 아이콘)

outgoing_buy_requests(page?)

"Buy with confidence" 에스크로 내역

is_following_tag(tag)

bool

check_auth()

.env 자격 증명이 여전히 유효한지 확인

fetch_feed, promoted_posts, search의 경우 full=True를 전달하면 간결한 요약 대신 전체 Post 객체를 얻을 수 있습니다. 간결한 요약에는 다음 키가 포함됩니다:

{
  "id": 185926519,
  "title": "...",
  "price_sar": 650.0,
  "price_display": "650 SAR",
  "url": "https://haraj.com.sa/...",
  "city": "الشرقيه",
  "geo_city": "الدمام",
  "post_date": 1785729404,
  "has_image": true,
  "thumb_url": "https://mimg6cdn.haraj.com.sa/...",
  "tags": ["شاشات", "..."],
  "has_price": true
}

Related MCP server: opensooq-mcp

설치

cd /mnt/W/Desktop/Software/haraj-mcp
pip install -e .

이렇게 하면 haraj-mcp 콘솔 스크립트가 PATH에 설치됩니다.

인증 설정

cp .env.example .env
# Edit .env and paste your HARAJ_JWT and LAST_REQUEST_ID.

새 값은 약 10일마다 만료됩니다. 새 값을 얻는 방법:

  1. Chrome에서 https://haraj.com.sa를 열고 로그인합니다.

  2. F12 → 네트워크 탭 → 아무 graphql.haraj.com.sa 요청을 클릭합니다.

  3. 헤더에서 authorization(Bearer eyJ…로 시작)과 lastRequestId를 복사합니다.

  4. .env에 붙여넣고 MCP 서버를 다시 시작합니다.

check_auth로 확인할 수 있습니다. JWT의 exp 클레임과 seconds_remaining을 반환합니다.

MCP 클라이언트에 연동

opencode / Claude Desktop / Cursor

클라이언트의 MCP 설정에 다음을 추가하세요(보통 ~/.config/opencode/opencode.json, ~/Library/Application Support/Claude/claude_desktop_config.json, 또는 ~/.cursor/mcp.json):

{
  "mcpServers": {
    "haraj": {
      "command": "haraj-mcp",
      "cwd": "/mnt/W/Desktop/Software/haraj-mcp"
    }
  }
}

서버는 cwd에서 .env를 읽으므로 비밀값이 프로젝트 디렉터리에 유지되고 MCP 클라이언트 설정으로 유출되지 않습니다.

사용자 지정 .env 위치

MCP 설정의 env 블록에 HARAJ_MCP_ENV=/path/to/.env를 설정하세요.

에이전트 프롬프트 예시

연동이 완료되면 에이전트는 다음 질문에 답할 수 있습니다:

"오늘 haraj에서 인기 있는 검색어는 뭐야?"

"حراج السيارات(자동차 카테고리)의 최신 게시물 20개를 가져와."

"지난주(during_date=1week) 동안 haraj에서 RTX 4090을 검색해."

"post_id=185354313에 대한 판매자 프로필과 현재 등록된 모든 목록을 가져와."

"Locker를 통해 이 게시물을 구매하면 배송비가 얼마야?"

"사람들이 شاشة 다음에 검색창에 뭘 입력하고 있어?"

"지금 열려 있는 모든 라이브 쇼핑 스트림을 나열해."

MCP 클라이언트 없이 실행 (디버그)

JSON-RPC 메시지를 서버로 직접 파이프하세요:

echo '{"jsonrpc":"2.0","id":1,"method":"initialize","params":{"protocolVersion":"2024-11-05","capabilities":{},"clientInfo":{"name":"test","version":"0"}}
{"jsonrpc":"2.0","method":"notifications/initialized"}
{"jsonrpc":"2.0","id":2,"method":"tools/call","params":{"name":"list_regions","arguments":{}}}' | python -m haraj_mcp

테스트

python tests/test_smoke.py

10개의 테스트가 다음을 다룹니다: 도구 등록(21개 도구), 라이브 version URL, sec-ch-ua-platform-version 헤더, initalChars 오타 보존, 실제 검색 변수, 컴팩트 직렬화기 형태, JWT 검증(유효/만료/잘못됨), check_auth 오류 처리, 전체 stdio 엔드투엔드 테스트.

에이전트 가이드

도구별 "이건 어디에 쓰나요" 참조(및 에이전트 작업 흐름 예시)는 **docs/AGENT_GUIDE.md**를 참조하세요. 다음을 설명합니다:

  • 사용 사례별로 정리된 21개 도구(탐색, 피드/검색, 게시물 상세, 사용자, 계정)

  • 일반적인 다단계 작업 흐름(예: "RTX 4090 좋은 거래 찾아줘" → 도구 호출 5개 연결)

  • 페이지 매김 치트 시트(어떤 도구가 어떤 커서를 사용하는지)

  • 개인정보/안전 참고 사항(어떤 도구가 IBAN, 휴대폰 번호 같은 민감한 데이터를 반환하는지)

  • 에이전트가 도구를 호출하는 대화 스니펫

docs/AGENT_GUIDE.md를 LLM 클라이언트와 공유하세요(또는 시스템 프롬프트를 작성할 때 참조로 사용하세요).

프로젝트 구조

haraj-mcp/
├── pyproject.toml
├── README.md
├── .env.example
├── src/haraj_mcp/
│   ├── __init__.py
│   ├── __main__.py        # entry point: `python -m haraj_mcp`
│   ├── server.py         # FastMCP setup, 21 tool registrations
│   ├── tools.py          # the 21 tool implementations
│   └── auth.py           # .env reader + JWT validation
├── haraj/                # GraphQL client (captured from live haraj.com.sa)
│   ├── client.py
│   ├── models.py
│   ├── queries.py        # 20 exact-captured query strings
│   ├── constants.py
│   ├── auth.py
│   └── images.py
└── tests/test_smoke.py

v0.2.0에서 변경된 사항

v0.1.0에는 라이브 GraphQL 스키마에서 내가 환각(hallucination)으로 만들어 낸 4개의 도구(search_haraj, get_post, list_regions, check_auth)가 있었습니다. 지원되는 필터 중 상당수는 실제 사이트에서 사용되지 않았습니다.

v0.2.0은 이를 haraj.com.sa가 실제로 사용하는 작업을 그대로 반영한 21개 도구로 대체합니다. 2026-08-17의 실제 브라우저 세션(219개 요청, 173개 GraphQL POST)에서 캡처했습니다. 주요 수정 사항:

  • search에는 더 이상 환각으로 생성된 필터(carExtraInfo, priceRange, userLocation, notTag, authorUsername)가 없습니다. 라이브 사이트가 실제로 보내는 변수(search, cities, city, tag, tags, page, limit, onlyWithImage, onlyWithVideo, hideShowRooms, orderByPostId, duringDate, near)만 있습니다.

  • searchSuggest는 라이브 통신의 오타 initalChars를 보존합니다(서버에서 필요함).

  • version URL 매개변수가 2026-08-11 22로 상향되었습니다(이전 2026-08-03 15).

  • sec-ch-ua-platform-version 헤더 추가(모든 라이브 호출에 전송)

  • ViewOptions에 mustLoginToView 포함(posts 작업에만 존재)

  • GraphQL이 아닌 livestream.haraj.com.sa 엔드포인트를 위한 새 live_streams 도구

  • get_post_details는 이제 ID를 키워드로 사용하는 임시 방편이 아닌 올바른 similarPosts(id:) 엔드포인트를 사용합니다.

Available Tools

21 tools
check_authA
Read-onlyIdempotent

Verify the JWT and lastRequestId in .env are still valid. Returns {ok, expires_at, seconds_remaining, user_id} or {ok: false, error} if the JWT is missing or expired.

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnlyHint=true, destructiveHint=false, idempotentHint=true, and openWorldHint=false. The description adds useful behavior: it returns {ok, expires_at, seconds_remaining, user_id} or {ok: false, error} when the JWT is missing or expired. It does not clarify failure behavior for an invalid lastRequestId, so it stops short of full transparency.

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

Conciseness5/5

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

The description is two sentences: the first states the purpose, the second states the return shape and error case. It is front-loaded, precise, and every sentence earns its place.

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?

There is no output schema, and the description competently describes the return object and error object. However, it only mentions the error case for a missing or expired JWT, leaving the failure behavior for an invalid lastRequestId unspecified. This is a minor but real gap for a tool that claims to verify both values.

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?

The tool has zero parameters, so parameter semantics are not applicable and the baseline is 4. Mentioning JWT and lastRequestId from .env provides useful context but does not describe any input parameter semantics.

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

Purpose5/5

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

The description states a specific verb and resource: 'Verify the JWT and lastRequestId in .env are still valid.' It clearly distinguishes the tool from unrelated social-media siblings and tells the agent exactly what operation is performed.

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 phrase 'still valid,' suggesting a pre-flight or session-check context, but the description provides no explicit when/when-not guidance or alternatives. For a zero-parameter auth check, this is minimally viable but leaves the agent to infer timing.

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

commentsC
Read-onlyIdempotent

Comment list for a post. Required: post_id. Optional: page, oldest_first (default true).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoZero-based page index.
post_idYesHaraj post id.
oldest_firstNoReturn oldest comments first (false = newest first).

TDQS

C2.9/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered elsewhere. The description adds nothing beyond that: no pagination limits, no ordering caveats, no indication of how many comments are returned per page.

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?

Three short fragments, fully front-loaded, with zero filler. It is terse to the point of omitting useful context, but every clause carries information.

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?

For a simple read-only list tool with a complete input schema and no output schema, this is minimally adequate. However, return shape and pagination behavior across pages are left entirely unexplained, which an agent needs to page 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 description coverage is 100%, so the baseline is 3. The description merely restates required/optional status and the oldest_first default, which the schema already documents, adding no new semantic meaning such as the page size or ordering interaction.

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?

States a specific resource and action: a comment list scoped to a post. An agent can tell it retrieves comments rather than posts or users, though it does not name a sibling tool or contrast with get_post_details which might also surface comment data.

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?

The description only implies usage through the required post_id mention. It offers no when-to-use guidance, no prerequisites (e.g. auth or post visibility), and no pointer to an alternative if a different comment view is wanted.

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

fetch_feedA
Read-onlyIdempotent

Fetch the post feed for a tag (the homepage + category pages). Required: tag (Arabic category name like 'حراج السيارات' or 'حراج الأجهزة'). Optional: city (Arabic region like 'الشرقيه'), cities (list of regions), page (default 0), limit (default 21), before_update_date (Unix seconds cursor — pass the last item's updateDate to get the next page), only_with_image (default true), only_with_video (default false), order_main_by_post_id (default false), full (return full Post objects, default false = compact). Returns {count, has_next_page, view_options, posts}.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesArabic category/tag name, e.g. 'حراج السيارات' (cars) or 'حراج الأجهزة' (devices).
cityNoSingle Arabic region name to filter by, e.g. 'الشرقيه'.
fullNoReturn full Post objects instead of compact summaries.
pageNoZero-based page index.
limitNoNumber of posts to return (clamped to 1-100).
citiesNoList of Arabic region names to filter by (multi-city).
only_with_imageNoOnly return posts that have at least one image.
only_with_videoNoOnly return posts that have a video.
before_update_dateNoPagination cursor in Unix seconds — pass the last item's updateDate to get the next page.
order_main_by_post_idNoOrder the main feed by post id instead of update date.

TDQS

A3.7/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, openWorld and non-destructive, so the safety profile is covered. The description still adds real value beyond that: it discloses the return shape {count, has_next_page, view_options, posts}, the cursor contract, and several non-obvious defaults (only_with_image=true, limit=21).

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?

One dense but front-loaded block: purpose first, then required parameter, then optional parameters, then return shape. For ten parameters this is compact, though the run-on parameter list is harder to scan than a short list would be.

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?

With no output schema, the description correctly compensates by naming the top-level response keys and the pagination field, and it covers the required tag plus every optional flag. An agent has enough to call and page through this 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 description coverage is 100%, so every parameter is already documented in the schema and the baseline is 3. The description largely restates those defaults and only adds the Cursor mechanics, which the schema also carries.

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?

States a specific verb and resource ('Fetch the post feed for a tag') and adds domain scope ('the homepage + category pages'), so an agent immediately knows this is category-browsing rather than a keyword query. It never names or contrasts a sibling such as 'search' or 'promoted_posts', which is the only thing keeping it from a 5.

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: the tag-based framing and the pagination hint ('pass the last item's updateDate to get the next page') tell an agent how to page, but not when to choose this over 'search' or 'promoted_posts'. No exclusions or prerequisites are given.

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

follow_userA

Follow (or unfollow) a user. Required: username. Returns the new is_following state.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesHaraj username to follow/unfollow.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare the write/idempotent/open-world profile, so the bar is lower, and the description adds real value beyond them: it discloses that the result is the new is_following state (no output schema exists to carry this) and that repeated calls toggle rather than set, which is exactly why idempotentHint=false. It still says nothing about idempotency-adjacent edge cases like following yourself or rate limits.

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?

Three short sentences, front-loaded with what the tool does and the toggle semantics, with no filler. The 'Required: username' clause mildly duplicates the schema's required array, which is the only small redundancy.

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 one-parameter tool with a full annotation set, the description covers the verb, the toggle semantics, the required input, and the return value (important given no output schema). Nothing an agent needs in order to call it correctly is missing.

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 100% and the single parameter is documented in the schema itself ('Haraj username to follow/unfollow'), so the schema does the heavy lifting. The description restates that username is required but adds no format, casing, or identifier-type detail beyond the schema.

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 names a specific verb pair and resource ('Follow (or unfollow) a user'), which is the key detail an agent needs since the operation is a state toggle rather than an absolute set. It does not explicitly name the sibling it is not, such as is_following_user, but the verb+resource pair is unambiguous.

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 verb itself, and the toggle behavior hints at the condition under which it flips state, but there is no explicit guidance on when to call this versus the read-only sibling is_following_user, nor any mention of prerequisites such as authentication or target-user existence.

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

get_post_detailsA
Read-onlyIdempotent

Fetch a post + 3 related groups (similar posts in the same tag/city, similar images, related offers). This is the canonical 'fetch by id' — there is no direct getById operation in the GraphQL API. Required: post_id. full (default true = full similarPosts response).

ParametersJSON Schema
NameRequiredDescriptionDefault
fullNoReturn the full similarPosts response instead of a summary.
post_idYesHaraj post id, e.g. 185926519.

TDQS

A4.2/5.0
Behavior4/5

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

Annotations already declare readOnly/idempotent/non-destructive, so the bar is lower, and the description still adds real value: it discloses that the response bundles three categories of related data and that 'full' toggles between the full similarPosts response and a summary. It omits cost/size implications of that bundling, but the response-shape disclosure goes beyond the annotations.

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

Conciseness5/5

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

Three tight sentences, front-loaded with what is returned and the canonical-id framing, then the required parameter, then the flag behavior. No filler, no repetition of the tool name.

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?

With no output schema, the description carries the return-shape burden and does so by enumerating the post plus the three related groups, and it explains the one non-obvious flag. Only minor gaps remain, such as pagination or response size for the full mode.

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 100%, so both parameters are already documented with types, defaults, and an example id, making 3 the baseline. The description's note that full defaults to true and controls similarPosts verbosity largely restates the schema rather than adding meaning beyond it.

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

Purpose5/5

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

States a specific verb (Fetch) and resource (a post) plus the exact payload shape: post + three related groups (similar posts by tag/city, similar images, related offers). It also preempts confusion with siblings by declaring itself the canonical 'fetch by id' operation, so an agent can distinguish it from post_contact, post_like_info, or comments without opening a schema.

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?

Tells the agent this is the canonical by-id retrieval path and notes there is no direct getById in the GraphQL API, which answers the 'when do I use this' question. It does not, however, name sibling alternatives or state exclusions (e.g., use comments/post_contact for those resources), so it stops short of full when/when-not guidance.

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

is_following_tagA
Read-onlyIdempotent

True/false whether the authenticated user follows tag.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagYesArabic tag name to check the authenticated user's follow status for.
cityNoOptional Arabic region name to scope the check.

TDQS

A3.6/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, openWorldHint and destructiveHint=false, so the safety profile is covered. The description usefully adds that the result is a true/false boolean scoped to the authenticated user, which compensates for the absent output schema, but it says nothing about failure modes, missing tags, or unauthenticated behavior.

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

Conciseness5/5

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

A single, front-loaded sentence that states the check and the return type with no filler. Nothing could be cut without losing information.

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 two-parameter boolean read tool with full schema coverage and rich annotations, the description covers the essentials, including the return type that would otherwise be missing without an output schema. Only the optional city scoping and edge-case behavior go unmentioned.

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 100%, with both `tag` (required, Arabic tag name) and `city` (optional scoping region) fully documented in the schema. The description adds nothing about parameters, so the baseline 3 applies; notably it never hints that a city scoping option exists.

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 check (follow status of a tag) and even names the return value (true/false), which is more than a tautology. It implicitly separates itself from sibling is_following_user by specifying a tag rather than a user, though it never names or contrasts 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.

Usage Guidelines3/5

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

Usage is implied by the purpose – an agent reading it knows to call it when it needs a boolean follow check for a tag. However, there is no explicit when-to-use, no when-not-to-use, and no mention of alternatives such as is_following_user or related_tags.

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

is_following_userB
Read-onlyIdempotent

True/false whether the authenticated user follows username.

ParametersJSON Schema
NameRequiredDescriptionDefault
usernameYesHaraj username to check.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and destructiveHint=false, so the safety profile is fully covered. The description adds one genuinely useful behavioral detail, that the relationship is evaluated from the authenticated user's perspective, but says nothing about behavior for nonexistent users or whether an auth failure is surfaced as an error.

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

Conciseness5/5

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

A single sentence with zero filler, front-loading the return type and the subject of the query. Nothing could be removed without losing meaning.

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 boolean predicate with no output schema, the description tells the agent what it returns (true/false) and whose perspective it uses, which is enough to call it correctly. Minor gaps remain around auth requirements and unknown-user behavior.

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 100% and the single `username` parameter is already documented in the schema as a Haraj username. The description merely echoes the parameter name, adding no format or resolution semantics beyond it, so the baseline 3 applies.

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 predicate (true/false) over a specific resource (follow relationship between the authenticated user and `username`). It is clearly distinguishable from the mutation sibling `follow_user` by the boolean framing, though it 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.

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 stated preconditions (e.g. must be authenticated), and no routing to alternatives such as `follow_user` or `is_following_tag`. Usage is only inferable from the predicate wording.

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

live_streamsB
Read-onlyIdempotent

Currently-open haraj live shopping streams. Non-GraphQL REST endpoint. Returns [{id, title, cover_url, streamer, num_messages, num_viewers, started_at}]. limit (default 40; the server caps it).

ParametersJSON Schema
NameRequiredDescriptionDefault
limitNoMaximum number of streams to return (the server caps it).

TDQS

B3.2/5.0
Behavior3/5

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

Annotations already declare readOnly, idempotent, non-destructive and openWorld behavior, so safety is covered. The description adds the returned field list and the server-side cap on limit, but says nothing about auth requirements, pagination, error behavior, or what happens if no streams are live.

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?

Three short, front-loaded sentences with no filler; the resource and return shape come first. 'Non-GraphQL REST endpoint' is the one line of marginal value to an agent, but it costs almost nothing.

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?

With no output schema, the description compensates by naming the return fields, and the single optional parameter is fully covered by the schema. For a simple read-only list tool this is nearly sufficient, though it omits empty-result and auth context.

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 100%, so the single limit parameter is already documented with its default and server cap. The description only restates this, adding no syntax, range, or edge-case guidance beyond the schema.

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 resource and scope: 'currently-open haraj live shopping streams', which is clearly distinct from siblings like fetch_feed, trending_keywords or promoted_posts. No explicit verb ('list') and no direct sibling callout, so it stops 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.

Usage Guidelines2/5

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

The 'currently-open' qualifier implies when the data is relevant, but there is no when-to-use guidance, no exclusions, and no mention of alternatives for closed streams or other feed tools. The agent must infer routing entirely.

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

locker_shipment_offerC
Read-onlyIdempotent

{offerId, isEligible, price} for a post's Locker shipping option. Required: post_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYesHaraj post id.

TDQS

C2.3/5.0
Behavior2/5

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

Annotations already declare readOnlyHint, idempotentHint, and no destructiveness, so the safety profile is covered structurally. The description adds nothing beyond that — no info on whether the offer is live, cached, region-dependent, or what triggers eligibility. For an openWorldHint tool, the external-dependency behavior is undisclosed.

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

Conciseness3/5

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

It is short, but the leading curly-brace fragment is undecodable without reading the name and reads like an internal note rather than a front-loaded purpose statement. Brevity here comes at the cost of clarity.

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

Completeness2/5

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

For a read tool with no output schema, the description should at least confirm that it returns an offer object and state its meaning. Instead it leaves the action, the domain concept, and the return semantics all implicit, which is insufficient even for a one-parameter tool.

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 100% and the single parameter 'post_id' is documented ('Haraj post id.'). The description only repeats the requirement without adding format, valid-range, or sourcing detail — baseline 3 applies when the schema carries the load.

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

Purpose2/5

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

The description opens with a literal return-shape stub ('{offerId, isEligible, price}') rather than stating a verb and resource. It never says what the tool actually does — retrieve or request a Locker shipping offer for a post. An agent must infer the action from the name alone, and no sibling is differentiated.

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?

The only guidance is 'Required: post_id,' which restates the schema's required field. There is no indication of when to call this versus get_post_details or other post-related siblings, and no context about what a 'Locker shipping option' means in the domain.

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

notesB
Idempotent

User notifications (the bell icon). set_read (default false) marks them as read on the server.

ParametersJSON Schema
NameRequiredDescriptionDefault
set_readNoMark the notifications as read on the server.

TDQS

B3.3/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=false, idempotentHint=true, and openWorldHint=true, so the mutation profile is covered structurally. The description adds that set_read persists the change 'on the server', which is a modest but real behavioral detail beyond the annotations. It does not describe volume, ordering, or return shape.

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

Conciseness5/5

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

Two short sentences, no filler. The resource identification is front-loaded and the parameter behavior follows immediately. Every word earns its place.

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?

For a one-parameter read/mark-read tool with no output schema, the description covers the essentials but omits what the tool returns (notification list shape, counts, pagination) and any usage context. Adequate but with clear gaps.

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 100% for the single set_read parameter, and the description largely mirrors the schema ('marks them as read on the server') plus the default. Baseline 3 applies since the schema already documents the parameter fully and the description adds no syntax or semantics beyond it.

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 name 'notes' is opaque, but the description corrects this immediately with a specific resource: 'User notifications (the bell icon)'. It also names the optional mutation behavior via set_read. No sibling tool covers notifications, so no further differentiation is needed.

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?

The description never says when to call this tool, in what context (e.g., polling for user activity), or what alternatives exist among the many sibling tools. Nothing beyond the implied 'use this to see notifications' is provided.

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

outgoing_buy_requestsB
Read-onlyIdempotent

'Buy with confidence' (وساطة) escrow requests the user has placed. Optional: page (default 0).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoZero-based page index.

TDQS

B3.4/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety and side-effect profile is fully covered. The description adds only the pagination default, which the schema already documents. Given annotations carry the behavioral burden, a 3 is appropriate.

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?

Very short, front-loaded with the resource identity and followed by the optional pagination note. No wasted sentences, though the branded parenthetical is slightly ornamental.

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?

For a single-optional-param read tool with full annotation coverage and no output schema, the description is minimally sufficient. It doesn't indicate ordering, result shape, or pagination limits, but none of that is strictly required given the annotations and simple schema.

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 100% and the single param ('page') has a documented 'Zero-based page index.' description. The description merely repeats the default. Baseline 3 applies since the schema does the work.

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?

States a specific resource (outgoing buy/escrow requests placed by the user) with a clear directional scope. The Arabic gloss '(وساطة)' and 'Buy with confidence' branding add texture, but it's clear this is a read of the user's own escrow requests. It does not explicitly differentiate from siblings, most of which are unrelated anyway.

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?

Implied usage as a listing of the current user's outgoing escrow requests, but no explicit when-to-use or when-not-to-use guidance, and no alternative tool is named. Adequate but with a clear gap.

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

post_contactC
Read-onlyIdempotent

{contactText, contactMobile, shouldEnableWhatsApp} for a post. Required: post_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYesHaraj post id.

TDQS

C2/5.0
Behavior2/5

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

Annotations declare readOnlyHint=true and idempotentHint=true, so the description should clarify it's a safe read. However, the description's format ('{...} for a post') resembles a mutation payload, which could confuse. It adds no behavioral context beyond what annotations provide.

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

Conciseness2/5

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

The description is terse but poorly structured. The brace notation is confusing and the required parameter is tacked on at the end without clear separation. It lacks a clear statement of purpose.

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

Completeness2/5

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

For a tool with a single parameter and no output schema, the description should at least state what information it returns (contact details). Instead, it's ambiguous and provides no context about the tool's behavior or output.

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 100%; post_id is fully documented in the schema. The description lists related fields but since only post_id is a parameter, it adds minimal value beyond the schema. Baseline 3 is appropriate.

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

Purpose2/5

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

The description does not state what the tool does. It lists fields in braces and says '{contactText, contactMobile, shouldEnableWhatsApp} for a post' without a verb like 'get' or 'retrieve'. An agent cannot confidently determine the tool's action from this.

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

Usage Guidelines1/5

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

No guidance on when to use this tool versus alternatives like get_post_details or comments. The description is purely a field listing.

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

post_like_infoC
Read-onlyIdempotent

{is_like, total, is_following} for a post. Required: post_id.

ParametersJSON Schema
NameRequiredDescriptionDefault
post_idYesHaraj post id.

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, destructiveHint=false, and openWorldHint, so the safety profile is covered. The description adds value by enumerating the returned fields ({is_like, total, is_following}) in the absence of an output schema, but it does not clarify whose like status is returned or any auth requirements.

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, front-loaded sentence with no filler, and the required parameter is flagged clearly. The telegraphic style borders on under-specification rather than excess, but nothing wasteful is present.

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?

For a simple one-parameter read tool this is adequate: the return fields are enumerated despite there being no output schema, and the required input is stated. It still leaves the semantics of is_like/is_following (presumably relative to the authenticated user) unexplained, which a caller may need.

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 100% and the single post_id parameter is fully documented in the schema as 'Haraj post id.', so the description's 'Required: post_id' adds nothing new. Baseline 3 applies when the schema already carries the parameter meaning.

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 names the resource (a post) and the data it exposes ({is_like, total, is_following}), so an agent can infer it reads like/engagement status. However, it never states a verb like 'get' or 'retrieve' and offers no differentiation from siblings such as comments or get_post_details, leaving the operation type to inference.

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 at all: no indication of when this is preferable to get_post_details, comments, or other post-related siblings. The only usage-like content is a restatement of the required parameter, which does not tell the agent when to select this tool.

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

search_suggestA
Read-onlyIdempotent

Live search-box autocomplete. Returns the top 10 suggestions for a typed prefix. Required: prefix (e.g. 'شاشة'). Optional: tag.

ParametersJSON Schema
NameRequiredDescriptionDefault
tagNoOptional Arabic tag to scope the suggestions.
prefixYesText typed in the search box, e.g. 'شاشة'.

TDQS

A3.8/5.0
Behavior4/5

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

Annotations already declare readOnly, idempotent, non-destructive, open-world behavior, so the safety profile is covered. The description adds a genuine behavioral trait beyond that: the result is capped at the top 10 suggestions, which tells the agent to expect a bounded, ranked list. It doesn't mention rate limits or auth needs, keeping it below 5.

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

Conciseness5/5

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

Three short sentences with zero filler; the core purpose leads and the parameter summary follows. Every sentence earns its place.

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 simple two-parameter, read-only lookup with full schema coverage and no output schema, the description supplies enough: what it returns (top 10), scoping (prefix, optional tag), and the safe-read nature via annotations. Only the absence of guidance against sibling tools keeps it from 5.

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 100% — both `prefix` and `tag` are documented in the schema with the same Arabic example ('شاشة') the description repeats. The description therefore adds no meaning beyond what the schema already provides, which is the baseline-3 case.

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 names a specific verb and resource: 'Live search-box autocomplete' that 'Returns the top 10 suggestions for a typed prefix.' That is unambiguous. It does not, however, distinguish itself from siblings such as search, trending_keywords, or related_tags, so it stops 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.

Usage Guidelines3/5

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

'Live search-box autocomplete' implies the usage context (as-you-type prefix matching) but never states when to prefer this over the sibling `search` tool or when it is inappropriate. Usage is inferable, not explicit.

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

sellers_listC
Read-onlyIdempotent

Sellers for a tag (used by real-estate / business / investment pages). Required: tags (list of Arabic tag names).

ParametersJSON Schema
NameRequiredDescriptionDefault
pageNoZero-based page index.
tagsYesList of Arabic tag names (real-estate/business/investment pages).

TDQS

C2.9/5.0
Behavior3/5

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

Annotations already declare readOnlyHint=true, idempotentHint=true, destructiveHint=false and openWorldHint=true, so the safety profile is fully covered. The description adds only the 'Arabic tag names' input constraint and the domain hint, but says nothing about result volume, pagination behavior, or the open-world data source.

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 short sentences, front-loaded with the resource and scoping key, then the required-input fact. No filler, though the domain parenthetical is somewhat ambiguous about which repository of sellers it refers to.

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?

No output schema exists, so the description ideally would hint at what a 'sellers' result contains and how paging works. It supplies the input constraint and usage domain but leaves the return shape and pagination semantics unstated, so it is adequate but incomplete.

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 100%: the page parameter is documented as a zero-based index and tags as a list of Arabic tag names. The description merely restates the required tags argument, adding no format, limits, or semantics beyond the schema. Baseline 3 applies.

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?

"Sellers for a tag" names the resource and its scoping key, which lets an agent infer it lists sellers associated with a given tag. However it is a noun fragment with no explicit verb and no comparison to related tools such as related_tags or user, so the boundary is only weakly drawn.

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?

The parenthetical '(used by real-estate / business / investment pages)' gestures at context but never states when to call this tool versus alternatives, nor any prerequisites or exclusions. An agent gets no routing guidance.

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

userA
Read-onlyIdempotent

Full user profile (rating, followers, location history, badges). Pass either username (URL-encoded Arabic works) or user_id. rating_summary_only (default false) returns just the rating block.

ParametersJSON Schema
NameRequiredDescriptionDefault
user_idNoNumeric Haraj user id (alternative to username).
usernameNoHaraj username (URL-encoded Arabic is accepted).
rating_summary_onlyNoReturn only the rating block instead of the full profile.

TDQS

A3.5/5.0
Behavior3/5

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

Annotations already declare readOnlyHint, idempotentHint, and openWorldHint, so the agent knows this is a safe, repeatable read. The description adds the notable behavioral detail that rating_summary_only defaults to false and returns just the rating block, but doesn't disclose auth requirements, rate limits, or whether the profile is public/private. With annotations covering safety, a 3 is appropriate.

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?

Three compact sentences, front-loaded with what the tool returns, followed by parameter guidance and the summary flag behavior. No wasted words, though the parenthetical badge list is slightly dense.

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 read-only profile retrieval tool with 100% schema coverage and annotations carrying safety, the description is complete enough. It covers what is returned, how to identify the user, and a key output mode. Missing only edge-case behavior like errors for nonexistent users, but that is minor.

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 100%, so the schema already documents all three parameters in detail. The description reinforces the username/user_id alternative and the rating_summary_only behavior, but adds no syntax or format details beyond the schema. Baseline 3 is correct when the schema does the heavy lifting.

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?

States a specific resource (full user profile) and enumerates its contents (rating, followers, location history, badges), which is a clear verb-less but content-rich purpose. It doesn't explicitly distinguish itself from siblings like is_following_user or user_mention_suggestions, but the 'full profile' framing implies retrieval.

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?

The description says to pass either username or user_id, which is genuine usage guidance, but it doesn't say when to use this tool versus alternatives like is_following_user or user_mention_suggestions. Usage is implied for profile retrieval but no exclusions or alternative routing is provided.

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

user_mention_suggestionsA
Read-onlyIdempotent

Recent @-mention candidates for the comment / DM composer. Returns [{userId, username, handler}].

ParametersJSON Schema
NameRequiredDescriptionDefault

No parameters

TDQS

A3.7/5.0
Behavior3/5

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

Annotations already declare the full safety profile (readOnly, idempotent, non-destructive, openWorld), so the description's contribution is the result shape and the recency scoping implied by "recent." It does not disclose count, pagination, or the source of "recent," so it adds only modest context beyond the annotations.

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

Conciseness5/5

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

Two short sentences with zero filler; the purpose is front-loaded before the return shape. Every clause earns its place.

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?

With no parameters and no output schema, the description supplies the essential return shape it needs to. It is nearly complete, though it leaves the recency window and result count unstated.

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?

The tool takes zero parameters, so there is nothing for the description to clarify and the baseline of 4 applies. The result-shape note is a bonus rather than compensation for a coverage gap.

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 names a specific resource (@-mention candidates) and scopes it to the comment/DM composer, making the intent clear without opening the schema. It does not explicitly contrast with nearby siblings like search_suggest or user, so it stops short of full disambiguation.

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?

Embedding it as "for the comment / DM composer" implies the calling context, but there is no explicit when-to-use or when-not-to-use guidance versus alternatives such as user or search_suggest. Usage is only inferable.

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. 19 tool updatesv0.5.0
    • Changedcomments3 fields changed
      • addedInput schema / properties / oldest_first / description
        Added value: +"Return oldest comments first (false = newest first)."
      • addedInput schema / properties / page / description
        Added value: +"Zero-based page index."
      • addedInput schema / properties / post_id / description
        Added value: +"Haraj post id."
    • Changedfetch_feed10 fields changed
      • addedInput schema / properties / before_update_date / description
        Added value: +"Pagination cursor in Unix seconds — pass the last item's updateDate to get the next page."
      • addedInput schema / properties / cities / description
        Added value: +"List of Arabic region names to filter by (multi-city)."
      • addedInput schema / properties / city / description
        Added value: +"Single Arabic region name to filter by, e.g. 'الشرقيه'."
      • addedInput schema / properties / full / description
        Added value: +"Return full Post objects instead of compact summaries."
      • addedInput schema / properties / limit / description
        Added value: +"Number of posts to return (clamped to 1-100)."
      • addedInput schema / properties / only_with_image / description
        Added value: +"Only return posts that have at least one image."
      • addedInput schema / properties / only_with_video / description
        Added value: +"Only return posts that have a video."
      • addedInput schema / properties / order_main_by_post_id / description
        Added value: +"Order the main feed by post id instead of update date."
      • addedInput schema / properties / page / description
        Added value: +"Zero-based page index."
      • addedInput schema / properties / tag / description
        Added value: +"Arabic category/tag name, e.g. 'حراج السيارات' (cars) or 'حراج الأجهزة' (devices)."
    • Changedfollow_user1 field changed
      • addedInput schema / properties / username / description
        Added value: +"Haraj username to follow/unfollow."
    • Changedget_post_details2 fields changed
      • addedInput schema / properties / full / description
        Added value: +"Return the full similarPosts response instead of a summary."
      • addedInput schema / properties / post_id / description
        Added value: +"Haraj post id, e.g. 185926519."
    • Changedis_following_tag2 fields changed
      • addedInput schema / properties / city / description
        Added value: +"Optional Arabic region name to scope the check."
      • addedInput schema / properties / tag / description
        Added value: +"Arabic tag name to check the authenticated user's follow status for."
    • Changedis_following_user1 field changed
      • addedInput schema / properties / username / description
        Added value: +"Haraj username to check."
    • Changedlive_streams1 field changed
      • addedInput schema / properties / limit / description
        Added value: +"Maximum number of streams to return (the server caps it)."
    • Changedlocker_shipment_offer1 field changed
      • addedInput schema / properties / post_id / description
        Added value: +"Haraj post id."
    • Changednotes1 field changed
      • addedInput schema / properties / set_read / description
        Added value: +"Mark the notifications as read on the server."
    • Changedoutgoing_buy_requests1 field changed
      • addedInput schema / properties / page / description
        Added value: +"Zero-based page index."
    • Changedpost_contact1 field changed
      • addedInput schema / properties / post_id / description
        Added value: +"Haraj post id."
    • Changedpost_like_info1 field changed
      • addedInput schema / properties / post_id / description
        Added value: +"Haraj post id."
    • Changedpromoted_posts3 fields changed
      • addedInput schema / properties / city / description
        Added value: +"Arabic region name to filter by."
      • addedInput schema / properties / full / description
        Added value: +"Return full Post objects instead of compact summaries."
      • addedInput schema / properties / tag / description
        Added value: +"Arabic tag name for the promoted carousel, e.g. 'حراج الأجهزة'."
    • Changedrelated_tags2 fields changed
      • addedInput schema / properties / city / description
        Added value: +"Optional Arabic region name to scope the counts to."
      • addedInput schema / properties / tag / description
        Added value: +"Arabic tag name to get city post-counts for, e.g. 'حراج السيارات'."
    • Changedsearch14 fields changed
      • addedInput schema / properties / cities / description
        Added value: +"List of Arabic region names to filter by."
      • addedInput schema / properties / city / description
        Added value: +"Single Arabic region name to filter by."
      • addedInput schema / properties / during_date / description
        Added value: +"Time window: '1days', '3days', '1week', or '1months'."
      • addedInput schema / properties / full / description
        Added value: +"Return full Post objects instead of compact summaries."
      • addedInput schema / properties / hide_show_rooms / description
        Added value: +"If true, hides dealer posts (real-estate filter)."
      • addedInput schema / properties / keyword / description
        Added value: +"Search keyword (Arabic or English), e.g. 'RTX 4090' or 'شاشة'."
      • addedInput schema / properties / limit / description
        Added value: +"Number of posts to return (clamped to 1-100)."
      • addedInput schema / properties / near / description
        Added value: +"Geohash location filter like '@26.4336,50.1116'."
      • addedInput schema / properties / only_with_image / description
        Added value: +"Only return posts that have at least one image."
      • addedInput schema / properties / only_with_video / description
        Added value: +"Only return posts that have a video."
      • addedInput schema / properties / order_by_post_id / description
        Added value: +"Order results by post id instead of relevance/date."
      • addedInput schema / properties / page / description
        Added value: +"Zero-based page index."
      • addedInput schema / properties / tag / description
        Added value: +"Restrict the search to a single Arabic tag."
      • addedInput schema / properties / tags / description
        Added value: +"Restrict the search to a list of Arabic tags."
    • Changedsearch_suggest2 fields changed
      • addedInput schema / properties / prefix / description
        Added value: +"Text typed in the search box, e.g. 'شاشة'."
      • addedInput schema / properties / tag / description
        Added value: +"Optional Arabic tag to scope the suggestions."
    • Changedsellers_list2 fields changed
      • addedInput schema / properties / page / description
        Added value: +"Zero-based page index."
      • addedInput schema / properties / tags / description
        Added value: +"List of Arabic tag names (real-estate/business/investment pages)."
    • Changedtrending_keywords1 field changed
      • addedInput schema / properties / range_in_days / description
        Added value: +"Look-back window in days (default 7)."
    • Changeduser3 fields changed
      • addedInput schema / properties / rating_summary_only / description
        Added value: +"Return only the rating block instead of the full profile."
      • addedInput schema / properties / user_id / description
        Added value: +"Numeric Haraj user id (alternative to username)."
      • addedInput schema / properties / username / description
        Added value: +"Haraj username (URL-encoded Arabic is accepted)."
  2. 21 tool updatesv0.3.0
    • First observedcheck_auth
    • First observedcomments
    • First observedfetch_feed
    • First observedfollow_user
    • First observedget_post_details
    • First observedis_following_tag
    • First observedis_following_user
    • First observedlive_streams
    • First observedlocker_shipment_offer
    • First observednotes
    • First observedoutgoing_buy_requests
    • First observedpost_contact
    • First observedpost_like_info
    • First observedpromoted_posts
    • First observedrelated_tags
    • First observedsearch
    • First observedsearch_suggest
    • First observedsellers_list
    • First observedtrending_keywords
    • First observeduser
    • First observeduser_mention_suggestions

TDQS

B3/5.0

Scored across 21 tools

Disambiguation5/5

Each tool targets a clearly distinct resource or action. While several tools return posts (fetch_feed, search, promoted_posts) or relate to users (follow_user, is_following_user, user), the descriptions precisely differentiate their scopes and use cases.

Naming Consistency3/5

All names use snake_case, which is consistent, but the grammatical pattern is mixed: some are verb_noun (fetch_feed, get_post_details), some are noun phrases (promoted_posts, post_like_info), and some are is_* predicates (is_following_tag). This inconsistency makes the set less predictable.

Tool Count3/5

21 tools is on the high side for a single server, falling into the borderline heavy range per the rubric. Although each tool appears to cover a distinct API feature, the sheer number increases cognitive load and could be consolidated.

Completeness3/5

The surface covers many read operations and a few write actions (follow_user, notes set_read), but notable write operations are missing: creating or editing posts, liking/unliking, posting comments, following/unfollowing tags, and sending messages. These gaps limit agent autonomy for core marketplace interactions.

Maintenance

ActivityMaintained
ResponsivenessNo issues

Related MCP Connectors

Related MCP Servers

  • A
    license
    C
    quality
    A
    maintenance
    Hosted MCP server for 3,093 structured public web-data tools across 420 platform groups, returning clean JSON for search, maps, commerce, social, and finance.
    4
    500
    536 npm
    1
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    A 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.
    2
    MIT
  • F
    license
    Not graded
    quality
    B
    maintenance
    Remote MCP server for Saudi real estate data, giving AI assistants access to 65,000+ rental and sale property listings across 5 Saudi cities with market analytics and price trends.
    1
    -
  • A
    license
    Not graded
    quality
    A
    maintenance
    MCP server for the OLX.ba API that enables searching, publishing, editing, and managing listings (ads), including image handling, sponsorships, categories, locations, and user account operations through 36 tools covering all official API endpoints.
    15 npm
    6
    MIT