ClusterHack speaks MCP. Point any MCP client at the endpoint below, sign in once, and it can do what you can do on the site — create events, form teams, submit projects, score as a judge, publish winners — in your roles, under your permissions.
https://clusterhack.dev/mcp/Streamable HTTP2025-06-18, 2025-03-26, 2024-11-05Every call runs as your account through the site's own permission checks — the same code that guards the web pages. The OAuth permissions you tick at sign-in can only narrow that further. Personal data of other participants needs a separate, explicitly ticked permission and still only works where you already administer the event.
api_request — Call any ClusterHack REST endpoint directly — the escape hatch. Prefer a purpose-built tool when one exists: it validates arguments and explains failures. Reach for this when the …
writes
event_roles — Which roles the signed-in user holds at one specific event. Cheaper and more precise than `whoami` when you already know the event and just need to know whether …
list_api_endpoints — List the raw REST endpoints behind this server. Use it together with `api_request` when you need something no curated tool covers. The list is read from the live …
list_capabilities — The catalogue of everything this server can do, grouped by area. Returns each tool available to the current connection with its one-line purpose, the role it is meant …
people_list — Browse the public builder-rating leaderboard (the /hackers/ page): every hacker with at least one shipped project, ranked by an overall rating computed from real activity (submissions, wins, community …
search — Search across the platform: events, teams, projects, people and articles. One call when you do not yet know the identifier of the thing the user means ("the AI …
server_info — What this MCP server is, which version it speaks, and how to connect. Useful for diagnostics and for telling the user where to manage or revoke the connection.
user_get — One person's public profile by username: display name, bio, links, avatar, plus the events they took part in, the teams they were on and their wins. Public-safe fields …
user_portfolio — One person's public builder portfolio by username — the same content as their /u/<username>/ page: shipped projects (with demo/repo links), hackathons attended, wins, sanitized social links and their …
whoami — Who is signed in, what roles they hold, and where. Call this first in any new conversation. It returns the account, the OAuth permissions this connection was granted, …
event_add_faq — Add one FAQ entry — a question and its answer — to an event's public page. Organiser-only. FAQ entries are the cheapest way to cut repeated questions in …
writes
event_add_info_block — Add one free-form information block to an event's public page: a titled section of prose for anything the structured fields do not cover (house rules, accessibility, sponsors' prizes, …
writes
event_add_nomination — Add one award nomination (a prize track such as "Best hardware hack" or "Rookie of the year") to an event. Teams can be entered into a nomination, and …
writes
event_add_stage — Add one stage/activity to an event's schedule (the timeline shown on the public event page): a title, a time window, where it happens, and optionally a speaker, company …
writes
event_add_team_stage — Add one team-progress checkpoint to an event — the stages a team moves through during the build (idea → prototype → demo-ready, or whatever this event calls them). …
writes
event_background_images — The global catalogue of certificate background templates (used for the `background` field of an event's certificate config). Not tied to one event.
event_cities — The global catalogue of cities (used for the `city` field on `event_create`/`event_update` and to show where events happen).
event_create — Create a new hackathon. The signed-in user becomes its owner and first admin automatically. Only `name` and `adress` (where it happens — can be "Online") are required; everything …
writes
event_delete — Permanently delete an event and its settings row. Irreversible: teams, submissions, scores, registrations and everything else scoped to it goes with it. Organiser-only. Always confirm with the user …
writes
destructive
event_delete_faq — Remove one FAQ entry from an event's public page. Organiser-only and irreversible — there is no trash. Prefer `event_update_faq` when the answer merely changed; delete only when the …
writes
destructive
event_delete_info_block — Remove one free-form information block from an event's public page. Organiser-only. The text is gone for good, so copy it out first if it may be needed again.
writes
destructive
event_delete_nomination — Remove an award nomination from an event. Any team entries into this nomination go with it, so prefer `event_update_nomination` if you only meant to rename a track. Organiser-only.
writes
destructive
event_delete_stage — Remove one stage from an event's schedule. Organiser-only and irreversible. Participants may already have this slot in their calendar, so prefer editing the stage's time when a session …
writes
destructive
event_delete_team_stage — Remove a team-progress checkpoint from an event. Teams currently marked as being on this stage lose that marker, so during a live event prefer renaming it with `event_update_team_stage`. …
writes
destructive
event_ethics_approval_get — Read the ethics-review record linked to an event's settings, if any (committee name, approval date, review details). Organiser-only — this data is private compliance paperwork, not shown on …
event_ethics_approval_set — Create or update the ethics-review record for an event: which committee reviewed it, the approval date, and free-text review details. Upsert — if the event already has one …
writes
event_faq — An event's FAQ: the question/answer pairs shown on its public page. Public read — use it to answer a participant's question from the event's own words before guessing, …
event_get — Get one event's full public profile by slug: name, dates, address, topic, description, status and city. Call this once you have a slug (from `event_list` or `search`) and …
event_info_blocks — An event's additional free-form information blocks (extra sections shown on its public page beyond the main description — rules, prizes, sponsors notes, etc.).
event_list — Browse hackathons on the platform — filter by status, city or date. Returns each event's slug, which every other event tool needs, plus name, status, dates and city. …
event_nominations — An event's award nominations/tracks (e.g. "Best AI prototype"), used when creating teams, awarding winners and building the leaderboard per track.
event_presets — Public catalogue of event-creation presets (AI build day, student hackathon, corporate innovation day, ...) with sensible defaults and starter nominations. Call before `event_create` when the user describes a …
event_schedule — The event's timeline: an ordered list of stages/activities (opening, workshops, deadlines, closing ceremony) with title, location, time window and status (past/now/future). This is what participants see as "the …
event_settings_get — Read one event's admin-only settings: team size limits, minimum age and age-gating, the personal-data consent text, the external Google Form link, and whether the event is hidden from …
event_settings_update — Update one event's admin-only settings: team size limits, minimum age and age-gating, the personal-data consent text, the external Google Form link, and whether it is hidden from the …
writes
event_share_links — The public links for promoting an event: its shareable page, the calendar file participants can add to their own calendar, the Open Graph preview image used when the …
event_team_stages — An event's team-facing reporting checkpoints (e.g. "Idea locked", "Demo ready") with their time windows — distinct from `event_schedule`, which is the event's own agenda. Used to track team …
event_types — The global catalogue of event types (used for the `type` field on `event_create`/`event_update`). Small and rarely changes.
event_update — Edit an existing event's profile: name, dates, address, topic, description, status, city, timezone and similar fields. Organiser-only. Send only the fields that change — this is a partial …
writes
event_update_faq — Edit one FAQ entry's question or answer. Organiser-only; a partial update, so send only the field that changes. Use this rather than delete-and-recreate so the entry keeps its …
writes
event_update_info_block — Edit one of an event's free-form information blocks (the extra sections on its public page — rules, prizes, sponsor notes). Organiser-only.
writes
event_update_nomination — Edit an award nomination: rename it, reword what it is judged on, or move its sponsorship to a different company. Organiser-only. Use this rather than deleting and re-adding, …
writes
event_update_stage — Edit one schedule stage (title, time window, location, links, status). Organiser-only, partial update.
writes
event_update_team_stage — Edit a team-progress checkpoint: rename it, reorder it, retime it or reword what teams must do to reach it. Organiser-only. Teams already sitting on this stage stay on …
writes
my_speaking_slots — The schedule slots where the signed-in user is listed as the speaker — what they are presenting, when it starts, where, and the broadcast link if the event …
event_admin_add — Grant a user co-admin rights on an event: they can then edit it, run the control room, moderate teams, manage judges and publish winners. A co-admin is a …
writes
event_admin_remove — Revoke a user's co-admin rights on an event. The event's owner cannot be removed this way — ownership is a property of the event itself. Organiser- only; takes …
writes
event_admins_list — List an event's co-admins — everyone besides the owner who can manage it. Organiser-only. Use it before granting or revoking rights, and when someone asks "who else can …
event_analytics — Registration funnel and submission/vote analytics for one event (registered -> teamed-up -> submitted, judge coverage, vote counts). Gated behind the organiser's billing plan (Pro+); returns `analytics_enabled: false` with …
event_announce — Send an announcement notification (in-app + queued email) to an event's participants, or to one team's members if `team_id` is given. Implementation note: `/api/v1/email-jobs/` (the generic notification endpoint) …
writes
event_award_winner — Award a winner, either straight from a leaderboard submission (auto- resolving its team and nomination) or explicitly by nomination + team. Idempotent per (nomination, team): calling it again …
writes
event_branding — Read an event's white-label branding: brand colours, public-page theme and dedicated subdomain, plus the resolved values actually used for rendering and whether the owner's plan includes customisation at …
event_certificate_download — A ready-to-open link to the previously generated certificate PDF bundle. Returns an absolute URL rather than the file itself (MCP tool results are JSON, not files) — hand …
event_certificate_generate — Persist the certificate configuration and generate the full certificate PDF bundle for every eligible participant, saving it to the event. Returns the number of pages generated and download …
writes
event_certificate_get — The event's certificate template configuration (size, orientation, background, text placement/font per role) plus the catalogue of available background images to choose from.
event_certificate_preview — Render a one-off certificate preview with sample names, to check the template looks right, without saving anything or generating the real per-participant bundle. The rendered PDF bytes are …
event_certificate_update — Create or update the event's certificate template: size/orientation, which background to use, and the coordinates/font/size for the event name, team name and participant name text. Upserts — safe …
writes
event_clone — Duplicate an event's configuration into a fresh draft — the "run the same hackathon again next month" move. Copies the type, address, topic, audience, description, city, timezone, duration, …
writes
event_control_room — The organiser's live dashboard for one event: setup checklist (has stages/FAQ/nominations/registration form/certificate template/judging criteria been configured), headline metrics (participants, teams, ready teams, submissions, judged count, votes), the presentation …
event_export_name_tags_pdf — A ready-to-open link to the printable PDF of name-tag badges for every participant. Returns an absolute URL rather than the file itself (MCP tool results are JSON, not …
event_export_participants_pdf — A ready-to-open link to the printable PDF of the full participants list. Returns an absolute URL rather than the file itself (MCP tool results are JSON, not files, …
event_mark_attendance — Check a participant in (or out) at the event — sets whether they actually showed up, separate from whether they registered online. Feeds the "registered vs. attended" figure …
writes
event_moderate_team — Organiser moderation action on one team: `ban` (removes it from the event), `unban`, `activate` (force-allow it even if under the minimum team size) or `deactivate` (withdraw that force-allow, …
writes
event_participants — The full participant roster for an event: id, username, name and which team(s) each person is on. Organiser-only (this is the admin roster view, distinct from the public …
event_publish_winners — Show or hide the winners on the event's public page. Flipping this from hidden to shown fires placement-notification emails to the winning teams — re-publishing (true when already …
writes
event_set_branding — Set an event's white-label branding: primary and accent colour (hex, e.g. #4f46e5), the public-page theme (light or dark) and an optional dedicated subdomain such as 'myhack', which serves …
writes
event_speaker_add — List a user as a speaker at this event. A speaker can then be attached to a schedule stage (see `event_add_stage`), which is how a talk or workshop …
writes
event_speaker_remove — Remove a user's speaker listing from an event. Organiser-only. Do this when a speaker drops out — it does not touch the schedule stages they were attached to, …
writes
event_speakers_list — List the speakers announced for an event — the people who can be attached to a schedule stage as its presenter. Organiser-only. Use it before adding a speaker …
event_speech_queue — The presentation order for the final pitches: which team presents in which slot. This is the plain running order (SpeechQueue) — distinct from the readiness queue used during …
event_speech_queue_set — Set (create or move) one team's slot in the simple presentation order. Upserts by team: if the team already has a queue entry its position is updated, otherwise …
writes
event_turn_update_status — Update one team's status in the final-speech queue: `1` not ready, `2` ready, `3` presenting now, `4` finished. The `ready` flag is derived automatically from the status.
writes
event_turns — The live "final speech" readiness queue (EventTurns): each team's slot number and status — not ready, ready, presenting now, or finished. This is what the organiser's on-stage screen …
event_winners — The announced winners for an event, per nomination and overall, plus whether they are published yet.
event_add_registration_field — Add one custom question to an event's registration form. Organiser only. Participants answer it later with `event_submit_registration_answers`. `sort` controls display order (lower first); leave it out to append …
writes
event_create_invite — Mint a new shareable invite link for an event: no expiry, unlimited uses, active immediately. Organiser only. Use this to hand out a join link instead of manually …
writes
event_delete_registration_field — Permanently remove a registration question from an event's form. Organiser only. This also deletes every participant's previously submitted answer to that question — there is no undo. Use …
writes
destructive
event_free_agents — List participants at an event who are looking for a team. Visibility follows the platform's own rule, not a full public roster: a normal caller only sees their …
event_join — Join an event as a participant — the simplest way onto the platform's participant list, with no registration questions to answer. Use this for events that do not …
writes
event_join_as_free_agent — List the signed-in user as a "free agent" at an event: a teamless participant looking to be recruited. Use this when someone wants to be found by teams …
writes
event_leave — Remove the signed-in user from an event's participant list. This only removes event-level participation; it does not remove them from any team they belong to at that event …
writes
event_leave_free_agents — Remove the signed-in user's "looking for a team" listing at an event. Call this once they have joined a team, or no longer want to be recruited. Errors …
writes
event_list_invites — List every invite link ever created for an event, with usage counters and whether each is still active. Organiser only.
event_my_membership — Summarise the signed-in user's relationship to one event: whether they have joined, their registration answers on file, whether they are listed as a free agent, and which roles …
event_my_registration_answers — List the signed-in user's own answers to one event's registration questions. Only ever returns their own data — use `event_registration_responses` (organiser only) to read other people's.
event_register — Submit or update the event's registration answers: date of birth and the personal-data processing agreement. Call `event_registration_form` first if you need to know whether the event actually requires …
writes
event_registration_form — List the custom questions an event asks at registration time (its registration form), in display order. Public data — the question text is visible to anyone. Use this …
event_registration_responses — Read every participant's answers to an event's registration questions — other people's personal responses, not just the caller's own. Organiser only, and requires the `pii:read` permission in addition …
event_revoke_invite — Deactivate one of an event's invite links so its token can no longer be redeemed. Organiser only. The invite row itself is kept for the usage history — …
writes
destructive
event_submit_registration_answers — Submit the signed-in user's answers to one or more of an event's registration questions. Each answer is always stored as a new response row (there is no upsert), …
writes
event_update_registration_field — Edit one existing registration question (text, required flag, placeholder, help text or sort order). Organiser only. Pass only the fields you want to change; the rest keep their …
writes
invite_join — Redeem a shareable invite link, joining its event. Safe to call for someone who is already a member (returns `already_member: true` instead of erroring). Fails if the link …
writes
invite_preview — Look up what a shareable invite link opens, without redeeming it. Public and PII-free: returns the event's name and slug and whether the token is still valid (active, …
team_add_open_role — Publish a position a team wants to fill ("Looking for a backend developer"), so it shows up in `team_open_roles`.
writes
team_additional_info — Read or change a team's extended profile: budget, target audience, success criteria and expected outcomes. Omit all the value fields to just read the current profile; provide any …
writes
team_approve_member — Approve a pending join request, adding that person to the team (and, if they were not already, to the event's participant list). Requires the caller to already be …
writes
team_assign_role — Assign one of a team's defined roles (from `team_roles`) to an existing member, with an optional caption. Use `team_members` to find the `membership_id`.
writes
team_cancel_join_request — Withdraw the signed-in user's own pending request to join a team. Errors if there was no pending request.
writes
team_comment — Read or post a comment on a team's page. Omit `text` to list existing comments; provide `text` to post a new one, recorded under the signed-in user. Pass …
writes
team_create — Create a new team inside an event. The creator is automatically added as its first member. The user must already be a participant of the event (call `event_join` …
writes
team_create_role — Define a new role a team's members can be assigned to (e.g. "Backend"). This is a role label for the roster, not an open recruiting position — use …
writes
team_delete — Permanently delete a team, including its roster, roles, posts and submissions. There is no undo. Any member of the team (or an admin of its event) can do …
writes
destructive
team_delete_post — Delete one of a team's public build-log posts ("twits"). Use this to take down a post published by mistake; the rest of the team's log is untouched. Team …
writes
destructive
team_delete_role — Remove one of a team's defined role labels (from `team_roles`). Members currently carrying the role simply lose the label; nobody is removed from the team. This does not …
writes
destructive
team_feedback — Read or leave feedback on a team. Omit `content` to list existing feedback; provide `content` and `rating` (1-10) to leave new feedback, recorded under the signed-in user.
writes
team_get — Get one team's full detail: name, description, project info, readiness, accessibility flags, and which event and nomination it belongs to. Only visible if the signed-in user belongs to …
team_leave — Remove the signed-in user from a team they belong to. Also drops them from the event's participant list side effects the site itself applies (does not remove their …
writes
team_like — Toggle the signed-in user's like on a team: likes it if they had not, or removes their like if they already had. Returns the new state.
writes
team_list — List teams — scoped to what the signed-in account can see: teams they belong to, created, or administer via being an admin of the team's event. This is …
team_locations — Read the physical location details linked to a team's additional-info profile (street, city, state, zip), if one has been set. There is currently no self-service way to create …
team_matchmaking_candidates — AI-ranked list of free (teamless) participants this team could recruit, within the same event. Team-manager only. Throttled — do not call it in a tight loop.
team_matchmaking_teams — AI-ranked list of teams one free (teamless) participant could join, within the same event. Callable by the free-agent listing's own owner, or an admin of the event. Use …
team_members — List a team's current members with their role and caption. Use the row `id` (a membership id, not a user id) with `team_assign_role` or `team_remove_member`.
team_membership_requests — List pending requests to join a team — the queue `team_approve_member` works from. Visible to existing team members and the event's organisers.
team_open_roles — List the positions teams are looking to fill ("we need a designer"). Visibility is limited to what the signed-in account can already see: their own team's open roles, …
team_post — Publish a short update ("twit") on a team's public feed — progress notes, announcements. Authored as the signed-in user automatically.
writes
team_posts — List a team's public updates ("twits") — the short build-log posts a team publishes as it works, in the order the server returns them. Use it to catch …
team_readiness — Check whether a team has marked itself ready to present, plus whether it is banned or currently accessible for judging.
team_remove_member — Remove another member from a team (a manager "kicking" someone). Use `team_members` to find the membership `id` — this is not a user id.
writes
destructive
team_remove_open_role — Take down one of a team's published open positions — the usual reason is that the seat is filled. Team members and the event's organisers only. The people …
writes
destructive
team_request_join — Ask to join a team. The requester must already be on the event's participant list (`event_join` first) and the team must not be at the event's max-team-size cap. …
writes
team_roles — List the roles a team has defined (e.g. "Frontend", "Designer"), which members can be assigned via `team_assign_role`.
team_set_avatar — Set a team's avatar image from base64 (raw, or a `data:<mime>;base64,...` URI). This is the picture shown next to the team everywhere on the site. Replaces any current …
writes
team_set_readiness — Flip a team's readiness flag, entering (or updating) its place in the event's final-presentation queue. Fails if the team is banned from the event.
writes
team_settings — Read or change a team's settings: whether feedback is allowed and whether comments are enabled. Omit both `allow_feedback` and `comments_enabled` to just read the current values; provide either …
writes
team_update — Edit a team's own fields: name, description, project info, table number, captain label, whether it is actively working, or its Twitch channel. Pass only the fields you want …
writes
team_upload_presentation — Upload the team's pitch deck from base64 (raw, or a `data:<mime>;base64,...` URI) — the slides judges and visitors open from the team's page. Usually a PDF. Replaces any …
writes
submission_add_media — Attach a screenshot/image to a submission. Pass the image as base64 — a raw base64 string or a data URI (``data:image/png;base64,...``); it is re-encoded server-side to WEBP, capped …
writes
submission_bulk_intake — Bulk-moderate submissions for an event in one call: approve, reject or reset (back to pending) a set of submissions by id. Only ids that belong to this event …
writes
submission_delete — Permanently delete a submission. Allowed for the owning team while the submission window is open, or for an event admin at any time. This removes the project from …
writes
destructive
submission_delete_media — Remove one screenshot/image from a submission. Allowed for a member of the submission's team or an event admin. There is no undo.
writes
destructive
submission_get — Retrieve one project submission by id: title, links, description, status, approval status, vote count and attached media. Anonymous and unrelated callers only see it once the team has …
submission_get_mine — Find the signed-in user's own team's submission at one event. Resolves "my team" for the event from the caller's team memberships, then returns that team's submission — including …
submission_intake_config — Read one event's submission intake rules: which fields are required (repo/demo/video/screenshot), the minimum description length, custom intake questions, and the AI auto-approve threshold. Event admin only — this …
submission_intake_config_update — Create or update one event's submission intake rules. Only the fields you pass are changed if a config already exists; on first configuration, omitted fields fall back to …
writes
submission_list — Browse project submissions, filterable by event, team or status. Anonymous and unrelated callers only ever see submitted (public) projects; a signed-in caller additionally sees their own team's drafts …
submission_list_media — List the screenshots/gallery images attached to a submission. Visibility mirrors the parent submission: public once submitted, otherwise limited to the team, event admins and judges.
submission_submit — Lock a draft submission for judging: finalises it, timestamps it, and runs the event's intake checks (required fields, auto-approval threshold) once. Only works while the submission window is …
writes
submission_unvote — Remove the signed-in user's own community vote from a project, freeing up their vote budget. Safe to call even if they had not voted for it.
writes
submission_update — Edit fields on an existing submission by id (title, links, description, nomination, custom answers). Only the fields you pass are changed. Works for the team while the submission …
writes
submission_upsert — Create your team's submission if it doesn't exist yet, or update it if it does — the single tool for "save our project". Only works while the event's …
writes
submission_vote — Cast the signed-in user's community vote for a public (submitted) project. Any signed-in user may vote except members of the submitting team. Respects the event's per-user vote budget, …
writes
judging_add_criterion — Add one rubric row (criterion) to an event's judging form: a name, optional description, a weight (how much it counts toward the weighted leaderboard score) and a maximum …
writes
judging_add_judge — Assign a judge to an event: either a registered ClusterHack user (`user_id`) or an external reviewer invited by email (`email`), who then scores through a one-time invite link …
writes
judging_criteria — List the scoring rubric for an event: each criterion's name, description, weight and maximum score. Visible to the event's admins, its judges, and its registered participants (so teams …
judging_delete_criterion — Permanently remove a rubric criterion from an event. This also deletes every score already recorded against it (scores cascade). Event admin only — there is no undo.
writes
destructive
judging_list_judges — List judge assignments: event admins see every judge at their events, a judge sees their own row. Optionally narrow to one event. Each row shows whether the judge …
judging_my_assignments — What the signed-in judge has to score at one event: every submitted project, with whether the judge has already scored it. Call `judging_criteria` first to see the rubric, …
judging_my_scores — List the signed-in judge's own scores, optionally narrowed to one event. Use this to review or audit what has already been submitted, as opposed to `judging_my_assignments` (what is …
judging_progress — Per-judge scoring coverage for an event: how many submitted projects each judge has scored at least one criterion for, and which ones they still owe. Use this to …
judging_remove_judge — Remove a judge assignment from an event. Their scores already recorded stay in place (they are not deleted); this only stops them from judging further and from appearing …
writes
destructive
judging_scores_for_submission — List every recorded score for one submission — all judges, all criteria. Visible to the assigned judges of the submission's event and to the event's admins. Use this …
judging_submit_score — Record or update the signed-in judge's score for one submission against one criterion, with optional written feedback. Re-submitting for the same submission+criterion overwrites the previous value rather than …
writes
judging_submit_scores_batch — Save all of the signed-in judge's rubric scores for one submission in a single call — the normal way to submit a full judging pass. Every criterion must …
writes
judging_update_criterion — Edit one rubric criterion by id (name, description, weight, max score or sort order). Only the fields you pass are changed. Event admin only. Changing max_score does not …
writes
winner_auto_publish — One-click "publish winners": auto-crowns the top 3 overall and the top 3 of every nomination straight from the current leaderboard, then publishes. Idempotent — re-running it after new …
writes
winner_award — Crown a winner. Either pass `submission_id` to award straight from a leaderboard entry (its team and nomination, if any, are resolved automatically), or pass `nomination_id` and `team_id` explicitly …
writes
winner_list — List announced winners for an event: per-nomination winners and overall (without-nomination) winners, plus whether they are published yet. Public once the organiser publishes; before that, only the event's …
winner_publish — Toggle whether an event's winners are publicly visible. Flipping from unpublished to published sends placement notification emails to the winning teams (re-publishing does not re-send them). Event admin …
writes
winner_remove — Remove one awarded winner entry (not the whole publication — use `winner_publish` to unpublish everything). Pass `kind="nomination"` for a per-track win or `kind="without_nomination"` for an overall win, with …
writes
destructive
event_leaderboard — The ranked leaderboard for one event: submissions ordered by weighted judge score then vote count, with each entry's rank, team and score. Public once the organiser publishes winners; …
showcase_browse — Browse the public, cross-event showcase: shipped/submitted projects ranked for display, with title, tagline, team name, vote count and a cover image. Optionally narrow to one event. This is …
company_about_us — A company's longer "about us" blurb (up to 10,000 characters), separate from its short `description`. Returns `found: false` if the company has not written one yet.
company_add_admin — Grant company-admin rights to one of the company's existing employees. Company admin only. `employee_row_id` is the id of the EMPLOYEE ROSTER ROW from `company_employees` — not a user …
writes
company_add_vacancy — Add a company to the off-platform board (`company_vacancies`). Known platform limitation: the underlying record has no link back to any company or employee, so the site's own permission …
writes
company_admins — Who can edit a company page (grant company-admin rights, not just be listed as an employee). Without `company_id`, returns every admin grant for every company the caller already …
company_create — Create a new company page. Self-service: any signed-in user may create one, and the creator automatically becomes its first employee AND its admin (able to edit the page, …
writes
company_decide_employment_request — Approve or reject a pending employment application to one of the caller's companies. `decision="approve"` turns the request into an employee roster row; `decision="reject"` withdraws it. Company admin only.
writes
company_delete_vacancy — Remove an entry from the off-platform company board (`company_vacancies`). Same known limitation as `company_add_vacancy`: this write path is effectively blocked for every account by a permission-check gap in …
writes
destructive
company_employees — A company's employee roster (position, start date). Without `company_id`, returns every roster row the caller can see (their own employment rows plus every company they administer) — the …
company_employment_requests — Pending requests to join a company. A company admin sees everyone waiting on their door; anyone else sees only their own outstanding applications. This is where the `request_id` …
company_ex_employees — A company's former employees (position, start and end date) — the record created when someone is fired via `company_fire_employee`. Without `company_id`, returns every ex-employment row the caller can …
company_fire_employee — Remove someone from a company's employee roster: moves them to the ex-employee record (with today's end date) and revokes any admin rights they held there. Company admin only. …
writes
destructive
company_get — One company page by id: name, description, organisation type, website and logo. Public read. Use it after `company_list` or `search` to get the full record, and to confirm …
company_list — Browse ClusterHack company pages: name, description, org type, website and logo. Public data — use this to find a company's id before calling any other company tool.
company_remove_admin — Take away someone's company-admin rights. They stay on the employee roster — this only stops them managing the company page, its roster and its requests. Company admin only. …
writes
destructive
company_request_employment — Apply, as the signed-in user, to join a company as an employee. Fails if the caller already works there or already has a pending request. A company admin …
writes
company_set_logo — Set a company's logo from base64 (raw, or a `data:<mime>;base64,...` URI). This is the mark shown on the company page and next to it wherever the company appears, …
writes
company_update — Edit a company page's name, description, org type or website. Company admin only — call `whoami` to see which companies the caller administers. Only the fields you pass …
writes
company_update_about_us — Create or replace a company's "about us" blurb. Company admin only. Creates the row on first use, updates it afterwards — safe to call repeatedly.
writes
company_update_employee — Change an employee's job title on a company roster — the fix for a typo or a promotion, without firing and re-hiring them (which would lose their start …
writes
company_update_vacancy — Edit an entry on the off-platform company board (`company_vacancies`). Same known limitation as `company_add_vacancy`: this write path is effectively blocked for every account by a permission-check gap in …
writes
company_vacancies — The public board of companies not yet on ClusterHack (a lightweight off-platform listing — name, description, website — not a job-posting system). Public, no filters.
company_withdraw_employment_request — Withdraw your own pending request to join a company — the polite way out after applying to the wrong place, or when you have changed your mind before …
writes
destructive
event_add_sponsor — Slot an on-platform company into one of an event's sponsorship tiers. Event admin of that event only. Call `event_sponsor_tiers` first to find (or `event_add_sponsor_tier` to create) the tier …
writes
event_add_sponsor_text — Add an off-platform sponsor to an event — a firm that has no ClusterHack company page, listed by name, blurb and website under one sponsorship tier. Use `event_add_sponsor_tier` …
writes
event_add_sponsor_tier — Create a new sponsorship tier/group for an event (e.g. "General Partner"). Event admin of that event only. Create the tier before adding sponsors to it with `event_add_sponsor`.
writes
event_remove_sponsor_text — Remove an off-platform sponsor from an event's sponsor list. Organiser-only. This only delists the firm; it touches nothing else.
writes
destructive
event_sponsor_text — Sponsors of one event that are NOT themselves on ClusterHack (a name, description, website and logo entered as free text, with the sponsorship tier each one belongs to) …
event_sponsor_tiers — The sponsorship tiers/groups defined for one event (e.g. "Sponsors", "Partners", "General Partner") — the buckets `event_add_sponsor` slots companies into. Public read.
event_sponsors — The on-platform companies sponsoring one event, with the sponsorship tier each one is slotted into (e.g. "Sponsors", "Partners", "General Partner"). Public read. Use `event_sponsor_text` alongside this for sponsors …
event_update_sponsor_text — Edit an off-platform sponsor on an event: fix its name, blurb or website, or move it to a different sponsorship tier. Organiser-only.
writes
board_ai_plan — Ask the platform's AI to draft a kanban plan (columns + cards) for an event or team goal, e.g. "ship the MVP by demo day". By default it …
writes
board_create — Create a new kanban board. An "organizer" board needs `event_slug` and is available to that event's administrators. A "team" board needs `team_id` and is available to that team's …
writes
board_delete — Permanently delete a kanban board and everything on it: its columns, its cards and their attachments. There is no undo. Only someone with access to the board (event …
writes
destructive
board_get — Retrieve one kanban board by id, with its type, owning event/team and timestamps. Use `column_list` and `card_list` afterwards to see its contents — a board on its own …
board_list — List kanban boards the signed-in user can access. Covers both kinds of board: organizer boards (one per event, run by that event's admins) and team boards (one per …
board_update — Rename, re-describe or re-parent a kanban board. Only fields you pass are changed. Moving a board between event/team re-checks access against the *new* target as well as the …
writes
card_add_attachment — Upload a file attachment to a kanban card. Pass the file's bytes as base64 in `content_base64` — images (jpg/png/gif/webp/bmp/tif) are automatically re-encoded to WebP and downscaled; other allowed …
writes
card_attachments — List the file attachments on a kanban card (or every attachment on a board). Each entry has the file's name, content type, size and whether it is an …
card_create — Create a new card in a column. The card's board is taken from the column, so you never set it directly. Use `card_move` afterwards to reposition or re-column …
writes
card_delete — Permanently delete a kanban card, together with its attachments. There is no undo and no trash. Ask the user before calling it; if they only want the card …
writes
destructive
card_delete_attachment — Permanently delete one file attachment from a kanban card (and its stored file). There is no undo.
writes
destructive
card_get — Retrieve one kanban card by id: its title, description, priority, assignee, due date, column, position and any AI-generated note.
card_list — List the cards on a kanban board, optionally narrowed to one column. Returns each card's title, description, priority, assignee, due date and its current column and position.
card_move — Move a card: drag it into a different column and/or change its position within the column. This is the "drag and drop" operation — pass `column_id` to re-column …
writes
card_update — Edit a kanban card's title, description, priority, assignee or due date. Only fields you pass are changed. To change which column the card is in or its position, …
writes
column_create — Add a new column to a kanban board. `order` controls left-to-right position (lower sorts first); columns on the same board must have unique names.
writes
column_delete — Permanently delete a kanban column and every card in it. There is no undo — move cards out first with `card_move` if they should survive.
writes
destructive
column_list — List the columns of a kanban board (e.g. "To do", "In progress", "Done"), in display order. Use this to find a column's id before creating or moving cards …
column_update — Rename a kanban column, change its display order, or move it to a different board. Only fields you pass are changed.
writes
article_create — Create a new article body for an existing title/slug and language. Look up (or create, via the raw API) the `title_id` with `article_titles` and the `language_id` with `article_languages` …
writes
article_delete — Permanently delete an article body. This does not delete the underlying title/slug or language records (other translations of the same title keep working), only this one article. There …
writes
destructive
article_get — Retrieve one CMS article by id: its body, publish date, hidden flag, and which title/slug and language it belongs to.
article_languages — List the languages articles can be written in, e.g. {"language_name": "English", "short_name": "en"}. Use this to find the `language_id` `article_create` needs.
article_list — Browse CMS articles (the pages under /articles/<language>/<slug>). Filter by `language` (a language's short code, e.g. 'en') and/or `slug` (a title's slug) to find one specific page's translations. Hidden …
article_titles — List the CMS "title" records — each one a page's title text and slug, e.g. {"title": "How to organize a hackathon", "slug": "how-to-organize"}. An article always points at …
article_update — Edit an existing article: its body, hidden flag, or which title/language it is attached to. Only fields you pass are changed. Staff-only.
writes
tag_create — Create a new tag. Tag names are unique — creating one that already exists fails. Staff-only.
writes
tag_list — List tags used to categorize content across the platform (articles, projects and more share the same tag vocabulary).
tech_create — Create a new technology tag that projects and teams can be labelled with, e.g. "React" or "PostgreSQL". Staff-only, same as tag_create.
writes
tech_list — List technologies (tech-stack tags) that projects and teams can be labelled with, e.g. "React", "PostgreSQL".
account_how_to_sign_in — Explains how to connect an account to this MCP server — read this instead of guessing at a login/registration tool, because there isn't one. ClusterHack's own credential endpoints …
email_job_create — Queue a notification/email job for yourself: a background job later turns unsent rows into a real email. `type` is a free-text label (the site uses values like "Joined …
writes
email_job_list — List the signed-in user's own raw notification/email-job rows (`SendEmailToUser`) — the same records `notification_list` shows, but with the delivery-queue fields (`sent`, `type`) instead of the friendly message/link projection. …
notification_dismiss — Dismiss one of the signed-in user's own notifications, hiding it from the default `notification_list` view. Dismissing does not delete it or affect its read state.
writes
notification_get — Retrieve one of the signed-in user's own notifications by id, with its full message and deep link. Use it after `notification_list` when the summary is not enough to …
notification_list — List the signed-in user's own in-app notifications: type, message, link, which event they relate to, and whether each is read/dismissed. Set `unread_only=true` for just what still needs attention. …
notification_mark_all_read — Bulk-mark all of the signed-in user's matching unread notifications as read in one call. Narrow with `event_slug` and/or `type`, or omit both to clear everything unread. Returns how …
writes
notification_mark_read — Mark one of the signed-in user's own notifications as read. Safe to call on an already-read notification.
writes
notification_mark_unread — Mark one of the signed-in user's own notifications unread again, so it comes back in the unread count and in the site's notification badge. Useful when something was …
writes
notification_unread_count — How many of the signed-in user's notifications are unread right now. Cheaper than paging through `notification_list` just to show a badge count. Optionally scope it to one event.
profile_add_favorite — Bookmark one event, team or company for the signed-in user. Pass exactly one of `event_id`, `team_id` or `company_id`. Note: creating a brand-new favorite target (one nobody has favorited …
writes
profile_change_password — Change the signed-in user's own password. Requires the CURRENT password, so this only ever acts on the account that is already signed in — it cannot be used …
writes
destructive
profile_dashboard — The signed-in user's personal dashboard: their events, teams, companies and ex-companies, plus role-specific stats, suggested next steps and attention items — the same aggregate the /auth/dashboard/ page shows. …
profile_favorites — The signed-in user's bookmarked events, teams and companies. ClusterHack stores a favorite as a shared row (one per unique event/team/ company) referenced from the user's profile, so this …
profile_get — The signed-in user's own account and profile in one call: username, name, email, bio, links, avatar, phone, date of birth, Telegram handle and the privacy-policy acknowledgement flag. This …
profile_remove_favorite — Remove one bookmark from the signed-in user's favorites list by its favorite id (from `profile_favorites`). This only unlinks it from the caller's own profile — the shared favorite …
writes
profile_set_photo — Set the signed-in user's profile photo from base64 (raw, or a `data:<mime>;base64,...` URI). This is the avatar shown next to their name across the site. Replaces the current …
writes
profile_update — Update the signed-in user's own account and/or profile fields: name, email, bio (short and full description), phone number, website, LinkedIn/GitHub links, Telegram handle, and the privacy-policy acknowledgement flag. …
writes
billing_can_i — Whether one specific paid feature is currently allowed for one event, based on that event's owner's plan. Feature keys: 'branding' (white-label branding), 'private_events' (private/invite-only events), 'analytics' (the analytics …
billing_my_subscription — The signed-in user's own billing subscription: which plan it is on, its status (active/trialing/past_due/canceled/incomplete) and whether that status currently entitles them to the plan's paid features. Auto-provisions a …
billing_plan_features — What each plan unlocks, keyed by feature — white-label branding, private events, the analytics dashboard — plus each plan's free-tier limits (max events owned, max participants per event; …
billing_plans — Browse the public billing plan catalogue (Free / Pro / Corporate today). Returns each plan's code, display name, monthly price, currency, the free-tier limits it carries (max events, …
billing_start_checkout — Start a REAL Stripe Checkout session to upgrade the signed-in user to a paid plan, and return the checkout URL — this begins an actual paid subscription flow, …
writes
ai_capabilities — The catalogue of AI-assist capabilities this deployment plans to offer — event copilot, team matchmaking, mentor assistant, jury briefing, growth recommendations — each tagged with its rollout phase. …
ai_event_draft — Generate a full draft event configuration — name, topic, description, tracks, timeline and judging criteria — from a short organizer brief. Feeds the event creation wizard; the organizer …
writes
ai_hackathon_ideas — Brainstorm hackathon theme/challenge ideas for an organizer from a short description of the challenge and, optionally, the target audience. Calls a language model to generate the ideas (falls …
writes
ai_judge_assist — AI pre-screen of one submission against its event's judging rubric: a DRAFT per-criterion score and rationale for a human judge to review and adjust. It never writes a …
writes
ai_organizer_chat — Conversational AI copilot for the event creation/organizer wizard: answer a question or work through one turn of setting up an event, given the current wizard context and the …
writes
ai_organizer_plan — Deterministic event-logistics calculator: headcount/attendance estimate, check-in staffing, meals, support-channel and risk-alert estimates for a hackathon, from its format and expected registration numbers. Unlike the other `ai_*` tools this …
writes
ai_participant_help — Participant-facing Q&A assistant grounded in one event's public schedule, FAQ, rules, tracks and judging criteria. Any authenticated user can ask about any event's public information this way, regardless …
writes
ai_pitch_review — Review a participant's pitch text and return strengths, improvements and a clarity score, for a participant of the named event (or its admin) to polish their pitch before …
writes
ai_project_ideas — Suggest hackathon project ideas for a participant, grounded in one event's theme and an optional track/nomination and stated interests. Restricted to participants of the named event, or its …
writes
ai_runbook — Generate a minute-by-minute event-day operations runbook (check-in, opening, mentor rounds, judging, closing) for a hackathon of a given format and duration. Calls a language model (falls back to …
writes
admin_audit_log — Recent MCP audit log entries: who did what through this MCP server, when, and whether it succeeded, was denied, or errored. Platform-staff only. Arguments are stored redacted (secrets …
admin_event_lookup — Find an event by exact slug or a fragment of its name — platform-staff only. Returns status, owner, timing and basic counts (teams, submissions, participants) regardless of the …
admin_platform_stats — Headline platform counts — users, events, teams, submissions — plus recent growth (how many of each were created in the last 7 and 30 days). Platform-staff only. Use …
admin_recent_events — What is running right now, starting soon, or recently ended — with operational health flags per event: 'no_teams' (nobody has formed a team yet) and 'past_end_date_but_still_live' (its computed …
admin_set_user_active — Deactivate or reactivate a user account — platform-staff only. Deactivating flips Django's `is_active` flag off, which immediately blocks that account from signing in anywhere on the platform (website …
writes
destructive
admin_user_lookup — Find a platform account by username or email — platform-staff only. Returns personal data (email address, account flags, join/last-login dates), so on top of `admin` this tool additionally …