import "dotenv/config";
import { openai } from "@ai-sdk/openai";
import { Agent } from "@mastra/core/agent";
import { MCPClient } from "@mastra/mcp";
import { Composio } from "@composio/core";
import * as readline from "readline";
import type { AiMessageType } from "@mastra/core/agent";
const openaiAPIKey = process.env.OPENAI_API_KEY;
const composioAPIKey = process.env.COMPOSIO_API_KEY;
const composioUserID = process.env.COMPOSIO_USER_ID;
if (!openaiAPIKey) throw new Error("OPENAI_API_KEY is not set");
if (!composioAPIKey) throw new Error("COMPOSIO_API_KEY is not set");
if (!composioUserID) throw new Error("COMPOSIO_USER_ID is not set");
const composio = new Composio({ apiKey: composioAPIKey as string });
async function main() {
const session = await composio.create(composioUserID as string, {
toolkits: ["wix"],
});
const composioMCPUrl = session.mcp.url;
const mcpClient = new MCPClient({
id: composioUserID as string,
servers: {
wix: {
url: new URL(composioMCPUrl),
requestInit: {
headers: session.mcp.headers,
},
},
},
timeout: 30_000,
});
const composioTools = await mcpClient.getTools();
const agent = new Agent({
name: "wix-mastra-agent",
instructions: "You are an AI agent with Wix tools via Composio.",
model: "openai/gpt-5",
});
let messages: AiMessageType[] = [];
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: "> ",
});
rl.prompt();
rl.on("line", async (input: string) => {
const trimmed = input.trim();
if (["exit", "quit"].includes(trimmed.toLowerCase())) {
rl.close();
return;
}
messages.push({ id: crypto.randomUUID(), role: "user", content: trimmed });
const { text } = await agent.generate(messages, {
toolsets: { wix: composioTools },
maxSteps: 8,
});
if (text) {
console.log(`Agent: ${text}\n`);
messages.push({ id: crypto.randomUUID(), role: "assistant", content: text });
}
rl.prompt();
});
rl.on("close", async () => {
await mcpClient.disconnect();
process.exit(0);
});
}
main();