Unstop MCP Server
Enables users to discover and search for Unstop hackathons through features like filtering, location-based discovery, and detailed event enrichment. It provides MCP tools and prompts that allow LLMs to compare events, plan searches, and access cached data for fast lookups.
README
Unstop MCP Server
unstop-mcp is a Python Model Context Protocol (MCP) server for discovering Unstop hackathons.
It exposes:
- MCP tools for searching hackathons, fetching event details, running location-based discovery, and managing cache state
- MCP resources for read-only snapshots and per-hackathon lookups
- MCP prompts that help an LLM plan searches, compare hackathons, and recommend relevant events
This repository is now MCP-first. The old direct-import Python wrapper API is not the supported public interface anymore.
What It Supports
stdiotransport only- Unstop hackathons only in v1
- Automatic caching of open hackathons for fast repeated lookups
- Detail enrichment for descriptions, rounds, contacts, registration counts, and views
- Optional location-based search using geocoding
- Deterministic unit tests with mocked upstream behavior
- Optional live smoke tests kept separate from the default suite
Requirements
- Python 3.12+
uvrecommended for local development- Network access for real Unstop calls
Installation
Option 1: uv workflow
git clone https://github.com/your-org/unstop-mcp.git
cd unstop-mcp
uv venv
source .venv/bin/activate
uv pip install -e .
Option 2: plain pip
git clone https://github.com/your-org/unstop-mcp.git
cd unstop-mcp
python3 -m venv .venv
source .venv/bin/activate
python -m pip install --upgrade pip
python -m pip install -e .
Verify the install
unstop-mcp --help
You should see the stdio transport option.
Running The Server
Run the server locally over stdio:
unstop-mcp
Equivalent module form:
python -m unstop_mcp
The server intentionally supports only:
unstop-mcp --transport stdio
MCP Surface
Tools
search_hackathons
Search Unstop hackathons with filters, sorting, pagination, and optional cache usage.
Arguments:
oppstatus:open | recent | expired | closedregion:online | offlinepayment:paid | unpaidteamsize:1 | 2 | 3usertype:college_students | fresher | professionals | school_studentssort:prize | days_leftdirection:asc | descsearch: free-text keyword searchpage:>= 1per_page:1-100use_cache:true | false
Returns a structured object with:
items: normalized hackathon summariespagination: total/current page/last page/per-page/has-morecache: cache freshness metadataapplied_filters: the validated input used for the call
get_hackathon_details
Fetch full details for a single hackathon by numeric ID.
Arguments:
hackathon_id
Returns:
item: normalized detail viewcache: metadata describing current server cache state
search_hackathons_by_location
Find offline hackathons near a location using geocoding and radius filtering.
Arguments:
locationradius_kmregionpaymentteamsizeusertypesearchsort:prize | days_left | distancedirectionpageper_page
Returns the same normalized structure as search_hackathons, plus:
location.search_locationlocation.search_radius_kmlocation.search_coordinates
refresh_cache
Force a rebuild of the cached open-hackathon dataset.
Returns:
cache
get_cache_info
Inspect cache state without rebuilding the full dataset.
Returns:
cache
Resources
unstop://cache/info
Read-only JSON view of cache freshness, TTL, and item counts.
unstop://hackathons/open
Read-only JSON snapshot of all cached open hackathons.
unstop://hackathons/{hackathon_id}
Read-only JSON detail view for a specific hackathon. The server serves cached data when possible and falls back to a direct detail fetch when needed.
Prompts
find_relevant_hackathons
Guides an LLM to gather missing user preferences, call the right search tool, and summarize the best matches.
Arguments:
user_goal
compare_hackathons
Guides an LLM to fetch multiple hackathons and compare them.
Arguments:
hackathon_ids
plan_hackathon_search
Guides an LLM on which tools and resources to call, in what order, for a discovery task.
Arguments:
user_request
Output Shape
Tool and resource results are normalized into stable JSON-friendly fields rather than returning raw upstream Unstop payloads as the primary contract.
Each hackathon item includes:
idtitlestatusregionis_paidpublic_urldescriptionprize_amountprize_summaryfiltersrequired_skillsorganisationaddressregistrationroundscontactsdistance_kmwhen applicable
This keeps the MCP contract predictable even if upstream response shapes vary.
Client Setup
Generic MCP client
Point your MCP client at this command:
unstop-mcp
If your client needs an absolute command path, use the one from your environment, for example:
/absolute/path/to/.venv/bin/unstop-mcp
Claude Desktop
Example claude_desktop_config.json entry:
{
"mcpServers": {
"unstop": {
"command": "/absolute/path/to/.venv/bin/unstop-mcp",
"args": []
}
}
}
Codex
Configure a local MCP server entry that launches:
{
"command": "/absolute/path/to/.venv/bin/unstop-mcp",
"args": []
}
If your Codex setup manages MCP servers through a separate config file or UI, use the same command and no extra arguments.
Development
Project layout
src/unstop_mcp/server.py: FastMCP server definition and MCP registrationsrc/unstop_mcp/service.py: Unstop fetching, caching, normalization, and geocoding logicsrc/unstop_mcp/schemas.py: validated inputs and normalized output modelssrc/unstop_mcp/config.py: environment-driven runtime configurationtests/: unit, MCP registration, stdio smoke, and optional live tests
Environment variables
These are optional:
UNSTOP_MCP_TIMEOUTUNSTOP_MCP_MAX_RETRIESUNSTOP_MCP_RETRY_DELAYUNSTOP_MCP_CACHE_TTL_SECONDSUNSTOP_MCP_DETAIL_WORKERSUNSTOP_MCP_DETAIL_DELAYUNSTOP_MCP_GEOCACHE_PATHUNSTOP_MCP_USER_AGENT
How caching works
- Searches for open hackathons can use an in-memory snapshot instead of hitting Unstop on every call
- The snapshot is rebuilt automatically when stale
refresh_cacheforces an immediate rebuild- The geocode cache is persisted to disk so repeated location lookups do not re-query the geocoder unnecessarily
Geocoding behavior
- Location search depends on
geopy - Offline hackathons with explicit coordinates are used directly
- When coordinates are missing, the server tries multiple address variants and caches the result
- Online-only hackathons are excluded from radius searches unless the query explicitly requests
region="online"
Testing
Run the default test suite:
python -m pytest -q
What the default suite covers:
- validation and parsing
- normalized search responses
- cache metadata and staleness behavior
- location filtering
- MCP tool/resource/prompt registration
- basic end-to-end
stdiostartup and tool listing
Optional live smoke tests
These are excluded by default:
UNSTOP_MCP_RUN_LIVE_TESTS=1 python -m pytest -q -m live
Use live tests only when you want to verify the current Unstop integration against the real network.
Local Validation
Useful local checks:
python -m pytest -q
python -m unstop_mcp --help
If you already use an MCP Inspector, point it at the local unstop-mcp command and stdio transport to inspect registered tools, resources, and prompts interactively.
Error Handling
The server validates inputs before making upstream calls.
Common failure cases:
- invalid enum values such as unsupported
oppstatusorsort - empty or unresolvable location input
- transient or permanent upstream Unstop failures
- missing geocoding support for location search
When possible, tool failures are surfaced as clear MCP-facing validation or request errors.
Limitations
stdioonly in v1- hackathons only in v1
- upstream Unstop fields and availability can change
- location accuracy depends on source address quality and geocoding quality
- cache refresh can take longer than simple detail fetches because it enriches open hackathons in bulk
Extending The Server
If you want to add more Unstop opportunity types later, keep this split:
- add new upstream fetch/parse logic in
service.py - define new validated contracts in
schemas.py - register new MCP surfaces in
server.py
That keeps transport concerns separate from domain logic.
License
MIT
推荐服务器
Baidu Map
百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。
Playwright MCP Server
一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。
Magic Component Platform (MCP)
一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。
Audiense Insights MCP Server
通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。
VeyraX
一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。
graphlit-mcp-server
模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。
Kagi MCP Server
一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。
e2b-mcp-server
使用 MCP 通过 e2b 运行代码。
Neon MCP Server
用于与 Neon 管理 API 和数据库交互的 MCP 服务器
Exa MCP Server
模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。