Skip to Content

MCP tool catalog

Every tool works in the tenant of your sign-in. No tool takes a tenant as a parameter. Besides the permission listed for the tool, you need the tenant:mcp:invoke permission, which the owner, admin and member roles have (see Authentication).

A parameter ending in ? is optional.


Tenants

ToolPermissionDescription
create_tenant(name, slug?, billing_provider?, org_name?)(authenticated)Create a new tenant; you become its owner. Leave billing_provider unset: a self-service tenant is billed through Stripe. org_name names the organisation this call creates (defaults to name); it is ignored if you already belong to an organisation. No free credit is applied; see Metering.
list_my_tenants()(authenticated)The tenants you are a member of, with your role and when you last used each.
get_tenant()tenant:settings:readThe current tenant: name, slug, tier, status and features.
update_tenant(name?, slug?, timezone?)tenant:settings:writeChange the name, slug or time zone (an IANA name such as Europe/Zurich). The old slug is released when the new one is reserved. The time zone decides the tenant’s current week, month, quarter and year.
soft_delete_tenant(confirm)tenant:deleteDelete the tenant, with a 30-day grace period in which restore_tenant() undoes it. Only the owner can do this.
restore_tenant()tenant:deleteRestore a deleted tenant within its 30-day grace period. Refused once a purge was requested or has started, or after the grace period.
transfer_owner(new_owner_sub)tenant:transfer:ownerMake another active member the owner; you become an admin.
check_tenant_name(name)(authenticated)Check whether a tenant name and slug are available.
list_tenant_features()tenant:settings:readWhich features are on or off, and which features each one requires. Every feature of a new tenant starts off.
set_tenant_feature(feature, enabled)tenant:features:writeTurn a feature on or off. Turning it off keeps its data. Refused with FEATURE_DEPENDENCY when a required feature is off, or when another feature that is on still needs this one.
resume_tenant_checkout(target_tenant_id)(authenticated)Start a new Stripe Checkout for your tenant that is waiting for payment, or confirm it is already active.
abandon_pending_tenants()(authenticated)Remove all your tenants that are still waiting for payment, which frees their places in your tenant limit.
get_tenant_logs(source, limit?, next_token?)tenant:settings:readRecent log lines of your apn or hubspot integration: time, level and message. limit defaults to 50, at most 200.
get_sync_schedules()tenant:integrations:apn:readThe daily APN and HubSpot sync times, and whether the HubSpot sync applies (HubSpot connected and AI agent or Goals on).
update_sync_schedule(schedule_type, hour, minute?, timezone?)tenant:integrations:apn:configureChange the time of the apn_sync or hubspot_sync schedule. Whether it runs follows the matching feature.

Members and invites

ToolPermissionDescription
list_members()tenant:members:readAll active members with their roles and when they were last seen.
change_member_role(sub, new_role)tenant:members:role:writeChange a member’s role. Never to or from owner.
remove_member(sub)tenant:members:removeRemove a member. The owner cannot be removed. The member’s API keys are revoked.
create_invite(email, role)tenant:members:inviteSend an invitation email. Limits: 50 pending invites per tenant, 10 per hour, 5 to the same address in 7 days. A role with a permission you do not hold is refused.
list_invites()tenant:members:inviteAll pending invitations.
revoke_invite(sub)tenant:members:inviteCancel a pending invitation.
resend_invite(sub)tenant:members:inviteSend a pending invitation email again.
import_invites(rows, dry_run?, idempotency_key?)tenant:members:inviteInvite up to 50 people at once. Each row is {email, role, first_name?, last_name?}. dry_run=true shows each row’s status and changes nothing. Otherwise it starts a background job and returns {job_id, status}. Each row obeys the pending and per-address limits of create_invite (not the 10/hour limit); imports have their own budget: one at a time, 5 per tenant per day. A failed row does not stop the others. Reuse idempotency_key on a retry: you get the same job_id and nobody is invited twice. See Importing users.
get_invite_import_job(job_id)tenant:members:inviteStatus of an import job: pending, running (with processed so far), complete or failed, and each row’s result.

Your account

ToolPermissionDescription
get_my_profile()(authenticated)Your user ID, email and platform role, plus the tenant this connection works in and your role there.
update_my_profile(name?, picture?)(authenticated)Change your display name or profile picture URL.
delete_my_account(confirm)(authenticated)Delete your account (GDPR). Refused while you own a tenant that is not purged yet (also a suspended, unpaid or deleted one).
select_active_tenant(target_tenant_id)(authenticated)Not supported over MCP. Always returns {"error": "NOT_SUPPORTED", ...}. Switch tenants in the FlowState web app.
get_my_mcp_default_tenant()(authenticated)Your default workspace for Claude: the tenant your connector uses when you belong to more than one, whether it is still valid, and the tenants you can choose.
set_my_mcp_default_tenant(target_tenant_id)(authenticated)Choose your default workspace for Claude, or clear it with null. Only a tenant you are an active member of. It applies from the connector’s next access token. See Which tenant Claude works in.
export_my_data()(authenticated)Start a GDPR export of your data. When it is ready you get the account.gdpr_export_ready email, which links to Account → Data export.
list_my_exports()(authenticated)Your 10 most recent export jobs, newest first, with their status. Call get_my_export_status(job_id) for a download link.
get_my_export_status(job_id)(authenticated)Status of an export job. When ready, each call returns a new download link, valid for 60 seconds, for flowstate-export-<job_id>.json. A job still pending after 10 minutes is returned as failed with EXPORT_STALE. A ready job carries expires_at, when its file is deleted (7 days after the request by default); after that it is expired, with no link.

Usage limits (grants)

A grant sets MCP usage limits for one member. It can only restrict, never add permissions.

ToolPermissionDescription
list_grants()tenant:grants:readEvery member’s grant in the tenant.
get_grant(sub)tenant:grants:read (your own grant without it)One member’s grant.
set_grant(sub, allowed_features?, allowed_regions?, monthly_budget_usd?, monthly_token_cap?, rate_limit_rpm?, description?)tenant:grants:writeCreate or replace a member’s grant.
revoke_grant(sub)tenant:grants:writeRemove a member’s grant; the role defaults apply again.

API keys

See API Reference → Create an API key.

ToolPermissionDescription
create_api_key(name, scopes, expires_in_days?)tenant:keys:writeCreate an API key. The key is returned once; FlowState stores only a hash.
list_api_keys()tenant:keys:read:selfAPI keys with prefix, scopes, status and expiry. Only your own keys, or every key in the tenant if you also hold tenant:keys:read.
revoke_api_key(prefix)tenant:keys:writeRevoke a key at once. Your own keys, or any key if you also hold tenant:keys:read.
rotate_api_key(prefix)tenant:keys:writeIssue a new key; the old one keeps working for 7 days.

Billing

ToolPermissionDescription
get_billing_summary()tenant:billing:readSubscription status, usage this billing period and the next invoice estimate.
list_invoices(limit?)tenant:billing:readRecent invoices with amounts and download links.
open_billing_checkout(provider?)tenant:billing:writeStart a Stripe Checkout session.
open_billing_portal()tenant:billing:writeOpen a Stripe billing portal session.
get_usage_breakdown(period?)tenant:billing:readUsage by billing dimension for a period (default: the current month). See Metering.

A subscription belongs to the organisation, so cancelling is an organisation action: see cancel_org_subscription under Organisation.


Organisation

These tools are for org admins and act only on your own organisation. Where a tool takes org_id, it must be your organisation’s id; any other id is refused.

ToolPermissionDescription
get_my_org()org:tenants:readEvery tenant in your organisation, whatever its status.
rename_org(org_id, name)org:admins:writeRename the organisation.
get_org_admins(org_id)org:admins:writeThe organisation’s admins.
get_org_members(org_id)org:admins:writeEvery member of the organisation, and whether each is an org admin.
get_org_tenant_matrix(org_id, limit?, cursor?)org:tenants:readMembers × tenants, with each member’s role in each tenant. Members are paginated.
grant_org_admin(email)org:admins:writeMake an active member of one of your tenants a co-admin, by email.
revoke_org_admin(sub)org:admins:writeRemove an org admin. Refused if the organisation would have no admin left.
remove_org_member(sub)org:admins:writeRemove a member from the organisation. Refused while they are still assigned to one of its tenants, or for the last member or admin.
create_org_invite(email, grant_org_admin?)org:invites:writeInvite someone into the organisation, optionally as an org admin. It gives no tenant access.
create_org_tenant(name, slug?)org:tenants:writeCreate a tenant in the organisation, with you as owner.
delete_org_tenant(target_tenant_id, confirm)org:tenants:writeDelete a tenant of the organisation (30-day grace period). Refused for the last tenant.
restore_org_tenant(target_tenant_id)org:tenants:writeRestore a deleted tenant of the organisation within its grace period.
assign_org_tenant_member(target_tenant_id, sub, role)org:tenants:members:writeGive an organisation member a role (admin, member or viewer) in one of its tenants.
unassign_org_tenant_member(target_tenant_id, sub)org:tenants:members:writeRemove a member from one of the organisation’s tenants. An active owner cannot be removed.
get_org_billing(org_id, month?)org:billing:readThe organisation’s billing for one month, with the totals it is charged.
set_org_billing_profile(org_id, legal_entity_name?, billing_address?, invoice_contact?, vat_number?, vat_rate_pct?)org:billing:writeSet the billing details. A field you leave out is unchanged.
open_org_billing_checkout(org_id)org:billing:writeStart the organisation’s Stripe subscription, which covers all its tenants.
open_org_billing_portal(org_id)org:billing:writeOpen the Stripe billing portal for the organisation.
cancel_org_subscription(org_id)org:billing:writeCancel the organisation’s Stripe subscription at the end of the current period.

Invites to an organisation, for the invited person:

ToolPermissionDescription
list_my_org_invites()(authenticated)Your pending organisation invites.
accept_org_invite(org_id)(authenticated)Accept an organisation invite.
decline_org_invite(org_id)(authenticated)Decline an organisation invite.

Notifications

ToolPermissionDescription
get_my_notification_preferences()(authenticated)Your global preferences (enabled_categories, bounce_state, unsubscribe_token) and your overrides for the current tenant.
update_my_notification_preferences(categories: {category: bool}, scope: "global" or "tenant")(authenticated)Turn notification categories on or off. Always-on categories are ignored.
list_notification_categories()(authenticated)Every notification category with its description, default and always-on flag.
send_test_notification(category)tenant:notifications:write:selfSend yourself a test email for a category.
disable_notification_category(category, scope: "global" or "tenant")(authenticated)Turn one category off.
unsubscribe_all(scope)(authenticated)Turn off every category that is not always-on.
list_notification_subscribers(category?)tenant:notifications:readWhich members of the tenant receive each category.
list_notification_log(before?, category?, limit?)tenant:notifications:audit:readThe tenant’s notification send log, newest first.
re_verify_my_email()(authenticated)After a hard bounce, send a check email to turn email delivery back on. Does nothing otherwise, and never re-sends to an address that reported spam.

Audit

ToolPermissionDescription
list_audit_events(before?, type?, actor?, limit?)tenant:notifications:audit:readThe tenant’s audit log, newest first.
get_audit_event(event_id)tenant:notifications:audit:readOne audit event with its full details.
export_audit_log(start, end, format: "csv" or "json")tenant:notifications:audit:readStart an export of the audit log.
get_audit_export_status(job_id)tenant:notifications:audit:readStatus of an audit export, with a download link when it is complete.

HubSpot

ToolPermissionDescription
get_hubspot_status()tenant:integrations:hubspot:readConnection state, granted scopes, HubSpot account id and domain, and the APN deal properties FlowState manages. missing_scopes, reconnect_required and scopes_unknown compare the granted scopes with the ones FlowState needs now.
start_hubspot_oauth()tenant:integrations:hubspot:connectThe HubSpot authorization URL to open in a browser.
complete_hubspot_oauth(code, state)tenant:integrations:hubspot:connectFinish connecting HubSpot and start the first sync. first_sync_notification is true when you will get the hubspot.initial_sync_finished notification.
test_hubspot()tenant:integrations:hubspot:readCheck that the stored HubSpot connection works.
verify_hubspot_connection()tenant:integrations:hubspot:readFetch your most recent open HubSpot deal, with its stage, as a connection check.
refresh_hubspot_oauth()tenant:integrations:hubspot:connectRenew the HubSpot access token now.
disconnect_hubspot(confirm)tenant:integrations:hubspot:disconnectDelete the stored HubSpot connection.
provision_hubspot_properties()tenant:integrations:hubspot:connectCreate the flowstate_apn property group and the APN deal properties. Safe to run again.
list_hubspot_custom_properties()tenant:integrations:hubspot:readCheck that every APN deal property exists in your HubSpot account.
apn_deprovision_hubspot_properties()tenant:integrations:apn:configureDelete all APN deal properties from your HubSpot account. Cannot be undone.

Slack

ToolPermissionDescription
get_slack_status()tenant:integrations:slack:readWorkspace name and connection status.
get_slack_oauth_app()tenant:integrations:slack:readYour Slack app’s settings. The client secret is never returned.
set_slack_oauth_app(client_id, client_secret, redirect_url?)tenant:integrations:slack:writeStore your own Slack app’s credentials. See Slack → Getting started.
delete_slack_oauth_app()tenant:integrations:slack:writeRemove your Slack app’s credentials.
start_slack_oauth()tenant:integrations:slack:writeThe Slack authorization URL for your Slack app.
complete_slack_oauth(code, state)tenant:integrations:slack:writeFinish connecting Slack.
test_slack()tenant:integrations:slack:writeSend yourself a test direct message in Slack.
list_slack_channels()tenant:integrations:slack:writeChannels the FlowState app can post to.
get_slack_notification_routing()tenant:integrations:slack:readWhere each alert type (deals.outdated, deals.weekly_digest) goes: people, a channel, or off.
set_slack_notification_routing(rules)tenant:integrations:slack:writeSet where each alert type goes. Only deals.outdated and deals.weekly_digest send messages. See Slack → Notifications.
disconnect_slack()tenant:integrations:slack:writeDelete the Slack connection.

APN: connection

ToolPermissionDescription
get_apn_onboarding_artifacts()tenant:integrations:apn:configureWhat the connection wizard shows: your ExternalId and the connector templates.
enable_apn_integration(role_arn, catalog: "Sandbox" or "AWS")tenant:integrations:apn:configureConnect APN with your IAM role. FlowState checks the role and the catalog lock first.
test_apn_connection()tenant:integrations:apn:readCheck the role, a Partner Central read, and the catalog lock.
update_apn_integration_settings(marketplace_solution_id?, apn_revenue_mode?, apn_revenue_divider?)tenant:integrations:apn:configureSet the Partner Solution and how the HubSpot amount maps to APN revenue.
disable_apn_integration()tenant:integrations:apn:configureTurn APN sync off. Sync records are kept.
rotate_apn_external_id()tenant:integrations:apn:configureIssue a new ExternalId. Update your role’s trust policy afterwards.
list_apn_solutions()tenant:integrations:apn:readYour AWS Partner Central solutions.
get_apn_integration_status()tenant:integrations:apn:readConnection status, catalog, sync counts and revenue mode. paused is true while APN sync waits for HubSpot to be reconnected.

APN: sync

ToolPermissionDescription
list_apn_sync_state(state?, limit?, cursor?)tenant:integrations:apn:readEvery deal’s APN sync state. The filter and paging parameters have no effect: all deals are returned.
list_apn_conflicts()tenant:integrations:apn:readDeals with a sync conflict, with the conflicting values.
resolve_apn_conflict_batch(deal_id, resolutions: dict)tenant:integrations:apn:configureResolve a deal’s conflicts by choosing "hubspot" or "apn" per field.
trigger_apn_sync(deal_id?)tenant:integrations:apn:configureWith deal_id, sync that deal and request its submission, so it is created and submitted once AWS’s requirements are met. Without it, sync every eligible deal; nothing new is submitted.
trigger_apn_reconcile()tenant:integrations:apn:configureRe-check every linked opportunity in the background. One at a time per tenant.
trigger_apn_inbound_sync(opp_id?)tenant:integrations:apn:configurePull AWS lifecycle fields into HubSpot in the background, for all linked opportunities or one.
delete_apn_sync_state(deal_id)tenant:integrations:apn:configureUnlink a deal from APN sync. For troubleshooting; cannot be undone.

APN: stage mapping

ToolPermissionDescription
get_apn_stage_mapping()tenant:integrations:apn:readYour HubSpot pipelines with their APN stage mapping, and the seven APN stages.
set_apn_stage_mapping(pipelines: dict)tenant:integrations:apn:configureSave pipeline_id → {hubspot_stage_id: apn_stage}. Values outside the seven stages are refused.
clear_apn_stage_mapping(pipeline_id)tenant:integrations:apn:configureClear one pipeline’s mapping, for example after the pipeline was deleted in HubSpot.

APN: matching existing opportunities

ToolPermissionDescription
start_apn_match_session()tenant:integrations:apn:configureCompare your open APN opportunities with unlinked HubSpot deals and suggest matches with a confidence score, for you to confirm.
list_apn_match_sessions()tenant:apn:readRecent match sessions, newest first.
get_apn_match_session(session_id)tenant:apn:readOne session with its suggested matches and the unmatched items on each side.
confirm_apn_matches(session_id, candidate_ids)tenant:integrations:apn:configureConfirm suggested matches. Links each deal to its opportunity and turns on its APN sync.
manual_pair_apn_match(session_id, apn_opportunity_id, hubspot_deal_id)tenant:integrations:apn:configurePair an unmatched opportunity with an unmatched deal yourself.
create_apn_deal(session_id, apn_opportunity_id, amount?)tenant:integrations:apn:configureCreate a HubSpot deal from an unmatched opportunity and link them.

APN: business-problem templates

ToolPermissionDescription
list_apn_templates(include_archived?)tenant:integrations:apn:readYour business-problem templates. A new tenant has none.
create_apn_template(name, skeleton, guidance, mode?)tenant:integrations:apn:configureCreate a template. mode is default or default_and_submit (submit automatically when ready, while it is the default template).
update_apn_template(template_id, fields)tenant:integrations:apn:configureChange a template’s name, skeleton, guidance or mode.
archive_apn_template(template_id)tenant:integrations:apn:configureArchive a template. Deals that used it keep their reference.
set_apn_template_default(template_id)tenant:integrations:apn:configureMake a template the default.
clear_apn_template_default(template_id)tenant:integrations:apn:configureStop a template being the default.
add_apn_template_examples()tenant:integrations:apn:configureCopy the example templates into your tenant. Each call adds another copy.

APN: business problem for a deal

ToolPermissionDescription
generate_apn_business_problem(deal_id, template_id, facts?, instruction?)tenant:integrations:apn:configureDraft a business problem for a deal from a template. Returns a job to poll.
get_apn_business_problem_job(deal_id, job_id)tenant:integrations:apn:readStatus of a draft job: pending, completed or failed.
get_apn_business_problem(deal_id)tenant:integrations:apn:readThe deal’s current business problem and any new draft side by side, with scores, gaps, history and the recommended template.
keep_apn_business_problem(deal_id)tenant:integrations:apn:configureAccept the new draft: it replaces the current text in HubSpot, and the old text goes into history.
discard_apn_business_problem(deal_id)tenant:integrations:apn:configureDrop the new draft.
restore_apn_business_problem(deal_id, index)tenant:integrations:apn:configureBring back an entry from history. The current text goes into history.
approve_apn_business_problem(deal_id)tenant:integrations:apn:configureApprove the business problem. A generated draft must be approved before the deal can be submitted.

APN: default-fields templates

ToolPermissionDescription
list_apn_field_templates(include_archived?)tenant:integrations:apn:readYour default-fields templates. A new tenant has none.
get_apn_field_template_options()tenant:integrations:apn:readThe fields a template can set, with the values AWS accepts for each.
create_apn_field_template(name, field_values, mode?)tenant:integrations:apn:configureCreate a template from default values for the card’s APN fields. Values AWS does not accept are refused.
update_apn_field_template(template_id, fields)tenant:integrations:apn:configureChange a template’s name, values or mode.
archive_apn_field_template(template_id)tenant:integrations:apn:configureArchive a template. If it was the default, there is no default afterwards.
set_apn_field_template_default(template_id)tenant:integrations:apn:configureMake a template the default.
clear_apn_field_template_default(template_id)tenant:integrations:apn:configureStop a template being the default.

Marketplace: connection and access

ToolPermissionDescription
get_marketplace_onboarding_artifacts()tenant:marketplace:offers:readWhat the connection wizard shows: your ExternalId, the principal ARNs and the connector templates.
connect_marketplace_connector(role_arn)tenant:marketplace:offers:writeConnect AWS Marketplace with your IAM role.
get_marketplace_connector_status()tenant:marketplace:offers:readConnection status.
disconnect_marketplace_connector()tenant:marketplace:offers:writeDisconnect AWS Marketplace.
list_seen_hubspot_users()tenant:members:readHubSpot users who have used the FlowState card, to choose from for set_hubspot_user_role.
list_hubspot_user_roles()tenant:members:readHubSpot users with a Marketplace role on the card.
set_hubspot_user_role(hubspot_user_id, role, hubspot_user_email?)tenant:members:role:writeGive a HubSpot user a Marketplace role on the card: viewer, creator or admin.
clear_hubspot_user_role(hubspot_user_id)tenant:members:role:writeReturn a HubSpot user to the default, read-only viewer.

Marketplace: offers

ToolPermissionDescription
list_marketplace_products()tenant:marketplace:offers:readYour SaaS products in AWS Marketplace.
get_marketplace_product(product_id)tenant:marketplace:offers:readOne product, with the dimensions its offers can use.
list_marketplace_offers(product_id)tenant:marketplace:offers:readThe private offers of a product.
get_marketplace_offer(offer_id)tenant:marketplace:offers:readOne private offer.
preview_marketplace_offer(product_id, offer_name, buyer_accounts, expiry_date, total_price, max_quantity, dimension_key?, unit_price?, currency?, duration_months?, agreement_start_date?, installments?, eula_url?, legal_term_type?)tenant:marketplace:offers:writeBuild an offer without submitting it, to check it.
create_marketplace_offer(product_id, offer_name, buyer_accounts, expiry_date, idempotency_key, total_price, max_quantity, dimension_key?, unit_price?, currency?, duration_months?, agreement_start_date?, installments?, eula_url?, legal_term_type?)tenant:marketplace:offers:writeCreate a draft private offer. Returns a job to poll; the offer is not released. Reuse idempotency_key on a retry.
clone_marketplace_offer(offer_id, expiry_date, idempotency_key, product_id?, offer_name?, buyer_accounts?, dimension_key?, unit_price?, total_price?, currency?, duration_months?, max_quantity?, agreement_start_date?, installments?, eula_url?, legal_term_type?)tenant:marketplace:offers:writeCreate a new draft from an existing offer, changing the fields you pass.
release_marketplace_offer(offer_id, idempotency_key)tenant:marketplace:offers:releaseRelease a draft to its buyer. Cannot be undone: a released offer’s terms can never change.
update_marketplace_offer_availability(offer_id, end_date, idempotency_key)tenant:marketplace:offers:writeExtend an offer’s availability to a later date.
expire_marketplace_offer(offer_id, idempotency_key)tenant:marketplace:offers:releaseEnd an offer’s availability now.
get_marketplace_offer_job(job_id)tenant:marketplace:offers:readStatus of a create, clone, release, expire or replacement job.
list_marketplace_agreements()tenant:marketplace:offers:readYour buyers’ purchase agreements, with status and offer.
create_marketplace_replacement_offer(agreement_id, idempotency_key, name?)tenant:marketplace:offers:writeCreate a draft replacement offer for an active agreement. Returns a job to poll.
upload_marketplace_offer_eula(offer_ref, documents, content_type?)tenant:marketplace:offers:writeUpload a custom EULA (one document, up to 4 MB) for a draft offer and get a permanent URL.

Marketplace: EULAs and offer templates

ToolPermissionDescription
list_marketplace_eulas()tenant:marketplace:offers:readYour saved EULAs.
create_marketplace_eula(name, documents, content_type?)tenant:marketplace:offers:writeUpload a EULA and save it under a name for reuse.
delete_marketplace_eula(eula_id)tenant:marketplace:offers:writeRemove a saved EULA from the list.
list_marketplace_offer_templates(include_archived?)tenant:marketplace:offers:readYour offer templates: default currency, contract length, expiry window, quantity and EULA.
create_marketplace_offer_template(name, values)tenant:marketplace:offers:writeCreate an offer template.
update_marketplace_offer_template(template_id, name?, values?)tenant:marketplace:offers:writeChange a template. values replaces all values.
archive_marketplace_offer_template(template_id)tenant:marketplace:offers:writeArchive a template. If it was the default, there is no default afterwards.
set_marketplace_offer_template_default(template_id)tenant:marketplace:offers:writeMake a template the default.
clear_marketplace_offer_template_default(template_id)tenant:marketplace:offers:writeStop a template being the default.

Deal analytics

Requires tenant:deals:read and the HubSpot feature.

ToolDescription
get_deal_pipeline_summary(from_date?, to_date?)Pipeline health: stage distribution, total value and close-date adherence.
list_stalled_deals(days_inactive?, from_date?, to_date?)Deals with no activity for days_inactive days (default 30).
get_deal_details(deal_id)One deal with its AI summary, activities and APN sync state.
get_pipeline_stages()Every pipeline stage with deal counts and values.
get_deals_by_stage(from_date?, to_date?)Open deal counts and values by stage, optionally for a close-date range.
get_deal_activities(deal_id, max_activities?)A deal’s notes, calls, emails, meetings, tasks and appointments, newest first. max_activities defaults to 20.
get_owner_action_items(from_date?, to_date?)Deals that need action, per owner.
get_inconsistent_deals()Deals with data problems, such as a missing close date or amount.
get_rep_won_amounts(from_date?, to_date?)Won revenue per rep for the date range.
list_outdated_deals(limit?)Deals past their close date that are still open.
get_pipeline_targets(target_won_value, from_date?, to_date?)How many deals each stage needs to reach a revenue target.

get_win_loss_deals(since_date?, include_activities?) needs tenant:win-loss:read instead: all deals won or lost since since_date, with their activities unless include_activities is false.


Pipeline operations

ToolPermissionDescription
refresh_pipeline()tenant:deals:analyzeRefresh the pipeline data now.
get_queue_status()tenant:settings:readState of the pipeline refresh: idle, queued, running, completed (with the deal count) or failed (with a reason).
analyze_deal(deal_id, prompt?)tenant:deals:analyzeAnalyse one deal with AI, with an optional extra instruction.
reanalyze_deal(deal_id)tenant:deals:reanalyzeForce a fresh analysis of one deal.

Goals and win/loss

ToolPermissionDescription
get_goals(year?)tenant:goals:readThe year’s goals: won amount, deal count and per-rep quotas.
set_goals(year, target_won_amount?, target_won_count?, rep_quotas?)tenant:goals:writeSet or change the goals.
get_win_loss(window?: "12m"/"24m"/"36m"/"48m")tenant:win-loss:readWin/loss analysis for the window (default "12m").
get_win_loss_status()tenant:win-loss:readState of the win/loss analysis: idle, queued, running (with months still to analyse), completed or failed.
trigger_win_loss_analysis()tenant:win-loss:triggerStart a win/loss analysis over your closed deals. This can take several minutes; at most one run every 15 minutes.