How to integrate Etermin MCP with OpenAI Agents SDK

Trusted by
AWS
Glean
Zoom
Airtable

30 min · no commitment · see it on your stack

Etermin logo
OpenAI Agents SDK logo
divider

Introduction

This guide walks you through connecting Etermin to the OpenAI Agents SDK using the Composio tool router. By the end, you'll have a working Etermin agent that can add new client contact for booking, remove canceled appointment from calendar, create voucher for returning customer through natural language commands.

This guide will help you understand how to give your OpenAI Agents SDK agent real control over a Etermin account through Composio's Etermin MCP server.

Before we dive in, let's take a quick look at the key ideas and tools involved.

Also integrate Etermin with

TL;DR

Here's what you'll learn:
  • Get and set up your OpenAI and Composio API keys
  • Install the necessary dependencies
  • Initialize Composio and create a Tool Router session for Etermin
  • Configure an AI agent that can use Etermin as a tool
  • Run a live chat session where you can ask the agent to perform Etermin operations

What is OpenAI Agents SDK?

The OpenAI Agents SDK is a lightweight framework for building AI agents that can use tools and maintain conversation state. It provides a simple interface for creating agents with hosted MCP tool support.

Key features include:

  • Hosted MCP Tools: Connect to external services through hosted MCP endpoints
  • SQLite Sessions: Persist conversation history across interactions
  • Simple API: Clean interface with Agent, Runner, and tool configuration
  • Streaming Support: Real-time response streaming for interactive applications

What is the Etermin MCP server, and what's possible with it?

The Etermin MCP server is an implementation of the Model Context Protocol that connects your AI agent and assistants like Claude, Cursor, etc directly to your Etermin account. It provides structured and secure access to your appointment scheduling system, so your agent can perform actions like creating contacts, managing bookings, updating resources, and handling calendar events on your behalf.

  • Automated contact and user creation: Instantly add new clients or team members to your Etermin account, streamlining onboarding and customer management.
  • Effortless appointment and calendar management: Let your agent delete existing appointments or calendars, freeing up schedules and reducing manual work.
  • Resource and service administration: Automatically create or remove resources and services, ensuring your booking system stays current as your business evolves.
  • Voucher and webhook setup: Quickly generate new vouchers for promotions or set up webhooks for real-time event notifications and integrations.
  • Contact and service deletion: Easily remove outdated contacts or services, keeping your scheduling platform organized and clutter-free.

Supported Tools & Triggers

Tools
Assign Calendar ServiceTool to assign a service to a calendar in eTermin.
Create AbsenceTool to create an absence (non-working time) for a specific calendar.
Create AnchortimeTool to create anchortimes (recurring time slots) in a calendar.
Create Anchortime by DateTool to create anchortimes by date.
Create AppointmentTool to create a new appointment in eTermin.
Create Appointment via SyncTool to create an appointment via sync in eTermin.
Create Calendar Return TimeTool to create a return time for a calendar.
Create ContactTool to create a new contact in eTermin.
Create ServiceTool to create a new service in eTermin.
Create Service GroupTool to create a new service group in eTermin.
Create UserTool to create a new user.
Create UsermappingTool to create a new usermapping in eTermin.
Create VoucherCreates a new discount voucher in eTermin.
Create WebhookCreates a webhook (web push notification) in eTermin to receive real-time updates about appointments.
Create Working TimeTool to create a new working time slot in eTermin.
Create Working Times DateTool to create a working times date slot for a calendar.
Delete AbsenceTool to delete an absence (non-working time) from a calendar.
Delete AnchortimeDelete an anchortime from eTermin by its ID.
Delete Anchortime By DateDelete an anchortime by date using its ID.
Delete AppointmentDelete an existing appointment by its ID.
Delete Appointment via SyncTool to delete appointments via the sync endpoint.
Delete CalendarDelete a calendar from your eTermin account.
Delete Calendar Return TimeDelete a return time from a calendar.
Delete Calendar ServiceDelete an assigned service from a calendar in eTermin.
Delete ContactDelete a contact from your eTermin account by its contact ID.
Delete ResourceDelete an eTermin resource by type and ID.
Delete ServicePermanently deletes a service from your eTermin account by its ID.
Delete Service GroupDelete a service group from your eTermin account by its ID.
Delete UserDeletes an existing user from the eTermin account.
Delete UsermappingDelete a usermapping by its ID.
Delete VoucherPermanently deletes a voucher from eTermin by its voucher code.
Delete WebhookDelete an existing webhook by its unique identifier.
Delete Working TimesTool to delete working times from a calendar.
Delete Working Times DateTool to delete working times date entries from eTermin.
Get AbsencesTool to retrieve absences (non-working times) for a specific calendar.
Get Anchortime by DateTool to retrieve anchortimes by date.
Get AnchortimesTool to retrieve anchortime details.
Get Appointment SyncTool to synchronize appointments incrementally from eTermin.
Get Bookingpage LogsTool to retrieve bookingpage request logs from eTermin.
Get Calendar Return TimeTool to retrieve return times for a specific calendar.
Get CalendarsTool to retrieve calendars.
Get Calendar Service AssignmentsTool to retrieve calendar service assignments.
Get CompanyTool to retrieve company account details.
Get Contact By IDTool to retrieve a specific contact by ID, external ID, or email.
Get ContactsTool to retrieve a list of contacts.
Get Deleted AppointmentsTool to retrieve a list of deleted appointments from eTermin.
Get Message LogsTool to retrieve message logs from eTermin.
Get Customer RatingsTool to retrieve a list of customer ratings from eTermin.
Get Service By IDTool to retrieve a specific service from eTermin.
Get Service CalendarTool to retrieve calendars for a specific service ID.
Get Service GroupTool to retrieve service group details from eTermin.
Get ServicesTool to retrieve a list of services.
Get Survey ResultsTool to retrieve survey results from eTermin.
Get TimeslotsTool to retrieve available timeslots for a specific calendar on a given date.
Get UsermappingTool to retrieve usermapping information.
Get UsersTool to retrieve a list of users.
Get Working TimesTool to retrieve working times for a specific calendar.
Get Working Times DateTool to retrieve working times for a specific calendar on a specific date.
List AppointmentsTool to retrieve a filtered list of appointments from eTermin in a specified date range.
List VouchersRetrieve all vouchers (discount codes) from your eTermin account.
List WebhooksTool to retrieve webhooks.
Update Service via PUTTool to update a service in eTermin.
Update AbsenceTool to update an absence (non-working time) for a calendar in eTermin.
Update AnchortimeUpdate an existing anchortime in eTermin.
Update Anchortime By DateTool to update anchortimes by date in eTermin.
Update AppointmentTool to update an existing appointment in eTermin.
Update CalendarUpdate an existing calendar in eTermin.
Update Calendar Return TimeTool to update a return time for a calendar in eTermin.
Update ContactTool to update an existing contact in eTermin.
Update ResourceUpdate an existing eTermin resource (contact, service, calendar, user, or voucher).
Update ServiceTool to update an existing service.
Update Service GroupTool to update an existing service group in eTermin.
Update Synchronised AppointmentTool to update a synchronised appointment in eTermin.
Update UsermappingUpdate an existing usermapping in eTermin.
Update VoucherUpdates an existing voucher in eTermin.
Update WebhookUpdate an existing webhook configuration in eTermin.
Update Working TimesTool to update working times for a calendar in eTermin.
Update Working Times DateTool to update working times date for a calendar.

What is the Composio tool router, and how does it fit here?

What is Composio SDK?

Composio's Composio SDK helps agents find the right tools for a task at runtime. You can plug in multiple toolkits (like Gmail, HubSpot, and GitHub), and the agent will identify the relevant app and action to complete multi-step workflows. This can reduce token usage and improve the reliability of tool calls. Read more here: Getting started with Composio SDK

The tool router generates a secure MCP URL that your agents can access to perform actions.

How the Composio SDK works

The Composio SDK follows a three-phase workflow:

  1. Discovery: Searches for tools matching your task and returns relevant toolkits with their details.
  2. Authentication: Checks for active connections. If missing, creates an auth config and returns a connection URL via Auth Link.
  3. Execution: Executes the action using the authenticated connection.

Step-by-step Guide

Prerequisites

Before starting, make sure you have:
  • Composio API Key and OpenAI API Key
  • Primary know-how of OpenAI Agents SDK
  • A live Etermin project
  • Some knowledge of Python or Typescript

Getting API Keys for OpenAI and Composio

OpenAI API Key
  • Go to the OpenAI dashboard and create an API key. You'll need credits to use the models, or you can connect to another model provider.
  • Keep the API key safe.
Composio API Key

Install dependencies

pip install composio_openai_agents openai-agents python-dotenv

Install the Composio SDK and the OpenAI Agents SDK.

Set up environment variables

bash
OPENAI_API_KEY=sk-...your-api-key
COMPOSIO_API_KEY=your-api-key
USER_ID=composio_user@gmail.com

Create a .env file and add your OpenAI and Composio API keys.

Import dependencies

import asyncio
import os
from dotenv import load_dotenv

from composio import Composio
from composio_openai_agents import OpenAIAgentsProvider
from agents import Agent, Runner, HostedMCPTool, SQLiteSession
What's happening:
  • You're importing all necessary libraries.
  • The Composio and OpenAIAgentsProvider classes are imported to connect your OpenAI agent to Composio tools like Etermin.

Set up the Composio instance

load_dotenv()

api_key = os.getenv("COMPOSIO_API_KEY")
user_id = os.getenv("USER_ID")

if not api_key:
    raise RuntimeError("COMPOSIO_API_KEY is not set. Create a .env file with COMPOSIO_API_KEY=your_key")

# Initialize Composio
composio = Composio(api_key=api_key, provider=OpenAIAgentsProvider())
What's happening:
  • load_dotenv() loads your .env file so OPENAI_API_KEY and COMPOSIO_API_KEY are available as environment variables.
  • Creating a Composio instance using the API Key and OpenAIAgentsProvider class.

Create a Tool Router session

# Create a Etermin Tool Router session
session = composio.create(
    user_id=user_id,
    toolkits=["etermin"]
)

mcp_url = session.mcp.url

What is happening:

  • You give the Tool Router the user id and the toolkits you want available. Here, it is only etermin.
  • The router checks the user's Etermin connection and prepares the MCP endpoint.
  • The returned session.mcp.url is the MCP URL that your agent will use to access Etermin.
  • This approach keeps things lightweight and lets the agent request Etermin tools only when needed during the conversation.

Configure the agent

# Configure agent with MCP tool
agent = Agent(
    name="Assistant",
    model="gpt-5",
    instructions=(
        "You are a helpful assistant that can access Etermin. "
        "Help users perform Etermin operations through natural language."
    ),
    tools=[
        HostedMCPTool(
            tool_config={
                "type": "mcp",
                "server_label": "tool_router",
                "server_url": mcp_url,
                "headers": {"x-api-key": api_key},
                "require_approval": "never",
            }
        )
    ],
)
What's happening:
  • We're creating an Agent instance with a name, model (gpt-5), and clear instructions about its purpose.
  • The agent's instructions tell it that it can access Etermin and help with queries, inserts, updates, authentication, and fetching database information.
  • The tools array includes a HostedMCPTool that connects to the MCP server URL we created earlier.
  • The headers dict includes the Composio API key for secure authentication with the MCP server.
  • require_approval: 'never' means the agent can execute Etermin operations without asking for permission each time, making interactions smoother.

Start chat loop and handle conversation

print("\nComposio Tool Router session created.")

chat_session = SQLiteSession("conversation_openai_toolrouter")

print("\nChat started. Type your requests below.")
print("Commands: 'exit', 'quit', or 'q' to end\n")

async def main():
    try:
        result = await Runner.run(
            agent,
            "What can you help me with?",
            session=chat_session
        )
        print(f"Assistant: {result.final_output}\n")
    except Exception as e:
        print(f"Error: {e}\n")

    while True:
        user_input = input("You: ").strip()
        if user_input.lower() in {"exit", "quit", "q"}:
            print("Goodbye!")
            break

        result = await Runner.run(
            agent,
            user_input,
            session=chat_session
        )
        print(f"Assistant: {result.final_output}\n")

asyncio.run(main())
What's happening:
  • The program prints a session URL that you visit to authorize Etermin.
  • After authorization, the chat begins.
  • Each message you type is processed by the agent using Runner.run().
  • The responses are printed to the console, and conversations are saved locally using SQLite.
  • Typing exit, quit, or q cleanly ends the chat.

Complete Code

Here's the complete code to get you started with Etermin and OpenAI Agents SDK:

import asyncio
import os
from dotenv import load_dotenv

from composio import Composio
from composio_openai_agents import OpenAIAgentsProvider
from agents import Agent, Runner, HostedMCPTool, SQLiteSession

load_dotenv()

api_key = os.getenv("COMPOSIO_API_KEY")
user_id = os.getenv("USER_ID")

if not api_key:
    raise RuntimeError("COMPOSIO_API_KEY is not set. Create a .env file with COMPOSIO_API_KEY=your_key")

# Initialize Composio
composio = Composio(api_key=api_key, provider=OpenAIAgentsProvider())

# Create Tool Router session
session = composio.create(
    user_id=user_id,
    toolkits=["etermin"]
)
mcp_url = session.mcp.url

# Configure agent with MCP tool
agent = Agent(
    name="Assistant",
    model="gpt-5",
    instructions=(
        "You are a helpful assistant that can access Etermin. "
        "Help users perform Etermin operations through natural language."
    ),
    tools=[
        HostedMCPTool(
            tool_config={
                "type": "mcp",
                "server_label": "tool_router",
                "server_url": mcp_url,
                "headers": {"x-api-key": api_key},
                "require_approval": "never",
            }
        )
    ],
)

print("\nComposio Tool Router session created.")

chat_session = SQLiteSession("conversation_openai_toolrouter")

print("\nChat started. Type your requests below.")
print("Commands: 'exit', 'quit', or 'q' to end\n")

async def main():
    try:
        result = await Runner.run(
            agent,
            "What can you help me with?",
            session=chat_session
        )
        print(f"Assistant: {result.final_output}\n")
    except Exception as e:
        print(f"Error: {e}\n")

    while True:
        user_input = input("You: ").strip()
        if user_input.lower() in {"exit", "quit", "q"}:
            print("Goodbye!")
            break

        result = await Runner.run(
            agent,
            user_input,
            session=chat_session
        )
        print(f"Assistant: {result.final_output}\n")

asyncio.run(main())

Conclusion

This was a starter code for integrating Etermin MCP with OpenAI Agents SDK to build a functional AI agent that can interact with Etermin.

Key features:

  • Hosted MCP tool integration through Composio's Tool Router
  • SQLite session persistence for conversation history
  • Simple async chat loop for interactive testing
You can extend this by adding more toolkits, implementing custom business logic, or building a web interface around the agent.

How to build Etermin MCP Agent with another framework

FAQ

What are the differences in Tool Router MCP and Etermin MCP?

With a standalone Etermin MCP server, the agents and LLMs can only access a fixed set of Etermin tools tied to that server. However, with the Composio Tool Router, agents can dynamically load tools from Etermin and many other apps based on the task at hand, all through a single MCP endpoint.

Can I use Tool Router MCP with OpenAI Agents SDK?

Yes, you can. OpenAI Agents SDK fully supports MCP integration. You get structured tool calling, message history handling, and model orchestration while Tool Router takes care of discovering and serving the right Etermin tools.

Can I manage the permissions and scopes for Etermin while using Tool Router?

Yes, absolutely. You can configure which Etermin scopes and actions are allowed when connecting your account to Composio. You can also bring your own OAuth credentials or API configuration so you keep full control over what the agent can do.

How safe is my data with Composio Tool Router?

All sensitive data such as tokens, keys, and configuration is fully encrypted at rest and in transit. Composio is SOC 2 Type 2 compliant and follows strict security practices so your Etermin data and credentials are handled as safely as possible.

Used by agents from

Context
Letta
glean
HubSpot
Agent.ai
Altera
DataStax
Entelligence
Rolai
Context
Letta
glean
HubSpot
Agent.ai
Altera
DataStax
Entelligence
Rolai
Context
Letta
glean
HubSpot
Agent.ai
Altera
DataStax
Entelligence
Rolai

Never worry about agent reliability

We handle tool reliability, observability, and security so you never have to second-guess an agent action.