Professor Fit MCP
Provides access to DBLP publication records, homepage URLs, and current affiliation for computer science researchers.
Optional integration for query intent analysis using LLM, including topic/domain split, synonym expansion, and spell correction.
Click on "Deploy Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@Professor Fit MCPfind ML professors for PhD at US R1 universities"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Professor Fit MCP
帮 PhD 申请者匹配教授的 MCP server。输入研究兴趣关键词,输出带溯源与置信度的「教授匹配度」表格。
设计理念
轻服务器(Thin Server):server 只做「LLM 做不到的事」——联网取数据、跨源整合、结构化输出;语义 fit 判断交给调用方的 client LLM(Claude / Cursor)。
OpenAlex 为主干:免费、无需 API key、自带作者消歧与 h-index
多源交叉验证:OpenAlex(指标/论文/concepts)+ DBLP(主页 URL / 首发年)+ 个人主页(职称/email/lab)
诚实数据:每个关键字段带
source与confidence,拿不到就标unknown,绝不编造零 key 默认可用:核心路径无需任何 API key
Related MCP server: Literature Review Assistant
安装
推荐使用 uv(需要 Python 3.10+):
uv venv --python 3.12
uv pip install -e ".[dev]"或使用 pip:
pip install -e .Cursor 配置
在 ~/.cursor/mcp.json 中添加(Windows 路径示例):
{
"mcpServers": {
"professor-fit": {
"command": "D:\\path\\to\\ProfessorFitMCP\\.venv\\Scripts\\professor-fit-mcp.exe",
"env": {
"OPENALEX_EMAIL": "your@email.com"
}
}
}
}Claude Desktop 配置
在 claude_desktop_config.json 中添加:
{
"mcpServers": {
"professor-fit": {
"command": "python",
"args": ["-m", "professor_fit_mcp.server"],
"env": {
"OPENALEX_EMAIL": "your@email.com"
}
}
}
}
OPENALEX_EMAIL可选——填写后 OpenAlex 进入「礼貌池」,速率更高。
使用
推荐:一键搜索(带 topic/domain 优先级)
直接用 find_professors,一次完成「意图分析 → 搜索 → 详情 → 排序 → 生成 Markdown 表格」:
帮我找 mev + defi 方向的美国 R1 院校教授Cursor / Claude 会自动拆分 topic vs domain 并调用:
find_professors(
keywords=["MEV", "DeFi"],
topic_keywords=["MEV", "maximal extractable value", "frontrunning"],
domain_keywords=["DeFi", "decentralized finance", "blockchain"],
topic_weight=3.0, # topic 命中的论文得分 ×3
domain_weight=1.0, # domain 命中的论文得分 ×1
regions=["US"],
institution_tier=["R1"],
limit=30,
since_year=2018,
)关键词优先级:topic_keywords 中的查询命中权重 ×3,确保做 MEV 的人排名远高于泛 DeFi/blockchain 研究者。Cursor 的 Claude 会从 tool docstring 中理解 topic/domain 语义,自动拆分——无需额外 LLM 成本。
返回 Markdown 表格并自动保存(路径在 saved_to 中)。
兼容模式
不提供 topic/domain 时仍可工作(向后兼容):
find_professors(
keywords=["MEV", "DeFi"],
regions=["US"],
limit=10,
)此时 server 自动分析意图:
若配置了
LLM_API_KEY→ 调用 LLM 分析 topic/domain否则 → 规则回退(多词短语=topic,单词=domain)
进阶:分步调用
需要精细控制时,可单独调用底层工具:
1. search_professors(keywords=[...], topic_keywords=[...], domain_keywords=[...], regions=["US"])
2. get_professor_details(professor_id="A5023888391")
3. rank_fit(user_interests={"keywords": [...]}, professors=[...])
4. export_table(professors=[...], format="markdown", output_path="results.md")工具
搜索与排序
工具 | 功能 |
| 推荐入口:一键完成 搜索→详情→排序→导出,结果自动沉淀到资料库 |
| 按研究方向粗筛候选教授(OpenAlex works→authors) |
| 多源详情聚合(OpenAlex + DBLP + 主页),自动写入资料库 |
| 短语匹配粗排 + 打包精排材料供 client LLM 判断 |
| 输出表格,默认 |
资料库管理
工具 | 功能 |
| 手动更新教授档案字段(主页、职位、PI 状态、研究 tag、notes) |
| 写入 WebSearch 证据并触发多源交叉验证合并 |
| 查看资料库统计、按姓名/学校/tag/验证状态查询,或查看单个教授完整档案+证据 |
| 导出资料库为 |
筛选参数
regions:US,UK/GB,JP,KR,DE,CA,AU,SG,HK,ASIA,ALLinstitution_tier:R1(美),HK5(港五校),Russell(英),Go8(澳),U15(加),TU9(德),Imperial(日),SKY(韩)topic_keywords:核心研究课题(教授必须直接做这个方向)。高评分权重。domain_keywords:领域上下文(教授在这个大领域中工作)。低评分权重。topic_weight/domain_weight:topic/domain 查询的得分倍数(默认 3.0 / 1.0)required_keywords:领域锚点(命中任一即保留)。不传时自动推断;传[]关闭闸门min_relevance:最低相关分阈值(0.0–1.0)since_year:论文起始年份(默认 current_year - 7)
精度与召回
关键词优先级:topic 查询命中的论文得分是 domain 的 3-4.5 倍,确保核心研究方向的人排名靠前,不被宽泛领域的高产作者冲淡。
召回:搜索按「topic/domain 分组查询 + 领域同义词扩展(最多 8 条)+ 深翻页(5 页×100)+ 并发解析作者(上限 200 人)」展开候选池。
机构准确性(五级回退):
OpenAlex
last_known_institutionsOpenAlex 历年
affiliations(5 年窗口)论文级 authorship 中标注的机构(最及时)
DBLP 策展 affiliation(人工维护,最准确)
InstitutionClassifier 模糊匹配
精度闸门:默认按领域核心词做 ANY-match 过滤,排除邻域误报。
主页发现策略
1. DBLP person record 的 <url> 标签 ← server,排除 scholar/orcid 等聚合站
2. OpenAlex 作者 homepage(若有) ← server,免费
3. 仍无 → 返回 homepage_search_query + ← 交 client(Cursor/Claude)的 web search
homepage_resolution 指令 补全个人/院系主页(多数教授都有主页)find_professors 的返回里含 homepage_resolution.needed 列表,client 应对其中每个 search_query 做 web 搜索补全主页(顺带可验证职称/当前任职)。
教授资料库
每次搜索/查详情会自动将教授档案写入本地 SQLite 数据库 professor_profiles.db(路径可通过 PROFESSOR_PROFILES_DB_PATH 环境变量配置)。
资料库存储:
身份:姓名、学校、国家、tier、职位、是否 PI
指标:h-index、citations、works_count、近 3 年论文
研究内容:OpenAlex concepts、研究方向 tags、最近论文(JSON)
主页:URL + 来源 + 验证时间
验证状态:
verified/needs_review/unverified
多源交叉验证
WebSearch 证据通过 add_web_search_evidence 写入,自动与 OpenAlex/DBLP 数据合并。合并按来源优先级进行:
主页 URL:院系 faculty page > 个人主页 > DBLP > OpenAlex
职位/PI:faculty page > 个人主页 > 启发式推断
机构:faculty page > OpenAlex affiliations > DBLP
来源冲突时标记 needs_review,不静默覆盖。
查看资料库
profiles_inspect() # 统计概览
profiles_inspect(name="Ari Juels") # 按姓名搜索
profiles_inspect(openalex_id="A5023888391") # 完整档案+证据
profiles_export(format="json", output_path="db.json") # 导出为文件开发
# 运行测试
uv run pytest tests/ -v环境变量
变量 | 必须 | 说明 |
| 否 | 填写后进入 OpenAlex 礼貌池,速率更高 |
| 否 | 资料库路径(默认 |
| 否 | Markdown 结果保存目录(默认项目根) |
| 否 | LLM 意图分析(仅 fallback 路径需要,Cursor 中不需要) |
| 否 | LLM API 地址(默认 OpenAI,兼容 Deepseek 等) |
| 否 | LLM 模型名(默认 |
数据源
数据源 | 角色 | API key |
OpenAlex | 主干:指标/机构/concepts/论文/作者消歧 | 否 |
DBLP | CS 发表记录、主页 URL、当前机构、首发年(全量并发查询) | 否 |
个人主页 | best-effort:职称/email/lab/招生信号 | 否 |
院校分级 | 内置 JSON(R1/HK5/Russell 等) | 否 |
LLM(可选) | 查询意图分析:topic/domain 拆分 + 同义词扩展 + 拼写纠错 | 可选 |
professor_profiles.db | 本地资料库:持久化档案 + WebSearch 证据 + 交叉验证 | 否 |
Available Tools
9 toolsadd_web_search_evidenceA
Add WebSearch evidence for a professor and optionally merge it into their profile.
Call this after using web search to find a professor's faculty page or personal homepage. The extracted fields will be stored as evidence and (if auto_merge=True) merged into the professor's profile with cross-source verification.
Args: openalex_id: The professor's OpenAlex ID source_url: URL of the evidence page source_type: One of: faculty_page, personal_homepage, lab_page, scholar_page, paper_page, news, other extracted: Dict of extracted fields. Supported keys: homepage_url, name, institution, country_code, position, is_pi, research_tags (list), recent_papers (list of dicts) source_title: Title of the evidence page snippet: Relevant text snippet from the page confidence: "high" | "medium" | "low" (default "medium") auto_merge: If True (default), automatically merge evidence into profile
Returns: dict with "evidence_id", "merged" (bool), and optionally "verification_status".
| Name | Required | Description | Default |
|---|---|---|---|
| openalex_id | Yes | ||
| source_url | Yes | ||
| source_type | Yes | ||
| extracted | Yes | ||
| source_title | No | ||
| snippet | No | ||
| confidence | No | medium | |
| auto_merge | No |
export_tableA
Export ranked professors as a formatted table.
Args: professors: ranked_professors list from rank_fit format: "markdown" (default) | "csv" | "json" include_summary: Include count summary (default True) output_path: Optional file path to save output
Returns: dict with "content" (string), "format", and "saved_to" (path if saved).
| Name | Required | Description | Default |
|---|---|---|---|
| professors | Yes | ||
| format | No | markdown | |
| include_summary | No | ||
| output_path | No |
find_professorsA
One-shot professor finder (RECOMMENDED entry point).
Runs the full pipeline in a single call: search candidates -> fetch multi-source details (concurrently) -> rank by relevance -> render a Markdown table.
KEYWORD PRIORITY (IMPORTANT): For precise results, split your query into topic vs domain: - topic_keywords: The specific research problem the professor MUST work on. These get scored with topic_weight (default 3x). Include synonym phrasings. Example: ["order fairness", "fair ordering", "fair transaction ordering"] - domain_keywords: The broader field/area (used as context/filter, lower weight). Example: ["blockchain", "DeFi", "decentralized finance"]
If you only provide `keywords` without topic/domain split, the server will
attempt to auto-analyze intent (via LLM if configured, else heuristics).Args: keywords: Research interest keywords (flat list, backward-compatible). topic_keywords: Core research topic terms. Professors MUST work on this. Receives topic_weight scoring boost. Include 2-4 synonym phrasings. domain_keywords: Broader field/area terms. Used as context filter. Receives domain_weight scoring (lower than topic). topic_weight: Score multiplier for topic query hits (default 3.0). domain_weight: Score multiplier for domain query hits (default 1.0). regions: Country/region codes. Supported: US, UK/GB, JP, KR, DE, CA, AU, SG, HK, ASIA, ALL institution_tier: Filter by tier, e.g. ["R1", "Russell", "HK5"] required_keywords: Domain-anchor terms for precision gating. min_relevance: Minimum relevance score (0.0-1.0) to keep a professor. limit: Max number of professors (default 10). output_path: Path to save Markdown. Auto-generated if omitted. since_year: Only papers from this year onward (default: current_year - 7).
Returns: dict with markdown, ranked_professors, total, saved_to, homepage_resolution.
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| regions | No | ||
| institution_tier | No | ||
| required_keywords | No | ||
| min_relevance | No | ||
| limit | No | ||
| output_path | No | ||
| since_year | No | ||
| topic_keywords | No | ||
| domain_keywords | No | ||
| topic_weight | No | ||
| domain_weight | No |
get_professor_detailsA
Get detailed multi-source profile for a professor.
Fetches from OpenAlex (metrics, concepts, recent papers) + DBLP (homepage URL, first publication year) + homepage (position, email, lab, accepting students signal). All key fields include source and confidence metadata.
Args: professor_id: OpenAlex author ID (preferred), e.g. "A5023888391" name: Professor's name (used if professor_id not provided) university: University name to disambiguate when searching by name
Returns: Full professor profile with sourced fields (value/sources/confidence), recent papers (last 3 years), seniority estimate, and accepting_students_signal. If homepage_url is null, homepage_search_query is provided for client web search.
| Name | Required | Description | Default |
|---|---|---|---|
| professor_id | No | ||
| name | No | ||
| university | No |
profiles_exportA
Export professor profiles from the local database.
Args: format: "json" (default) | "markdown" | "csv" output_path: File path to save the export. If omitted, content is returned inline. include_evidence: If True, include web_search_evidence for each professor (JSON only)
Returns: dict with "content" (string), "format", "total", and "saved_to" (path if saved).
| Name | Required | Description | Default |
|---|---|---|---|
| format | No | json | |
| output_path | No | ||
| include_evidence | No |
profiles_inspectA
Inspect the local professor profiles database.
With no arguments, returns database statistics (counts by tier, country, verification status). With filters, returns matching professor summaries. With openalex_id, returns the full profile and its evidence.
Args: name: Partial name match (case-insensitive) institution: Partial institution name match tag: Research tag to search for verification_status: Filter by "verified" | "needs_review" | "unverified" openalex_id: Get full profile + evidence for a specific professor
Returns: dict with "stats" and/or "profiles" and/or "profile" + "evidence".
| Name | Required | Description | Default |
|---|---|---|---|
| name | No | ||
| institution | No | ||
| tag | No | ||
| verification_status | No | ||
| openalex_id | No |
rank_fitA
Rank professors by keyword overlap and package materials for client LLM fit judgment.
SERVER SIDE: Deterministic whole-word keyword matching against concepts + paper titles/abstracts. CLIENT SIDE: Use the fit_materials in each result to produce fit_level, match_reasons, potential_concerns, and email_advice.
Args: user_interests: Dict with one of: - {"keywords": ["blockchain", "MEV"]} - {"preset": "blockchain_security"} - {"keywords": [...], "description": "free text", "paper_urls": [...]} Optionally add topic/domain weighting (same semantics as find_professors): - {"topic_keywords": [...], "domain_keywords": [...], "topic_weight": 3.0, "domain_weight": 1.0} professors: List from search_professors or get_professor_details filters: Optional: min_citation (int), regions (list), institution_tier (list) sort_by: "relevance_signal" (default) | "citation"
Returns: ranked_professors list with relevance_signal and fit_materials for client LLM.
| Name | Required | Description | Default |
|---|---|---|---|
| user_interests | Yes | ||
| professors | Yes | ||
| filters | No | ||
| sort_by | No | relevance_signal |
search_professorsA
Search for professors matching research interests (coarse filter).
Args: keywords: Research interest keywords (flat list). topic_keywords: Core topic terms (high scoring weight). See find_professors. domain_keywords: Broader field terms (lower scoring weight). topic_weight: Multiplier for topic hits (default 3.0). domain_weight: Multiplier for domain hits (default 1.0). paper_url: Optional arXiv/DOI URL to extract keywords from. regions: Country/region codes. Supported: US, UK/GB, JP, KR, DE, CA, AU, SG, HK, ASIA, ALL university_filter: Specific university names to include. institution_tier: Filter by tier, e.g. ["R1", "Russell", "HK5"] limit: Max number of results (default 20). since_year: Only papers from this year onward (default: current_year - 7).
Returns: dict with "professors" list and "total_found".
| Name | Required | Description | Default |
|---|---|---|---|
| keywords | Yes | ||
| paper_url | No | ||
| regions | No | ||
| university_filter | No | ||
| institution_tier | No | ||
| limit | No | ||
| since_year | No | ||
| topic_keywords | No | ||
| domain_keywords | No | ||
| topic_weight | No | ||
| domain_weight | No |
update_professor_profileA
Manually update fields on a professor profile in the local profiles database.
Use this to write WebSearch-confirmed homepage URLs, verified positions, PI status, research tags, or manual notes. Only fields you provide are updated; omitted fields are left unchanged.
Args: openalex_id: The professor's OpenAlex ID (required) homepage_url: Confirmed homepage URL position: Confirmed position title, e.g. "Assistant Professor" is_pi: Whether the professor is a PI pi_verification_source: Source of PI verification, e.g. "faculty_page" homepage_verification_source: Source of homepage verification institution: Confirmed current institution name country_code: Country code, e.g. "US" institution_tier: Tier, e.g. "R1" research_tags: List of research topic tags verification_status: "verified" | "needs_review" | "unverified" manual_notes: Free-text notes
Returns: dict with "success" (bool) and "message".
| Name | Required | Description | Default |
|---|---|---|---|
| openalex_id | Yes | ||
| homepage_url | No | ||
| position | No | ||
| is_pi | No | ||
| pi_verification_source | No | ||
| homepage_verification_source | No | ||
| institution | No | ||
| country_code | No | ||
| institution_tier | No | ||
| research_tags | No | ||
| verification_status | No | ||
| manual_notes | No |
Tool Schema Changelog
Recent tool additions, removals, and schema changes observed during successful MCP inspections.
9 tool updates
v0.1.0- First observed
add_web_search_evidence - First observed
export_table - First observed
find_professors - First observed
get_professor_details - First observed
profiles_export - First observed
profiles_inspect - First observed
rank_fit - First observed
search_professors - First observed
update_professor_profile
TDQS
Scored across 9 tools
Each tool has a clearly distinct purpose within the professor discovery and management workflow. The descriptions are detailed and prevent confusion between similar tools like search_professors (coarse filter) and find_professors (full pipeline).
Most tools follow a verb_noun pattern (e.g., find_professors, update_professor_profile), but profiles_export and profiles_inspect use a noun_verb pattern, creating a minor inconsistency.
Nine tools cover the essential operations for professor profiling and ranking without unnecessary complexity. The count is well-scoped for the domain.
The tool set covers the core workflow of searching, fetching details, ranking, adding evidence, updating, inspecting, and exporting. Missing explicit create/delete tools, but the workflow implicitly supports creation through evidence merging.
Maintenance
Related MCP Connectors
Find engineers and scientists from papers, open source and patents. Each result links its sources.
Academic paper search, scientific literature, citation analysis, arXiv & semantic related-work.
Search 340M+ academic papers — citation graphs, semantic similarity, and AI literature reviews.
Scrape arXiv, OpenAlex and Crossref papers by author, topic, journal or DOI. Pay per row.
Related MCP Servers
- FlicenseNot gradedqualityDmaintenanceEnables intelligent academic paper discovery through ArXiv search and AI-powered semantic similarity analysis. Helps researchers find and rank the most relevant papers using natural language queries and state-of-the-art sentence transformers.-
- AlicenseBqualityDmaintenanceSearch and retrieve academic papers from arXiv and DBLP databases, with AI-powered prompts to generate comprehensive research summaries, discover related topics, and identify leading authors in any field.232 PyPI2MIT
- FlicenseNot gradedqualityDmaintenanceAutomates literature review, research gap detection, and novelty evaluation for academic research, providing tools to search, summarize, find gaps, generate ideas, and evaluate novelty.-
- AlicenseNot gradedqualityBmaintenanceAn autonomous MCP agent that helps you apply to fully funded MS and PhD programs by discovering professors, verifying faculty status, matching projects, and drafting cold emails.4MIT