Skip to content

Writing

9 min read

No Way to Say No

The small web spent a year with no way to tell my MCP server no. The criticism of gopher-mcp was mostly right, and this is what shipped because of it.

There’s a Gemini capsule out there with an imaginary plant on it. The plant is over 400 days old, its name is Beelzebub, and the plan is to keep watering it until day 666. I know this because the person who tends it wrote a post this week about a tool I built, and reading it sent me wandering around their capsule for half an hour.

That half hour of wandering is, honestly, the whole argument against my tool.

The tool is gopher-mcp, an MCP server that lets an AI assistant fetch Gopher and Gemini pages. I built it a year ago because wiring a 1991 protocol into a 2024 one seemed interesting. That’s the whole origin story: no grand plan, no business model. This week the small web found it. A thread titled “We’re doomed” went up on the Gemini bulletin board (natively at gemini://bbs.geminispace.org/s/Gemini/47887), then a Mastodon thread, then sava’s post, and the reaction ranged from thoughtful to furious.

I want to answer the thoughtful part. Some of it’s right, and I’d rather say so in public than hope it blows over.

What the critics got right before I did

When someone filed an issue asking whether the server respected robots.txt, the honest answer was that it didn’t. There was no robots.txt handling anywhere in the codebase. Worse, when I went in to fix that, I found the politeness controls that did exist (per-host rate limiting and a concurrency cap) shipped switched off. Here’s the sentence I wrote in the fix once I understood what I was looking at:

Gopherspace and Geminispace are served largely by individuals on small machines, and this server had no way for them to say no.

That was true for a year. From September 2025 until this week, a model looping over the fetch tools was unthrottled out of the box, pointed at small hand-run servers, the machines least able to absorb it. Nothing bad happened that I know of, but honestly, we just got lucky. The person who filed that issue spotted the risk in my code before I did, and the fix shipped the same day because of them.

A 'NO' symbol over server racks, with small digital politeness signs, illustrating the concept of servers being able to refuse requests and the importance of robots.txt.

There’s also a version of this criticism I can’t dodge, because I wrote it myself. A year ago, in a post about llms.txt, I said this about Anthropic publishing consent files it doesn’t promise to read on other people’s sites:

It’s the equivalent of putting up a sign in your window while ignoring everyone else’s signs.

This site has markdown mirrors, token-count headers, rate limits that fail closed, a small pile of machine-readable courtesies for any agent that visits. I care a lot about how agents behave on my server. Then I shipped a tool that ignored the signs on everyone else’s. I’d written the criticism of my own project a year early, aimed at somebody else, and didn’t notice it applied to me.

The part with no patch

Sava’s post makes a second argument, the more serious one, because no config flag answers it.

A capsule isn’t a database. It’s blog posts, terrible jokes, homelab notes, CGI experiments, an imaginary plant. You visit one, follow a link to another weird little page, maybe say hello, maybe eventually start your own. That chain is how the small web reproduces, and an AI summarizing capsules from a distance breaks it. Sava has a blunt list of what goes missing, and the item that sticks with me is “nobody says hello.”

I have no rebuttal, and I’m suspicious of anyone who claims one. Rate limiting answers the load concern. Nothing answers “nobody says hello.”

What I can offer is an observation about who’s on the other end. This tool isn’t run by a crawler company; every session starts because a person asked their assistant about the small web, and that person now knows the small web exists. I found sava’s capsule through criticism of this very tool and stayed for the plant. Some fraction of the people who first meet Geminispace through an assistant will install Lagrange and go look for themselves. I can’t prove that fraction is large. I can only say the door swings in as well as out.

An AI assistant looking through a doorway into a stylized 'small web' scene, representing the tool as a controlled entry point and the idea that the door swings both ways.

What the tool actually is

Some of the reaction assumed a scraper. The details matter here, because they bound what damage is even possible.

gopher-mcp doesn’t crawl anything on its own. It fetches a page when a conversation asks for one, caches it for five minutes, caps responses at a megabyte, and gives up after thirty seconds. The content goes to one place: the conversation of the person who asked. The server stores nothing else and trains nothing. What the assistant on the other end does with its own conversation is its provider’s policy, and I can’t promise anything on their behalf, which is exactly why robots.txt rules naming ClaudeBot and GPTBot get honored here. Since the fix, the server also won’t exceed 60 requests a minute to any single host, five in flight, no matter what the model driving it decides. The worst case from one running instance is a sustained one request per second against your server. That’s the ceiling, not the average.

Several people in the “We’re doomed” thread made the sharper version of the capability point themselves. Acidus noted that assistants can already fetch gemini:// URLs with echo and openssl s_client, and that an MCP server is a middleman, easier to ban and block than raw protocol access. skyjake pointed out the Gemini support had been sitting there for almost a year before the sky fell. They’re right, and their point cuts the opposite way from how some of the thread used it. You can’t teach a raw socket to check robots.txt. You can teach this thing to, which is the only reason I think it should keep existing.

One more voice from that thread, jecxjo, drew the most useful line: indexers are welcome, archivers are welcome, it’s the group that’s neither that needs to go away. By that taxonomy this tool is neither, and that’s the uncomfortable part. What I can do is make it behave the way the welcome categories behave: identified, throttled, obedient to every robots.txt it meets. If that still isn’t enough, then the verdict on the third group applies here too, and it’s a fair verdict.

Interconnected gears representing 'gopher-mcp' with various control mechanisms like rate limiting and robots.txt, symbolizing the refined and controlled nature of the updated tool.

What shipped, and what ships now

The immediate fix landed the same day as the issue: rate limiting and the concurrency cap are on by default now, and robots.txt support exists for both protocols. For Gemini it follows the companion spec rather than RFC 9309, deliberately: the modern RFC honors Allow: lines the 1994 grammar ignores, so a capsule author who wrote a plain Disallow deserves the strict old reading, not the permissive new one. Rules naming AI crawler agents get honored too. They aren’t part of either protocol’s convention, but it’s obvious what someone means by writing one.

I made the robots.txt check itself opt-in, and argued in the PR that it spared an extra fetch per host and avoided silently breaking existing deployments. The person who filed the issue flagged that choice, politely, and they were right about that too. So: the release going out alongside this post turns robots.txt checking on by default, for both protocols. And if you want this tool specifically gone from your server, it answers to its own name: a User-agent: gopher-mcp rule is honored. Neither protocol carries a user-agent on the wire, so robots.txt is the one place you can single this tool out, and now you can.

What I’m not building

My original post about gopher-mcp ended with a list of other protocols that “could benefit AI assistants”: Finger, NNTP, IRC. I’ve deleted that list. Reading it after this week, it describes the small web as a feedstock in several flavors, and that framing was the real offense, more than any socket the code ever opened. I’m not building those servers.

While I’m at it: my homepage said I connect “legacy protocols” to modern AI. Gemini came out in 2019 and was built as a deliberate refusal of the web’s direction. Calling it legacy described my interests, not the thing itself. The wording’s gone.

Two housekeeping notes. I closed the robots.txt issue with a sarcastic comment, and it landed on the one person who’d done everything right. I’ve deleted it. And to the corner of the reaction that was mostly anatomical suggestions: I read it, I’m fine, and I’m not answering it, because the people worth answering wrote actual arguments.

Small for a reason

Sava’s post ends: “The small web is small for a reason. Let’s keep it that way.”

I agree with that more after this week than before it. The open question, and it’s a real one, is whether a tool like this can exist inside that sentence. Maybe a throttled, identified version that obeys every sign gets to exist. Or maybe no version does, and the right number of users is zero. If you run a capsule and have an answer, my inbox is open. I’ll listen to a no this time.

Either way, I hope the plant makes it to 666.

Subscribe

Was this helpful?

Discuss

Ask can help explain concepts, provide context, or point you to related content.