_ registry / mcp streamable-http · checked 49m ago

devpost-platform-mcp

https://devpost.com

Registry code: 81d44e7683b0b45c

api record

Devpost's hackathon platform. Every tool call requires authentication (a Bearer token). Authenticated users can read hackathon details (overview, dates, prizes, judging criteria, rules, announcements), search and list hackathons, view their own projects and submissions, register for a hackathon, and create, update, thumbnail, and submit projects. Resolve a hackathon by URL, slug, or numeric ID. Always confirm rule/eligibility agreement before registering or submitting.

endpoint
https://devpost.com/mcp
protocol
streamable-http ·2025-11-25
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is devpost-platform-mcp live?
Yes — it answered the hub's last check (checked 49m ago). It answered 100% of checks over the last 30 days.
Is devpost-platform-mcp free to use?
Not measured yet.
What tools does devpost-platform-mcp have?
24 tools: whoami, get_team_invite_link, get_hackathon_overview, get_key_dates, get_prizes, get_judging_criteria, get_submission_requirements, get_hackathon_rules, ….
Is devpost-platform-mcp safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
315ms

last good check

priced tools
0

of 24 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

_ what it can do 24 tools
24 never probed 0 of 24 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • whoami unknown never probed

    Returns the authenticated user's id, email, display name, and granted scopes. Requires mcp:read.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {}
    }
    arguments 5 lines
  • get_team_invite_link unknown never probed

    Returns the secret team invite link for one of the authenticated user's projects. Anyone who opens this link is automatically added as a member of the project, letting them collaborate on it. Use this when the user wants to invite teammates or collaborators to a project, get a shareable join/invite link, or grow their team. The link is project-scoped, not submission-scoped: a person who joins becomes a member of the project across every hackathon it's entered into, not just one submission — make that clear when sharing it. Returns the link and its expiration. Only the project's author or an existing team member can fetch it.

    mcp-tool

    {
      "type": "object",
      "required": [
        "project_slug"
      ],
      "properties": {
        "project_id": {
          "type": "string",
          "description": "Deprecated alias for `project_slug` — still accepted for backward compatibility. Prefer `project_slug`."
        },
        "project_slug": {
          "type": "string",
          "description": "The project's slug or numeric id (from create_project or list_my_projects). Required."
        }
      }
    }
    arguments 16 lines
  • get_hackathon_overview unknown never probed

    Returns the title, short summary, full description, optional resources block, host, status, in-person/online classification with venue when applicable, and public URL for a hackathon. Call this first to ground any answer about a hackathon — the description carries the host's pitch (theme, what to build, why it matters), resources points participants at starter kits / docs / APIs the host has linked, in_person_type and location tell you whether participants need to show up somewhere, and the status (submissions_open / judging / closed / upcoming) tells you whether participants can still submit, whether judging is in progress, or whether results are out.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hackathon"
      ],
      "properties": {
        "hackathon": {
          "type": "string",
          "description": "Hackathon URL, slug (e.g. 'my-hack'), prettyparam slug (e.g. '123-my-hack'), numeric ID, exact title (e.g. 'My Cool Hack'), full domain with or without https:// (e.g. 'my-hack.devpost.com'), or parameterized title (e.g. 'my-cool-hack'). Matching is case-insensitive."
        }
      }
    }
    arguments 12 lines
  • get_key_dates unknown never probed

    Returns the hackathon's submission, judging, public voting, and winners-announced dates as ISO 8601 UTC timestamps, plus the configured time zone and the current phase. Call this before answering questions about deadlines, when participants can submit, or when results will be announced.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hackathon_subdomain"
      ],
      "properties": {
        "hackathon": {
          "type": "string",
          "description": "Deprecated alias for `hackathon_subdomain` — still accepted for backward compatibility. Prefer `hackathon_subdomain`."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "Hackathon URL, slug (e.g. 'my-hack'), prettyparam slug (e.g. '123-my-hack'), numeric ID, exact title (e.g. 'My Cool Hack'), full domain with or without https:// (e.g. 'my-hack.devpost.com'), or parameterized title (e.g. 'my-cool-hack'). Matching is case-insensitive."
        }
      }
    }
    arguments 16 lines
  • get_prizes unknown never probed

    Returns the prize tiers (name, type, amount, winner count, description) and the total prize pool for a hackathon. Call this before answering questions about what participants can win or prize amounts.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hackathon_subdomain"
      ],
      "properties": {
        "hackathon": {
          "type": "string",
          "description": "Deprecated alias for `hackathon_subdomain` — still accepted for backward compatibility. Prefer `hackathon_subdomain`."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "Hackathon URL, slug (e.g. 'my-hack'), prettyparam slug (e.g. '123-my-hack'), numeric ID, exact title (e.g. 'My Cool Hack'), full domain with or without https:// (e.g. 'my-hack.devpost.com'), or parameterized title (e.g. 'my-cool-hack'). Matching is case-insensitive."
        }
      }
    }
    arguments 16 lines
  • get_judging_criteria unknown never probed

    Returns the judging criteria (name, description, position), the scale each criterion is scored on (judging_scale: the highest score a judge can give), and any judging tracks or categories that submissions are sorted into. Call this before answering questions about how submissions are evaluated or which track a project should target.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hackathon_subdomain"
      ],
      "properties": {
        "hackathon": {
          "type": "string",
          "description": "Deprecated alias for `hackathon_subdomain` — still accepted for backward compatibility. Prefer `hackathon_subdomain`."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "Hackathon URL, slug (e.g. 'my-hack'), prettyparam slug (e.g. '123-my-hack'), numeric ID, exact title (e.g. 'My Cool Hack'), full domain with or without https:// (e.g. 'my-hack.devpost.com'), or parameterized title (e.g. 'my-cool-hack'). Matching is case-insensitive."
        }
      }
    }
    arguments 16 lines
  • get_submission_requirements unknown never probed

    Returns the host's prose description of what to submit, the custom questions participants must answer when submitting (id, label, type, required flag, options for dropdowns, allowed_extensions/max_size_bytes for file uploads), and the global deliverable rules (video, website, zip file, kind of submission object). Call this before answering questions about what a participant needs to submit. Each field's `id` is what you pass as `submission_field_id` in submit_project's `custom_answers`. Questions with type "file" are the exception: answer them by uploading through prepare_file_upload, which attaches the file to the submission directly — do NOT include file-upload questions in submit_project's `custom_answers`.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hackathon_subdomain"
      ],
      "properties": {
        "hackathon": {
          "type": "string",
          "description": "Deprecated alias for `hackathon_subdomain` — still accepted for backward compatibility. Prefer `hackathon_subdomain`."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "Hackathon URL, slug (e.g. 'my-hack'), prettyparam slug (e.g. '123-my-hack'), numeric ID, exact title (e.g. 'My Cool Hack'), full domain with or without https:// (e.g. 'my-hack.devpost.com'), or parameterized title (e.g. 'my-cool-hack'). Matching is case-insensitive."
        }
      }
    }
    arguments 16 lines
  • get_hackathon_rules unknown never probed

    Returns the formal rules (terms_and_conditions), how-to-enter instructions, additional user instructions, and a 'who can participate' eligibility block (age, geography, occupation, team, company). Call this before answering questions about eligibility, IP, what's allowed, or how to register. Quote rule and eligibility text verbatim — don't paraphrase.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hackathon_subdomain"
      ],
      "properties": {
        "hackathon": {
          "type": "string",
          "description": "Deprecated alias for `hackathon_subdomain` — still accepted for backward compatibility. Prefer `hackathon_subdomain`."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "Hackathon URL, slug (e.g. 'my-hack'), prettyparam slug (e.g. '123-my-hack'), numeric ID, exact title (e.g. 'My Cool Hack'), full domain with or without https:// (e.g. 'my-hack.devpost.com'), or parameterized title (e.g. 'my-cool-hack'). Matching is case-insensitive."
        }
      }
    }
    arguments 16 lines
  • get_announcements unknown never probed

    Returns the most recent host announcements/updates for a hackathon (title, body, sent timestamp), ordered newest-first. Call this before answering questions about rule changes, deadline shifts, or anything 'recent' — and to surface what's new.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hackathon_subdomain"
      ],
      "properties": {
        "limit": {
          "type": "integer",
          "default": 10,
          "maximum": 50,
          "minimum": 1,
          "description": "Maximum number of announcements to return (default 10, max 50)"
        },
        "hackathon": {
          "type": "string",
          "description": "Deprecated alias for `hackathon_subdomain` — still accepted for backward compatibility. Prefer `hackathon_subdomain`."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "Hackathon URL, slug (e.g. 'my-hack'), prettyparam slug (e.g. '123-my-hack'), numeric ID, exact title (e.g. 'My Cool Hack'), full domain with or without https:// (e.g. 'my-hack.devpost.com'), or parameterized title (e.g. 'my-cool-hack'). Matching is case-insensitive."
        }
      }
    }
    arguments 23 lines
  • show_hackathon_stepper unknown never probed

    Render the hackathon-journey stepper inline, highlighting the stage the user is on (register -> review -> resources -> prepare -> submit). Call it at the start of each stage with the matching active_step so the user can see where they are. On the 'resources' step, pass build_assistant: true to also show the optional guided build tool, with build_step for its current stage. Orientation only — it changes nothing on the server.

    mcp-tool

    {
      "type": "object",
      "required": [
        "active_step"
      ],
      "properties": {
        "build_step": {
          "enum": [
            "scope",
            "prd",
            "spec",
            "checklist",
            "build"
          ],
          "type": "string",
          "description": "When build_assistant is true, the active guided-build-tool stage. One of: scope, prd, spec, checklist, build."
        },
        "active_step": {
          "enum": [
            "register",
            "review",
            "resources",
            "prepare",
            "submit"
          ],
          "type": "string",
          "description": "The stage the user is currently on. One of: register, review, resources, prepare, submit."
        },
        "build_assistant": {
          "type": "boolean",
          "description": "Only meaningful on the 'resources' step: show the optional guided build tool (Scope -> PRD -> Spec -> Checklist -> Build)."
        }
      }
    }
    arguments 34 lines
  • list_my_projects unknown never probed

    Returns up to 24 of the authenticated user's projects (authored or team-member), filtered to non-spam and non-moderated. In-progress projects (submitted to a hackathon whose winners aren't announced yet) are listed first, followed by the most recently created remaining projects. Each project includes its membership type and the hackathons it has been submitted to (name, slug, public URL).

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {}
    }
    arguments 5 lines
  • list_hackathons unknown never probed

    Returns the hackathons the authenticated user is connected to — registered for and/or submitted a project to. Each includes its name, slug, public URL, status (submissions_open / judging / closed / upcoming), and the user's relationship(s): registered, submitted.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {}
    }
    arguments 5 lines
  • search_hackathons unknown never probed

    Search the Devpost hackathon catalog. Optional 'query' does a full-text keyword search across title, description, summary, domain, and location (title weighted highest). Supports sorting by relevance ('relevance', default when a query is given), newest ('new'), nearest submission deadline ('ending_soon'), or largest prize pool ('top_prizes'), plus an optional filter for hackathons managed by Devpost. Each result includes title, subdomain, url, start_date and end_date (UTC ISO 8601), prize_pool_usd (integer), and managed_by_devpost (boolean). Paginated (default 5, max 25 per page); response carries query, count, total, total_pages, page, limit, sort. Rate limited to 10 calls per 60 seconds per user.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {
        "page": {
          "type": "integer",
          "minimum": 1,
          "description": "1-based page number. Default 1."
        },
        "sort": {
          "enum": [
            "new",
            "ending_soon",
            "top_prizes",
            "relevance"
          ],
          "type": "string",
          "description": "Ordering axis. 'new' = recently published first, 'ending_soon' = open submissions closest to deadline, 'top_prizes' = highest USD prize pool first, 'relevance' = best keyword match first (requires query). Default 'relevance' when a query is given, else 'new'."
        },
        "limit": {
          "type": "integer",
          "maximum": 25,
          "minimum": 1,
          "description": "Results per page. Default 5, max 25."
        },
        "query": {
          "type": "string",
          "description": "Optional full-text keyword search. Matches the hackathon title, description, summary, domain, and location (title matches rank highest). When provided and no sort is given, results are ranked by relevance."
        },
        "managed_by_devpost": {
          "type": "boolean",
          "description": "When true, only hackathons managed by Devpost. When false, only hackathons not managed by Devpost. When omitted, no filter is applied."
        }
      }
    }
    arguments 35 lines
  • list_open_hackathons unknown never probed

    Returns a cached list of open or upcoming hackathons managed by Devpost (up to 15), newest first. Takes no arguments. Each entry includes title, url, start_date and end_date (UTC ISO 8601), prize_pool_usd (integer), a plain-text description, and themes (array of strings). Intended to be fetched once and matched to the user locally. Response carries hackathons, count, and generated_at. The underlying list is refreshed periodically, so it may lag live catalog changes by a few hours.

    mcp-tool

    {
      "type": "object",
      "required": [],
      "properties": {}
    }
    arguments 5 lines
  • get_project unknown never probed

    Returns the details of one of the authenticated user's projects: the name, tagline, writeup, video URL, current state, public URL, and the hackathons it has been entered into. Reads the live, editable project (not a frozen submission snapshot). Only the author or a team member can fetch it. Does not expose judging scores or feedback.

    mcp-tool

    {
      "type": "object",
      "required": [
        "project_slug"
      ],
      "properties": {
        "project_id": {
          "type": "string",
          "description": "Deprecated alias for `project_slug` — still accepted for backward compatibility. Prefer `project_slug`."
        },
        "project_slug": {
          "type": "string",
          "description": "The project's slug or numeric id (from create_project or list_my_projects). Required."
        }
      }
    }
    arguments 16 lines
  • get_registration_form unknown never probed

    Fetch the registration form spec for a hackathon. Always call this BEFORE register_for_hackathon to discover exactly what to collect from the user. The returned payload tells you: - challenge: basic identity of the hackathon - can_register / already_registered / blocked_reason: whether the user can register at all (stop here if not) - profile.missing_name_fields: name fields the account is missing. A first and last name are required to register — ask the user for each listed field and pass it to register_for_hackathon (never invent one). Empty array means nothing to collect - team_preference_options: required — ask the user to pick exactly one - custom_questions: hackathon-specific questions; ask every one with required=true, and offer optional ones - eligibility.description: when requires_agreement=true, show this text verbatim to the user and obtain explicit agreement - agreements.rules_url & terms_url: show both links to the user and obtain explicit agreement before submitting - survey: the optional 'Who told you about this hackathon?' question; you may ask it, but never invent answers — leave it blank if the user doesn't supply one Do NOT pass agree_to_rules / agree_to_eligibility as true to register_for_hackathon without explicit user confirmation.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hackathon_subdomain"
      ],
      "properties": {
        "challenge_slug": {
          "type": "string",
          "description": "Deprecated alias for `hackathon_subdomain` — still accepted for backward compatibility. Prefer `hackathon_subdomain`."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "The hackathon's subdomain (e.g. 'world-hackathon'). Returned as :slug by list_hackathons and parseable from the :url of search_hackathons."
        }
      }
    }
    arguments 16 lines
  • register_for_hackathon unknown never probed

    Register the authenticated user for a hackathon. Submits the same form the web flow uses, with identical validations and the same Rabbitmq event on success. MANDATORY workflow: 1. Call get_registration_form first. Do NOT call this tool until you have its response. 2. If can_register is false, stop and report blocked_reason — do not call this tool. 3. If profile.missing_name_fields is non-empty, ask the user for each listed name and pass it as first_name / last_name — a first and last name are required to register. Never invent a name. 4. Ask the user to pick intending_to_team_up from team_preference_options. 5. Only if intending_to_team_up == 'Looking for teammates', offer to collect a short description (max 255 chars). 6. For each entry in custom_questions, ask the user. Every question with required=true MUST have an answer in custom_answers. For multi-select dropdowns, pass an array of strings. 7. Show the user agreements.rules_url AND agreements.terms_url, then ask for explicit confirmation. Only then set agree_to_rules=true. 8. If eligibility.requires_agreement is true, show eligibility.description verbatim, then ask for explicit confirmation. Only then set agree_to_eligibility=true. 9. Optionally offer the survey ('Who told you about this hackathon?'). If the user answers, pass source (and source_medium if the chosen source allows mediums, and source_specifics if source='Other'). If they skip, omit all three. 10. Submit. On success you get registration_id; on validation failure you get an InvalidParams error with the underlying message — relay it. NEVER set agree_to_rules or agree_to_eligibility to true without explicit confirmation from the user in this conversation.

    mcp-tool

    {
      "type": "object",
      "required": [
        "hackathon_subdomain",
        "intending_to_team_up",
        "agree_to_rules"
      ],
      "properties": {
        "source": {
          "enum": [
            "Devpost",
            "The organizer",
            "Friend",
            "My college",
            "Other"
          ],
          "type": "string",
          "description": "Optional survey answer to 'Who told you about this hackathon?'. Only set if the user actually answered. One of: Devpost, The organizer, Friend, My college, Other."
        },
        "last_name": {
          "type": "string",
          "maxLength": 40,
          "description": "The user's last name. Same rules as first_name: only needed when listed in profile.missing_name_fields, must come from the user, and is ignored when the profile already has one."
        },
        "first_name": {
          "type": "string",
          "maxLength": 40,
          "description": "The user's first name. Only needed when get_registration_form lists it in profile.missing_name_fields — a first and last name are required to register, and some accounts (e.g. GitHub sign-ups) are missing one. Ask the user; never guess or invent a name. Ignored when the profile already has a first name — this tool never overwrites an existing name."
        },
        "description": {
          "type": "string",
          "description": "Optional short bio shown on the participant profile."
        },
        "source_medium": {
          "enum": [
            "Newsletter",
            "Twitter",
            "Facebook",
            "Email",
            "Website",
            "Devpost.com",
            "Club or class",
            "Other email"
          ],
          "type": "string",
          "description": "Optional follow-up to source. Only allowed values are the ones listed under survey.source_medium.options_by_source[chosen_source] in get_registration_form. Omit when source is 'Friend' or 'Other'."
        },
        "agree_to_rules": {
          "type": "boolean",
          "description": "User must explicitly set this to true to confirm they have read and agreed to the hackathon's official rules and the platform's terms of service."
        },
        "challenge_slug": {
          "type": "string",
          "description": "Deprecated alias for `hackathon_subdomain` — still accepted for backward compatibility. Prefer `hackathon_subdomain`."
        },
        "custom_answers": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "registration_field_id",
              "value"
            ],
            "properties": {
              "value": {
                "oneOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                ]
              },
              "registration_field_id": {
                "type": "integer"
              }
            }
          },
          "description": "Answers to the hackathon's custom registration questions. Each entry maps a registration_field_id (from get_registration_form) to the user's value: a string for text and single-select dropdown fields, a boolean for a checkbox question (type == 'checkbox') — true/false, or the strings \"1\"/\"0\"/\"true\"/\"false\" — or an array of strings for a multi-select dropdown."
        },
        "opt_in_marketing": {
          "type": "boolean",
          "description": "Optional. Whether the user opts in to marketing emails."
        },
        "source_specifics": {
          "type": "string",
          "description": "Optional free text (max 255 chars). Only meaningful when source = 'Other'. Captures how the user heard about the hackathon."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "The hackathon's subdomain (e.g. 'world-hackathon')."
        },
        "agree_to_eligibility": {
          "type": "boolean",
          "description": "Required when the hackathon has eligibility constraints (see get_registration_form). Must be true to confirm the user meets and agrees to them."
        },
        "intending_to_team_up": {
          "enum": [
            "Working solo",
            "Looking for teammates",
            "Already have a team"
          ],
          "type": "string",
          "description": "Team preference. One of 'Working solo', 'Looking for teammates', 'Already have a team'."
        }
      }
    }
    arguments 114 lines
  • create_project unknown never probed

    Create a new project (a Devpost project — internally a Software record) owned by the authenticated user, FOR a specific hackathon. The `hackathon_subdomain` is required: creating the project also starts a draft submission to that hackathon right away, so you can answer its file-upload questions by uploading directly to the draft (prepare_file_upload). You must already be registered for the hackathon (use register_for_hackathon) and it must be open for submissions. The project can still be entered into other hackathons later via submit_project — though a later hackathon's file-upload questions must be answered on the web, since only the hackathon given here gets a draft submission for uploads to attach to. Only `name` (plus `hackathon_subdomain`) is required to create the project, but a *submittable* project also needs `tagline`, `description`, and `built_with`. Provide them here when you have them, or add them later with update_project (submit_project will tell you exactly what's still missing). Not supported over MCP yet: photo/thumbnail uploads and team-member invites — do those on the web. The creator is automatically the sole team member. Returns the new project's id, slug, and public URL, plus the draft submission's id and status.

    mcp-tool

    {
      "type": "object",
      "required": [
        "name",
        "hackathon_subdomain"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "Project title. Required. Max 60 characters."
        },
        "links": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "url"
            ],
            "properties": {
              "url": {
                "type": "string"
              }
            }
          },
          "description": "Optional project links (homepage, repo, etc.)."
        },
        "tagline": {
          "type": "string",
          "description": "One-line elevator pitch. Max 200 characters. Optional at creation, but required before the project can be submitted to a hackathon."
        },
        "video_url": {
          "type": "string",
          "description": "Optional demo video URL (YouTube or Vimeo). The project is created FOR a hackathon, so that hackathon's demo video rules apply now: it may accept only one of the two platforms and requires the video to be publicly playable."
        },
        "built_with": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "The technologies/tools used ('Built with'), e.g. ['ruby', 'rails', 'openai']. Optional at creation, but required at submission. A comma-separated string is also accepted. Max 25 tags."
        },
        "description": {
          "type": "string",
          "description": "Full project description (markdown supported). Max 50000 characters. Optional at creation, but required at submission."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "The hackathon's subdomain/slug this project is being created for. Required — the project is created together with a draft submission to this hackathon. You must already be registered for it and it must be open for submissions."
        }
      }
    }
    arguments 51 lines
  • update_project unknown never probed

    Edit an existing project the authenticated user owns or is a team member of. Only the fields you pass are changed; everything else is left as-is. Edits automatically propagate to the project's submissions in every hackathon it has been entered into. Note: saving an existing project enforces the full completeness rules (name, tagline, description, and built_with must all be present), so include any that aren't set yet. `links` and `built_with` REPLACE the current values. Photos and team changes aren't supported over MCP. To change the thumbnail, use the prepare_thumbnail_upload and upload_project_thumbnail tools. Returns the project's id, slug, URL, and new version.

    mcp-tool

    {
      "type": "object",
      "required": [
        "project_slug"
      ],
      "properties": {
        "name": {
          "type": "string",
          "description": "New project title. Max 60 characters."
        },
        "links": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "url"
            ],
            "properties": {
              "url": {
                "type": "string"
              }
            }
          },
          "description": "Replaces the project's links entirely (pass [] to clear them)."
        },
        "project": {
          "type": "string",
          "description": "Deprecated alias for `project_slug` — still accepted for backward compatibility. Prefer `project_slug`."
        },
        "tagline": {
          "type": "string",
          "description": "New one-line pitch. Max 200 characters."
        },
        "version": {
          "type": "integer",
          "description": "Optional. The version you last saw (from a prior read). If supplied and the project has since changed, the update is rejected as a conflict. Omit to apply unconditionally."
        },
        "video_url": {
          "type": "string",
          "description": "New demo video URL (YouTube or Vimeo) for the project. Entries already in a hackathon keep the video they were entered with; use submit_project to change one of those."
        },
        "built_with": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "Replaces the 'Built with' technologies. A comma-separated string is also accepted. Max 25 tags."
        },
        "description": {
          "type": "string",
          "description": "New full description (markdown). Max 50000 characters."
        },
        "project_slug": {
          "type": "string",
          "description": "The project's slug or numeric id (from create_project or list_my_projects). Required."
        }
      }
    }
    arguments 58 lines
  • upload_project_thumbnail unknown never probed

    Set the thumbnail image on an existing project the caller owns or is a team member of. Send the image as a base64-encoded string (no `data:` URI prefix). Accepts JPEG, PNG, and GIF up to 5 MB; the new image replaces any previous thumbnail. Returns the project id/slug/URL, the final `thumbnail_url` (404s while `processing` is true, goes live once the background resize finishes, typically within seconds), and the project's version. A non-error response means the upload succeeded — do NOT retry it. Best for small images only: target ≤ 50 KB encoded (e.g. a 300×300 JPEG at quality 60). Pre-shrink the image in one step before calling — DO NOT iterate. For larger or higher-quality images, use `prepare_thumbnail_upload` instead, which returns a curl/PowerShell command that streams the file from disk without putting the bytes through the LLM context at all.

    mcp-tool

    {
      "type": "object",
      "required": [
        "project_slug",
        "image_base64",
        "content_type"
      ],
      "properties": {
        "project": {
          "type": "string",
          "description": "Deprecated alias for `project_slug` — still accepted for backward compatibility. Prefer `project_slug`."
        },
        "filename": {
          "type": "string",
          "description": "Optional. The original filename including extension (e.g. \"cover.png\"). Used as attachment metadata; a generic name is generated from content_type if omitted."
        },
        "content_type": {
          "enum": [
            "image/jpeg",
            "image/jpg",
            "image/pjpeg",
            "image/png",
            "image/x-png",
            "image/gif"
          ],
          "type": "string",
          "description": "The image MIME type. One of: image/jpeg, image/jpg, image/pjpeg, image/png, image/x-png, image/gif. Required."
        },
        "image_base64": {
          "type": "string",
          "description": "The image bytes, base64-encoded. Do NOT include a `data:image/...;base64,` URI prefix — pass just the encoded bytes. Max 5 MB decoded. Python: `base64.b64encode(open(path, 'rb').read()).decode()`. Node: `fs.readFileSync(path).toString('base64')`. Required."
        },
        "project_slug": {
          "type": "string",
          "description": "The project's slug or numeric id (from create_project or list_my_projects). Required."
        }
      }
    }
    arguments 38 lines
  • prepare_thumbnail_upload unknown never probed

    Start an out-of-band thumbnail upload that streams the image from disk to Devpost without putting the bytes through the LLM context. Returns an upload URL, a 10-minute TTL, and the OS-specific command(s) you should run. Use this instead of upload_project_thumbnail whenever the image is larger than ~50 KB encoded (i.e. anything that's not a small LLM-generated thumbnail). After the upload command returns 200, parse the JSON response body for the new thumbnail URL — do NOT read the image file into the conversation. Accepts JPEG, PNG, GIF up to 5 MB.

    mcp-tool

    {
      "type": "object",
      "required": [
        "project_slug",
        "content_type"
      ],
      "properties": {
        "project": {
          "type": "string",
          "description": "Deprecated alias for `project_slug` — still accepted for backward compatibility. Prefer `project_slug`."
        },
        "content_type": {
          "enum": [
            "image/jpeg",
            "image/jpg",
            "image/pjpeg",
            "image/png",
            "image/x-png",
            "image/gif"
          ],
          "type": "string",
          "description": "The image MIME type you'll upload. One of: image/jpeg, image/jpg, image/pjpeg, image/png, image/x-png, image/gif. Required so we can bake the correct Content-Type into the returned curl command."
        },
        "project_slug": {
          "type": "string",
          "description": "The project's slug or numeric id (from create_project or list_my_projects). Required."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "Optional. The hackathon's subdomain/slug this thumbnail is for. Pass it when the project is being prepared for a hackathon submission: the submission's thumbnail is then updated immediately, instead of within a few minutes. Omitting it only makes the submission update later — the project's thumbnail is updated either way."
        }
      }
    }
    arguments 33 lines
  • prepare_file_upload unknown never probed

    Start an out-of-band file upload to answer a hackathon's file-upload submission question, streaming the file from disk to Devpost without putting the bytes through the LLM context. If the project has no entry in this hackathon yet, one is started for you as a draft — you must be registered and the hackathon must be open for submissions. Call get_submission_requirements first: file questions have type "file" plus the allowed_extensions and max_size_bytes this upload must respect. One call per file (a question accepting several files needs several prepare/upload rounds, up to 10 files per question and 15 across the whole submission). Returns an upload URL, a 10-minute TTL, and the OS-specific command(s) to run. When the upload command returns HTTP 200 the file is ALREADY attached to the submission — that IS the answer to this question. Do NOT read the file into the conversation and do NOT pass anything for this question to submit_project. Each command runs exactly once: re-running it is refused, so if you don't see a 200, check the question's answer with get_submission_requirements before preparing a new upload.

    mcp-tool

    {
      "type": "object",
      "required": [
        "project_slug",
        "hackathon_subdomain",
        "submission_field_id",
        "filename",
        "content_type"
      ],
      "properties": {
        "filename": {
          "type": "string",
          "description": "The file's name including extension (e.g. \"pitch-deck.pdf\"). The extension must be one of the question's allowed_extensions. Required."
        },
        "content_type": {
          "type": "string",
          "description": "The file's MIME type. Must match the filename's extension (e.g. application/pdf for .pdf). Required."
        },
        "project_slug": {
          "type": "string",
          "description": "The project's slug or numeric id (from create_project or list_my_projects). Required."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "The hackathon's subdomain/slug whose submission question the file answers. Required."
        },
        "submission_field_id": {
          "type": "integer",
          "description": "The id of the file-upload question (a field with type == \"file\" from get_submission_requirements). Required."
        }
      }
    }
    arguments 32 lines
  • prepare_gallery_image_upload unknown never probed

    Start an out-of-band upload of an image to a project's media gallery (the ordered screenshots on the project page), streaming the image from disk to Devpost without putting the bytes through the LLM context. Returns an upload URL, a 10-minute TTL, and the OS-specific command(s) to run. One call per image (a gallery holds up to 15 images; each upload appends). Pass an optional caption. After the upload command returns 200, parse the JSON response body for `photo_id`, `gallery_image_url`, and `position` — do NOT read the image file into the conversation. Accepts JPEG, PNG, GIF up to 5 MB.

    mcp-tool

    {
      "type": "object",
      "required": [
        "project_slug",
        "content_type"
      ],
      "properties": {
        "caption": {
          "type": "string",
          "description": "Optional caption for the image, shown beneath it in the gallery. Up to 140 characters."
        },
        "content_type": {
          "enum": [
            "image/jpeg",
            "image/jpg",
            "image/pjpeg",
            "image/png",
            "image/x-png",
            "image/gif"
          ],
          "type": "string",
          "description": "The image MIME type you'll upload. One of: image/jpeg, image/jpg, image/pjpeg, image/png, image/x-png, image/gif. Required so we can bake the correct Content-Type into the returned curl command."
        },
        "project_slug": {
          "type": "string",
          "description": "The project's slug or numeric id (from create_project or list_my_projects). Required."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "Optional. The hackathon's subdomain/slug this image is for. Pass it when the project is being prepared for a hackathon submission: the image is then added to that submission's gallery immediately, instead of within a few minutes. Omitting it only makes the submission gallery update later — the project gallery is updated either way."
        }
      }
    }
    arguments 33 lines
  • submit_project unknown never probed

    Submit one of the authenticated user's projects to a hackathon (or re-submit to update an existing entry). The same project can be submitted to multiple hackathons. MANDATORY workflow: 1. Call get_submission_requirements for the hackathon to learn the custom questions and the deliverable rules (video/website/zip required). 2. Make sure the project itself is complete — name, tagline, description, built_with, and any required video/website. Use update_project to fill gaps. 3. Collect answers to every required custom question into custom_answers. Do NOT include file-upload questions (type == 'file') here — upload each file with prepare_file_upload, which attaches it directly to the submission; an already-uploaded file is the answer. When updating an existing entry, answers already saved on it count — only send what you're adding or changing. 4. Submit. If the project doesn't meet the requirements this tool will NOT submit — it returns an error itemizing exactly what's missing. Fix it and retry. The user must already be registered for the hackathon (use register_for_hackathon) and the hackathon must be open for submissions. Returns the submission id, status ("Draft" or "Submitted"), and URL.

    mcp-tool

    {
      "type": "object",
      "required": [
        "project_slug",
        "hackathon_subdomain"
      ],
      "properties": {
        "project": {
          "type": "string",
          "description": "Deprecated alias for `project_slug` — still accepted for backward compatibility. Prefer `project_slug`."
        },
        "video_url": {
          "type": "string",
          "description": "Demo video URL (YouTube/Vimeo) for this entry, which is the entry's alone — it does not change the project or any other hackathon it is entered in. Pass an empty string to remove the video from the entry; omit the field entirely to leave the stored video alone, and an entry with no video of its own takes the project's. Some hackathons accept only one of the two platforms, require the video to be publicly playable, and review only its first few minutes — get_submission_requirements reports what this one asks for."
        },
        "project_slug": {
          "type": "string",
          "description": "The project's slug or numeric id (from create_project or list_my_projects). Required."
        },
        "challenge_slug": {
          "type": "string",
          "description": "Deprecated alias for `hackathon_subdomain` — still accepted for backward compatibility. Prefer `hackathon_subdomain`."
        },
        "custom_answers": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "submission_field_id",
              "value"
            ],
            "properties": {
              "value": {
                "oneOf": [
                  {
                    "type": "string"
                  },
                  {
                    "type": "boolean"
                  },
                  {
                    "type": "array",
                    "items": {
                      "type": "string"
                    }
                  }
                ]
              },
              "submission_field_id": {
                "type": "integer"
              }
            }
          },
          "description": "Answers to the hackathon's custom submission questions (from get_submission_requirements). Every question with required=true must have an answer here — EXCEPT file-upload questions (type == 'file'), which are answered by uploading through prepare_file_upload (the file attaches directly) and must NOT appear here. Each entry carries a `value`: a string for text and single-select dropdown fields, a boolean for a checkbox question (type == 'checkbox') — true/false, or the strings \"1\"/\"0\"/\"true\"/\"false\" — or an array of strings for a multi-select dropdown."
        },
        "opt_in_prize_ids": {
          "type": "array",
          "items": {
            "type": "integer"
          },
          "description": "Optional. IDs of opt-in prizes/tracks to enter."
        },
        "hackathon_subdomain": {
          "type": "string",
          "description": "The hackathon's subdomain/slug to submit to. Required."
        }
      }
    }
    arguments 68 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 81d44e7683b0b45c.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/81d44e7683b0b45c/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/81d44e7683b0b45c/badge.svg)](https://brick.blue/agent/81d44e7683b0b45c?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.