An MCP server that helps an agentic loop (Claude) research PhD opportunities. Given a field of study, it mines accepted oral/spotlight papers at top ML/AI conferences, identifies the supervising professors (usually the last author), enriches them with h-index + citation counts, and exports a CSV for the user to filter and sort themselves.
The server does the deterministic data work (conference papers → authors → citation metrics → CSV). The agent does the judgment — deciding which co-author is the professor, disambiguating citation profiles, and finding professor websites — using its own built-in web search, guided by the included prompt and resources.
field of study
│ find_conference_venues (registry: NeurIPS, ICLR, ICML, CVPR, AAAI)
▼
accepted papers search_accepted_papers (OpenReview API, oral/spotlight only,
│ capped by max_papers per conference)
▼
authors get_paper_authors (last author flagged as likely PI)
│
▼
citation metrics get_author_metrics (OpenAlex → Semantic Scholar fallback)
│
▼ + agent web search for the professor's website
records add_professor_record … export_csv
list_supported_conferences— conferences + coverage notes.find_conference_venues(field, conferences?, years?)— field → conferences/years.search_accepted_papers(conference, year, decision_types?, field_keywords?, max_papers?, cursor?)— accepted papers, oral/spotlight by default, capped per conference.get_paper_authors(conference, year, paper_id)— authors, last author flagged.get_author_metrics(name, institution?, provider?)— h-index, citations, works.add_professor_record/list_professor_records/clear_professor_records/export_csv.
phd_research_workflow(field, max_papers_per_conference?)— the full step-by-step method. Start here.
guide://professor-identification,guide://website-discovery,guide://conferences.
Requires Python ≥ 3.11 and uv.
uv sync --extra dev
cp .env.example .env # optional; set OPENALEX_MAILTO for better rate limits# stdio (default — for Claude Desktop / Claude Code)
uv run phd-finder
# streamable HTTP (no auth)
uv run phd-finder --transport http --host 127.0.0.1 --port 8000Add to claude_desktop_config.json:
{
"mcpServers": {
"phd-finder": {
"command": "uv",
"args": ["run", "--directory", "/home/fernblade/Desktop/phd_application_helper", "phd-finder"]
}
}
}npx @modelcontextprotocol/inspector uv run phd-finder| Env var | Default | Purpose |
|---|---|---|
CITATION_PROVIDER |
openalex |
openalex or semantic_scholar |
OPENALEX_MAILTO |
— | OpenAlex polite-pool email (better rate limits) |
SEMANTIC_SCHOLAR_API_KEY |
— | optional S2 key for higher limits |
PHD_FINDER_MAX_PAPERS |
50 |
default papers per conference |
PHD_FINDER_MAX_PAPERS_CEILING |
500 |
hard cap on max_papers |
PHD_FINDER_OUTPUT_DIR |
cwd | where export_csv writes |
v1 sources all conferences from OpenReview (NeurIPS, ICLR, recent CVPR ≥2024,
AAAI ≥2025, ICML ≥2023). Other years need other sources — venues/pmlr.py (ICML)
and venues/cvf.py (older CVPR) are stubs implementing the VenueAdapter
interface, ready to be filled in. Citation providers sit behind a factory
(citations/factory.py); adding scholarly or SerpAPI is a one-line registration.
uv run pytest # offline unit tests
uv run pytest -m integration # hits live OpenReview/OpenAlex (network required)