Skip to content

[Feature Request] Add ZohoMeetingTools — Toolkit for Zoho Meeting API Integration #7772

@chamanswami555

Description

@chamanswami555

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?

  • Yes, I’d love to work on it!
  • I’m open to collaborating but need guidance.
  • No, I’m just sharing the idea.

Metadata

Metadata

Assignees

No one assigned

    Labels

    enhancementNew feature or request

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions