Developers

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.

Model Context Protocol

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.
jsonc
// claude_desktop_config.json
{
  "mcpServers": {
    "assistant-bd": {
      "url": "https://my.assistant.bd/mcp"
    }
  }
}
typescript
// 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();
Webhooks

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>.

typescript
// 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");
      },
    },
  },
});
REST

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.

bash
# 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.