📡

Agent SkillsでActivityPub C2S実装作った

に公開
2026/04/12

Agent Skills

最近Agent Skillsに対応したAIエージェントMagicaを作りました。

https://gitlab.com/tkithrta/magica

Agent Skillsとはオープンスタンダードとして公開された、AIエージェントに特定のタスク実行を効率的に行わせるよう指示できるファイルセットのことで、SKILL.mdファイルとスクリプト、リファレンス、アセット用のサブディレクトリで構成されます。

https://gihyo.jp/article/2025/12/agent-skills-to-open-standard

このAgent SkillsはAPIを取得して最新のコンテキストを読ませることに向いていることが分かったので、地震情報を確認できるスキルを作りました。

https://gitlab.com/tkithrta/magica/-/blob/main/.magica/skills/get-earthquake-info/SKILL.md
https://gitlab.com/tkithrta/magica/-/blob/main/.magica/skills/get-earthquake-info/scripts/tool.py

$ magica "地震?"
Skills: print-utc-time, get-earthquake-info, get-agentskills-spec, fetch-activitypub-outbox
Tool: activate_skill {"skill_name": "get-earthquake-info"}
Tool: run_script {"skill_name": "get-earthquake-info", "script_path": "scripts/tool.py", "args": []}
Agent: 2025年12月22日21時38分頃、沖縄本島北西沖を震源とする地震がありました。震源の深さは約90km、地震の規模はM4.5、最大震度1を沖縄県で観測しています。この地震による津波の心配はありません。

Mastodonアカウント@UN_NERV@unnerv.jpのActivityPub outboxのJSONから情報を取得しています。
MastodonのcontentはHTMLを返すので、人間が読む場合は何らかの処理が必要ですが、LLMはHTMLの構造化によってコンテキストを理解できるようになっているので、HTMLをそのままLLMに渡しています。

さて、このスキルを作って思ったのですが、もしかしてAgent SkillsはActivityPubと非常に相性いいのではないでしょうか?

モチベーション

昨今のインターネットはとにかく生成AIのスクレイピングがひどいことになっていて、あちこちで訴訟が発生しています。

https://www.itmedia.co.jp/aiplus/articles/2512/01/news100.html
https://www.itmedia.co.jp/news/articles/2512/08/news071.html
https://gigazine.net/news/20251023-reddit-sues-perplexity/
https://gigazine.net/news/20251222-google-sues-serpapi/

これは決して生成AIがバカだからそうしているのではなく、インターネットの多くはHTML + CSS + JavaScriptで構成されているので、そこを解析せざるを得ないのです。

そもそもHTMLの解析は、サーバーは無駄に重くなるわ、著作権トラブルの火種になるわで、正直もう時代遅れの悪手になりつつあります。

そこで注目されているのがrobots.txtやhumans.txtのようなPlain Text, JSON API, oEmbed (JSON, XML), そしてActivityPubのようなセマンティック・ウェブです。

https://shkspr.mobi/blog/2025/12/stop-crawling-my-html-you-dickheads-use-the-api/

これらは、スクレイピングのようなHTMLを力技でこじ開ける不安定な手法とは違い、少ないリクエストで多くの情報を取得できる、コンピュータが読むことを想定して作られた正しい方法です。

作った

そんなわけでAgent Skillsで使えるActivityPub C2S実装を作りました。
その名もFetch ActivityPub Outbox。

LLMが理解しやすい名前をつけたので、めちゃくちゃダサい名前になりました。
Magica v1.4.0から使えます。

https://gitlab.com/tkithrta/magica/-/blob/main/.magica/skills/fetch-activitypub-outbox/SKILL.md
https://gitlab.com/tkithrta/magica/-/blob/main/.magica/skills/fetch-activitypub-outbox//scripts/tool.py

mkdir -p .magica/skills/fetch-activitypub-outbox/scripts
curl -fsSLo .magica/skills/fetch-activitypub-outbox/SKILL.md https://gitlab.com/tkithrta/magica/-/raw/main/.magica/skills/fetch-activitypub-outbox/SKILL.md
curl -fsSLo .magica/skills/fetch-activitypub-outbox/scripts/tool.py https://gitlab.com/tkithrta/magica/-/raw/main/.magica/skills/fetch-activitypub-outbox/scripts/tool.py
$ magica "@Mastodon@mastodon.socialの投稿を解説"
Skills: print-utc-time, get-earthquake-info, get-agentskills-spec, fetch-activitypub-outbox
Tool: activate_skill {"skill_name": "fetch-activitypub-outbox"}
Tool: run_script {"skill_name": "fetch-activitypub-outbox", "script_path": "scripts/tool.py", "args": ["@Mastodon@mastodon.social"]}
Agent: @Mastodon@mastodon.socialの投稿を解説します。
...

mastodon

こんな感じで使えます。

最初は「Mastodon公式アカウントの投稿を解説」みたいなプロンプトを投げましたが、「Mastodon公式アカウントって何や? ヘヴィメタルバンドのXアカウントでええんか?」みたいな感じになり、ちゃんとActivate Skillされなかったので、ActivityPubアカウントっぽい内容のプロンプトを投げるようにしましょう。

やっていることは人間がWebページを訪問して、内容をコピペしてChatGPTのチャットに貼り付け、何らかの作業をお願いしているのとさほど変わりませんが、少ないプロンプトとAPIコストで実現でき、生成AIのスクレイピングで発生している様々な問題を解決しています。

取得しているものはJSONだけですので、ひょっとするとHTML + CSS + JavaScriptで構成されているWebページを訪問するより負荷が少ないかもしれません。
Webブラウザを開く必要もないですからね。

スキルのPythonスクリプトはrequestsパッケージを使っていること以外、特に特別なことをしていないのでそのままActivityPub用ツールとして使うこともできます。

uv run .magica/skills/fetch-activitypub-outbox/scripts/tool.py @Mastodon@mastodon.social
{
  "json_array": [
    {
      "actor_name": "Mastodon",
      "actor_url": "https://mastodon.social/@Mastodon",
      "object_content": "<p>...</p>",
      "object_published": "...",
      "object_url": "..."
    },
    ...
  ]
}

このツールはGoogle AI Studio上でGemini 3 Pro Previewと話し合いながらバイブコーディングして作りました。
まだAIより私のほうがActivityPubについて詳しいみたいですが、Gemini 3 Pro Previewはかなり正確にActivityPubやMastodonの仕様を把握していたので、いよいよ私の立場が危うくなってきましたね。

おわりに

これは何度でも声に出して読みたい日本語なのですが、AIは仕事を減らすためにあってほしいので、AIを使うために仕事が増えるのは避けたいところです。
生成AIは正しく実装して正しく使えば無限の可能性がありますので、生成AIによってインターネットは終わったと嘆く前に、生成AIとAgent Skillsで様々なアイデアを実現してみてはいかがでしょうか。

Note

tkithrta

Agent Skills関連記事

https://zenn.dev/tkithrta/articles/f07b7b8cdb7d0c
https://zenn.dev/tkithrta/articles/94d8314647b974
https://zenn.dev/tkithrta/articles/10da2cece70df0

Discussion