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
| Tool | Permission | Description |
|---|---|---|
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:read | The current tenant: name, slug, tier, status and features. |
update_tenant(name?, slug?, timezone?) | tenant:settings:write | Change 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:delete | Delete the tenant, with a 30-day grace period in which restore_tenant() undoes it. Only the owner can do this. |
restore_tenant() | tenant:delete | Restore 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:owner | Make 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:read | Which 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:write | Turn 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:read | Recent 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:read | The 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:configure | Change the time of the apn_sync or hubspot_sync schedule. Whether it runs follows the matching feature. |
Members and invites
| Tool | Permission | Description |
|---|---|---|
list_members() | tenant:members:read | All active members with their roles and when they were last seen. |
change_member_role(sub, new_role) | tenant:members:role:write | Change a member’s role. Never to or from owner. |
remove_member(sub) | tenant:members:remove | Remove a member. The owner cannot be removed. The member’s API keys are revoked. |
create_invite(email, role) | tenant:members:invite | Send 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:invite | All pending invitations. |
revoke_invite(sub) | tenant:members:invite | Cancel a pending invitation. |
resend_invite(sub) | tenant:members:invite | Send a pending invitation email again. |
import_invites(rows, dry_run?, idempotency_key?) | tenant:members:invite | Invite 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:invite | Status of an import job: pending, running (with processed so far), complete or failed, and each row’s result. |
Your account
| Tool | Permission | Description |
|---|---|---|
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.
| Tool | Permission | Description |
|---|---|---|
list_grants() | tenant:grants:read | Every 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:write | Create or replace a member’s grant. |
revoke_grant(sub) | tenant:grants:write | Remove a member’s grant; the role defaults apply again. |
API keys
See API Reference → Create an API key.
| Tool | Permission | Description |
|---|---|---|
create_api_key(name, scopes, expires_in_days?) | tenant:keys:write | Create an API key. The key is returned once; FlowState stores only a hash. |
list_api_keys() | tenant:keys:read:self | API 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:write | Revoke a key at once. Your own keys, or any key if you also hold tenant:keys:read. |
rotate_api_key(prefix) | tenant:keys:write | Issue a new key; the old one keeps working for 7 days. |
Billing
| Tool | Permission | Description |
|---|---|---|
get_billing_summary() | tenant:billing:read | Subscription status, usage this billing period and the next invoice estimate. |
list_invoices(limit?) | tenant:billing:read | Recent invoices with amounts and download links. |
open_billing_checkout(provider?) | tenant:billing:write | Start a Stripe Checkout session. |
open_billing_portal() | tenant:billing:write | Open a Stripe billing portal session. |
get_usage_breakdown(period?) | tenant:billing:read | Usage 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.
| Tool | Permission | Description |
|---|---|---|
get_my_org() | org:tenants:read | Every tenant in your organisation, whatever its status. |
rename_org(org_id, name) | org:admins:write | Rename the organisation. |
get_org_admins(org_id) | org:admins:write | The organisation’s admins. |
get_org_members(org_id) | org:admins:write | Every member of the organisation, and whether each is an org admin. |
get_org_tenant_matrix(org_id, limit?, cursor?) | org:tenants:read | Members × tenants, with each member’s role in each tenant. Members are paginated. |
grant_org_admin(email) | org:admins:write | Make an active member of one of your tenants a co-admin, by email. |
revoke_org_admin(sub) | org:admins:write | Remove an org admin. Refused if the organisation would have no admin left. |
remove_org_member(sub) | org:admins:write | Remove 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:write | Invite someone into the organisation, optionally as an org admin. It gives no tenant access. |
create_org_tenant(name, slug?) | org:tenants:write | Create a tenant in the organisation, with you as owner. |
delete_org_tenant(target_tenant_id, confirm) | org:tenants:write | Delete a tenant of the organisation (30-day grace period). Refused for the last tenant. |
restore_org_tenant(target_tenant_id) | org:tenants:write | Restore a deleted tenant of the organisation within its grace period. |
assign_org_tenant_member(target_tenant_id, sub, role) | org:tenants:members:write | Give 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:write | Remove a member from one of the organisation’s tenants. An active owner cannot be removed. |
get_org_billing(org_id, month?) | org:billing:read | The 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:write | Set the billing details. A field you leave out is unchanged. |
open_org_billing_checkout(org_id) | org:billing:write | Start the organisation’s Stripe subscription, which covers all its tenants. |
open_org_billing_portal(org_id) | org:billing:write | Open the Stripe billing portal for the organisation. |
cancel_org_subscription(org_id) | org:billing:write | Cancel the organisation’s Stripe subscription at the end of the current period. |
Invites to an organisation, for the invited person:
| Tool | Permission | Description |
|---|---|---|
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
| Tool | Permission | Description |
|---|---|---|
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:self | Send 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:read | Which members of the tenant receive each category. |
list_notification_log(before?, category?, limit?) | tenant:notifications:audit:read | The 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
| Tool | Permission | Description |
|---|---|---|
list_audit_events(before?, type?, actor?, limit?) | tenant:notifications:audit:read | The tenant’s audit log, newest first. |
get_audit_event(event_id) | tenant:notifications:audit:read | One audit event with its full details. |
export_audit_log(start, end, format: "csv" or "json") | tenant:notifications:audit:read | Start an export of the audit log. |
get_audit_export_status(job_id) | tenant:notifications:audit:read | Status of an audit export, with a download link when it is complete. |
HubSpot
| Tool | Permission | Description |
|---|---|---|
get_hubspot_status() | tenant:integrations:hubspot:read | Connection 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:connect | The HubSpot authorization URL to open in a browser. |
complete_hubspot_oauth(code, state) | tenant:integrations:hubspot:connect | Finish 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:read | Check that the stored HubSpot connection works. |
verify_hubspot_connection() | tenant:integrations:hubspot:read | Fetch your most recent open HubSpot deal, with its stage, as a connection check. |
refresh_hubspot_oauth() | tenant:integrations:hubspot:connect | Renew the HubSpot access token now. |
disconnect_hubspot(confirm) | tenant:integrations:hubspot:disconnect | Delete the stored HubSpot connection. |
provision_hubspot_properties() | tenant:integrations:hubspot:connect | Create the flowstate_apn property group and the APN deal properties. Safe to run again. |
list_hubspot_custom_properties() | tenant:integrations:hubspot:read | Check that every APN deal property exists in your HubSpot account. |
apn_deprovision_hubspot_properties() | tenant:integrations:apn:configure | Delete all APN deal properties from your HubSpot account. Cannot be undone. |
Slack
| Tool | Permission | Description |
|---|---|---|
get_slack_status() | tenant:integrations:slack:read | Workspace name and connection status. |
get_slack_oauth_app() | tenant:integrations:slack:read | Your Slack app’s settings. The client secret is never returned. |
set_slack_oauth_app(client_id, client_secret, redirect_url?) | tenant:integrations:slack:write | Store your own Slack app’s credentials. See Slack → Getting started. |
delete_slack_oauth_app() | tenant:integrations:slack:write | Remove your Slack app’s credentials. |
start_slack_oauth() | tenant:integrations:slack:write | The Slack authorization URL for your Slack app. |
complete_slack_oauth(code, state) | tenant:integrations:slack:write | Finish connecting Slack. |
test_slack() | tenant:integrations:slack:write | Send yourself a test direct message in Slack. |
list_slack_channels() | tenant:integrations:slack:write | Channels the FlowState app can post to. |
get_slack_notification_routing() | tenant:integrations:slack:read | Where each alert type (deals.outdated, deals.weekly_digest) goes: people, a channel, or off. |
set_slack_notification_routing(rules) | tenant:integrations:slack:write | Set where each alert type goes. Only deals.outdated and deals.weekly_digest send messages. See Slack → Notifications. |
disconnect_slack() | tenant:integrations:slack:write | Delete the Slack connection. |
APN: connection
| Tool | Permission | Description |
|---|---|---|
get_apn_onboarding_artifacts() | tenant:integrations:apn:configure | What the connection wizard shows: your ExternalId and the connector templates. |
enable_apn_integration(role_arn, catalog: "Sandbox" or "AWS") | tenant:integrations:apn:configure | Connect APN with your IAM role. FlowState checks the role and the catalog lock first. |
test_apn_connection() | tenant:integrations:apn:read | Check 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:configure | Set the Partner Solution and how the HubSpot amount maps to APN revenue. |
disable_apn_integration() | tenant:integrations:apn:configure | Turn APN sync off. Sync records are kept. |
rotate_apn_external_id() | tenant:integrations:apn:configure | Issue a new ExternalId. Update your role’s trust policy afterwards. |
list_apn_solutions() | tenant:integrations:apn:read | Your AWS Partner Central solutions. |
get_apn_integration_status() | tenant:integrations:apn:read | Connection status, catalog, sync counts and revenue mode. paused is true while APN sync waits for HubSpot to be reconnected. |
APN: sync
| Tool | Permission | Description |
|---|---|---|
list_apn_sync_state(state?, limit?, cursor?) | tenant:integrations:apn:read | Every deal’s APN sync state. The filter and paging parameters have no effect: all deals are returned. |
list_apn_conflicts() | tenant:integrations:apn:read | Deals with a sync conflict, with the conflicting values. |
resolve_apn_conflict_batch(deal_id, resolutions: dict) | tenant:integrations:apn:configure | Resolve a deal’s conflicts by choosing "hubspot" or "apn" per field. |
trigger_apn_sync(deal_id?) | tenant:integrations:apn:configure | With 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:configure | Re-check every linked opportunity in the background. One at a time per tenant. |
trigger_apn_inbound_sync(opp_id?) | tenant:integrations:apn:configure | Pull AWS lifecycle fields into HubSpot in the background, for all linked opportunities or one. |
delete_apn_sync_state(deal_id) | tenant:integrations:apn:configure | Unlink a deal from APN sync. For troubleshooting; cannot be undone. |
APN: stage mapping
| Tool | Permission | Description |
|---|---|---|
get_apn_stage_mapping() | tenant:integrations:apn:read | Your HubSpot pipelines with their APN stage mapping, and the seven APN stages. |
set_apn_stage_mapping(pipelines: dict) | tenant:integrations:apn:configure | Save pipeline_id → {hubspot_stage_id: apn_stage}. Values outside the seven stages are refused. |
clear_apn_stage_mapping(pipeline_id) | tenant:integrations:apn:configure | Clear one pipeline’s mapping, for example after the pipeline was deleted in HubSpot. |
APN: matching existing opportunities
| Tool | Permission | Description |
|---|---|---|
start_apn_match_session() | tenant:integrations:apn:configure | Compare 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:read | Recent match sessions, newest first. |
get_apn_match_session(session_id) | tenant:apn:read | One session with its suggested matches and the unmatched items on each side. |
confirm_apn_matches(session_id, candidate_ids) | tenant:integrations:apn:configure | Confirm 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:configure | Pair an unmatched opportunity with an unmatched deal yourself. |
create_apn_deal(session_id, apn_opportunity_id, amount?) | tenant:integrations:apn:configure | Create a HubSpot deal from an unmatched opportunity and link them. |
APN: business-problem templates
| Tool | Permission | Description |
|---|---|---|
list_apn_templates(include_archived?) | tenant:integrations:apn:read | Your business-problem templates. A new tenant has none. |
create_apn_template(name, skeleton, guidance, mode?) | tenant:integrations:apn:configure | Create 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:configure | Change a template’s name, skeleton, guidance or mode. |
archive_apn_template(template_id) | tenant:integrations:apn:configure | Archive a template. Deals that used it keep their reference. |
set_apn_template_default(template_id) | tenant:integrations:apn:configure | Make a template the default. |
clear_apn_template_default(template_id) | tenant:integrations:apn:configure | Stop a template being the default. |
add_apn_template_examples() | tenant:integrations:apn:configure | Copy the example templates into your tenant. Each call adds another copy. |
APN: business problem for a deal
| Tool | Permission | Description |
|---|---|---|
generate_apn_business_problem(deal_id, template_id, facts?, instruction?) | tenant:integrations:apn:configure | Draft 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:read | Status of a draft job: pending, completed or failed. |
get_apn_business_problem(deal_id) | tenant:integrations:apn:read | The 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:configure | Accept 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:configure | Drop the new draft. |
restore_apn_business_problem(deal_id, index) | tenant:integrations:apn:configure | Bring back an entry from history. The current text goes into history. |
approve_apn_business_problem(deal_id) | tenant:integrations:apn:configure | Approve the business problem. A generated draft must be approved before the deal can be submitted. |
APN: default-fields templates
| Tool | Permission | Description |
|---|---|---|
list_apn_field_templates(include_archived?) | tenant:integrations:apn:read | Your default-fields templates. A new tenant has none. |
get_apn_field_template_options() | tenant:integrations:apn:read | The fields a template can set, with the values AWS accepts for each. |
create_apn_field_template(name, field_values, mode?) | tenant:integrations:apn:configure | Create 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:configure | Change a template’s name, values or mode. |
archive_apn_field_template(template_id) | tenant:integrations:apn:configure | Archive a template. If it was the default, there is no default afterwards. |
set_apn_field_template_default(template_id) | tenant:integrations:apn:configure | Make a template the default. |
clear_apn_field_template_default(template_id) | tenant:integrations:apn:configure | Stop a template being the default. |
Marketplace: connection and access
| Tool | Permission | Description |
|---|---|---|
get_marketplace_onboarding_artifacts() | tenant:marketplace:offers:read | What the connection wizard shows: your ExternalId, the principal ARNs and the connector templates. |
connect_marketplace_connector(role_arn) | tenant:marketplace:offers:write | Connect AWS Marketplace with your IAM role. |
get_marketplace_connector_status() | tenant:marketplace:offers:read | Connection status. |
disconnect_marketplace_connector() | tenant:marketplace:offers:write | Disconnect AWS Marketplace. |
list_seen_hubspot_users() | tenant:members:read | HubSpot users who have used the FlowState card, to choose from for set_hubspot_user_role. |
list_hubspot_user_roles() | tenant:members:read | HubSpot users with a Marketplace role on the card. |
set_hubspot_user_role(hubspot_user_id, role, hubspot_user_email?) | tenant:members:role:write | Give a HubSpot user a Marketplace role on the card: viewer, creator or admin. |
clear_hubspot_user_role(hubspot_user_id) | tenant:members:role:write | Return a HubSpot user to the default, read-only viewer. |
Marketplace: offers
| Tool | Permission | Description |
|---|---|---|
list_marketplace_products() | tenant:marketplace:offers:read | Your SaaS products in AWS Marketplace. |
get_marketplace_product(product_id) | tenant:marketplace:offers:read | One product, with the dimensions its offers can use. |
list_marketplace_offers(product_id) | tenant:marketplace:offers:read | The private offers of a product. |
get_marketplace_offer(offer_id) | tenant:marketplace:offers:read | One 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:write | Build 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:write | Create 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:write | Create a new draft from an existing offer, changing the fields you pass. |
release_marketplace_offer(offer_id, idempotency_key) | tenant:marketplace:offers:release | Release 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:write | Extend an offer’s availability to a later date. |
expire_marketplace_offer(offer_id, idempotency_key) | tenant:marketplace:offers:release | End an offer’s availability now. |
get_marketplace_offer_job(job_id) | tenant:marketplace:offers:read | Status of a create, clone, release, expire or replacement job. |
list_marketplace_agreements() | tenant:marketplace:offers:read | Your buyers’ purchase agreements, with status and offer. |
create_marketplace_replacement_offer(agreement_id, idempotency_key, name?) | tenant:marketplace:offers:write | Create 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:write | Upload a custom EULA (one document, up to 4 MB) for a draft offer and get a permanent URL. |
Marketplace: EULAs and offer templates
| Tool | Permission | Description |
|---|---|---|
list_marketplace_eulas() | tenant:marketplace:offers:read | Your saved EULAs. |
create_marketplace_eula(name, documents, content_type?) | tenant:marketplace:offers:write | Upload a EULA and save it under a name for reuse. |
delete_marketplace_eula(eula_id) | tenant:marketplace:offers:write | Remove a saved EULA from the list. |
list_marketplace_offer_templates(include_archived?) | tenant:marketplace:offers:read | Your offer templates: default currency, contract length, expiry window, quantity and EULA. |
create_marketplace_offer_template(name, values) | tenant:marketplace:offers:write | Create an offer template. |
update_marketplace_offer_template(template_id, name?, values?) | tenant:marketplace:offers:write | Change a template. values replaces all values. |
archive_marketplace_offer_template(template_id) | tenant:marketplace:offers:write | Archive a template. If it was the default, there is no default afterwards. |
set_marketplace_offer_template_default(template_id) | tenant:marketplace:offers:write | Make a template the default. |
clear_marketplace_offer_template_default(template_id) | tenant:marketplace:offers:write | Stop a template being the default. |
Deal analytics
Requires tenant:deals:read and the HubSpot feature.
| Tool | Description |
|---|---|
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
| Tool | Permission | Description |
|---|---|---|
refresh_pipeline() | tenant:deals:analyze | Refresh the pipeline data now. |
get_queue_status() | tenant:settings:read | State of the pipeline refresh: idle, queued, running, completed (with the deal count) or failed (with a reason). |
analyze_deal(deal_id, prompt?) | tenant:deals:analyze | Analyse one deal with AI, with an optional extra instruction. |
reanalyze_deal(deal_id) | tenant:deals:reanalyze | Force a fresh analysis of one deal. |
Goals and win/loss
| Tool | Permission | Description |
|---|---|---|
get_goals(year?) | tenant:goals:read | The year’s goals: won amount, deal count and per-rep quotas. |
set_goals(year, target_won_amount?, target_won_count?, rep_quotas?) | tenant:goals:write | Set or change the goals. |
get_win_loss(window?: "12m"/"24m"/"36m"/"48m") | tenant:win-loss:read | Win/loss analysis for the window (default "12m"). |
get_win_loss_status() | tenant:win-loss:read | State of the win/loss analysis: idle, queued, running (with months still to analyse), completed or failed. |
trigger_win_loss_analysis() | tenant:win-loss:trigger | Start a win/loss analysis over your closed deals. This can take several minutes; at most one run every 15 minutes. |