import 'dotenv/config';
import { Composio } from '@composio/core';
import { OpenAIAgentsProvider } from '@composio/openai-agents';
import { Agent, hostedMcpTool, run, OpenAIConversationsSession } from '@openai/agents';
import * as readline from 'readline';
const composioApiKey = process.env.COMPOSIO_API_KEY;
const userId = process.env.USER_ID;
if (!composioApiKey) {
throw new Error('COMPOSIO_API_KEY is not set. Create a .env file with COMPOSIO_API_KEY=your_key');
}
if (!userId) {
throw new Error('USER_ID is not set');
}
const composio = new Composio({
apiKey: composioApiKey,
provider: new OpenAIAgentsProvider(),
});
async function main() {
const session = await composio.create(userId as string, {
toolkits: ['ahrefs'],
});
const mcpUrl = session.mcp.url;
const agent = new Agent({
name: 'Assistant',
model: 'gpt-5',
instructions:
'You are a helpful assistant that can access Ahrefs. Help users perform Ahrefs operations through natural language.',
tools: [
hostedMcpTool({
serverLabel: 'tool_router',
serverUrl: mcpUrl,
headers: { 'x-api-key': composioApiKey },
requireApproval: 'never',
}),
],
});
const conversationSession = new OpenAIConversationsSession();
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout,
prompt: 'You: ',
});
console.log('\nComposio Tool Router session created.');
console.log('\nChat started. Type your requests below.');
console.log("Commands: 'exit', 'quit', or 'q' to end\n");
try {
const first = await run(agent, 'What can you help me with?', { session: conversationSession });
console.log(`Assistant: ${first.finalOutput}\n`);
} catch (e) {
console.error('Error:', e instanceof Error ? e.message : e, '\n');
}
rl.prompt();
rl.on('line', async (userInput) => {
const text = userInput.trim();
if (['exit', 'quit', 'q'].includes(text.toLowerCase())) {
console.log('Goodbye!');
rl.close();
process.exit(0);
}
if (!text) {
rl.prompt();
return;
}
try {
const result = await run(agent, text, { session: conversationSession });
console.log(`\nAssistant: ${result.finalOutput}\n`);
} catch (e) {
console.error('Error:', e instanceof Error ? e.message : e, '\n');
}
rl.prompt();
});
rl.on('close', () => {
console.log('\nSession ended.');
process.exit(0);
});
}
main().catch((err) => {
console.error('Fatal error:', err);
process.exit(1);
});