npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

@sixb/connector-plaud

v0.1.0

Published

Plaud recordings, transcripts, notes and audio connector for Sixb

Readme

@sixb/connector-plaud

Read your Plaud recordings, complete transcripts, notes, and original audio from Sixb. Authorization uses Plaud's official MCP OAuth server. Data reads call Plaud's HTTP API directly; no MCP process or language model is needed at runtime.

Plaud does not offer a public, general-purpose account API. This integration follows the protocol shipped in @plaud-ai/mcp 0.3.13, inspected on 2026-10-05. These endpoints can change without compatibility guarantees.

Register your deployment

Register a public OAuth client once, using your Sixb API's callback URL:

import { registerPlaudClient } from "@sixb/connector-plaud/auth"

const { clientId } = await registerPlaudClient({
  clientName: "My Sixb app",
  redirectUris: ["https://api.example.com/auth/connectors/callback"],
})
console.log(clientId) // Save as PLAUD_CLIENT_ID in your deployment configuration.

Use http://localhost:<port>/auth/connectors/callback for local development. Register up to four callback URLs; HTTPS is required except on loopback. Keep the client name and callback host (including its port) within 64 characters. Register again when the deployment host changes. The returned client ID is public; no client secret is required. Registration does not authorize a user and should not run on every application startup.

The official MCP OAuth server supports public client registration and PKCE. Plaud's native client has a fixed callback that rejects Sixb's callback with REDIRECT_URI_MISMATCH; do not reuse its client ID.

Define and authorize the connector

// connectors/plaud.ts
import { defineConnector } from "@sixb/core"
import { plaud } from "@sixb/connector-plaud"

export const recordings = defineConnector("plaud", plaud({
  clientId: process.env.PLAUD_CLIENT_ID!,
}))

Follow Sixb OAuth setup to configure connectorConnections.encryptionKey with persistent storage and connect an account through useConnectorConnection. Use connectorId: "plaud" and a slot such as "recordings". Plaud exposes the signed-in user's account for selection.

Sixb owns state, PKCE, encrypted credentials, account connections, and automatic token refresh. The connector implements only Plaud's authorization, exchange, refresh, and account discovery protocol. It does not read or modify the official MCP client's token files.

const client = await sixb.connector(recordings, {
  owner: { type: "project" },
  slot: "recordings",
})

const account = await client.users.current()
const page = await client.recordings.list({ page: 1, pageSize: 100 })

for await (const recording of client.recordings.iterate()) {
  const transcript = await client.transcripts.get(recording.id)
  const notes = await client.notes.list(recording.id)
  // transcript?.content is complete; segments preserves timestamps and speakers.
}

Recordings and content

| Method | Result | | --- | --- | | users.current() | Account and workspace metadata | | recordings.list({ page, pageSize }) | One provider page; page numbers start at 1, minimum page size is 10 | | recordings.iterate({ query, dateFrom, dateTo }) | All pages, optionally filtered by name and creation date | | recordings.get(id) | Metadata, signed audio URL, source blocks and note metadata | | recordings.export(id) | Full record with every linked source/note body resolved | | transcripts.get(id, { block }) | Complete block text and parsed segments when available; null if absent | | transcripts.list(id) | All source blocks with their content resolved | | notes.list(id) | All note tabs, including custom summaries, saved answers and highlights | | recordings.downloadAudio(id) | Streaming Response for the audio, using a freshly requested URL |

Transcript block names include transaction (default), transaction_polish, outline, and mark_memo. Unknown block types and provider fields are preserved. Raw JSON content remains available even if its shape cannot be parsed as timestamped segments. Failed content downloads throw; they are never silently returned as successful empty exports.

iterate() has no 20-record or 500-record scan cap. It filters locally across every page. query matches names case-insensitively; date bounds are inclusive UTC calendar dates (YYYY-MM-DD) on created_at. Timestamps without a timezone are interpreted as UTC, as in the official MCP. Pagination is not a snapshot: changes to your library during an export can move records between pages. Duplicate IDs are skipped, and repeated pages raise an error.

Download audio without buffering the whole file:

const response = await client.recordings.downloadAudio(recordingId)
await Bun.write("recording.mp3", response)

Signed URLs expire (Plaud currently describes a 24-hour lifetime). Do not persist them as permanent links; request the recording again. Cloud sync must be enabled. A recording can exist before its audio, transcript or summary is ready. The connector reads existing data; it does not edit, delete, upload, transcribe, or generate summaries.

Refresh, cancellation and failures

Sixb refreshes credentials before expiry or after a rejected API token. Each request obtains a current token from Sixb; an API 401 invalidates that token and is replayed at most once. Safe GET requests retry transient failures up to twice. OAuth exchange and refresh POSTs are never replayed automatically: an uncertain outcome requires reauthorization through Sixb.

All resource methods accept an optional signal. Connector shutdown also cancels requests. Options, in addition to the required clientId:

  • timeoutMs: request timeout, default 30 seconds.
  • minDelayMs: spacing between API requests, default 0; use e.g. 1500 for bulk exports to reduce rate limiting.
  • maxRetries: safe GET retries, default 2.
  • region: optional x-pld-region routing header, matching Plaud's official client.
  • maxContentBytes: maximum linked text block size, default 20 MiB; audio is streamed separately.
  • downloadHosts: additional exact HTTPS content hostnames for other Plaud storage regions.

The observed Plaud S3 content host is trusted by default. Verify any additional host before adding it. Downloads never carry the API bearer token or routing headers, and redirects are rejected. PlaudApiError exposes the status and operation without credentials, signed URLs, or response bodies.

Verification

bun test ./connectors/plaud/tests/

Package tests use mocked HTTP responses; no Plaud account is required. Validate browser authorization and real account access manually using the setup above.

References: Plaud MCP, OAuth server metadata, account API availability, API recording limits.