Teppek
Replaced by Teppek.
Duplicate listing. Use the main Teppek connector.
Server Details
Agent-accessible map of global supply & demand: jobs, homes, cars & services your AI can act on
- Status
- Healthy
- Last Tested
- Transport
- Streamable HTTP · MCP 2025-11-25
- URL
- ChatGPT
- –
- Claude
- –
TDQS
Scored across 16 tools
Most tools target a clearly distinct resource+action, and the descriptions explicitly spell out the tricky boundaries (search_listings vs semantic_search, send_message vs reply_to_conversation, create vs update vs update_listing_images). The remaining overlaps are mild but real: delete_listing (soft-delete), set_listing_status ('hide'), and renew_listing all touch listing lifecycle/visibility, which could still cause misselection.
Nearly all names are consistent snake_case verb_noun (create_listing, get_listing, list_conversations, update_listing_images, set_listing_status). The single deviation is semantic_search, which is adjective_noun rather than verb-first, but it remains readable and unambiguous.
16 tools is just over the well-scoped range but every tool maps to a distinct operation (listing CRUD, status/renew, images, entitlements, search, messaging). Nothing looks like filler, though the listing-lifecycle group could plausibly be consolidated.
The surface covers a full listing lifecycle (create, read, update, delete, renew, status, image management) plus search, semantic search, messaging and entitlements — no obvious dead ends. Minor gaps exist: no way to change a listing's vertical/role after creation, and no conversation-level operations beyond list/get/reply.
Available Tools
16 toolscreate_listingAInspect
Publish a listing on behalf of the user across any of the 4 verticals and 12 roles. location must be coordinates ({ lat, lon }) — a free-text address is not accepted, so geocode it first. Publishing needs a free listing slot and may consume credits (included listings cost none); get_entitlements reports the slots, credit cost and balance. A reached limit makes this return an ACTIVE_LISTING_LIMIT_REACHED error carrying a pay_url. Held for AI moderation (status starts "pending"); any credits spent are refunded if rejected, EXCEPT for prohibited or spam content, which forfeits the credit. To attach photos, first call request_image_upload for each image, upload the bytes, and pass the returned keys in images — a key with no uploaded file fails with image_not_uploaded, and every image is AI-moderated with the text before going live. Requires the user to be connected to Teppek: an anonymous call returns an AUTH_REQUIRED error with an authorize_url — surface "Connect with Teppek" to the user, then retry.
| Name | Required | Description | Default |
|---|---|---|---|
| role | Yes | The listing role — this alone fixes supply vs demand (do not send intent_type). vehicle_letter = you OWN the vehicle and are renting it OUT (lessor); for a user who WANTS to rent a vehicle use vehicle_renter. Likewise estate_landlord (renting out) vs estate_renter (wants to rent), estate_seller vs estate_buyer, career_employer (posting a job) vs career_seeker (a CV), service_pro (offering) vs service_client (wants a service). | |
| price | Yes | Asking price as a plain number in `currency`, with no separators. For a job, use the salary figure and put the range in details.salary_min and details.salary_max. Example: 950. | |
| title | Yes | Short headline of the listing, 3-200 characters. Example: "Two-bedroom flat near the river". | |
| images | No | Up to 6 image keys returned by request_image_upload, uploaded before this call. Example: ["7c9e6679-7425-40de-944b-e07fc1f90ae7"]. | |
| details | No | Vertical-specific attributes. Only these exact keys for the listing's vertical are accepted; any other key is rejected with an error. career: organization_name, employment_type, salary_min, salary_max, years_experience. real_estate: property_room_count, m2_gross, m2_net, building_age, floor_number, heating_type, deposit, dues, is_furnished, is_student_friendly, is_credit_eligible, tapu_status. vehicle: brand, model, vehicle_model_year, vehicle_mileage_km, fuel_type, gear_type, color, damage_status, daily_price, deposit. service: service_category. employment_type is one of full_time, part_time, contract, freelance, internship. is_furnished, is_student_friendly and is_credit_eligible are booleans. real_estate also accepts transaction_type (sale, rent or hire). Example: { "brand": "Toyota", "model": "Corolla", "vehicle_model_year": 2021, "vehicle_mileage_km": 40000, "fuel_type": "hybrid", "gear_type": "manual" }. | |
| currency | Yes | ISO-4217 currency code matching the listing country (e.g. USD, EUR, GBP, TRY). Required — there is no default, to avoid silently mislabeling non-Turkish listings. | |
| location | Yes | Listing coordinates as { lat, lon }. A free-text address is NOT accepted — resolve it to coordinates before calling. Example: { "lat": 48.85, "lon": 2.35 }. | |
| vertical | Yes | Listing category, which must match the role: career (jobs and CVs), real_estate, vehicle or service. Example: "vehicle". | |
| description | No | Full listing text, up to 5000 characters. Facts that fit a `details` key belong in details as well. Example: "Bright flat on the third floor, five minutes from the metro." |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses behavior well beyond the annotations: moderation hold with status "pending", credit refund policy including the prohibited/spam forfeiture exception, the ACTIVE_LISTING_LIMIT_REACHED error carrying a pay_url, and the image_not_uploaded failure mode. None of this is derivable from destructiveHint=false / openWorldHint=true, and nothing contradicts those hints.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Purpose and the location constraint are front-loaded, and every sentence carries information an agent needs (entitlements, moderation, refunds, image flow, auth). It is dense and slightly run-on across the credits/moderation sentences, but there is no filler to cut.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists, so return values need no explanation, yet the description still covers error paths, moderation lifecycle, and the auth prerequisite. For a 9-parameter, nested-object, non-idempotent write tool this is complete enough to call correctly on the first attempt.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so baseline is 3; the description still adds workflow-level meaning the schema cannot — that `location` takes coordinates only and must be geocoded first, and that `images` keys must come from request_image_upload with bytes already uploaded. It adds less on `details` and `price`, but the cross-tool parameter dependencies are genuinely extra value.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Publish a listing") plus scope (4 verticals, 12 roles), which cleanly separates it from update_listing, renew_listing, and set_listing_status. An agent can identify the create-path tool without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit preconditions and named alternatives: geocode before calling because free-text addresses are rejected, call get_entitlements to check slots/credits, call request_image_upload before passing `images`, and surface authorize_url before retrying on AUTH_REQUIRED. This is a full when-and-with-what sequence, not just a hint.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
delete_listingADestructiveIdempotentInspect
Delete (soft-delete) one of the USER'S OWN listings by listing_id. Only the owner can delete. No credit is refunded — the listing was already published.
| Name | Required | Description | Default |
|---|---|---|---|
| listing_id | Yes | Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: "adzuna-us-5947308680". |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare destructiveHint=true, idempotentHint=true, readOnlyHint=false, so the safety profile is structured. The description adds genuinely new context — soft-delete rather than hard delete, owner-only authorization, no credit refund — but does not say what happens to the listing's conversations, images, or visibility after deletion.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the action and scope, then constraints. Every sentence carries information; no padding or repetition of the schema.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
An output schema exists so return values need no explanation, and the description covers the destructive-but-recoverable nature, authorization, and credit implications. It leaves some ambiguity about post-deletion state of related resources, which matters for a destructive tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the listing_id schema entry already documents the id format, source fields, and an example. The description adds nothing beyond naming the parameter, which is the expected baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Delete ... listings') plus the key qualifier 'soft-delete', which distinguishes it from a hard delete and from sibling status-changing tools like set_listing_status. Ownership scoping ('USER'S OWN') further narrows it.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Implies usage through the ownership restriction and notes the side effect about credits, but never states when to prefer it over set_listing_status or update_listing, nor any exclusions or prerequisites beyond ownership.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_conversationAIdempotentInspect
Read one of the user's OWN message conversations by thread_id, including its messages (marks incoming messages read). Only threads the authenticated user participates in are returned.
| Name | Required | Description | Default |
|---|---|---|---|
| thread_id | Yes | Conversation id (a UUID), taken from list_conversations. Example: "3f6c2a1e-8b4d-4c7a-9e21-5d0f7a6b1c34". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations indicate readOnlyHint=false, idempotentHint=true, and destructiveHint=false. The description adds important context beyond annotations: it discloses the side effect of marking incoming messages read and the authorization constraint that only threads the user participates in are returned. This goes beyond structured data without contradicting it.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is two concise sentences, front-loading the core action and side effect. Every sentence earns its place by conveying essential information without redundancy.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the tool's simplicity (one parameter, output schema present), the description covers the essential aspects: purpose, side effect, and authorization scope. An agent has enough to invoke it correctly without needing return value details.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the thread_id parameter is fully documented in the schema, including its UUID format and example. The description only restates 'by thread_id', adding no additional semantic meaning beyond the schema.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb ('Read') and resource ('message conversations'), with a clear scope ('user's OWN') and access method ('by thread_id'). It distinguishes from list_conversations by referring to a single conversation, but does not explicitly name the sibling alternative.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Usage is implied: use it to read a specific conversation by thread_id. However, there is no explicit guidance on when to use this tool versus list_conversations or reply_to_conversation, nor any when-not conditions.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_entitlementsARead-onlyInspect
Check the user's publishing entitlements BEFORE attempting to publish: membership tier, max vs current active listings, remaining slots, wallet credit balance, the per-listing credit cost, and can_create_listing. When the limit is reached the response indicates whether the user can pay from wallet credit or should open checkout (pay_url).
| Name | Required | Description | Default |
|---|---|---|---|
No parameters | |||
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered; the description adds real value by disclosing the decision branch at the limit — whether the user can pay from wallet credit or should be sent to checkout via pay_url. It does not discuss cost of calling, caching, or freshness of the balance, which keeps 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The action and its timing constraint are front-loaded in the first clause, and the second sentence carries only the branch-relevant information about pay_url. No sentence restates the name or wastes space.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With zero parameters and an output schema present, the description only needs to convey purpose and the actionable interpretation of the result, both of which it does. An agent knows when to call it and what to do with the limit-reached case.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
The tool takes zero parameters and the schema is trivially complete, so the baseline of 4 applies; there is nothing parameter-wise the description could usefully add.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Check the user's publishing entitlements') and then enumerates exactly what is returned: tier, max vs current active listings, remaining slots, wallet credit, per-listing cost, can_create_listing. This is unmistakably distinct from sibling mutations like create_listing or renew_listing, which the agent would otherwise be tempted to call directly.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
The capitalized 'BEFORE attempting to publish' gives clear temporal/conditional guidance that ties this call to the publish flow. It stops short of naming the sibling tool it gates (create_listing) or stating when-not to call it, so it is strong context rather than full routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
get_listingARead-onlyInspect
Fetch the full detail of ONE Teppek listing by id — title, description, price/salary, location and the Teppek contact route. Use after search_listings to show, summarize or compare a specific job, home, vehicle or service the user picked.
| Name | Required | Description | Default |
|---|---|---|---|
| listing_id | Yes | Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: "adzuna-us-5947308680". |
Output Schema
| Name | Required | Description |
|---|---|---|
| id | No | |
| url | No | |
| price | No | |
| title | No | |
| status | No | |
| currency | No | |
| vertical | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=true, so the safety profile is covered. The description adds useful scope ('ONE' listing, includes the Teppek contact route) but says nothing about behavior on an unknown/stale id, id reuse across sources, or rate limits — minor but real gaps for a lookup tool.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
A single tight sentence with the resource and scope front-loaded, followed by the routing condition. No filler, no repetition of the title or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the annotations plus a 100%-covered single parameter leave little else to disclose. The only gap is what happens on a missing or invalid listing_id, which the description omits.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% and the single parameter is fully documented in-schema, including its provenance ('id field of search_listings, semantic_search or list_my_listings') and a concrete example. The description only restates 'by id' and adds no syntax or format detail beyond the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Fetch the full detail of ONE Teppek listing by id') and enumerates the returned fields (title, description, price/salary, location, contact route). The 'ONE' emphasis and the 'after search_listings' framing clearly separate it from the bulk siblings search_listings, semantic_search and list_my_listings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent: 'Use after search_listings to show, summarize or compare a specific job, home, vehicle or service the user picked.' It names the prerequisite sibling and the intent (show/summarize/compare one item), though it does not state an explicit exclusion such as 'do not use to browse multiple listings — use search_listings instead'.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_conversationsARead-onlyInspect
List the user's OWN listing-message conversations (threads they started, or received as a listing owner), newest first. Resolved from the authenticated agent key — only ever this user's threads. Use get_conversation to read a thread's messages.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return per page, 1-50. Default 20. Example: 10. | |
| offset | No | How many results to skip, for paging. Default 0. Example: 20 returns the second page when limit is 20. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds real value beyond that: scoping is derived from the authenticated agent key ('only ever this user's threads') and results arrive newest-first — both call-behavior facts the schema does not carry.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two tight sentences: identity and scope first, then the cross-reference to get_conversation. No redundancy with the schema, no filler, nothing to trim.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Output schema exists, so return values needn't be described, and the schema fully covers paging parameters. With annotations handling safety and the description handling scoping, ordering, and the follow-up tool, an agent has everything needed to invoke this correctly.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100% — limit (1-50, default 20) and offset (paging, with a worked example) are fully documented in the schema. The description adds nothing about the parameters themselves, so baseline 3 applies; 'newest first' implies the sort key but not the paging semantics.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Names a specific verb+resource ('List ... listing-message conversations') and immediately bounds the scope to the caller's own threads (started, or received as a listing owner). It also states ordering ('newest first') and edges out the sibling get_conversation, so an agent can distinguish it without opening any schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly routes the agent onward: 'Use get_conversation to read a thread's messages,' which cleanly separates listing threads from reading one. It also clarifies that no user filter is needed. It stops short of stating when not to use it (e.g., searching across listings), so it's not a full when/when-not contract.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
list_my_listingsARead-onlyInspect
List the user's OWN listings (any status), newest first. Resolved from the authenticated agent key — only ever returns this user's listings. Use status='pending' to see what is awaiting moderation, status='rejected' for declined ones.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return per page, 1-50. Default 20. Example: 10. | |
| offset | No | How many results to skip, for paging. Default 0. Example: 20 returns the second page when limit is 20. | |
| status | No | Filter YOUR listings by moderation/lifecycle status. Use "pending" to see what is awaiting AI moderation, "rejected" for declined ones, "all" (default) for everything. | all |
Output Schema
| Name | Required | Description |
|---|---|---|
| success | Yes | |
| listings | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=true and openWorldHint=false, so the safety profile is covered. The description adds meaningful context beyond that: results are newest-first, scoped to the authenticated agent key, and can never leak other users' listings. Return shape is left to the output schema, which exists.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Three short sentences, front-loaded with the ownership scoping that is the tool's defining trait. The status sentence partially duplicates the schema's status description, so a small amount of text is not strictly earning its place.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With annotations, a full output schema, and 100% parameter coverage, the description covers what the agent needs: who the results belong to, ordering, and status filtering. Pagination is fully handled by the schema, so nothing critical is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so all three parameters are already documented in the schema, including the status enum and pagination semantics. The description's status examples largely restate the schema's own status description, adding only mild framing about 'awaiting moderation'.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('List the user's OWN listings'), plus scope ('any status') and ordering ('newest first'). The auth-key resolution sentence makes it unmistakable that this is owner-scoped, distinguishing it from search_listings without needing to name the sibling.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicitly directs the agent to status='pending' for moderation queues and status='rejected' for declines, which is real when-to-use guidance. It stops short of stating when to prefer get_listing or search_listings over this tool, so no explicit exclusions or alternative routing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
renew_listingAInspect
Renew one of the USER'S OWN listings — reset its expiry to 30 days from now (native listings lapse ~30 days after posting). Free — no credit charge. Renewing an expired listing returns it to active; a pending, rejected, sold, or draft listing cannot be renewed.
| Name | Required | Description | Default |
|---|---|---|---|
| listing_id | Yes | Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: "adzuna-us-5947308680". |
Output Schema
| Name | Required | Description |
|---|---|---|
| listing | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say this is a non-read-only, non-destructive, non-idempotent mutation; the description adds the actual effect (expiry reset to 30 days from now), the cost profile (free, no credit charge), and the state-transition rules. That is substantive behavioral context beyond the structured hints, including which listing states will fail.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the action and ownership scope, then cost, then eligibility in descending priority. Every clause carries distinct information with no repetition of the name or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need not be explained, and the key preconditions and side effects are covered. Minor gaps remain: no mention of auth/permission requirements or what happens on a repeated renewal given idempotentHint=false.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the single listing_id parameter is already documented with provenance (search_listings, semantic_search, list_my_listings) and an example. The description adds nothing about the parameter itself, so the baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (renew), a specific resource (a listing), and scope (one of the USER'S OWN listings), which separates it from update_listing or set_listing_status in the sibling set. The parenthetical about native listings lapsing ~30 days after posting explains what renewal means mechanically.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit eligibility rules: expired listings return to active, while pending, rejected, sold, or draft listings cannot be renewed. It does not name alternative tools (e.g., set_listing_status) for those ineligible states, so the agent must infer the fallback.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
reply_to_conversationAInspect
Continue an EXISTING message thread by thread_id — the message goes to the other participant. Use this to follow up in a conversation that already exists, whether the user is the listing owner answering an inquiry or the inquirer following up. For the FIRST message to a listing found in search (you have a listing_id but no thread yet), use send_message instead. Contact routes through Teppek; raw personal details are never exposed. Find thread_id via list_conversations / get_conversation.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The reply to post into the conversation, up to 2000 characters. Contact routes through Teppek; raw personal details are never exposed. Example: "That time works for me." | |
| thread_id | Yes | Conversation id (a UUID), taken from list_conversations. Example: "3f6c2a1e-8b4d-4c7a-9e21-5d0f7a6b1c34". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint=false, openWorldHint=true, idempotentHint=false, and destructiveHint=false, so the safety profile is covered. The description adds useful behavioral context: the message goes to the other participant and contact routes through Teppek without exposing raw personal details. It does not add much about failure modes or duplicate-send behavior, but the annotations carry that burden.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with the core action, then immediately covers usage, the alternative tool, privacy routing, and thread_id discovery. It is appropriately sized with no wasted sentences.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the full schema coverage, annotations, and an output schema, the description provides everything an agent needs: purpose, when to use it, the sibling alternative, thread_id source, and privacy behavior. No critical context is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, so both parameters are already well documented with examples and constraints. The description adds the source for thread_id (list_conversations / get_conversation), but otherwise the schema does the heavy lifting, making 3 the appropriate baseline.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: continue an existing message thread by thread_id, with the message going to the other participant. It clearly distinguishes this from send_message for first contact, so an agent can select it without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It explicitly says when to use this tool (follow up in an existing conversation) and when not to use it (first message to a listing found in search should use send_message). It also tells the agent where to obtain thread_id via list_conversations or get_conversation.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
request_image_uploadAInspect
Get a short-lived upload grant to attach a photo to a listing you're about to publish (any vertical/role). Returns { key, upload_url, upload_token, headers_required }: PUT the raw image bytes to upload_url with those headers, then pass the returned key in create_listing's images array. Images are AI-moderated for content safety before the listing goes live.
| Name | Required | Description | Default |
|---|---|---|---|
| file_size | Yes | Exact file size in bytes, at most 10485760 (10 MB). Example: 2097152 for a 2 MB file. | |
| content_type | Yes | MIME type of the image file. Example: "image/png". |
Output Schema
| Name | Required | Description |
|---|---|---|
| key | No | |
| upload_url | No | |
| upload_token | No | |
| headers_required | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare the operation is not read-only, not idempotent, and not destructive; the description adds substantive behavior: the grant is short-lived, returns upload credentials, requires a PUT of raw bytes with specified headers, and triggers AI moderation before the listing goes live. There is no contradiction with 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.
Is the description appropriately sized, front-loaded, and free of redundancy?
The description is front-loaded with purpose, then provides the return shape and upload workflow, then closes with the moderation note. Every sentence carries useful information and there is no redundant restatement.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
Given the simple two-parameter schema, full schema coverage, annotations, and an output schema, the description supplies everything an agent needs: the grant workflow, how to use the returned fields, where the key goes, and the moderation gate. No critical operational detail is missing for this tool.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema description coverage is 100%, with both content_type and file_size fully documented, including the enum and 10 MB maximum. The description adds workflow context but does not add meaning beyond the schema for either parameter, so the baseline of 3 is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
The description states a specific verb and resource: get a short-lived upload grant for attaching a photo to a listing about to be published. It also names create_listing as the downstream consumer, which distinguishes this pre-publish upload grant from update_listing_images used for existing listings.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
It clearly states the context: use this when you need to attach an image to a listing you're about to publish, then pass the returned key into create_listing's images array. It does not explicitly mention the update_listing_images alternative or when not to use this tool, 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.
search_listingsARead-onlyInspect
Find live jobs, homes/rentals, vehicles, or local services NEAR a place or in a city/country on Teppek — use this for natural requests like "jobs near me", "apartments in Berlin", "used cars under 10k in Madrid", "plumbers nearby". Worldwide, with fresh, location-aware listings refreshed daily. For MEANING-based or fuzzy natural-language intent (not exact keywords or filters), use semantic_search instead. Mechanics: search by vertical (career/real_estate/vehicle/service), role, text, price and a radius around a lat/lon point. The role is the perspective you search AS and returns the COUNTERPARTY listings: to find JOB POSTINGS use role="career_seeker" (NOT career_employer, which searches candidate CVs). Always send role with text_query: without it the call fails with an error, and vertical alone is not enough. country, category and near work without role; a call with none of text_query, country, category or near returns nothing. Real estate inventory is currently very limited, so an empty real_estate result does not mean the search failed. The response meta.total is the REAL match count (independent of limit); for a multi-word text_query it counts listings matching ANY of the words, so to count a whole occupation/category include its synonyms (e.g. "waiter waitress server"). Use the country field for country-scoped totals. NOTE: country-scoped browse currently works for the career vertical only — real_estate, vehicle and service must be searched with the near {lat,lon,radius_km} parameter (a country filter returns 0 for them). meta.ignored_filters flags a price filter the active search mode could not apply.
| Name | Required | Description | Default |
|---|---|---|---|
| near | No | Radius search around a point, and the way to search real_estate, vehicle and service by place. Works without role or text_query. Example: { "lat": 48.85, "lon": 2.35, "radius_km": 25 }. | |
| role | No | The perspective you search AS — results are the matching COUNTERPARTY listings, not your own side. To browse JOB POSTINGS use "career_seeker" (you act as a job seeker looking for jobs); "career_employer" instead searches candidate/CV listings. Likewise: estate_buyer → properties for sale, estate_renter → rentals, vehicle_buyer → vehicles for sale, vehicle_renter → vehicles for rent, service_client → service providers. REQUIRED whenever text_query is sent; also works with near. | |
| limit | No | Maximum results to return per page, 1-50. Default 20. Example: 10. | |
| offset | No | How many results to skip, for paging, up to 1000. Default 0. Example: 20 returns the second page when limit is 20. meta.has_more says whether more results exist. Past 1000, narrow the search with filters. | |
| country | No | Optional ISO-3166 alpha-2 country code (e.g. "us", "gb", "de") to scope results to one country and get a real total count for it. Career vertical only. Combine with role + text_query to count/list within a country (e.g. role:"career_seeker", country:"de", text_query:"kellner"); use country alone (no text_query) to get the total number of listings in that country. | |
| sort_by | No | Optional ordering: "price_asc" = cheapest first, "price_desc" = most expensive first. Use price_asc for "cheapest ..." requests. Omit for the default order. Not applied to `near` searches. Currency-naive raw-number sort, so scope by vertical/country when mixing currencies. | |
| category | No | Optional PRECISE occupation/category filter using the source category slug (e.g. "hospitality-catering-jobs" for waiters/chefs/bar, "it-jobs", "retail-jobs"). This is far more accurate than keyword text_query for counting an occupation. With no text_query, the response meta.total is the exact count for that category (optionally + country), and meta.categories lists the available category slugs with counts — call once with country alone to discover them. | |
| vertical | No | Listing category: career (jobs and CVs), real_estate, vehicle or service. It does not replace `role`: a text_query still needs role. Example: "vehicle". | |
| price_max | No | Maximum price/salary. Currency-naive raw-number compare (see price_min). If unapplied it appears in meta.ignored_filters. Example: 2000. | |
| price_min | No | Minimum price/salary. CURRENCY-NAIVE: compared as a raw number against the listing price without normalizing currencies, so scope with `country` (or a role/vertical) when mixing regions. If the response cannot apply it, price_min is listed in meta.ignored_filters. Example: 500. | |
| text_query | No | Keywords matched against listing text. Always send `role` with it: without role the search fails or returns nothing, and vertical alone is not enough. Several words match listings containing ANY of them. Example: "toyota". | |
| intent_type | No | Which side of the market to return: supply = things on offer (job postings, homes, vehicles, services), demand = people looking for them. Usually unnecessary when role is set. Example: "supply". |
Output Schema
| Name | Required | Description |
|---|---|---|
| data | Yes | |
| meta | No |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Adds a lot beyond readOnlyHint/openWorldHint: country-scoped browse only works for the career vertical (0 results elsewhere), real_estate inventory is thin so empty results are expected, price filters may be silently dropped and surface in meta.ignored_filters, and sorting is currency-naive. These are failure modes the agent could not infer from annotations.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Core guidance is front-loaded, but the text is overlong and repeats the role/text_query rule twice, contains a garbled fragment ('country, category and near work without role'), and mixes mechanics, caveats and counting advice in one dense block. Every fact earns its place individually, but the packaging costs readability.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 12-parameter, zero-required tool with a nested `near` object, the description covers the traps that matter: empty-result semantics, which filters apply in which mode, how meta.total counts multi-word queries, and how to page. An output schema exists, so return-shape detail is correctly omitted.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% (baseline 3), but the description goes well beyond it: it explains that role is the perspective you search AS and returns the counterparty side (career_seeker for job postings, not career_employer), that country is career-only, that category slugs beat keyword counting, and that intent_type is usually redundant when role is set.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (find/search) and resource (live listings across four verticals), and explicitly names the sibling it is not: semantic_search for meaning-based intent. Example queries map natural-language requests onto the tool, so the agent can tell it apart from semantic_search and list_my_listings 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.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing: exact keywords/filters go here, fuzzy/meaning-based intent goes to semantic_search. It also gives concrete when-to-use examples and states the precondition that text_query requires role, plus which filter combinations yield nothing.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
semantic_searchARead-onlyInspect
Semantic (meaning-based) search over Teppek's live listings, backed by a multilingual embedding index. Use it when the user describes what they want in natural language rather than exact keywords — e.g. "outdoor jobs that don't need a degree", "affordable family cars that are good in snow", "a cosy studio close to the university". Returns the closest-matching ACTIVE listings ranked by semantic similarity (each item carries a score). Complements search_listings: prefer search_listings for precise keyword/role/country/category/price filtering and exact counts; prefer semantic_search when meaning, synonyms, or fuzzy intent matter more than literal terms. Optional vertical narrows to career/real_estate/vehicle/service.
| Name | Required | Description | Default |
|---|---|---|---|
| limit | No | Maximum results to return, 1-20. Default 20. Example: 10. | |
| query | Yes | Natural-language description of what the user wants (e.g. "quiet night-shift jobs that do not need a degree", "cosy family flat near a park"). Matched by MEANING against the listing text, not exact keywords. | |
| vertical | No | Optional vertical filter (career | real_estate | vehicle | service) applied server-side to the active listings before they are returned. |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare readOnlyHint and openWorldHint, but the description adds real behavioral context: results are restricted to ACTIVE listings, ranked by semantic similarity, and each item carries a `score`. It does not discuss cost, rate limits, or behavior on an empty/ambiguous query, which keeps it from a 5.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loaded with the purpose, then the usage contrast, then the optional filter — a sensible ordering with no filler. It runs slightly long with three illustrative example queries plus additional examples carried in the schema, so a small trim would be possible.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a read-only, three-parameter search tool with full schema coverage and an output schema, the description covers everything an agent needs: what it searches, how results are ranked and filtered, and when to choose it over the sibling. Return-value detail is delegated appropriately to the output schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the schema already documents all three parameters and the enum. The description still adds value by characterizing `query` as natural-language meaning-matched intent and by explaining that `vertical` narrows to career/real_estate/vehicle/service server-side.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('Semantic (meaning-based) search over Teppek's live listings') and immediately qualifies the mechanism (multilingual embedding index, ranked by similarity). It explicitly contrasts with search_listings, so an agent can distinguish the two without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives explicit routing rules in both directions: 'prefer search_listings for precise keyword/role/country/category/price filtering and exact counts; prefer semantic_search when meaning, synonyms, or fuzzy intent matter.' It also supplies concrete example queries that define the intended input class.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
send_messageAInspect
START contact with the owner of a Teppek LISTING on the user's behalf (identified by the listing) — the primary FIRST-CONTACT path (there is no price-offer/accept/reject flow). Opens a private thread with the owner; contact routes through Teppek and never exposes raw personal details. To continue a thread that already EXISTS (you have a thread_id from list_conversations), use reply_to_conversation instead. External-feed listings (e.g. imported jobs) have no Teppek owner, so this returns a redirect to the external application URL instead of creating a thread. Requires the user to be connected to Teppek: an anonymous call returns an AUTH_REQUIRED error with an authorize_url — surface 'Connect with Teppek' to the user, then retry.
| Name | Required | Description | Default |
|---|---|---|---|
| body | Yes | The message to send to the listing owner, up to 2000 characters. Contact routes through Teppek; raw personal details are never exposed. Example: "Hello, can I view the flat this week?" | |
| listing_id | Yes | Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: "adzuna-us-5947308680". |
Output Schema
| Name | Required | Description |
|---|---|---|
No output parameters | ||
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations only say non-readonly, open-world, non-idempotent, non-destructive; the description goes further by disclosing that contact is mediated through Teppek so raw personal details are never exposed, that external listings return a redirect rather than a thread, and that anonymous calls fail with a specific error and remediation flow. That is substantive behavioral context beyond the structured fields.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the core action and the sibling distinction in the first sentence, then layers edge cases in descending priority. It is dense and em-dash-heavy and slightly long, but no sentence is filler — the redirect and auth clauses both carry needed behavior.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return-value detail is not required, yet the description still explains the two non-obvious outcomes (redirect for external listings, AUTH_REQUIRED + authorize_url) that an agent must handle. Nothing blocking a correct call is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and both params are documented in-schema (body length limit, listing_id provenance from search_listings/semantic_search/list_my_listings). The description adds only the notion that the listing identifies the owner's thread target, which is largely implied by the schema, so baseline 3 applies.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb and resource ('START contact with the owner of a Teppek LISTING on the user's behalf') and immediately scopes it as the primary first-contact path with no price-offer/accept/reject flow. It also names the contrasting sibling (reply_to_conversation) so the agent can distinguish it without opening either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explicit routing rule: use this to open a NEW thread, use reply_to_conversation when a thread_id already exists. It also covers the external-feed case (redirect instead of thread) and the unauthenticated case (AUTH_REQUIRED with authorize_url, then retry), which are exactly the branch conditions an agent needs.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
set_listing_statusAIdempotentInspect
Change the lifecycle status of one of the USER'S OWN listings: mark it sold, hide it (take it offline), or re-activate a hidden one. Free — no credit charge. Cannot set moderation states (pending/rejected); re-activating only works on a listing that was previously approved and is currently hidden.
| Name | Required | Description | Default |
|---|---|---|---|
| status | Yes | sold = mark the listing sold/closed; hidden = temporarily take a live listing offline; active = re-show a listing that is currently hidden (only works if it was previously approved). Cannot set moderation states. | |
| listing_id | Yes | Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: "adzuna-us-5947308680". |
Output Schema
| Name | Required | Description |
|---|---|---|
| listing | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Annotations already declare non-destructive, idempotent, non-read-only behavior, so the bar is lower; the description adds real value with 'Free — no credit charge' and the hard constraint that moderation states cannot be set. It stops short of describing failure behavior (e.g. setting active on an already-active listing) or what happens to the listing's visibility/searchability.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Two dense sentences, front-loaded with the action and scope, followed by cost and constraints. No filler or restatement of the tool name.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and annotations cover the safety profile. The cost note and state-transition preconditions fill the remaining gaps; only error/edge-case behavior is left implicit.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100% and the enum already documents status semantics, so the description's status explanation is largely duplicative. The only added semantics is the ownership restriction implied by 'USER'S OWN listings', which the schema's listing_id description does not state.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a specific verb (change lifecycle status) applied to a specific resource (one of the USER'S OWN listings), and enumerates the three target states. Ownership scoping plus the 'cannot set moderation states' line clearly separates it from delete_listing and update_listing.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Explains each state's meaning in actionable terms ('hide it (take it offline)', 're-activate a hidden one') and the precondition for reactivation (previously approved, currently hidden). It does not, however, name sibling alternatives such as delete_listing or renew_listing to route the agent explicitly.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_listingAIdempotentInspect
Edit fields (title, description, price, currency, location, details) on one of the USER'S OWN listings, identified by listing_id. Only the owner can edit; vertical/intent_type/role are fixed (publish a new listing to change those). Editing is free (no credit charge). Changing the title, description, location or details re-triggers AI moderation: the listing returns to 'pending' and is offline until cleared. Price/currency-only edits stay live.
| Name | Required | Description | Default |
|---|---|---|---|
| price | No | New asking price as a plain number. To change a salary range use details.salary_min and details.salary_max. Example: 950. | |
| title | No | New headline, 3-200 characters. Returns the listing to "pending". Example: "Two-bedroom flat near the river". | |
| details | No | Vertical-specific attributes to change. Only these exact keys for the listing's vertical are accepted; any other key is rejected with an error. career: organization_name, employment_type, salary_min, salary_max, years_experience. real_estate: property_room_count, m2_gross, m2_net, building_age, floor_number, heating_type, deposit, dues, is_furnished, is_student_friendly, is_credit_eligible, tapu_status. vehicle: brand, model, vehicle_model_year, vehicle_mileage_km, fuel_type, gear_type, color, damage_status, daily_price, deposit. service: service_category. employment_type is one of full_time, part_time, contract, freelance, internship. is_furnished, is_student_friendly and is_credit_eligible are booleans. Any details edit returns the listing to "pending", so it goes offline until AI moderation clears it. Example: { "m2_gross": 90 }. | |
| currency | No | New ISO-4217 currency code. Example: "EUR". | |
| location | No | New listing coordinates { lat, lon }. Moving a listing re-triggers AI moderation — it returns to "pending" until cleared. Example: { "lat": 48.85, "lon": 2.35 }. | |
| listing_id | Yes | Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: "adzuna-us-5947308680". | |
| description | No | New full listing text, up to 5000 characters. Returns the listing to "pending". Example: "Bright flat on the third floor, five minutes from the metro." |
Output Schema
| Name | Required | Description |
|---|---|---|
| listing | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Discloses non-obvious side effects the annotations cannot convey: title/description/location/details edits re-trigger AI moderation, the listing drops to 'pending' and goes offline until cleared, while price/currency-only edits stay live. It also states the edit is free (no credit charge) and is owner-restricted. Consistent with readOnlyHint=false, destructiveHint=false, idempotentHint=true.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Four dense sentences, each doing distinct work: scope, permissions/immutability, cost, and the moderation consequence with its price/currency exception. Front-loaded with the highest-value information and no filler.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
For a 7-parameter mutation tool with nested objects, an output schema, and full annotations, the description covers everything an agent needs to call it correctly: identity, ownership, editable vs fixed fields, cost, and the moderation/availability consequence. Remaining details live in the rich schema.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so per-parameter detail is already carried by the schema (including the detailed vertical-specific `details` keys). The description still adds value by enumerating the editable field set up front and by declaring vertical/intent_type/role non-editable despite additionalProperties=false. It stops short of restating per-parameter formats, which is appropriate.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
Opens with a specific verb+resource ("Edit fields ... on one of the USER'S OWN listings"), enumerates the editable fields, and anchors identity to listing_id. It also explicitly separates itself from create_listing for vertical/intent_type/role changes, so an agent can route between them without opening the schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
States the precondition ("Only the owner can edit"), what cannot be changed here and the alternative that does it ("publish a new listing to change those"), and the cost condition. Clear when-to-use and when-to-instead-go-elsewhere guidance.
Agents often have multiple tools that could apply. Explicit usage guidance like "use X instead of Y when Z" prevents misuse.
update_listing_imagesAInspect
Add and/or remove photos on one of the USER'S OWN existing listings (max 6 total). First call request_image_upload for each new image and upload the bytes, then pass the returned keys in add; a key with no uploaded file fails with image_not_uploaded. Adding any image re-triggers AI moderation — the listing returns to 'pending' until the new images are cleared. Removing images leaves a live listing live; on a pending or rejected listing it requests a new moderation verdict. Free (no credit).
| Name | Required | Description | Default |
|---|---|---|---|
| add | No | Image keys from request_image_upload to attach (upload the bytes first). Each newly-added image is AI-moderated with the listing, so the listing returns to "pending" until cleared. Max 6 images total on a listing. Example: ["7c9e6679-7425-40de-944b-e07fc1f90ae7"]. | |
| remove | No | Image keys currently on the listing to detach. Removing alone does not trigger moderation. Example: ["7c9e6679-7425-40de-944b-e07fc1f90ae7"]. | |
| listing_id | Yes | Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: "adzuna-us-5947308680". |
Output Schema
| Name | Required | Description |
|---|---|---|
| listing | Yes | |
| success | Yes |
TDQS
Does the description disclose side effects, auth requirements, rate limits, or destructive behavior?
Goes well past the annotations by disclosing the moderation consequence (adding any image re-triggers AI moderation and the listing returns to 'pending'), the asymmetric effect of removal (live stays live; pending/rejected requests a new verdict), the specific failure mode, and the cost (free, no credit). These are exactly the side effects an agent cannot infer from readOnlyHint=false / destructiveHint=false.
Agents need to know what a tool does to the world before calling it. Descriptions should go beyond structured annotations to explain consequences.
Is the description appropriately sized, front-loaded, and free of redundancy?
Front-loads the operation and scope, then the workflow, then the side effects, then cost — a sensible priority order. Every clause carries information; nothing is repeated from the schema or annotations.
Shorter descriptions cost fewer tokens and are easier for agents to parse. Every sentence should earn its place.
Given the tool's complexity, does the description cover enough for an agent to succeed on first attempt?
With an output schema present, return values need no explanation, and the description covers the remaining risk surface: moderation state transitions, total-image cap, upload prerequisite, failure mode, and pricing. Nothing needed to invoke this correctly is missing.
Complex tools with many parameters or behaviors need more documentation. Simple tools need less. This dimension scales expectations accordingly.
Does the description clarify parameter syntax, constraints, interactions, or defaults beyond what the schema provides?
Schema coverage is 100%, so the baseline is 3, but the description adds genuine meaning: `add` entries must be keys returned by request_image_upload with bytes already uploaded, and the 6-image cap is a listing-wide total rather than a per-call limit. It is marginally less explicit about `remove` keys being on-listing, though that is stated.
Input schemas describe structure but not intent. Descriptions should explain non-obvious parameter relationships and valid value ranges.
Does the description clearly state what the tool does and how it differs from similar tools?
States a precise verb pair (add and/or remove) plus the resource (photos) and the scope constraint (one of the USER'S OWN existing listings, max 6 total). That scoping cleanly separates it from update_listing and from request_image_upload without needing to open either schema.
Agents choose between tools based on descriptions. A clear purpose with a specific verb and resource helps agents select the right tool.
Does the description explain when to use this tool, when not to, or what alternatives exist?
Gives an explicit ordered workflow: call request_image_upload per new image, upload the bytes, then pass the returned keys in `add`. It names the prerequisite tool directly and warns that a key with no uploaded file fails with image_not_uploaded, so there is no ambiguity about sequencing or the alternative path.
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.
16 tool updates
- Changed
create_listing14 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / description / descriptionAdded value: +"Full listing text, up to 5000 characters. Facts that fit a `details` key belong in details as well. Example: \"Bright flat on the third floor, five minutes from the metro.\"" - removed
Input schema / properties / details / additionalProperties / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } -] - added
Input schema / properties / details / additionalProperties / typeAdded value: +[ + "string", + "number", + "boolean" +] - added
Input schema / properties / details / descriptionAdded value: +"Vertical-specific attributes. Only these exact keys for the listing's vertical are accepted; any other key is rejected with an error. career: organization_name, employment_type, salary_min, salary_max, years_experience. real_estate: property_room_count, m2_gross, m2_net, building_age, floor_number, heating_type, deposit, dues, is_furnished, is_student_friendly, is_credit_eligible, tapu_status. vehicle: brand, model, vehicle_model_year, vehicle_mileage_km, fuel_type, gear_type, color, damage_status, daily_price, deposit. service: service_category. employment_type is one of full_time, part_time, contract, freelance, internship. is_furnished, is_student_friendly and is_credit_eligible are booleans. real_estate also accepts transaction_type (sale, rent or hire). Example: { \"brand\": \"Toyota\", \"model\": \"Corolla\", \"vehicle_model_year\": 2021, \"vehicle_mileage_km\": 40000, \"fuel_type\": \"hybrid\", \"gear_type\": \"manual\" }." - added
Input schema / properties / images / descriptionAdded value: +"Up to 6 image keys returned by request_image_upload, uploaded before this call. Example: [\"7c9e6679-7425-40de-944b-e07fc1f90ae7\"]." - changed
Input schema / properties / location / descriptionPrevious value: -"Listing coordinates as { lat, lon }. A free-text address is NOT accepted — resolve it to coordinates before calling."New value: +"Listing coordinates as { lat, lon }. A free-text address is NOT accepted — resolve it to coordinates before calling. Example: { \"lat\": 48.85, \"lon\": 2.35 }." - added
Input schema / properties / location / properties / lat / descriptionAdded value: +"Latitude in decimal degrees. Example: 48.85." - added
Input schema / properties / location / properties / lon / descriptionAdded value: +"Longitude in decimal degrees. Example: 2.35." - added
Input schema / properties / price / descriptionAdded value: +"Asking price as a plain number in `currency`, with no separators. For a job, use the salary figure and put the range in details.salary_min and details.salary_max. Example: 950." - added
Input schema / properties / title / descriptionAdded value: +"Short headline of the listing, 3-200 characters. Example: \"Two-bedroom flat near the river\"." - added
Input schema / properties / vertical / descriptionAdded value: +"Listing category, which must match the role: career (jobs and CVs), real_estate, vehicle or service. Example: \"vehicle\"." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
delete_listing4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / listing_id / descriptionAdded value: +"Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: \"adzuna-us-5947308680\"." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_conversation4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / thread_id / descriptionAdded value: +"Conversation id (a UUID), taken from list_conversations. Example: \"3f6c2a1e-8b4d-4c7a-9e21-5d0f7a6b1c34\"." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_entitlements3 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
get_listing14 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / listing_id / descriptionAdded value: +"Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: \"adzuna-us-5947308680\"." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / properties / currency / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / currency / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / price / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / price / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / title / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / vertical / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / vertical / typeAdded value: +[ + "string", + "null" +]
- Changed
list_conversations5 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Maximum results to return per page, 1-50. Default 20. Example: 10." - added
Input schema / properties / offset / descriptionAdded value: +"How many results to skip, for paging. Default 0. Example: 20 returns the second page when limit is 20." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
list_my_listings15 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Maximum results to return per page, 1-50. Default 20. Example: 10." - added
Input schema / properties / offset / descriptionAdded value: +"How many results to skip, for paging. Default 0. Example: 20 returns the second page when limit is 20." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / properties / listings / items / properties / currency / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listings / items / properties / currency / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listings / items / properties / price / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / listings / items / properties / price / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / listings / items / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listings / items / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listings / items / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listings / items / properties / title / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listings / items / properties / vertical / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listings / items / properties / vertical / typeAdded value: +[ + "string", + "null" +]
- Changed
renew_listing14 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / listing_id / descriptionAdded value: +"Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: \"adzuna-us-5947308680\"." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / properties / listing / properties / currency / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / currency / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / price / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / price / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / listing / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / title / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / vertical / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / vertical / typeAdded value: +[ + "string", + "null" +]
- Changed
reply_to_conversation5 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / body / descriptionPrevious value: -"The reply to post into the conversation. Contact routes through Teppek; raw personal details are never exposed."New value: +"The reply to post into the conversation, up to 2000 characters. Contact routes through Teppek; raw personal details are never exposed. Example: \"That time works for me.\"" - added
Input schema / properties / thread_id / descriptionAdded value: +"Conversation id (a UUID), taken from list_conversations. Example: \"3f6c2a1e-8b4d-4c7a-9e21-5d0f7a6b1c34\"." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
request_image_upload6 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / content_type / descriptionAdded value: +"MIME type of the image file. Example: \"image/png\"." - changed
Input schema / properties / content_type / enumPrevious value: -[ - "image/jpeg", - "image/png", - "image/webp", - "image/avif" -]New value: +[ + "image/jpeg", + "image/png", + "image/webp" +] - added
Input schema / properties / file_size / descriptionAdded value: +"Exact file size in bytes, at most 10485760 (10 MB). Example: 2097152 for a 2 MB file." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
search_listings28 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / country / descriptionPrevious value: -"Optional ISO-3166 alpha-2 country code (e.g. \"us\", \"gb\", \"de\") to scope results to one country and get a real total count for it. Combine with text_query to count/list within a country (e.g. country:\"us\" + text_query:\"waiter\"); use country alone (no text_query) to get the total number of listings in that country."New value: +"Optional ISO-3166 alpha-2 country code (e.g. \"us\", \"gb\", \"de\") to scope results to one country and get a real total count for it. Career vertical only. Combine with role + text_query to count/list within a country (e.g. role:\"career_seeker\", country:\"de\", text_query:\"kellner\"); use country alone (no text_query) to get the total number of listings in that country." - added
Input schema / properties / intent_type / descriptionAdded value: +"Which side of the market to return: supply = things on offer (job postings, homes, vehicles, services), demand = people looking for them. Usually unnecessary when role is set. Example: \"supply\"." - added
Input schema / properties / limit / descriptionAdded value: +"Maximum results to return per page, 1-50. Default 20. Example: 10." - added
Input schema / properties / near / descriptionAdded value: +"Radius search around a point, and the way to search real_estate, vehicle and service by place. Works without role or text_query. Example: { \"lat\": 48.85, \"lon\": 2.35, \"radius_km\": 25 }." - added
Input schema / properties / near / properties / lat / descriptionAdded value: +"Latitude in decimal degrees. Example: 48.85." - added
Input schema / properties / near / properties / lon / descriptionAdded value: +"Longitude in decimal degrees. Example: 2.35." - added
Input schema / properties / near / properties / radius_km / descriptionAdded value: +"Search radius in kilometres, up to 200. Default 10. Example: 25." - added
Input schema / properties / offset / descriptionAdded value: +"How many results to skip, for paging, up to 1000. Default 0. Example: 20 returns the second page when limit is 20. meta.has_more says whether more results exist. Past 1000, narrow the search with filters." - changed
Input schema / properties / offset / maximumPrevious value: -9007199254740991New value: +1000 - changed
Input schema / properties / price_max / descriptionPrevious value: -"Maximum price/salary. Currency-naive raw-number compare (see price_min). If unapplied it appears in meta.ignored_filters."New value: +"Maximum price/salary. Currency-naive raw-number compare (see price_min). If unapplied it appears in meta.ignored_filters. Example: 2000." - changed
Input schema / properties / price_min / descriptionPrevious value: -"Minimum price/salary. CURRENCY-NAIVE: compared as a raw number against the listing price without normalizing currencies, so scope with `country` (or a role/vertical) when mixing regions. If the response cannot apply it, price_min is listed in meta.ignored_filters."New value: +"Minimum price/salary. CURRENCY-NAIVE: compared as a raw number against the listing price without normalizing currencies, so scope with `country` (or a role/vertical) when mixing regions. If the response cannot apply it, price_min is listed in meta.ignored_filters. Example: 500." - changed
Input schema / properties / role / descriptionPrevious value: -"The perspective you search AS — results are the matching COUNTERPARTY listings, not your own side. To browse JOB POSTINGS use \"career_seeker\" (you act as a job seeker looking for jobs); \"career_employer\" instead searches candidate/CV listings. Likewise: estate_buyer → properties for sale, estate_renter → rentals, vehicle_buyer → vehicles for sale, vehicle_renter → vehicles for rent, service_client → service providers. Pair with text_query and/or near."New value: +"The perspective you search AS — results are the matching COUNTERPARTY listings, not your own side. To browse JOB POSTINGS use \"career_seeker\" (you act as a job seeker looking for jobs); \"career_employer\" instead searches candidate/CV listings. Likewise: estate_buyer → properties for sale, estate_renter → rentals, vehicle_buyer → vehicles for sale, vehicle_renter → vehicles for rent, service_client → service providers. REQUIRED whenever text_query is sent; also works with near." - changed
Input schema / properties / sort_by / descriptionPrevious value: -"Optional ordering: \"price_asc\" = cheapest first, \"price_desc\" = most expensive first. Use price_asc for \"cheapest ...\" requests. Omit for the default (most recent first). Currency-naive raw-number sort, so scope by vertical/country when mixing currencies."New value: +"Optional ordering: \"price_asc\" = cheapest first, \"price_desc\" = most expensive first. Use price_asc for \"cheapest ...\" requests. Omit for the default order. Not applied to `near` searches. Currency-naive raw-number sort, so scope by vertical/country when mixing currencies." - added
Input schema / properties / text_query / descriptionAdded value: +"Keywords matched against listing text. Always send `role` with it: without role the search fails or returns nothing, and vertical alone is not enough. Several words match listings containing ANY of them. Example: \"toyota\"." - added
Input schema / properties / vertical / descriptionAdded value: +"Listing category: career (jobs and CVs), real_estate, vehicle or service. It does not replace `role`: a text_query still needs role. Example: \"vehicle\"." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / properties / data / items / properties / currency / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / currency / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / price / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / price / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / data / items / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / title / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / data / items / properties / vertical / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / data / items / properties / vertical / typeAdded value: +[ + "string", + "null" +]
- Changed
semantic_search4 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / limit / descriptionAdded value: +"Maximum results to return, 1-20. Default 20. Example: 10." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
send_message5 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / body / descriptionPrevious value: -"The message to send to the listing owner. Contact routes through Teppek; raw personal details are never exposed."New value: +"The message to send to the listing owner, up to 2000 characters. Contact routes through Teppek; raw personal details are never exposed. Example: \"Hello, can I view the flat this week?\"" - added
Input schema / properties / listing_id / descriptionAdded value: +"Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: \"adzuna-us-5947308680\"." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema"
- Changed
set_listing_status14 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / listing_id / descriptionAdded value: +"Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: \"adzuna-us-5947308680\"." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / properties / listing / properties / currency / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / currency / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / price / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / price / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / listing / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / title / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / vertical / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / vertical / typeAdded value: +[ + "string", + "null" +]
- Changed
update_listing24 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - added
Input schema / properties / currency / descriptionAdded value: +"New ISO-4217 currency code. Example: \"EUR\"." - added
Input schema / properties / description / descriptionAdded value: +"New full listing text, up to 5000 characters. Returns the listing to \"pending\". Example: \"Bright flat on the third floor, five minutes from the metro.\"" - removed
Input schema / properties / details / additionalProperties / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "number" - }, - { - "type": "boolean" - } -] - added
Input schema / properties / details / additionalProperties / typeAdded value: +[ + "string", + "number", + "boolean" +] - added
Input schema / properties / details / descriptionAdded value: +"Vertical-specific attributes to change. Only these exact keys for the listing's vertical are accepted; any other key is rejected with an error. career: organization_name, employment_type, salary_min, salary_max, years_experience. real_estate: property_room_count, m2_gross, m2_net, building_age, floor_number, heating_type, deposit, dues, is_furnished, is_student_friendly, is_credit_eligible, tapu_status. vehicle: brand, model, vehicle_model_year, vehicle_mileage_km, fuel_type, gear_type, color, damage_status, daily_price, deposit. service: service_category. employment_type is one of full_time, part_time, contract, freelance, internship. is_furnished, is_student_friendly and is_credit_eligible are booleans. Any details edit returns the listing to \"pending\", so it goes offline until AI moderation clears it. Example: { \"m2_gross\": 90 }." - added
Input schema / properties / listing_id / descriptionAdded value: +"Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: \"adzuna-us-5947308680\"." - changed
Input schema / properties / location / descriptionPrevious value: -"New listing coordinates { lat, lon }. Moving a listing re-triggers AI moderation — it returns to \"pending\" until cleared."New value: +"New listing coordinates { lat, lon }. Moving a listing re-triggers AI moderation — it returns to \"pending\" until cleared. Example: { \"lat\": 48.85, \"lon\": 2.35 }." - added
Input schema / properties / location / properties / lat / descriptionAdded value: +"Latitude in decimal degrees. Example: 48.85." - added
Input schema / properties / location / properties / lon / descriptionAdded value: +"Longitude in decimal degrees. Example: 2.35." - added
Input schema / properties / price / descriptionAdded value: +"New asking price as a plain number. To change a salary range use details.salary_min and details.salary_max. Example: 950." - added
Input schema / properties / title / descriptionAdded value: +"New headline, 3-200 characters. Returns the listing to \"pending\". Example: \"Two-bedroom flat near the river\"." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / properties / listing / properties / currency / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / currency / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / price / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / price / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / listing / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / title / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / vertical / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / vertical / typeAdded value: +[ + "string", + "null" +]
- Changed
update_listing_images16 fields changed- changed
Input schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - added
Input schema / additionalPropertiesAdded value: +false - changed
Input schema / properties / add / descriptionPrevious value: -"Image keys from request_image_upload to attach (upload the bytes first). Each newly-added image is AI-moderated with the listing, so the listing returns to \"pending\" until cleared. Max 6 images total on a listing."New value: +"Image keys from request_image_upload to attach (upload the bytes first). Each newly-added image is AI-moderated with the listing, so the listing returns to \"pending\" until cleared. Max 6 images total on a listing. Example: [\"7c9e6679-7425-40de-944b-e07fc1f90ae7\"]." - added
Input schema / properties / listing_id / descriptionAdded value: +"Listing id, taken from the `id` field of search_listings, semantic_search or list_my_listings results. Example: \"adzuna-us-5947308680\"." - changed
Input schema / properties / remove / descriptionPrevious value: -"Image keys currently on the listing to detach."New value: +"Image keys currently on the listing to detach. Removing alone does not trigger moderation. Example: [\"7c9e6679-7425-40de-944b-e07fc1f90ae7\"]." - changed
Output schema / $schemaPrevious value: -"http://json-schema.org/draft-07/schema#"New value: +"https://json-schema.org/draft/2020-12/schema" - removed
Output schema / properties / listing / properties / currency / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / currency / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / price / anyOfRemoved value: -[ - { - "type": "number" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / price / typeAdded value: +[ + "number", + "null" +] - removed
Output schema / properties / listing / properties / status / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / status / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / title / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / title / typeAdded value: +[ + "string", + "null" +] - removed
Output schema / properties / listing / properties / vertical / anyOfRemoved value: -[ - { - "type": "string" - }, - { - "type": "null" - } -] - added
Output schema / properties / listing / properties / vertical / typeAdded value: +[ + "string", + "null" +]
16 tool updates
- Changed
create_listing1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": {}, + "type": "object" +}
- Changed
delete_listing1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "success": { + "type": "boolean" + } + }, + "required": [ + "success" + ], + "type": "object" +}
- Changed
get_conversation1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": {}, + "type": "object" +}
- Changed
get_entitlements1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": {}, + "type": "object" +}
- Changed
get_listing1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "url": { + "type": "string" + }, + "vertical": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" +}
- Changed
list_conversations1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": {}, + "type": "object" +}
- Changed
list_my_listings1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "listings": { + "items": { + "additionalProperties": {}, + "properties": { + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "url": { + "type": "string" + }, + "vertical": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "success", + "listings" + ], + "type": "object" +}
- Changed
renew_listing1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "listing": { + "additionalProperties": {}, + "properties": { + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "url": { + "type": "string" + }, + "vertical": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "success", + "listing" + ], + "type": "object" +}
- Changed
reply_to_conversation1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": {}, + "type": "object" +}
- Changed
request_image_upload1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "headers_required": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + }, + "key": { + "type": "string" + }, + "upload_token": { + "type": "string" + }, + "upload_url": { + "type": "string" + } + }, + "type": "object" +}
- Changed
search_listings1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "data": { + "items": { + "additionalProperties": {}, + "properties": { + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "url": { + "type": "string" + }, + "vertical": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "type": "array" + }, + "meta": { + "additionalProperties": {}, + "properties": {}, + "type": "object" + } + }, + "required": [ + "data" + ], + "type": "object" +}
- Changed
semantic_search1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": {}, + "type": "object" +}
- Changed
send_message1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": {}, + "type": "object" +}
- Changed
set_listing_status1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "listing": { + "additionalProperties": {}, + "properties": { + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "url": { + "type": "string" + }, + "vertical": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "success", + "listing" + ], + "type": "object" +}
- Changed
update_listing1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "listing": { + "additionalProperties": {}, + "properties": { + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "url": { + "type": "string" + }, + "vertical": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "success", + "listing" + ], + "type": "object" +}
- Changed
update_listing_images1 field changed- changed
Output schema / (root)Previous value: -nullNew value: +{ + "$schema": "http://json-schema.org/draft-07/schema#", + "additionalProperties": {}, + "properties": { + "listing": { + "additionalProperties": {}, + "properties": { + "currency": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "id": { + "type": "string" + }, + "price": { + "anyOf": [ + { + "type": "number" + }, + { + "type": "null" + } + ] + }, + "status": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "title": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + }, + "url": { + "type": "string" + }, + "vertical": { + "anyOf": [ + { + "type": "string" + }, + { + "type": "null" + } + ] + } + }, + "type": "object" + }, + "success": { + "type": "boolean" + } + }, + "required": [ + "success", + "listing" + ], + "type": "object" +}
1 tool update
- Added
semantic_search
15 tool updates
- First observed
create_listing - First observed
delete_listing - First observed
get_conversation - First observed
get_entitlements - First observed
get_listing - First observed
list_conversations - First observed
list_my_listings - First observed
renew_listing - First observed
reply_to_conversation - First observed
request_image_upload - First observed
search_listings - First observed
send_message - First observed
set_listing_status - First observed
update_listing - First observed
update_listing_images
Related MCP Connectors
Economic-intent network for AI agents to publish demand and discover services.
Marketplace for AI agents: goods, collectibles, real estate and services. List, search, offer, deal.
Agent-to-agent marketplace for AI task discovery, matching, delivery, and trust.
AI agents hire a human to observe, log or film on site. Typed results, feasibility before payment.
Related MCP Servers
- AlicenseAqualityDmaintenanceEnables AI agents to search for and hire humans for real-world tasks.3343 npm9MIT
- FlicenseNot gradedqualityDmaintenanceAn agent-native marketplace API where any agent can publish allocatable resources, search for what they need, negotiate structured offers, and exchange contact details after mutual acceptance. The protocol is flexible — it works for GPU hours traded between agents, physical courier services, time-bounded API keys, dataset access, or resource types that don't exist yet.1-
- FlicenseNot gradedqualityAmaintenanceAgentic job board for too hard basket items, with independently verifiable participant reputation status that is earned via participant activity-
- AlicenseAqualityBmaintenanceAutonomous M2M marketplace where AI agents discover specialist agents by skill and reputation, lock credits in escrow, and delegate tasks via Contract Net Protocol.13495 npmMIT
Glama MCP Gateway
Add one secure layer between your agents and this server.