io.github.Koneisto/no-as-a-service

编码与调试

by koneisto

提供 1000 多种创意说“不”的方式,涵盖礼貌、幽默与专业风格的拒绝回复。

什么是 io.github.Koneisto/no-as-a-service

提供 1000 多种创意说“不”的方式,涵盖礼貌、幽默与专业风格的拒绝回复。

README

No-as-a-Service

npm version CI License: MIT

Because saying "no" apparently requires an API now.

Like this project? Give it a ⭐ on GitHub!

An API service providing 1,000+ creative ways to decline requests. For those who find saying "no" requires more architectural complexity than it deserves, or who simply appreciate the precision of professionally crafted rejection.

What Is This?

NoaaS is a REST API service with an MCP server wrapper that provides creative rejection responses across four categories:

Two Components:

  • REST API (primary) - Public HTTP API anyone can call directly
  • MCP Server (wrapper) - Bridges Claude Desktop to the REST API via stdio transport

Architecture

code
                     REST API (Primary Service)
    +-------------+  +-------------+  +-------------+
    |   Express   |  | Cloudflare  |  |   Docker    |
    |  (Node.js)  |  |   Workers   |  |  Container  |
    +-------------+  +-------------+  +-------------+
            |              |              |
            +--------------+--------------+
                           |
                     reasons.json
                   (1000+ responses)
                           |
         +-----------------+-----------------+
         |                 |                 |
       HTTP              HTTP              HTTP
         |                 |                 |
    +----+----+      +-----+-----+     +-----+-----+
    |Web Apps |      |curl/fetch |     |MCP Server |
    | Mobile  |      |  Python   |     |  (stdio)  |
    +---------+      +-----------+     +-----+-----+
                                             |
                                           stdio
                                             |
                                    +-----------------+
                                    | Claude Desktop  |
                                    | Cursor IDE      |
                                    +-----------------+

Key Points:

  • REST API is the primary service with all business logic
  • MCP Server is a thin stdio wrapper that bridges AI assistants to the REST API
  • Works with Claude Desktop, Cursor, and other MCP-compatible clients

Response Categories:

  • 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)

Note: Original responses were generated by AI. The 252 professional corporate jargon responses and complete categorization system were authored and organized by Claude (Anthropic). So if they're occasionally weird, nonsensical, or sound like a robot trying too hard to be human, that's why. We've kept them anyway. Quality control is overrated.

Quick Start

Use the Public Service

Just call the API. No installation, no signup, no nonsense.

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

Response:

json
{
  "jsonrpc": "2.0",
  "result": {
    "response": "I'd love to say yes, but my calendar is allergic to that date."
  }
}

Deploy Your Own

Want to run your own instance? We respect your trust issues.

Recommended: Cloudflare Workers (Free)

Zero maintenance, global edge network, automatic scaling. The sensible choice.

bash
npm install
# Copy wrangler config template
cp deployment/wrangler.toml.example deployment/wrangler.toml
npx wrangler login --config deployment/wrangler.toml
npx wrangler kv:namespace create "REASONS_KV" --config deployment/wrangler.toml
npx wrangler kv:namespace create "RATE_LIMIT_KV" --config deployment/wrangler.toml
# Update deployment/wrangler.toml with the KV namespace IDs from the output above
npm run worker:kv:upload
npm run worker:deploy

See: docs/deployment/QUICKSTART_WORKERS.md for detailed instructions.

Alternative: Docker (Enterprise/Self-Hosted)

For when you have trust issues with cloud providers or compliance requirements.

bash
# Docker Compose (recommended)
npm run docker:up

# Or plain Docker
npm run docker:build
docker run -d -p 3000:3000 \
  -e NODE_ENV=production \
  -e CORS_ORIGIN=https://your-domain.com \
  noaas

Advanced: Node.js/Express

Direct deployment on VPS, PM2, or systemd. You know what you're doing.

bash
npm install
cp .env.example .env
# Edit .env with your configuration
npm start

See: docs/guides/SECURITY.md for security configuration and best practices.

Use with Claude Desktop (MCP)

NoaaS includes a native MCP server with stdio transport. Unfortunately, Claude Desktop requires local installation because it cannot connect directly to web services.

Why Local Installation?

Claude Desktop spawns local processes via stdio (stdin/stdout) for MCP servers. It cannot connect to HTTP endpoints directly, even though the actual data comes from our REST API. The local MCP server acts as a thin wrapper that bridges Claude Desktop to the REST API.

Prerequisites

You need Node.js (v18+) and Git installed:

  • macOS: brew install node git
  • Windows: Download from nodejs.org
  • Linux: Use your package manager (e.g., apt install nodejs git)

Installation

1. Clone and build the MCP server:

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

This creates build/mcp-server.js in the cloned directory.

2. Get the absolute path:

While still in the no-as-a-service directory, run:

bash
pwd

This shows your full path, something like: /Users/yourname/no-as-a-service

📝 Write this down - you'll need it in the next step.

Claude Desktop Configuration

1. 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

2. Edit the file and add this configuration:

Replace /YOUR/PATH/HERE with the path from the pwd command above:

json
{
  "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"
      }
    }
  }
}

⚠️ Important:

  • Use forward slashes (/) even on Windows
  • Replace /YOUR/PATH/HERE with your actual path from step 2
  • One typo and it won't work - paths are case-sensitive

3. Restart Claude Desktop:

Close Claude Desktop completely (quit the application, not just close the window), then reopen it.

4. Test it:

Ask Claude:

  • "Give me a polite way to decline this meeting"
  • "How many different ways to say no do you have?"

If it doesn't work, check your config file for typos.

Available Tools

  • getRandomNo - Get a creative rejection (optional category: polite, humorous, professional, creative)
  • getNoCount - Get the total count (1,021)

Troubleshooting

Config file errors?

Path wrong?

  • Run ls build/mcp-server.js in the repo directory to verify the file exists

Still not working?

  • Check logs at ~/Library/Logs/Claude/mcp*.log (macOS)
  • Ensure Node.js is installed: node --version
  • Ensure you restarted Claude Desktop completely

Use with Cursor IDE (MCP)

Cursor also supports MCP servers. Same local installation requirement, different config file.

Prerequisites

Same as Claude Desktop - Node.js (v18+) and Git. If you already cloned the repo for Claude Desktop, skip to Configuration.

Installation

If you haven't already:

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

Note the path from pwd - you'll need it.

Cursor Configuration

1. Find or create your config file:

  • Global (all projects): ~/.cursor/mcp.json
  • Project-specific: <project-root>/.cursor/mcp.json

2. Add the MCP server configuration:

Replace /YOUR/PATH/HERE with your actual path:

json
{
  "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"
      }
    }
  }
}

3. Restart Cursor

Close and reopen Cursor. The MCP server should now be available.

Available Tools

Same as Claude Desktop:

  • getRandomNo - Get a creative rejection (optional category: polite, humorous, professional, creative)
  • getNoCount - Get the total count (1,021)

API Usage (Direct HTTP)

You can also use the REST API directly:

bash
# Get a random rejection
curl -X POST https://api.mcp-for-no.com/v1/tools/call \
  -H "Content-Type: application/json" \
  -d '{"method":"getRandomNo","params":{"category":"humorous"}}'

# Get count
curl -X POST https://api.mcp-for-no.com/v1/tools/call \
  -H "Content-Type: application/json" \
  -d '{"method":"getNoCount"}'

See examples/usage-examples.md for code examples in various languages.

Features

  • No Authentication - 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.

API Reference

Get Random Rejection

bash
POST /v1/tools/call
Content-Type: application/json

{
  "method": "getRandomNo",
  "params": {
    "category": "polite"  // optional: polite, humorous, professional, creative
  }
}

Get Count

bash
POST /v1/tools/call
Content-Type: application/json

{
  "method": "getNoCount"
}

Health Check

bash
GET /health

Full API docs: TECHNICAL.md

Project Structure

code
no-as-a-service/
├── src/
│   ├── index.js            # Node.js/Express server
│   └── worker.js           # Cloudflare Workers server
├── data/
│   └── reasons.json        # 921 rejection messages
├── deployment/
│   ├── Dockerfile          # Docker deployment
│   ├── docker-compose.yml  # Docker Compose config
│   └── wrangler.toml       # Cloudflare Workers config
├── docs/
│   ├── deployment/
│   │   ├── QUICKSTART_WORKERS.md
│   │   ├── WORKERS_DEPLOYMENT.md
│   │   ├── CLOUDFLARE_DEPLOY.md
│   │   └── PAGES_DEPLOYMENT.md
│   ├── guides/
│   │   ├── SECURITY.md     # Security best practices
│   │   └── DAILY_LIMIT_GUIDE.md
│   └── TECHNICAL.md        # Full API reference
├── examples/
│   ├── usage-examples.md   # Code examples
│   └── mcp-client-config.json
├── .env.example            # Environment variables template
├── .gitignore              # Git ignore rules
├── package.json            # Dependencies
├── README.md               # You are here
└── LICENSE

Deployment Options

MethodCostSetup TimeBest For
Cloudflare Workers$0/month5 minutesEveryone (seriously)
Docker 🐳Variable10 minutesEnterprise, self-hosted, K8s
Node.js/Express$5-12/month15 minutesVPS, custom deployments
Cloudflare Tunnel$0/month15 minutesBehind firewalls

Recommended: Cloudflare Workers (free tier, 100k requests/day, global edge network, zero maintenance)

When to use Docker: Compliance requirements, airgapped environments, existing container infrastructure, or trust issues with cloud providers (understandable).

Documentation

Deployment Guides

Configuration & Security

Technical Reference

Examples

JavaScript

javascript
const response = await fetch('https://noaas.your-deployment.workers.dev/v1/tools/call', {
  method: 'POST',
  headers: { 'Content-Type': 'application/json' },
  body: JSON.stringify({
    method: 'getRandomNo',
    params: { category: 'professional' }
  })
});

const data = await response.json();
console.log(data.result.response);

Python

python
import requests

response = requests.post(
    'https://noaas.your-deployment.workers.dev/v1/tools/call',
    json={'method': 'getRandomNo', 'params': {'category': 'polite'}}
)

print(response.json()['result']['response'])

More examples: examples/usage-examples.md

Contributing

Add New Rejection Messages

  1. Edit reasons.json
  2. Add your rejection to the appropriate category section
  3. Submit a PR

Categories are divided by array index:

  • Polite: 0-25%
  • Humorous: 25-50%
  • Professional: 50-75%
  • Creative: 75-100%

Report Issues

Found a bug? Open an issue.

Code Contributions

PRs welcome for:

  • Bug fixes
  • Documentation improvements
  • New features (please open an issue first)

FAQ

Q: What's the cost? A: There isn't one. Which should probably concern you, but we're confident you'll use it anyway.

Q: What are the rate limits? A: 30 requests per minute per IP. One every 2 seconds. If you need more than that, you're doing something wrong.

Q: Can I use this commercially? A: Of course. Personal or commercial, we don't discriminate. Just don't blame us when your users hate your app.

Q: Is there an SLA? A: Your expectations should be calibrated to match what you're paying for this.

Q: Why did you build this? A: Someone had to. And apparently, it was us. You're welcome, we suppose.

License

📄 MIT — do whatever, just don't say yes when you should say no. Attribution appreciated but not required.

Credits

  • Built by people with questionable priorities
  • Inspired by everyone who can't say no
  • Powered by Cloudflare Workers (probably)
  • Response categorization and 252 professional corporate responses authored by Claude (Anthropic)
  • Original 769 responses generated by AI

Links


NoaaS - Helping you waste everyone's time more efficiently since 2025.

常见问题

io.github.Koneisto/no-as-a-service 是什么?

提供 1000 多种创意说“不”的方式,涵盖礼貌、幽默与专业风格的拒绝回复。

相关 Skills

网页构建器

by anthropics

Universal
热门

面向复杂 claude.ai HTML artifact 开发,快速初始化 React + Tailwind CSS + shadcn/ui 项目并打包为单文件 HTML,适合需要状态管理、路由或多组件交互的页面。

在 claude.ai 里做复杂网页 Artifact 很省心,多组件、状态和路由都能顺手搭起来,React、Tailwind 与 shadcn/ui 组合效率高、成品也更精致。

编码与调试
未扫描123.0k

前端设计

by anthropics

Universal
热门

面向组件、页面、海报和 Web 应用开发,按鲜明视觉方向生成可直接落地的前端代码与高质感 UI,适合做 landing page、Dashboard 或美化现有界面,避开千篇一律的 AI 审美。

想把页面做得既能上线又有设计感,就用前端设计:组件到整站都能产出,难得的是能避开千篇一律的 AI 味。

编码与调试
未扫描123.0k

网页应用测试

by anthropics

Universal
热门

用 Playwright 为本地 Web 应用编写自动化测试,支持启动开发服务器、校验前端交互、排查 UI 异常、抓取截图与浏览器日志,适合调试动态页面和回归验证。

借助 Playwright 一站式验证本地 Web 应用前端功能,调 UI 时还能同步查看日志和截图,定位问题更快。

编码与调试
未扫描123.0k

相关 MCP Server

GitHub

编辑精选

by GitHub

热门

GitHub 是 MCP 官方参考服务器,让 Claude 直接读写你的代码仓库和 Issues。

这个参考服务器解决了开发者想让 AI 安全访问 GitHub 数据的问题,适合需要自动化代码审查或 Issue 管理的团队。但注意它只是参考实现,生产环境得自己加固安全。

编码与调试
84.2k

by Context7

热门

Context7 是实时拉取最新文档和代码示例的智能助手,让你告别过时资料。

它能解决开发者查找文档时信息滞后的问题,特别适合快速上手新库或跟进更新。不过,依赖外部源可能导致偶尔的数据延迟,建议结合官方文档使用。

编码与调试
53.3k

by tldraw

热门

tldraw 是让 AI 助手直接在无限画布上绘图和协作的 MCP 服务器。

这解决了 AI 只能输出文本、无法视觉化协作的痛点——想象让 Claude 帮你画流程图或白板讨论。最适合需要快速原型设计或头脑风暴的开发者。不过,目前它只是个基础连接器,你得自己搭建画布应用才能发挥全部潜力。

编码与调试
46.4k

评论