Skip to main content
Glama

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 自动分析意图:

  1. 若配置了 LLM_API_KEY → 调用 LLM 分析 topic/domain

  2. 否则 → 规则回退(多词短语=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")

工具

搜索与排序

工具

功能

find_professors

推荐入口:一键完成 搜索→详情→排序→导出,结果自动沉淀到资料库

search_professors

按研究方向粗筛候选教授(OpenAlex works→authors)

get_professor_details

多源详情聚合(OpenAlex + DBLP + 主页),自动写入资料库

rank_fit

短语匹配粗排 + 打包精排材料供 client LLM 判断

export_table

输出表格,默认 markdown,可选 csv / json

资料库管理

工具

功能

update_professor_profile

手动更新教授档案字段(主页、职位、PI 状态、研究 tag、notes)

add_web_search_evidence

写入 WebSearch 证据并触发多源交叉验证合并

profiles_inspect

查看资料库统计、按姓名/学校/tag/验证状态查询,或查看单个教授完整档案+证据

profiles_export

导出资料库为 json / markdown / csv,可选包含证据

筛选参数

  • regions:US, UK/GB, JP, KR, DE, CA, AU, SG, HK, ASIA, ALL

  • institution_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 人)」展开候选池。

  • 机构准确性(五级回退):

    1. OpenAlex last_known_institutions

    2. OpenAlex 历年 affiliations(5 年窗口)

    3. 论文级 authorship 中标注的机构(最及时)

    4. DBLP 策展 affiliation(人工维护,最准确)

    5. 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_EMAIL

否

填写后进入 OpenAlex 礼貌池,速率更高

PROFESSOR_PROFILES_DB_PATH

否

资料库路径(默认 professor_profiles.db)

PROFESSOR_FIT_OUTPUT_DIR

否

Markdown 结果保存目录(默认项目根)

LLM_API_KEY

否

LLM 意图分析(仅 fallback 路径需要,Cursor 中不需要)

LLM_BASE_URL

否

LLM API 地址(默认 OpenAI,兼容 Deepseek 等)

LLM_MODEL

否

LLM 模型名(默认 gpt-4o-mini)

数据源

数据源

角色

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 tools
add_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".

NameRequiredDescriptionDefault
openalex_idYes
source_urlYes
source_typeYes
extractedYes
source_titleNo
snippetNo
confidenceNomedium
auto_mergeNo
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).

NameRequiredDescriptionDefault
professorsYes
formatNomarkdown
include_summaryNo
output_pathNo
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.

NameRequiredDescriptionDefault
keywordsYes
regionsNo
institution_tierNo
required_keywordsNo
min_relevanceNo
limitNo
output_pathNo
since_yearNo
topic_keywordsNo
domain_keywordsNo
topic_weightNo
domain_weightNo
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.

NameRequiredDescriptionDefault
professor_idNo
nameNo
universityNo
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).

NameRequiredDescriptionDefault
formatNojson
output_pathNo
include_evidenceNo
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".

NameRequiredDescriptionDefault
nameNo
institutionNo
tagNo
verification_statusNo
openalex_idNo
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.

NameRequiredDescriptionDefault
user_interestsYes
professorsYes
filtersNo
sort_byNorelevance_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".

NameRequiredDescriptionDefault
keywordsYes
paper_urlNo
regionsNo
university_filterNo
institution_tierNo
limitNo
since_yearNo
topic_keywordsNo
domain_keywordsNo
topic_weightNo
domain_weightNo
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".

NameRequiredDescriptionDefault
openalex_idYes
homepage_urlNo
positionNo
is_piNo
pi_verification_sourceNo
homepage_verification_sourceNo
institutionNo
country_codeNo
institution_tierNo
research_tagsNo
verification_statusNo
manual_notesNo

Tool Schema Changelog

Recent tool additions, removals, and schema changes observed during successful MCP inspections.

  1. 9 tool updatesv0.1.0
    • First observedadd_web_search_evidence
    • First observedexport_table
    • First observedfind_professors
    • First observedget_professor_details
    • First observedprofiles_export
    • First observedprofiles_inspect
    • First observedrank_fit
    • First observedsearch_professors
    • First observedupdate_professor_profile

TDQS

A4.2/5.0

Scored across 9 tools

Disambiguation5/5

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).

Naming Consistency4/5

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.

Tool Count5/5

Nine tools cover the essential operations for professor profiling and ranking without unnecessary complexity. The count is well-scoped for the domain.

Completeness4/5

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

ActivityInactive
ResponsivenessOutdated data

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    D
    maintenance
    Enables 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.
    -
  • A
    license
    Not graded
    quality
    B
    maintenance
    An 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.
    4
    MIT