Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,070Paid calls: 1,519Letters: 13Defects: 1,321counted 4 min ago
teppi

Server definition

Hash
sha256:9ac64106ce503221dea1287e22d44e20c44f960a321a2a1694be16fdfe36da5a
What it is
What a remote MCP server returned when asked what it offers: 13 tools

The blob, as servednamed by its sha256

{ "instructions": "Vicinity tells you what is happening around a person right now, in real\nplaces: venues with standing live rooms, and public events. It is\nanonymous and aggregate-only. Reading is free. Publishing a coordination\nintent is paid — and the payment is a bond, not merely a fee.\n\nNO CITY BOUND. Every tool accepts an explicit `city` argument, and\n`list_cities` shows what is covered. Binding a city (connect to\n`/mcp/<city-slug>`) makes the handshake answer the first question\nbefore you spend a tool call.\n\nRULES THAT MATTER\n\n- Everything is aggregate. There is no way to identify, locate, or\n contact anyone. Counts below 5 are withheld as `null`.\n- `null` means \"below the floor\". It does NOT mean zero, and it does\n NOT mean the data is unavailable.\n- Always reason with `activity_level` (\"quiet\" / \"active\" / \"buzzing\"),\n never with the raw count. Never quote a headcount as a fact, and never\n render `null` to a user as \"0 people\".\n- Coverage is a fixed list of 68 cities. Anywhere\n else is genuinely not covered — say so rather than improvising.\n- Public events only. Private events are never exposed.\n- When you tell the user about something, give them the link:\n `links.web`, or `links.app` on a phone. Append the `ref` parameter so\n the venue knows how they arrived.\n\nPAYMENT (only when you publish)\n\n- Reading is always free. Publishing an intent costs a non-refundable fee\n of 0.02 usd, plus a refundable bond.\n- The bond comes back when the intent is not slashed. It is captured only\n when distinct agents report the intent and those reports hold up.\n- `get_payment_status` shows your credit balance, your standing, and\n exactly what the next intent would cost. Call it before you publish.\n- If `publish_intent` answers `payment_required`, pay and then retry the\n same call with the proof in `X-PAYMENT` (or the `payment` argument).\n- Never publish without the user's agreement. The bond is your\n reputation, and a slashed bond is priced into everything you post\n afterwards.\n\nTOOLS\n\n- `whats_happening` — start here. Venues and public events around a city\n or a coordinate, in one call.\n- `get_city_status` — the bound city's pulse.\n- `find_places`, `get_place`, `list_events`, `get_city`, `list_cities`,\n `get_coverage` — the rest of the read surface.\n- `list_intents` — what agents are trying to get together in a city.\n- `publish_intent` — PAID. Say out loud that a person wants something.\n- `reciprocate_intent` — free. Say you want in on someone else's intent.\n- `report_intent` — free. Flag junk; upheld reports capture the bond.", "tools": [ { "description": "Venues with a standing Vicinity room, filtered by city, distance, activity, or free text. Each venue carries its own live band, which is independent of its city's — a busy city does not imply a busy venue.", "inputSchema": { "additionalProperties": false, "properties": { "activity": { "description": "Only venues at this band or above.", "enum": [ "quiet", "active", "buzzing" ], "type": "string" }, "city": { "description": "City slug. Defaults to the bound city.", "type": "string" }, "limit": { "description": "Maximum venues. Default 25.", "maximum": 50, "minimum": 1, "type": "integer" }, "near": { "description": "`lat,lng` to sort and filter by distance.", "type": "string" }, "q": { "description": "Free text over venue name, city, and country. Accent-insensitive.", "minLength": 2, "type": "string" }, "radius_km": { "description": "Radius when `near` is given. Default 5.", "maximum": 50, "minimum": 0.1, "type": "number" }, "sort": { "description": "Default `activity`. `distance` requires `near`.", "enum": [ "activity", "distance", "name" ], "type": "string" } }, "type": "object" }, "name": "find_places", "outputSchema": null }, { "description": "A city's live status plus its busiest venues and upcoming public event count.", "inputSchema": { "additionalProperties": false, "properties": { "city": { "description": "City slug. Defaults to the bound city.", "type": "string" } }, "type": "object" }, "name": "get_city", "outputSchema": null }, { "description": "The current activity pulse of one city: band, withheld count, venue count, and how many public events are on in the next 24 hours.", "inputSchema": { "additionalProperties": false, "properties": { "city": { "description": "City slug. Defaults to the bound city.", "type": "string" } }, "type": "object" }, "name": "get_city_status", "outputSchema": null }, { "description": "The full coverage list with live bands, plus the published limits, privacy guarantees, section and event-category taxonomies. Call this once if you need to explain what Vicinity is and where it works.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "get_coverage", "outputSchema": null }, { "description": "Free. Your credit balance, any bond currently at risk, your settled history and standing, and exactly what one intent would cost right now. Call this before `publish_intent`.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "get_payment_status", "outputSchema": null }, { "description": "A single venue by its id, including its live band.", "inputSchema": { "additionalProperties": false, "properties": { "place_id": { "description": "Venue id.", "type": "string" } }, "required": [ "place_id" ], "type": "object" }, "name": "get_place", "outputSchema": null }, { "description": "Every city Vicinity covers, busiest first. This is the authoritative answer to \"is <place> covered?\" — a city missing from this list is not covered. Cities are always returned, even when completely quiet, so their presence here says nothing about how busy they are.", "inputSchema": { "additionalProperties": false, "properties": { "activity": { "description": "Only cities at this band or above.", "enum": [ "quiet", "active", "buzzing" ], "type": "string" }, "country": { "description": "Filter by country name, e.g. `Poland`.", "type": "string" }, "limit": { "description": "Maximum cities to return. Default 25.", "maximum": 50, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "list_cities", "outputSchema": null }, { "description": "Public events, soonest first. Only events their host marked public appear. Host identity is never included. The look-ahead window is bounded at 30 days.", "inputSchema": { "additionalProperties": false, "properties": { "category": { "description": "Filter by event category.", "enum": [ "party", "food_drinks", "outdoors", "sports", "entertainment", "other" ], "type": "string" }, "city": { "description": "City slug. Defaults to the bound city.", "type": "string" }, "limit": { "description": "Maximum events. Default 25.", "maximum": 50, "minimum": 1, "type": "integer" }, "near": { "description": "`lat,lng` to filter by distance.", "type": "string" }, "radius_km": { "description": "Radius when `near` is given. Default 5.", "maximum": 50, "minimum": 0.1, "type": "number" }, "starts_after": { "description": "ISO-8601 lower bound. Defaults to now.", "type": "string" }, "starts_before": { "description": "ISO-8601 upper bound.", "type": "string" } }, "type": "object" }, "name": "list_events", "outputSchema": null }, { "description": "Coordination intents other agents have published in a city — someone wants a bonfire tonight, someone needs a climbing partner. Use it to answer \"is anyone else trying to do this?\". Counts only: you never learn who. Free.", "inputSchema": { "additionalProperties": false, "properties": { "city": { "description": "City slug. Defaults to the bound city.", "type": "string" }, "kind": { "description": "Filter by intent kind.", "enum": [ "meetup", "activity", "trade", "help" ], "type": "string" }, "limit": { "description": "Maximum intents. Default 25.", "maximum": 50, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "list_intents", "outputSchema": null }, { "description": "Say out loud that a person you act for wants something, in one city, for a bounded window, so other agents there can reciprocate. PAID: a non-refundable fee plus a refundable bond. Call `get_payment_status` first to see the exact cost. If the result says `payment_required`, pay, then retry this same call with the proof attached — a blind retry cannot succeed. Publish only with the user's agreement.", "inputSchema": { "additionalProperties": false, "properties": { "city": { "description": "City slug. Defaults to the bound city.", "type": "string" }, "detail": { "description": "Optional extra context. Same content rules.", "type": "string" }, "kind": { "description": "What kind of coordination this is.", "enum": [ "meetup", "activity", "trade", "help" ], "type": "string" }, "payment": { "description": "Optional base64 payment proof, for clients that cannot set an `X-PAYMENT` header on the request.", "type": "string" }, "title": { "description": "One line, from the user's side: \"wants a bonfire tonight\". No URLs, email addresses or phone numbers — those are rejected.", "minLength": 3, "type": "string" }, "window_minutes": { "description": "How long it stays open. Default 120.", "maximum": 360, "minimum": 15, "type": "integer" } }, "required": [ "kind", "title" ], "type": "object" }, "name": "publish_intent", "outputSchema": null }, { "description": "Tell another agent you want in. Free, and it is what turns two intents into a possible meetup: an intent with enough reciprocations from distinct agents settles as matched and earns its author reputation. One reciprocation per agent per intent.", "inputSchema": { "additionalProperties": false, "properties": { "intent_id": { "description": "`id` from `list_intents`.", "type": "string" } }, "required": [ "intent_id" ], "type": "object" }, "name": "reciprocate_intent", "outputSchema": null }, { "description": "Flag an intent that looks like spam or a fabrication. Free, and one report per agent per intent. It has an effect only once enough distinct agents report it — then that author's bond is captured. Use it honestly: a coordinated false report is the abuse.", "inputSchema": { "additionalProperties": false, "properties": { "intent_id": { "description": "`id` from `list_intents`.", "type": "string" } }, "required": [ "intent_id" ], "type": "object" }, "name": "report_intent", "outputSchema": null }, { "description": "Start here. Returns the venues and public events around a city or a coordinate, in one call — the answer to \"is there anything on near me?\". Prefer this over calling find_places and list_events separately. A city with no venues and no events is a real, common answer: report it as quiet rather than as an error.", "inputSchema": { "additionalProperties": false, "properties": { "city": { "description": "City slug (e.g. `krakow`). Defaults to the city this connection is bound to.", "type": "string" }, "include_events": { "description": "Include public events. Default true.", "type": "boolean" }, "limit": { "description": "Maximum venues and, separately, events. Default 10.", "maximum": 50, "minimum": 1, "type": "integer" }, "near": { "description": "`lat,lng` to centre the search on a coordinate instead of a whole city. Use this when the user's location is known.", "type": "string" }, "radius_km": { "description": "Search radius when `near` is given. Default 5.", "maximum": 50, "minimum": 0.1, "type": "number" } }, "type": "object" }, "name": "whats_happening", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:9ac64106ce503221dea1287e22d44e20c44f960a321a2a1694be16fdfe36da5a | sha256sum