{"_id":"@avidian/mcp-slack","_rev":"7-5a30a8a39d21fed59fa9a859108a9995","name":"@avidian/mcp-slack","dist-tags":{"latest":"0.6.0"},"versions":{"0.1.0":{"name":"@avidian/mcp-slack","version":"0.1.0","keywords":["mcp","model-context-protocol","slack","toon","ai","llm"],"author":{"name":"avidianity"},"license":"MIT","_id":"@avidian/mcp-slack@0.1.0","maintainers":[{"name":"avidian","email":"manlupigjohnmichael@gmail.com"}],"homepage":"https://github.com/avidianity/mcp-slack#readme","bugs":{"url":"https://github.com/avidianity/mcp-slack/issues"},"bin":{"mcp-slack":"dist/index.js"},"dist":{"shasum":"648a894270d908e32c23fc981bdcc54ca69b8710","tarball":"https://registry.npmjs.org/@avidian/mcp-slack/-/mcp-slack-0.1.0.tgz","fileCount":4,"integrity":"sha512-cJFcT8haqNu8FQcemThPjMQb6L3n+LzQXsBWLF3AspPGVvque+T08CKfiORAJWtPT4rRc1bS/1EwhzEuemNpBg==","signatures":[{"sig":"MEQCIDP+S8gLeZoesr6a4yND4rS5VpQkKVxali8GuGLC/mCSAiAZ/5K6u+dFKA4ODxQGZSsMXEvuE+btpnD+8moaollWKA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1971411},"type":"module","engines":{"node":">=20"},"scripts":{"lint":"eslint .","test":"bun test","build":"bun build src/index.ts --outdir dist --target node","check":"bun run typecheck && bun run lint && bun run format:check","start":"bun run src/index.ts","format":"prettier --write .","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"avidian","email":"manlupigjohnmichael@gmail.com"},"repository":{"url":"git+https://github.com/avidianity/mcp-slack.git","type":"git"},"_npmVersion":"11.16.0","description":"TOON-first Model Context Protocol server for Slack, with dual-token auth and both stdio and Streamable HTTP transports.","directories":{},"_nodeVersion":"26.3.0","dependencies":{"zod":"^4.4.3","commander":"^15.0.0","@slack/web-api":"^7.18.0","@toon-format/toon":"^2.3.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.6.0","prettier":"^3.9.4","@eslint/js":"^10.0.1","@types/bun":"^1.3.14","typescript":"^6.0.3","typescript-eslint":"^8.62.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/mcp-slack_0.1.0_1782939754689_0.7859461106769268","host":"s3://npm-registry-packages-npm-production"}},"0.1.1":{"name":"@avidian/mcp-slack","version":"0.1.1","keywords":["mcp","model-context-protocol","slack","toon","ai","llm"],"author":{"name":"avidianity"},"license":"MIT","_id":"@avidian/mcp-slack@0.1.1","maintainers":[{"name":"avidian","email":"manlupigjohnmichael@gmail.com"}],"homepage":"https://github.com/avidianity/mcp-slack#readme","bugs":{"url":"https://github.com/avidianity/mcp-slack/issues"},"bin":{"mcp-slack":"dist/index.js"},"dist":{"shasum":"07ccb36d1edb966321adad3c5813029afd9de035","tarball":"https://registry.npmjs.org/@avidian/mcp-slack/-/mcp-slack-0.1.1.tgz","fileCount":4,"integrity":"sha512-uRvFe5Cd0SKagj7Sc6trF4rLJ3gP7spjKL66xPvBnvJUeJ8xBunFxzrkrtlKoQ3xj3KEtaynAohqdjMF1kOdNw==","signatures":[{"sig":"MEUCIQDjj4/uiYZoREJtlLp0bVZq3+iD5HxtkPVZtb6x3Irr8gIgOhYpG8whKQegnmdTktqJSSYUkPCkglEyekOwOS/s0dI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avidian%2fmcp-slack@0.1.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1971774},"type":"module","engines":{"node":">=20"},"gitHead":"0f90e177f11b4211646d61629874f5f56b711821","scripts":{"lint":"eslint .","test":"bun test","build":"bun build src/index.ts --outdir dist --target node","check":"bun run typecheck && bun run lint && bun run format:check","start":"bun run src/index.ts","format":"prettier --write .","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4059faa5-3a05-4f4d-8a64-8a25bced36d8"}},"repository":{"url":"git+https://github.com/avidianity/mcp-slack.git","type":"git"},"_npmVersion":"11.16.0","description":"TOON-first Model Context Protocol server for Slack, with dual-token auth and both stdio and Streamable HTTP transports.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","commander":"^15.0.0","@slack/web-api":"^7.18.0","@toon-format/toon":"^2.3.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.6.0","prettier":"^3.9.4","@eslint/js":"^10.0.1","@types/bun":"^1.3.14","typescript":"^6.0.3","typescript-eslint":"^8.62.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/mcp-slack_0.1.1_1782945011961_0.567054718412328","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@avidian/mcp-slack","version":"0.2.0","keywords":["mcp","model-context-protocol","slack","toon","ai","llm"],"author":{"name":"avidianity"},"license":"MIT","_id":"@avidian/mcp-slack@0.2.0","maintainers":[{"name":"avidian","email":"manlupigjohnmichael@gmail.com"}],"homepage":"https://github.com/avidianity/mcp-slack#readme","bugs":{"url":"https://github.com/avidianity/mcp-slack/issues"},"bin":{"mcp-slack":"dist/index.js"},"dist":{"shasum":"d9707eb2b0c29a889d46baad5d7aa47919c8d5af","tarball":"https://registry.npmjs.org/@avidian/mcp-slack/-/mcp-slack-0.2.0.tgz","fileCount":4,"integrity":"sha512-BadE2a9RR1aLzjFDegjxUotQvPFw1VQ4xtDyyKnaAiIKDj417MCrOYl0QBSaQ24PckJpj4/4gfj7kJJje+NPcw==","signatures":[{"sig":"MEYCIQDyrfUztnn009TAxLYWihHVW3BiWS6nFyfnN+/kj3XDtQIhAJQu+DZxl0DFeCobyBQc8K+O4wT4nG7bpDB4aXN22Ien","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avidian%2fmcp-slack@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2037279},"type":"module","engines":{"node":">=20"},"gitHead":"e3749f02d6ce134cafd1835d4437075687413fd0","scripts":{"lint":"eslint .","test":"bun test","build":"bun build src/index.ts --outdir dist --target node","check":"bun run typecheck && bun run lint && bun run format:check && bun test","start":"bun run src/index.ts","format":"prettier --write .","lint:fix":"eslint . --fix","typecheck":"tsc --noEmit","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4059faa5-3a05-4f4d-8a64-8a25bced36d8"}},"repository":{"url":"git+https://github.com/avidianity/mcp-slack.git","type":"git"},"_npmVersion":"11.16.0","description":"TOON-first Model Context Protocol server for Slack, with dual-token auth and both stdio and Streamable HTTP transports.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","fuse.js":"^7.4.2","commander":"^15.0.0","@slack/web-api":"^7.18.0","@toon-format/toon":"^2.3.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.6.0","prettier":"^3.9.4","@eslint/js":"^10.0.1","@types/bun":"^1.3.14","typescript":"^6.0.3","typescript-eslint":"^8.62.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/mcp-slack_0.2.0_1782954458047_0.22326664472833468","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@avidian/mcp-slack","version":"0.3.0","keywords":["mcp","model-context-protocol","slack","toon","ai","llm"],"author":{"name":"avidianity"},"license":"MIT","_id":"@avidian/mcp-slack@0.3.0","maintainers":[{"name":"avidian","email":"manlupigjohnmichael@gmail.com"}],"homepage":"https://github.com/avidianity/mcp-slack#readme","bugs":{"url":"https://github.com/avidianity/mcp-slack/issues"},"bin":{"mcp-slack":"dist/index.js"},"dist":{"shasum":"c09e20185a2cd6f46c2e36d348425d41173839d1","tarball":"https://registry.npmjs.org/@avidian/mcp-slack/-/mcp-slack-0.3.0.tgz","fileCount":9,"integrity":"sha512-CVz4arPt3NArPvE47XRL5uXpOBoQYf9o5Hp6Z2MjDn8yehmqZbpp2mv573Oz12NovD2maIBdGufDNJMEGArjqQ==","signatures":[{"sig":"MEYCIQCrXIug9Xu1miIBrw9RZiUk7Bt5VxfuB6pgBBEyt8AlBwIhAI9zosaDMp/u7n0+9k3RlKh2uh8+l+l1wc2k60ghs0X1","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avidian%2fmcp-slack@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2206128},"main":"./dist/lib.cjs","type":"module","types":"./dist/lib.d.ts","engines":{"node":">=20"},"exports":{".":{"bun":"./dist/lib.bun.js","import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"},"default":"./dist/lib.js","require":{"types":"./dist/lib.d.cts","default":"./dist/lib.cjs"}},"./package.json":"./package.json"},"gitHead":"d42f6df994bc7390880d9956472b2b0b99aff751","scripts":{"lint":"eslint .","test":"bun test","build":"bun run build:cli && bun run build:lib && bun run build:types","check":"bun run typecheck && bun run lint && bun run format:check && bun test","start":"bun run src/index.ts","format":"prettier --write .","lint:fix":"eslint . --fix","build:cli":"bun build src/index.ts --outdir dist --target node","build:lib":"bun build src/lib.ts --outfile dist/lib.js --target node --packages external && bun build src/lib.ts --outfile dist/lib.bun.js --target bun --packages external && bun build src/lib.ts --outfile dist/lib.cjs --target node --format cjs --packages external","typecheck":"tsc --noEmit","build:types":"dts-bundle-generator -o dist/lib.d.ts --project tsconfig.json --no-check --export-referenced-types false src/lib.ts && cp dist/lib.d.ts dist/lib.d.cts","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4059faa5-3a05-4f4d-8a64-8a25bced36d8"}},"repository":{"url":"git+https://github.com/avidianity/mcp-slack.git","type":"git"},"_npmVersion":"11.16.0","description":"TOON-first Model Context Protocol server for Slack, with dual-token auth and both stdio and Streamable HTTP transports.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","fuse.js":"^7.4.2","commander":"^15.0.0","@slack/web-api":"^7.18.0","@toon-format/toon":"^2.3.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.6.0","prettier":"^3.9.4","@eslint/js":"^10.0.1","@types/bun":"^1.3.14","typescript":"^6.0.3","typescript-eslint":"^8.62.1","dts-bundle-generator":"^9.5.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/mcp-slack_0.3.0_1782957438345_0.6847937727695916","host":"s3://npm-registry-packages-npm-production"}},"0.4.0":{"name":"@avidian/mcp-slack","version":"0.4.0","keywords":["mcp","model-context-protocol","slack","toon","ai","llm"],"author":{"name":"avidianity"},"license":"MIT","_id":"@avidian/mcp-slack@0.4.0","maintainers":[{"name":"avidian","email":"manlupigjohnmichael@gmail.com"}],"homepage":"https://github.com/avidianity/mcp-slack#readme","bugs":{"url":"https://github.com/avidianity/mcp-slack/issues"},"bin":{"mcp-slack":"dist/index.js"},"dist":{"shasum":"ae399ee299984e2583826b814d2dfb45a57db2bc","tarball":"https://registry.npmjs.org/@avidian/mcp-slack/-/mcp-slack-0.4.0.tgz","fileCount":9,"integrity":"sha512-DDvANmzESyS1R0kAf+EJa82K003g1XJsH/ISjiu+7U7sDeakXYUysz/+QGFSy4xiWjV7DPT+xnVPdgZ2qxXBUw==","signatures":[{"sig":"MEYCIQCaTCjBlPPbO15fcp+Q32zwpu4EvMEu3fMW3bk7A7icTgIhAPn3X0mova15py52f91J2/tXm3SS9H9fl2H6AuPBtgPy","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avidian%2fmcp-slack@0.4.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2204874},"main":"./dist/lib.cjs","type":"module","types":"./dist/lib.d.ts","engines":{"node":">=20"},"exports":{".":{"bun":"./dist/lib.bun.js","import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"},"default":"./dist/lib.js","require":{"types":"./dist/lib.d.cts","default":"./dist/lib.cjs"}},"./package.json":"./package.json"},"gitHead":"d3135877c32d751c7924f236eb3f41c07d1b8fcb","scripts":{"lint":"eslint .","test":"bun test","build":"bun run build:cli && bun run build:lib && bun run build:types","check":"bun run typecheck && bun run lint && bun run format:check && bun test","start":"bun run src/index.ts","format":"prettier --write .","lint:fix":"eslint . --fix","build:cli":"bun build src/index.ts --outdir dist --target node","build:lib":"bun build src/lib.ts --outfile dist/lib.js --target node --packages external && bun build src/lib.ts --outfile dist/lib.bun.js --target bun --packages external && bun build src/lib.ts --outfile dist/lib.cjs --target node --format cjs --packages external","typecheck":"tsc --noEmit","build:types":"dts-bundle-generator -o dist/lib.d.ts --project tsconfig.json --no-check --export-referenced-types false src/lib.ts && cp dist/lib.d.ts dist/lib.d.cts","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4059faa5-3a05-4f4d-8a64-8a25bced36d8"}},"repository":{"url":"git+https://github.com/avidianity/mcp-slack.git","type":"git"},"_npmVersion":"11.16.0","description":"TOON-first Model Context Protocol server for Slack, with dual-token auth and both stdio and Streamable HTTP transports.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","fuse.js":"^7.4.2","commander":"^15.0.0","@slack/web-api":"^7.18.0","@toon-format/toon":"^2.3.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.6.0","prettier":"^3.9.4","@eslint/js":"^10.0.1","@types/bun":"^1.3.14","typescript":"^6.0.3","typescript-eslint":"^8.62.1","dts-bundle-generator":"^9.5.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/mcp-slack_0.4.0_1783084374008_0.10721743292728192","host":"s3://npm-registry-packages-npm-production"}},"0.5.0":{"name":"@avidian/mcp-slack","version":"0.5.0","keywords":["mcp","model-context-protocol","slack","toon","ai","llm"],"author":{"name":"avidianity"},"license":"MIT","_id":"@avidian/mcp-slack@0.5.0","maintainers":[{"name":"avidian","email":"manlupigjohnmichael@gmail.com"}],"homepage":"https://github.com/avidianity/mcp-slack#readme","bugs":{"url":"https://github.com/avidianity/mcp-slack/issues"},"bin":{"mcp-slack":"dist/index.js"},"dist":{"shasum":"7928b068426be5af6c6271cde21c41f963262e45","tarball":"https://registry.npmjs.org/@avidian/mcp-slack/-/mcp-slack-0.5.0.tgz","fileCount":9,"integrity":"sha512-bvTtdv9QoZx9dZkiClBVgXCyQscmzI0J0T9umdJtvWKQquUANSiPZa9oH71wMJVa7VE/T/QAUefvuYYTVCCOzA==","signatures":[{"sig":"MEYCIQDyzlkSAHywQu0XZnr5Xi6QTw2h0GCnHqULkkti41GbDQIhAI1AGZfJmMWpP8rKvWmrdlXHuF5Q+Gz+pa0ABEVrykk5","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avidian%2fmcp-slack@0.5.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":2220520},"main":"./dist/lib.cjs","type":"module","types":"./dist/lib.d.ts","engines":{"node":">=20"},"exports":{".":{"bun":"./dist/lib.bun.js","import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"},"default":"./dist/lib.js","require":{"types":"./dist/lib.d.cts","default":"./dist/lib.cjs"}},"./package.json":"./package.json"},"gitHead":"2a4a1e92f344f7d6dbe6e702ee7d6449165a69eb","scripts":{"lint":"eslint .","test":"bun test","build":"bun run build:cli && bun run build:lib && bun run build:types","check":"bun run typecheck && bun run lint && bun run format:check && bun test","start":"bun run src/index.ts","format":"prettier --write .","lint:fix":"eslint . --fix","build:cli":"bun build src/index.ts --outdir dist --target node","build:lib":"bun build src/lib.ts --outfile dist/lib.js --target node --packages external && bun build src/lib.ts --outfile dist/lib.bun.js --target bun --packages external && bun build src/lib.ts --outfile dist/lib.cjs --target node --format cjs --packages external","typecheck":"tsc --noEmit","build:types":"dts-bundle-generator -o dist/lib.d.ts --project tsconfig.json --no-check --export-referenced-types false src/lib.ts && cp dist/lib.d.ts dist/lib.d.cts","format:check":"prettier --check .","prepublishOnly":"bun run build"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4059faa5-3a05-4f4d-8a64-8a25bced36d8"}},"repository":{"url":"git+https://github.com/avidianity/mcp-slack.git","type":"git"},"_npmVersion":"11.16.0","description":"TOON-first Model Context Protocol server for Slack, with dual-token auth and both stdio and Streamable HTTP transports.","directories":{},"_nodeVersion":"24.18.0","dependencies":{"zod":"^4.4.3","fuse.js":"^7.4.2","commander":"^15.0.0","@slack/web-api":"^7.18.0","@toon-format/toon":"^2.3.0","@modelcontextprotocol/sdk":"^1.29.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"eslint":"^10.6.0","prettier":"^3.9.4","@eslint/js":"^10.0.1","@types/bun":"^1.3.14","typescript":"^6.0.3","typescript-eslint":"^8.62.1","dts-bundle-generator":"^9.5.1","eslint-config-prettier":"^10.1.8"},"_npmOperationalInternal":{"tmp":"tmp/mcp-slack_0.5.0_1783099780562_0.4882064124702987","host":"s3://npm-registry-packages-npm-production"}},"0.6.0":{"name":"@avidian/mcp-slack","version":"0.6.0","description":"TOON-first Model Context Protocol server for Slack, with dual-token auth and both stdio and Streamable HTTP transports.","type":"module","license":"MIT","author":{"name":"avidianity"},"repository":{"type":"git","url":"git+https://github.com/avidianity/mcp-slack.git"},"homepage":"https://github.com/avidianity/mcp-slack#readme","bugs":{"url":"https://github.com/avidianity/mcp-slack/issues"},"keywords":["mcp","model-context-protocol","slack","toon","ai","llm"],"bin":{"mcp-slack":"dist/index.js"},"main":"./dist/lib.cjs","types":"./dist/lib.d.ts","exports":{".":{"bun":"./dist/lib.bun.js","import":{"types":"./dist/lib.d.ts","default":"./dist/lib.js"},"require":{"types":"./dist/lib.d.cts","default":"./dist/lib.cjs"},"default":"./dist/lib.js"},"./package.json":"./package.json"},"engines":{"node":">=20"},"publishConfig":{"access":"public"},"scripts":{"start":"bun run src/index.ts","build":"bun run build:cli && bun run build:lib && bun run build:types","build:cli":"bun build src/index.ts --outdir dist --target node","build:lib":"bun build src/lib.ts --outfile dist/lib.js --target node --packages external && bun build src/lib.ts --outfile dist/lib.bun.js --target bun --packages external && bun build src/lib.ts --outfile dist/lib.cjs --target node --format cjs --packages external","build:types":"dts-bundle-generator -o dist/lib.d.ts --project tsconfig.json --no-check --export-referenced-types false src/lib.ts && cp dist/lib.d.ts dist/lib.d.cts","prepublishOnly":"bun run build","typecheck":"tsc --noEmit","lint":"eslint .","lint:fix":"eslint . --fix","format":"prettier --write .","format:check":"prettier --check .","check":"bun run typecheck && bun run lint && bun run format:check && bun test","test":"bun test"},"dependencies":{"@modelcontextprotocol/sdk":"^1.29.0","@slack/web-api":"^7.18.0","@toon-format/toon":"^2.3.0","commander":"^15.0.0","fuse.js":"^7.4.2","zod":"^4.4.3"},"devDependencies":{"@eslint/js":"^10.0.1","@types/bun":"^1.3.14","dts-bundle-generator":"^9.5.1","eslint":"^10.6.0","eslint-config-prettier":"^10.1.8","prettier":"^3.9.4","typescript":"^6.0.3","typescript-eslint":"^8.62.1"},"gitHead":"8b48981e8d836493678322c75ae2ea8b6451a867","_id":"@avidian/mcp-slack@0.6.0","_nodeVersion":"24.20.0","_npmVersion":"11.19.0","dist":{"integrity":"sha512-vhuj3wEi8T1IfTuw5exZrlPhQsKhMqnrxpKORG3PsVTMRQZjqfA09+i7qAPtbONKlt9Ax7lFAU5kDfmEF2iGLw==","shasum":"5ba9dcddb78e4f73cb3bf3e7ce665e58300d7715","tarball":"https://registry.npmjs.org/@avidian/mcp-slack/-/mcp-slack-0.6.0.tgz","fileCount":9,"unpackedSize":1898871,"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@avidian%2fmcp-slack@0.6.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIF2a9xMIbaTyoXXvx+GfV72X+wY2uSEIgIcclix9TBTzAiBpDImOfe1YVEXuwMdGcI3a9SRNGYU6hStmTY+UGbjecQ=="}]},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:4059faa5-3a05-4f4d-8a64-8a25bced36d8"}},"directories":{},"maintainers":[{"name":"avidian","email":"manlupigjohnmichael@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/mcp-slack_0.6.0_1789134438821_0.41165096498119036"},"_hasShrinkwrap":false}},"time":{"created":"2026-07-01T21:02:34.558Z","modified":"2026-09-11T13:47:19.277Z","0.1.0":"2026-07-01T21:02:34.906Z","0.1.1":"2026-07-01T22:30:12.157Z","0.2.0":"2026-07-02T01:07:38.237Z","0.3.0":"2026-07-02T01:57:18.539Z","0.4.0":"2026-07-03T13:12:54.167Z","0.5.0":"2026-07-03T17:29:40.749Z","0.6.0":"2026-09-11T13:47:18.974Z"},"bugs":{"url":"https://github.com/avidianity/mcp-slack/issues"},"author":{"name":"avidianity"},"license":"MIT","homepage":"https://github.com/avidianity/mcp-slack#readme","keywords":["mcp","model-context-protocol","slack","toon","ai","llm"],"repository":{"type":"git","url":"git+https://github.com/avidianity/mcp-slack.git"},"description":"TOON-first Model Context Protocol server for Slack, with dual-token auth and both stdio and Streamable HTTP transports.","maintainers":[{"name":"avidian","email":"manlupigjohnmichael@gmail.com"}],"readme":"# @avidian/mcp-slack\n\n[![Release](https://github.com/avidianity/mcp-slack/actions/workflows/release.yml/badge.svg)](https://github.com/avidianity/mcp-slack/actions/workflows/release.yml)\n\nA modern [Model Context Protocol](https://modelcontextprotocol.io) server for Slack, built on\nBun + TypeScript. It exposes Slack's Web API to any MCP-compatible AI agent and returns\nresults in [TOON](https://github.com/toon-format/toon) by default for large token savings —\nwith per-call JSON opt-out.\n\nThis is a rewrite of [`zencoderai/slack-mcp-server`](https://github.com/zencoderai/slack-mcp-server),\nadding **dual-token auth** (bot _and_ user), the ability to **edit and delete your own\nmessages**, **message search**, a much wider API surface, and both **stdio** and\n**Streamable HTTP** transports.\n\n> Available on npm as [`@avidian/mcp-slack`](https://www.npmjs.com/package/@avidian/mcp-slack).\n\n## Why TOON?\n\nSlack responses are highly tabular (lists of channels, users, messages). TOON encodes uniform\narrays of objects as a compact header + rows, typically using **30–60% fewer tokens** than\nJSON while staying lossless. Any tool call can override the format per request when the agent\nprefers JSON.\n\n## Features\n\n- **Dual-token auth** — bot token (`xoxb-`) and/or user token (`xoxp-`), routed per tool.\n- **Edit & delete your own messages** — `chat.update` / `chat.delete` via user token.\n- **Message search** — `search.messages` (user token).\n- **Channel & user search** — fuzzy `search_channels` / `search_users` that\n  paginate server-side, so the agent finds a match in one call instead of walking every page.\n- **TOON-first output** with per-call `format: \"toon\" | \"json\"`.\n- **Agent-controlled paging** — `limit` is set per call; TOON gets a higher default.\n- **Two transports** — stdio (default) and Streamable HTTP with Bearer auth.\n- **Resilient** — built-in `Retry-After` (429) handling.\n\n## Install\n\nRun directly (no install):\n\n```bash\nbunx @avidian/mcp-slack      # or: npx @avidian/mcp-slack\n```\n\nOr add as a dependency:\n\n```bash\nbun add @avidian/mcp-slack\n```\n\n## Slack app setup\n\nCreate a Slack app and install it to your workspace. Grant scopes for the features you need:\n\n**Bot token scopes** (`SLACK_BOT_TOKEN`)\n\n```\nchannels:read  channels:history  groups:read  groups:history\nim:history  mpim:history  chat:write  reactions:read  reactions:write\nusers:read  users.profile:read  pins:read  pins:write\nbookmarks:read  bookmarks:write  files:read  files:write\n```\n\n**User token scopes** (`SLACK_USER_TOKEN`) — required for editing/deleting your own messages\nand search\n\n```\nchat:write  search:read\n```\n\nYou need **at least one** of the two tokens. The user token unlocks the user-scoped tools.\n\n### Token fallback\n\nEach tool has a preferred identity (bot or user), but the preference is not a hard binding.\nWhen the preferred token is refused for a reason that belongs to the token rather than the\nrequest — `missing_scope`, `not_in_channel`, `channel_not_found`, a revoked or inactive\ntoken — the call is retried once with the other configured token.\nSo a bot that was never granted `channels:history`, or was never invited to a private\nchannel, still reads it when a user token that can is configured.\nRetrying is safe: Slack rejects these before the call does any work, so nothing can happen\ntwice.\n\nRate limits, bad arguments, and every other error are returned as-is, never retried against\nthe other token.\nOnly `search_messages` is user-only (Slack has no bot equivalent), so it never falls back.\nWhen both identities fail, the error names both and reports the scopes Slack asked for:\n\n```\nSlack API error: missing_scope (needed: channels:history; provided: chat:write) Add the\nmissing scope to the Slack app and reinstall it, or configure a token that has it.\n[bot token] Retried with the user token, which also failed: Slack API error: not_in_channel\n```\n\n## Configuration\n\n| Variable                    | Required        | Description                                                           |\n| --------------------------- | --------------- | --------------------------------------------------------------------- |\n| `SLACK_BOT_TOKEN`           | one of bot/user | Bot token, `xoxb-…`                                                   |\n| `SLACK_USER_TOKEN`          | one of bot/user | User token, `xoxp-…` (edit/delete own, search)                        |\n| `SLACK_TEAM_ID`             | no              | Workspace id, `T…`; scopes listings for org-level tokens              |\n| `SLACK_CHANNEL_IDS`         | no              | Comma-separated channel-ID allowlist (enforced boundary)              |\n| `AUTH_TOKEN`                | no              | Bearer token for HTTP transport (auto-generated if unset)             |\n| `SLACK_MCP_DEFAULT_FORMAT`  | no              | `toon` (default) or `json`                                            |\n| `SLACK_MCP_ALLOWED_HOSTS`   | no              | HTTP: extra `Host` values to accept (enables protection on `0.0.0.0`) |\n| `SLACK_MCP_ALLOWED_ORIGINS` | no              | HTTP: allowed `Origin` values for browser clients                     |\n\nTransport options are passed as CLI flags: `--transport stdio\\|http`, `--port <n>`, `--host <h>`.\n\nWhen `SLACK_CHANNEL_IDS` is set it is a real access boundary, not just a list filter:\nevery channel-scoped tool call must target a channel ID in the list, or it is rejected\nbefore reaching Slack. `list_channels`, `search_channels`, `search_messages`,\nand `list_scheduled_messages` return only allowlisted channels. The allowlist matches on\nchannel **IDs**, so pass IDs (not names) to channel-scoped tools when it is set.\n\n`SLACK_TEAM_ID` is optional and only relevant for org-level (Enterprise Grid) tokens, where\nit scopes workspace-wide listings (`list_channels`, `get_users`) to one team.\n\n### HTTP transport security\n\nThe HTTP transport requires a Bearer token and enables DNS-rebinding protection automatically\nwhen bound to a concrete host (loopback or a specific address). For a wildcard bind\n(`--host 0.0.0.0`) no canonical host can be derived, so set `SLACK_MCP_ALLOWED_HOSTS` to the\npublic `host:port` value(s) to keep protection on — otherwise it is disabled with a warning\nand only Bearer auth applies. Set `SLACK_MCP_ALLOWED_ORIGINS` for browser-based clients.\n\nAt most 128 concurrent sessions are kept; further `initialize` requests get a 503 until a\nsession is closed (`DELETE /mcp`), so an unclosed-session loop cannot exhaust memory.\n\nTreat the Bearer token as granting more than Slack access: `upload_file` accepts a\nlocal `file_path`, so a token holder can have the server read any file the process can read\nand upload it to Slack.\n\n## Usage\n\n### Claude Desktop / MCP client (stdio)\n\n```json\n{\n  \"mcpServers\": {\n    \"slack\": {\n      \"command\": \"bunx\",\n      \"args\": [\"@avidian/mcp-slack\"],\n      \"env\": {\n        \"SLACK_BOT_TOKEN\": \"xoxb-…\",\n        \"SLACK_USER_TOKEN\": \"xoxp-…\",\n        \"SLACK_TEAM_ID\": \"T…\"\n      }\n    }\n  }\n}\n```\n\n### Streamable HTTP\n\n```bash\nSLACK_BOT_TOKEN=xoxb-… SLACK_TEAM_ID=T… AUTH_TOKEN=secret \\\n  bunx @avidian/mcp-slack --transport http --port 3000\n```\n\nThen point your MCP client at `http://localhost:3000/mcp` with header\n`Authorization: Bearer secret`.\n\n### Programmatic (embed in your own app)\n\nThe package also works as an ESM library (with bundled TypeScript types; Bun\ngets its own build via the `bun` export condition):\n\n```ts\nimport { loadConfig, createServer, startHttp, startStdio } from '@avidian/mcp-slack';\n\nconst config = loadConfig({ SLACK_BOT_TOKEN: 'xoxb-…' }); // or loadConfig() for process.env\nconst server = createServer(config);\n\nawait startStdio(server); // or:\nawait startHttp(() => createServer(config), {\n  host: '127.0.0.1',\n  port: 3000,\n  authToken: 'secret',\n});\n```\n\n`SlackClient`, `SlackApiError`, `SlackAuthError`, and the `Config` /\n`HttpOptions` types are exported too. Importing the library has no side\neffects — only the CLI entry parses argv and starts a transport.\n\n## Tools\n\nEvery tool accepts an optional `format` (`\"toon\"` | `\"json\"`). Paginated tools accept an\noptional `limit` (agent-controlled; clamped only to Slack's per-method maximum).\n\n**Finding things without pagination hell:**\n\n- `search_channels` / `search_users` — fuzzy search (powered by\n  [fuse.js](https://www.fusejs.io/)) that pages through the workspace server-side and returns\n  ranked matches in one call. No need to walk `list_channels` / `get_users`.\n- `get_channel_history` accepts an optional `user` (user ID). When set, the server pages\n  history internally and returns only that sender's messages, so you don't fetch a page and\n  filter it yourself. Combine with `oldest` / `latest` for a time range.\n- `search_messages` accepts optional `channel` and `user`, folded into `in:` / `from:`\n  search operators for you. Pass an ID (`C…` / `U…`) or a single-word name/handle — Slack's\n  operators have no syntax for multi-word values, so values with spaces are rejected; resolve a\n  display name to an ID with `search_users` first. **Requires the user token's\n  `search:read` scope** — a `missing_scope` error means you need to add it in the Slack app\n  config and reinstall.\n- Fuzzy `query` values (`search_channels` / `search_users`) must be at least 2\n  characters.\n\nSensible defaults keep results focused:\n\n- `list_channels` / `search_channels` return only channels the token identity has\n  joined. Pass `include_non_member: true` to include channels it has not joined. (A configured\n  `SLACK_CHANNEL_IDS` allowlist is returned as-is — it is already an explicit set.)\n- `get_users` / `search_users` exclude deactivated (deleted) users. Pass\n  `include_deleted: true` to include them.\n\n**Messaging (`chat.*`)**\n\n| Tool                       | Slack method                     | Token      |\n| -------------------------- | -------------------------------- | ---------- |\n| `post_message`             | `chat.postMessage`               | bot        |\n| `reply_to_thread`          | `chat.postMessage` (`thread_ts`) | bot        |\n| `update_message`           | `chat.update`                    | user → bot |\n| `delete_message`           | `chat.delete`                    | user → bot |\n| `post_ephemeral`           | `chat.postEphemeral`             | bot        |\n| `schedule_message`         | `chat.scheduleMessage`           | bot        |\n| `list_scheduled_messages`  | `chat.scheduledMessages.list`    | bot        |\n| `delete_scheduled_message` | `chat.deleteScheduledMessage`    | bot        |\n| `get_permalink`            | `chat.getPermalink`              | bot        |\n\n**Conversations**\n\n| Tool                  | Slack method                                     |\n| --------------------- | ------------------------------------------------ |\n| `list_channels`       | `conversations.list`                             |\n| `search_channels`     | `conversations.list` (server-side paged + fuzzy) |\n| `get_channel_history` | `conversations.history` (optional `user` filter) |\n| `get_thread_replies`  | `conversations.replies`                          |\n| `get_channel_info`    | `conversations.info`                             |\n| `get_channel_members` | `conversations.members`                          |\n| `join_channel`        | `conversations.join`                             |\n| `mark_read`           | `conversations.mark`                             |\n\nConversation tools prefer the bot token and fall back to the user token when the bot\ncannot see the channel — see [Token fallback](#token-fallback).\n\nHistory and thread messages carry a compact `files` column (`id:mimetype` per\nattachment); pass an id to `get_file` to fetch the bytes.\n\n**Reactions / Pins / Bookmarks**\n\n| Tool                                                  | Slack method                  |\n| ----------------------------------------------------- | ----------------------------- |\n| `add_reaction` / `remove_reaction` / `get_reactions`  | `reactions.add\\|remove\\|get`  |\n| `add_pin` / `remove_pin` / `list_pins`                | `pins.add\\|remove\\|list`      |\n| `add_bookmark` / `remove_bookmark` / `list_bookmarks` | `bookmarks.add\\|remove\\|list` |\n\n**Users / Search / Files**\n\n| Tool               | Slack method                                   | Token    |\n| ------------------ | ---------------------------------------------- | -------- |\n| `get_users`        | `users.list`                                   | bot      |\n| `search_users`     | `users.list` (server-side paged + fuzzy)       | bot      |\n| `get_user_profile` | `users.info` / `users.profile.get`             | bot      |\n| `search_messages`  | `search.messages` (`channel` / `user` scoping) | **user** |\n| `upload_file`      | `filesUploadV2`                                | bot      |\n| `get_file`         | `files.info` + authenticated download          | bot      |\n\n## Development\n\n```bash\nbun install\nbun run typecheck     # strict TypeScript\nbun run lint          # typescript-eslint (strict, type-checked)\nbun run format:check  # Prettier\nbun test              # bun:test\n```\n\n## License\n\nMIT\n","readmeFilename":"README.md"}