Problem Description
Agno currently has no built-in toolkit for Zoho Meeting, leaving users who rely on it for enterprise scheduling unable to integrate meeting management into their agents without writing custom API wrappers from scratch.
Agents built for productivity, scheduling, or virtual-assistant use cases need to create, update, list, and cancel meetings as native tool calls, just like any other action in the agent loop. Without a ZohoMeetingTools toolkit, developers must manually handle OAuth 2.0 token exchange, raw HTTP requests to https://meeting.zoho.com/api/v2, and response parsing outside of Agno's tool abstraction, which breaks the consistency of the toolkit ecosystem and adds significant boilerplate.
Zoho Meeting is widely adopted in enterprise and SMB environments, and a first-class integration would unlock scheduling agent workflows (standup bots, interview schedulers, calendar assistants) without workarounds.
Proposed Solution
Add a new ZohoMeetingTools toolkit at agno/tools/zoho_meeting.py that wraps the Zoho Meeting REST API and exposes meeting management as native Agno tool calls.
Authentication
Zoho Meeting APIs use OAuth 2.0 via the Zoho Accounts server at https://accounts.zoho.com/oauth/v2.
The toolkit targets the refresh token flow: the recommended production pattern where a long-lived refresh token is stored once and used to generate short-lived access tokens on demand (expires in 3600 seconds / 1 hour).
Credentials should be configurable via constructor parameters or environment variables:
| Constructor Param |
Environment Variable |
Description |
client_id |
ZOHO_CLIENT_ID |
OAuth app Client ID |
client_secret |
ZOHO_CLIENT_SECRET |
OAuth app Client Secret |
refresh_token |
ZOHO_REFRESH_TOKEN |
Long-lived refresh token |
redirect_uri |
ZOHO_REDIRECT_URI |
Redirect URI used during app registration |
zsoid |
ZOHO_ORG_ID |
Zoho Organization ID (scopes all API endpoints) |
The toolkit regenerates the access token automatically using:
- URL:
https://accounts.zoho.com/oauth/v2/token
- Method:
POST
- grant_type:
refresh_token
- Header per request:
Authorization: Zoho-oauthtoken {access_token}
Note per Zoho docs: Access tokens expire in 3600 seconds. The toolkit must cache the token and only refresh when expired. Refresh tokens are capped at 20 per app; the toolkit must never trigger the authorization grant step at runtime.
Required OAuth Scopes:
ZohoMeeting.meeting.CREATE,ZohoMeeting.meeting.READ,ZohoMeeting.meeting.UPDATE,ZohoMeeting.meeting.DELETE
Proposed Toolkit Functions
Base URL: https://meeting.zoho.com/api/v2
Path convention: All endpoints are scoped under /{zsoid}/ where zsoid is the Zoho Organization ID.
Resource key: Zoho Meeting uses sessions as the resource name and meetingKey (a long) as the identifier.
Request body: All POST/PUT payloads must be wrapped under a "session" key and sent as JSONString='{...}'.
| Function |
OAuth Scope |
Method |
Endpoint |
Description |
create_meeting() |
ZohoMeeting.meeting.CREATE |
POST |
/{zsoid}/sessions.json |
Schedule a new meeting session |
get_meeting() |
ZohoMeeting.meeting.READ |
GET |
/{zsoid}/sessions/{meetingKey}.json |
Fetch details of a meeting by meetingKey |
list_meetings() |
ZohoMeeting.meeting.READ |
GET |
/{zsoid}/sessions.json |
List all meetings in the account |
update_meeting() |
ZohoMeeting.meeting.UPDATE |
PUT |
/{zsoid}/sessions/{meetingKey}.json |
Edit topic, agenda, time, or participants |
delete_meeting() |
ZohoMeeting.meeting.DELETE |
DELETE |
/{zsoid}/sessions/{meetingKey}.json |
Delete a meeting — returns 204 No Content |
get_participant_report() |
ZohoMeeting.meeting.READ |
GET |
/{zsoid}/participant/{meetingKey}.json |
Get participant attendance report for a past meeting |
Example Usage
from agno.agent import Agent
from agno.tools.zoho_meeting import ZohoMeetingTools
agent = Agent(
name="Meeting Scheduler",
tools=[
ZohoMeetingTools(
client_id="YOUR_CLIENT_ID",
client_secret="YOUR_CLIENT_SECRET",
refresh_token="YOUR_REFRESH_TOKEN",
redirect_uri="https://app.example.com/oauth",
zsoid="YOUR_ORG_ID",
)
],
)
agent.print_response("Schedule a 30-minute standup tomorrow at 10am", markdown=True)
agent.print_response("List all my upcoming meetings", markdown=True)
agent.print_response("Cancel the meeting with key 123456789", markdown=True)
Or using environment variables:
export ZOHO_CLIENT_ID="YOUR_CLIENT_ID"
export ZOHO_CLIENT_SECRET="YOUR_CLIENT_SECRET"
export ZOHO_REFRESH_TOKEN="YOUR_REFRESH_TOKEN"
export ZOHO_REDIRECT_URI="https://app.example.com/oauth"
export ZOHO_ORG_ID="YOUR_ORG_ID"
agent = Agent(
name="Meeting Scheduler",
tools=[ZohoMeetingTools()], # reads credentials from env automatically
)
Implementation Notes
- Base URL:
https://meeting.zoho.com/api/v2
- Token URL:
https://accounts.zoho.com/oauth/v2/token
- All responses are JSON — map them to clean Python dicts before returning to the agent
- The identifier for a meeting is
meetingKey (a long), not meeting_id
- All
POST/PUT request bodies must wrap the payload under a "session" key
- Cache the access token; refresh only when
expires_in_sec: 3600 has elapsed
- Follow the same patterns used in existing toolkits (e.g.,
GoogleCalendarTools, ZoomTools) for consistency
- Include
include_tools / exclude_tools support so users can expose only the functions they need
- Add a
cookbook/ example demonstrating a scheduling agent using ZohoMeetingTools
References
Alternatives Considered
Manual HTTP Wrapper (Current Workaround)
The most straightforward workaround is writing a custom function tool that directly calls the Zoho Meeting API using httpx or requests, manually managing OAuth token refresh and response parsing.
import httpx
from agno.agent import Agent
from agno.tools import tool
@tool
def create_meeting(topic: str, start_time: str, duration: int) -> str:
token = get_zoho_access_token() # manual OAuth logic
response = httpx.post(
"https://meeting.zoho.com/api/v2/meetings",
headers={"Authorization": f"Zoho-oauthtoken {token}"},
json={"topic": topic, "start_time": start_time, "duration": duration},
)
return response.json()
Drawback: Requires every developer to re-implement auth, error handling, and response normalization from scratch. Not reusable, not maintainable, and not consistent with Agno's toolkit pattern.
Additional Context
Similar Existing Toolkits in Agno
Agno already supports several communication and scheduling integrations that follow the same pattern proposed here. ZohoMeetingTools would be a natural addition alongside:
| Toolkit |
File |
Category |
ZoomTool |
agno/tools/zoom.py |
Video Meetings |
GoogleCalendarTools |
agno/tools/google_calendar.py |
Scheduling |
SlackTools |
agno/tools/slack.py |
Communication |
GmailTools |
agno/tools/gmail.py |
Communication |
ZohoMeetingTools fits directly into this category and should follow the same auth and response patterns used in these toolkits.
Zoho Meeting API Overview
Zoho's Enterprise Reach
Zoho Meeting is part of the broader Zoho One suite used by 100M+ users across 150+ countries. Many enterprise teams that use Zoho CRM, Zoho Desk, or Zoho Cliq also rely on Zoho Meeting — making this integration valuable for agents operating in Zoho-heavy environments.
Real-World Agent Use Cases
- Standup Bot — Agent that schedules and sends daily standup invites to a team
- Interview Scheduler — HR agent that books candidate interviews based on calendar availability
- Sales Meeting Agent — Agent that creates Zoho Meeting links after a CRM deal reaches a certain stage
- Support Escalation Agent — Customer support agent that spins up a live meeting when a ticket is escalated
Relevant Links
Would you like to work on this?
Problem Description
Agno currently has no built-in toolkit for Zoho Meeting, leaving users who rely on it for enterprise scheduling unable to integrate meeting management into their agents without writing custom API wrappers from scratch.
Agents built for productivity, scheduling, or virtual-assistant use cases need to create, update, list, and cancel meetings as native tool calls, just like any other action in the agent loop. Without a
ZohoMeetingToolstoolkit, developers must manually handle OAuth 2.0 token exchange, raw HTTP requests tohttps://meeting.zoho.com/api/v2, and response parsing outside of Agno's tool abstraction, which breaks the consistency of the toolkit ecosystem and adds significant boilerplate.Zoho Meeting is widely adopted in enterprise and SMB environments, and a first-class integration would unlock scheduling agent workflows (standup bots, interview schedulers, calendar assistants) without workarounds.
Proposed Solution
Add a new
ZohoMeetingToolstoolkit atagno/tools/zoho_meeting.pythat wraps the Zoho Meeting REST API and exposes meeting management as native Agno tool calls.Authentication
Zoho Meeting APIs use OAuth 2.0 via the Zoho Accounts server at
https://accounts.zoho.com/oauth/v2.The toolkit targets the refresh token flow: the recommended production pattern where a long-lived refresh token is stored once and used to generate short-lived access tokens on demand (expires in
3600seconds / 1 hour).Credentials should be configurable via constructor parameters or environment variables:
client_idZOHO_CLIENT_IDclient_secretZOHO_CLIENT_SECRETrefresh_tokenZOHO_REFRESH_TOKENredirect_uriZOHO_REDIRECT_URIzsoidZOHO_ORG_IDThe toolkit regenerates the access token automatically using:
https://accounts.zoho.com/oauth/v2/tokenPOSTrefresh_tokenAuthorization: Zoho-oauthtoken {access_token}Required OAuth Scopes:
Proposed Toolkit Functions
create_meeting()ZohoMeeting.meeting.CREATEPOST/{zsoid}/sessions.jsonget_meeting()ZohoMeeting.meeting.READGET/{zsoid}/sessions/{meetingKey}.jsonmeetingKeylist_meetings()ZohoMeeting.meeting.READGET/{zsoid}/sessions.jsonupdate_meeting()ZohoMeeting.meeting.UPDATEPUT/{zsoid}/sessions/{meetingKey}.jsondelete_meeting()ZohoMeeting.meeting.DELETEDELETE/{zsoid}/sessions/{meetingKey}.json204 No Contentget_participant_report()ZohoMeeting.meeting.READGET/{zsoid}/participant/{meetingKey}.jsonExample Usage
Or using environment variables:
Implementation Notes
https://meeting.zoho.com/api/v2https://accounts.zoho.com/oauth/v2/tokenmeetingKey(along), notmeeting_idPOST/PUTrequest bodies must wrap the payload under a"session"keyexpires_in_sec: 3600has elapsedGoogleCalendarTools,ZoomTools) for consistencyinclude_tools/exclude_toolssupport so users can expose only the functions they needcookbook/example demonstrating a scheduling agent usingZohoMeetingToolsReferences
https://meeting.zoho.com/api/v2Alternatives Considered
Manual HTTP Wrapper (Current Workaround)
The most straightforward workaround is writing a custom function tool that directly calls the Zoho Meeting API using
httpxorrequests, manually managing OAuth token refresh and response parsing.Drawback: Requires every developer to re-implement auth, error handling, and response normalization from scratch. Not reusable, not maintainable, and not consistent with Agno's toolkit pattern.
Additional Context
Similar Existing Toolkits in Agno
Agno already supports several communication and scheduling integrations that follow the same pattern proposed here.
ZohoMeetingToolswould be a natural addition alongside:ZoomToolagno/tools/zoom.pyGoogleCalendarToolsagno/tools/google_calendar.pySlackToolsagno/tools/slack.pyGmailToolsagno/tools/gmail.pyZohoMeetingToolsfits directly into this category and should follow the same auth and response patterns used in these toolkits.Zoho Meeting API Overview
https://meeting.zoho.com/api/v2Zoho's Enterprise Reach
Zoho Meeting is part of the broader Zoho One suite used by 100M+ users across 150+ countries. Many enterprise teams that use Zoho CRM, Zoho Desk, or Zoho Cliq also rely on Zoho Meeting — making this integration valuable for agents operating in Zoho-heavy environments.
Real-World Agent Use Cases
Relevant Links
Would you like to work on this?