pls-touch-grass について
pls-touch-grassは、外出を記録して画面から離れるよう促すユーモラスなMCPサーバーです。MCPのツール呼び出しと共有状態の例として、苛立ちの検出、天気、近くの公園情報を扱います。
主な機能
- 01外出の記録
- 02屋内で過ごした時間の追跡
- 03苛立ちの検出と通知
- 04天気と近くの公園の確認
- 05JSONファイルへの状態保存
活用シーン
- 01公園から戻った時刻の記録
- 02外出するタイミングの確認
- 03苛立ちが高まった際の休憩通知
MCP 対応
stdio経由で、外出記録、屋内時間の確認、苛立ちの検出、天気確認、公園検索を行う5つのツールをMCPクライアントに提供します。
設定
ローカルサーバーの設定はどのクライアントでも共通です。コピーしてクライアントの MCP 設定ファイルに貼り付けてください。
ツール
5掲載時のツール一覧 · 2 週間前に更新
| パラメーター | 型 | 必須 | 説明 |
|---|---|---|---|
| note | string | いいえ | 外で何をしたか。例:'went to the park' |
詳細
pls-touch-grass-mcp
最後に外へ出てからどれくらい経ったかを把握し、そのことをしつこく言い続ける MCP サーバーです。
外出を記録すると、屋内にいた時間を追跡し、AI に怒りをぶつけているのを察知して、天気を確認したうえで最寄りの公園へ送り出します。ジョークのようですが、MCP を学ぶためのものです。5 つのツール、共有状態、そしてモデルが促されなくても呼び出すような説明を備えています。
インストール
Claude Code
claude mcp add pls-touch-grass -s user -- npx -y pls-touch-grass-mcp
-s user を指定しないと、サーバーはコマンドを実行したディレクトリでしか使えません。クローンから作業する場合は、コマンドを実行する必要はありません。ルートにある .mcp.json を Claude Code が認識し、フォルダーを開くと設定するかどうかを提示します。
Cursor
または、~/.cursor/mcp.json(グローバル)か .cursor/mcp.json(プロジェクトごと)に次の JSON を記述します。
{
"mcpServers": {
"pls-touch-grass": {
"command": "npx",
"args": ["-y", "pls-touch-grass-mcp"]
}
}
}
Claude Desktop
Releases から .mcpb をダウンロードし、設定 → 拡張機能 → 拡張機能をインストールを選択します。依存関係はバンドルされているため、オフラインでインストールできます。手動で設定する場合は Cursor と同じ JSON を claude_desktop_config.json に記述します(macOS では ~/Library/Application Support/Claude/、Windows では %APPDATA%\Claude\)。
claude.ai
対応していません。カスタムコネクターには HTTPS 経由のリモートサーバーが必要ですが、これはお使いのマシン上で動作する stdio です。HTTP トランスポートは今後の課題の最初の項目です。
ソースから
git clone https://github.com/Rinava/pls-touch-grass-mcp
cd pls-touch-grass-mcp
npm ci && npm run build
上記いずれかの設定で、代わりに node /absolute/path/to/dist/index.js を指定してください。
npx -y は初回起動時にパッケージをダウンロードします。ライブ配信の視聴者や会場の Wi-Fi のためにも、あらかじめキャッシュしておきましょう。npm では pls-touch-grass-mcp として、MCP Registry では io.github.Rinava/pls-touch-grass として公開されています。
5 つのツール
| ツール | 機能 | モデルが呼び出すタイミング |
|---|---|---|
touched_grass | 外出したことを記録します | 「公園から戻った」 |
gotta_go | 外に出る必要があるか確認します | 「このまま続けてもいい?」 |
frustration_detector | 怒りを察知して、次の対応へ進めます | 怒りをぶつけたときに自動で。これが狙いです |
grass_conditions | 実際の天気を取得します(Open-Meteo、API キー不要) | 外へ送り出す前 |
where_to_touch_grass | 近くの公園と距離を調べます(OpenStreetMap) | 「どこに行けばいい?」、または場所を指定したとき |
モデルに苛立ちを検知する方法を教える必要はありません。ツールの説明だけで検知します。「何もかもうまくいかない!!!」と入力して、確かめてみてください。
設定不要
位置情報は実行ごとに IP アドレスから新たに取得します(ipwho.is)。意図的に市区町村レベルの精度にしています。位置情報を取得できない場合は、最後に把握した場所を使い、それもなければ、みんなと同じくオベリスコを使います。where_to_touch_grass に地区名や住所を指定すると、その場所が記憶されます。既知の地区名はオフラインで解決し、それ以外は OpenStreetMap の Nominatim を通じて一度だけジオコーディングします。入力した語句だけがマシンの外へ送信されます。別の場所を指定するまでは、IP アドレスからの推測よりも、指定した場所が優先されます。
屋内にいる時間の許容値は、デフォルトでは容赦のない 2 分です。モデルに寛大な対応を頼むと、gotta_go により大きな threshold_minutes が渡されます。状態は ~/.pls-touch-grass.json という 1 つの JSON ファイルに保存されます。外出すると怒りのカウンターがリセットされます。それが赦しの仕組みです。
デモの呪い
ライブデモでは呪いが発動します。「見てて」と言った瞬間に、会場の Wi-Fi が落ちるのです。args に --demo を追加すると、すべての回答が固定の内容になります。気温は 22°C で晴れ、場所はオベリスコ、スポットは厳選済みです。ネットワーク呼び出しも、予想外のこともありません。デフォルトでは無効です。現実は現実のままにしておきましょう。
ワークショップに沿って進める
リポジトリには各ステップのタグが付いています。
git checkout step-1 # stdio server + touched_grass
git checkout step-2 # + gotta_go (state and threshold)
git checkout step-3 # + frustration_detector (the demo)
git checkout step-4 # + grass_conditions (network with fallback)
git checkout step-5 # + where_to_touch_grass and this README
npm ci && npm test
各ステップは個別にコンパイルでき、それぞれのテストに合格します。依存関係は、公式の MCP SDK と zod の 2 つだけです。
宿題
- HTTP トランスポート:SDK v2 の
createMcpHandlerを使うと、同じファクトリーを fetch 経由で提供でき、claude.ai に接続できます - グローバルなしきい値ではなく、プロジェクトごとのしきい値
- 連続して芝生に触れた日数の記録
- PR で、あなたの街のデモスポットを追加:
src/lib/demo.tsに公園ごとにオブジェクトを 1 つ追加し、意見を添えてください
リリース
npm run build:mcpb は dist と本番環境の依存関係を
pls-touch-grass-mcp-<version>.mcpb にまとめます。このファイルを GitHub Release に公開します。
マニフェストは package.json から生成されるため、手動で同期する必要はありません。
コントリビューション
Issue や PR を歓迎します。宿題の一覧は
未解決の Issueとして用意されており、いくつかには
good first issue のラベルが付いています。セットアップと
プロジェクトのルールについては CONTRIBUTING.md をご覧ください(ルールは少ないですが、デモスポットについての意見は必須です)。
ライセンス
MIT です。芝生は自由に利用でき、このライセンスも自由です。
コメント
AI アプリケーションが外部のツールやデータソースに統一的な方法で接続するためのオープンなプロトコルです。クライアントはモデルとの対話を担い、MCP サーバーはツール・リソース・プロンプトテンプレートを提供します。標準メッセージでやり取りするため、1 つのサーバーを複数のクライアントで再利用できます。