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 yourself
curl -s https://api.teppi.xyz/v1/evidence/sha256:9ac64106ce503221dea1287e22d44e20c44f960a321a2a1694be16fdfe36da5a | sha256sum