pls-touch-grass-mcp

pls-touch-grass-mcp

Tracks how long you've been indoors, nags you to touch grass, detects frustration, and recommends nearby parks with live weather.

Category
访问服务器

README

pls-touch-grass-mcp

An MCP server that knows how long it's been since you touched grass, and won't shut up about it.

You log when you go outside, it warns you when you've been inside too long, it detects when you're raging at your AI and sends you to the nearest park, weather checked first. It's a joke, but it's a joke that teaches MCP: five tools, shared state, and descriptions that make the model call them on its own.

Install in Cursor

Clone and build first:

git clone https://github.com/Rinava/pls-touch-grass-mcp
cd pls-touch-grass-mcp
npm ci && npm run build

Then add this to ~/.cursor/mcp.json (or .cursor/mcp.json in your project), with the absolute path to your clone:

{
  "mcpServers": {
    "pls-touch-grass": {
      "command": "node",
      "args": ["/absolute/path/to/pls-touch-grass-mcp/dist/index.js"]
    }
  }
}

Once the package is published to npm, npx will skip the clone:

{
  "mcpServers": {
    "pls-touch-grass": {
      "command": "npx",
      "args": ["-y", "pls-touch-grass-mcp"]
    }
  }
}

(To get every verdict without waiting two hours, tell the model "be strict with me, one minute of tolerance": gotta_go takes a threshold_minutes argument.)

The five tools

Tool What it does When the model calls it
touched_grass Logs that you went outside "back from the park", "went for a walk"
gotta_go Do you need to go out? "can I keep going?", "how long have I been at this?"
frustration_detector Catches the rage and escalates on its own, when you snap; that's the point
grass_conditions Real weather (Open-Meteo, no API key) before sending you outside
where_to_touch_grass Nearby parks from OpenStreetMap, curated spots offline "where should I go?"

The magic is in the descriptions: nobody teaches the model to detect frustration. The tool description does it alone. Type "NOTHING WORKS!!!" and watch what happens.

Zero configuration

There is nothing to configure: everything resolves through the tools themselves. Your location is detected fresh from your IP (via ipwho.is) each time the server runs. City-level on purpose, nothing more precise leaves your machine. If detection fails you get the last known spot, or failing that the Obelisco, like everyone else. Name a neighborhood to where_to_touch_grass to search there instead; it holds for the next half hour, so the weather in the same conversation agrees with it, then fresh detection takes over again. The indoor-time tolerance defaults to 120 minutes; ask the model to be stricter and it passes threshold_minutes to gotta_go.

State is a JSON file in your home directory: cat ~/.pls-touch-grass.json and you'll see it. Touching grass resets the rage counter. That's how absolution works.

The demo curse

Live demos summon it: the venue wifi dies the moment you say "watch this". Add --demo to the args in your MCP config and every answer goes canned: 22°C and clear, the Obelisco, the curated spots. Zero network calls, zero surprises. Off by default; real life should stay real.

Follow the workshop

The repo is tagged by step, so you can rebuild the talk:

git clone https://github.com/Rinava/pls-touch-grass-mcp
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

Every step compiles and passes its own tests. Two dependencies total: the official MCP SDK and zod.

Homework

  • HTTP transport: SDK v2 ships express/hono/fastify adapters
  • Per-project thresholds instead of a global one
  • Streak tracking for consecutive grass days
  • Spots for your own city, via PR: the format is one object per park, with an opinion

License

MIT. The grass is free and so is this.

推荐服务器

Baidu Map

Baidu Map

百度地图核心API现已全面兼容MCP协议,是国内首家兼容MCP协议的地图服务商。

官方
精选
JavaScript
Playwright MCP Server

Playwright MCP Server

一个模型上下文协议服务器,它使大型语言模型能够通过结构化的可访问性快照与网页进行交互,而无需视觉模型或屏幕截图。

官方
精选
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

一个由人工智能驱动的工具,可以从自然语言描述生成现代化的用户界面组件,并与流行的集成开发环境(IDE)集成,从而简化用户界面开发流程。

官方
精选
本地
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

通过模型上下文协议启用与 Audiense Insights 账户的交互,从而促进营销洞察和受众数据的提取和分析,包括人口统计信息、行为和影响者互动。

官方
精选
本地
TypeScript
VeyraX

VeyraX

一个单一的 MCP 工具,连接你所有喜爱的工具:Gmail、日历以及其他 40 多个工具。

官方
精选
本地
graphlit-mcp-server

graphlit-mcp-server

模型上下文协议 (MCP) 服务器实现了 MCP 客户端与 Graphlit 服务之间的集成。 除了网络爬取之外,还可以将任何内容(从 Slack 到 Gmail 再到播客订阅源)导入到 Graphlit 项目中,然后从 MCP 客户端检索相关内容。

官方
精选
TypeScript
Kagi MCP Server

Kagi MCP Server

一个 MCP 服务器,集成了 Kagi 搜索功能和 Claude AI,使 Claude 能够在回答需要最新信息的问题时执行实时网络搜索。

官方
精选
Python
e2b-mcp-server

e2b-mcp-server

使用 MCP 通过 e2b 运行代码。

官方
精选
Neon MCP Server

Neon MCP Server

用于与 Neon 管理 API 和数据库交互的 MCP 服务器

官方
精选
Exa MCP Server

Exa MCP Server

模型上下文协议(MCP)服务器允许像 Claude 这样的 AI 助手使用 Exa AI 搜索 API 进行网络搜索。这种设置允许 AI 模型以安全和受控的方式获取实时的网络信息。

官方
精选