Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 7 additions & 7 deletions .github/workflows/ci.yml
Original file line number Diff line number Diff line change
Expand Up @@ -21,10 +21,10 @@ jobs:
runs-on: ${{ github.repository == 'stainless-sdks/beeper-desktop-api-typescript' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: (github.event_name == 'push' || github.event.pull_request.head.repo.fork) && (github.event_name != 'push' || github.event.head_commit.message != 'codegen metadata')
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Node
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: '22'

Expand All @@ -43,10 +43,10 @@ jobs:
contents: read
id-token: write
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Node
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: '22'

Expand All @@ -61,7 +61,7 @@ jobs:
github.repository == 'stainless-sdks/beeper-desktop-api-typescript' &&
!startsWith(github.ref, 'refs/heads/stl/')
id: github-oidc
uses: actions/github-script@v8
uses: actions/github-script@ed597411d8f924073f98dfc5c65a23a2325f34cd # v8.0.0
with:
script: core.setOutput('github_token', await core.getIDToken());

Expand Down Expand Up @@ -91,10 +91,10 @@ jobs:
runs-on: ${{ github.repository == 'stainless-sdks/beeper-desktop-api-typescript' && 'depot-ubuntu-24.04' || 'ubuntu-latest' }}
if: github.event_name == 'push' || github.event.pull_request.head.repo.fork
steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Node
uses: actions/setup-node@v4
uses: actions/setup-node@49933ea5288caeca8642d1e84afbd3f7d6820020 # v4.4.0
with:
node-version: '22'

Expand Down
4 changes: 2 additions & 2 deletions .github/workflows/publish-npm.yml
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,10 @@ jobs:
contents: write

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Set up Node
uses: actions/setup-node@v3
uses: actions/setup-node@3235b876344d2a9aa001b8d1453c930bba69e610 # v3.9.1
with:
node-version: '20'

Expand Down
2 changes: 1 addition & 1 deletion .github/workflows/release-doctor.yml
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ jobs:
if: github.repository == 'beeper/desktop-api-js' && (github.event_name == 'push' || github.event_name == 'workflow_dispatch' || startsWith(github.head_ref, 'release-please') || github.head_ref == 'next')

steps:
- uses: actions/checkout@v6
- uses: actions/checkout@de0fac2e4500dabe0009e67214ff5f5447ce83dd # v6.0.2

- name: Check release environment
run: |
Expand Down
2 changes: 1 addition & 1 deletion .release-please-manifest.json
Original file line number Diff line number Diff line change
@@ -1,3 +1,3 @@
{
".": "5.0.0"
".": "5.1.0"
}
8 changes: 4 additions & 4 deletions .stats.yml
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
configured_endpoints: 30
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-c08c14bb754b4cb0e02b21fabb680469368286be339dec0aaa8c69d04a1f021a.yml
openapi_spec_hash: a10246aaf7cdc33b682fc245bd5f893b
config_hash: 72f9d43b9b51a5da912e9f3730e53ae2
configured_endpoints: 56
openapi_spec_url: https://storage.googleapis.com/stainless-sdk-openapi-specs/beeper/beeper-desktop-api-baac187842e51587134950c59c4d746bfcb59239f01919ed83b92c24c47d98f4.yml
openapi_spec_hash: 9de80d05f7562b7ecd07c466f0fdf58b
config_hash: a8a4a8b869ccd5976fd4107e67d2ecae
23 changes: 23 additions & 0 deletions CHANGELOG.md
Original file line number Diff line number Diff line change
@@ -1,5 +1,28 @@
# Changelog

## 5.1.0 (2026-05-19)

Full Changelog: [v5.0.0...v5.1.0](https://github.com/beeper/desktop-api-js/compare/v5.0.0...v5.1.0)

### Features

* **api:** add login flow, verifications, recovery key methods to app ([b9c1714](https://github.com/beeper/desktop-api-js/commit/b9c1714410139c2139b597338cd002d785653e85))
* **api:** api update ([0a91186](https://github.com/beeper/desktop-api-js/commit/0a91186fa1a0811dc9eeb9d43c8093aaeb115e95))
* **api:** remove cli ([40669cb](https://github.com/beeper/desktop-api-js/commit/40669cb5d53274627d81fc4554d4c5d29647e373))


### Bug Fixes

* **mcp:** require auth for standalone HTTP server ([eb86fa5](https://github.com/beeper/desktop-api-js/commit/eb86fa551df33109e963e2faf304b0380ac504f2))
* **typescript:** upgrade tsc-multi so that it works with Node 26 ([550009b](https://github.com/beeper/desktop-api-js/commit/550009b71f922f605d4ca0e0059bbed6627e5fbe))


### Chores

* **internal:** regenerate SDK with no functional changes ([8b59f3a](https://github.com/beeper/desktop-api-js/commit/8b59f3a10dc81df3e61d1d467f221edf4fc2d032))
* redact api-key headers in debug logs ([f34de70](https://github.com/beeper/desktop-api-js/commit/f34de708e01ce81a9cb6a9dcd180c44e76b4f2fd))
* **tests:** remove redundant File import ([91bb886](https://github.com/beeper/desktop-api-js/commit/91bb8861dbbe6cbf63c3c8f6a3a03c76d579c084))

## 5.0.0 (2026-05-07)

Full Changelog: [v4.8.0...v5.0.0](https://github.com/beeper/desktop-api-js/compare/v4.8.0...v5.0.0)
Expand Down
4 changes: 2 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -220,7 +220,7 @@ const client = createClient({
});

// ... then make API calls as usual.
const accounts = await client.accounts.list();
const account = await client.accounts.retrieve('accountID');
const chat = await client.chats.create({
accountID: 'accountID',
participantIDs: ['string'],
Expand All @@ -246,7 +246,7 @@ const client: PartialBeeperDesktop<{ accounts: BaseAccounts }> = createClient({

// Function parameter type
async function main(client: PartialBeeperDesktop<{ accounts: BaseAccounts }>) {
const accounts = await client.accounts.list();
const account = await client.accounts.retrieve('accountID');
}

// Works with any client that has the accounts resource
Expand Down
150 changes: 150 additions & 0 deletions api.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,8 @@ Methods:

Types:

- <code><a href="./src/resources/shared.ts">APIError</a></code>
- <code><a href="./src/resources/shared.ts">AppStateSnapshot</a></code>
- <code><a href="./src/resources/shared.ts">Attachment</a></code>
- <code><a href="./src/resources/shared.ts">Error</a></code>
- <code><a href="./src/resources/shared.ts">Message</a></code>
Expand All @@ -25,10 +27,13 @@ Types:
Types:

- <code><a href="./src/resources/accounts/accounts.ts">Account</a></code>
- <code><a href="./src/resources/accounts/accounts.ts">AccountBridge</a></code>
- <code><a href="./src/resources/accounts/accounts.ts">AccountRetrieveResponse</a></code>
- <code><a href="./src/resources/accounts/accounts.ts">AccountListResponse</a></code>

Methods:

- <code title="get /v1/accounts/{accountID}">client.accounts.<a href="./src/resources/accounts/accounts.ts">retrieve</a>(accountID) -> AccountRetrieveResponse</code>
- <code title="get /v1/accounts">client.accounts.<a href="./src/resources/accounts/accounts.ts">list</a>() -> AccountListResponse</code>

## Contacts
Expand All @@ -42,6 +47,59 @@ Methods:
- <code title="get /v1/accounts/{accountID}/contacts/list">client.accounts.contacts.<a href="./src/resources/accounts/contacts.ts">list</a>(accountID, { ...params }) -> UsersCursorSearch</code>
- <code title="get /v1/accounts/{accountID}/contacts">client.accounts.contacts.<a href="./src/resources/accounts/contacts.ts">search</a>(accountID, { ...params }) -> ContactSearchResponse</code>

# Bridges

Types:

- <code><a href="./src/resources/bridges/bridges.ts">Bridge</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">CookieField</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">DisappearingTimerCapability</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">GroupFieldCapability</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">GroupTypeCapabilities</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">LoginFlow</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">LoginInputField</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">LoginSession</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">ProvisioningCapabilities</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">ResolveIdentifierCapabilities</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">BridgeRetrieveResponse</a></code>
- <code><a href="./src/resources/bridges/bridges.ts">BridgeListResponse</a></code>

Methods:

- <code title="get /v1/bridges/{bridgeID}">client.bridges.<a href="./src/resources/bridges/bridges.ts">retrieve</a>(bridgeID) -> BridgeRetrieveResponse</code>
- <code title="get /v1/bridges">client.bridges.<a href="./src/resources/bridges/bridges.ts">list</a>() -> BridgeListResponse</code>
- <code title="get /v1/bridges/{bridgeID}/capabilities">client.bridges.<a href="./src/resources/bridges/bridges.ts">retrieveCapabilities</a>(bridgeID) -> ProvisioningCapabilities</code>

## LoginFlows

Types:

- <code><a href="./src/resources/bridges/login-flows.ts">LoginFlowListResponse</a></code>

Methods:

- <code title="get /v1/bridges/{bridgeID}/login-flows">client.bridges.loginFlows.<a href="./src/resources/bridges/login-flows.ts">list</a>(bridgeID) -> LoginFlowListResponse</code>

## Connections

## LoginSessions

Types:

- <code><a href="./src/resources/bridges/login-sessions/login-sessions.ts">LoginSessionCancelResponse</a></code>

Methods:

- <code title="post /v1/bridges/{bridgeID}/login-sessions">client.bridges.loginSessions.<a href="./src/resources/bridges/login-sessions/login-sessions.ts">create</a>(bridgeID, { ...params }) -> LoginSession</code>
- <code title="get /v1/bridges/{bridgeID}/login-sessions/{loginSessionID}">client.bridges.loginSessions.<a href="./src/resources/bridges/login-sessions/login-sessions.ts">retrieve</a>(loginSessionID, { ...params }) -> LoginSession</code>
- <code title="delete /v1/bridges/{bridgeID}/login-sessions/{loginSessionID}">client.bridges.loginSessions.<a href="./src/resources/bridges/login-sessions/login-sessions.ts">cancel</a>(loginSessionID, { ...params }) -> LoginSessionCancelResponse</code>

### Steps

Methods:

- <code title="post /v1/bridges/{bridgeID}/login-sessions/{loginSessionID}/steps/{stepID}">client.bridges.loginSessions.steps.<a href="./src/resources/bridges/login-sessions/steps.ts">submit</a>(stepID, { ...params }) -> LoginSession</code>

# Chats

Types:
Expand Down Expand Up @@ -125,3 +183,95 @@ Types:
Methods:

- <code title="get /v1/info">client.info.<a href="./src/resources/info.ts">retrieve</a>() -> InfoRetrieveResponse</code>

# App

Types:

- <code><a href="./src/resources/app/app.ts">Verification</a></code>
- <code><a href="./src/resources/app/app.ts">AppSessionResponse</a></code>

Methods:

- <code title="get /v1/app/setup">client.app.<a href="./src/resources/app/app.ts">session</a>() -> AppSessionResponse</code>

## Login

Types:

- <code><a href="./src/resources/app/login/login.ts">LoginRegisterResponse</a></code>
- <code><a href="./src/resources/app/login/login.ts">LoginResponseResponse</a></code>
- <code><a href="./src/resources/app/login/login.ts">LoginStartResponse</a></code>

Methods:

- <code title="post /v1/app/setup/email">client.app.login.<a href="./src/resources/app/login/login.ts">email</a>({ ...params }) -> void</code>
- <code title="post /v1/app/setup/register">client.app.login.<a href="./src/resources/app/login/login.ts">register</a>({ ...params }) -> LoginRegisterResponse</code>
- <code title="post /v1/app/setup/response">client.app.login.<a href="./src/resources/app/login/login.ts">response</a>({ ...params }) -> LoginResponseResponse</code>
- <code title="post /v1/app/setup/start">client.app.login.<a href="./src/resources/app/login/login.ts">start</a>() -> LoginStartResponse</code>

### Verification

#### RecoveryKey

Types:

- <code><a href="./src/resources/app/login/verification/recovery-key/recovery-key.ts">RecoveryKeyVerifyResponse</a></code>

Methods:

- <code title="post /v1/app/setup/verification/recovery-key">client.app.login.verification.recoveryKey.<a href="./src/resources/app/login/verification/recovery-key/recovery-key.ts">verify</a>({ ...params }) -> RecoveryKeyVerifyResponse</code>

##### Reset

Types:

- <code><a href="./src/resources/app/login/verification/recovery-key/reset.ts">ResetCreateResponse</a></code>
- <code><a href="./src/resources/app/login/verification/recovery-key/reset.ts">ResetConfirmResponse</a></code>

Methods:

- <code title="post /v1/app/setup/verification/recovery-key/reset">client.app.login.verification.recoveryKey.reset.<a href="./src/resources/app/login/verification/recovery-key/reset.ts">create</a>({ ...params }) -> ResetCreateResponse</code>
- <code title="post /v1/app/setup/verification/recovery-key/reset/confirm">client.app.login.verification.recoveryKey.reset.<a href="./src/resources/app/login/verification/recovery-key/reset.ts">confirm</a>({ ...params }) -> ResetConfirmResponse</code>

## Verifications

Types:

- <code><a href="./src/resources/app/verifications/verifications.ts">VerificationCreateResponse</a></code>
- <code><a href="./src/resources/app/verifications/verifications.ts">VerificationRetrieveResponse</a></code>
- <code><a href="./src/resources/app/verifications/verifications.ts">VerificationListResponse</a></code>
- <code><a href="./src/resources/app/verifications/verifications.ts">VerificationAcceptResponse</a></code>
- <code><a href="./src/resources/app/verifications/verifications.ts">VerificationCancelResponse</a></code>

Methods:

- <code title="post /v1/app/setup/verifications">client.app.verifications.<a href="./src/resources/app/verifications/verifications.ts">create</a>({ ...params }) -> VerificationCreateResponse</code>
- <code title="get /v1/app/setup/verifications/{verificationID}">client.app.verifications.<a href="./src/resources/app/verifications/verifications.ts">retrieve</a>(verificationID) -> VerificationRetrieveResponse</code>
- <code title="get /v1/app/setup/verifications">client.app.verifications.<a href="./src/resources/app/verifications/verifications.ts">list</a>() -> VerificationListResponse</code>
- <code title="post /v1/app/setup/verifications/{verificationID}/accept">client.app.verifications.<a href="./src/resources/app/verifications/verifications.ts">accept</a>(verificationID) -> VerificationAcceptResponse</code>
- <code title="post /v1/app/setup/verifications/{verificationID}/cancel">client.app.verifications.<a href="./src/resources/app/verifications/verifications.ts">cancel</a>(verificationID, { ...params }) -> VerificationCancelResponse</code>

### Qr

Types:

- <code><a href="./src/resources/app/verifications/qr.ts">QrConfirmScannedResponse</a></code>
- <code><a href="./src/resources/app/verifications/qr.ts">QrScanResponse</a></code>

Methods:

- <code title="post /v1/app/setup/verifications/{verificationID}/qr/confirm-scanned">client.app.verifications.qr.<a href="./src/resources/app/verifications/qr.ts">confirmScanned</a>(verificationID) -> QrConfirmScannedResponse</code>
- <code title="post /v1/app/setup/verifications/qr/scan">client.app.verifications.qr.<a href="./src/resources/app/verifications/qr.ts">scan</a>({ ...params }) -> QrScanResponse</code>

### SAS

Types:

- <code><a href="./src/resources/app/verifications/sas.ts">SASConfirmResponse</a></code>
- <code><a href="./src/resources/app/verifications/sas.ts">SASStartResponse</a></code>

Methods:

- <code title="post /v1/app/setup/verifications/{verificationID}/sas/confirm">client.app.verifications.sas.<a href="./src/resources/app/verifications/sas.ts">confirm</a>(verificationID) -> SASConfirmResponse</code>
- <code title="post /v1/app/setup/verifications/{verificationID}/sas/start">client.app.verifications.sas.<a href="./src/resources/app/verifications/sas.ts">start</a>(verificationID) -> SASStartResponse</code>
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@beeper/desktop-api",
"version": "5.0.0",
"version": "5.1.0",
"description": "The official TypeScript library for the Beeper Desktop API",
"author": "Beeper Desktop <help@beeper.com>",
"types": "dist/index.d.ts",
Expand Down Expand Up @@ -43,7 +43,7 @@
"publint": "^0.2.12",
"ts-jest": "^29.1.0",
"ts-node": "^10.5.0",
"tsc-multi": "https://github.com/stainless-api/tsc-multi/releases/download/v1.1.9/tsc-multi.tgz",
"tsc-multi": "https://github.com/stainless-api/tsc-multi/releases/download/v1.1.11/tsc-multi.tgz",
"tsconfig-paths": "^4.0.0",
"tslib": "^2.8.1",
"typescript": "5.8.3",
Expand Down
4 changes: 2 additions & 2 deletions packages/mcp-server/manifest.json
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
{
"dxt_version": "0.2",
"name": "@beeper/desktop-mcp",
"version": "5.0.0",
"version": "5.1.0",
"description": "The official MCP Server for the Beeper Desktop API",
"author": {
"name": "Beeper Desktop",
Expand Down Expand Up @@ -29,7 +29,7 @@
"user_config": {
"BEEPER_ACCESS_TOKEN": {
"title": "access_token",
"description": "Bearer access token obtained via OAuth2 PKCE flow or created in-app. Required for all API operations.",
"description": "Bearer access token obtained via OAuth2 PKCE flow or created in-app. Required for authenticated API operations.",
"required": true,
"type": "string"
}
Expand Down
4 changes: 2 additions & 2 deletions packages/mcp-server/package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "@beeper/desktop-mcp",
"version": "5.0.0",
"version": "5.1.0",
"description": "The official MCP Server for the Beeper Desktop API",
"author": "Beeper Desktop <help@beeper.com>",
"types": "dist/index.d.ts",
Expand Down Expand Up @@ -74,7 +74,7 @@
"ts-jest": "^29.1.0",
"ts-morph": "^19.0.0",
"ts-node": "^10.5.0",
"tsc-multi": "https://github.com/stainless-api/tsc-multi/releases/download/v1.1.9/tsc-multi.tgz",
"tsc-multi": "https://github.com/stainless-api/tsc-multi/releases/download/v1.1.11/tsc-multi.tgz",
"tsconfig-paths": "^4.0.0"
},
"imports": {
Expand Down
6 changes: 3 additions & 3 deletions packages/mcp-server/src/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import { McpOptions } from './options';
export const parseClientAuthHeaders = (req: IncomingMessage, required?: boolean): Partial<ClientOptions> => {
if (req.headers.authorization) {
const scheme = req.headers.authorization.split(' ')[0]!;
const value = req.headers.authorization.slice(scheme.length + 1);
switch (scheme) {
case 'Bearer':
return { accessToken: req.headers.authorization.slice('Bearer '.length) };
Expand All @@ -16,14 +15,15 @@ export const parseClientAuthHeaders = (req: IncomingMessage, required?: boolean)
'Unsupported authorization scheme. Expected the "Authorization" header to be a supported scheme (Bearer).',
);
}
} else if (required) {
throw new Error('Missing required Authorization header; see WWW-Authenticate header for details.');
}

const accessToken =
Array.isArray(req.headers['x-beeper-access-token']) ?
req.headers['x-beeper-access-token'][0]
: req.headers['x-beeper-access-token'];
if (!accessToken && required) {
throw new Error('Missing required Authorization header; see WWW-Authenticate header for details.');
}
return { accessToken };
};

Expand Down
Loading
Loading