Files
patchy631--ai-engineering-hub/open-agent-builder/lib/arcade/tools.ts
T
2026-07-13 12:37:47 +08:00

276 lines
6.6 KiB
TypeScript

/**
* Arcade.dev MCP Tools Registry
* Centralized configuration for all Arcade.dev integrations
*/
export interface ArcadeTool {
id: string;
name: string;
toolName: string;
version: string;
description: string;
category: 'google' | 'microsoft' | 'slack' | 'notion' | 'other';
inputs: {
name: string;
type: string;
required: boolean;
description: string;
}[];
}
/**
* Registry of available Arcade.dev tools
* Add new tools here to make them available in workflows
*/
export const ARCADE_TOOLS: Record<string, ArcadeTool> = {
'google-docs-create': {
id: 'google-docs-create',
name: 'Create Google Doc',
toolName: 'GoogleDocs.CreateDocumentFromText',
version: '4.3.1',
description: 'Create a new Google Doc from text content',
category: 'google',
inputs: [
{
name: 'title',
type: 'string',
required: true,
description: 'Document title',
},
{
name: 'text_content',
type: 'string',
required: true,
description: 'Text content for the document',
},
{
name: 'user_id',
type: 'string',
required: false,
description: 'User ID for authorization',
},
],
},
'google-sheets-create': {
id: 'google-sheets-create',
name: 'Create Google Sheet',
toolName: 'GoogleSheets.CreateSpreadsheet',
version: '4.3.1',
description: 'Create a new Google Sheet with data',
category: 'google',
inputs: [
{
name: 'title',
type: 'string',
required: true,
description: 'Spreadsheet title',
},
{
name: 'data',
type: 'array',
required: true,
description: 'Array of rows (each row is an array of values)',
},
{
name: 'user_id',
type: 'string',
required: false,
description: 'User ID for authorization',
},
],
},
'google-slides-create': {
id: 'google-slides-create',
name: 'Create Google Slides',
toolName: 'GoogleSlides.CreatePresentation',
version: '4.3.1',
description: 'Create a new Google Slides presentation',
category: 'google',
inputs: [
{
name: 'title',
type: 'string',
required: true,
description: 'Presentation title',
},
{
name: 'slides',
type: 'array',
required: true,
description: 'Array of slide objects with title and content',
},
{
name: 'user_id',
type: 'string',
required: false,
description: 'User ID for authorization',
},
],
},
'gmail-send': {
id: 'gmail-send',
name: 'Send Gmail',
toolName: 'Gmail.SendEmail',
version: '4.3.1',
description: 'Send an email via Gmail',
category: 'google',
inputs: [
{
name: 'to',
type: 'string',
required: true,
description: 'Recipient email address',
},
{
name: 'subject',
type: 'string',
required: true,
description: 'Email subject',
},
{
name: 'body',
type: 'string',
required: true,
description: 'Email body',
},
{
name: 'user_id',
type: 'string',
required: false,
description: 'User ID for authorization',
},
],
},
'slack-send': {
id: 'slack-send',
name: 'Send Slack Message',
toolName: 'Slack.SendMessage',
version: '4.3.1',
description: 'Send a message to a Slack channel',
category: 'slack',
inputs: [
{
name: 'channel',
type: 'string',
required: true,
description: 'Channel name or ID',
},
{
name: 'message',
type: 'string',
required: true,
description: 'Message text',
},
{
name: 'user_id',
type: 'string',
required: false,
description: 'User ID for authorization',
},
],
},
'notion-create-page': {
id: 'notion-create-page',
name: 'Create Notion Page',
toolName: 'Notion.CreatePage',
version: '4.3.1',
description: 'Create a new page in Notion',
category: 'notion',
inputs: [
{
name: 'title',
type: 'string',
required: true,
description: 'Page title',
},
{
name: 'content',
type: 'string',
required: true,
description: 'Page content (markdown supported)',
},
{
name: 'parent_page_id',
type: 'string',
required: false,
description: 'Parent page ID (optional)',
},
{
name: 'user_id',
type: 'string',
required: false,
description: 'User ID for authorization',
},
],
},
};
/**
* Helper function to get Arcade MCP tool configuration for a workflow node
*/
export function getArcadeMCPConfig(toolId: string) {
const tool = ARCADE_TOOLS[toolId];
if (!tool) {
throw new Error(`Arcade tool "${toolId}" not found in registry`);
}
return {
toolId: tool.id,
toolName: `${tool.toolName}@${tool.version}`,
name: tool.name,
description: tool.description,
mcpServer: {
id: `arcade-${tool.category}`,
name: `Arcade.dev (${tool.category})`,
label: `Arcade.dev (${tool.category})`,
url: 'https://api.arcade.dev/v1',
description: tool.description,
authType: 'api-key',
accessToken: '${ARCADE_API_KEY}',
connected: false,
tools: [tool.toolName],
},
};
}
/**
* Helper function to generate agent instructions for an Arcade tool
*/
export function generateArcadeInstructions(
toolId: string,
params: Record<string, string>
): string {
const tool = ARCADE_TOOLS[toolId];
if (!tool) {
throw new Error(`Arcade tool "${toolId}" not found in registry`);
}
const paramsList = tool.inputs
.map((input) => {
const value = params[input.name] || `{{${input.name}}}`;
return `- ${input.name}: ${value}`;
})
.join('\n');
return `You are an integration agent. Use the Arcade.dev ${tool.toolName} tool to ${tool.description.toLowerCase()}.
Use the ${tool.toolName} tool with the following parameters:
${paramsList}
Execute the tool and return the result, including any URLs or IDs from the response.`;
}
/**
* Get all tools by category
*/
export function getToolsByCategory(category: string): ArcadeTool[] {
return Object.values(ARCADE_TOOLS).filter((tool) => tool.category === category);
}
/**
* Get all available categories
*/
export function getToolCategories(): string[] {
return Array.from(new Set(Object.values(ARCADE_TOOLS).map((tool) => tool.category)));
}