@cyanheads/ crossref-mcp-服务器
解析 DOI, 搜索~1880M 学术著作, 获取参考文献,并通过 Crossref REST API 查找出版商. (原始内容存档于2012-10-12). STIO or Streamable HTTP.
概览
Crossref REST API的学者元数据. 通过免费文本或结构化过滤器搜索到相近1.88亿所学术作品, 获取外出参考列表.
工具
| 工具 | 说明 |
|---|---|
crossref_get_work | 确定一个DOI以完整的Crossref元数据记录:标题、作者、编辑、隶属关系、摘要、带有卷/发/页的期刊、ISSSN和ISBN、出版日期、许可证、全文链接、资助者确认、出版后更新和相关识别资料 |
crossref_search_works | 以免费文本和/或结构化过滤器搜索 Crossref 工作索引, 并带有字段范围查询参数、 排序、 字段选择以及 抵消或基于光标的呼叫 |
crossref_get_references | 返回当前 DOI 的参考列表 — 本文引用的作品, 并附带引用字符串, 并解决可用的 DOI |
crossref_search_journals | 通过 ISSN 或标题查询查找 Crossref 日记记录; 可选择检索该日记最新作品的一页 |
crossref_search_funders | 在Crossref Funder Register 注册中按名称、注册身份证或出资人DOI查找资助者;可选取一页资助作品 |
crossref_get_member | 将 Crossref 成员ID 解至其出版商记录——名称、拥有的 DOI 前缀、 DOI 计数和每个类别元数据存储范围 |
crossref_get_prefix | 解析 DOI 前缀( 例如 ). 10.1038给注册它的出版商,链入 crossref_get_member |
资源
| 资源 | 说明 |
|---|---|
skill://crossref-guide/SKILL.md | 特工技能 crossref-guide判决: crossref_* 工具——确认引用匹配,在日记/funder作品列表和被过滤的作品搜索中选择,Crossref过滤语法,DOI前缀相对于当前出版商,以及依赖存款的覆盖 |
技能也通过 skill://{+path} 模板和船舶作为 skills/crossref-guide/SKILL.md 在 npm 包中,多克图像 .mcpb 捆绑和插件安装 。 工具并不依赖于它.
能力参考
crossref_get_work 工具
- DOI 验证反对
10.NNNN/suffix上游呼叫前的regex, 接受赤裸的或被其溶液所包裹(https://doi.org/…, (中文(简体) ),https://dx.doi.org/…, (中文(简体) ),doi:…) 并在检查前解开 - 返回标题、有隶属关系的作者、摘要(交存时)、容器/期刊、出版日期、工作类型、ISSSN、许可证URL、全文链接URL和资助者确认
containerTitles按交存顺序列出记录存放的每个集装箱名称——一本书章或诉讼文件,经常存放其系列,然后存放其书籍或卷数——除此之外containerTitle,保持第一个;crossref_search_works返回两者,并返回其container-title选择同时填充名称- 引用定位器
volume, (中文(简体) ),issue, (中文(简体) ),page,以及articleNumber在同一条线上crossref_search_works附加时isbn——每份交存,缺席时省略 memberId是Crossref成员 持有DOI现在—— 传递给crossref_get_member为出版商记录。 对于转让给另一个出版商的标题,它与成员不同,通过DOI的前缀名称crossref_get_prefixeditors在作者的条目形状中,完整返回,从未计算在内authorCount- 作者列表页
offset编号 :limit(违约25起,每起电话最高可达一万起,数额较大)limit被夹到一万块notice(三);authorCount报告已交存的总数anextOffset当作者仍然在时继续 —— 所有其他字段在每一页上全部返回 updatedBy列出更正、撤回、关切的表示,以及针对工作的 Crossref 记录的新版本——通知DOI、类型、来源(publisher或者说retraction-watch,并附有其记录的身份证)和入境日期——和updateTo(a) 记录是通知updatedBy在场,notice名称每个更新类型及其来源。 缺席updatedBy并不意味着作品从未更新relations组合相关的标识符(预出QQ已发布版本、版本、评论、补编),按关系类型、标识符类型和主张方,完整返回;其中只有Crossref注册的DIS通过此工具解决- 仅通过ROR登记(未保存姓名)声称的出资人或从属关系
ror替换name,从不作为空白条目 - 出版日期是
published, (中文(简体) ),published-print, (中文(简体) ),published-online,以及issued(仅此工具) 命名一个值; 省略日期元件 Crossref 记录为未知, 以及它下面不太精确的事物 - 外出参考报告为计数(
referencesCount)——条目来源于:crossref_get_references; 收到的引用数 (isReferencedByCountcrossref——在引用图表时使用OpenAlex - DOI Crossref 没有返回记录
doi_not_found命名DOI注册局说持有的机构(registrationAgency——DataCite, JaLC, mEDRA,.),克罗斯雷夫注册时的基金人注册指针,或根本没有机构注册
crossref_search_works 工具
- 自由文本
query加结构化filter使用 Crossref 连字符键的对象(from-pub-date, (中文(简体) ),type, (中文(简体) ),funder, (中文(简体) ),issn, (中文(简体) ),has-abstract, (中文(简体) ),license.url页:1 - 视野参数
queryTitle, (中文(简体) ),queryAuthor, (中文(简体) ),queryContainerTitle,以及queryBibliographic结合query彼此之间 - 排序为
relevance, (中文(简体) ),score, (中文(简体) ),is-referenced-by-count, (中文(简体) ),published, (中文(简体) ),deposited,或列出的其他字段——按offset只因为克罗斯雷夫用光标拒绝了它们. 光标行走带有查询术语而无sort按相关性进行(同意为sort=score,没有order并且可以在页面边界上重复或跳过记录;sort: "created"徒步无相重复. 在 Crossref 注册命令中只执行过滤行走 fields将有效载荷缩小到20个选定名称中的任何一个,包括引号定位器volume, (中文(简体) ),issue, (中文(简体) ),page, (中文(简体) ),article-number,以及ISSN,更新链接updated-by财务报告和审定财务报表update-to,以及member页:1memberId,每个工作也带在fields省略——并拒绝任何其他名称;DOI总是返回,和crossref_get_work带着记录的其余部分- 每次工作都带
updatedBy(更正、撤回、关切表达、新版本记录)updateTo(作品是通知) 在入门形状 和使行crossref_get_work使用,因此可以筛选一个结果的一页以收回,而无需每个 DOI 调用 - 空白或空白的查询术语或过滤器值,以及空的
sort或者说order中,读取为省略;当这没有留下可供搜索的内容时notice说页面是未过滤的列表 rows返回最多250个工作authorLimit每个作品的上限作者(默认为25个,最多500个);其中任一作品的较大值被用一个notice,在正后页上还标明了在记录返回后继续进行的抵消;authorCount报告全部存入的总数——将剪接工作的DOI连入crossref_get_work其余部分- 偏移的呼号上限为
offset + rows ≤ 10,000: 一个会通过它的页面返回rows适合,与一个notice指定所请求和应用的行,并拒绝抵消1万多行(offset_too_large(三);cursor="*"通过链条开始深呼nextCursor指针 - 光标和偏移不能合并 - 光标行走结束于省略的页面
nextCursor——一空一页从不带;每空一页都是notice三个原因中哪一个适用
crossref_get_references 工具
- 以引用的作品的 DOI 赤裸或解析器包装,相同的形式
crossref_get_work接受 - 每个参考文献都附有其交存的引用字符串,当Crossref解决后,一个DOI用于
crossref_get_work,与doiAssertedBy说出版商存了DOI或Crossref - 已交存的结构部分:作者、年份、文章标题、期刊标题、被引用的书籍或卷名(
volumeTitle在没有文章标题时作为标题),系列标题,卷,发,首页,版和ISSSN - 引用字符串有格式化的标记被剥去并解码字符引用;括号中的间距不是被识别的标记(引用的 URL, Miller 索引, DOI 片段) 被完全保留为已存
- 页面
offset编号 :limit(违约100起,每起电话最多2 500起)limit夹入2 500个带anotice(三);referenceCount全额交存总额和nextOffset继续,如果还有更多 - 2000年以前的作品和未参与的出版商往往没有索引的参考文献
- 只跳; 无法通过 Crossref 调取引用语句 – 引用图表使用 OpenAlex
- DOI Crossref 没有返回记录
doi_not_found命名其登记机构(registrationAgency),或者说没有机构以同样的方式注册crossref_get_work已经
crossref_search_journals 工具
include_works: true并返回该期刊最新作品的一页works_offset,在aworks_cursor行; 需要一个清晰的日记 — 一个匹配多个返回的标题查询ambiguous_journal,命名候选人和ISSNs- 将日记标题、出版商、ISSN及其印刷/电子形式、主题领域、DOI计数(总数/当前/背文件)和每个类别元数据存款覆盖(摘要、参考文献、ORCID、资助者、许可证等)作为当前/背文件分数——同样细分
crossref_get_member给每个出版社 - 一个
issn查找还返回所发年份的 DOI 计数, 递增; 标题清空结果省略 - 标题查询结果页
offset(上限)offset + rows ≤ 100,000);作品按works_offset(上限)≤ 10,000)——一个会通过上限的页面返回rows适合,与一个notice指定所请求并应用的行,只拒绝在上限上或上下冲抵notice命名它,一个达到上限的 记录超过它 works_cursor="*"通过链条将没有上限的作品列表页nextWorksCursor符号; 由 Crossref 注册日期运行的光标行走, 最先更新( Crossref 不按光标排列出版日期) , 且不能与works_offset > 0(单位:千美元)works_cursor_offset_conflict(中文(简体) )- 配对的日记,没有成型的ISSN注册,没有可地址的作品列表——
include_works用一个notice而不是返回空列表
crossref_search_funders 工具
- 接受名称
query,赤裸的注册身份证(100000001),或完全供资者DOI(10.13039/100000001,可选在后面doi:编号 :https://doi.org/前缀) include_works: true并返回一个有资助的作品的页面; 需要一个明确的资助者—— 一个匹配多个返回的名称查询ambiguous_funder,命名候选人和登记册ID- 返回供资者名称、登记号、国家及替代名称
- 名称查询结果页
offset(上限)≤ 100,000); 供资工作按works_offset(上限)≤ 10,000或,没有上限,works_cursor="*"连锁nextWorksCursor——相抵页先运行最新公布的页码,一光标行走最新注册的页码先运行,两者不能合并(works_offset > 0); 页面通过天花板返回rows适合,与一个notice指定所请求并应用的行,只拒绝在上限上或上下冲抵notice命名它,一个达到上限的 记录超过它 - 资金到位的工作清单还计算了由出资人登记后后裔出资的工作
crossref_search_works打开过滤器{"funder": "10.13039/<id>"}没有; afunder_doi查找返回这些后代的登记身份descendants每一个深度,整个——OR'd与资助者的身份在funder过滤器用日期、类型或其他过滤器计算出相同的范围。 检查的worksCount仅计算身份 - 被贬损的登记处条目回答其继任者的名字,而只计算自己的作品——答复的
notice名称replacedBy; 从未自动跟踪替换
crossref_get_member 工具
- 会员是注册DOIS的组织——这回答"这个出版商发表什么,他们如何完整地存储元数据?"
- 返回主名、备选印记名称、自有的DOI前缀、DOI计数(总数/当前/背文件)、每个工作类型的细分以及每个类别元数据存款覆盖率(参考、摘要、ORCID、资助者、许可证等)作为当前/背文件分数
- 现在的DOI成员是
memberIdcrossref_get_work或者说crossref_search_works为它返回;crossref_get_prefix返回成员的一个前缀记录名称,对于一个已转移的标题是以前的出版商
crossref_get_prefix 工具
- 接受DOI的注册前缀(例如:.
10.1038,没有/suffix(中文(简体) ) - 返回出版商名称和数字成员 ID 前缀记录名称——前缀注册人 ID 链条直接输入
crossref_get_member以完整记录。 转到另一出版商名下的DOI保留其前缀,因此其现任成员是memberIdcrossref_get_work返回时 - Crossref 前缀记录在设计上是薄的(只有主名和成员链接);更丰富的发布者数据生活在成员记录上
- 没有 Crossref 成员返回的前缀
prefix_not_found指定注册的机构(registrationAgency,例如用于10.5281),或者说没有机构注册
特征
建造在 @cyanheads/mcp-ts-core: stdio和可流式的 HTTP 传输器,可插接式(none 编号 : jwt 编号 : oauth),可互换存储(in-memory, (中文(简体) ), filesystem, (中文(简体) ), Supabase, (中文(简体) ), Cloudflare KV/R2/D1),结构化记录,可选择的OpenTeleometry tracking.
特定十字:
- 政治家库
User-Agent在每个 Crossref 请求上注入了头- 优先访问通过CROSSREF_MAILTO,无密钥;不需要 API 令牌 - 在429上以指数反转重试( 荣誉)
Retry-After), 5xx, HTTP 408/504, 和网络故障; 一个错误的响应机构和一个点击的请求CROSSREF_TIMEOUT_MS未重审 - 基于光标的深度浏览作品搜索以及期刊和资助者作品列表,结果设定在抵消上限之外
- Crossref拒绝一项请求是公开宣布的理由——
unknown_filter(用克罗斯雷夫列出一个时的连字符键),invalid_parameter, (中文(简体) ),sort_cursor_conflict, (中文(简体) ),invalid_cursor- 载有被拒绝的投入和回收提示;缺陷issn请求前拒绝过滤值, 没有上游错误中继 Crossref 的原始响应正文 - 每个可读值的文本常态化:HTML字符引用被解码并白空被崩溃;引用字符串附加了格式化标记被剥去,所以标题和摘要被读作纯文本而不是原始的JATS XML;一个MathML公式保持其结构——存单带有一个的TeX注释,否则是一种线性形式,如:
x_i, (中文(简体) ),A^{−1}, (中文(简体) ),√(m), (中文(简体) ),(a+b)/c
方便代理输出 :
- 证明——标识符,URL,和日期在人类可读文本正常化的同时被返回字节精确,因此呼叫者可以信任
doi, (中文(简体) ),issn,和未重新核实的日期字段 - Graceful 部分失败 — 一个空页是成功的, 不是错误: 一个抵消过列表的结尾, 或者一个查询没有匹配, 带有
notice说,结束的一页也是这样crossref_search_works光标行走; 日志或供资者在页上行走结束, 省略nextWorksCursor - 歧视性产出合同——
nextCursor, (中文(简体) ),nextOffset, (中文(简体) ),nextWorksOffset,以及nextWorksCursor一旦清单被耗尽,达到抵消上限的一页就不再保留续作字段notice,然后将它切到合适的行上;光标符号仍然可以搭载上一页,空页则不带 - 明确处理的含糊不清——
ambiguous_journal财务报告和审定财务报表ambiguous_funder在错误数据中列出每个候选人及其标识符,而不是默默解决第一个匹配
开始
连接到主机实例, 没有安装 :
claude mcp add --transport http crossref-mcp-server https://crossref.caseyjhand.com/mcp
或者在当地运行它:
claude mcp add crossref-mcp-server -- npx -y @cyanheads/crossref-mcp-server
对于其他客户端,请将此添加到 MCP 配置文件中 :
{
"mcpServers": {
"crossref-mcp-server": {
"command": "npx",
"args": ["-y", "@cyanheads/crossref-mcp-server"]
}
}
}
设置 CROSSREF_MAILTO 到您的电子邮件将请求移动到 Crossref 的有礼貌的池中,该池的利率限额高于匿名池;不需要账户或令牌。 对于 Docker 或源构建,请参见 运行服务器。 。 。 .
配置
所有配置在启动时通过 Zod schemas 在 src/config/server-config.ts。 。 。 .
| 变量 | 说明 | 默认 |
|---|---|---|
CROSSREF_MAILTO | 嵌入在礼貌池中的电子邮件地址 User-Agent 每个 Crossref 请求的页眉 。 可选的——服务器在没有它的情况下启动,但登录一个警告,并使用有更严格费率限制的匿名池. 从未发送到 DOI 注册: Crossref 未找到后的机构查找只识别服务器和版本 . | —— 说 |
CROSSREF_BASE_URL | Crossref API 基础 URL. 覆盖本地代理测试 。 283)\1cH00FFFF\4cHFF0000\b0}Crossref没找到之后的代理调查总是去 https://doi.org不管这是准备的. | https://api.crossref.org |
CROSSREF_TIMEOUT_MS | 请求超时数以毫秒计 同样,最坏的情况是在上游等待一个没有反应的请求——一个最后期限的请求没有被重审. | 10000 |
MCP_TRANSPORT_TYPE | 运输: stdio 或者说 http。 。 。 . | stdio |
MCP_SESSION_MODE | HTTP 会话模式 : auto, (中文(简体) ), stateful,或 stateless。此服务器不需要多轮输入, 因此 src/index.ts 声明 stateless; 贴子和 .env.example 标出相同的值,设置此变量将覆盖声明. | stateless (宣布为 src/(中文(简体) ) |
MCP_HTTP_PORT | HTTP 服务器端口 . | 3010 |
MCP_AUTH_MODE | Auth 模式 : none, (中文(简体) ), jwt,或 oauth。 。 。 . | none |
MCP_LOG_LEVEL | 日志级别(RFC 5424). | info |
LOGS_DIR | 日志文件目录(只有Node.js). | <project-root>/logs |
LOG_TOOL_FAILURE_PAYLOADS | 记录每个工具调用失败的参数和结果,按密钥名称编辑并封顶 LOG_TOOL_FAILURE_PAYLOAD_MAX_BYTES (默认) 16384) (中文(简体) ). 自由形式值内部的秘密不编辑 . | false |
OTEL_ENABLED | 启用 OpenTelemet 仪器。 。 。 . | false |
见 .env.example 用于完整可选覆盖列表.
运行服务器
地方发展
要求数 Bun v1.4.0 (英语) 或更高(或Node.js v24+).
-
克隆并安装 :
git clone https://github.com/cyanheads/crossref-mcp-server.git cd crossref-mcp-server && bun install cp .env.example .env # optionally set CROSSREF_MAILTO -
构建和运行 :
# One-time build bun run rebuild # Run the built server bun run start:stdio # or bun run start:http -
运行检查和测试 :
bun run devcheck # Lint, format, typecheck, security bun run test # Vitest test suite bun run lint:mcp # Validate MCP definitions against spec
夹克
docker run --rm -e [email protected] -p 3010:3010 ghcr.io/cyanheads/crossref-mcp-server:latest
图像默认为 HTTP 传输、 无国籍会话模式和日志到 /var/log/crossref-mcp-server运行到一个 MCP 客户端的 stdio,使用 "command": "docker" 与 "args": ["run", "-i", "--rm", "-e", "MCP_TRANSPORT_TYPE=stdio", "ghcr.io/cyanheads/crossref-mcp-server:latest"]为了在当地建设, docker build -t crossref-mcp-server .; OpenTeleometry 端点依赖性默认安装——用 --build-arg OTEL_ENABLED=false 以略去它们.
项目结构
| 目录 | 目的 |
|---|---|
src/index.ts | createApp() 进入点——登记工具及其服务. |
src/config | 服务器特定环境变量与Zod解析并验证. |
src/mcp-server/tools | 工具定义*.tool.ts) (中文(简体) ). |
src/services/crossref | CrossrefService — HTTP 客户端, 有礼貌的池头, 重试, pagination 帮助. |
skills/ | 已发布代理技能( E)crossref-guide),服务于MCP并随货包一起发运. |
tests/ | 单位和综合测试镜像 src/。 。 。 . |
发展指南
见 CLAUDE.md 发展准则和建筑规则。 简本:
- 搬运工投掷,框架渔获量——否
try/catch在工具逻辑中 - 使用
ctx.log请求范围伐木,ctx.state租户范围储存 - 通过枪管登记新工具
src/mcp-server/tools/definitions/index.ts - 环绕外部 API 调用: 验证原始 = 与域类型正常化 = 返回输出计划; 永远不要编织缺失的字段( Crossref 记录中经常缺少摘要、参考列表和隶属关系)
捐款
问题值得欢迎。 提交前进行检查和测试:
bun run devcheck
bun run test
许可证
阿帕奇-2.0 — 见 自由主义 详细情况.