General - Barndoor Documentation

Barndoor SDK Examples

This directory contains working examples that demonstrate how to use the Barndoor TypeScript SDK with MCP servers.

Key Patterns

Both examples follow the same proven pattern:

// 1. Authenticate
const sdk = await loginInteractive();

// 2. Ensure server is connected
await ensureServerConnected(sdk, SERVER_SLUG);

// 3. Create MCP client
const mcpClient = await makeMcpClient(sdk, SERVER_SLUG);

// 4. Use MCP client
const { tools } = await mcpClient.listTools();
const result = await mcpClient.callTool({ name: 'tool_name', arguments: {} });

// 5. Cleanup
await mcpClient.close();
await sdk.close();

Configuration

Both examples use the same authentication pattern:

  1. Environment Variables (create a .env file):

    AUTH_DOMAIN=your-auth-domain
    AGENT_CLIENT_ID=your-client-id
    AGENT_CLIENT_SECRET=your-client-secret
    MODE=development  # or production
    
  2. Server Configuration: Change the SERVER_SLUG constant in each file to target different MCP servers:

    • 'salesforce' - Salesforce integration
    • 'notion' - Notion integration
    • Or any other configured MCP server

Working Examples

1. basic-mcp-client.js - Direct MCP Client

Basic example showing direct MCP server interaction without AI frameworks. What it does:

Requirements:

npm install dotenv

Run:

node examples/basic-mcp-client.js
/**
 * πŸ”— Universal Barndoor MCP Client
 *
 * Lets the user pick any available MCP server, list its tools,
 * and run a custom prompt / command interactively β€” no hardcoded Salesforce or Notion.
 */

import 'dotenv/config';
import readline from 'readline/promises';
import {
  loginInteractive,
  ensureServerConnected,
  makeMcpClient,
  BarndoorSDK,
  getDynamicConfig,
  getStaticConfig,
  hasOrganizationInfo,
} from '../dist/index.esm.js';

// simple input helper
const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
async function ask(q) {
  return (await rl.question(q)).trim();
}

async function main() {
  try {
    console.log('\nπŸš€ Starting Universal MCP Client Example...\n');

// ---------------------------------------------------------------------
    // 1. Authenticate to Barndoor
    // ---------------------------------------------------------------------
    console.log('πŸ” Authenticating with Barndoor...');
    let sdk;
    const envToken = process.env.BARNDOOR_ACCESS_TOKEN;

if (envToken) {
      console.log('πŸ”‘ Using token from BARNDOOR_ACCESS_TOKEN');
      const cfg = hasOrganizationInfo(envToken)
        ? getDynamicConfig(envToken)
        : getStaticConfig();
      sdk = new BarndoorSDK(cfg.apiBaseUrl, { token: envToken });
      await sdk.listServers();
      console.log('βœ… Authentication successful (env token)!');
    } else {
      sdk = await loginInteractive();
      await sdk.listServers();
      console.log('βœ… Authentication successful!');
    }

// ---------------------------------------------------------------------
    // 2. List all available servers
    // ---------------------------------------------------------------------
    const servers = await sdk.listServers();
    if (!servers.length) throw new Error('No MCP servers found for this user.');
    console.log('\nπŸ“‘ Available MCP servers:');
    servers.forEach((s, i) => console.log(`  ${i + 1}. ${s.slug} (${s.connection_status})`));

// Ask user which one to use
    let idx = await ask('\nπŸ‘‰ Enter the number of the server you want to use: ');
    const choice = servers[parseInt(idx) - 1];
    if (!choice) throw new Error('Invalid selection.');
    const SERVER_SLUG = choice.slug;
    console.log(`\nπŸ”— Selected: ${SERVER_SLUG}\n`);

// ---------------------------------------------------------------------
    // 3. Ensure it’s connected
    // ---------------------------------------------------------------------
    await ensureServerConnected(sdk, SERVER_SLUG);
    console.log(`βœ… ${SERVER_SLUG} connected.`);

// ---------------------------------------------------------------------
    // 4. Build MCP client and show available tools
    // ---------------------------------------------------------------------
    const mcpClient = await makeMcpClient(sdk, SERVER_SLUG);
    console.log('\nπŸ”§ Fetching available tools...');
    const { tools = [] } = await mcpClient.listTools();
    if (!tools.length) console.log('⚠️  No tools found for this server.');
    else tools.forEach((t, i) => console.log(`  ${i + 1}. ${t.name} β€” ${t.description || 'No description'}`));

// ---------------------------------------------------------------------
    // 5. Ask user for a custom prompt
    // ---------------------------------------------------------------------
    const prompt = await ask('\nπŸ’¬ What do you want to ask or do? (describe task): ');
    console.log(`\n🧠 Interpreting prompt: \