Fedify CLIの隠れた便利機能：見逃しているかもしれないテクニック集

[Fedify](https://fedify.dev/)は主にActivityPubサーバーを構築するためのフレームワークとして知られていますが、同時に`fedify`というコマンドラインツールも提供しており、ActivityPubの実装をデバッグしテストするのに役立ちます。Fedifyフレームワークを使用しているかどうかに関わらず、このCLIツールはActivityPub開発において非常に重宝するツールです。

## インストール方法

機能を見ていく前に、まずは`fedify`コマンドをインストールする必要があります。以下のような複数のインストール方法があります：

npm（Node.js）を使う場合：
```sh
npm install -g @fedify/cli
```

Bunを使う場合：
```sh
bun install -g @fedify/cli
```

Denoを使う場合：
```sh
deno install -A --unstable-fs --unstable-kv --unstable-temporal -n fedify jsr:@fedify/cli
```

また、[リリースページ](https://github.com/dahlia/fedify/releases)からビルド済みの実行ファイルをダウンロードすることもできます。

詳しいインストール手順と要件については[公式ドキュメント](https://fedify.dev/cli#installation)をご確認ください。

## スマートなオブジェクト照会

`fedify lookup`コマンドは見た目以上に賢く、同じ識別子の様々な形式を扱えるほか、用途に応じて複数の出力形式を提供します：

```sh
# 同じアクターを照会する3つの同等な方法:
fedify lookup @user@example.com
fedify lookup user@example.com
fedify lookup acct:user@example.com

# 生のJSONレスポンスを表示:
fedify lookup --raw @user@example.com

# コンパクトなJSON-LD形式で表示:
fedify lookup --compact @user@example.com

# 完全に展開されたJSON-LDを表示:
fedify lookup --expanded @user@example.com
```

一部のActivityPubサーバーでは[authorized fetch](https://swicg.github.io/activitypub-http-signature/#authorized-fetch)（「セキュアモード」とも呼ばれる）が必要で、パブリックなコンテンツに対してもすべてのHTTP GETリクエストに署名が求められます。`-a`/`--authorized-fetch`オプションはこの場合に役立ちます：

```sh
fedify lookup --authorized-fetch @user@secure-instance.example
```

このコマンドは一時的なActivityPubサーバーを起動し、そのサーバーの鍵でリクエストに署名します。これは以下のような場合に特に便利です：

- すべてのリクエストに署名を要求するサーバー（セキュアモードのMastodonインスタンスなど）にアクセスする場合
- フォロワー限定の投稿など非公開コンテンツを取得する場合（適切な権限がある場合）
- 署名付きリクエストに対するサーバーの動作をテストする場合

## インタラクティブなインボックステスト

`fedify inbox`コマンドは連合をテストする手軽な手段を提供するだけでなく、受信したActivityPubアクティビティを調査するための強力なWeb UIも備えています。アクティビティを受信すると、以下のような詳細情報が表示されます：

- HTTPメソッドとヘッダー
- リクエストボディ（複数の形式で）
- レスポンスの詳細
- サーバーログ

![詳細なリクエスト情報を表示するfedify inboxのWebインターフェース](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/286030/2a108ea3-0aec-ce19-7961-b8daa0926f0c.png)

他のサーバーが送信したHTTPヘッダーを生で確認できるため、署名検証の問題やコンテントネゴシエーションの問題をデバッグする際に非常に役立ちます。インターフェースには以下のような異なる形式でアクティビティを表示するタブが用意されています：

- 生のHTTPリクエスト/レスポンス
- コンパクトなアクティビティ（正規化されたJSON-LD）
- 展開されたアクティビティ（完全に展開されたJSON-LD）
- 生のアクティビティ（受信したままの形式）
- サーバーログ

このコマンドは高度に設定可能で、どのフォローリクエストを受け入れるかを制御できます：

```sh
# 特定のアクターからのフォローのみを受け入れる
fedify inbox -a @specific@user.com -a @another@user.com

# すべてのフォローリクエストを受け入れる
fedify inbox -a "*"
```

## 見やすいNodeInfo表示

`fedify node`コマンドは、他のインスタンスの設定を理解するために、NodeInfoデータをユーザーフレンドリーな形式で可視化します：

```sh
# サーバーアイコン付きで標準的なNodeInfoデータを表示
fedify node mastodon.social

# インスタンスが公開している追加のメタデータを含める
fedify node -m mastodon.social

# 規格に準拠していないNodeInfoレスポンスの解析を試みる
fedify node --best-effort problematic-instance.social

# 高速化のためにfaviconの取得をスキップ
fedify node --no-favicon mastodon.social
```

## 柔軟なローカル開発

ActivityPubの実装をローカルでテストする際、`fedify tunnel`コマンドを使ってローカルサーバーを一時的にインターネットに公開できます。デフォルトのサービスがうまく動作しない場合は、複数のトンネリングサービスから選択できます：

```sh
# デフォルトのサービスを使用
fedify tunnel 3000

# 代替サービスを使用
fedify tunnel --service serveo.net 3000
```

## シェル統合

シェル補完を有効にすることで入力の手間を省けます。bash、fish、zshで利用可能です：

```sh
# bashの場合
source <(fedify completions bash)

# fishの場合
source (fedify completions fish | psub)

# zshの場合
source <(fedify completions zsh)
```

## Fedify 1.3.0の新機能：カスタム`User-Agent`のサポート

近日リリース予定のFedify 1.3.0では、サーバーログでリクエストを追跡しやすくするためのカスタム`User-Agent`ヘッダーを設定する機能が追加されます：

```sh
# lookupコマンドでカスタムUser-Agentを設定
fedify lookup --user-agent "MyApp/1.0" @user@example.com

# NodeInfoリクエストでカスタムUser-Agentを設定
fedify node --user-agent "MyApp/1.0" mastodon.social
```

----

これらの機能は、Fedify CLIを使い始めた時には気づきにくいかもしれませんが、連合に関する問題のデバッグやActivityPubの実装のテストを行う際に非常に役立ちます。