コンテンツにスキップ

stdio 版を動かす

12 ツール、トークン1本、ファイル1つ。リポジトリ側に先に要るものは InvenioRDM と繋ぐにある。

依存は標準ライブラリと mcp だけなので、 SDK のほかに入れるものは無い。

1. トークンを発行する

InvenioRDM のアプリケーションコンテナの中で実行する。

invenio tokens create -n mcp-stdio -u <メールアドレス> | tail -1 \
  | tr -d '\n' > "$PWD/.token"
chmod 600 "$PWD/.token"

UI から出すなら <InvenioRDM>/account/settings/applications/tokens/new/

作成・公開・下書きの破棄・ファイルの扱いは通常のアカウントで足りる。 公開レコードの取り下げと復元には admin ロールが要る。

サーバはまず INVENIO_TOKEN を見て、無ければ自分の隣の .token を読む。.token は gitignore してあり、600 のまま置くこと。.mcp.json に平文で書かないこと。

2. 自己署名 CA での TLS

検証は既定のまま有効にして、ルート CA を INVENIO_CA_BUNDLE で渡す。 サーバは SSL_CERT_FILE に頼らずファイルを直接開く。MCP クライアントの子プロセスとして 動くので、ログインシェルの環境が届かないことがあるためである。自分のディレクトリに ca.crt が在ればそれも読む。

3. クライアントに登録する

{
  "mcpServers": {
    "inveniordm": {
      "command": "python3",
      "args": ["/path/to/invenio-mcp/stdio/server.py"],
      "env": {
        "INVENIO_API": "https://invenio.example.org/api",
        "INVENIO_CA_BUNDLE": "/path/to/ca.crt",
        "MCP_LANG": "ja"
      }
    }
  }
}

設定を変えたらクライアントを再起動する。 起動済みのプロセスは古い環境変数のまま 動くし、接続一覧の ✔ は「起動できた」しか見ていない。

ツールは mcp__inveniordm__<name> として現れる。

4. 通しで確かめる

python3 stdio/server.py --selftest

作成 → 更新 → add_file → 公開 → 検索 → ソフト削除 → 復元 → ソフト削除 を実インスタンスに 対して走らせ、各段階を表示する。tombstone が残るので、捨ててよいデータのデモ インスタンスに向けること。

python3 stdio/server.py --version

12 のツール

説明と引数はツール一覧にある。

読取search_recordsget_record

作成と更新create_recordupdate_recordpublish_recordnew_version

削除delete_draftdelete_recordrestore_record

ファイルadd_filelist_filesdelete_file

create_record に要る最小のメタデータ

{
  "resource_type": {"id": "dataset"},
  "title": "3文字以上のタイトル",
  "publication_date": "2026-08-29",
  "creators": [
    {"person_or_org": {"type": "personal",
                       "family_name": "山田", "given_name": "太郎"}}
  ]
}

resource_type.id は語彙から取る(datasetpublication-article など)。 stdio 版に語彙ツールは無い——それは HTTP 版が足しているものの1つ——ので、 こちらでは値をあらかじめ知っている必要がある。

知っておくとよい違い

  • update_record はメタデータ全体を置き換える。 部分更新ではない。HTTP 版の update_record はマージする。
  • add_filesource_path を取る。 サーバが動いている機械の上のパスで、base64 の 上限を避けられる。ただしバイト列は web-api を通る。GB 級のファイルには HTTP 版start_multipart_upload を使うこと。
  • 権限分離は無い。 どのツールも、トークンにできることは全部できる。それが問題になる なら HTTP 版を使う。

安全のために

  • 書き込みは、捨ててよいデータのデモインスタンスに対して行うこと。
  • delete_recordconfirm=True を要求し、ソフト削除で、restore_record で戻せる。 ハード削除は REST に無いので、ここでもできない。
  • 権限を戻すにはトークンを消す(invenio tokens delete ...)。