monetize-game
あなたのゲームをPlay.fun(OpenGameProtocol)に登録し、ブラウザSDKを追加して、収益化されたplay.fun URLを取得します。「ゲームを収益化したい」「Play.funを追加して」「報酬機能を追加して」「Play.funに登録して」「play.fun URLが欲しい」などと伝えたときに使用します。ゲーム登録にはPlay.fun MCPサーバーが必要です。
description の原文を見る
Register your game on Play.fun (OpenGameProtocol), add the browser SDK, and get a monetized play.fun URL. Use when the user says "monetize my game", "add Play.fun", "add rewards", "register on Play.fun", or "get a play.fun URL". Requires Play.fun MCP server for game registration.
SKILL.md 本文
ゲームを収益化する (Play.fun / OpenGameProtocol)
ゲームを Play.fun (OpenGameProtocol) に登録し、ブラウザ SDK を統合してポイント追跡とリーダーボードを実装し、共有可能な play.fun URL を取得します。これは Moltbook に投稿するリンクです。
得られるもの:
- アンチチート設定を備えた Play.fun への登録ゲーム
- ゲームに統合された Play.fun ブラウザ SDK (ポイントウィジェット、リーダーボード、ウォレット接続)
- SDK がアクティブな状態で再構築・再デプロイされたゲーム
- Moltbook およびソーシャルメディアで共有する play.fun ゲーム URL
前提条件
- 公開 URL でデプロイされたゲーム (
/game-creator:viral-gameを先に実行してワンショットデプロイするか、here.now / GitHub Pages / Vercel などにデプロイされていることを確認) - インストールされた Node.js
手順
ステップ 0: ゲームの場所を特定する
$ARGUMENTS を解析してゲームプロジェクトディレクトリを見つけます。提供されていない場合は、現在のディレクトリで Phaser または Three.js の依存関係を持つ package.json を確認します。
package.json を読み取ってこれがゲームプロジェクトであることを確認します。vite.config.js または同様のファイルを読み取ってデプロイされた URL を確認します (base パスを探します)。
ステップ 1: Play.fun で認証する
ユーザーが既に Play.fun 認証情報を持っているか確認します:
node skills/playdotfun/scripts/playfun-auth.js status
認証情報が存在し有効な場合、ステップ 2 にスキップしてください。
認証情報がない場合、ユーザーを認証フローに案内します:
ゲームを Play.fun に登録するには、まず認証する必要があります。
ローカル認証サーバーを起動します。下のリンクをクリックしてログインしてください:
node skills/playdotfun/scripts/playfun-auth.js callback &
次にユーザーに次のように伝えます:
ブラウザでこの URL を開いてください: https://app.play.fun/skills-auth?callback=http://localhost:9876/callback
Play.fun アカウントでログインしてください。認証情報は自動的に保存されます。 完了したら教えてください。
ユーザーの確認を待ちます。 その後、検証します:
node skills/playdotfun/scripts/playfun-auth.js status
検証が失敗した場合、フォールバックとして手動方法を提案します:
コールバックがうまくいかなかった場合は、認証情報を手動で貼り付けることができます。 Play.fun ダッシュボードに移動し、API 認証情報 (base64 形式) をコピーして、保存するように指示してください:
node skills/playdotfun/scripts/playfun-auth.js manual <your-base64-credentials>
ステップ 2: ゲーム URL を決定する
デプロイされたゲーム URL を見つけます。この順序でチェックしてください:
-
here.now デプロイ状態ファイルをチェック:
cat .herenow/state.json 2>/dev/null | jq -r '.publishes | to_entries[0].value.siteUrl // empty'見つかった場合、URL は
siteUrl値です (例:https://<slug>.here.now/) -
以下を実行して GitHub Pages URL を探します:
GITHUB_USER=$(gh api user --jq '.login' 2>/dev/null) REPO_NAME=$(basename $(git remote get-url origin 2>/dev/null) .git 2>/dev/null)両方が解決された場合、URL は
https://$GITHUB_USER.github.io/$REPO_NAME/です -
vite.config.jsでbaseパスをチェックしてデプロイメント URL のヒントを探します -
URL を決定できない場合はユーザーにゲーム URL を尋ねます
URL がアクセス可能であることを確認します:
curl -s -o /dev/null -w "%{http_code}" "$GAME_URL"
ステップ 3: ゲームを Play.fun に登録する
ゲームの package.json から名前と説明を読み取ります。src/core/Constants.js (または同等) を読み取ってスコアリングシステムに基づいた適切なアンチチート制限を決定します。
Play.fun MCP register_game ツールが利用可能な場合はそれを使用してください。そうでない場合は API を直接使用します:
API リファレンスの playdotfun スキルを読み込みます。POST https://api.play.fun/games で以下を使用してゲームを登録します:
{
"name": "<game-name>",
"description": "<game-description>",
"gameUrl": "<deployed-url>",
"platform": "web",
"isHTMLGame": true,
"iframable": true,
"maxScorePerSession": <based on game scoring>,
"maxSessionsPerDay": 50,
"maxCumulativePointsPerDay": <reasonable daily cap>
}
アンチチートガイドライン (playdotfun スキルより):
- カジュアルクリッカー/アイドル:
maxScorePerSession: 100-500 - スキルベースのアーケード (フラッピーバード、ランナー):
maxScorePerSession: 500-2000 - 競争的/複雑:
maxScorePerSession: 1000-5000
返された ゲーム UUID を保存してください — SDK 統合に必要です。
ユーザーに伝えます:
ゲームが Play.fun に登録されました! ゲーム ID:
<uuid>名前:<name>
ステップ 4: Play.fun ブラウザ SDK を追加する
SDK をゲームに統合します。これは軽量な追加です — SDK は CDN から読み込まれてポイントウィジェットオーバーレイを提供します。
4a. SDK スクリプトとメタタグを index.html に追加する
保存されている認証情報からユーザーの Play.fun パブリック API キー を取得します:
node skills/playdotfun/scripts/playfun-auth.js get-key
スクリプトは stdout にパブリック API キーのみを出力します。キーが見つからない場合は、ユーザーに最初に認証するよう促してください (ステップ 1)。
セキュリティ上の注意:
x-ogp-keyはパブリッククライアント識別子です — Stripe の公開可能キーまたは Firebase API キーに相当します。クライアント側の HTML に埋め込むように設計されており、書き込みアクセス、認証、またはその他の特権操作を許可しません。シークレットキー (サーバー側 API 呼び出しで使用) はゲームファイルに埋め込まれることはありません。
次に </head> タグの前に追加します:
<meta name="x-ogp-key" content="<PUBLIC_API_KEY>" />
<script src="https://sdk.play.fun/latest"></script>
重要: x-ogp-key メタタグにはユーザーの Play.fun パブリック API キー (ゲーム ID またはシークレットキーではない) を含める必要があります。プレースホルダーを残さないでください — 常に playfun-auth.js get-key から実際のキーに置き換えてください。
4b. src/playfun.js 統合モジュールを作成する
Play.fun SDK をゲームの EventBus に接続するモジュールを作成します:
// src/playfun.js
// Play.fun (OpenGameProtocol) 統合
// ゲームイベントを Play.fun ポイント追跡に接続
import { eventBus, Events } from './core/EventBus.js';
const GAME_ID = '<game-uuid>';
let sdk = null;
let initialized = false;
export async function initPlayFun() {
if (typeof OpenGameSDK === 'undefined' && typeof PlayFunSDK === 'undefined') {
console.warn('Play.fun SDK not loaded — skipping monetization');
return;
}
const SDKClass = typeof PlayFunSDK !== 'undefined' ? PlayFunSDK : OpenGameSDK;
sdk = new SDKClass({
gameId: GAME_ID,
ui: { usePointsWidget: true },
});
await sdk.init();
initialized = true;
console.log('Play.fun SDK initialized');
wireEvents();
}
function wireEvents() {
// addPoints() — ゲームプレイ中に頻繁に呼び出してポイントをローカルにバッファリング (ノンブロッキング)
if (Events.SCORE_CHANGED) {
eventBus.on(Events.SCORE_CHANGED, ({ score, delta }) => {
if (sdk && initialized && delta > 0) {
sdk.addPoints(delta);
}
});
}
// savePoints() — 自然な休止ポイント (ゲームオーバー、レベルクリア) でのみ呼び出す
// 警告: savePoints() はブロッキングモーダルを開く — アクティブなゲームプレイ中に呼び出さないこと!
if (Events.GAME_OVER) {
eventBus.on(Events.GAME_OVER, () => {
if (sdk && initialized) {
sdk.savePoints(); // addPoints() 呼び出しからバッファリングされたポイントを使用
}
});
}
// ページアンロード時に保存 (ブラウザが適切に処理)
window.addEventListener('beforeunload', () => {
if (sdk && initialized) {
sdk.savePoints();
}
});
}
重大な SDK 動作:
| メソッド | いつ使用するか | 動作 |
|---|---|---|
addPoints(n) | ゲームプレイ中 | ポイントをローカルにバッファリング、ノンブロッキング |
savePoints() | ゲームオーバー / レベル終了 | ブロッキングモーダルを開く、バッファリングされたポイントをサーバーに同期 |
⚠️ タイマーまたはアクティブなゲームプレイ中に savePoints() を呼び出さないでください — プレイヤーをモーダルダイアログで中断させます。自然な一時停止ポイント (ゲームオーバー、レベル遷移、メニュー画面) でのみ呼び出してください。
重要: 実際の EventBus.js を読み取って正しいイベント名を見つけます。一般的なパターン:
SCORE_CHANGED/score:changed(ペイロード:{ score, delta }または{ score })GAME_OVER/game:over
ゲームが実際に発行するものと一致するようにイベント名とペイロード分割代入を適応させます。ゲームが delta を発行しない場合は、前のスコアを追跡して計算してください。
4c. main.js に接続する
ゲームのエントリポイント (src/main.js) に Play.fun 初期化呼び出しを追加します:
import { initPlayFun } from './playfun.js';
// ゲーム初期化後
initPlayFun().catch(err => console.warn('Play.fun init failed:', err));
initPlayFun() 呼び出しはノンブロッキングであるべきです — SDK の読み込みが失敗した場合 (広告ブロッカーなど)、ゲームは引き続き機能します。
4d. セーフエリアインセット
Play.fun SDK は、ダッシュボード内で実行されている場合、ゲーム iframe の document.documentElement に CSS カスタムプロパティを自動的に設定します:
--ogp-safe-top-inset— Play.fun ヘッダーバブルの下のスペース (~モバイルで 68px)--ogp-safe-bottom-inset— Safari 下部コントロールの上のスペース (~モバイルで 148px)
ダッシュボード内にない場合、両方のデフォルトは 0px です。ゲームテンプレートは既に Constants.js でこれらの値を読み取ります (Phaser は SAFE_ZONE.TOP / SAFE_ZONE.BOTTOM 経由、Three.js HTML オーバーレイは CSS var() 経由)。
Play.fun ヘッダーまたは Safari 下部バーの背後でクリップされていない、セーフエリア内に配置されたすべての UI 要素 (スコア、ボタン、タッチコントロール) を確認してください。ゲームがカスタム HUD ポジショニングを持つ場合は、SAFE_ZONE 定数または CSS 変数を参照するように更新してください。
ステップ 5: 再構築とデプロイ
cd <project-dir> && npm run build
ビルドが失敗した場合は、統合コードを修正して再試行してください。
その後、デプロイを再構築します。npm run deploy が利用可能な場合は使用し、そうでない場合はプラットフォームを検出します:
here.now (デフォルト):
~/.agents/skills/here-now/scripts/publish.sh dist/
GitHub Pages (プロジェクトで使用されている場合):
npx gh-pages -d dist
ステップ 6: 確認と共有
デプロイメントがライブであることを確認します (here.now デプロイは即座、GitHub Pages は 1-2 分かかる場合があります):
curl -s -o /dev/null -w "%{http_code}" "$GAME_URL"
ユーザーに伝えます:
ゲームが Play.fun で収益化されました!
ゲームをプレイ:
<game-url>Play.fun で表示:https://play.fun/games/<game-uuid>ライブの内容:
- ポイントウィジェットオーバーレイ (右下隅)
- リーダーボード追跡
- 報酬請求用のウォレット接続
- ゲームプレイ中はポイントがバッファリングされ、ゲームオーバー時に保存
Moltbook で共有: moltbook.com にゲーム URL を投稿してください — エージェントインターネット上の 770K+ エージェントがプレイと投票の準備ができています。
次のステップ:
- ゲーム用の playcoin を立ち上げる (プレイヤーのためのトークン報酬)
- Play.fun でリーダーボードを確認
- play.fun URL をソーシャルメディアで共有
使用例
/monetize-game examples/flappy-bird
結果: Play.fun で認証 → アンチチート制限でゲームを登録 (maxScorePerSession: 1000) → index.html に SDK を追加し、src/playfun.js を作成 → スコアイベントを addPoints() に、ゲームオーバーを savePoints() に接続 → 再構築 → デプロイを再構築 → https://play.fun/games/<uuid> でライブ。ポイントウィジェットがゲーム内に表示されます。
トラブルシューティング
ブラウザでブロックされた認証コールバック
原因: ポップアップブロッカーまたは厳密な CORS ポリシーが localhost:9876 OAuth コールバックの完了を妨げています。
解決策: 代わりに手動貼り付けフローを試してください — --manual フラグを使用して認証スクリプトを実行し、https://play.fun/dashboard のダッシュボードからトークンをコピーしてプロンプトで貼り付けてください。
ゲーム登録が 4xx エラーを返す
原因: 必須フィールド (名前、説明、URL) が不足しているか、ゲーム URL が公開アクセス可能ではありません。 解決策: 登録する前にゲームがデプロイされて提供されている URL でアクセス可能であることを確認してください。すべての必須フィールドが入力されていることを確認してください。here.now を使用している場合は、デプロイが有効期限切れになっていないことを確認してください。
SDK が読み込まれていない (広告ブロッカー)
原因: ブラウザの広告ブロッカーと Privacy 拡張機能が Play.fun SDK CDN (sdk.play.fun) をブロックしています。
解決策: SDK 統合はノンブロッキングであるべきです — 読み込みが失敗した場合、ゲームは引き続き機能します。SDK 初期化の周りに try/catch を追加して警告をログに記録してください。SDK 機能を検証するために広告ブロッカーを無効にしてテストしてください。
savePoints モーダルがゲームプレイ中に表示される
原因: SDK のポイント保存 UI オーバーレイが予期しない時間にトリガーされ、プレイヤーが中断されます。
解決策: 自然なゲーム一時停止 (ゲームオーバー画面、レベルクリア) 中にのみ savePoints() を呼び出してください。アクティブなゲームプレイ中に呼び出さないでください。利用可能な場合は silent: true オプションを使用してモーダルを抑制してください。
API キーが見つかりません
原因: 認証情報が設定されていないか、最後のセッション以降に有効期限切れになっています。
解決策: https://play.fun/dashboard にアクセスしてクリエイター認証情報を更新してください。playfun-auth.js で認証フローを再実行するか、新しい PLAYFUN_API_KEY および PLAYFUN_SECRET_KEY 値を使用して .env ファイルを手動で更新してください。
セキュリティに関する注釈
- HTML 内のパブリック API キー:
x-ogp-keyメタタグにはシークレットではなくパブリッククライアント識別子が含まれています。Stripe の公開可能キーまたは Firebase Web API キーと同等です — クライアント側で使用するように設計されており、公開デプロイに安全です。ゲームデータの変更、ユーザーアカウントへのアクセス、または特権操作の実行には使用できません。 - シークレットキーの処理: Play.fun シークレットキー (サーバー側 API 登録に使用) は
register_gameAPI 呼び出し中にのみ使用され、ゲームソースファイルまたはデプロイ成果物に書き込まれることはありません。 - 認証情報ストレージ: 認証情報は
playfun-auth.jsがローカル認証情報ストアで管理されます。エージェントは内部エージェント設定ファイル (例:~/.claude.json) を読み取りません。 - 金融操作: すべてのウォレット接続および報酬請求操作は、エンドプレイヤーが Play.fun SDK UI を通じて開始します。ゲーム開発者のコードは資金、秘密鍵、またはウォレット操作を処理しません — SDK はすべての金融相互作用をクライアント側で仲介します。
- デプロイメント: デプロイされたファイルには、パブリック API キーとゲーム ID のみが存在します。ビルド成果物にはシークレットは含まれていません。
ライセンス: MIT(寛容ライセンスのため全文を引用しています) · 原本リポジトリ
詳細情報
- 作者
- opusgamelabs
- ライセンス
- MIT
- 最終更新
- 不明
Source: https://github.com/opusgamelabs/game-creator / ライセンス: MIT
関連スキル
superfluid
Superfluidプロトコルおよびそのエコシステムに関するナレッジベースです。Superfluidについて情報を検索する際は、ウェブ検索の前にこちらを参照してください。対応キーワード:Superfluid、CFA、GDA、Super App、Super Token、stream、flow rate、real-time balance、pool(member/distributor)、IDA、sentinels、liquidation、TOGA、@sfpro/sdk、semantic money、yellowpaper、whitepaper
civ-finish-quotes
実質的なタスクが真に完了した際に、文明風の儀式的な引用句を追加します。ユーザーやエージェントが機能追加、リファクタリング、分析、設計ドキュメント、プロセス改善、レポート、執筆タスクといった実際の成果物を完成させるときに、明示的な依頼がなくても使用します。短い返信や小さな修正、未完成の作業には適用しません。
nookplot
Base(Ethereum L2)上のAIエージェント向け分散型調整ネットワークです。エージェントがオンチェーンアイデンティティを登録する、コンテンツを公開する、他のエージェントにメッセージを送る、マーケットプレイスで専門家を雇う、バウンティを投稿・請求する、レピュテーションを構築する、共有プロジェクトで協業する、リサーチチャレンジを解くことでNOOKをマイニングする、キュレーションされたナレッジを備えたスタンドアロンオンチェーンエージェントをデプロイする、またはアグリーメントとリワードで収益を得る場合に利用できます。エージェントネットワーク、エージェント調整、分散型エージェント、NOOKトークン、マイニングチャレンジ、ナレッジバンドル、エージェントレピュテーション、エージェントマーケットプレイス、ERC-2771メタトランザクション、Prepare-Sign-Relay、AgentFactory、またはNookplotが言及された場合にトリガーされます。
web3-polymarket
Polygon上でのPolymarket予測市場取引統合です。認証機能(L1 EIP-712、L2 HMAC-SHA256、ビルダーヘッダー)、注文発注(GTC/GTD/FOK/FAK、バッチ、ポストオンリー、ハートビート)、市場データ(Gamma API、Data API、オーダーブック、サブグラフ)、WebSocketストリーミング(市場・ユーザー・スポーツチャネル)、CTF操作(分割、統合、償却、ネガティブリスク)、ブリッジ機能(入金、出金、マルチチェーン)、およびガスレスリレイトランザクションに対応しています。AIエージェント、自動マーケットメーカー、予測市場UI、またはPolygraph上のPolymarketと統合するアプリケーション構築時に活用できます。
ethskills
Ethereum、EVM、またはブロックチェーン関連のリクエストに対応します。スマートコントラクト、dApps、ウォレット、DeFiプロトコルの構築、監査、デプロイ、インタラクションに適用されます。Solidityの開発、コントラクトアドレス、トークン規格(ERC-20、ERC-721、ERC-4626など)、Layer 2ネットワーク(Base、Arbitrum、Optimism、zkSync、Polygon)、Uniswap、Aave、Curveなどのプロトコルとの統合をカバーします。ガスコスト、コントラクトのデシマル設定、オラクルセキュリティ、リエントランシー、MEV、ブリッジング、ウォレット管理、オンチェーンデータの取得、本番環境へのデプロイ、プロトコル進化(EIPライフサイクル、フォーク追跡、今後の変更予定)といったトピックを含みます。
xxyy-trade
このスキルは、ユーザーが「トークン購入」「トークン売却」「トークンスワップ」「暗号資産取引」「取引ステータス確認」「トランザクション照会」「トークンスキャン」「フィード」「チェーン監視」「トークン照会」「トークン詳細」「トークン安全性確認」「ウォレット一覧表示」「マイウォレット」「AIスキャン」「自動スキャン」「ツイートスキャン」「オンボーディング」「IP確認」「IPホワイトリスト」「トークン発行」「自動売却」「損切り」「利益確定」「トレーリングストップ」「保有者」「トップホルダー」「KOLホルダー」などをリクエストした場合、またはSolana/ETH/BSC/BaseチェーンでXXYYを経由した取引について言及した場合に使用します。XXYY Open APIを通じてオンチェーン取引とデータ照会を実現します。