Agent skill

Integration Generator

by dafthunk-com in dafthunk-com/dafthunk

Generate new OAuth integration providers for Dafthunk with backend providers, type definitions, frontend configurations, and integration nodes

MITAuto-check passedBackend & APIs

Install Integration Generator

skills CLI
$ npx skills add dafthunk-com/dafthunk --skill integration-generator -a claude-code

Project install by default; add -g for ~/.claude/skills/.

GitHub CLI
$ gh skill install dafthunk-com/dafthunk integration-generator --agent claude-code

Project scope by default; add --scope user for a personal install. Needs GitHub CLI 2.90.0 or later (public preview).

Manual copy
$ git clone --depth 1 https://github.com/dafthunk-com/dafthunk.git skills-src && mkdir -p .claude/skills && cp -r skills-src/.claude/skills/integration-generator .claude/skills/integration-generator && rm -rf skills-src

Use ~/.claude/skills/ instead of .claude/skills for a personal install. The folder must contain SKILL.md.

Claude Code skills documentation · loads skills from .claude/skills/

Facts

Skill name
integration-generator
GitHub stars
134
Token cost
~2.3k tokens
SKILL.md length
256 words
Files
1
Skills in repo
3
Repo updated
First seen
Licence
MIT

At a glance

Generate new OAuth integration providers for Dafthunk with backend providers, type definitions, frontend configurations, and integration nodes

  • Works in 10 steps: Research Provider and Register OAuth App → Add Backend Types → Create Provider Class → …
  • Tasks that involve OAuth and OpenID Connect
  • SKILL.md covers Step 1: Research Provider and…, Step 2: Add Backend Types, Step 3: Create Provider Class and Step 4: Register Backend…, plus 10 more sections
  • Calls pnpm

What it does

Integration Generator is an agent skill from dafthunk-com/dafthunk. Generate new OAuth integration providers for Dafthunk with backend providers, type definitions, frontend configurations, and integration nodes

Its SKILL.md is about 2.3k tokens, which your agent loads only when the skill is triggered. It is a single SKILL.md file with no bundled scripts.

It sits in Backend & APIs, covering OAuth and OpenID Connect and Workflow automation. It works with Cloudflare, React, TypeScript and n8n. The repository describes itself as: A workflow execution platform built on top of the fantastic Cloudflare infrastructure. The licence is MIT.

When your agent uses it

  • Tasks that involve OAuth and OpenID Connect
  • Tasks that involve Workflow automation

Example prompts

  • “/integration-generator”

Workflow steps

10 steps, taken from the step headings in SKILL.md.

  1. Research Provider and Register OAuth App
  2. Add Backend Types
  3. Create Provider Class
  4. Register Backend Provider
  5. Update Shared Types
  6. Create Frontend Provider
  7. Register Frontend Provider
  8. Configure Environment
  9. Update Integration Routes
  10. Test OAuth Flow

What it can do on your machine

Read from SKILL.md and the folder at commit 66be308. It shows what the files ask for, not the result of running them.

  • Tool permissions

    Pre-approves nothing: there is no allowed-tools line, so your agent's usual permission prompts apply.

    From allowed-tools in the SKILL.md frontmatter.

  • Runs code

    Shell commands in SKILL.md call:

    • pnpm

    From the folder's file list and the shell code blocks in SKILL.md.

  • Network

    No URLs in SKILL.md. Its commands use pnpm, which can reach the network depending on how they are called.

    From URLs in SKILL.md, links to its own repository left out.

  • Credentials

    Names no API keys, tokens, secrets or passwords.

    From names ending in _API_KEY, _TOKEN, _SECRET, _KEY or _PASSWORD in SKILL.md.

Context cost

Integration Generator loads about 2.3k tokens when it runs. Until then it costs about 41 tokens; SKILL.md has 256 words of instructions outside code blocks.

Always · name and description, kept in context so the agent knows when to use it
~41
When it runs · the whole SKILL.md, loaded when a task matches
~2.3k

Estimates: characters ÷ 4, the usual rule of thumb; real counts depend on the model's tokenizer. Scripts and assets cost tokens only if the agent reads them.

Safety

Auto-check passed

The automated check found no risky patterns in SKILL.md.

Automated static check — not a guarantee. Review scripts before installing. It scans the text of SKILL.md for risky patterns (piping downloads into a shell, reading credential files, hidden Unicode, destructive commands); files beside SKILL.md are not scanned.

SKILL.md

The full file from dafthunk-com/dafthunk at commit 66be308, republished under its MIT licence (© dafthunk-com). 256 words, ~2,304 tokens.

Download SKILL.mdSave it as .claude/skills/integration-generator/SKILL.md (or your agent's skills folder).
name
integration-generator
description
Generate new OAuth integration providers for Dafthunk with backend providers, type definitions, frontend configurations, and integration nodes

Integration Generator

Generate OAuth integration providers for Dafthunk: research provider APIs, create backend OAuth provider, add type definitions, configure frontend, and optionally create integration nodes.

Step 1: Research Provider and Register OAuth App

Research the OAuth flow:

  • Use WebSearch/WebFetch to find official OAuth documentation
  • Look for "OAuth 2.0", "Developer Apps", or "API Authentication" sections
  • Identify authorization, token, and user info endpoints
  • Note required scopes and token format (refresh support, expiration)
  • Check token response structure and user info fields

Register OAuth application:

  • Create a developer account on the provider's platform
  • Register a new OAuth application/client
  • Set redirect URI to: http://localhost:3001/oauth/{provider-id}/connect (dev)
  • Note the generated Client ID and Client Secret
  • Configure required scopes/permissions

Present for confirmation:

markdown
Based on {Provider} OAuth documentation:

**Provider**: {Provider Name}
**ID**: `{provider-id}` (kebab-case)
**Endpoints**:
- Authorization: https://...
- Token: https://...
- User Info: https://...

**Scopes**: scope1, scope2
**Token Refresh**: Supported/Not supported
**Token Expiration**: {expires_in seconds} / Never expires

**OAuth App Registered**:
- Client ID: {id}
- Client Secret: {secret}
- Redirect URI: http://localhost:3001/oauth/{provider-id}/connect

Ready to implement?

Step 2: Add Backend Types

File: apps/api/src/oauth/types.ts

typescript
/**
 * {Provider} OAuth token response
 */
export interface {Provider}Token {
  access_token: string;
  refresh_token?: string;
  expires_in?: number;
  token_type: string;
  scope?: string;
}

/**
 * {Provider} user information
 */
export interface {Provider}User {
  id: string | number;
  email?: string;
  name?: string;
  // Add provider-specific fields
}

Step 3: Create Provider Class

File: apps/api/src/oauth/providers/{Provider}Provider.ts

typescript
import { OAuthProvider } from "../OAuthProvider";
import type { {Provider}Token, {Provider}User } from "../types";

export class {Provider}Provider extends OAuthProvider<{Provider}Token, {Provider}User> {
  readonly name = "{provider-id}";
  readonly displayName = "{Provider Name}";
  readonly authorizationEndpoint = "https://...";
  readonly tokenEndpoint = "https://...";
  readonly userInfoEndpoint = "https://...";
  readonly scopes = ["scope1", "scope2"];

  readonly refreshEnabled = true;  // false if no refresh support
  readonly refreshEndpoint = "https://...";  // only if refreshEnabled

  protected formatIntegrationName(user: {Provider}User): string {
    return user.name || user.email || "User";
  }

  protected formatUserMetadata(user: {Provider}User): Record<string, any> {
    return {
      userId: user.id,
      email: user.email,
      name: user.name,
    };
  }

  protected extractAccessToken(token: {Provider}Token): string {
    return token.access_token;
  }

  protected extractRefreshToken(token: {Provider}Token): string | undefined {
    return token.refresh_token;
  }

  protected extractExpiresAt(token: {Provider}Token): Date | undefined {
    return token.expires_in
      ? new Date(Date.now() + token.expires_in * 1000)
      : undefined;
  }
}

Step 4: Register Backend Provider

File: apps/api/src/oauth/registry.ts

typescript
import { {Provider}Provider } from "./providers/{Provider}Provider";

const providers = {
  // ... existing providers
  "{provider-id}": new {Provider}Provider(),
} as const;

Step 5: Update Shared Types

File: packages/types/src/integration.ts

Add to IntegrationProvider union and OAUTH_PROVIDERS array:

typescript
export type IntegrationProvider =
  | "existing-provider"
  | "{provider-id}"
  | "other-provider";

export const OAUTH_PROVIDERS: OAuthProvider[] = [
  // ... existing providers
  {
    id: "{provider-id}",
    name: "{Provider Name}",
    description: "Connect your {Provider} account to...",
    supportsOAuth: true,
    oauthEndpoint: "/oauth/{provider-id}/connect",
  },
];

Step 6: Create Frontend Provider

File: apps/web/src/integrations/providers/{provider-id}.ts

typescript
import {IconName} from "lucide-react/icons/{icon-name}";
import type { ProviderConfig } from "../types";

export const {provider}Provider: ProviderConfig = {
  id: "{provider-id}",
  name: "{Provider Name}",
  description: "Connect your {Provider} account...",
  icon: {IconName},
  supportsOAuth: true,
  oauthEndpoint: "/oauth/{provider-id}/connect",
  successMessage: "{Provider} integration connected successfully",
};

Step 7: Register Frontend Provider

File: apps/web/src/integrations/providers/index.ts

typescript
import { {provider}Provider } from "./{provider-id}";

export const PROVIDER_REGISTRY: Record<IntegrationProvider, ProviderConfig> = {
  // ... existing providers
  "{provider-id}": {provider}Provider,
};

Step 8: Configure Environment

File: apps/api/.dev.vars

bash
INTEGRATION_{PROVIDER}_CLIENT_ID=your_client_id
INTEGRATION_{PROVIDER}_CLIENT_SECRET=your_client_secret

Step 9: Update Integration Routes

File: apps/api/src/routes/integrations.ts

Add provider availability check:

typescript
if (
  env.INTEGRATION_{PROVIDER}_CLIENT_ID &&
  env.INTEGRATION_{PROVIDER}_CLIENT_SECRET
) {
  availableProviders.push("{provider-id}");
}

Step 10: Test OAuth Flow

bash
pnpm typecheck
pnpm dev

Navigate to integrations page, click "Connect {Provider}", complete OAuth flow, verify integration appears in list.

Optional: Create Integration Nodes

File: packages/runtime/src/nodes/{provider-id}/{action}-{provider-id}-node.ts

typescript
import { NodeExecution, NodeType } from "@dafthunk/types";
import { ExecutableNode, NodeContext } from "../../runtime/node-types";

export class {Action}{Provider}Node extends ExecutableNode {
  public static readonly nodeType: NodeType = {
    id: "{action}-{provider-id}",
    name: "{Action} ({Provider})",
    type: "{action}-{provider-id}",
    description: "{Action description}",
    tags: ["{Category}", "{Provider}"],
    icon: "icon-name",
    inputs: [
      {
        name: "integrationId",
        type: "string",
        description: "{Provider} integration to use",
        hidden: true,
        required: true,
      },
      // Add action-specific inputs
    ],
    outputs: [
      // Add action-specific outputs
    ],
  };

  async execute(context: NodeContext): Promise<NodeExecution> {
    try {
      const { integrationId } = context.inputs;

      // Get integration (auto-refreshes token)
      const integration = await context.getIntegration(integrationId);

      // Call provider API
      const response = await fetch("https://api.{provider}.com/...", {
        method: "POST",
        headers: {
          Authorization: `Bearer ${integration.token}`,
          "Content-Type": "application/json",
        },
        body: JSON.stringify({ /* request */ }),
      });

      if (!response.ok) {
        return this.createErrorResult(`API call failed: ${await response.text()}`);
      }

      const data = await response.json();
      return this.createSuccessResult({ /* outputs */ });
    } catch (error) {
      return this.createErrorResult(
        error instanceof Error ? error.message : "Unknown error"
      );
    }
  }
}

Register in apps/api/src/runtime/cloudflare-node-registry.ts:

typescript
import { {Action}{Provider}Node } from "./{provider-id}/{action}-{provider-id}-node";

this.registerImplementation({Action}{Provider}Node);

Optional: Create Frontend Widget

File: apps/web/src/components/workflow/widgets/integration-selector.tsx

typescript
export const {provider}Widget = createIntegrationWidget("{provider-id}", [
  "{action1}-{provider-id}",
  "{action2}-{provider-id}",
]);

Register in apps/web/src/components/workflow/widgets/index.ts:

typescript
import { {provider}Widget } from "./integration-selector";

export const widgetRegistry = {
  ...{provider}Widget,
};

Common Patterns

HTTP Basic Auth (e.g., Reddit):

typescript
protected getTokenHeaders(clientId: string, clientSecret: string): Record<string, string> {
  const credentials = btoa(`${clientId}:${clientSecret}`);
  return {
    Authorization: `Basic ${credentials}`,
    "Content-Type": "application/x-www-form-urlencoded",
  };
}

No Token Expiration (e.g., GitHub):

typescript
readonly refreshEnabled = false;

protected extractExpiresAt(token: {Provider}Token): Date | undefined {
  return undefined;
}

Custom Auth Parameters (e.g., Google):

typescript
protected customizeAuthUrl(url: URL): void {
  url.searchParams.set("access_type", "offline");
}

Summary

After completion, list:

  • Files created (backend types, provider, frontend config)
  • Environment variables required
  • OAuth flow test results
  • Optional nodes/widgets created

© dafthunk-com, MIT. Rendered from Markdown: HTML in the file is shown as text, images as links, and headings moved down two levels. Raw file

Files

Just SKILL.md in .claude/skills/integration-generator of dafthunk-com/dafthunk.

Open the folder on GitHubat commit 66be308

Compare with similar skills

Integration Generator next to the 5 skills that share the most tags, products or categories with it. Stars are the repository's; “used in” counts other GitHub owners with a copy.

Integration Generator compared with similar skills
SkillStarsUsed inTokensAuto-checkLicenceRepo updated
Integration Generator this skilldafthunk-com/dafthunk134—~2.3kAutomated safety check: PassMIT
Datadog Appdatadog-labs/agent-skills177—~744Automated safety check: PassMIT
Better Authsecondsky/claude-skills227—~7.5kAutomated safety check: PassMIT
N8n ArchitectEtienneLescot/n8n-as-code1.6k—~7.3kAutomated safety check: WarnMIT
Apify Integration Developmentapify/agent-skills2.4k—~3.1kAutomated safety check: PassNone
Agents SDKhodgef/apiker1273 repos~3kAutomated safety check: PassMIT

Similar skills

  • Datadog App

    datadog-labs/agent-skills

    Guides developers building Datadog Apps with TypeScript, React, the @datadog/apps scaffolder, and @datadog/vite-plugin.

    177 GitHub stars~744 tokensUpdated 5 days ago
    DevOps & CloudAuto-check passed
  • Better Auth

    secondsky/claude-skills

    Skill for integrating Better Auth - comprehensive TypeScript authentication framework for Cloudflare D1, Next.js, Nuxt, and 15+ frameworks.

    227 GitHub stars~7.5k tokensUpdated 9 days ago
    Backend & APIsAuto-check passed
  • N8n Architect

    EtienneLescot/n8n-as-code

    A skill your agent uses when the user explicitly wants to create, edit, validate, sync, or troubleshoot n8n workflows, asks about n8n nodes or automation, or wants to use n8n-as-code in the current…

    1.6k GitHub stars~7.3k tokensUpdated today
    Productivity & AutomationAuto-check: warnings
  • Official

    Guides designing and building an official Apify integration for a company's product: workflow-automation apps, AI agent plugins, AI framework packages or direct API clients.

    2.4k GitHub stars~3.1k tokensUpdated yesterday
    Backend & APIsAuto-check passed
  • Agents SDK

    hodgef/apiker

    Build AI agents on Cloudflare Workers using the Agents SDK. An agent skill from hodgef/apiker.

    127 GitHub starsUsed in 3 repos~3k tokens
    Backend & APIsAuto-check passed
  • Google Chat

    sanjay3290/ai-skills

    Interact with Google Chat - send, read, edit, delete and react to messages, share images and files, reply in threads, and manage spaces and DMs.

    430 GitHub stars~1.2k tokensUpdated 27 days ago
    Backend & APIsAuto-check passed

More from dafthunk-com/dafthunk

  • Node Generator

    dafthunk-com/dafthunk

    Generate new workflow nodes with implementation, tests, and registry registration

    134 GitHub stars~2.5k tokensUpdated 1 mo ago
    Auto-check passed
  • Template Generator

    dafthunk-com/dafthunk

    Generate workflow templates with coherent node graphs and integration tests

    134 GitHub stars~1.4k tokensUpdated 1 mo ago
    Auto-check passed

Questions about Integration Generator

What does Integration Generator do?

Generate new OAuth integration providers for Dafthunk with backend providers, type definitions, frontend configurations, and integration nodes. Integration Generator is an agent skill from dafthunk-com/dafthunk.

When should I use Integration Generator?

Integration Generator fits situations like: tasks that involve OAuth and OpenID Connect; tasks that involve Workflow automation.

How do I install Integration Generator in Claude Code?

Run `npx skills add dafthunk-com/dafthunk --skill integration-generator -a claude-code`. Or copy the skill folder (.claude/skills/integration-generator in dafthunk-com/dafthunk) into .claude/skills/integration-generator in your project. Claude Code loads it when a task matches its description.

How do I install Integration Generator in Codex?

Run `npx skills add dafthunk-com/dafthunk --skill integration-generator -a codex`. Or copy the skill folder (.claude/skills/integration-generator in dafthunk-com/dafthunk) into .agents/skills/integration-generator in your project. Codex loads it when a task matches its description.

Can I use Integration Generator in Cursor, Gemini CLI or GitHub Copilot?

Cursor, Gemini CLI, GitHub Copilot and OpenCode also load SKILL.md folders. With the skills CLI, run `npx skills add dafthunk-com/dafthunk --skill integration-generator -a cursor` (or -a gemini-cli, github-copilot or opencode for the others). To copy it by hand, put the folder in .cursor/skills/integration-generator, .gemini/skills/integration-generator, .github/skills/integration-generator and .opencode/skills/integration-generator in your project.

What does Integration Generator need to run?

Going by SKILL.md and its folder, Integration Generator needs the command-line tools its instructions call (pnpm).

Does Integration Generator access the network?

SKILL.md contains no URLs. Any network use would come from the scripts or tools the agent runs. This is read from the text; nothing was executed.

Is Integration Generator safe to install?

Our automated static check of SKILL.md found no risky patterns, such as piping downloads into a shell, reading credential files or hidden Unicode. It is not a guarantee. Review the folder before installing.

What licence does Integration Generator use?

Integration Generator is published under the MIT licence (the repository's licence). It allows redistribution, so the full SKILL.md is shown on this page.

How many tokens does Integration Generator use?

About 2.3k tokens (SKILL.md is roughly 9.2k characters). Agents keep only the skill's name and description in context until a task matches; then they load SKILL.md in full.

What are the alternatives to Integration Generator?

Skills that share tags, products or a category with Integration Generator: Datadog App (datadog-labs/agent-skills, 177 stars), Better Auth (secondsky/claude-skills, 227 stars), N8n Architect (EtienneLescot/n8n-as-code, 1.6k stars) and Apify Integration Development (apify/agent-skills, 2.4k stars). The comparison table on this page puts their stars, adoption, token cost, safety result and licence side by side.

Who maintains Integration Generator?

dafthunk-com (a GitHub organization) maintains it in dafthunk-com/dafthunk, which has 134 GitHub stars. The repository holds 3 skills in this directory. The repository was last updated on September 4, 2026.

Source: dafthunk-com/dafthunk on GitHub. Facts on this page come from the repository at the commit we read; the author's words are quoted as theirs.