Prerequisites
Before we begin, you’ll need:Together AI API Key
Get your API key from Together AI
Klavis AI API Key
Get your API key from Klavis AI
Installation
First, install the required packages:pip install together klavis
npm install together-ai klavis
Setup Environment Variables
import os
# Set environment variables
os.environ["TOGETHER_API_KEY"] = "your-together-api-key-here" # Replace with your actual Together API key
os.environ["KLAVIS_API_KEY"] = "your-klavis-api-key-here" # Replace with your actual Klavis API key
// Set environment variables in your .env file
process.env.TOGETHER_API_KEY = "your-together-api-key-here"; // Replace with your actual Together API key
process.env.KLAVIS_API_KEY = "your-klavis-api-key-here"; // Replace with your actual Klavis API key
Basic Setup
import os
import json
from together import Together
from klavis import Klavis
from klavis.types import McpServerName, ToolFormat
# Initialize clients
together_client = Together(api_key=os.getenv("TOGETHER_API_KEY"))
klavis_client = Klavis(api_key=os.getenv("KLAVIS_API_KEY"))
import Together from 'together-ai';
import { KlavisClient, Klavis } from 'klavis';
// Initialize clients
const togetherClient = new Together({ apiKey: process.env.TOGETHER_API_KEY });
const klavisClient = new KlavisClient({ apiKey: process.env.KLAVIS_API_KEY });
AI Agent with MCP Integration
Now we’ll create an intelligent agent that uses Together AI’s powerful LLMs with Klavis MCP servers. This agent will:- Discover Tools: Automatically find available tools from MCP servers
- Function Calling: Use Together AI’s function calling capabilities
- Tool Execution: Execute tools through Klavis API
- Smart Responses: Generate intelligent responses based on tool results
class Agent:
def __init__(self, together_client, klavis_client, mcp_server_url, model="meta-llama/Llama-3.3-70B-Instruct-Turbo"):
self.together = together_client
self.klavis = klavis_client
self.mcp_server_url = mcp_server_url
self.model = model
print(f"🤖 Agent initialized with Together AI model: {self.model}")
def process_request(self, user_message):
# 1. Get available tools
mcp_tools = self.klavis.mcp_server.list_tools(
server_url=self.mcp_server_url,
format=ToolFormat.OPENAI
)
# 2. Call LLM with tools
messages = [
{"role": "system", "content": "You are a helpful AI assistant with access to various tools."},
{"role": "user", "content": user_message}
]
response = self.together.chat.completions.create(
model=self.model,
messages=messages,
tools=mcp_tools.tools
)
assistant_message = response.choices[0].message
messages.append(assistant_message)
# 3. If LLM wants to use tools
if assistant_message.tool_calls:
# Execute each tool call
for tool_call in assistant_message.tool_calls:
tool_name = tool_call.function.name
tool_args = json.loads(tool_call.function.arguments)
print(f"🛠️ Calling tool: {tool_name} with args: {tool_args}")
# Call tool via Klavis SDK
tool_result = self.klavis.mcp_server.call_tools(
server_url=self.mcp_server_url,
tool_name=tool_name,
tool_args=tool_args
)
messages.append({
"role": "tool",
"tool_call_id": tool_call.id,
"content": str(tool_result)
})
# 4. Get final response from LLM
final_response = self.together.chat.completions.create(
model=self.model,
messages=messages
)
return final_response.choices[0].message.content
# If no tools needed, return the assistant message directly
return assistant_message.content
class Agent {
private together: Together;
private klavis: KlavisClient;
private mcpServerUrl: string;
private model: string;
constructor(togetherClient: Together, klavisClient: KlavisClient, mcpServerUrl: string, model: string = "meta-llama/Llama-3.3-70B-Instruct-Turbo") {
this.together = togetherClient;
this.klavis = klavisClient;
this.mcpServerUrl = mcpServerUrl;
this.model = model;
console.log(`🤖 Agent initialized with Together AI model: ${this.model}`);
}
async processRequest(userMessage: string) {
// 1. Get available tools
const mcpTools = await this.klavis.mcpServer.listTools({
serverUrl: this.mcpServerUrl,
format: Klavis.ToolFormat.Openai
});
// 2. Call LLM with tools
const messages = [
{ role: "system", content: "You are a helpful AI assistant with access to various tools." },
{ role: "user", content: userMessage }
];
const response = await this.together.chat.completions.create({
model: this.model,
messages: messages,
tools: mcpTools.tools
});
const assistantMessage = response.choices[0].message;
messages.push(assistantMessage);
// 3. If LLM wants to use tools
if (assistantMessage.tool_calls) {
// Execute each tool call
for (const toolCall of assistantMessage.tool_calls) {
const toolName = toolCall.function.name;
const toolArgs = JSON.parse(toolCall.function.arguments);
console.log(`🛠️ Calling tool: ${toolName} with args:`, toolArgs);
// Call tool via Klavis SDK
const toolResult = await this.klavis.mcpServer.callTools({
serverUrl: this.mcpServerUrl,
toolName: toolName,
toolArgs: toolArgs
});
messages.push({
role: "tool",
tool_call_id: toolCall.id,
content: JSON.stringify(toolResult)
});
}
// 4. Get final response from LLM
const finalResponse = await this.together.chat.completions.create({
model: this.model,
messages: messages
});
return finalResponse.choices[0].message.content;
}
// If no tools needed, return the assistant message directly
return assistantMessage.content;
}
}
Use Case Examples
Example 1: Summarize YouTube Video
# Example YouTube video URL - replace with any video you'd like to analyze
YOUTUBE_VIDEO_URL = "https://www.youtube.com/watch?v=TG6QOa2JJJQ"
# 1. Create YouTube MCP server instance
youtube_mcp_instance = klavis_client.mcp_server.create_server_instance(
server_name=McpServerName.YOUTUBE,
user_id="1234"
)
# 2. Create an agent with YouTube MCP server
agent = Agent(
together_client=together_client,
klavis_client=klavis_client,
mcp_server_url=youtube_mcp_instance.server_url,
model="meta-llama/Llama-3.3-70B-Instruct-Turbo"
)
# 3. Process the request
response = agent.process_request(
f"Please analyze this YouTube video and provide a comprehensive summary with timestamps: {YOUTUBE_VIDEO_URL}"
)
print(response)
// Example YouTube video URL - replace with any video you'd like to analyze
const YOUTUBE_VIDEO_URL = "https://www.youtube.com/watch?v=TG6QOa2JJJQ";
// 1. Create YouTube MCP server instance
const youtubeMcpInstance = await klavisClient.mcpServer.createServerInstance({
serverName: Klavis.McpServerName.Youtube,
userId: "1234"
});
// 2. Create an agent with YouTube MCP server
const agent = new Agent(
togetherClient,
klavisClient,
youtubeMcpInstance.serverUrl,
"meta-llama/Llama-3.3-70B-Instruct-Turbo"
);
// 3. Process the request
const response = await agent.processRequest(
`Please analyze this YouTube video and provide a comprehensive summary with timestamps: ${YOUTUBE_VIDEO_URL}`
);
console.log(response);
Example 2: Send Email via Gmail
Gmail integration requires OAuth authentication, so you’ll need to authorize the application in your browser.
import webbrowser
# Create Gmail MCP server instance
gmail_mcp_instance = klavis_client.mcp_server.create_server_instance(
server_name=McpServerName.GMAIL,
user_id="1234"
)
# Redirect to Gmail OAuth page for authorization
webbrowser.open(gmail_mcp_instance.oauth_url)
print(f"🔐 Opening OAuth authorization for Gmail")
print(f"If you are not redirected automatically, please open this URL: {gmail_mcp_instance.oauth_url}")
# Email configuration
EMAIL_RECIPIENT = "recipient@example.com" # Replace with the recipient's email
EMAIL_SUBJECT = "Greetings from Together AI + Klavis Integration"
EMAIL_BODY = "This is a test email sent using the Together AI and Klavis AI integration. The email was sent automatically by your AI agent!"
# After OAuth authorization is complete, create the Gmail agent
gmail_agent = Agent(
together_client=together_client,
klavis_client=klavis_client,
mcp_server_url=gmail_mcp_instance.server_url,
model="Qwen/Qwen2.5-72B-Instruct-Turbo"
)
# Send the email
response = gmail_agent.process_request(
f"Please send an email to {EMAIL_RECIPIENT} with the subject '{EMAIL_SUBJECT}' and the following body: '{EMAIL_BODY}'"
)
print(response)
// Create Gmail MCP server instance
const gmailMcpInstance = await klavisClient.mcpServer.createServerInstance({
serverName: Klavis.McpServerName.Gmail,
userId: "1234"
});
// Redirect to Gmail OAuth page for authorization
console.log("🔐 Opening OAuth authorization for Gmail");
console.log(`If you are not redirected automatically, please open this URL: ${gmailMcpInstance.oauthUrl}`);
// In a web environment, you might redirect the user
window.open(gmailMcpInstance.oauthUrl);
// Email configuration
const EMAIL_RECIPIENT = "recipient@example.com"; // Replace with the recipient's email
const EMAIL_SUBJECT = "Greetings from Together AI + Klavis Integration";
const EMAIL_BODY = "This is a test email sent using the Together AI and Klavis AI integration. The email was sent automatically by your AI agent!";
// After OAuth authorization is complete, create the Gmail agent
const gmailAgent = new Agent(
togetherClient,
klavisClient,
gmailMcpInstance.serverUrl,
"Qwen/Qwen2.5-72B-Instruct-Turbo"
);
// Send the email
const response = await gmailAgent.processRequest(
`Please send an email to ${EMAIL_RECIPIENT} with the subject '${EMAIL_SUBJECT}' and the following body: '${EMAIL_BODY}'`
);
console.log(response);
Next Steps
Explore More MCP Servers
Try other available servers like Slack, Notion, CRM etc.
Experiment with Different Models
Test various Together AI models for different use cases.
Build Multi-Server Workflows
Create sophisticated agents that combine multiple services
Production Deployment
Scale these patterns for production applications
Useful Resources
- Together AI Documentation
- Klavis AI Documentation
- MCP Protocol Specification
- Together AI Models
- Klavis MCP Servers
