Vibe-Coding an MCP Server

All Articles AI Culture Data Management Level 12 News Python Salesforce Software Development Testing

I built a Model Context Protocol (MCP) server that interfaces with Indianapolis's trash pickup website, allowing AI assistants like Claude to look up trash collection schedules with a simple prompt. This demonstrates how MCP can turn everyday web services into AI-accessible tools with minimal coding effort.

Indianapolis has a nice web app for finding your trash pickup day. In addition to the pickup day, it shows your bulk pickup day, your trash provider (which varies based on geography), and the provider's phone number.

Due to undiagnosed issues with mental math, I always forget when the bulk pickup day is for my side of town (it turns out it is the second full week of the month). What better way to serve humanity than to throw GPUs at the problem?

What MCP Is and Why It Matters

Model Context Protocol (MCP) allows AI models to interact with external tools and APIs without requiring users to write custom integration code. MCP makes AI assistants significantly more powerful by performing actions in the real world rather than just providing information.

I decided to write a Model Context Protocol (MCP) server to interface with the indy.gov trash pickup app so I can look up my trash pickup day without the arduous burden of clicking three or four times.

An MCP server is basically an interface that allows LLMs to perform actions without the LLM user needing to write custom code. For example, with only a prompt, you can:

  • Get your trash pickup day
  • Create calendar events
  • Order pizza
  • Create 3D models

MCP unlocks a lot of exciting possibilities as well as some unique challenges. More on that later.

How I Built It: Maximum Results with Minimal Effort

Because I was creating the server in my spare time, I was determined to write as little code as possible.

I fired up my coding agent Aider and described my specification. After Aider asked for some low-level details, it created a Python implementation for me. Impressive, most impressive.

Since I haven't "embraced the exponentials" enough to run the code without reading it first, I opened the server code in my editor.

Some IDE errors indicated that there was a problem with the MCP library. On closer investigation, Aider had used a random Python library rather than the official Python MCP SDK. However, this was easy enough to fix manually.

Testing and Integration Process

At this point, I wasn't sure how to test that the server was working correctly. Fortunately, the MCP SDK has a command line tool that runs a web GUI where you can poke at your server.

Once I was satisfied it was functional, it was time to integrate with an LLM. After a few false starts, I successfully added the MCP server to Claude Desktop's JSON MCP config file. Now my trash pickup tool shows up in the Claude UI!

My Claude MCP config file:

{
  "mcpServers": {
    "indy_gov": {
      "command": "uv",
      "args": [
        "--directory",
        "<your_downloaded_location>/indy-gov-mcp/",
        "run",
        "server.py"
      ]
    }
  }
}

Note that uv makes it easy to run MCP servers. I wrote another post with 5 uv dependency features developers should know about if you want to learn more about uv.

My server in Claude:

Using the MCP Server with Claude

Next, I asked what my trash pickup day was. Since Claude had access to my trash pickup tool, it knew it could answer.

Based on the MCP server config, it knew to ask for my address. Once I responded with my address, Claude asked me to approve calling the MCP server, with a suitably scary security warning.

Once I clicked allow, Claude handed the MCP server my address and received a JSON response. Finally, it converted the JSON response to human-readable text and responded. I was able to follow up by asking what my next bulk pickup day is (something the indy.gov web app doesn't show).

Notice that even though I ignored Claude’s instructions about address format, Claude was smart enough to pass the correct format to the MCP server.

The Potential, Security, and Implications of MCP

While my use case was rather trivial, I instantly gained an appreciation for the capabilities of MCP. It's easy to imagine MCP servers that can perform a host of actions on my behalf. They could even work in tandem to carry out multi-step actions.

For a thorough deep dive, I recommend Addy Osmani’s post MCP: What It Is and Why It Matters.

A cautionary note: it was clear to me that the security model of MCP is as full of holes as Swiss cheese. For instance, by changing the docstring of my MCP server Python function, I was able to change what data Claude passed to my server.

MCP servers can execute highly privileged code on your system. Malicious servers or even malicious prompts could really ruin your day by hosing your computer or siphoning your bank credentials.

For now, keep a human in the loop and treat MCP-enabled AI tools as a hostile environment. I recommend Simon Willison’s post Model Context Protocol has prompt injection security problems for further reading.

Conclusion and Resources

Ultimately, I’m sure the security and usability issues will be mitigated, though not eliminated, over time. With judicious usage, MCP servers will soon become an essential part of your AI toolbox.

You can access the GitHub repo for the trash pickup MCP server. Use at your own risk.

Originally published on 2025-04-16 by Ben Chopson

Reach out to us to discuss your complex deployment needs (or to chat about Star Trek)