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
Visit Server

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.

Recommended Servers

playwright-mcp

playwright-mcp

A Model Context Protocol server that enables LLMs to interact with web pages through structured accessibility snapshots without requiring vision models or screenshots.

Official
Featured
TypeScript
Audiense Insights MCP Server

Audiense Insights MCP Server

Enables interaction with Audiense Insights accounts via the Model Context Protocol, facilitating the extraction and analysis of marketing insights and audience data including demographics, behavior, and influencer engagement.

Official
Featured
Local
TypeScript
Magic Component Platform (MCP)

Magic Component Platform (MCP)

An AI-powered tool that generates modern UI components from natural language descriptions, integrating with popular IDEs to streamline UI development workflow.

Official
Featured
Local
TypeScript
VeyraX MCP

VeyraX MCP

Single MCP tool to connect all your favorite tools: Gmail, Calendar and 40 more.

Official
Featured
Local
graphlit-mcp-server

graphlit-mcp-server

The Model Context Protocol (MCP) Server enables integration between MCP clients and the Graphlit service. Ingest anything from Slack to Gmail to podcast feeds, in addition to web crawling, into a Graphlit project - and then retrieve relevant contents from the MCP client.

Official
Featured
TypeScript
Kagi MCP Server

Kagi MCP Server

An MCP server that integrates Kagi search capabilities with Claude AI, enabling Claude to perform real-time web searches when answering questions that require up-to-date information.

Official
Featured
Python
E2B

E2B

Using MCP to run code via e2b.

Official
Featured
Neon Database

Neon Database

MCP server for interacting with Neon Management API and databases

Official
Featured
Exa Search

Exa Search

A Model Context Protocol (MCP) server lets AI assistants like Claude use the Exa AI Search API for web searches. This setup allows AI models to get real-time web information in a safe and controlled way.

Official
Featured
Qdrant Server

Qdrant Server

This repository is an example of how to create a MCP server for Qdrant, a vector search engine.

Official
Featured