general.md

General

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: \