MCP HeartbeatTHE MCP OBSERVATORY
Public workspace

Explore

Evidence for your next connection.

Independent measurements of remote MCP servers. Every observation has a timestamp.

Read-only probes

MCP server · Code & DevOps

Teppek

Agent-accessible map of global supply & demand: jobs, homes, cars & services your AI can act on

Checks passed
13 / 22

1 failed · 8 not measured

Median response
138 ms

Median of successful probes over 7 days

30-day uptime
Not measured

Share of countable probes over 30 days, including daily rollups. Auth challenges are excluded.

Discovered tools
16

Tool definitions returned by this server

Independent monitoring

Health & checks

Status history

Responded

The server completed its last measured handshake. This is an observation, not a guarantee.

Last checked
Check summary by test group
Test areaPassedFailedUnmeasured
ConnectionCan a client connect and discover tools?
500
Reliability & speedDoes it respond consistently and quickly?
004
Access & authenticationWhat is required to use this server?
102
Tool qualityAre the tool definitions usable by an agent?
400
Publisher identityCan the publisher be traced to its source?
312

Unmeasured means there is not enough evidence to decide. How these checks work

Inspect individual checks 22 recorded

Core

  • Pass
    Reachable

    Latest probe returned HTTP 200 in 138 ms.

  • Pass
    Valid handshake

    protocolVersion 2025-11-25, serverInfo.name teppek.

  • Pass
    Lists tools

    tools/list returned 16 tools.

  • Pass
    Current protocol

    Negotiated 2025-11-25. The bar is 2025-06-18 or newer.

  • Pass
    HTTPS

    The endpoint URL is https.

Performance

  • Not measured
    Fast (p50)

    Median latency 138 ms over 1 samples in 7 days. The bar is 1000 ms. Need at least 5 samples.

  • Not measured
    Consistent (p95)

    95th percentile 138 ms over 1 samples in 7 days. The bar is 3000 ms. Need at least 20 samples.

  • Not measured
    Reliable (uptime)

    1 of 1 attempts returned a tool list in 30 days (100%). The bar is 99%. Need at least 30 samples.

  • Not measured
    Stable tool list

    Fewer than two successful probes in 30 days, so tool-list stability is not measured.

Access

  • Pass
    Open access

    tools/list succeeded with no credential, and the record declares none.

  • Not measured
    Standard auth

    Auth is not required, so the OAuth metadata check does not apply.

  • Not measured
    Free tier cited

    No publisher quote has been checked.

Tools

  • Pass
    Tools described

    Every tool description is at least 20 characters.

  • Pass
    Valid input schemas

    Every inputSchema is a JSON Schema object.

  • Pass
    Parameters documented

    59 of 59 parameters have a description (100%). The bar is 80%.

  • Pass
    Safety hints

    Every tool sets readOnlyHint or destructiveHint.

Publisher

  • Pass
    Verified namespace

    Listed in the Official MCP Registry.

  • Pass
    Website matches publisher

    The website host matches the reverse-domain namespace.

  • Fail
    Source repo linked

    No repository URL is on file.

  • Not measured
    Repo owner matches

    This namespace is not an io.github login, so the owner comparison does not apply.

  • Pass
    Recently updated

    Updated 2026-11-03T10:45:15.367607Z, within 180 days.

  • Not measured
    Open-source licence

    No GitHub repository to ask about a licence.

Start using Teppek

Connect to this server

Choose your client, copy the configuration, then enable the server in your client’s MCP settings.

Run this command in your terminal, then restart Claude Code.

Claude Code

claude mcp add --transport http teppek https://mcp.teppek.com/mcp

Capabilities

Tools 16

create_listing

Publish a NEW listing on behalf of the user across any of the 4 verticals and 12 roles. Use it only when the user clearly asks to post something — sell or rent out an item or home, advertise a job, publish a CV, offer or request a service. Do not use it to change an existing listing (update_listing, update_listing_images, set_listing_status) or to look for listings (search_listings). Recommended order: get_entitlements → resolve the address to coordinates → optionally request_image_upload and upload each photo → create_listing. `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.

Discovered
delete_listing

Delete (soft-delete) one of the USER'S OWN listings by listing_id: it leaves the marketplace and cannot be restored through these tools. Use it ONLY when the user clearly asks to delete the listing. If they say "take it down", "pause it" or "I sold it", use set_listing_status (hidden or sold) instead — that is reversible. Ask for confirmation when the request is ambiguous. Only the owner can delete. No credit is refunded — the listing was already published. Returns { success: true } when the listing was deleted.

Discovered
get_conversation

Read ONE of the user's OWN message conversations by thread_id, including its messages. Use it when the user wants to read a specific conversation ("what did the landlord say?") or before writing a reply that depends on what was said. Side effect: incoming messages in the thread are marked read — for a quick inbox overview or unread counts use list_conversations instead, so messages the user has not seen stay unread. Returns { thread, messages: [...] }; each message has id, sender_name, body, created_at, read_at and is_mine (true = sent by the user). Only threads the authenticated user participates in are returned; any other thread_id returns an error. Get the thread_id from list_conversations, then answer with reply_to_conversation.

Discovered
get_entitlements

Check whether the user can publish right now. Use it BEFORE create_listing, and whenever the user asks "how many listings can I still post?" or "do I have enough credit?". When you are about to publish, pass the `role` you will use in create_listing and read can_create_for_role — true means go ahead, false means show the user the pay_url instead of attempting the publish; omit `role` for a general overview. Always returns success, membership_key, included (true = listings are covered by the plan), current_active_listings, credit_cost (credits per listing; null when included), wallet_balance, can_pay_from_wallet, can_create_listing and pay_url (set only when the user cannot publish). Paid plans also return max_active_listings and remaining_slots (null = unlimited). The free tier instead caps supply and demand listings SEPARATELY and returns max_active_listings_per_intent, active_supply, active_demand, can_create_supply and can_create_demand — there, can_create_listing is true if EITHER side has room, which is why passing `role` matters: can_create_for_role answers for the side of that role only. Example: role="career_employer" returning can_create_for_role=false with a pay_url means send the user to that link instead of attempting the publish.

Discovered
get_listing

Fetch the full detail of ONE Teppek listing by listing_id. Use it after search_listings or semantic_search when the user picks a specific result and wants to see, summarize or compare it — e.g. "what is the salary on the second job?", "compare these two flats", "tell me more about that car". Do not use it to browse or count listings (use search_listings); you also do not need it just to show a result list, because search already returns the summary fields. Returns the listing object: id, title, description, price and currency (jobs also carry salary_min/salary_max), vertical, role, status, lat/lon and location_name, vertical-specific `attributes`, images, expires_at, deep_link (the contact or apply route) and the canonical teppek.com `url` the user can open. An unknown or removed id returns an error ("Listing not found") instead of a listing. Read-only and public — no authentication needed.

Discovered
list_conversations

List the user's OWN listing-message conversations — threads they started about someone's listing, and inquiries they received as a listing owner — newest first. Resolved from the authenticated agent key — only ever this user's threads. Use it when the user asks "do I have new messages?" or "who replied about my flat?", and before replying, to find the thread_id. It has no side effects (nothing is marked read), so prefer it over get_conversation when you only need an inbox overview or unread counts. Returns { threads: [...] }; each thread has id (the thread_id), listing_id, listing_title, counterpart_name, last_message_preview, last_message_at and viewer_state (unread_count, is_listing_owner, is_last_message_mine). Read a thread's full messages with get_conversation. Page with limit/offset.

Discovered
list_my_listings

List the user's OWN listings (any status), newest first. Resolved from the authenticated agent key — only ever returns this user's listings. Use it when the user asks about their own ads — "how are my listings doing?", "is my car ad live yet?", "why was my listing rejected?" — and to look up the listing_id before update_listing, update_listing_images, set_listing_status, renew_listing or delete_listing. Filter with status: 'pending' = awaiting AI moderation, 'rejected' = declined, 'expired' = lapsed (renew it with renew_listing), 'hidden' = taken offline by the user, 'all' (default) = everything. Do not use it to search other people's listings (use search_listings). Returns { success, listings: [...] }, each with id, title, status, price, currency, vertical and the teppek.com url. Page with limit/offset.

Discovered
renew_listing

Update the expiry of one of the USER'S OWN listings (renew it): the listing runs for another 30 days from now (native listings lapse ~30 days after posting). Use it when the user wants to keep an ad running ("extend my listing", "my ad expired, put it back") or when list_my_listings shows it as expired. Renewing an expired listing returns it to active. Do not use it on a pending, rejected, sold or draft listing — the call fails: a pending one only needs moderation to finish, a rejected one needs its content changed with update_listing, and a sold one is closed. Free — no credit charge. Returns { success, listing } with the renewed listing.

Discovered
reply_to_conversation

Reply in 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 — e.g. "tell the buyer the car is still available" or "ask the landlord if I can view it on Saturday". 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. Returns { thread, message }: the message just sent (id, body, created_at) and the updated thread. Requires the user to be connected to Teppek (authenticated); the body limit is 2000 characters, and a sent message cannot be undone.

Discovered
request_image_upload

Request a short-lived upload grant for ONE image file — step 1 of attaching a photo (any vertical/role). Use it when the user wants a photo on a new listing (then create_listing) or added to an existing one (then update_listing_images) — call it once per image, maximum 6 images per listing. Do not use it when you only have an image URL: it needs the raw file bytes (JPEG, PNG or WebP, up to 10 MB), and it attaches nothing by itself. Returns { key, upload_url, upload_token, headers_required }: PUT the raw image bytes to upload_url with exactly those headers, then pass the returned key in create_listing's `images` array or update_listing_images' `add` array. A key whose bytes were never uploaded fails later with image_not_uploaded. Images are AI-moderated for content safety before the listing goes live. Requires the user to be connected to Teppek (authenticated).

Discovered
search_listings

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.

Discovered
semantic_search

Search Teppek's live listings by MEANING (semantic search 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. Returns at most 20 results per call. Requires the user to be connected to Teppek (authenticated): an anonymous call returns an AUTH_REQUIRED error with an authorize_url.

Discovered
send_message

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.

Discovered
set_listing_status

Set the lifecycle status of one of the USER'S OWN listings — the reversible alternative to delete_listing. Use status='sold' when the user says the item is sold, the job is filled or the home is let; 'hidden' to take a live listing offline for a while ("pause my ad for a week"); 'active' to bring a hidden listing back. Do not use it to extend an expired listing (use renew_listing), to edit content (update_listing), or to force a pending or rejected listing live: moderation states (pending/rejected) cannot be set, and 'active' only works on a listing that was previously approved and is currently hidden. Free — no credit charge. Returns { success, listing } with the listing's new status.

Discovered
update_listing

Edit fields (title, description, price, currency, location, details) on one of the USER'S OWN listings, identified by listing_id. Use it when the user wants to correct or change an existing listing — "drop the price to 900", "fix the typo in the title", "the flat now has 3 rooms". Do not use it for photos (update_listing_images), for marking sold or hiding (set_listing_status), for extending the expiry (renew_listing), or to change vertical/intent_type/role — those are fixed, so publish a new listing instead. Only the owner can edit. Editing is free (no credit charge). Price/currency-only edits stay live; changing the title, description, location or details re-triggers AI moderation: the listing returns to 'pending' and is offline until cleared — tell the user this before editing a live listing. Returns { success, listing } with the updated listing and its new status.

Discovered
update_listing_images

Add and/or remove photos on one of the USER'S OWN existing listings (max 6 total). Use it when the user wants to add, replace or remove photos on a listing that already exists — to replace a photo, remove the old key and add the new one in the same call. Do not use it while publishing a new listing (pass images to create_listing instead) or to change text fields (update_listing). 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). Returns { success, listing } with the updated listing and its status.

Discovered

Recent measurements

Probe history

View status
Latest stored probes. Raw probe rows are kept for 14 days.
CheckedResultResponseTools
Connected138 ms16