No-as-a-Service

Because your time is valuable. Allegedly.

A free API that says no so you don't have to. Because apparently that's hard.

1,021
Ways to Say No
4
Politeness Levels
$0
What You'll Pay

What Is This?

NoaaS is a free API that returns creative ways to decline things. Because apparently "no" by itself is too simple for modern society, and you need 1,021 different ways to say it while maintaining plausible deniability.

Perfect for people who struggle with boundaries, have too many meetings, or need to sound polite while absolutely meaning the opposite. No installation required. Just use the API.

Polite

For when you want them to think you actually considered their request

Humorous

Because adding a joke makes rejection feel less like rejection (it doesn't)

Professional

Corporate-approved ways to say no while sounding like you care (you don't)

Creative

For people who think being clever makes them more interesting (debatable)

Try It Live

Pick a category and witness the magic of professional rejection. Or don't. We're not invested in your decisions.

Click a category above to get started.

Use with Claude Desktop

Because apparently saying "no" requires downloading a repo and running build scripts now.

⚠️ Why Can't I Just Use a URL?
Claude Desktop spawns local processes via stdio. It can't just fetch from the internet like a normal application. So you get to clone a repo, run npm install, and remember where you put things. Architecture™.

1. Install Prerequisites

Node.js (v18+) and Git. You know the drill:

  • macOS: brew install node git
  • Windows: nodejs.org (sorry)
  • Linux: You already know

2. Clone and Build

Standard ritual. The last command shows your path — copy it:

cd ~ git clone https://github.com/Koneisto/no-as-a-service.git cd no-as-a-service npm install npm run mcp:build pwd

Write down that path. You'll need it in step 3. It looks like /Users/yourname/no-as-a-service

3. Edit Claude Desktop Config

Find your config file:

  • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json
  • Windows: %APPDATA%\Claude\claude_desktop_config.json
  • Linux: ~/.config/Claude/claude_desktop_config.json

Add this. Replace /YOUR/PATH/HERE with the path you just copied:

{ "mcpServers": { "noaas": { "command": "node", "args": [ "/YOUR/PATH/HERE/no-as-a-service/build/mcp-server.js" ], "env": { "API_BASE_URL": "https://api.mcp-for-no.com" } } } }

⚠️ One typo and nothing works. Case-sensitive. Forward slashes only. You have been warned.

4. Restart Claude Desktop

Quit the app completely (not just close the window). Reopen. Ask Claude something like:

  • "Give me a creative way to decline"
  • "I need to say no to this meeting"

Doesn't work? You probably typo'd the path. Check your config.

When Things Break:
  • JSON syntax error? jsonlint.com
  • File not found? ls build/mcp-server.js to verify
  • Still broken? Check logs: ~/Library/Logs/Claude/mcp*.log

Using the API Directly

For those who prefer to write code instead of using convenient interfaces. We respect your life choices.

Get a Random Rejection

curl -X POST https://api.mcp-for-no.com/v1/tools/call \ -H "Content-Type: application/json" \ -d '{"jsonrpc":"2.0","method":"getRandomNo","params":{"category":"humorous"},"id":1}'

JavaScript Example

const response = await fetch('https://api.mcp-for-no.com/v1/tools/call', { method: 'POST', headers: { 'Content-Type': 'application/json' }, body: JSON.stringify({ jsonrpc: '2.0', method: 'getRandomNo', params: { category: 'professional' }, id: 1 }) }); const data = await response.json(); console.log(data.result.response);

Python Example

import requests response = requests.post( 'https://api.mcp-for-no.com/v1/tools/call', json={ 'jsonrpc': '2.0', 'method': 'getRandomNo', 'params': {'category': 'polite'}, 'id': 1 } ) print(response.json()['result']['response'])

Available Categories

Pick a category if you're feeling picky. Or don't, and get whatever we feel like giving you:

Features Worth Mentioning

Completely Free

No credit card, no signup, no value proposition

Fast Response Times

Because waiting to say no is apparently unacceptable

Global Distribution

Say no from anywhere in the world, instantly

No Tracking

We don't care enough to track you

Rate Limited

30 requests per minute. One every 2 seconds. Still generous.

MCP Compatible*

*Via a local stdio wrapper because SSE transport would make too much sense

1,000+ Responses

Because apparently 100 ways to say no wasn't excessive enough

No Authentication

Just send requests. We're too lazy to implement OAuth.

Questions You Might Actually Ask

Is this really free?

Yes. Completely free. Forever. No catch. Which should make you suspicious, but here we are.

What are the rate limits?

30 requests per minute per IP. One every 2 seconds. If you need more than that, you're doing something wrong.

Can I use this in my application?

Of course. Personal or commercial, we don't discriminate. Just don't blame us when your users hate your app.

Is there an SLA or uptime guarantee?

This is a free service. Your expectations should be calibrated accordingly.

How long will this service be up?

We have such a long history of saying no that people rarely ask us for anything anymore. So, indefinitely? Hard to say. No guarantees, obviously. Plan accordingly.

Can I request new rejection messages?

You could. Whether we'll add them depends on factors we won't elaborate on. Try GitHub issues if you're feeling optimistic.

Who made this?

People with time on their hands and questionable priorities. Much like yourself, probably.