Buttplug MCP

2025-05-307:06242134github.com

Buttplug.io Model Context Protocol (MCP) Server. Contribute to ConAcademy/buttplug-mcp development by creating an account on GitHub.

buttplug-mcp is a Model Context Protocol (MCP) server for the Buttplug.io ecosystem. It allows Tool-supporting LLM programs like Claude Desktop query and control your Genital Interface Devices.

|insert AI-generated slop image of robots doing nasty things|
LLM|=> - - (__(__)

Once set up, you can prompt your LLM:

  • "What are my connected buttplug devices?"
  • "Set the second motor on my LELO F1S to 50% strength"
  • "How much battery is left on my Lovense Max 2?"
  • "Does my WeWibe have weak signal?"

NOTE: The above is aspirational and really the current experience is unstable and frustating.

It supports the following Resources and Tools:

Resource Description
/devices List of connected Buttplug devices in JSON.
/device/{id} Device information by device ID whereid is a number from /devices
/device/{id}/rssi RSSI signal level by device ID where id is a number from /devices
/device/{id}/battery Battery level by device ID where id is a number from /devices
Tool Params Description
device_vibrate id, motor, strength Vibrates device by id, selecting strength and optional motor
JSON Schema for Resources. Click to expand

schema_resources.json

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "resources": [
      {
        "uri": "devices",
        "name": "Device List",
        "description": "List of connected Buttplug devices in JSON",
        "mimeType": "application/json"
      }
    ]
  }
}
JSON Schema for Tools. Click to expand

schema_tools.json

{
  "jsonrpc": "2.0",
  "id": 1,
  "result": {
    "tools": [
      {
        "description": "Vibrates device by `id`, selecting `strength` and optional `motor`",
        "inputSchema": {
          "type": "object",
          "properties": {
            "id": {
              "description": "Device ID to query, sourced from `/devices`",
              "pattern": "^[0-9]*$",
              "type": "number"
            },
            "motor": {
              "description": "Motor number to vibrate, defaults to 0",
              "pattern": "^[0-9]*$",
              "type": "number"
            },
            "strength": {
              "description": "Strength from 0.0 to 1.0, with 0.0 being off and 1.0 being full",
              "pattern": "^(0(\\.\\d+)?|1(\\.0+)?)$",
              "type": "number"
            }
          },
          "required": [
            "id",
            "strength"
          ]
        },
        "name": "device_vibrate"
      }
    ]
  }
}

I started working on this on 2025-04-01, April Fool's Day, after having created another experimental MCP service, dbn-go for financial market data, the day prior. So it is fresh meat and was intended as a quick, fun educational project.

While it does work, I found the underlying go-buttplug library to be unstable in connection handling. I could ask Claude for my devices, but my specific device wouldn't vibrate even just with just Intiface Central -- it was like in read-only mode! I also wish I had a virtual buttplug.io device for testing, rather than relying on a physical device.

So, it has not truly been tested "end-to-end" 😉

I will dig more into the go-buttplug library and see why connections are unstable. I also need to understand the MCP protocol current state of MCP hosts -- it seems they focus on Tools rather than Resources and Resoure Templates.

Binaries for multiple platforms are released on GitHub through GitHub Actions.

You can also install for various platforms with Homebrew from conacademy/homebrew-tap:

brew tap conacademy/homebrew-tap
brew install conacademy/tap/buttplug-mcp

Download the Intiface Central hub application to manage your devices. Start it and note the server port (default seems to be 12345).

To use this the buttplug-mcp MCP server, you must configure your host program to use it. We will illustrate with Claude Desktop. We must find the buttplug-mcp program on our system; the example below shows where buttplug-mcp is installed with MacOS Homebrew (perhaps build your own and point at that).

The following configuration JSON sets this up:

{ "mcpServers": { "buttplug": { "command": "/opt/homebrew/bin/buttplug-mcp", "args": [ "--ws-port", "12345"
      ]
    }
  }
}

Using Claude Desktop, you can follow their configuration tutorial but substitute the configuration above. With that in place, you can ask Claude question and it will use the buttplug-mcp server. Here's example conversations:

Perhaps you can use the HomeAssistant MCP integration to turn the lights down low...

For local inferencing, there are MCP hosts that support Ollama. You can use any Ollama LLM that supports "Tools". We experimented with mcphost, authored by the developer of the mcp-go library that peformed the heavy lifting for us.

Here's how to install and run with it with the configuration above, stored in mcp.json:

$ go install github.com/mark3labs/mcphost@latest
$ mcphost -m ollama:llama3.3 --config mcp.json
...chat away...

It seems that only "Tools" are supported and not "Resources", so I couldn't enumerate and introspect my device. But I had this Tool interaction (but as noted above, my device didn't actually vibrate):

$ mcphost -m ollama:phi4-mini --config mcp.json
2025/04/02 09:25:05 INFO Model loaded provider=ollama model=phi4-mini
2025/04/02 09:25:05 INFO Initializing server... name=buttplug
2025/04/02 09:25:05 INFO Server connected name=buttplug
2025/04/02 09:25:05 INFO Tools loaded server=buttplug count=1
2025/04/02 09:28:31 INFO Model loaded provider=ollama model=phi4-mini
2025/04/02 09:28:31 INFO Initializing server... name=buttplug
2025/04/02 09:28:31 INFO Server connected name=buttplug
2025/04/02 09:28:31 INFO Tools loaded server=buttplug count=1
/servers
      # buttplug
      Command /opt/homebrew/bin/buttplug-mcp
      Arguments --ws-port 12345

/tools
  • buttplug
    • device_vibrate
      • Vibrates device by ID, selecting strength and optional motor

  You: buttplug device_vibrate id 0 at strength 1

  Assistant:
  <|tool_call|>[start_processing]

  [{"type":"function","function":{"name":"buttplug__device_vibrate","description":"Vibrates device by ID, selecting strength and optional
  motor","parameters":{"id":0,"strength":1}}]

  {}

  {"status":"success","message":"Device with id 0 is vibrating at full strength."}

Building is performed with task, with the binary available in bin/buttplug-mcp.

$ task
task: [tidy] go mod tidy
task: [build] go build -o bin/buttplug-mcp cmd/buttplug-mcp/main.go

Useful testing tools:

  • task stdio-schema | jq -- prints out JSON schemas
  • npx @modelcontextprotocol/inspector node build/index.js -- MCP Inspector Web GUI
R buttplug-mcp --help
usage: buttplug-mcp [opts]

  -h, --help              Show help
  -l, --log-file string   Log file destination (or MCP_LOG_FILE envvar). Default is stderr
  -j, --log-json          Log in JSON (default is plaintext)
      --sse               Use SSE Transport (default is STDIO transport)
      --sse-host string   host:port to listen to SSE connections
  -v, --verbose           Verbose logging
      --ws-port int       port to connect to the Buttplug Websocket server

As with all ConAcademy projects, pull requests are welcome. Or fork it. You do you.

Either way, obey our Code of Conduct. Be shady, but don't be a jerk.

Thanks for go-buttplug for the Golang Buttplug.io library and its buttplughttp example, and go-mcp for the Golang Model Context Protocol library.

Copyright (c) 2025 Neomantra BV. Authored by Evan Wies for ConAcademy.

Released under the MIT License, see LICENSE.txt.


Read the original article

Comments

  • By stevesimmons 2025-05-308:132 reply

    A few prior HN discussions on the Buttplug standard, including the inevitable "in Rust":

    * Buttplug: An open-source software suite for teledildonics (https://buttplug.io/) 5 years ago | 249 comments

    * Empathy for the user having sex with your software (https://docs.buttplug.io/docs/dev-guide/intro/buttplug-ethic...) 10 months ago | 127 comments

    * T-code – A protocol for implementing UART serial communications to an adult toy (https://stpihkal.docs.buttplug.io/protocols/tcode.html) 2 years ago | 74 comments

    * An open-source standards and software project for intimate hardware (maybe NSFW) (https://buttplug.io/) 7 years ago | 39 comments

    * Buttplug Sex Toy Control Project Implemented in Rust (https://buttplug.io/) 2 years ago | 3 comments

    • By oliwarner 2025-05-308:186 reply

      Teledildonics is just an amazing word. Really makes me want to contribute to BO.io to pad out my CV.

      Then again, it might raise uncomfortable questions about the pen testing I have on there. Something something something backdoor.

      • By TeMPOraL 2025-05-309:0711 reply

        So many ideas and industry terms get much more interesting when applied in this area.

        Penetration testing (especially with red and blue teams). Agile. Continuous delivery. "Move fast and break things". Application firewall. Protection at rest. Injection attacks. Man in the middle. Load balancing. And so on.

        There's one phrase I'm too fond of, that I thought of the other day:

        Enterprise Teledildonics

        Someone please make it become a thing.

        • By walthamstow 2025-05-3010:111 reply

          It may be UK or even London-specific but 'exponential backoff' is a great phrase in our lexicon.

          'Packet sniffing', while not sexual, is also something a lot of men in Britain do.

        • By intrasight 2025-05-3012:161 reply

          And of course the precursor to all inappropriate technical computer terms: finger

          >Someone please make it become a thing

          Why stop there? How about "Global Teledildonics". I think the world would be a better place with that.

          • By dgfitz 2025-05-3012:431 reply

            Finger, mount, touch, find if you’re self-deprecating.

            • By TeMPOraL 2025-05-3012:493 reply

              If we're going for CLI commands: zip/unzip, eject, (mod)probe, umount; I guess man counts too.

              • By ben_w 2025-05-3017:06

                And "man" can prefix all of them.

                  man date
                  man wait
                  man yes
                  man unzip
                  man touch
                  man expand
                  man mount
                  man glob
                  man unmount
                  man zip
                  man nano
                  man sleep
                
                A friend back in Cambridge decided to name a file "bottom" just so he could run "touch bottom" and giggle at the sillieness.

              • By dgfitz 2025-05-311:10

                Ah I was, off the cuff, going for core/more utils, those are great too. Ran out of ideas.

              • By Izkata 2025-05-3015:58

                [dead]

        • By semi-extrinsic 2025-05-3011:141 reply

          Edge computing. Deep learning. Uncertainty quantification. Attention head. Sparse probing. Queue managment. Consensus algorithm. Parallell I/O.

        • By Centigonal 2025-05-3013:12

          If you do enough enterprise teledildonics, you may end up with an excess of Splunk.

        • By chneu 2025-05-309:42

          A/B testing my teledildonics.

        • By GloomyBoots 2025-05-3016:201 reply

          Pretty sure in this niche a MITM is called a Lucky Pierre.

          • By TeMPOraL 2025-05-3020:19

            If I ever get around to writing a tool for defeating all the HSTS/DoH/cert pinning nonsense in personal/home setting, that's how I'll name it.

        • By donjoe 2025-05-3011:50

          Let's hope it's deepseek-compatible.

        • By latentsea 2025-05-3010:382 reply

          A few more good ones suggested by ChatGPT since this is a great discovery.

          Hot swap. Hardening the system. Spoofing. Release pipeline. Uptime guarantee. Burst capacity. Stand-up. Forking the repo. Detached HEAD.

          • By throwaway290 2025-05-3011:521 reply

            "Detached HEAD" this is uncanny valley of why LLM should not be used in anything related to psychology. Obviously just HEAD is funny enough but no it came up with detached HEAD (because it doesn't have any mental imagery or empathy, of course). Detached HEAD is a whole another level worse than force push if you ask me.

            Why ask LLM for puns anyway? Do you delegate all the fun or activities in your life?

            • By latentsea 2025-05-3012:33

              Why ask the thing whose primary strength is language, a question pertaining to language?

              Man... maybe I just like to have fun at scale.

          • By 4ggr0 2025-05-3010:402 reply

            > Spoofing

            not sure what spoofing would be in a sexual context, but it does sounds like something potentially illegal, or at least morally gray :D

            Maybe because Spoof sounds simiar to Snuff...

            • By jijijijij 2025-05-3017:141 reply

              Sounds more similar to boofing.

              Spoofing may be the act of pretending to blowing coke up someone's butt, but then "accidentally" snorting it yourself.

              Samantha: Woah, easy now. It's my turn!

              Dave: Alright, alright, I'll do it! [prepares straw; fakes choking, coughing]

              Samantha: WTF, Dave?! Freeloading as always, now you fucking spoofed me???

              • By emeril 2025-05-3018:151 reply

                I know about boofing, I learned about it during one of the more recent us supreme court confirmation hearings

                • By jijijijij 2025-05-3020:01

                  See? Who needs an department of education?!

            • By latentsea 2025-05-3010:501 reply

              Spoof is a slang term used in certain parts of the world that refers to a certain viscous liquid.

              • By alt227 2025-05-3011:111 reply

                I think you might mean 'Spuff'.

                A sentance I never thought I would write on HN.

                • By latentsea 2025-05-3012:17

                  It goes by many names. Spunk being another, but spoof being one too.

        • By latentsea 2025-05-3010:30

          "shift left" is another good one.

        • By latentsea 2025-05-3010:431 reply

          [flagged]

      • By pcthrowaway 2025-05-309:481 reply

        If you can demonstrate a novel pathway to inserting large payloads into unsuspecting backends, you may be a good candidate for government jobs.

        • By oliwarner 2025-05-316:18

          No one distributes their package like me.

      • By wantoncl 2025-05-3011:191 reply

        FizzBuzz will become an especially relevant interview question.

        • By ssousa666 2025-05-3012:10

          my intuition tells me that this problem is best solved using DP

      • By ThatMedicIsASpy 2025-05-3010:34

        Feel free to do so. As I have started to play with one (Edge 2) this week and the device control part of the documentation is basically empty.

      • By fer 2025-05-309:07

        Something something code injection.

    • By rgoulter 2025-05-309:222 reply

      Related:

      * Deldo is a sex toy control and teledildonics mode for Emacs (github.com/qdot) (2021) https://news.ycombinator.com/item?id=29207607 | 126 comments

      • By neomantra 2025-05-3015:511 reply

        That is also by qDot [1], the Buttplug.io author. When I just looked at their GitHub today, I realized I used their libs in other projects over the years (OpenKinect and libnifalcon). They share lots of great work!

        [1] https://github.com/qdot

      • By DonHopkins 2025-05-3010:23

        I am now having second thoughts about having named my cat Emacs!

  • By wiml 2025-05-307:534 reply

    Is this the "vibe coding" I keep hearing about?

  • By Perz1val 2025-05-308:057 reply

    I've seen APIs for controlling those toys already a few times and it always surprises me that they're quite open. It's a thing I'd expect each device to come with a proprietary locked down app and nobody complaining about it publically, because that'd look.bad on them. Anyone can tell me why is that different? Is it because huge corporations are staying away from the market, thus they couldn't have ruined it?

    • By Kwpolska 2025-05-308:56

      AFAIK, those APIs aren't publicly described by the vendors, they were reverse engineered by the community. Also, the toys themselves are Bluetooth-based, so pairing and proximity are enough for security.

    • By devjab 2025-05-309:421 reply

      I'm not English and I'm not sure what you would call electronic devices in your house, but very few of the ones you'd find in a typical Danish household which are locked down particularily well. It tends to be fairly easy to "hack" anything which has a computer in it, whether that is your Microwave, your electrical toothbrush, your router, your e-bike or something similar. What sets sex-toys appart is probably the amount of effort people are willing to put into hacking them. I'm guessing here, but I imagine you'd find a lot more people wanting to hack their sex-toys compared to people wanting to hack their Microwave.

      Until I saw this post, I thought the e-bike community was the largest "hacker" community in regards to tampering with your electronics, but I imagine it too is dwarfed by sextoy hackers. Anyway, here in Europe there are a lot of hacks for e-bike computers. Part of this is because many people want to increase the software restraints on speed limits. Which is illegal, and, at least in larger Danish cities also very likely to get caught. Many people do it for statistics though, my e-bike computer as an example resets my "current" milage every 500km and then store the total in another place (something which gets reset everytime it's in the shop). It also didn't have a clock option for any of it's standard screens. My primary reason for hacking it was getting a clock on the display, but I now also back-up my milage + I have some added statistics for fun. When it needs to go into the store, I re-flash it to the factory settings or whatever you'd call it. I'm by no means a device hacker, but it wasn't hard to search engine my brand and find the tools I needed to do what I wanted.

      Anyway, I don't think there is a lot of "secuirty" in any of our daily devices. Maybe it's because I'm European and a lot of people wouldn't want the NSA watching in through a Google Camera, and therefor buy non-major-tech-company brand stuff, but even things from large brands like Bosch are very hackable. Again, I'm not a device hacker as such, but isn't everything rather hackable once you have the hardware?

      • By yard2010 2025-05-3012:54

        How would you get caught for opening a speed restrictions and what are the consequences?

    • By Grayskull 2025-05-308:49

      My guess is, it has to do with cam streamers and ability for people to develop extensions for streaming platforms for their devices. Lovesense, for example, became shorthand for "toy controlled by chat" on streaming sites.

    • By koolba 2025-05-3011:07

      > I've seen APIs for controlling those toys already a few times and it always surprises me that they're quite open.

      Not really. People in the space are to used bending over backwards to please their customers.

    • By tecleandor 2025-05-309:42

      As @Kwpolska says, mostly they have reverse engineered Bluetooth protocols. I'm on my work computer (that's fiercely monitored) so can't give you much links right now, but Buttplug site has information about all the messages and protocols. And some of them are quite a mess.

      Some of them, like Lovense, have said they had intention to publish APIs, but they just have some empty repositories in Github. (Lovense is a weird company, everything points to just one or two persons in [IIRC] Taiwan. They're very opaque.)

      And some have been fishy too. There have been class actions against brands like Hytto / Lush [0] or We-Vibe [1]

      --

      0: https://www.courthousenews.com/judge-forwards-class-action-s... 1: https://topclassactions.com/lawsuit-settlements/lawsuit-news...

    • By jijijijij 2025-05-3017:53

      Pretty sure that's because those toy companies are using cheapest off-the-shelf chips and most basic protocols, because, well, it's cheaper. Likely a lot of rebranded, "open" Chinese toys anyway. That and a neglect for reliability and security probably makes reverse engineering rather straight forward.

      Assumption based on connectivity experience, since the Bluetooth connection is usually rather unreliable and weird, and obviously not as well engineered as even cheap Bluetooth in-ear headphones, or game controlers. Ironically very susceptible to being blocked by body parts (which means vibe no more). Seems, like it's some dead simple serial transmission, which isn't fault tolerant at all. Those controllers are not bothering with any buffering, or much any computation at all really. Seems like they just straight stream signals to the motors.

    • By lofaszvanitt 2025-05-3011:44

      Of course these tools are open, otherwise how would you interface with them?

HackerNews