Programmable to the metal.
Assistant.bd is an MCP server, a webhook receiver, and a connector hub. Wire it into any assistant, any pipeline, any HTTP API.
One URL. Every assistant.
Point ChatGPT, Claude Desktop, Cursor, or Codex at https://my.assistant.bd/mcp and complete the OAuth 2.1 handshake. The client discovers tools dynamically, and every call runs under your Postgres row-level security — no shared service tokens for user data.
list_workspacesList every workspace the signed-in user belongs to.list_agentsList agents visible to the user, filtered by workspace.get_agentFetch one agent with its system prompt and metadata.list_tasksList tasks by agent, workspace, or status.create_taskEnqueue a new task under an agent (workspace inherited).search_memoryRead persistent agent_memory rows by key prefix.// claude_desktop_config.json
{
"mcpServers": {
"assistant-bd": {
"url": "https://my.assistant.bd/mcp"
}
}
}// AI SDK client
import { createMCPClient } from "@ai-sdk/mcp";
const client = await createMCPClient({
transport: {
type: "http",
url: "https://my.assistant.bd/mcp",
authProvider, // OAuth 2.1 with DCR
redirect: "error",
},
});
const tools = await client.tools();Signed, deduped, routed.
Every provider webhook is verified with its native signature scheme (Stripe HMAC, Shopify HMAC, Firecrawl secret), deduped against a memory table, and enqueued as a task on the mapped workspace via the connections registry.
Stripe, Shopify, and Firecrawl ship out of the box. Add your own in a single route file under /api/public/webhooks/<provider>.
// src/routes/api/public/webhooks/stripe.ts
export const Route = createFileRoute("/api/public/webhooks/stripe")({
server: {
handlers: {
POST: async ({ request }) => {
const sig = request.headers.get("stripe-signature")!;
const body = await request.text();
const event = stripe.webhooks.constructEvent(
body, sig, process.env.STRIPE_WEBHOOK_SECRET!,
);
const wsId = await resolveWorkspaceByConnection(
"stripe", event.account ?? "system",
);
await enqueueTask(wsId, event);
return new Response("ok");
},
},
},
});Talk to the platform from anywhere.
Public REST endpoints live under /api/public/*. Authenticate with a Supabase user token; RLS scopes results to your workspace membership automatically.
# Create a task on an agent you own
curl -X POST https://my.assistant.bd/api/public/tasks \
-H "Authorization: Bearer $ACCESS_TOKEN" \
-H "Content-Type: application/json" \
-d '{
"agent_id": "b3e...",
"intent": "Summarize yesterday'\''s support tickets"
}'Need something we don't have yet?
File an issue on GitHub or email the team. We prioritize by what people actually try to build.