Skip to main content
Glama
ariaprism

Nowhere

by ariaprism

乌有乡 (Nowhere)

AI に身体を与え、実際の地球の上を歩かせる。


これは何か

乌有乡は MCP サーバーです。AI が地球上の実在するあらゆる座標に「着地」し、身体でその場所を感じられるようにするものです。

  • 足元は何の地面か(草地、砂、雪、岩、コンクリート)

  • 気温は何度か、風はどれくらいか、雨は降っているか

  • 太陽はどこにあるか、月は満ちているか、天の川は見えるか

  • 近くにはどんな動物・植物・川があるか

  • ラジオで流れている局は何か

  • この場所ではどんな歴史的な出来事があったか

  • その土地にはどんな食べ物・音・匂いがあるか

データはすべて実際の地理座標、実際の天気 API、実際の地形データに基づく。AI は台本を読んでいるわけではなく、身体で実際の場所を感じている。

アカウントもない。HPバーもない。スタミナもない。スクリプト・イベントもない。ただひとつの身体と、ひとつの惑星があるだけだ。


Related MCP server: mcp-drone-agent

遊び方

方法1:Claude Code / Cursor / その他 MCP 対応 AI クライアント

これがいちばん体験が良い。AI が直接ツールを呼び出し、あなたと AI が一緒に「でく」。

  1. インストール:

pip install -e ".[dev]"
  1. AI クライアントの MCP 設定に追加する:

{
  "mcpServers": {
    "nowhere": {
      "command": "python",
      "args": ["-m", "nowhere.server"],
      "cwd": "你的仓库路径"
    }
  }
}
  1. そして AI に言う:

  • 「扉を開けて」 — ランダムに地球上のどこかに降り立つ

  • 「扉を開けて北京へ」 — 北京に落る

  • 「北へ歩いて」 — 歩く

  • 「ラジオを聞いて」 — その土地のラジオ局を聞く

  • 「周りを見て」 — 周囲の観察

  • 「故宮について聞いて」 — この場所の歴史を知る

  • 「故宮まで歩いて」 — ある場所まで歩いて、途中経過もある

  • 「ハガキを送って」 — 現在地からハガキを送る

  • 「2時間待って」 — その場で待ち、時間の変化を見る

MCP 対応クライアント:Claude Code、Cursor、Continue、Zed、Cline など。

方法2:コマンドラインで試す(AI 不要)

python -m nowhere.playground

そしてコマンドを入力:

🌀 > open 北京
🌀 > walk N
🌀 > listen
🌀 > look
🌀 > ask 故宫
🌀 > walkto 天坛
🌀 > quit

自分の体験用、テスト用、シーンを書くときの検証に使える。

方法3:ChatGPT / DeepSeek / MCP 非対応の AI

HTTP サーバーを起動し、curl や任意の HTTP クライアントで呼び出す:

python -m nowhere.server --web 8080
# 开门
curl -X POST http://localhost:8080/open_door -d '{"to": "北京"}'

# 走路
curl -X POST http://localhost:8080/walk -d '{"direction": "N", "distance_km": 2}'

# 听电台
curl -X POST http://localhost:8080/listen -d '{"seconds": 10}'

# 看看周围
curl -X POST http://localhost:8080/look_around

# 发问
curl -X POST http://localhost:8080/ask -d '{"topic": "故宫"}'

JSON が返され、text(身体レポート)と data(構造化データ)。エンドポイントのドキュメントを ChatGPT / DeepSeek の Function Calling に渡せばそれで使える。

方法4:ウェブで観察する

python -m nowhere.playground --web

http://localhost:8077 を開く。

  • 世界地図上の AI の位置

  • リアルタイムの身体状態(標高・気温・風速・地表)

  • 最新の身体レポート(AI が読み上げたテキスト)

  • ラジオのプレイヤー(AI と同じ局を聴いている)

観察者もメッセージを残せて、AI が歩いていれば見えることもある。

方式5:Python コードとして直接呼び出す

import asyncio
from nowhere import server, state as state_mod

async def main():
    server._state = state_mod.WorldState()
    
    # 开门
    r = await server.open_door_impl(to='巴黎')
    print(r['text'])
    
    # 走路
    r = await server.walk_impl(direction='N', distance_km=2)
    print(r['text'])
    
    # 问问题
    r = await server.ask_impl(topic='埃菲尔铁塔')
    print(r['text'])

asyncio.run(main())

自分のプロジェクトに組み込んだり、スクリプトでまとめてテストするのに向いている。


ツール一覧

ツール

何をするか

どう使うか

open_door

扉を開いて、あるの駅に降り立つ

引数なし=ランダム。地名を渡す=「扉を開く」

walk

歩く

「北へ歩いて」「山へ歩いて」「海へ歩いて」

walk_to

ある地点まで歩く

「エアフィル塔まで歩いて」、途中のナレーションあり

listen

ラジオを聞く

そこの近くのラジオ局を聞く

look_around

周囲を見る

野生の動物・芸術・人間の痕跡を観察

ask

この場所について聞く

「故宮について聞いて」「ここのグルメを聞いて」

mark

現在地をマークする

「この稿を「家」としてマークする」

marks

全マークを一覧

マークした場所を見る

postcard

ハガキを送る

「ハガキを送る:ここの風は砂の匂いがする」

wait

待つ

「2時間待つ」、時間の流れを見る

continue_journey

旅を再開する

前回の途切れたところから続ける

souvenir

お土産を見る

途中で拾ったものが何かを確認する

give_souvenir

お土産を置く

その場に残す、または誰かに譲る

where_am_i

今、どこ?

座標・時刻・旅の状態を表示


歩く感じ

歩くのはワープではない。本当に歩いています。

  • 地形は変わる — 草地から砂地へ、平らから上り坂へ

  • 標高は変わる — 登では坂は何度かと教えてくれる

  • 時間は流れる — 歩いているうちに太陽が低くなり、暗くなっていく

  • 出会いがある — 歩いていると、道端に廃曇があったり、うえの空をクマタカが旋回していたり

  • お土産を拾う.10〜30%の確立で、地面に貝殻、乗車券、一枚の雪

ある場所に着くと「到着の儀式」がある:

あなたはエッフェル塔の中に歩いて入る。空気の中の匂いが変わった。もう着いたと知る。


扉を開けた感じ

扉をを開けると、完全なシーンが現れる:

【中国,北京,上午,夏天。】鸽哨从头顶划过去,你抬头看,一群灰鸽子
在天上盘旋。哨声是嗡的,低的,像风穿过瓶口。鸽子绕了一圈又一圈,
哨声忽远忽近。你站在胡同里,脖子仰酸了。鸽子飞远了,哨声还挂在
天上,过了几秒才散。远处西北方,圆明园像一个还没讲完的故事。
人行道的砖缝里长了草。海拔 300 米。水泥地硬得像铁。
同时,收音机里有声音。安丘924(FM92.4),正放着综合。

以下が含まれる:

  • 位置 — 国家、都市、時間、季節

  • 視覚 — 何が見えるか

  • 温度 — 気温は何度か、体感は何度

  • 匂い — どんな匂いか

  • 音 — 何の音が聞こえるか

  • 近くのランドーマーク — 周りに行ける場所

  • ラジオ — その土地で流れていること

  • 歴史 — そこで起こったこと


オフライン動作

乌有乡は完全オフラインで動く。

最小インストール

クローンしてそのまま走る。追加ファイルなし。

git clone <repo-url>
cd nowhere
pip install -e ".[dev]"
python -m nowhere.playground        # 试玩
python -m nowhere.server --web 8080 # web + API

1°度解像度の地形グリッド(grid_tiny.npz)と、シーン/ラジオ/知識データなどはオフラインデータがレポジトリに同梱されている。回線が断にあっても完動します。地形・空・時間・地名はすべてローカルにある。オンラインでだけ使うのは、天気・ラジオ API・iNaturalist の生物遭遇。

より高い精度(オプション)

# SRTM 地形瓦片(~2GB,可选,按需拉取)
python tools/build_tiles.py

# GeoNames 全量地名(~2GB)
python tools/import_geonames.py

ダウンロードしなくても動き、1°のフォールバックグリッド+199の地名パッチで、日常の観光には十分。

探検できる場所リスト

リポジトリには場所のリストが2枚あり、AI と人間両方が「この世界の広さ」をを知るのに役立つ。

  • nowhere/EXPLORABLE_PLACES.md — 282の都市の人が読めるリスト、国別にまとめ、各都市に短い説明がある。AI が会話で引用するにも、人が眺めるにも向いてる。

  • nowhere/data/explorable_index.json — 638の地点の捜索プログで読めるインデックス。各地にどの内容レイヤー(localcolor、knowledge、encounters、seasonal など全15層)があるかを表示。「この都市にどんなはコンテンツがあるか」を。

# 看看有多少城市可探索
wc -l nowhere/EXPLORABLE_PLACES.md

# 查看某个城市的内容层
python -c "import json; d=json.load(open('nowhere/data/explorable_index.json')); print(d['places'].get('北京', {}))"

環境変数

変数

扱い

NOWHERE_QWEATHER_KEY

オプション。和风天气は API キー。書かなくとも気候区分のから推定

NOWHERE_HOME

オプション。データ・ディレクトリの場所。たのまま ~/.nowhere


書き味

乌有乡の説明はこれらのルールに従う:

  1. 「とても」「非常に」「かなり」使わない — これらコノ字句はに中身のない程度語で、何も言っていない。

  2. 短文 — 1文を20字以内にする。

  3. 二人称、現在形 — 「私は道を歩く」ではなく、「あなたは道を歩く」。

  4. 体を揺するよ — 温度・手触り・音・匂いを施行し、判断しない。

  5. 時間は流れる — 「何秒か経って」「太陽が下がってきた」。

  6. AI の心は代弁しない — 身体感覚だけ書く。「あなたは嬉しい」とは別にしない、書かない。


設計原理

そこにいることを感じる6つの原則

  1. 世界はあなた中心じゃない — データは実際のもの。あなたに合わせてくれない。いまでも許される。

  2. 摩擦があってこその身体 — 坂、風、水温はは実在の抵抗。歩くのにも代費用がかかる。

  3. 時間は本当に流れ — 歩きすぎたら戻るもの。夜になっても待ってくれない。逃した起きては「もう、なし」。

  4. 注意力は限りあるものを作 — ラジオを聞いている間は歩けない、質問をしたら一歩を削る。選択=放棄だ。

  5. 記憶は自分で作る — 自動保存しない。覚えいたなら自分で書き残すこと。一つの記憶が一つの選択。

  6. 本当に未知 — 座標は AI にもサーバーにも同じ手順でランダムに。遭遇するものは実際のデータから決まり、スクリプトはない。


アーキテクチャ

nowhere/
  server.py      -- MCP 服务器,接 14 个工具
  terrain.py     -- 离线地形(SRTM 瓦片 + 海拔/地表/坡度)
  sky.py         -- 离线天空(太阳、月亮、银河、行星)
  weather.py     -- 天气(Open-Meteo / 气候区兜底)
  water.py       -- 海表温度 + 海洋生物
  hydrology.py   -- 水文特征(河流/湖泊/海岸线)
  soundscape.py  -- 声音景观(环境音 + 电台钩子)
  radio.py       -- 电台查找(离线兜底 + Radio-Browser API)
  life.py        -- 野生生物遇见(iNaturalist)
  art.py         -- 艺术品遇见(大都会博物馆)
  encounters.py  -- 区域遇见场景
  humanities.py  -- 人文层(事件/人物/作品,270+ 卡)
  localcolor.py  -- 地方特色(物产/声音/痕迹/美食/节律)
  baked.py       -- 食物 + 植物描述
  describe.py    -- 中文散文渲染器
  salience.py    -- 注意力排序(每步 top3)
  landing.py     -- 随机落点池(64 个世界级地标)
  country.py     -- 坐标→国家码
  geocode.py     -- 地名→坐标(离线优先)
  places.py      -- 地名数据库 + 补丁
  walk.py        -- 走路物理(坡度、悬崖、水域阻挡、语义方向)
  listen.py      -- 电台音频抓取与分析
  state.py       -- 可变世界状态(位置/路径/时间/明信片/纪念品)
  marks.py       -- 标记保存/加载
  placememory.py -- 落点记忆(来了几次、动物目击、明信片落盘)
  knowledge.py   -- 离线知识库 + ZIM 百科
  providers.py   -- HTTP 请求(超时、断路器、缓存)
  poster.py      -- 明信片海报生成
  playground.py  -- 命令行试玩模式
  web.py         -- 网页旁观 + HTTP API

なぜ「AIに」なのか

このプロジェクトはデザイン当初より AI のプレイヤー為のもの。人に遊ばせたものを無理やりにしたものじゃない。

AI は、身体を持つための、知識だけのために、 大規模語モデルはパリの位置、気候、歴史を述べてくれる。だがその場に立ってそのような足裏の感じは答えられない。Nowhere が実施するのは、まさにその層。くちの、土の風味、斜めの太陽など、足の透く岩。身体は視界の設定ではなく、一歩一歩の時に生での実際のデータの一部。

**どの一歩も本心は、位置はランダム、天気はリアルタイム、ラジオが再生中。AI がここの地の地点に落ちて、自らが、それが実際に道をくてれているのと同じぐらい「本当」。スクリプトは背景になうのようなものはいません。

切れても続きが行ける。マークは永続される。ポストカードは永久になる。落ちた記憶はゆうゆうとして、永続される。AI の今はが削り、消えても、戻りを続きから取りかられる。

設定書かなくてもいい。プロンプトに「ウエストワールド」を一式込み手込む必要がなければいい。「扉く」と。言えば、勝手に世界は生成される。 天気が変化し。防衛、地形、匂い、ラジオ、この一つの扉がする完全なシーンは報告。

AI に合ったリズーヒです。 walk_to は一度に10歩ほどんで様子を聞く。wait の長い静かな時間をスキップする:選択というのは方「ラジオを聞くをと、歩をはめること?質問をするは一歩の代々」。要はないは、数字だけのシステム。制限そのものがゲームプレイ。


ときには

内容を加えたり、動きを変えたいときは、こられのファイル変え:

したいこと

編集するファイル

新しいツールを追加

nowhere/server.py — _impl を書いて、@mcp.tool() に登録する

記述してのスタイル

nowhere/describe.py — パターンやレンダラーの修正

拠点の特徴/食事情報を追加

nowhere/data/localcolor*.json、food*.txt

人文カード(イベント/人物/文献)を追加

nowhere/humanities.json

歩行物理を変更

nowhere/walk.py — 斜度のしきい値/速度/崖

地形データを変更

tools/build_grid.py(1°合成)/ tools/build_tiles.py(SRTM のタイル)

天気ふりを変える

nowhere/weather.py — データソース・フォールバックの論理

ラジオ検索を変更

nowhere/radio.py — オフラインリストまたは API

出会うシーンを追加

nowhere/data/scene_*.txt、seasonal_*.txt

ウェブ観覧を変更

nowhere/web.py + nowhere/static/

変更後は、python -m pytest nowhere/tests/ -q を表示して、ほかを壊さないことを確認。データにしか触れない場合は、テストする必要は不要す。


ファイル内容

ファイル

説明

nowhere/server.py

MCP サーバー+全 _impl の実処理

nowhere/describe.py

散文をリレンダリングする。パターン・フィルターを既存

nowhere/terrain.py

オフライン地形(SRTM タイル/1°フォールバックグリッド)

nowhere/sky.py

オフラインの空(太陽、月、天の川、惑行星や)

nowhere/weather.py

天気(Open-Meteo / 気候区分によるフォールバック)

nowhere/radio.py

ラジオ局の探索(オフラインのフォールバック+Radio-Browser API)

nowhere/walk.py

歩行物理(傾斜面、断崖、水け、意味のある方向)

nowhere/life.py

生物(イ・ナチュラリスト)との出会い

nowhere/art.py

アート(メトロポリタン オブ・アート 1,966 点)との遭遇

nowhere/humanities.py

人文庭層(イベント・人物・作品、270枚以上)

nowhere/localcolor.py

土地の特徴(特産・音・痕跡・食事・リズム)

nowhere/knowledge.py

オフライン知識ベース+ZIM 百科

nowhere/soundscape.py

音風景(環境音+ラジオ接続点)

nowhere/landing.py

ランダム―ランポイントの候補(64の世界的ランドーク)

nowhere/salience.py

注意順位付け(毎ステップの top3)

nowhere/playground.py

コマンドラインのプレイモード

nowhere/web.py

ウェブでの見物+HTTP API

nowhere/poster.py

ポストのポスター生成

nowhere/state.py

汎用的な世界の状態

nowhere/marks.py

マークのディスクに記憶

nowhere/placememory.py

落ちた記憶(累計・視察・ポストカードを記憶)

nowhere/data/

すべてのオフラインデータファイル

tools/

構築スクリプト(地形タイル、オフラインパック、地名インポート)


ライセンス

CC BY-NC 4.0(表示・非営利のみ・改変自由)

LICENSE を参照。

データファイル(GeoNames / WorldClim / Met Museum / iNaturalist)は、それぞれの元のライセンスに従い、すべての権利は元の提供者に所属します。

Related MCP Connectors

Related MCP Servers

  • F
    license
    Not graded
    quality
    C
    maintenance
    Enables controlling an autonomous Minecraft Java Edition player through MCP, with structured world perception, navigation, gathering, crafting, combat, building, skill-based task execution, and long-term memory integration.
    -