Endpoints: 28,729MCP servers: 18,413Payout addresses: 2,071Paid calls: 1,536Letters: 14Defects: 1,322counted 4 min ago
teppi

Server definition

Hash
sha256:51acbe74592e29329646806c7c420587c62d1878e3a583722f28d2e5318e6758
What it is
What a remote MCP server returned when asked what it offers: 60 tools

The blob, as servednamed by its sha256

{ "instructions": "ClusterHack is a hackathon platform: events, teams, projects, judging, results.\n\nThis server exposes what the signed-in user can do, in their roles. Start with\n`whoami` — it tells you which roles the account holds (organizer, judge,\nparticipant, team lead, company admin, platform admin) and where, so you can\nchoose the right tools. `list_capabilities` groups every available tool by area.\n\nConventions:\n* Events are addressed by their **slug**; teams, submissions and most other\n objects by numeric **id**.\n* Anything that writes says so in its description and is marked destructive\n when it removes data. Ask the user before destructive calls.\n* Every call runs as the user, through the site's own permission checks, so a\n 403 means the user genuinely lacks that right — not a server misconfiguration.\n* Dates and times are ISO-8601; the platform stores them in UTC.\n", "tools": [ { "description": "How the signed-in user sees and revokes AI access to their own account —\nread this instead of looking for a tool that lists or cuts off connected\nclients, because there is deliberately no such tool.\n\nThe controls over AI access (list connected clients, revoke one, list and\nend live MCP sessions, read the record of what a client did as them) are\ngated to the account holder signing in directly: a browser session, a JWT,\nor an API token they hold themselves. A connected AI client — including\nthis one — is refused, on purpose. If it were not, a client could revoke\nits rivals, enumerate the user's other connections, or read the trail it\nleaves behind. So this tool tells the user where to go and what they will\nfind; it makes no API call and cannot fail.\n\nAlso names where account deletion and data export live: the export has a\ntool (`account_export_data`), the deletion deliberately does not.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "account_ai_access", "outputSchema": null }, { "description": "Explains how to connect an account to this MCP server — read this instead\nof guessing at a login/registration tool, because there isn't one.\n\nClusterHack's own credential endpoints (register, login, JWT issuance,\npassword reset) are the website's login form, not MCP tools: an MCP client\nauthenticates by OAuth 2.1 (the same flow a human approves in a browser\ntab) and must never see or handle a ClusterHack password directly. This\ntool works with no account at all, and just explains the steps and links.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "account_how_to_sign_in", "outputSchema": null }, { "description": "Retrieve one CMS article by id: its body, publish date, hidden flag, and\nwhich title/slug and language it belongs to.", "inputSchema": { "additionalProperties": false, "properties": { "article_id": { "description": "The article's id.", "minimum": 1, "type": "integer" } }, "required": [ "article_id" ], "type": "object" }, "name": "article_get", "outputSchema": null }, { "description": "List the languages articles can be written in, e.g.\n{\"language_name\": \"English\", \"short_name\": \"en\"}. Use this to find the\n`language_id` `article_create` needs.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "article_languages", "outputSchema": null }, { "description": "Browse CMS articles (the pages under /articles/<language>/<slug>). Filter\nby `language` (a language's short code, e.g. 'en') and/or `slug` (a\ntitle's slug) to find one specific page's translations. Hidden drafts are\nonly included for staff callers; everyone else sees only published\narticles.", "inputSchema": { "additionalProperties": false, "properties": { "language": { "description": "Language short code to filter by, e.g. 'en' or 'ru'.", "type": "string" }, "page": { "default": 1, "description": "Page number.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" }, "slug": { "description": "Title slug to filter by, e.g. 'how-to-organize'.", "type": "string" } }, "type": "object" }, "name": "article_list", "outputSchema": null }, { "description": "List the CMS \"title\" records — each one a page's title text and slug,\ne.g. {\"title\": \"How to organize a hackathon\", \"slug\": \"how-to-organize\"}.\nAn article always points at one of these; use this to find the `title_id`\n`article_create` needs, or to see what pages exist at all.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "article_titles", "outputSchema": null }, { "description": "A company's longer \"about us\" blurb (up to 10,000 characters), separate\nfrom its short `description`. Returns `found: false` if the company has\nnot written one yet.", "inputSchema": { "additionalProperties": false, "properties": { "company_id": { "description": "Numeric id of the company.", "type": "integer" } }, "required": [ "company_id" ], "type": "object" }, "name": "company_about_us", "outputSchema": null }, { "description": "A company's employee roster (position, start date). Without `company_id`,\nreturns every roster row the caller can see (their own employment rows\nplus every company they administer) — the underlying API is already\nscoped that way. With `company_id`, narrows to that company only.", "inputSchema": { "additionalProperties": false, "properties": { "company_id": { "description": "Only rows for this company.", "type": "integer" }, "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "company_employees", "outputSchema": null }, { "description": "Pending requests to join a company. A company admin sees everyone waiting\non their door; anyone else sees only their own outstanding applications.\nThis is where the `request_id` for `company_decide_employment_request`\ncomes from.", "inputSchema": { "additionalProperties": false, "properties": { "company_id": { "description": "Only show requests for this company.", "minimum": 1, "type": "integer" }, "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "company_employment_requests", "outputSchema": null }, { "description": "A company's former employees (position, start and end date) — the record\ncreated when someone is fired via `company_fire_employee`. Without\n`company_id`, returns every ex-employment row the caller can see (their\nown, plus every company they administer).", "inputSchema": { "additionalProperties": false, "properties": { "company_id": { "description": "Only rows for this company.", "type": "integer" }, "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "company_ex_employees", "outputSchema": null }, { "description": "One company page by id: name, description, organisation type, website and\nlogo. Public read. Use it after `company_list` or `search` to get the full\nrecord, and to confirm you have the right company before employment or\nsponsorship actions, which are irreversible for the people involved.", "inputSchema": { "additionalProperties": false, "properties": { "company_id": { "description": "Numeric id of the company.", "type": "integer" } }, "required": [ "company_id" ], "type": "object" }, "name": "company_get", "outputSchema": null }, { "description": "Browse ClusterHack company pages: name, description, org type, website and\nlogo. Public data — use this to find a company's id before calling any\nother company tool.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "company_list", "outputSchema": null }, { "description": "The company page's public roster in one call: the people listed as\nemployees and the people listed as moderators, exactly as the company page\nrenders them to any visitor.\n\nUse this — not `company_employees` / `company_admins` — whenever you want\nto read *someone else's* roster. Those two are scoped to self-or-admin, so\nan outsider gets an empty list from them and cannot tell \"nobody works\nhere\" apart from \"you may not see who does\". This endpoint is the part of\nthe page that is already public, and nothing more: no join requests, no\nex-employees, no write verbs.", "inputSchema": { "additionalProperties": false, "properties": { "company_id": { "description": "Numeric id of the company.", "minimum": 1, "type": "integer" } }, "required": [ "company_id" ], "type": "object" }, "name": "company_roster", "outputSchema": null }, { "description": "The public board of companies not yet on ClusterHack (a lightweight\noff-platform listing — name, description, website — not a job-posting\nsystem). Public, no filters.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "company_vacancies", "outputSchema": null }, { "description": "The global catalogue of certificate background templates (used for the\n`background` field of an event's certificate config). Not tied to one\nevent.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 50, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "event_background_images", "outputSchema": null }, { "description": "Read an event's white-label branding: brand colours, public-page theme and\ndedicated subdomain, plus the resolved values actually used for rendering\nand `branding_enabled` — whether the evening currently wears its costume,\ni.e. whether those values are applied.\n\nPublic, because the colours are visible on the event page anyway. Use it\nbefore `event_set_branding` to see what is already set.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_branding", "outputSchema": null }, { "description": "The global catalogue of cities (used for the `city` field on\n`event_create`/`event_update` and to show where events happen).", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 50, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "event_cities", "outputSchema": null }, { "description": "An event's FAQ: the question/answer pairs shown on its public page. Public\nread — use it to answer a participant's question from the event's own words\nbefore guessing, and to check what is already covered before adding more.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 50, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_faq", "outputSchema": null }, { "description": "List participants at an event who are looking for a team.\n\nVisibility follows the platform's own rule, not a full public roster:\na normal caller only sees their own free-agent listing here, while an\norganiser of the event sees everyone's. Use `team_matchmaking_teams` on a\nlisting's id for AI-ranked team suggestions for that person.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "Page number, starting at 1.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Rows per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_free_agents", "outputSchema": null }, { "description": "Get one event's full public profile by slug: name, dates, address, topic,\ndescription, status and city.\n\nCall this once you have a slug (from `event_list` or `search`) and need\nthe details. It does not include the schedule, FAQ or nominations — use\n`event_schedule`, `event_faq` and `event_nominations` for those.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event, e.g. 'ai-build-day'.", "minLength": 1, "type": "string" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_get", "outputSchema": null }, { "description": "An event's additional free-form information blocks (extra sections shown\non its public page beyond the main description — rules, prizes, sponsors\nnotes, etc.).", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 50, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_info_blocks", "outputSchema": null }, { "description": "The ranked leaderboard for one event: submissions ordered by weighted\njudge score then vote count, with each entry's rank, team and score.\nPublic once the organiser publishes winners; before that, only the\nevent's admins and judges can preview it (everyone else gets a clear\n\"not published yet\" error).", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_leaderboard", "outputSchema": null }, { "description": "Browse hackathons on the platform — filter by status, city or date.\n\nReturns each event's slug, which every other event tool needs, plus name,\nstatus, dates and city. Use this when the user names an event you do not\nhave a slug for and `search` is not precise enough, or to show a list of\nupcoming/past events. Hidden events only appear here for their own\norganisers.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" }, "status": { "description": "Only events with this status. Filtered over the fetched page, so combine with a larger page_size for an exhaustive scan.", "enum": [ "I", "N", "Ended" ], "type": "string" } }, "type": "object" }, "name": "event_list", "outputSchema": null }, { "description": "Summarise the signed-in user's relationship to one event: whether they\nhave joined, their registration answers on file, whether they are listed\nas a free agent, and which roles they hold there (organizer, judge, team\nlead, ...).\n\nCheaper than combining several other tools when you just need \"is this\nuser in, and how\" for one event.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_my_membership", "outputSchema": null }, { "description": "List the signed-in user's own answers to one event's registration\nquestions. Only ever returns their own data — use\n`event_registration_responses` (organiser only) to read other people's.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "Page number, starting at 1.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Rows per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_my_registration_answers", "outputSchema": null }, { "description": "An event's award nominations/tracks (e.g. \"Best AI prototype\"), used when\ncreating teams, awarding winners and building the leaderboard per track.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 50, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_nominations", "outputSchema": null }, { "description": "Public catalogue of event-creation presets (AI build day, student\nhackathon, corporate innovation day, ...) with sensible defaults and\nstarter nominations. Call before `event_create` when the user describes a\nkind of hackathon rather than exact field values.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "event_presets", "outputSchema": null }, { "description": "List the custom questions an event asks at registration time (its\nregistration form), in display order.\n\nPublic data — the question text is visible to anyone. Use this before\n`event_submit_registration_answers` to know which `form_field_id`s exist\nand which are required.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "Page number, starting at 1.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Rows per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_registration_form", "outputSchema": null }, { "description": "Which roles the signed-in user holds at one specific event.\n\nCheaper and more precise than `whoami` when you already know the event and\njust need to know whether the user can organise, judge or only take part.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_roles", "outputSchema": null }, { "description": "The event's timeline: an ordered list of stages/activities (opening,\nworkshops, deadlines, closing ceremony) with title, location, time window\nand status (past/now/future). This is what participants see as \"the\nschedule\". Broadcast link and chat link are only included for the event's\nadmins and registered participants — everyone else sees them blanked.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 50, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_schedule", "outputSchema": null }, { "description": "The public links for promoting an event: its shareable page, the\ncalendar file participants can add to their own calendar, the Open Graph\npreview image used when the link is pasted into chat, and a plain-text\ndigest meant for AI assistants. Handy when drafting an announcement — put\nthe share URL in the post and the .ics next to the date. Public read.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_share_links", "outputSchema": null }, { "description": "Sponsors of one event that are NOT themselves on ClusterHack (a name,\ndescription, website and logo entered as free text, with the sponsorship\ntier each one belongs to) — the off-platform counterpart to\n`event_sponsors`. Public read.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_sponsor_text", "outputSchema": null }, { "description": "The sponsorship tiers/groups defined for one event (e.g. \"Sponsors\",\n\"Partners\", \"General Partner\") — the buckets `event_add_sponsor` slots\ncompanies into. Public read.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_sponsor_tiers", "outputSchema": null }, { "description": "The on-platform companies sponsoring one event, with the sponsorship tier\neach one is slotted into (e.g. \"Sponsors\", \"Partners\", \"General Partner\").\nPublic read. Use `event_sponsor_text` alongside this for sponsors that are\nnot themselves on ClusterHack yet.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_sponsors", "outputSchema": null }, { "description": "An event's team-facing reporting checkpoints (e.g. \"Idea locked\", \"Demo\nready\") with their time windows — distinct from `event_schedule`, which\nis the event's own agenda. Used to track team progress through the event.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 50, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "required": [ "event_slug" ], "type": "object" }, "name": "event_team_stages", "outputSchema": null }, { "description": "The global catalogue of event types (used for the `type` field on\n`event_create`/`event_update`). Small and rarely changes.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number, 1-based.", "minimum": 1, "type": "integer" }, "page_size": { "default": 50, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "event_types", "outputSchema": null }, { "description": "Look up what a shareable invite link opens, without redeeming it.\n\nPublic and PII-free: returns the event's name and slug and whether the\ntoken is still valid (active, not expired, uses remaining). Use this\nbefore `invite_join` to show the user what they are about to join, or to\nexplain why a link stopped working.", "inputSchema": { "additionalProperties": false, "properties": { "token": { "description": "The invite token, e.g. from a shared /invite/<token>/ URL.", "minLength": 1, "type": "string" } }, "required": [ "token" ], "type": "object" }, "name": "invite_preview", "outputSchema": null }, { "description": "The service's legal identity, as the terms-of-service, privacy and support\npages render it: the service and operating entity, whether that entity is\nregistered and where, the contact and privacy email addresses, the postal\naddress, the terms' effective date and the minimum age to hold an account.\n\nRead it instead of hard-coding a copy — a client building its own footer,\nquoting the contact address, or answering \"how old do I have to be\" should\ntake the values from here, where the pages themselves take them, so the two\ncannot drift apart. Public: it needs no account, and it is the same text an\nanonymous visitor already sees.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "legal_info", "outputSchema": null }, { "description": "List the raw REST endpoints behind this server.\n\nUse it together with `api_request` when you need something no curated tool\ncovers. The list is read from the live URL configuration, so it always\nmatches what the server actually serves.", "inputSchema": { "additionalProperties": false, "properties": { "limit": { "default": 100, "description": "Maximum endpoints to return.", "maximum": 400, "minimum": 1, "type": "integer" }, "query": { "description": "Filter by path, view name or description, e.g. 'certificate'.", "type": "string" } }, "type": "object" }, "name": "list_api_endpoints", "outputSchema": null }, { "description": "The catalogue of everything this server can do, grouped by area.\n\nReturns each tool available to the current connection with its one-line\npurpose, the role it is meant for and the permission it consumes. Use it\nwhen you are not sure a capability exists — it is cheaper than guessing tool\nnames, and it shows what the user would gain by granting more permissions.", "inputSchema": { "additionalProperties": false, "properties": { "category": { "description": "Limit to one area of the product.", "enum": [ "discovery", "event", "organizer", "registration", "team", "submission", "judging", "showcase", "company", "kanban", "content", "system", "billing", "ai", "admin" ], "type": "string" }, "include_unavailable": { "default": false, "description": "Also list tools this connection cannot use, and say what they need.", "type": "boolean" } }, "type": "object" }, "name": "list_capabilities", "outputSchema": null }, { "description": "Search across the platform: events, teams, projects, people and articles.\n\nOne call when you do not yet know the identifier of the thing the user means\n(\"the AI hackathon in Berlin\", \"Sasha's team\"). Returns the matching objects\nwith the slug or id you need for every other tool.", "inputSchema": { "additionalProperties": false, "properties": { "kinds": { "description": "Which kinds to search. Defaults to all of them.", "items": { "description": "", "enum": [ "events", "teams", "projects", "people", "articles" ], "type": "string" }, "type": "array" }, "limit": { "default": 10, "description": "Maximum results per kind (1-50).", "maximum": 50, "minimum": 1, "type": "integer" }, "query": { "description": "What to look for. Matches names, descriptions and tags.", "minLength": 1, "type": "string" } }, "required": [ "query" ], "type": "object" }, "name": "search", "outputSchema": null }, { "description": "What this MCP server is, which version it speaks, and how to connect.\n\nUseful for diagnostics and for telling the user where to manage or revoke\nthe connection.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "server_info", "outputSchema": null }, { "description": "Browse the public, cross-event showcase: shipped/submitted projects\nranked for display, with title, tagline, team name, vote count and a\ncover image. Optionally narrow to one event. This is the public gallery —\nuse `event_leaderboard` instead when you specifically need judged\nrankings for one event.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Limit to one event's projects.", "type": "string" }, "page": { "default": 1, "description": "Page number.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "showcase_browse", "outputSchema": null }, { "description": "Retrieve one project submission by id: title, links, description, status,\napproval status, vote count and attached media.\n\nAnonymous and unrelated callers only see it once the team has submitted\n(status \"submitted\"); drafts are visible only to the team, the event's\nadmins and its judges. Use `submission_list` or `submission_get_mine` when\nyou do not already know the numeric id.", "inputSchema": { "additionalProperties": false, "properties": { "submission_id": { "description": "Numeric id of the submission.", "minimum": 1, "type": "integer" } }, "required": [ "submission_id" ], "type": "object" }, "name": "submission_get", "outputSchema": null }, { "description": "Browse project submissions, filterable by event, team or status.\n\nAnonymous and unrelated callers only ever see submitted (public) projects;\na signed-in caller additionally sees their own team's drafts and every\nsubmission at events they administer or judge. ``status`` narrows the\nreturned page client-side (draft / submitted / disqualified) since the\nunderlying list endpoint does not filter by status itself — combine with a\nlarger `page_size` if you need it applied beyond one page.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Only submissions for this event.", "type": "string" }, "page": { "default": 1, "description": "Page number.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" }, "status": { "description": "Filter the returned page by status.", "enum": [ "draft", "submitted", "disqualified" ], "type": "string" }, "team_id": { "description": "Only the submission belonging to this team.", "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "submission_list", "outputSchema": null }, { "description": "List the screenshots/gallery images attached to a submission. Visibility\nmirrors the parent submission: public once submitted, otherwise limited to\nthe team, event admins and judges.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" }, "submission_id": { "description": "Id of the submission.", "minimum": 1, "type": "integer" } }, "required": [ "submission_id" ], "type": "object" }, "name": "submission_list_media", "outputSchema": null }, { "description": "Read a project's public page: the submission itself, every judge's written\nfeedback (signed with the judge's name only where that judge consented to\nbeing named, empty otherwise), and — once the organiser has published the\nwinners — its placement, rank and judge score.\n\nThis is the tool for \"what did the judges say about our project?\".\n`submission_get` returns the project's own fields and nothing about how it\nwas received; `judging_scores_for_submission` is scoped to judges and event\nadmins, so a team cannot read its own verdict through it. A submitted\nproject's page is public; a draft is visible only to its team and the\nevent's admins. Before the ceremony the placement is shown to the team and\nthe hosts alone, flagged `placement_private` so a client says \"not\nannounced yet\" instead of leaking it. `private_note` is the organisers'\nline and is absent — not blanked, absent — from everyone else's payload.", "inputSchema": { "additionalProperties": false, "properties": { "submission_id": { "description": "Id of the submission.", "minimum": 1, "type": "integer" } }, "required": [ "submission_id" ], "type": "object" }, "name": "submission_page", "outputSchema": null }, { "description": "List tags used to categorize content across the platform (articles,\nprojects and more share the same tag vocabulary).", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "tag_list", "outputSchema": null }, { "description": "Get one team's full detail: name, description, project info, readiness,\naccessibility flags, and which event and nomination it belongs to.\n\nOnly visible if the signed-in user belongs to the team, created it, or\nadministers its event.", "inputSchema": { "additionalProperties": false, "properties": { "team_id": { "description": "Id of the team.", "type": "integer" } }, "required": [ "team_id" ], "type": "object" }, "name": "team_get", "outputSchema": null }, { "description": "List teams — scoped to what the signed-in account can see: teams they\nbelong to, created, or administer via being an admin of the team's event.\nThis is never a full public directory of every team on the platform.\n\nFilter by `event_slug` to see just one event's teams, or `search` to\nmatch team/project name and description. Use `team_get` for the full\ndetail of one team once you have its id.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Only teams at this event.", "type": "string" }, "page": { "default": 1, "description": "Page number, starting at 1.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Rows per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" }, "search": { "description": "Match against team name, description or project name.", "type": "string" } }, "type": "object" }, "name": "team_list", "outputSchema": null }, { "description": "Read the physical location details linked to a team's additional-info\nprofile (street, city, state, zip), if one has been set. There is\ncurrently no self-service way to create a new location through this API\n— location rows are set up separately, then referenced by id via\n`team_additional_info`'s `location_id`.", "inputSchema": { "additionalProperties": false, "properties": { "team_id": { "description": "Id of the team.", "type": "integer" } }, "required": [ "team_id" ], "type": "object" }, "name": "team_locations", "outputSchema": null }, { "description": "AI-ranked list of teams one free (teamless) participant could join,\nwithin the same event. Callable by the free-agent listing's own owner,\nor an admin of the event. Use `event_free_agents` or\n`event_join_as_free_agent` to get a `free_member_id`. Throttled — do not\ncall it in a tight loop.", "inputSchema": { "additionalProperties": false, "properties": { "free_member_id": { "description": "Id of the free-agent listing.", "type": "integer" }, "locale": { "description": "Language for the generated explanations, e.g. 'en' or 'ru'.", "type": "string" } }, "required": [ "free_member_id" ], "type": "object" }, "name": "team_matchmaking_teams", "outputSchema": null }, { "description": "List a team's current members with their role and caption. Use the row\n`id` (a membership id, not a user id) with `team_assign_role` or\n`team_remove_member`.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number, starting at 1.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Rows per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" }, "team_id": { "description": "Id of the team.", "type": "integer" } }, "required": [ "team_id" ], "type": "object" }, "name": "team_members", "outputSchema": null }, { "description": "List the positions teams are looking to fill (\"we need a designer\").\n\nVisibility is limited to what the signed-in account can already see:\ntheir own team's open roles, or — if they organise the event — every\nteam's. It is not a public cross-team browse for a stranger looking for\nany team: that is `team_seeking_members`, which reads the find-a-team\npage's own list (pair it with `event_free_agents` and\n`team_matchmaking_teams`). Filter with `team_id` for one team, or\n`event_slug` to see everything the caller can see at that event.\n\n`team_id` is answered exactly. `event_slug` (and the unfiltered form) is\nnot: the underlying endpoint narrows by one team at a time and has no\nevent filter, so a very large event can return a `note` saying rows were\nleft unscanned. Ask per team when that matters.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Only open roles at this event (within what the caller can see).", "type": "string" }, "page": { "default": 1, "description": "Page number, starting at 1.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Rows per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" }, "team_id": { "description": "Only this team's open roles.", "type": "integer" } }, "type": "object" }, "name": "team_open_roles", "outputSchema": null }, { "description": "List a team's public updates (\"twits\") — the short build-log posts a team\npublishes as it works, in the order the server returns them. Use it to catch\nup on what a team has been doing, or to check what has already been posted\nbefore writing another update with `team_post`.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number, starting at 1.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Rows per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" }, "team_id": { "description": "Id of the team.", "type": "integer" } }, "required": [ "team_id" ], "type": "object" }, "name": "team_posts", "outputSchema": null }, { "description": "Check whether a team has marked itself ready to present, plus whether it\nis banned or currently accessible for judging.", "inputSchema": { "additionalProperties": false, "properties": { "team_id": { "description": "Id of the team.", "type": "integer" } }, "required": [ "team_id" ], "type": "object" }, "name": "team_readiness", "outputSchema": null }, { "description": "List the roles a team has defined (e.g. \"Frontend\", \"Designer\"), which\nmembers can be assigned via `team_assign_role`.", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number, starting at 1.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Rows per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" }, "team_id": { "description": "Id of the team.", "type": "integer" } }, "required": [ "team_id" ], "type": "object" }, "name": "team_roles", "outputSchema": null }, { "description": "Browse the teams of one event that are advertising open positions — the\npublic \"who is recruiting\" list behind the find-a-team page, readable by\nanyone, including someone who has not joined the event yet.\n\nThis is the tool for a person looking for a team. `team_open_roles` is the\nother direction: it lists open positions the caller already has access to\n(their own teams', or every team's if they organise the event) and shows a\nstranger nothing. Each row here carries the team's public profile plus its\n`open_roles`. Follow up with\n`team_request_join`, or list yourself with `event_join_as_free_agent` if\nnothing fits.", "inputSchema": { "additionalProperties": false, "properties": { "event_slug": { "description": "Slug of the event.", "minLength": 1, "type": "string" }, "page": { "default": 1, "description": "Page number, starting at 1.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Rows per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" }, "search": { "description": "Free-text filter over team name and description.", "type": "string" } }, "required": [ "event_slug" ], "type": "object" }, "name": "team_seeking_members", "outputSchema": null }, { "description": "List technologies (tech-stack tags) that projects and teams can be\nlabelled with, e.g. \"React\", \"PostgreSQL\".", "inputSchema": { "additionalProperties": false, "properties": { "page": { "default": 1, "description": "Page number.", "minimum": 1, "type": "integer" }, "page_size": { "default": 20, "description": "Results per page (max 100).", "maximum": 100, "minimum": 1, "type": "integer" } }, "type": "object" }, "name": "tech_list", "outputSchema": null }, { "description": "Who is signed in, what roles they hold, and where.\n\nCall this first in any new conversation. It returns the account, the OAuth\npermissions this connection was granted, and — crucially — the list of\nevents, teams and companies the user belongs to *with the role they hold in\neach one* (organizer, judge, participant, team lead, free agent, builder,\nspeaker, company admin, platform admin).\n\nUse it to decide which tools apply before calling anything else, and to\nresolve \"my event\" / \"our team\" into a concrete slug or id.", "inputSchema": { "additionalProperties": false, "properties": {}, "type": "object" }, "name": "whoami", "outputSchema": null } ] }
Verify it yourselfcurl -s https://api.teppi.xyz/v1/evidence/sha256:51acbe74592e29329646806c7c420587c62d1878e3a583722f28d2e5318e6758 | sha256sum