mcpField
C
crossref-mcp-server

crossref-mcp-server

リモート
github.com/cyanheads検索4今日更新
リポジトリ

crossref-mcp-server について

crossref-mcp-serverは、Crossref REST APIを通じて学術研究や文献ワークフローを支援します。DOIの解決、学術文献の検索、参考文献や雑誌・資金提供者・出版社の情報取得に対応し、stdioとStreamable HTTPを利用できます。

主な機能

  1. 01DOIから学術文献メタデータを取得
  2. 02テキストや構造化条件で文献を検索
  3. 03文献の引用参考文献を取得
  4. 04ISSNやタイトルで雑誌を検索
  5. 05資金提供者と助成対象文献を検索
  6. 06出版社とDOIプレフィックスを照会

活用シーン

  1. 01著者、抄録、出版情報の取得
  2. 02テーマ、著者、条件による学術文献検索
  3. 03論文が引用する参考文献の確認
  4. 04雑誌、資金提供者、出版社情報の照合

MCP 対応

Crossrefの学術メタデータ用ツール7種類を、stdioまたはStreamable HTTP経由でMCPクライアントに公開します。公開ホスト型インスタンスも提供されています。

設定

リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。

エンドポイントhttps://crossref.caseyjhand.com/mcp
インストールコマンドをコピー
Claude CodeTerminal
Cursor.cursor/mcp.json
VS Code.vscode/mcp.json
Claude Desktopclaude_desktop_config.json
Windsurf~/.codeium/windsurf/mcp_config.json

コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。

パッケージ
npm@cyanheads/crossref-mcp-server0.5.0

ツール

7
パラメーター型必須説明
doistringはいDOI。形式は "10.NNNN/suffix"。例:"10.1038/nature12373"。リゾルバー付き形式("https://doi.org/10.1038/nature12373"、"https://dx.doi.org/…"、"doi:10.1038/nature12373")も受け付け、リゾルバー部分を取り除きます。
limitintegerいいえ1ページに返す著者の最大数(1~500、既定値 25)。通常のレコードは1ページに収まりますが、素粒子物理学やゲノミクス分野の大規模な共同研究論文では、数千名の著者が登録されている場合があります。
offsetintegerいいえ返す最初の著者のゼロ始まりインデックス。前回の応答の nextOffset を渡すと、長い著者リストの続きを取得できます。ページ分割されるのは著者リストのみです。レコードの他のすべてのフィールドは、各ページで完全に返されます。

詳細

@cyanheads/crossref-mcp-server

DOI を解決し、約 1 億 8,800 万件の学術論文を検索し、参考文献を取得して、Crossref REST API 経由で出版社を調べます。STDIO または Streamable HTTP に対応しています。

7 個のツール

Version License Docker MCP SDK npm TypeScript Bun

Install in Claude Desktop Install in Cursor Install in VS Code

Framework

公開ホスト型サーバー: https://crossref.caseyjhand.com/mcp


概要

Crossref REST API の学術メタデータを利用できます。DOI を完全なメタデータレコードに解決し、フリーテキストまたは構造化フィルターで約 1 億 8,800 万件の学術論文を検索し、引用文献リストを取得し、学術誌、資金提供機関、出版社を調べられます。

ツール
ツール説明
crossref_get_workDOI を Crossref の完全なメタデータレコードに解決します。タイトル、著者、編集者、所属、要旨、巻号・ページを含む学術誌情報、ISSN と ISBN、出版日、ライセンス、全文へのリンク、資金提供機関の謝辞、出版後の更新情報、関連識別子を取得します
crossref_search_worksCrossref の論文インデックスをフリーテキストや構造化フィルターで検索します。フィールド指定のクエリパラメーター、並べ替え、フィールド選択、オフセットまたはカーソル方式のページネーションに対応しています
crossref_get_referencesDOI の引用文献リスト(この論文が引用している論文)を返します。引用文字列と、利用可能な場合は解決済みの DOI を含みます
crossref_search_journalsISSN またはタイトルのクエリで Crossref の学術誌レコードを検索します。オプションで、その学術誌の最新論文のページを取得できます
crossref_search_funders名前、レジストリ ID、または資金提供機関の DOI で Crossref Funder Registry の資金提供機関を検索します。オプションで、資金提供を受けた論文のページを取得できます
crossref_get_memberCrossref メンバー ID を出版社レコードに解決します。名前、所有する DOI プレフィックス、DOI 件数、カテゴリ別のメタデータ登録状況を取得します
crossref_get_prefixDOI プレフィックス(例:10.1038)を所有する出版社に解決し、crossref_get_member へ連携します

機能リファレンス

crossref_get_work ツール
  • 上流への呼び出し前に、DOI が 10.NNNN/suffix の正規表現に照らして検証されます。DOI 単体、またはリゾルバー(https://doi.org/…、https://dx.doi.org/…、doi:…)でラップされた形式を受け付け、検索前にラップを解除します
  • タイトル、所属機関付きの著者、抄録(登録されている場合)、掲載誌・ジャーナル、出版日、著作物の種類、ISSN、ライセンス URL、全文へのリンク URL、資金提供者の謝辞を返します
  • 引用位置情報の volume、issue、page、articleNumber は、crossref_search_works と同じ名前で、同じレンダリング行に返されます。さらに isbn も返されます。いずれも登録内容のとおりで、存在しない場合は省略されます
  • 著者エントリーと同じ形式の editors を、全件返します。authorCount には含まれません
  • 著者リストは offset/limit でページ分割されます(デフォルトは 25、1 回の呼び出しで最大 500 件です。limit が 500 を超える場合は 500 に制限され、notice が返されます)。authorCount は登録された著者の総数を示し、著者が残っている場合は nextOffset を使って取得を続けられます。それ以外のすべてのフィールドは、各ページで全件返されます
  • updatedBy には、Crossref がその著作物に対して記録している訂正、撤回、懸念表明、新版が列挙されます。各エントリーには、通知 DOI、種類、情報源(publisher または retraction-watch。レコード ID も含む)、日付が記載されます。updateTo には、このレコードが通知対象としている著作物が記載されます。updatedBy が存在する場合、notice には各更新の種類と情報源が記載されます。updatedBy が存在しないからといって、その著作物が更新されたことがないとは限りません
  • relations には、関連する識別子(プレプリント ↔ 出版版、各種版、レビュー、補足資料)が、関係の種類、識別子の種類、主張元ごとにまとめて全件返されます。これらのうち、このツールで解決できるのは Crossref に登録された DOI のみです
  • 資金提供者または所属機関が ROR レジストリによってのみ示され(名前が登録されていない場合)、空欄のエントリーにはならず、name の代わりに ror が含まれます
  • 出版日は、値が記載されている published、published-print、published-online、issued のうち、最初のものになります(このツールのみ)。Crossref で不明と記録されている日付の要素は省略され、それより精度の低い要素もすべて省略されます
  • 外向きの参考文献は件数(referencesCount)で報告され、各エントリーは crossref_get_references から取得されます。被引用数(isReferencedByCount)も含まれますが、Crossref は引用している著作物を公開していません。引用関係のグラフには OpenAlex を使用してください
  • Crossref にレコードがない DOI の場合は doi_not_found を返します。このエラーには、DOI レジストリが示す登録機関(registrationAgency — DataCite、JaLC、mEDRA など)、Crossref が登録した場合の Funder Registry への参照、または登録機関がない旨が記載されます

crossref_search_works ツール
  • Crossref のハイフン付きキー(from-pub-date、type、funder、issn、has-abstract、license.url など)を使う構造化されたfilterオブジェクトと、フリーテキストのqueryを指定します
  • フィールドを指定するパラメーターqueryTitle、queryAuthor、queryContainerTitle、queryBibliographicは、queryおよび互いに組み合わせて使用できます
  • relevance、score、is-referenced-by-count、published、depositedなど、一覧にあるフィールドで並べ替えます。Crossref がカーソル指定での使用を拒否するため、出版日による並べ替えではoffsetのみ使用できます。検索語を指定し、sortを指定せずにカーソルでページをたどると、関連度順で実行されます(sort=scoreとして送信され、orderは指定されません)。ページ境界でレコードが重複したり、抜けたりすることがあります。sort: "created"を指定すると、重複せずにページをたどれます。フィルターのみを指定した場合は、Crossref への登録順にページをたどります
  • fieldsを指定すると、サマリーで投影される19個の選択可能なフィールド名のいずれかにペイロードを絞り込めます。これには、引用位置情報のvolume、issue、page、article-number、ISSNと、更新リンクのupdated-by、update-toが含まれます。それ以外の名前は拒否されます。DOIは常に返され、レコードの残りの情報はcrossref_get_workで取得できます
  • 各論文には、エントリーの形式とcrossref_get_workが使用する表示行にupdatedBy(その論文に関連付けられた訂正、撤回、懸念表明、新しいバージョン)とupdateTo(その論文が通知対象としている論文)が含まれます。そのため、DOIごとに呼び出すことなく、検索結果ページから撤回論文を絞り込めます
  • 空または空白のみの検索語やフィルター値、および空のsortやorderは、未指定として扱われます。その結果、検索条件が何も残らない場合、noticeにはページがフィルターなしの一覧であることが示されます
  • rowsでは1回の呼び出しで最大100件の論文を取得でき、authorLimitでは論文ごとの著者数を制限できます(デフォルトは25、最大500)。どちらかに上限を超える値を指定すると、上限値に調整され、noticeが返されます。offsetを指定したページでは、返されたレコードの次から続けるためのoffsetも示されます(約10Kの上限に近い場合は、そのoffsetとともに指定できる、より小さいrowsも示されます)。authorCountは登録済みの著者の合計を報告します。途中で切り詰められた論文の残りを取得するには、そのDOIをcrossref_get_workに渡します
  • offset + rows ≤ 10,000がページングの上限です。上限未満のoffsetが拒否された場合、引き続き指定できるrowsが示されます。cursor="*"を指定すると、nextCursorトークンを連鎖させて深いページングを開始できます。カーソルとoffsetは併用できません
  • カーソルによるページングは、nextCursorが省略されたページで終了します。空のページにnextCursorが含まれることはありません。空のページでは、必ずnoticeに3つの原因のうち該当するものが示されます

crossref_get_references ツール
  • 引用元論文のDOIを、crossref_get_workが受け付けるのと同じ形式で、DOI単体またはリゾルバーでラップした形式で渡します
  • 各参考文献には、登録済みの引用文字列が含まれます。Crossref が解決できた場合はcrossref_get_workで使えるDOIも含まれ、doiAssertedByには、そのDOIが出版社によって登録されたものか、Crossref が照合したものかが示されます
  • 登録された構造化情報には、著者、年、論文タイトル、ジャーナル名、引用された書籍または巻のタイトル(論文タイトルがない場合はタイトルとして使われるvolumeTitle)、シリーズ名、巻、号、開始ページ、版、ISSNが含まれます
  • 引用文字列から書式設定のマークアップが除去され、文字参照がデコードされます。認識済みのタグではない角括弧付きの文字列(引用されたURL、Miller指数、DOIの断片)は、登録時のまま保持されます
  • offset/limitでページングします(デフォルトは100、1回の呼び出しで最大500件です。limitが500を超える場合は500に調整され、noticeが返されます)。referenceCountは登録済みの合計を示し、さらに結果がある場合はnextOffsetで続けられます
  • 収録状況は出版社によって異なります。2000年以前の論文や、参加していない出版社の論文では、索引付けされた参考文献がないことがよくあります
  • 1段階のみをたどります。Crossref では被引用文献を取得できません。引用ネットワークにはOpenAlexを使用してください
  • Crossref にレコードがないDOIを指定すると、crossref_get_workと同様に、登録機関(registrationAgency)を示すか、登録した機関がないことを示すdoi_not_foundが返されます

crossref_search_journals tool
  • include_works: trueを指定すると、ジャーナルの最新の著作物のページも返します。works_offsetでは新しく出版された順、works_cursorによるカーソル走査では新しく登録された順になります。曖昧さのないジャーナルが必要です。タイトル検索で複数に一致した場合は、候補とISSNを示すambiguous_journalが返されます
  • ジャーナルのタイトル、出版社、印刷版・電子版の別を含むISSN、分野、DOI数(合計/現行/バックファイル)、およびカテゴリ別のメタデータ登録状況(抄録、参考文献、ORCID、助成機関、ライセンスなど)を現行/バックファイルの割合として返します。同じ内訳はcrossref_get_memberで出版社ごとに確認できます
  • issn検索では、発行年別のDOI数も昇順で返します。タイトル検索の結果には含まれません
  • タイトル検索の結果はoffsetでページ分割されます(上限:offset + rows ≤ 100,000)。著作物リストはworks_offsetで別途ページ分割されます(上限:≤ 10,000)。どちらかのリストで終端を超えるオフセットを指定すると、そのリスト名を示すnoticeが返されます。また、どちらかの上限でページ取得が停止した場合も、上限未満の最後のレコードに到達できるオフセットと、より小さいrowsを示すnoticeが返されます
  • works_cursor="*"を指定すると、nextWorksCursorトークンを連鎖させて、上限なしで著作物リストをページ分割できます。カーソル走査はCrossrefへの登録日順(新しい順)で行われます(Crossrefでは、出版日順のカーソル走査はできません)。works_offset > 0との併用はできません(works_cursor_offset_conflict)
  • ISSNが登録されていない一致ジャーナルには、アドレス指定可能な著作物リストがありません。その場合、空のリストを返すのではなく、include_worksはスキップされ、noticeが返されます

crossref_search_funders tool
  • 名前のquery、レジストリID(100000001)、または完全な助成機関DOI(10.13039/100000001。doi:/https://doi.org/プレフィックスを付けることもできます)を受け付けます
  • include_works: trueを指定すると、助成を受けた著作物のページも返します。曖昧さのない助成機関が必要です。名前検索で複数に一致した場合は、候補とレジストリIDを示すambiguous_funderが返されます
  • 助成機関名、レジストリID、国、別名を返します
  • 名前検索の結果はoffsetでページ分割されます(上限:≤ 100,000)。助成を受けた著作物のリストは、works_offset(上限:≤ 10,000)で別途ページ分割するか、上限なしのworks_cursor="*"とnextWorksCursorの連鎖でページ分割できます。オフセットによるページは新しく出版された順、カーソル走査は新しく登録された順になり、両者は併用できません(works_offset > 0)。どちらかのリストで終端を超えるオフセットを指定すると、そのリスト名を示すnoticeが返されます。また、どちらかの上限でページ取得が停止した場合は、上限未満の最後のレコードに到達できるオフセットと、より小さいrowsが示されます
  • 助成を受けた著作物のリストには、助成機関のレジストリ上の子孫が助成した著作物も含まれます。これはcrossref_search_worksで{"funder": "10.13039/<id>"}をフィルターに指定した場合には含まれません
  • 廃止されたレジストリエントリは、後継の名前で検索できますが、集計されるのはそのエントリ自身の著作物のみです。レスポンスのnoticeには、replacedByを使って置き換え先のIDが示されます。置き換え先は自動的にはたどりません

crossref_get_member tool
  • メンバーとはDOIを登録する組織です。このツールでは、「この出版社は何を出版しているか、メタデータをどの程度完全に登録しているか」を確認できます
  • 正式名称、別のインプリント名、所有するDOIプレフィックス、DOI数(合計/現行/バックファイル)、著作物タイプ別の内訳、およびカテゴリ別のメタデータ登録状況(参考文献、抄録、ORCID、助成機関、ライセンスなど)を現行/バックファイルの割合として返します
  • DOIプレフィックスから先にメンバーIDを特定するには、crossref_get_prefixと組み合わせてください

crossref_get_prefix ツール
  • DOI の登録者プレフィックス(例:10.1038、/suffix なし)を受け付けます
  • 出版社名と数値のメンバー ID を返します。この ID は完全なレコードを取得するために、そのまま crossref_get_member に渡せます
  • Crossref のプレフィックスレコードは、設計上、情報が最小限です(所有者名とメンバーへのリンクのみ)。より詳細な出版社データはメンバーレコードにあります
  • Crossref メンバーが存在しないプレフィックスの場合、登録機関を示す registrationAgency(例:10.5281 の DataCite)を含む prefix_not_found を返すか、登録機関がないことを示します

機能

@cyanheads/mcp-ts-core を基盤としており、stdio および Streamable HTTP トランスポート、切り替え可能な認証(none / jwt / oauth)、切り替え可能なストレージ(in-memory、filesystem、Supabase、Cloudflare KV/R2/D1)、オプションの OpenTelemetry トレーシングに対応した構造化ログを備えています。

Crossref 固有の機能:

  • Crossref へのすべてのリクエストに、ポライトプール用の User-Agent ヘッダーを付与します。CROSSREF_MAILTO を設定すると優先アクセスが可能になり、未設定の場合はキーなしで利用できます。API トークンは不要です
  • 429(Retry-After を尊重)、5xx、HTTP 408/504、ネットワーク障害時には、指数バックオフで再試行します。不正なレスポンス本文、および CROSSREF_TIMEOUT_MS に達したリクエストは再試行しません
  • works 検索および works の両サブリソースでカーソルベースの深いページングに対応し、オフセットの上限を超える結果セットを取得できます
  • Crossref によるリクエストの拒否は、宣言された理由として返されます。unknown_filter(Crossref がハイフン付きのキーを示す場合はそのキーを含む)、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、日付フィールドを信頼できます
  • 部分的な失敗への適切な対応 — 空のページはエラーではなく成功です。リストの末尾を超えるオフセットや、該当する結果がないクエリには、その旨を示す notice が付きます。また、crossref_search_works のカーソルウォークが終了するページにも notice が付きます。ジャーナルまたは資金提供者の works ウォークは、nextWorksCursor がないページで終了します
  • 判別可能な出力コントラクト — リストの取得が完了すると、続きのフィールド nextCursor、nextOffset、nextWorksOffset、nextWorksCursor は省略されます。オフセット上限で停止するページには、その旨を示す notice が付きます。最後の部分ページにはカーソルトークンが含まれる場合がありますが、その後の空ページには含まれません
  • 曖昧さへの明示的な対応 — ambiguous_journal と ambiguous_funder は、最初の候補に暗黙的に決定するのではなく、すべての候補とその識別子をエラーデータに列挙します

はじめに

公開ホストインスタンス

https://crossref.caseyjhand.com/mcp で公開インスタンスを利用できます。インストールは不要です。Streamable HTTP 経由で、任意の MCP クライアントを接続してください。

{
  "mcpServers": {
    "crossref-mcp-server": {
      "type": "streamable-http",
      "url": "https://crossref.caseyjhand.com/mcp"
    }
  }
}
セルフホスト/ローカル

以下を MCP クライアントの設定ファイルに追加してください。CROSSREF_MAILTO は任意ですが、設定を推奨します。未設定の場合、サーバーは Crossref の匿名プールを使用し、レート制限がより厳しくなります。

{
  "mcpServers": {
    "crossref-mcp-server": {
      "type": "stdio",
      "command": "bunx",
      "args": ["@cyanheads/crossref-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info",
        "CROSSREF_MAILTO": "[email protected]"
      }
    }
  }
}

または npx を使用する場合(Bun は不要です):

{
  "mcpServers": {
    "crossref-mcp-server": {
      "type": "stdio",
      "command": "npx",
      "args": ["-y", "@cyanheads/crossref-mcp-server@latest"],
      "env": {
        "MCP_TRANSPORT_TYPE": "stdio",
        "MCP_LOG_LEVEL": "info",
        "CROSSREF_MAILTO": "[email protected]"
      }
    }
  }
}

または Docker を使用する場合:

{
  "mcpServers": {
    "crossref-mcp-server": {
      "type": "stdio",
      "command": "docker",
      "args": [
        "run", "-i", "--rm",
        "-e", "MCP_TRANSPORT_TYPE=stdio",
        "-e", "[email protected]",
        "ghcr.io/cyanheads/crossref-mcp-server:latest"
      ]
    }
  }
}

Streamable HTTP を使用するには、トランスポートを設定してサーバーを起動します。

MCP_TRANSPORT_TYPE=http MCP_HTTP_PORT=3010 [email protected] bun run start:http
# Server listens at http://localhost:3010/mcp
前提条件
  • Bun v1.4.0 以降(または Node.js v24 以降)。
  • CROSSREF_MAILTO 用のメールアドレスは任意ですが、設定を推奨します。Crossref のポライトプールでは、身元を明示するクライアントが優先的にアクセスできます。アカウントやトークンは不要です。
インストール
  1. リポジトリをクローンします:
git clone https://github.com/cyanheads/crossref-mcp-server.git
  1. ディレクトリに移動します:
cd crossref-mcp-server
  1. 依存関係をインストールします:
bun install
  1. 環境を設定します:
cp .env.example .env
# edit .env and optionally set CROSSREF_MAILTO for polite-pool access

設定

すべての設定は、src/config/server-config.ts にある Zod スキーマを使用して起動時に検証されます。

変数説明デフォルト
CROSSREF_MAILTOCrossref リクエストごとの User-Agent ヘッダーに含める、polite-pool 用のメールアドレスです。任意です。未設定でもサーバーは起動しますが、警告が記録され、より厳しいレート制限が適用される匿名プールが使用されます。この値が DOI レジストリに送信されることはありません。Crossref で見つからなかった場合のエージェンシー検索で送信されるのは、サーバーとバージョンの情報のみです。—
CROSSREF_BASE_URLCrossref API のベース URL です。ローカルプロキシを使ったテスト用に上書きできます。Crossref で見つからなかった場合のエージェンシー検索は、この値の設定にかかわらず常に https://doi.org に送信されます。https://api.crossref.org
CROSSREF_TIMEOUT_MSリクエストごとのタイムアウト(ミリ秒)です。応答のない上流に対する最悪の場合の待機時間でもあります。期限に達したリクエストは再試行されません。10000
MCP_TRANSPORT_TYPEトランスポートです。stdio または http を指定します。stdio
MCP_SESSION_MODEHTTP セッションモードです。auto、stateful、または stateless を指定します。このサーバーでは複数ラウンドの入力が不要なため、src/index.ts で stateless を宣言しています。Docker と .env.example でも同じ値を固定しており、この変数を設定すると宣言が上書きされます。stateless(src/ で宣言)
MCP_HTTP_PORTHTTP サーバーのポートです。3010
MCP_AUTH_MODE認証モードです。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_ENABLEDOpenTelemetry インストゥルメンテーションを有効にします。false

任意の上書き設定の一覧については、.env.example を参照してください。

サーバーの実行

ローカル開発
  • ビルドして実行します:

    # 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
    

プロジェクト構成

ディレクトリ用途
src/index.tscreateApp() のエントリーポイントです。ツールを登録し、サービスを初期化します。
src/configサーバー固有の環境変数の解析と、Zod による検証を行います。
src/mcp-server/toolsツール定義(*.tool.ts)です。
src/services/crossrefCrossrefService です。HTTP クライアント、polite-pool ヘッダー、再試行、ページネーション用ヘルパーを提供します。
tests/src/ の構成に対応する単体テストと統合テストです。

開発ガイド

開発ガイドラインとアーキテクチャ上のルールについては、CLAUDE.md を参照してください。要点は次のとおりです。

  • ハンドラーは例外をスローし、フレームワークが捕捉します。ツールのロジック内で try/catch を使わないでください。
  • リクエスト単位のログには ctx.log を、テナント単位のストレージには ctx.state を使用してください。
  • 新しいツールは、src/mcp-server/tools/definitions/index.ts のバレル経由で登録してください。
  • 外部 API 呼び出しはラップしてください。生データを検証し、ドメイン型に正規化してから、出力スキーマに沿った結果を返します。欠損フィールドを捏造しないでください(Crossref のレコードでは、要約、参考文献一覧、所属情報が頻繁に欠落しています)。

コントリビューション

Issue を歓迎します。提出前にチェックとテストを実行してください。

bun run devcheck
bun run test

ライセンス

Apache-2.0 — 詳細は LICENSE を参照してください。

コメント

MCP は初めてですか?

プロトコルの概要から最初のサーバーの導入まで、よくある疑問にまとめて答えます。

AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。