Installation
Install the SDK using your preferred package manager: npm:Requirements
- Node.js: 16.0.0 or higher
- TypeScript: 5.0+ (for TypeScript projects)
- Fetch API: Native fetch support (Node.js 18+) or polyfill for older versions
Node.js Compatibility
For Node.js versions below 18, you’ll need to install a fetch polyfill:Features
- 🚀 TypeScript First - Built with TypeScript, includes comprehensive type definitions
- 📦 Modern JavaScript - ESM and CommonJS support for maximum compatibility
- ⚡ Promise-based API - Async/await support using native fetch
- 🔌 100+ Integrations - Connect to Slack, GitHub, Jira, Linear, and many more
- 🎯 Unified API - Consistent interface across all integrations via the Unified API
- 🔑 Proxy API - Direct access to underlying integration APIs
- 🤖 MCP - Hand a connection to any MCP client, or to OpenAI and Anthropic’s hosted MCP
- 🪶 Lightweight - Zero dependencies beyond native fetch API
- 🛡️ Error Handling - Comprehensive error messages and validation
- 📚 Well Documented - Extensive documentation and examples
Quick Start
Get started with BundleUp in just a few lines of code:Authentication
The BundleUp SDK uses API keys for authentication. You can obtain your API key from the BundleUp Dashboard.Getting Your API Key
- Sign in to your BundleUp Dashboard
- Navigate to API Keys
- Click Create API Key
- Copy your API key and store it securely
Initializing the SDK
Security Best Practices
- ✅ DO store API keys in environment variables
- ✅ DO use a secrets management service in production
- ✅ DO rotate API keys regularly
- ❌ DON’T commit API keys to version control
- ❌ DON’T hardcode API keys in your source code
- ❌ DON’T share API keys in public channels
Example .env file:
Core Concepts
Auth API
The Auth API runs the hosted authorization flow: build the URL that sends a user to connect an integration, then exchange the one-timecode from the redirect for a connection_id. See Authorization Flow.
Platform API
The Platform API provides access to core BundleUp features like managing connections and integrations. Use this API to list, retrieve, and delete connections, as well as discover available integrations.Proxy API
The Proxy API allows you to make direct HTTP requests to the underlying integration’s API through BundleUp. This is useful when you need access to integration-specific features not covered by the Unified API.Unified API
The Unified API provides a standardized, normalized interface across different integrations. For example, you can fetch chat channels from Slack or Discord using the same API call.MCP API
The MCP API reaches a provider’s own MCP server using a connection’s stored credentials. Tools are defined by the provider, not by BundleUp. Because the connection is chosen per client, one agent can serve many end users without ever handling a token. See MCP overview.API Reference
Connections
Manage your integration connections.List Connections
Retrieve a list of all connections in your account.integration_id(string): Filter by integration IDintegration_identifier(string): Filter by integration identifier (e.g., ‘slack’, ‘github’)external_id(string): Filter by external user/account IDlimit(number): Maximum number of results (default: 50, max: 100)offset(number): Number of results to skip for pagination
Retrieve a Connection
Get details of a specific connection by ID.Delete a Connection
Remove a connection from your account.Integrations
Discover and work with available integrations.List Integrations
Get a list of all available integrations.status(string): Filter by status (‘active’, ‘inactive’, ‘beta’)limit(number): Maximum number of resultsoffset(number): Number of results to skip for pagination
Retrieve an Integration
Get details of a specific integration.Webhooks
Manage webhook subscriptions for real-time event notifications.List Webhooks
Get all registered webhooks.Create a Webhook
Register a new webhook endpoint.connection.created- Triggered when a new connection is establishedconnection.deleted- Triggered when a connection is removedconnection.updated- Triggered when a connection is modified
Retrieve a Webhook
Get details of a specific webhook.Update a Webhook
Modify an existing webhook.Delete a Webhook
Remove a webhook subscription.Webhook Payload Example
When an event occurs, BundleUp sends a POST request to your webhook URL with the following payload:Webhook Security
To verify webhook signatures:Auth API
Connect an end user’s account and get back aconnection_id. See Authorization Flow for the full flow.
Build the Authorization URL
clientId(string, required): Your workspace client IDintegrationId(string, required): The integration to connectredirectUri(string, required): Must exactly match a redirect URI registered in your dashboardexternalId(string, optional): Your own reference, stored on the connectionstate(string, optional): Returned unchanged on the redirect
Exchange the Code for a Connection
BundleUp redirects back toredirectUri with a one-time code. Exchange it server-side:
code(string, required): Thecodequery parameter from the redirectredirectUri(string, required): The same redirect URI used to build the authorization URL
Proxy API
Make direct HTTP requests to integration APIs through BundleUp.Creating a Proxy Instance
GET Request
POST Request
PUT Request
PATCH Request
DELETE Request
Working with Different Content Types
Sending form data:Handling Binary Data
Unified API
Access unified, normalized data across different integrations with a consistent interface.Creating a Unified API Instance
Chat API
The Chat API provides a unified interface for chat platforms such as Slack and Discord. See Chat.List Channels
Retrieve a list of channels from the connected chat platform.limit(number, optional): Maximum number of channels to return (default: 100, max: 1000)after(string, optional): Pagination cursor from previous responseinclude_raw(boolean, optional): Include raw API response from the integration (default: false)
Git API
The Git API provides a unified interface for version control platforms like GitHub, GitLab, and Bitbucket.List Repositories
List Pull Requests
repoName(string, required): Repository name in the format ‘owner/repo’limit(number, optional): Maximum number of PRs to returnafter(string, optional): Pagination cursorinclude_raw(boolean, optional): Include raw API response
List Issues
repoName(string, required): Repository name in the format ‘owner/repo’limit(number, optional): Maximum number of issues to returnafter(string, optional): Pagination cursorinclude_raw(boolean, optional): Include raw API response
List Tags
List Releases
List Commits
branch is optional and accepts a branch name, tag or commit SHA. When it is omitted the
provider’s default branch is used.
Response:
Tasks API
The Tasks API provides a unified interface for issue trackers and project management tools like Jira, Linear, Asana, Trello, ClickUp, monday.com, Basecamp, Wrike, and Todoist.List Tasks
params passthrough parameter as {"board": "5abbe4b7ddc1b351ef961414"}. Trello also returns its collections in a single page, so metadata.next is always null for Trello connections.
Filtering and sorting:
List Projects
created_at and updated_at are null for Jira connections, and status is only set when Jira reports whether the project is archived.
Helpdesk API
The Helpdesk API provides a unified interface for customer support tools like Zendesk, ServiceNow, Zoho Desk, Gorgias, and Help Scout.List Tickets
Get a Ticket
Fetch one support ticket by ID. On ServiceNow the ID is the incident’ssys_id.
metadata on this response.
MCP API
Reach a provider’s own MCP server using a connection’s credentials. BundleUp injects and refreshes the access token, so the connection ID is the only thing your agent needs to know about a user. Supported for providers that run a first-party MCP server — see the integrations page. Others return anmcp_not_supported error.
BundleUp does not ship an MCP client. Hand hosted() or transport() to the one you already use, or send JSON-RPC yourself with post and delete, which return the response untouched, like the Proxy API.
Creating an MCP Instance
Model-Hosted MCP
OpenAI and Anthropic can connect to an MCP server themselves, with no tool mapping or dispatch loop on your side. Both accept only a single credential and no custom headers, sohosted() returns the server URL alongside the API key and connection joined into one bearer.
url and authorization_token.
server_url must be exactly the URL hosted() returns — the proxy rebuilds the upstream URL from the provider’s own base, so any path or query you append is ignored rather than rejected.
This sends your API key to the model provider, whose servers make the request. Use an MCP client in your own backend if that is not acceptable.
Using an MCP Client Library
transport() returns the URL and headers if you would rather use an existing MCP client.
Sending JSON-RPC Directly
MCP requires aninitialize handshake before any other method. The session ID comes back on that first response and must be sent on every call after it.
text/event-stream rather than JSON, so responses need unwrapping either way:
result.nextCursor is set, call tools/list again with params: { cursor: result.nextCursor } until it comes back empty.
Calling a tool follows the same shape:
Sessions
MCP sessions live on the provider’s server — BundleUp holds no session state. Close one when you are done:Errors
BundleUp rejects a request before it reaches the provider by returning an HTTP error with a JSON body — the response is passed straight through, so checkresponse.ok yourself.
initialize handshake.
Several Connections
An agent often needs more than one provider for the same end user. With model-hosted MCP there is nothing to merge — pass onemcp tool per connection and the model provider keeps them apart by server_label:
transport(), prefix each tool name with a label (slack__send_message), and route calls back by that prefix. There is no merge helper in the SDK — how tools are namespaced, filtered and recovered from differs enough per agent that it is better written where you can see it.
Filter before you hand tools to a model — three providers is easily sixty tools, and accuracy drops as that list grows, so give the agent only the ones it needs.

