arcade-mcp/toolkits/hubspot/arcade_hubspot/tools/crm/contacts.py

89 lines
2.9 KiB
Python

from typing import Annotated, Any, Optional
from arcade.sdk import ToolContext, tool
from arcade.sdk.auth import Hubspot
from arcade_hubspot.enums import HubspotObject
from arcade_hubspot.models import HubspotCrmClient
from arcade_hubspot.utils import clean_data
@tool(
requires_auth=Hubspot(
scopes=[
"oauth",
"crm.objects.contacts.read",
],
),
)
async def get_contact_data_by_keywords(
context: ToolContext,
keywords: Annotated[
str,
"The keywords to search for contacts. It will match against the contact's "
"first and last name, email addresses, phone numbers, and company name.",
],
limit: Annotated[
int, "The maximum number of contacts to return. Defaults to 10. Max is 100."
] = 10,
next_page_token: Annotated[
Optional[str],
"The token to get the next page of results. "
"Defaults to None (returns first page of results)",
] = None,
) -> Annotated[
dict[str, Any],
"Retrieve contact data with associated companies, deals, calls, "
"emails, meetings, notes, and tasks.",
]:
"""
Retrieve contact data with associated companies, deals, calls, emails,
meetings, notes, and tasks.
"""
limit = min(limit, 100)
client = HubspotCrmClient(context.get_auth_token_or_empty())
return await client.search_by_keywords(
object_type=HubspotObject.CONTACT,
keywords=keywords,
limit=limit,
next_page_token=next_page_token,
associations=[
HubspotObject.CALL,
HubspotObject.COMPANY,
HubspotObject.DEAL,
HubspotObject.EMAIL,
HubspotObject.MEETING,
HubspotObject.NOTE,
HubspotObject.TASK,
],
)
@tool(
requires_auth=Hubspot(
scopes=["oauth", "crm.objects.contacts.write"],
),
)
async def create_contact(
context: ToolContext,
company_id: Annotated[str, "The ID of the company to create the contact for."],
first_name: Annotated[str, "The first name of the contact."],
last_name: Annotated[Optional[str], "The last name of the contact."] = None,
email: Annotated[Optional[str], "The email address of the contact."] = None,
phone: Annotated[Optional[str], "The phone number of the contact."] = None,
mobile_phone: Annotated[Optional[str], "The mobile phone number of the contact."] = None,
job_title: Annotated[Optional[str], "The job title of the contact."] = None,
) -> Annotated[dict, "Create a contact associated with a company."]:
"""Create a contact associated with a company."""
client = HubspotCrmClient(context.get_auth_token_or_empty())
response = await client.create_contact(
company_id=company_id,
first_name=first_name,
last_name=last_name,
email=email,
phone=phone,
mobile_phone=mobile_phone,
job_title=job_title,
)
return clean_data(response, HubspotObject.CONTACT)