Inspiration

The average mid-size company runs 40+ SaaS tools. Every one of them needs someone to grant access — and every request means the same manual dance: an employee DMs IT, IT checks if they're eligible, and if not, someone has to track down a manager and wait. Multiply that by every new hire, every tool, every week, and you get hours of repetitive judgment calls that should take seconds — but instead sit in a queue.

Access Concierge collapses that entire loop into the place the request already starts: a single Slack thread.

What it does

Access Concierge triages access requests live, inside a DM:

  • An employee messages the agent: "I need VPN access"
  • The agent checks eligibility against a role-based policy — instantly
  • Eligible → auto-approved, with setup instructions posted in-thread, zero human involved
  • 🔒 Needs judgment → a live, clickable Approve / Deny card is posted for a manager, right there in Slack
  • The approval isn't cosmetic: only the designated approver's click is honored — anyone else gets a clear "not authorized" response
  • The instant a decision lands, the card updates in place (✅ Approved by @manager) and the requester is DM'd the outcome

No ticket queue. No dashboard. No context switch. The request, the decision, and the notification all live in one auditable thread.

How we built it

Built on Slack's Bolt for Python framework via the official slack create agent scaffold, running entirely over Socket Mode — no public server, no ngrok tunnel, no infrastructure to manage. The whole agent runs from inside a Slack Developer Sandbox.

  • Event-driven core: message.im events drive every conversation turn
  • Real interactivity, not just text: Block Kit actions blocks power the Approve/Deny buttons, routed through dedicated Bolt action listeners
  • Access control on the access-control tool: every approval click is checked against a designated manager ID before anything is applied — the button looks clickable to everyone, but only does something for the right person
  • Live state, not message spam: chat.update rewrites the original card in place once a decision is made, so the thread stays a single clean record instead of a scroll of duplicate messages
  • Built to scale up, not just out: the scaffold ships wired for the Claude Agent SDK and the Slack MCP Server, so today's rules-based policy engine is a drop-in swap for full LLM reasoning the moment requests get more ambiguous than simple role checks

Challenges we ran into

Zero prior Slack app development experience, one night, a hard deadline. The CLI's hook execution behaves differently across PowerShell and cmd.exe on Windows, which cost real time before the agent would even boot locally. Slack's event subscriptions and Interactivity had to be manually enabled — and the app reinstalled — before a single DM or button click would reach the bot. Every one of those was a dead end that looked like a broken idea, until it wasn't. That's most of what building this actually was: methodically ruling out what wasn't the problem until the real one surfaced.

What we learned

The hard part of "AI agents" isn't the model call — it's everything around it: event delivery, socket connections, who's allowed to click what. A tightly-scoped interaction — one request, one decision, one thread — ends up more useful than a general-purpose chatbot, because it actually removes a decision from someone's day instead of just answering questions about it.

We also learned Slack's platform is genuinely approachable enough that someone with no prior experience could go from a blank terminal to a working, interactive, production-shaped agent in a single sitting — which says as much about the tooling as it does about the idea.

What's next

  • Swap the mocked policy table for a live HR/directory system lookup
  • Full LLM reasoning via the Claude Agent SDK for ambiguous or multi-system requests ("I need read access to the finance repo and Looker" in one message)
  • A logged audit trail posted to a dedicated #access-log channel for compliance visibility
  • Multi-approver support with escalation timeouts, so requests never silently stall

Built With

  • claude-agent-sdk
  • python
  • slack-bolt
  • slack-cli
  • slack-mcpserver
  • slack-socketmode
Share this project:

Updates