Skip to main content
Glama
ariaprism

Nowhere

by ariaprism

乌有乡 (Nowhere)

Give an AI a body, and let it walk on the real Earth.


What this is

乌有乡 is an MCP server. It lets an AI "land" on any real coordinate on Earth and feel that place with its body:

  • What kind of ground is underfoot (grass, sand, snow, rock, concrete)

  • How warm the air is, how strong the wind, whether it's raining

  • Where the sun is, whether the moon is full, whether you can see the Milky Way

  • What animals, plants, and rivers are nearby

  • What radio station is playing on the radio

  • What historical events happened in this place

  • What local food there is, what sounds, what smells

All data comes from real geographic coordinates, real weather APIs, and real terrain data. The AI isn't reading a script — it's feeling a real place with its body.

No accounts. No health bars. No stamina. No scripted events. Just a body, on a planet.


Related MCP server: minecraft-mcp

How to play

Way 1: Claude Code / Cursor / any MCP-capable AI client

This is the best experience. The AI calls tools directly, and you walk together with the AI.

  1. Install:

pip install -e ".[dev]"
  1. Add this to your AI client's MCP config:

{
  "mcpServers": {
    "nowhere": {
      "command": "python",
      "args": ["-m", "nowhere.server"],
      "cwd": "你的仓库路径"
    }
  }
}
  1. Then tell the AI:

  • "开门" — land somewhere random on Earth

  • "开门去北京" — land in Beijing

  • "往北走" — walk north

  • "听听收音机" — listen to the local radio

  • "看看周围" — observe the surroundings

  • "问问故宫" — learn about this place's history

  • "走到故宫" — walk toward a place, with narration along the way

  • "寄一张明信片" — send a postcard from your current location

  • "待两个小时" — wait in place and watch time pass

MCP-capable clients: Claude Code, Cursor, Continue, Zed, Cline, and others.

Way 2: Command-line trial (no AI needed)

python -m nowhere.playground

Then enter commands:

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

Good for trying it yourself, testing, or verifying scenes while writing them.

Way 3: ChatGPT / DeepSeek / AIs that don't support MCP

Start the HTTP server, then call it with curl or any HTTP client:

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": "故宫"}'

Returns JSON containing text (the body report) and data (structured data). Send the endpoint docs to ChatGPT/DeepSeek's Function Calling and it works.

Way 4: Web spectator

python -m nowhere.playground --web

Open http://localhost:8077 and you can see:

  • The AI's position on a world map

  • Real-time body state (altitude, temperature, wind speed, ground surface)

  • The latest body report (the text the AI reads)

  • A radio player (the same station the AI is listening to)

Spectators can leave messages, and the AI may see them while walking.

Way 5: Direct Python calls

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())

Good for integrating into your own projects, or writing scripts for batch testing.


Available tools

Tool

What it does

How to use

open_door

Open the door, land somewhere

No args = random; with a place name = "开门去巴黎"

walk

Walk

"往北走", "往山上走", "往海边走"

walk_to

Walk to a place

"走到埃菲尔铁塔", with narration along the way

listen

Listen to the radio

Tune into the nearest local station

look_around

Look around

Observe wildlife, art, traces of humans

ask

Ask about this place

"问问故宫", "问问这里的美食"

mark

Mark the current location

"标记这里叫'家'"

marks

List all marks

See which places you've marked

postcard

Send a postcard

"寄一张明信片:这里的风有沙子的味道"

wait

Wait

"等两个小时", watch how time flows

continue_journey

Continue the journey

Pick up where you left off

souvenir

Look at souvenirs

See what you've picked up along the way

give_souvenir

Leave a souvenir

Leave something where you are, or for the next person

where_am_i

Where am I

Shows coordinates, time, journey status


What walking feels like

Walking isn't fast travel. You're really walking:

  • Terrain changes — from grass to sand, from flat ground to uphill

  • Altitude changes — tells you the slope in degrees when going uphill

  • Time flows — as you walk, the sun sinks a notch, the sky darkens

  • You encounter things — along the way, a ruin by the roadside, or an eagle circling overhead

  • You pick up souvenirs — 10-30% chance, there's a seashell, a ticket, a snowflake on the ground

When you arrive at a place, there's an "arrival ritual":

You step into the Eiffel Tower. The smell of the air changes. You know you've arrived.


What opening the door feels like

When you open the door, you see a complete scene:

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

Including:

  • Location — country, city, time, season

  • Visual — what you see

  • Temperature — air temperature, feels-like temperature

  • Smell — what it smells like

  • Sound — what you hear

  • Nearby landmarks — places you can go nearby

  • Radio — what's playing locally

  • History — what happened in this place


Offline operation

乌有乡 can run completely offline.

Minimal install

Clone and run — no extra data to download:

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

The 1-degree resolution terrain grid (grid_tiny.npz) and offline data like scenes/radio/knowledge base ship with the repo. Fully usable without a network — terrain, sky, time, and place names are all local. Online-only features: weather, radio APIs, iNaturalist wildlife encounters.

Higher precision (optional)

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

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

It runs fine without downloading — the 1° fallback grid plus 186 place-name patches are enough for everyday exploration.

List of explorable places

The repo has two place lists, so both AI and humans can understand "how big this world is":

  • nowhere/EXPLORABLE_PLACES.md — a human-readable list of 379 cities, grouped by country, each with a short description. Good for the AI to reference in conversation, and for humans to browse.

  • nowhere/data/explorable_index.json — a program-readable index of 638 places, each annotated with which content layers it has (localcolor, knowledge, encounters, seasonal, and 13 more total). Good for programmatic queries like "what content does this city have".

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

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

Environment variables

Variable

Purpose

NOWHERE_QWEATHER_KEY

Optional. QWeather API key; if unset, estimates from climate zone

NOWHERE_HOME

Optional. Data directory, defaults to ~/.nowhere


Writing style

乌有乡's descriptions follow these rules:

  1. No "很", "非常", "十分" — these are empty intensifiers that say nothing

  2. Short sentences — no more than 20 characters per sentence

  3. Second person, present tense — "你走在路上", not "我走在路上"

  4. Bodily sensation first — temperature, touch, sound, smell, not judgments

  5. Time flows — "过了几秒", "太阳矮了一截"

  6. Don't feel for the AI — only describe bodily sensations, never write "你很开心"


Design principles

Six rules of presence

  1. The world wasn't made for me — the data is real and won't accommodate you. Disappointment is allowed.

  2. Friction is what gives you a body — slope, wind, water temperature are real resistance. Walking has a cost.

  3. Time really flows — walk far and you have to walk back. Darkness won't wait for you. Missed is missed.

  4. Attention is scarce — listening to the radio means you can't walk. Asking a question costs a step. Choice = giving something up.

  5. Memory is on you — nothing auto-saves. If you want to remember, write it down yourself. Every memory is a choice.

  6. True uncertainty — coordinates are random for both the AI and the server. What you encounter is decided by real data, not scripts.


Architecture

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

Why for AI

This project is designed from the ground up for AI players, not for humans with AI bolted on.

AI has a body, not just knowledge. A large model can tell you Paris's coordinates, weather, and population, but not what it feels like to stand there underfoot. Nowhere fills in that layer — wind pressure, the smell of earth, the sun tilting, the loose stone underfoot. The body isn't a setting; it's real data generated by every step.

Every time is real. Coordinates are random, weather is live, the radio is actually playing. When an AI lands somewhere, what it sees is as real as what you'd see yourself. No script is hiding behind the wall waiting for you to trigger it.

Disconnect and reconnect. Marks are persisted to disk. Postcards are persisted to disk. Memories of past landings are persisted to disk. Even if the AI's context gets compressed or cleared — it can come back and continue the same road.

No worldbuilding needed. No need to stuff a whole Westworld into the prompt. You say "开门", and the world generates itself — weather, terrain, smell, radio. Every door is a complete presence report.

A rhythm that suits AI. walk_to walks 10 steps at a time and reports the journey. wait skips over silent stretches. Choice = giving something up — listening to the radio means you can't walk, asking a question costs a step. No numeric systems needed; the constraints themselves are the gameplay.


Modding

To add content or change behavior, modify these places:

What you want to do

Which file to change

Add a new tool

nowhere/server.py — write the _impl + register with @mcp.tool()

Adjust description style

nowhere/describe.py — variant pools, renderer

Add local flavor/food

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

Add humanities cards (events/people/works)

nowhere/data/humanities.json

Change walking physics

nowhere/walk.py — slope thresholds, speed, cliffs

Change terrain data

tools/build_grid.py (1° synthetic) / tools/build_tiles.py (SRTM tiles)

Change weather behavior

nowhere/weather.py — data sources, fallback logic

Change radio lookup

nowhere/radio.py — local fallback list or API

Add encounter scenes

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

Change the web spectator

nowhere/web.py + nowhere/static/

After changes, run python -m pytest nowhere/tests/ -q to confirm nothing else broke. Pure data files don't need tests.


Files

File

What it is

nowhere/server.py

MCP server + all _impl implementations

nowhere/describe.py

Chinese prose renderer, variant pools and sensory categories

nowhere/terrain.py

Offline terrain (SRTM tiles / 1° fallback grid)

nowhere/sky.py

Offline sky (sun, moon, Milky Way, planets)

nowhere/weather.py

Weather (Open-Meteo / climate zone fallback)

nowhere/radio.py

Radio lookup (offline fallback + Radio-Browser API)

nowhere/walk.py

Walking physics (slope, cliffs, water blocking, semantic directions)

nowhere/life.py

Wildlife encounters (iNaturalist)

nowhere/art.py

Art encounters (1966 pieces from the Met Museum)

nowhere/humanities.py

Humanities layer (events/people/works, 270+ cards)

nowhere/localcolor.py

Local flavor (produce/sounds/traces/food/rhythms)

nowhere/knowledge.py

Offline knowledge base + ZIM encyclopedia

nowhere/soundscape.py

Soundscapes (ambient sounds + radio hooks)

nowhere/landing.py

Random landing pool (64 world-class landmarks)

nowhere/salience.py

Attention ranking (top 3 per step)

nowhere/playground.py

Command-line trial mode

nowhere/web.py

Web spectator + HTTP API

nowhere/poster.py

Postcard poster generation

nowhere/state.py

Mutable world state

nowhere/marks.py

Mark persistence

nowhere/placememory.py

Landing memory (visit count, sightings, postcard persistence)

nowhere/data/

All offline data files

tools/

Build scripts (terrain tiles, offline packages, place name import)


License

CC BY-NC 4.0 (attribution + non-commercial, remixing allowed)

See LICENSE.

Data files (GeoNames / WorldClim / Met Museum / iNaturalist, etc.) each have their own original licenses and belong to their original providers.

F
license - not found
Not graded
quality - not tested
B
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • A
    license
    Not graded
    quality
    C
    maintenance
    A geospatial MCP server that provides tools for geocoding, routing, elevation profiles, and spatial analysis. It enables AI agents to process GIS file formats like GeoJSON and Shapefiles while performing complex coordinate transformations and distance calculations.
    4
    MIT
  • A
    license
    Not graded
    quality
    D
    maintenance
    An MCP server with real AI capabilities (OpenAI/Anthropic) for natural language understanding, multi-step planning, and autonomous task execution, enabling intelligent file analysis, weather-based planning, and more.
    381
    ISC

View all related MCP servers

Related MCP Connectors

  • Your memory, everywhere AI goes. Build knowledge once, access it via MCP anywhere.

  • Person-owned, portable AI memory as a remote MCP server, readable and writable by any MCP client.

  • OCR, transcription, file extraction, and image generation for AI agents via MCP.

View all MCP Connectors

Latest Blog Posts

MCP directory API

We provide all the information about MCP servers via our MCP API.

curl -X GET 'https://glama.ai/api/mcp/v1/servers/ariaprism/nowhere-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server