Skip to content

Build Packs for Superhuman

A Pack is a plugin for Superhuman, allowing you to extend the user experience with your own code.

Packs are primarily used to build connectors, which allow users to bring another application's data and actions into the products where they work.

Build once, and the same Pack will work across Go and Docs.

Bring your MCP server to Go

Superhuman Go supports the MCP standard, so any app that hosts a server can plug straight in. MCP servers are distributed as connectors, and once installed Go can access all of the tools they provide.

Creating a connector for your MCP server is simple, often requiring as little as a dozen lines of code. When it's ready, you can publish it to the store so anyone can discover and install it.

List your MCP


What you can build

Build tools for any REST API

Not every app has an MCP server, but most have a REST API. Write your own tools hosted on our servers and available in Superhuman Go just like MCP tools.

Build a custom tool

Answer questions from your data

Sync your records into the knowledge layer and Superhuman Go can search them, cite them, and answer from them in the middle of a conversation.

Build a sync table

Extend what a doc can do

Create custom formulas and sync tables that fit right into the Superhuman Docs experience. Users work with your app's data and actions without leaving their doc.

Building blocks


Let's see the code

A Pack is a TypeScript file containing metadata and logic. Each of these is a complete, working connector.

import * as sdk from "@codahq/packs-sdk";
export const pack = sdk.newPack();

pack.addMCPServer({
  name: "Todoist",
  endpointUrl: "https://ai.todoist.net/mcp",
});

pack.setUserAuthentication({
  type: sdk.AuthenticationType.OAuth2,
  useDynamicClientRegistration: true,
  useProofKeyForCodeExchange: true,
});

pack.addNetworkDomain("todoist.net");
import * as sdk from "@codahq/packs-sdk";
export const pack = sdk.newPack();

pack.addFormula({
  name: "AddTask",
  description: "Add a new task.",
  parameters: [
    sdk.makeParameter({
      type: sdk.ParameterType.String,
      name: "name",
      description: "The name of the task.",
    }),
  ],
  resultType: sdk.ValueType.String,
  isAction: true,
  execute: async function (args, context) {
    let [name] = args;
    let response = await context.fetcher.fetch({
      url: "https://api.todoist.com/api/v1/tasks",
      method: "POST",
      headers: { "Content-Type": "application/json" },
      body: JSON.stringify({ content: name }),
    });
    return "https://app.todoist.com/app/task/" + response.body.id;
  },
});

pack.setUserAuthentication({
  type: sdk.AuthenticationType.HeaderBearerToken,
  instructionsUrl: "https://todoist.com/app/settings/integrations",
});

pack.addNetworkDomain("todoist.com");
import * as sdk from "@codahq/packs-sdk";
export const pack = sdk.newPack();

pack.addSyncTable({
  name: "Tasks",
  schema: sdk.makeObjectSchema({
    properties: {
      name: { type: sdk.ValueType.String, fromKey: "content" },
      description: { type: sdk.ValueType.String },
      url: { type: sdk.ValueType.String, codaType: sdk.ValueHintType.Url },
      id: { type: sdk.ValueType.String },
    },
    displayProperty: "name",
    // Sync table metadata.
    idProperty: "id",
    featuredProperties: ["description", "url"],
    // Indexing metadata.
    titleProperty: "name",
    linkProperty: "url",
    index: { properties: ["description"] },
  }),
  identityName: "Task",
  formula: {
    name: "SyncTasks",
    description: "Sync tasks",
    parameters: [],
    execute: async function (args, context) {
      let response = await context.fetcher.fetch({
        method: "GET",
        url: "https://api.todoist.com/api/v1/tasks",
      });
      let tasks = response.body.results;
      return {
        result: tasks.map(task => ({
          ...task,
          url: "https://app.todoist.com/app/task/" + task.id,
        })),
      };
    },
  },
});

pack.addNetworkDomain("todoist.com");

pack.setUserAuthentication({
  type: sdk.AuthenticationType.HeaderBearerToken,
  instructionsUrl: "https://todoist.com/app/settings/integrations",
});

Browse all samples


Start building

Command line tool

Develop on your own machine with the editor, tooling, and version control you already use. Run your connector locally, then upload a version when you're ready.

Get started with the CLI

Pack Studio

Write, build, and deploy from your browser with nothing to install. A quick way to prototype, and you can move to a local project later.

Build in the browser

Tutorials

Step-by-step lessons that go further than a quickstart, walking you through core features of the SDK and the most common use cases.

Browse tutorials


See what others have built.

Connectors are listed in the Superhuman Go Store and the Superhuman Docs Gallery, where anyone can install them. Try a few to get a feel for what yours could do.

Browse the Store

Connectors listed in the Superhuman Go Store.


Stuck, or want to see it done first? There's a library of videos walking through the basics, and a community of developers happy to answer questions.