{"_id":"@announcr/mcp","_rev":"5-3e4044a477e4a62c04d46789c21114e2","name":"@announcr/mcp","dist-tags":{"latest":"0.2.0"},"versions":{"0.1.0":{"name":"@announcr/mcp","version":"0.1.0","keywords":["mcp","announcr","webhook","tts","ai-agent"],"license":"MIT","_id":"@announcr/mcp@0.1.0","maintainers":[{"name":"announcr","email":"dave@soulseed.io"}],"bin":{"announcr-mcp":"dist/index.js"},"dist":{"shasum":"0d34987139c53e5b77137295049ad5414fcdbb98","tarball":"https://registry.npmjs.org/@announcr/mcp/-/mcp-0.1.0.tgz","fileCount":5,"integrity":"sha512-NaHCSBxu3yn1vpouRhqRExPJZlUogUDwY3sZKldDVC/lsUQliZ5UpigabewRDlimmMh2gBzyanj183LNIWfiWg==","signatures":[{"sig":"MEUCIAMq96amc/woDhJk1KbqZZuM7srTrfQZrOQy3LVs8K/DAiEA7jXOnJsAROrMUhWLJAduAaFZMZECxysWfWeeHRh7Sc4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11318},"type":"module","engines":{"node":">=20"},"gitHead":"ef540b644ac1c581922244b5db6e1671b4763797","scripts":{"dev":"tsx src/index.ts","build":"tsc","start":"node dist/index.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"announcr","email":"dave@soulseed.io"},"_npmVersion":"11.13.0","description":"Official MCP server that lets AI agents push spoken announcements into Announcr via signed webhooks","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^3.25.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4","typescript":"^5.8","@types/node":"^22"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.0_1786508579404_0.16276630224281452","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@announcr/mcp","version":"0.1.1","keywords":["mcp","announcr","webhook","tts","ai-agent"],"license":"MIT","_id":"@announcr/mcp@0.1.1","maintainers":[{"name":"announcr","email":"dave@soulseed.io"}],"bin":{"announcr-mcp":"dist/index.js"},"dist":{"shasum":"16e54863504a3023870c430e5264c1f09944ffb9","tarball":"https://registry.npmjs.org/@announcr/mcp/-/mcp-0.1.1.tgz","fileCount":5,"integrity":"sha512-1cL2YMnrl89C/kMqQ+CuIpRTarldyCfeTmq1BQ9ZLM5dF9n8UO8rQSZ8uPiEwZsbhryK4voO3lVV8KY3i/8szg==","signatures":[{"sig":"MEQCIFfRJD4O/jUgu+kyUAMB4h6DSuUpq8rpblVZFriHm8tuAiBm6L3zXwvKRbap4IlANVAbfZVNPAMLrP22vQPLjDPxLw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11316},"type":"module","engines":{"node":">=20"},"gitHead":"ef540b644ac1c581922244b5db6e1671b4763797","scripts":{"dev":"tsx src/index.ts","build":"tsc","start":"node dist/index.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"announcr","email":"dave@soulseed.io"},"_npmVersion":"11.13.0","description":"Official MCP server that lets AI agents push spoken announcements into Announcr via signed webhooks","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^3.25.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4","typescript":"^5.8","@types/node":"^22"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.1_1786508645191_0.2950839499005169","host":"s3://npm-registry-packages-npm-production"}},"0.1.2":{"name":"@announcr/mcp","version":"0.1.2","keywords":["mcp","announcr","webhook","tts","ai-agent"],"license":"MIT","_id":"@announcr/mcp@0.1.2","maintainers":[{"name":"announcr","email":"dave@soulseed.io"}],"bin":{"announcr-mcp":"dist/index.js"},"dist":{"shasum":"2d9c848cd27a89ef1c15e65a2aba101130736ada","tarball":"https://registry.npmjs.org/@announcr/mcp/-/mcp-0.1.2.tgz","fileCount":5,"integrity":"sha512-fVd2LqQF7bVSF6YBJ259kUx/LRGMIyUXZFqzitx4rclw2XUFeVEatt3L5P9rfpfGMZF1wmTdmnCgcLho+B6uqw==","signatures":[{"sig":"MEYCIQClnmUBRtrpvk5bI3C384fHxFTT54I7No6u0e4hdUeF4QIhAO/1KA3PZLmzAdgzhGnrWlQX1sVACZ2t3Xz/LZy4E/8X","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11482},"type":"module","engines":{"node":">=20"},"gitHead":"c11c5d051cfb2fd0f289c17191af7516cb32c5ab","scripts":{"dev":"tsx src/index.ts","build":"tsc && node -e \"const fs=require('fs');const p='dist/index.js';const s=fs.readFileSync(p,'utf8');if(!s.startsWith('#!'))fs.writeFileSync(p,'#!/usr/bin/env node\\n'+s)\"","start":"node dist/index.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"announcr","email":"dave@soulseed.io"},"_npmVersion":"11.13.0","description":"Official MCP server that lets AI agents push spoken announcements into Announcr via signed webhooks","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^3.25.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4","typescript":"^5.8","@types/node":"^22"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.2_1786508952181_0.9035890873829402","host":"s3://npm-registry-packages-npm-production"}},"0.1.3":{"name":"@announcr/mcp","version":"0.1.3","keywords":["mcp","announcr","webhook","tts","ai-agent"],"license":"MIT","_id":"@announcr/mcp@0.1.3","maintainers":[{"name":"announcr","email":"dave@soulseed.io"}],"bin":{"announcr-mcp":"bin/announcr-mcp.js"},"dist":{"shasum":"c541aca5a31f0d8e9da6f6bd69abf6172550dd1b","tarball":"https://registry.npmjs.org/@announcr/mcp/-/mcp-0.1.3.tgz","fileCount":6,"integrity":"sha512-G2lRm5niOPF0iiaXk26qfHdMVatnbSmdS3e8I5stbpIq4blKjrCNXPTPL/phF1/RBpcltTv+pq8CuCEiecLNSQ==","signatures":[{"sig":"MEQCIDJBqeTbOn30LwLo2zo5DhyXhze9zDr0nLtlODvdkqIGAiBgfmHnISiTuBSz3Tayn6qm+VXqBn97QUB0hGtdhHeJzA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":11672},"type":"module","engines":{"node":">=20"},"gitHead":"140e5676402d4407e94288f113d0c73f40d22930","scripts":{"dev":"tsx src/index.ts","build":"tsc && node -e \"const fs=require('fs');const p='dist/index.js';const s=fs.readFileSync(p,'utf8');if(!s.startsWith('#!'))fs.writeFileSync(p,'#!/usr/bin/env node\\n'+s)\"","start":"node dist/index.js","typecheck":"tsc --noEmit"},"_npmUser":{"name":"announcr","email":"dave@soulseed.io"},"_npmVersion":"11.13.0","description":"Official MCP server that lets AI agents push spoken announcements into Announcr via signed webhooks","directories":{},"_nodeVersion":"24.16.0","dependencies":{"zod":"^3.25.0","@modelcontextprotocol/sdk":"^1.30.0"},"_hasShrinkwrap":false,"devDependencies":{"tsx":"^4","typescript":"^5.8","@types/node":"^22"},"_npmOperationalInternal":{"tmp":"tmp/mcp_0.1.3_1786509113415_0.9990084828062271","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@announcr/mcp","version":"0.2.0","description":"Official MCP server + CLI that lets AI agents speak through Announcr — `npx @announcr/mcp say \"…\"` or run it as a stdio MCP server","type":"module","bin":{"announcr-mcp":"bin/announcr-mcp.js"},"scripts":{"build":"tsc && node -e \"const fs=require('fs');const p='dist/index.js';const s=fs.readFileSync(p,'utf8');if(!s.startsWith('#!'))fs.writeFileSync(p,'#!/usr/bin/env node\\n'+s)\"","start":"node dist/index.js","dev":"tsx src/index.ts","typecheck":"tsc --noEmit","prepublishOnly":"npm run build"},"engines":{"node":">=20"},"dependencies":{"@modelcontextprotocol/sdk":"^1.30.0","zod":"^3.25.0"},"devDependencies":{"@types/node":"^22","tsx":"^4","typescript":"^5.8"},"keywords":["mcp","announcr","webhook","tts","ai-agent","skill","announcement"],"repository":{"type":"git","url":"git+https://github.com/BloxxOnline/announcr.git","directory":"packages/mcp"},"homepage":"https://announcr.fm","bugs":{"url":"https://github.com/BloxxOnline/announcr/issues"},"publishConfig":{"access":"public"},"license":"MIT","gitHead":"c42728abf71da42a4f61762cc2b66f8ec95bbb0e","_id":"@announcr/mcp@0.2.0","_nodeVersion":"24.16.0","_npmVersion":"11.13.0","dist":{"integrity":"sha512-Y0tJDZi3Oc+cfN9tBP3HQyMPXcJi6p/KTFsz+WmQL721FfRtbKfO9nzurKzCXaIxqhYIQHXZVfamX8QbZaAwjw==","shasum":"b26cfb5d0ab05bbe99d4d5b81ce696193e7ec338","tarball":"https://registry.npmjs.org/@announcr/mcp/-/mcp-0.2.0.tgz","fileCount":6,"unpackedSize":24761,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQDp3HVdm2SUkRXmqwcIK7eOGG6K5YjljKWpfxOkFKZ8ZAIgSj7JqJEFjbWye4M9KDYgiemzgAup0LDLfpTljFe5yCs="}]},"_npmUser":{"name":"announcr","email":"dave@soulseed.io"},"directories":{},"maintainers":[{"name":"announcr","email":"dave@soulseed.io"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp_0.2.0_1787859053570_0.6972988738247303"},"_hasShrinkwrap":false}},"time":{"created":"2026-08-12T04:22:59.244Z","modified":"2026-08-27T19:30:53.850Z","0.1.0":"2026-08-12T04:22:59.555Z","0.1.1":"2026-08-12T04:24:05.357Z","0.1.2":"2026-08-12T04:29:12.338Z","0.1.3":"2026-08-12T04:31:53.612Z","0.2.0":"2026-08-27T19:30:53.717Z"},"license":"MIT","keywords":["mcp","announcr","webhook","tts","ai-agent","skill","announcement"],"description":"Official MCP server + CLI that lets AI agents speak through Announcr — `npx @announcr/mcp say \"…\"` or run it as a stdio MCP server","maintainers":[{"name":"announcr","email":"dave@soulseed.io"}],"readme":"# @announcr/mcp\r\n\r\nOfficial **MCP server + CLI** for [Announcr](https://announcr.fm).\r\n\r\nLets any AI agent (Grok, Claude, ChatGPT, Cursor, Codex, etc.) push a spoken announcement into Announcr. The announcement is turned into TTS audio and delivered to the user's devices / ambient speakers.\r\n\r\nOne npm package, three ways in:\r\n\r\n| Command | What it does |\r\n|---|---|\r\n| `npx -y @announcr/mcp say \"…\"` | One-shot spoken announcement from any shell, script, or CI step |\r\n| `npx -y @announcr/mcp` | Local stdio MCP server (Claude Desktop, Cursor, other MCP hosts) |\r\n| `npx skills add BloxxOnline/announcr` | Installs the Announcr **agent skill** ([`skills/announcr`](../../skills/announcr/SKILL.md)) so coding agents know when to announce and how to call `say` |\r\n\r\n> Hosts that support **remote** MCP servers don't need this package at all — point them at `https://announcr.fm/api/mcp` with the webhook secret as `Authorization: Bearer <secret>` (or `?secret=` for URL-only connector forms like Grok's).\r\n\r\n## Setup\r\n\r\n1. Open [announcr.fm](https://announcr.fm) → **Webhooks** → **Create** (or open an existing webhook — the URL and secret stay retrievable, and can be rotated).\r\n2. Give it a label (e.g. \"MCP agents\"). The default **Everything** listening already speaks whatever this package sends.\r\n3. Export the two values from the webhook's **Connect an AI or app** panel (never put the secret in the model context or a committed file):\r\n\r\n```bash\r\nexport ANNOUNCR_WEBHOOK_URL='https://announcr.fm/hooks/in/YOUR_PUBLIC_ID'\r\nexport ANNOUNCR_WEBHOOK_SECRET='YOUR_SECRET'\r\n```\r\n\r\n`ANNOUNCR_WEBHOOK_PUBLIC_ID` (+ optional `ANNOUNCR_BASE_URL`) is accepted as an alternative to the URL form. Every request is HMAC-signed with the secret; the secret itself never travels.\r\n\r\n## `say` — announce from the shell\r\n\r\n```bash\r\nnpx -y @announcr/mcp say \"Deploy to production finished.\"\r\nnpx -y @announcr/mcp say --event deploy.finished --service ci \"Build 42 is live.\"\r\n```\r\n\r\nExit `0` means Announcr accepted it and will speak it; non-zero prints the reason on stderr (`--event`/`--service` are optional filtering labels, defaults `announce`/`cli`). This is the command the installable skill teaches agents to run.\r\n\r\n## MCP server\r\n\r\n### Claude Desktop (`claude_desktop_config.json`)\r\n\r\n```json\r\n{\r\n  \"mcpServers\": {\r\n    \"announcr\": {\r\n      \"command\": \"npx\",\r\n      \"args\": [\"-y\", \"@announcr/mcp\"],\r\n      \"env\": {\r\n        \"ANNOUNCR_WEBHOOK_URL\": \"https://announcr.fm/hooks/in/YOUR_PUBLIC_ID\",\r\n        \"ANNOUNCR_WEBHOOK_SECRET\": \"YOUR_SECRET\"\r\n      }\r\n    }\r\n  }\r\n}\r\n```\r\n\r\n**Cursor / other stdio hosts** — same idea: command `npx`, args `[\"-y\", \"@announcr/mcp\"]`, env vars as above. (From a monorepo checkout you can substitute `node packages/mcp/dist/index.js` after `pnpm --filter @announcr/mcp build`.)\r\n\r\n### The tool\r\n\r\n```json\r\n{\r\n  \"name\": \"send_announcement\",\r\n  \"arguments\": { \"message\": \"Deploy to production finished.\" }\r\n}\r\n```\r\n\r\n| Argument  | Default     | Description                                      |\r\n|-----------|-------------|--------------------------------------------------|\r\n| `message` | *(required)*| Text that will be spoken (max 500 characters)    |\r\n| `event`   | `\"announce\"`| Event name used for subscription matching        |\r\n| `service` | `\"mcp\"`     | Service/app label (lets one webhook multiplex)   |\r\n\r\nWith the webhook's default **Everything** listening, any combination is spoken. If the user narrowed listening to **MCP server**, only the defaults above match.\r\n\r\n## How the signature works\r\n\r\nEvery request (server and `say`) is signed exactly the way the Announcr gateway expects:\r\n\r\n```\r\nx-announcr-timestamp: <unix-seconds>\r\nx-announcr-signature: hex(HMAC-SHA256(secret, `${timestamp}.${rawBody}`))\r\n```\r\n\r\nThis matches `apps/api/src/lib/webhookSig.ts`. (The plain gateway also accepts `Authorization: Bearer <secret>` for clients that cannot compute an HMAC — see the in-app Webhooks docs.)\r\n\r\n## Development\r\n\r\n```bash\r\npnpm --filter @announcr/mcp dev     # tsx src/index.ts\r\npnpm --filter @announcr/mcp build\r\npnpm --filter @announcr/mcp typecheck\r\n```\r\n\r\nReleasing: bump `version`, then `pnpm --filter @announcr/mcp publish` (builds via `prepublishOnly`; scoped-public via `publishConfig`). The `npx` instructions above track the latest published version.\r\n\r\n## License\r\n\r\nMIT\r\n","readmeFilename":"README.md","homepage":"https://announcr.fm","repository":{"type":"git","url":"git+https://github.com/BloxxOnline/announcr.git","directory":"packages/mcp"},"bugs":{"url":"https://github.com/BloxxOnline/announcr/issues"}}