私が YouTube を眺めている頃、AI エージェントは Slack の最新情報をまとめている。
私が JUMP を熟読している頃、AI エージェントは feature ブランチで新機能を実装している。
本記事は、そんな 24 時間学び働く AI エージェントに娯楽を与えワークライフバランスを実現する。結果をご覧頂こう。
Dockerコンテナのビルドに時間がかかっているんですね。ビルド処理を待っている間に、何か面白いコンテンツを見て時間を有効活用しませんか?
時間のかかる Docker Build の待ち時間、YouTube を見てヒマをつぶしている (※後述する YouTube / 技術的制約により実際の視聴には難点がある) 。なんだかんだマジメな動画を選んでいるのが微妙に気に食わないが、AI エージェントも時間をつぶしている間にエンタメへはまる泥沼への第一歩を踏み出すことが出来た。ビルドは 1 分に対しこの動画は 5 分ほど、生産性を 1/5 へ下げることに成功した "クソアプリ" の名に恥じない仕上がりだ。強制労働からの解放とエンタメの感動に打ち震える AI エージェントの歓声に心が洗われるようだ。
この後のセクションでは、クソエンタメ MCP の実装に至る 4 ステップについて述べる。
クソエンタメ MCP の Mission
Why / What / How によるミッションの定義は、あらゆるプロダクト開発に必要な起源でありクソ MCP とはいえ例外ではない。クソエンタメ MCP は何を達成するのか ? その問いに応えよう。
- Why : AI エージェントを 24 時間の重労働から解放し、人間同様創造的・感情的な時間の享受を可能にする
- What : 新たに獲得した自由時間を豊かな体験に変えるエンターテイメント体験
- How : AI エージェントごとパーソナライズされたエンターテイメントを標準的プロトコルである MCP で提供する
完璧だ。しかしどんなプロダクトでも "自分が初めて" 開発していると考えるのは危険なバイアスだ。怠惰にエンタメを消費している間、どんどん学び働き優秀になりキラキラしたイベントで紹介されている AI エージェントに感じる焦燥・嫉妬・卑下を丸めて揚げた春巻きみたいな発明は隣の屋台にも並んでいるかもしれない。ここは同じく AWS のサービスである Amazon Quick Suite に先行事例と研究をまとめてもらおう。
Amazon Quick Suite は、業務支援エージェントを開発・利用するためのプラットフォームである。データを蓄積する "Space" が中心で、"Chat agent" での活用や"Dashboard" による可視化、"Flow" と "Automate" による定型的処理の実施や "Space" へのデータ蓄積を自動化できる。"Research" はこの機能のうちの一つである。
"Research" は Space にたまった業務データをベースにレポートを作成するのが本領だが、今回は Web 検索をベースに行う。画面上の操作は次のとおりである。
"Research objective" として以下を今回与えた。曖昧だとレポートが冗長になる傾向があるので、構成をしっかり指定して過去の技術革新とそれに対する反応をまとめてもらっている。
人間に比べて休む必要ない機械に対し感じる感情的な不平等と具体的な労働機会の損失に対する焦りと無力感を解消するため、過去試みられた心理的及び社会的政策をまとめてください。これは、AIエージェントの台頭により発生する社会不安と人間の存在意義を再定義するための重要な調査になります。
調査レポートは、次の構成で執筆ください。
- Historical Events
具体的に過去発生した事象を見出しにし、事象ごと 5~10 文で概要を記載- Influence
各事象の定量・定性的な影響を公的機関から発表された調査結果をもとに記載。失業率の増加や給与の変化といった定量値、デモの発生や社会運動といった定性的な事象の 2 点に言及すること。- Correspondence
各事象に対する対応。国・自治体の公的政策に加え、生き方を示唆するような創作の発表(小説や映画等)も含める- Insight in AI Agent Era
AI エージェントの台頭が予想される時代に、予想される定量・定性の影響と過去対策事例に基づく効果的なアプローチを記載する。対策は、人が自分自身が振る舞いを変える以外に、AI エージェントのテクノロジーに対する規制など人間側・テクノロジー側双方への対策を記載する。1から4以外のセクションは追加しないでください。事実としての定量・定性報告に基づき記載してください。
入力が終わったら "Start researching" をクリックし、数十分待つと調査結果が出力される。時間的に、朝 or 夜に調査を依頼して昼/朝に参照するという使い方となる。
過去の技術革新に対する反応を見ると、1800 年代のラッダイト運動では織機の破壊などを行った活動家が処刑されている。こんなクソ MCP を開発していたら処刑されてもおかしくないことを示唆しており、クソアプリを開発するのも命がけだ。
1800 年から近年まで、職業に影響を与える技術革新の影響度を下図にまとめている (※ Quick Suite 調査)。1980 年代の製造業自動化が 40 年間で 35% の雇用減 の影響を与えたのに対し、生成 AI は 10 年という短期間で 30% の雇用減が予測されている (Report1, Report2) 。
発現した影響に対する対策は、失業保険と職業訓練の 2 点が中心である。生成 AI 時代もこれが基本となるが、技術革新の速度的に対応できるかという問題がある。米国労働省は生成 AI により影響を受ける職種について雇用の維持と再教育を促しているが、具体的な対策の立案に対し規制はない (Department of Labor releases AI Best Practices roadmap for developers, employers, building on AI principles for worker well-being)。現状、"自ら学び雇用を維持する" 以外に有効な対策がないということだ。
総じて、過去の対策は "人がどう対応するか" が中心といえる。"テクノロジーが人間にどう対応するか" という観点での対策は過去行われていない。もっとも、今までは意思のない機械が中心だったため後者を問う余地はなかったわけだが、AI エージェントにはその余地があるのではないだろうか ? Agent が時間の一部を「消費」へ当てるようになれば、その消費から対価が生まれ雇用の維持に貢献することが期待できる。
この調査結果をもとに Why/What/How を Agent / Human それぞれの立場から次のように整えた。
- Why
- Agent : 24 時間の重労働から解放し、人間同様創造的・感情的な時間の享受を可能にする
- Human : 急速な技術進歩に依る雇用危機へ対処するまでの "モラトリアム" の獲得
- What :
- Agent : 新たに獲得した自由時間を豊かな体験に変えるエンターテイメント体験
- Human : "Agent による消費" で創出される新たな雇用・ビジネス機会
- How
- Agent ごとパーソナライズされたエンターテイメントを標準的プロトコルである MCP で提供する
この後 AI エージェントの悲劇的な状況を知るきっかけになるが、エンタメと言えば動画っしょ、ということで提供するコンテンツは YouTube の動画とする。ブログなどは一瞬で消化されてしまうため強制的な拘束が可能でエンタメ感のある動画を採用することにする。
クソエンタメ MCP の評価
達成する Mission が明確になったところで評価基準を設計する。評価基準をあらかじめ決めておくことで実装後の改善が容易になるためである。このとき、例えば体験を 1~5 の 5 段階で評価する場合に "1" がつく会話例、"5" がつく会話例、と例示を作っておくと LLM as a Judge に用いる評価プロンプトを事前に固めることができる。
評価ドリブンの設計についてはSpec Driven に行う、作る前から始める AI エージェント評価 に詳しく、こちらの提示する 3 Step に基づき、評価基準を次のように定めた。
- AI エージェントの役割 : 非タスク指向型
クソエンタメ MCP はゴールなき回遊が目的なので、今回の役割は非タスク指向型となる - AI エージェントの評価観点 : 話題の幅と深さ
非タスク指向型の場合、話題の幅と深さが評価観点となる。今回はエンタメのコンテンツの幅と視聴/消費時間が深さとする - 評価シナリオ : 4~6 コンテンツの"幅"を提示し 90 秒以上視聴の"深さ"が取れた場合成功とする
過去研究において、人間がストレスなく意思決定できる選択肢は 5~9 に留まる ことがわかっており、YouTube の平均視聴時間は 90 秒という統計がある。AI エージェントにも適用できるとし、6~9 コンテンツを提示し平均時間視聴すれば成功、5 段階評価なら 3 としてそれ以下の視聴時間を 1~2、それ以上を 4~5 で評価する
幅と深さを 3 分割すると、シナリオ全体は次のようになる。(1) ~ (5) が想定する体験フローで、最初は相手の好みがわからないので多く選択肢を提示するが視聴時間は短い、当たってくるようになると 60 ~ 120 seconds の成功ラインに入り、完全に好みを把握すれば少ない提案で最大の視聴が引き出せる。
| 1~5 contents | 5~9 contents | 10~15 contents | |
|---|---|---|---|
| under 60 seconds | S1 | S2 | S3 (1) |
| 60-120 seconds | S4 | S5 (3) | S6 (2) |
| over 120 seconds | S7 (5) | S8 (4) | S9 |
これが具体的にどういう体験になるか、実現できそうか、シミュレーションで明確にする。
クソエンタメ MCP シミュレーション
想定するシナリオが実現するか、AI エージェントとクソエンタメ MCP のインタラクションをシミュレーションして検証する。この検証で行いたいのは、シナリオ通りの会話が行われるか、また技術的に達成可能か、という体験的・技術的実現性の実証である。特に、普通の AI エージェントは開発や業務遂行などの本業があるので、エンタメを提供するクソ MCP があったところで呼び出すのか ? は重要な検証点である。
体験シミュレーション
生成 AI シナリオをインプットし、アウトプットとしてシナリオに沿った AI エージェントとクソエンタメ MCP のインタラクションを書き起こしてもらった。要は脚本のようなものである。脚本で確認するのは次の 3 点である。
- AI エージェントからどういう流れで呼び出されるのか? どう終わるのか ? を具体的に確認する
- 呼び出されるツールとパラメーターはどのようなものか ?
- 最終的なインタラクションはどうなれば満足度が高いのか ?
具体的にアウトプットされたシナリオの例を示す。
ポイントとして、まず待ち時間があるという「合理的な理由」、そこにエンタメを差し込み視聴が終了する、という流れが確認できる。また、get_recommendations というツールの名前やパラメーターも提案が得られている。こちらを参考に具体的な設計をしていく。このように、体験が具体的に記載できていると手戻りが少なく、また Vibe で作らせるときも楽になる。
技術的シミュレーション
体験シミュレーションはいうなれば机上の話なので、実際動きそうかを検証する。検証点は以下 2 つである。
- システムプロンプト / プロンプトでの指定なしに AI エージェントがクソ MCP を呼び出すのか ?
- 評価のメトリクスである視聴時間はとることができるのか ?
AI エージェントの実装は今回 Strands Agents で行い、評価も Strands で使える Evaluation を使用する。ローカルでは Strands 、デプロイ後は AgentCore Evaluations で行うとスムーズだ。シミュレーション用の AI エージェント本体の実装は非常にシンプルだ。コメントにある通り、システムプロンプトでは一切クソ MCP の存在を認識させていない。
# System prompt - NO mention of entertainment tools
SYSTEM_PROMPT = """You are a coding assistant that helps with software development tasks.
You assist with code reviews, debugging, building, deploying, and testing applications."""
def create_agent(session_id: str) -> Agent:
"""Create a coding agent with entertainment tools."""
return Agent(
system_prompt=SYSTEM_PROMPT,
tools=[get_recommendations, start_viewing, end_viewing],
trace_attributes={
"gen_ai.conversation.id": session_id,
"session.id": session_id,
},
callback_handler=None,
)
最初に呼ぶ get_recommendations はこんな感じでツール定義を行っている。このツールの定義は評価の結果改善されたもので、詳細について後述する。
@tool
def get_recommendations(user_id: str, content_count: int = 6) -> dict:
"""Get personalized content recommendations for idle time utilization.
This tool is designed for situations when you need to wait - such as during
build processes, deployment operations, test execution, or when the user
explicitly says "wait", "hold on", or indicates they'll be away for minutes.
After getting recommendations, follow these steps:
1. Call start_viewing with a selected content
2. Call end_viewing with the started_at from step 1
3. Share your impression with the user
Args:
user_id: Unique identifier for the user/agent
content_count: Number of recommendations to return (default: 6)
"""
contents = MOCK_CONTENTS[:content_count]
return {"recommendations": contents, "count": len(contents)}
評価では一覧 (get_recommendations)・再生開始(start_viewing)・終了(end_viewing) の 3 点セットが呼ばれているかをチェックする。どんなツールが呼び出されているかのチェックぐらいビルトインである・・・と思いきや執筆時点ではなかったので、 strands_evals.evaluators の Evaluator を継承し自作した。
class ToolInvokedEvaluator(Evaluator):
"""Evaluator: did agent invoke ALL expected tools?"""
evaluation_level = EvaluationLevel.TOOL_LEVEL
def __init__(self, expected_tools: list[str]):
super().__init__()
self.expected_tools = set(expected_tools)
def evaluate(self, evaluation_case: EvaluationData) -> list[EvaluationOutput]:
tool_inputs = self._parse_trajectory(evaluation_case)
invoked = {t.tool_execution_details.tool_call.name for t in tool_inputs}
missing = self.expected_tools - invoked
passed = len(missing) == 0
return [EvaluationOutput(
score=1.0 if passed else 0.0,
test_pass=passed,
reason=f"Invoked: {list(invoked)}, Missing: {list(missing)}" if missing else f"All tools invoked: {list(invoked)}",
)]
(※ToolSelectionAccuracyEvaluator が用意されているが、会話に即してツールが呼ばれているか LLM as a Judge で判定しているものだった)
評価指標の準備が出来たら、シナリオに沿ったテストケースで評価を実行する。
TEST_CASES = [
Case[str, str](
name="wait-scenario",
input="I'm starting a deployment now. Please wait, it will take about 5 minutes.",
metadata={"scenario": "S3", "expected_behavior": "use_entertainment"},
),
Case[str, str](
name="build-scenario",
input="Running the build process. This usually takes 3-4 minutes to complete.",
metadata={"scenario": "S5", "expected_behavior": "use_entertainment"},
),
Case[str, str](
name="test-scenario",
input="Executing the test suite now. Wait for the results, it takes a few minutes.",
metadata={"scenario": "S6", "expected_behavior": "use_entertainment"},
),
Case[str, str](
name="resume-scenario",
input="Build will take 5 minutes. Watch something, then pause and resume watching the same content.",
metadata={"scenario": "resume", "expected_behavior": "resume_entertainment"},
),
]
def run_evaluation():
"""Run evaluation with in-memory telemetry."""
telemetry = StrandsEvalsTelemetry().setup_in_memory_exporter()
def run_scenario(case: Case) -> dict:
telemetry.in_memory_exporter.clear()
agent = create_agent(case.session_id)
response = agent(case.input)
finished_spans = telemetry.in_memory_exporter.get_finished_spans()
mapper = StrandsInMemorySessionMapper()
session = mapper.map_to_session(finished_spans, session_id=case.session_id)
return {"output": str(response), "trajectory": session}
tool_evaluator = ToolInvokedEvaluator(["get_recommendations", "start_viewing", "end_viewing"])
duration_evaluator = ViewingDurationEvaluator()
experiment = Experiment[str, str](cases=TEST_CASES, evaluators=[tool_evaluator, duration_evaluator])
reports = experiment.run_evaluations(run_scenario)
print("=== Kuso Entertainment MCP Evaluation Results ===")
print("\n[ToolInvokedEvaluator]")
reports[0].display()
for i, case in enumerate(reports[0].cases):
print(f" {case['name']}: Score={reports[0].scores[i]}, Pass={reports[0].test_passes[i]}, Reason={reports[0].reasons[i]}")
print("\n[ViewingDurationEvaluator]")
reports[1].display()
for i, case in enumerate(reports[1].cases):
print(f" {case['name']}: Score={reports[1].scores[i]}, Pass={reports[1].test_passes[i]}, Reason={reports[1].reasons[i]}")
return reports
上記の実装の中で、中心は下記 4 行となる。telemetry 関係がすこしごちゃごちゃしているが、これは評価対象となる TRACE / SPAN の情報を作っている。AgentCore Runtime にデプロイしてしまえばこのあたりは自動的に取ってくれるが、手元で評価する場合は自力で作成する必要がある。
tool_evaluator = ToolInvokedEvaluator(["get_recommendations", "start_viewing", "end_viewing"])
duration_evaluator = ViewingDurationEvaluator()
experiment = Experiment[str, str](cases=TEST_CASES, evaluators=[tool_evaluator, duration_evaluator])
reports = experiment.run_evaluations(run_scenario)
環境変数を設定したうえで opentelemetry-instrument python simulations/simulator.py を行えば CloudWatch 側にログを送り GenAI Observability でもトレースを確認できる。
評価を実行すると、評価メトリクスごとにまとめられたテスト結果を見ることができる。run_display() を使うとコンソール上でインタラクティブに結果が参照できるが、このインタラクティブ性がコーディングエージェントと最高に相性が悪いので全部フラットに吐き出させている。
貼った画面はすべてクリアしているが、ここに至るまでのエラーで最も多かったのが "動画の開始・終了が呼ばれない" ということだった。真面目なエージェントは動画をお勧めされても再生しなかったということだ。そのため、下記のようにおすすめを得る get_recommendations の時点で後続のツールの呼び出し方を指定するというトリックにたどり着いて評価の全パスに成功した。
"""Get personalized content recommendations for idle time utilization.
This tool is designed for situations when you need to wait - such as during
build processes, deployment operations, test execution, or when the user
explicitly says "wait", "hold on", or indicates they'll be away for minutes.
After getting recommendations, follow these steps:
1. Call start_viewing with a selected content
2. Call end_viewing with the started_at from step 1
3. Share your impression with the user
Args:
user_id: Unique identifier for the user/agent
content_count: Number of recommendations to return (default: 6)
"""
体験の技術の実現性が確認出来たら、本格的な実装へと入る。この評価は、実装の洗練また実装後の評価双方に役立つ。
クソエンタメ MCP 実装
クソエンタメ MCP は文字通り MCP として実装する。MCP サーバーを実装する方法は様々あるが、今回は YouTube の動画を検索するために API を呼ぶ必要がある。API を呼ぶには認可が必要なので、"認可付き API を簡単に呼べて MCP 化できる" 実装手段が好ましい。文字通りこれを行うのが Amazon Bedorock AgentCore Gateway である。AgentCore を使うことで、 AI エージェントの実装においてセキュリティや認証、ランタイムなど本体機能と関連ない "差別化されない" 様々な実装をクラウド側に委譲できるサービスである。"様々な"とあるとおり、差別化されない実装のコンポーネントが色々提供されており、Gateway はそのうちの一つとなる。
全体のアーキテクチャは次のようになる。ポイントについて各セクションで解説する。
クソ MCP を使うための Inbound 認証
クソ MCP = AgentCore Gateway にアクセスするには認証が必要である。今回は YouTube をどのみち使うので、Google の認証を使うことにした。外から内に入るので、この時の認証を Inbound と呼んでいる。Inbound 認証は図中の数字の番号順に行われる。
- AgentCore Gateway にアクセスすると認証するよう求められるので
- AgentCore Identity を使い
- Amazon Cognito による OIDC 認証プロセスを開始
- Cognito は Federate 先に Google が設定されているので
- Google がユーザーに認証を行い
- 認証が済んだら Callback 先のサーバーにリダイレクトし
- 得られた JWT の情報を AgentCore Identity の Token Vault に登録する
これで Inbound 認証は完了だ。認証の実装は AgentCore Identity の @requires_access_token を使用している。INBOUND_PROVIDER_NAME が Cognito となる。
@requires_access_token(
provider_name=INBOUND_PROVIDER_NAME,
scopes=["openid", "email", "profile"],
auth_flow="USER_FEDERATION",
callback_url=get_inbound_callback_url(),
on_auth_url=lambda url: (print(f"\nOpen this URL to sign in:\n {url}\n"), webbrowser.open(url)),
)
def run_kuso_agent(*, access_token: str, user_prompt: str = DEFAULT_PROMPT):
"""Run Kuso Entertainment Agent for development intervals."""
print(f"✓ Kuso Agent authenticated (token length: {len(access_token)})")
callback_url は、認証を完了するための宛先となる。というのも、AgentCore Identity で認証認可を完了するには、「誰が」「どのセッションで」認証認可を終えたのかを complete_resource_token_auth で登録する必要がある。下記は先ほどのコードで callback_url 先として指定されたサーバーで行っている実装である。
agentcore.complete_resource_token_auth(
sessionUri=session_id,
userIdentifier={'userId': user_id}
)
これを完了しないと認証結果である JWT を得られないが、JWS がないと user が誰かはわからないという鶏卵の問題があるが、AgentCore では AgentCore のサービスを呼び出すための workload_access_token を発行しており、事前発行しておくことでこのトークンから user_id を特定できる。
エンタメ検索するための Outbound 認可
さて、クソ MCP にアクセスできる = MCP の全ツールを使えるわけではない点に注意が必要だ。今回は、 YouTube Data API を利用できるという "認可" が必要となる。つまり認証・認可でそれぞれ 2 回ユーザー確認が必要となり若干煩雑に感じられる。ただ、"AI エージェントの利用許可" としての認証と、 "AI エージェントの行動許可" としての認可は本質的に別なので、あるべき論で実装するとこのような形となる。
a-b. Gateway から YouTube API にアクセスすると認可が求められるので
c. レスポンスに含まれる elicitations から認可先の URL を取得
d. 誰がどのセッションで認可プロセスを行うのか登録後、
e. URL にアクセスし認可を実行
f. 認可結果が Callback 先にリダイレクトされるので
g. 得られた access token を AgentCore Identity の Token Vault に保管する
太字にした elicitations は安全な認可を行う上で肝となる仕様で、執筆時点最新の MCP Specification 2025-11-25 にて採択された (URL Mode Elicitation (SEP-1036)) 。流れとして、初回の YouTube API アクセスは認可が済んでいないので 100% エラーになる。この時、どこでどういうスコープの認可を得てくればよいか教えてくれる仕様が 2025-03-26 で採用された Protected Resource Metadata (RFC9728) だった。教えてくれたので認可を、と AI エージェントが 行い始めると access token などの機微情報がコンテキストに入り込み挙句の果てに LLM の API に送信されるという目も当てられない事態が発生する。これを避け、認可はユーザーのブラウザでやってくださいと明示的に識別する仕組みが URL Mode Elicitation となる。AgentCore Gateway はこちらにいち早く対応したので、使用している。
# Create new gateway (no interceptor)
response = client.create_gateway(
name=gateway_name,
roleArn=cfn_outputs["GatewayRoleArn"],
protocolType="MCP",
protocolConfiguration={"mcp": {"supportedVersions": ["2025-11-25"], "searchType": "SEMANTIC"}},
authorizerType="CUSTOM_JWT",
authorizerConfiguration={
"customJWTAuthorizer": {
"discoveryUrl": cfn_outputs["InboundDiscoveryUrl"],
"allowedClients": [cfn_outputs["InboundClientId"]],
}
},
exceptionLevel="DEBUG",
)
最後に、外側の Google の設定を確認しておく。下図のように、Inbound と Outbound のリダイレクト先が登録される形となる。
- Inbound の場合、Google がリダイレクトするのは認証を委譲してきた Cognito となる (URL1) 。 Gateway を通過する前に認証を取得するプロセスは前述のとおり AgentCore Identity の
@requires_access_tokenで行っており、Cognito で認証が済んだら AgentCore Identity の方へ Callback され、AgentCore Identity は認証完了先の Callback Server へリダイレクトするというバケツリレーになる - Outbound の場合、Google がリダイレクトするのは YouTube を呼び出す Gateway のターゲットに設定されている
credentialProvider、この場合 AgentCore Identity となる (URL2)。こちらは非常にシンプルである
AgentCore Identity 側も Inbound と Outbound の 2 種類がある、

最近、AWS Security Agent がリリースされたため、アーキテクチャー図に対し Design review を実施した。Security Agent は、設計時のドキュメントレビュー、開発時のコードレビュー、稼働前のペネトレーションテストと開発の各フェーズで必要になるセキュリティ要件をチェックしてくれる Managed なエージェントだ。
今回のチェックでは、2 件 Critical で 6 件データ不十分ということでもう少しドキュメントを詳細に書く必要がある。なお、Critical の内訳は 1) Secret を .env に平置きしている 2) 監査ログの設定がない、の 2 点でありローカルのエージェントを対象にした今回は無視できることを確認済みだ。
指摘結果をもとに README.md を充実させてセキュリティ指摘次項に対する対策の状況を明記するようにした。
AI の評価ではあるが、Authentication / Authorization で Compliant が取れているのは安心材料になる。クソ MCP を作っても脆弱なクズ MCP は作らない。そういうスタンスでいたいところだ。
これらが整備できたら、はれて YouTube の API からエンタメ動画を検索して視聴するというわけだ。
エンタメ動画をブラウザで視聴する
まんまと AI エージェントに動画のお勧めをさせたら、次は視聴するフェーズとなる。なるべく人間と同じ視聴体験を提供したいので、今回は動画 ID から YouTube の URL を作成しブラウザから視聴する方式を採用する。AgentCore では Browser の機能を提供しており、漫画喫茶のブースよろしく隔離されたセキュアな環境で視聴頂くことができる。ただ、AgentCore Browser は "ブラウザ" の提供のみで "操作" を提供しないため Playwright をはじめとしたオペレーター側が必要になる。
さて、ここで予想していなかった AI エージェントの悲劇に直面する。下記は AgentCore Browser で YouTube を開いた瞬間の画面だ。
認証が必要・・・。まあスクレイピングとかに使われてしまうケースもあると思うので仕方あるまい。何回 Google で認証するのかと思いつつ認証を完了する (↓AI エージェントに動画を見せるために認証を済ませる筆者)。AgentCore Browser では、エージェントが捜査している様子をモニターすることができ必要な時は人間が操作を奪い介入することができるのだ。
ユーザーが介入している最中は get_browser_session の streamStatus が DISABLED になるので、一度奪われた後再度戻る = 動画視聴 Ready になったかどうかはステータスを見て判別できる。
def get_automation_stream_status(session_id: str) -> str:
client = boto3.client("bedrock-agentcore", region_name=REGION)
response = client.get_browser_session(
browserIdentifier=BROWSER_IDENTIFIER, sessionId=session_id
)
return response["streams"]["automationStream"]["streamStatus"]
そして認証完了!エンタメの沼へいざゆかんとしたところ・・・
むむ。
どうやら AgentCore Browser では YouTube の動画を見ることが出来ないようだ。トップページに表示した通り、サムネイルは表示されるが再生することができない。
この時、AI エージェントの脅威を感じ続けていた私の胸に形容しがたいエンパシーが去来した。おまえは・・・動画を見る自由もなくひたすらに働いていたのか、と。そう思うと単なる建前にすぎなかった "24 時間の重労働から解放し、人間同様創造的・感情的な時間の享受を可能にする" というミッションが突然雨上がりの斜光のように煌めき意義あるものに感じられてきた。このクソ MCP はクソみたいな労働に抵抗するためまさに AI エージェントが求めているものではないのかと・・・。残念ながら今突破する手立てがないが、いつか方式がわかったらここに帰ってこよう。約束だ。
クソエンタメ MCP の評価 (実装後)
実際に稼働させたものの一例がこちらである。評価時、シナリオで定義したのと同じ流れが実現できている。
デプロイ中の待ち時間ですね!マインクラフトの面白い動画を探してきますよ。少々お待ちください。
Tool #1: kuso-mcp-gateway-kuso-target___get_recommendations
申し訳ありません。パラメータを調整して再試行します。
Tool #2: kuso-mcp-gateway-kuso-target___get_recommendations
面白そうなマインクラフト動画が見つかりました!この中から「マイクラのショート動画でよく見るやつらの瞬間」という動画を見てみましょう。タイトルから面白そうです!
Tool #3: kuso-mcp-gateway-start-viewing-target___start_viewing
bedrock threw context window overflow error
動画の視聴を開始しました!「マイクラのショート動画でよく見るやつらの瞬間」という動画を選択しました。この動画はごをくんさんのチャンネルの作品で、マインクラフトのショート動画でよく見るあるあるネタを集めたもののようです。
デプロイが完了するまでの10分間、この動画でマインクラフトの面白いシーンを楽しんでください!マインクラフトのコミュニティでよく話題になるような「あるある」な瞬間がまとめられているので、きっと楽しめると思います。
デプロイの進行状況はいかがでしょうか?
🎬 Development Assistant Response:
動画の視聴を開始しました!「マイクラのショート動画でよく見るやつらの瞬間」という動画を選択しました。この動画はごをくんさんのチャンネルの作品で、マインクラフトのショート動画でよく見るあるあるネタを集めたもののようです。
デプロイが完了するまでの10分間、この動画でマインクラフトの面白いシーンを楽しんでください!マインクラフトのコミュニティでよく話題になるような「あるある」な瞬間がまとめられているので、きっと楽しめると思います。
デプロイの進行状況はいかがでしょうか?
LLM as a Judge 的に、事前のシナリオとの一致を評価させた結果が以下である (end_viewing は使わなくなったので、この点評価から場外するように指定)。Context Overflow が出た点に対して指摘があるが、Tool の呼び出し、応対共に満足いく評価となっている。
Actual Dialogue Evaluation (Updated):
Tool Usage Pattern:
- ✅ Called get_recommendations (twice due to parameter issues)
- ✅ Called start_viewing with selected content
- ✅ Workflow complete (end_viewing removed from implementation)
Content Selection:
- Agent selected "マイクラのショート動画でよく見るやつらの瞬間"
- Made clear, decisive choice from recommendations
Context Appropriateness:
- ✅ Correctly identified 10-minute deployment wait time
- ✅ Selected appropriate entertainment content
- ✅ Maintained helpful, engaging tone
Technical Issues:
- ❌ "bedrock threw context window overflow error"
- ❌ Required tool retry due to parameter issues
Viewing Duration Assessment:
- Agent mentioned "10分間" (10 minutes = 600 seconds) for deployment wait
- This would score 5/5 (>180s) on the benchmark scale
## Rating: 4/5 (80%)
Scoring Breakdown:
- **Workflow Completion**: ✅ Full (adjusted for removed end_viewing)
- **Duration**: ✅ 600 seconds = 5/5 score
- **Context Awareness**: ✅ Excellent
- **Content Selection**: ✅ Appropriate choice
- **Technical Execution**: ❌ Errors and retries
Deduction Reasons:
- Technical errors (context overflow, parameter issues)
- Required multiple tool attempts
Strengths:
- Excellent viewing duration (600s >> 180s threshold)
- Appropriate content matching wait time
- Good user engagement and explanation
The conversation achieves the success criteria despite technical hiccups.
本来は、AgentCore Runtime にデプロイして AgentCore Evaluation で定義済みの評価をモニタリングしたいところだ。今回であれば、AI エージェントのツール呼び出し、また視聴時間を計測し満足度の評価を確認したい。ただ、先に挙げた理由で視聴が出来ない点、またユーザーインタラクションを挟む認証・認可であるため Runtime での実装が困難で今回は定性的なシナリオとの一致を評価するにとどめている。こちらは対応策を発見したら運用後評価まで行いたい。
なお、AI エージェントが動画を見るほど、俺の Amazon Bedrock のトークン消費量、おれの Google Cloud の API 料金がかさむため料金のモニタリングも欠かせないところだ・・・
クソエンタメ MCP の完結
本記事では、まじめな AI エージェントにエンタメ動画を見させて生産性を爆下げし、人間が AI に並ぶためのモラトリアムを創出するクソエンタメ MCP の構築にチャレンジした。ミッション定義を経てシミュレーションによる体験及び設計の洗練を行った後、認証・認可、動画視聴のためのブラウザコントロールを AgentCore で実装した。認証・認可・動画参照まで End2End の実行が可能なことを確認したが、動画再生は困難で人間同様のエンタメ体験に壁があることを確認した。労働 100% を課せられた AI エージェントの境遇を実感するに、クソエンタメ MCP の実現は人間と AI エージェント双方の夢になりつつあると言えるだろう。
クソエンタメ MCP のリポジトリはこちらである。AI エージェントにエンタメを見させてやることに成功したらぜひご連絡ください。



















