{
  "markdown": "# No-as-a-Service\n\n[![npm version](https://img.shields.io/npm/v/no-as-service.svg)](https://www.npmjs.com/package/no-as-service)\n[![CI](https://github.com/Koneisto/no-as-a-service/actions/workflows/ci.yml/badge.svg)](https://github.com/Koneisto/no-as-a-service/actions/workflows/ci.yml)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](https://opensource.org/licenses/MIT)\n\n> Because saying \"no\" apparently requires an API now.\n\n**Like this project?** Give it a ⭐ on GitHub!\n\nAn 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.\n\n## What Is This?\n\nNoaaS is a **REST API service** with an **MCP server wrapper** that provides creative rejection responses across four categories:\n\n**Two Components:**\n- **REST API** (primary) - Public HTTP API anyone can call directly\n- **MCP Server** (wrapper) - Bridges Claude Desktop to the REST API via stdio transport\n\n## Architecture\n\n```\n                     REST API (Primary Service)\n    +-------------+  +-------------+  +-------------+\n    |   Express   |  | Cloudflare  |  |   Docker    |\n    |  (Node.js)  |  |   Workers   |  |  Container  |\n    +-------------+  +-------------+  +-------------+\n            |              |              |\n            +--------------+--------------+\n                           |\n                     reasons.json\n                   (1000+ responses)\n                           |\n         +-----------------+-----------------+\n         |                 |                 |\n       HTTP              HTTP              HTTP\n         |                 |                 |\n    +----+----+      +-----+-----+     +-----+-----+\n    |Web Apps |      |curl/fetch |     |MCP Server |\n    | Mobile  |      |  Python   |     |  (stdio)  |\n    +---------+      +-----------+     +-----+-----+\n                                             |\n                                           stdio\n                                             |\n                                    +-----------------+\n                                    | Claude Desktop  |\n                                    | Cursor IDE      |\n                                    +-----------------+\n```\n\n**Key Points:**\n- **REST API** is the primary service with all business logic\n- **MCP Server** is a thin stdio wrapper that bridges AI assistants to the REST API\n- Works with Claude Desktop, Cursor, and other MCP-compatible clients\n\n**Response Categories:**\n\n- **Polite** - For when you want them to think you actually considered their request\n- **Humorous** - Because adding a joke makes rejection feel less like rejection (it doesn't)\n- **Professional** - Corporate-approved ways to say no while sounding like you care (you don't)\n- **Creative** - For people who think being clever makes them more interesting (debatable)\n\n> **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.\n\n## Quick Start\n\n### Use the Public Service\n\nJust call the API. No installation, no signup, no nonsense.\n\n```bash\ncurl -X POST https://api.mcp-for-no.com/v1/tools/call \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"method\":\"getRandomNo\",\"params\":{\"category\":\"humorous\"}}'\n```\n\n**Response:**\n```json\n{\n  \"jsonrpc\": \"2.0\",\n  \"result\": {\n    \"response\": \"I'd love to say yes, but my calendar is allergic to that date.\"\n  }\n}\n```\n\n### Deploy Your Own\n\nWant to run your own instance? We respect your trust issues.\n\n#### Recommended: Cloudflare Workers (Free)\n\nZero maintenance, global edge network, automatic scaling. The sensible choice.\n\n```bash\nnpm install\n# Copy wrangler config template\ncp deployment/wrangler.toml.example deployment/wrangler.toml\nnpx wrangler login --config deployment/wrangler.toml\nnpx wrangler kv:namespace create \"REASONS_KV\" --config deployment/wrangler.toml\nnpx wrangler kv:namespace create \"RATE_LIMIT_KV\" --config deployment/wrangler.toml\n# Update deployment/wrangler.toml with the KV namespace IDs from the output above\nnpm run worker:kv:upload\nnpm run worker:deploy\n```\n\n**See:** [docs/deployment/QUICKSTART_WORKERS.md](./docs/deployment/QUICKSTART_WORKERS.md) for detailed instructions.\n\n#### Alternative: Docker (Enterprise/Self-Hosted)\n\nFor when you have trust issues with cloud providers or compliance requirements.\n\n```bash\n# Docker Compose (recommended)\nnpm run docker:up\n\n# Or plain Docker\nnpm run docker:build\ndocker run -d -p 3000:3000 \\\n  -e NODE_ENV=production \\\n  -e CORS_ORIGIN=https://your-domain.com \\\n  noaas\n```\n\n#### Advanced: Node.js/Express\n\nDirect deployment on VPS, PM2, or systemd. You know what you're doing.\n\n```bash\nnpm install\ncp .env.example .env\n# Edit .env with your configuration\nnpm start\n```\n\n**See:** [docs/guides/SECURITY.md](./docs/guides/SECURITY.md) for security configuration and best practices.\n\n## Use with Claude Desktop (MCP)\n\nNoaaS includes a native MCP server with stdio transport. Unfortunately, Claude Desktop requires local installation because it cannot connect directly to web services.\n\n> **Why Local Installation?**\n>\n> 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.\n\n### Prerequisites\n\nYou need Node.js (v18+) and Git installed:\n\n- **macOS:** `brew install node git`\n- **Windows:** Download from [nodejs.org](https://nodejs.org)\n- **Linux:** Use your package manager (e.g., `apt install nodejs git`)\n\n### Installation\n\n**1. Clone and build the MCP server:**\n\n```bash\ncd ~\ngit clone https://github.com/Koneisto/no-as-a-service.git\ncd no-as-a-service\nnpm install\nnpm run mcp:build\n```\n\nThis creates `build/mcp-server.js` in the cloned directory.\n\n**2. Get the absolute path:**\n\nWhile still in the `no-as-a-service` directory, run:\n\n```bash\npwd\n```\n\nThis shows your full path, something like: `/Users/yourname/no-as-a-service`\n\n**📝 Write this down - you'll need it in the next step.**\n\n### Claude Desktop Configuration\n\n**1. Find your config file:**\n\n- **macOS:** `~/Library/Application Support/Claude/claude_desktop_config.json`\n- **Windows:** `%APPDATA%\\Claude\\claude_desktop_config.json`\n- **Linux:** `~/.config/Claude/claude_desktop_config.json`\n\n**2. Edit the file and add this configuration:**\n\nReplace `/YOUR/PATH/HERE` with the path from the `pwd` command above:\n\n```json\n{\n  \"mcpServers\": {\n    \"noaas\": {\n      \"command\": \"node\",\n      \"args\": [\n        \"/YOUR/PATH/HERE/no-as-a-service/build/mcp-server.js\"\n      ],\n      \"env\": {\n        \"API_BASE_URL\": \"https://api.mcp-for-no.com\"\n      }\n    }\n  }\n}\n```\n\n⚠️ **Important:**\n- Use forward slashes (`/`) even on Windows\n- Replace `/YOUR/PATH/HERE` with your actual path from step 2\n- One typo and it won't work - paths are case-sensitive\n\n**3. Restart Claude Desktop:**\n\nClose Claude Desktop completely (quit the application, not just close the window), then reopen it.\n\n**4. Test it:**\n\nAsk Claude:\n- _\"Give me a polite way to decline this meeting\"_\n- _\"How many different ways to say no do you have?\"_\n\nIf it doesn't work, check your config file for typos.\n\n### Available Tools\n\n- **getRandomNo** - Get a creative rejection (optional category: polite, humorous, professional, creative)\n- **getNoCount** - Get the total count (1,021)\n\n### Troubleshooting\n\n**Config file errors?**\n- Validate your JSON at [jsonlint.com](https://jsonlint.com)\n\n**Path wrong?**\n- Run `ls build/mcp-server.js` in the repo directory to verify the file exists\n\n**Still not working?**\n- Check logs at `~/Library/Logs/Claude/mcp*.log` (macOS)\n- Ensure Node.js is installed: `node --version`\n- Ensure you restarted Claude Desktop completely\n\n## Use with Cursor IDE (MCP)\n\nCursor also supports MCP servers. Same local installation requirement, different config file.\n\n### Prerequisites\n\nSame as Claude Desktop - Node.js (v18+) and Git. If you already cloned the repo for Claude Desktop, skip to Configuration.\n\n### Installation\n\nIf you haven't already:\n\n```bash\ncd ~\ngit clone https://github.com/Koneisto/no-as-a-service.git\ncd no-as-a-service\nnpm install\nnpm run mcp:build\npwd\n```\n\nNote the path from `pwd` - you'll need it.\n\n### Cursor Configuration\n\n**1. Find or create your config file:**\n\n- **Global (all projects):** `~/.cursor/mcp.json`\n- **Project-specific:** `<project-root>/.cursor/mcp.json`\n\n**2. Add the MCP server configuration:**\n\nReplace `/YOUR/PATH/HERE` with your actual path:\n\n```json\n{\n  \"mcpServers\": {\n    \"noaas\": {\n      \"command\": \"node\",\n      \"args\": [\n        \"/YOUR/PATH/HERE/no-as-a-service/build/mcp-server.js\"\n      ],\n      \"env\": {\n        \"API_BASE_URL\": \"https://api.mcp-for-no.com\"\n      }\n    }\n  }\n}\n```\n\n**3. Restart Cursor**\n\nClose and reopen Cursor. The MCP server should now be available.\n\n### Available Tools\n\nSame as Claude Desktop:\n- **getRandomNo** - Get a creative rejection (optional category: polite, humorous, professional, creative)\n- **getNoCount** - Get the total count (1,021)\n\n## API Usage (Direct HTTP)\n\nYou can also use the REST API directly:\n\n```bash\n# Get a random rejection\ncurl -X POST https://api.mcp-for-no.com/v1/tools/call \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"method\":\"getRandomNo\",\"params\":{\"category\":\"humorous\"}}'\n\n# Get count\ncurl -X POST https://api.mcp-for-no.com/v1/tools/call \\\n  -H \"Content-Type: application/json\" \\\n  -d '{\"method\":\"getNoCount\"}'\n```\n\nSee [examples/usage-examples.md](./examples/usage-examples.md) for code examples in various languages.\n\n## Features\n\n- **No Authentication** - No credit card, no signup, no value proposition\n- **Fast Response Times** - Because waiting to say no is apparently unacceptable\n- **Global Distribution** - Say no from anywhere in the world, instantly\n- **No Tracking** - We don't care enough to track you\n- **Rate Limited** - 30 requests per minute. One every 2 seconds. Still generous.\n- **MCP Compatible*** - *Via a local stdio wrapper because SSE transport would make too much sense\n- **1,000+ Responses** - Because apparently 100 ways to say no wasn't excessive enough\n- **No Authentication** - Just send requests. We're too lazy to implement OAuth.\n\n## API Reference\n\n### Get Random Rejection\n\n```bash\nPOST /v1/tools/call\nContent-Type: application/json\n\n{\n  \"method\": \"getRandomNo\",\n  \"params\": {\n    \"category\": \"polite\"  // optional: polite, humorous, professional, creative\n  }\n}\n```\n\n### Get Count\n\n```bash\nPOST /v1/tools/call\nContent-Type: application/json\n\n{\n  \"method\": \"getNoCount\"\n}\n```\n\n### Health Check\n\n```bash\nGET /health\n```\n\n**Full API docs:** [TECHNICAL.md](./docs/TECHNICAL.md)\n\n## Project Structure\n\n```\nno-as-a-service/\n├── src/\n│   ├── index.js            # Node.js/Express server\n│   └── worker.js           # Cloudflare Workers server\n├── data/\n│   └── reasons.json        # 921 rejection messages\n├── deployment/\n│   ├── Dockerfile          # Docker deployment\n│   ├── docker-compose.yml  # Docker Compose config\n│   └── wrangler.toml       # Cloudflare Workers config\n├── docs/\n│   ├── deployment/\n│   │   ├── QUICKSTART_WORKERS.md\n│   │   ├── WORKERS_DEPLOYMENT.md\n│   │   ├── CLOUDFLARE_DEPLOY.md\n│   │   └── PAGES_DEPLOYMENT.md\n│   ├── guides/\n│   │   ├── SECURITY.md     # Security best practices\n│   │   └── DAILY_LIMIT_GUIDE.md\n│   └── TECHNICAL.md        # Full API reference\n├── examples/\n│   ├── usage-examples.md   # Code examples\n│   └── mcp-client-config.json\n├── .env.example            # Environment variables template\n├── .gitignore              # Git ignore rules\n├── package.json            # Dependencies\n├── README.md               # You are here\n└── LICENSE\n```\n\n## Deployment Options\n\n| Method | Cost | Setup Time | Best For |\n|--------|------|------------|----------|\n| **Cloudflare Workers** ⭐ | $0/month | 5 minutes | Everyone (seriously) |\n| **Docker** 🐳 | Variable | 10 minutes | Enterprise, self-hosted, K8s |\n| Node.js/Express | $5-12/month | 15 minutes | VPS, custom deployments |\n| Cloudflare Tunnel | $0/month | 15 minutes | Behind firewalls |\n\n**Recommended:** Cloudflare Workers (free tier, 100k requests/day, global edge network, zero maintenance)\n\n**When to use Docker:** Compliance requirements, airgapped environments, existing container infrastructure, or trust issues with cloud providers (understandable).\n\n## Documentation\n\n### Deployment Guides\n- **[QUICKSTART_WORKERS.md](./docs/deployment/QUICKSTART_WORKERS.md)** - Deploy to Cloudflare Workers in 5 minutes\n- **[WORKERS_DEPLOYMENT.md](./docs/deployment/WORKERS_DEPLOYMENT.md)** - Comprehensive Cloudflare Workers guide\n- **[CLOUDFLARE_DEPLOY.md](./docs/deployment/CLOUDFLARE_DEPLOY.md)** - All Cloudflare deployment methods\n- **[PAGES_DEPLOYMENT.md](./docs/deployment/PAGES_DEPLOYMENT.md)** - Deploy landing page\n\n### Configuration & Security\n- **[SECURITY.md](./docs/guides/SECURITY.md)** - Security best practices, environment variables, CORS, rate limiting\n- **[DAILY_LIMIT_GUIDE.md](./docs/guides/DAILY_LIMIT_GUIDE.md)** - Daily rate limiting explained\n\n### Technical Reference\n- **[TECHNICAL.md](./docs/TECHNICAL.md)** - Full API reference and technical details\n- **[examples/usage-examples.md](./examples/usage-examples.md)** - Code examples\n\n## Examples\n\n### JavaScript\n\n```javascript\nconst response = await fetch('https://noaas.your-deployment.workers.dev/v1/tools/call', {\n  method: 'POST',\n  headers: { 'Content-Type': 'application/json' },\n  body: JSON.stringify({\n    method: 'getRandomNo',\n    params: { category: 'professional' }\n  })\n});\n\nconst data = await response.json();\nconsole.log(data.result.response);\n```\n\n### Python\n\n```python\nimport requests\n\nresponse = requests.post(\n    'https://noaas.your-deployment.workers.dev/v1/tools/call',\n    json={'method': 'getRandomNo', 'params': {'category': 'polite'}}\n)\n\nprint(response.json()['result']['response'])\n```\n\nMore examples: [examples/usage-examples.md](./examples/usage-examples.md)\n\n## Contributing\n\n### Add New Rejection Messages\n\n1. Edit `reasons.json`\n2. Add your rejection to the appropriate category section\n3. Submit a PR\n\nCategories are divided by array index:\n- **Polite:** 0-25%\n- **Humorous:** 25-50%\n- **Professional:** 50-75%\n- **Creative:** 75-100%\n\n### Report Issues\n\nFound a bug? [Open an issue](https://github.com/Koneisto/no-as-a-service/issues).\n\n### Code Contributions\n\nPRs welcome for:\n- Bug fixes\n- Documentation improvements\n- New features (please open an issue first)\n\n## FAQ\n\n**Q: What's the cost?**\nA: There isn't one. Which should probably concern you, but we're confident you'll use it anyway.\n\n**Q: What are the rate limits?**\nA: 30 requests per minute per IP. One every 2 seconds. If you need more than that, you're doing something wrong.\n\n**Q: Can I use this commercially?**\nA: Of course. Personal or commercial, we don't discriminate. Just don't blame us when your users hate your app.\n\n**Q: Is there an SLA?**\nA: Your expectations should be calibrated to match what you're paying for this.\n\n**Q: Why did you build this?**\nA: Someone had to. And apparently, it was us. You're welcome, we suppose.\n\n## License\n\n📄 MIT — do whatever, just don't say yes when you should say no. Attribution appreciated but not required.\n\n## Credits\n\n- Built by people with questionable priorities\n- Inspired by everyone who can't say no\n- Powered by Cloudflare Workers (probably)\n- Response categorization and 252 professional corporate responses authored by Claude (Anthropic)\n- Original 769 responses generated by AI\n\n## Links\n\n- **Landing Page:** [mcp-for-no.com](https://mcp-for-no.com)\n- **API Endpoint:** [api.mcp-for-no.com](https://api.mcp-for-no.com)\n- **Documentation:** [Technical Docs](./docs/TECHNICAL.md)\n- **Deploy Guide:** [Cloudflare Workers Quickstart](./docs/deployment/QUICKSTART_WORKERS.md)\n- **Issues:** [Report a Bug](https://github.com/Koneisto/no-as-a-service/issues)\n\n---\n\n**NoaaS** - Helping you waste everyone's time more efficiently since 2025.\n",
  "bytes": 16261,
  "sha": "a2745d28c1ce90325162a9141093d8a64ccc8f55fa2644320e3798e5819ff7c2",
  "repo_slug": "koneisto/no-as-a-service",
  "fonte": "repo",
  "truncated": false,
  "api": "https://agentalog.com/api/listings/mcp_io_github_koneisto_no_as_a_service_488df465/readme"
}