crossref-mcp-server について
crossref-mcp-serverは、Crossref REST APIを通じて学術研究や文献ワークフローを支援します。DOIの解決、学術文献の検索、参考文献や雑誌・資金提供者・出版社の情報取得に対応し、stdioとStreamable HTTPを利用できます。
主な機能
- 01DOIから学術文献メタデータを取得
- 02テキストや構造化条件で文献を検索
- 03文献の引用参考文献を取得
- 04ISSNやタイトルで雑誌を検索
- 05資金提供者と助成対象文献を検索
- 06出版社とDOIプレフィックスを照会
活用シーン
- 01著者、抄録、出版情報の取得
- 02テーマ、著者、条件による学術文献検索
- 03論文が引用する参考文献の確認
- 04雑誌、資金提供者、出版社情報の照合
MCP 対応
Crossrefの学術メタデータ用ツール7種類を、stdioまたはStreamable HTTP経由でMCPクライアントに公開します。公開ホスト型インスタンスも提供されています。
設定
リモートサーバーはインストール不要です。クライアントを選んで設定をコピーするか、ワンクリックで導入できます。
https://crossref.caseyjhand.com/mcpclaude mcp add --transport http cyanheads-crossref https://crossref.caseyjhand.com/mcp{"mcpServers":{"cyanheads-crossref":{"type":"http","url":"https://crossref.caseyjhand.com/mcp"}}}Cursor で開く{"servers":{"cyanheads-crossref":{"type":"http","url":"https://crossref.caseyjhand.com/mcp"}}}VS Code で開く{"mcpServers":{"cyanheads-crossref":{"type":"http","url":"https://crossref.caseyjhand.com/mcp"}}}{"mcpServers":{"cyanheads-crossref":{"serverUrl":"https://crossref.caseyjhand.com/mcp"}}}コマンドはターミナルで実行し、JSON は各クライアントの MCP 設定に貼り付けて再起動します。認可が必要なサーバーは初回接続時にログインを求めます。
ツール
7| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| doi | string | はい | DOI。形式は "10.NNNN/suffix"。例:"10.1038/nature12373"。リゾルバー付き形式("https://doi.org/10.1038/nature12373"、"https://dx.doi.org/…"、"doi:10.1038/nature12373")も受け付け、リゾルバー部分を取り除きます。 |
| limit | integer | いいえ | 1ページに返す著者の最大数(1~500、既定値 25)。通常のレコードは1ページに収まりますが、素粒子物理学やゲノミクス分野の大規模な共同研究論文では、数千名の著者が登録されている場合があります。 |
| offset | integer | いいえ | 返す最初の著者のゼロ始まりインデックス。前回の応答の nextOffset を渡すと、長い著者リストの続きを取得できます。ページ分割されるのは著者リストのみです。レコードの他のすべてのフィールドは、各ページで完全に返されます。 |
詳細
@cyanheads/crossref-mcp-server
DOI を解決し、約 1 億 8,800 万件の学術論文を検索し、参考文献を取得して、Crossref REST API 経由で出版社を調べます。STDIO または Streamable HTTP に対応しています。
公開ホスト型サーバー: https://crossref.caseyjhand.com/mcp
概要
Crossref REST API の学術メタデータを利用できます。DOI を完全なメタデータレコードに解決し、フリーテキストまたは構造化フィルターで約 1 億 8,800 万件の学術論文を検索し、引用文献リストを取得し、学術誌、資金提供機関、出版社を調べられます。
ツール
| ツール | 説明 |
|---|---|
crossref_get_work | DOI を Crossref の完全なメタデータレコードに解決します。タイトル、著者、編集者、所属、要旨、巻号・ページを含む学術誌情報、ISSN と ISBN、出版日、ライセンス、全文へのリンク、資金提供機関の謝辞、出版後の更新情報、関連識別子を取得します |
crossref_search_works | Crossref の論文インデックスをフリーテキストや構造化フィルターで検索します。フィールド指定のクエリパラメーター、並べ替え、フィールド選択、オフセットまたはカーソル方式のページネーションに対応しています |
crossref_get_references | DOI の引用文献リスト(この論文が引用している論文)を返します。引用文字列と、利用可能な場合は解決済みの DOI を含みます |
crossref_search_journals | ISSN またはタイトルのクエリで Crossref の学術誌レコードを検索します。オプションで、その学術誌の最新論文のページを取得できます |
crossref_search_funders | 名前、レジストリ ID、または資金提供機関の DOI で Crossref Funder Registry の資金提供機関を検索します。オプションで、資金提供を受けた論文のページを取得できます |
crossref_get_member | Crossref メンバー ID を出版社レコードに解決します。名前、所有する DOI プレフィックス、DOI 件数、カテゴリ別のメタデータ登録状況を取得します |
crossref_get_prefix | DOI プレフィックス(例: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 のポライトプールでは、身元を明示するクライアントが優先的にアクセスできます。アカウントやトークンは不要です。
インストール
- リポジトリをクローンします:
git clone https://github.com/cyanheads/crossref-mcp-server.git
- ディレクトリに移動します:
cd crossref-mcp-server
- 依存関係をインストールします:
bun install
- 環境を設定します:
cp .env.example .env
# edit .env and optionally set CROSSREF_MAILTO for polite-pool access
設定
すべての設定は、src/config/server-config.ts にある Zod スキーマを使用して起動時に検証されます。
| 変数 | 説明 | デフォルト |
|---|---|---|
CROSSREF_MAILTO | Crossref リクエストごとの User-Agent ヘッダーに含める、polite-pool 用のメールアドレスです。任意です。未設定でもサーバーは起動しますが、警告が記録され、より厳しいレート制限が適用される匿名プールが使用されます。この値が DOI レジストリに送信されることはありません。Crossref で見つからなかった場合のエージェンシー検索で送信されるのは、サーバーとバージョンの情報のみです。 | — |
CROSSREF_BASE_URL | Crossref API のベース URL です。ローカルプロキシを使ったテスト用に上書きできます。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 を宣言しています。Docker と .env.example でも同じ値を固定しており、この変数を設定すると宣言が上書きされます。 | stateless(src/ で宣言) |
MCP_HTTP_PORT | HTTP サーバーのポートです。 | 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_ENABLED | OpenTelemetry インストゥルメンテーションを有効にします。 | 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.ts | createApp() のエントリーポイントです。ツールを登録し、サービスを初期化します。 |
src/config | サーバー固有の環境変数の解析と、Zod による検証を行います。 |
src/mcp-server/tools | ツール定義(*.tool.ts)です。 |
src/services/crossref | CrossrefService です。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 を参照してください。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。