Skip to content

Documentation navigation

Identity & Security

Auth0, Okta, Vault, 1Password, Bitwarden, Snyk, Twilio, and other identity toolsets.

#Identity & security

Connectors for identity providers, secret managers, MFA, and security scanners. Every connector follows the standard @toolset / @toolify shape and the agent-ready toolset pattern (compact summaries by default, opt-in raw IDs, tolerant write inputs). Secret-store summaries omit designated value fields by default; explicit value-reading options are described below.

#Agent-ready behavior (overview)

This category covers identity (Auth0, Okta, JumpCloud, OneLogin, Duo), secret managers (Vault, 1Password, Bitwarden, Doppler, Infisical), security scanning (Snyk), and verification (Twilio). Across the group:

  • List tools return compact summaries with response-local display refs (user_ref, role_ref, connection_ref, app_ref, org_ref, vault_ref, item_ref, secret_ref, project_ref, config_ref, system_ref, group_ref, vuln_ref, message_ref, subscriber_ref). Raw provider IDs (user_id, role_id, vault_id, item_id, secret_id, org_id, policy_arn, connection_id, client_id, org_slug/project_slug, workspace_id, etc.) are hidden by default and opt-in via include_ids=True.
  • Write tools that take an identifier accept either a raw ID/email or the dict from the corresponding list/get tool (Auth0: _resolve_user_id; Okta: _resolve_user_id; OnePassword: _resolve_vault_id/_resolve_item_id; Bitwarden: project and secret resolvers; JumpCloud: _resolve_user_id; OneLogin user resolver; Snyk: org/project string ids; Twilio: SID strings).
  • Default page size is generally 25; some tools cap at provider maxima (Auth0 / Okta / JumpCloud / OneLogin: 100-200; Twilio: 1000).

#Secret-store list summaries

For every secret-store toolset (Vault, 1Password, Bitwarden, Doppler, Infisical), the list tools (kv_list, list_items, list_secrets) return metadata only -- keys, names, comments, types, timestamps. The default summary removes the provider's designated secret-value field. Names, comments and other metadata can still contain sensitive text; summary mode is not a general-purpose redactor.

Two opt-in paths exist for cases where the agent really does need the values:

  • DopplerToolSet.list_secrets(..., include_values=True) -- returns the raw Doppler payload (with values) for the requested config.
  • InfisicalToolSet.list_secrets(..., include_values=True) -- returns the raw Infisical payload (with values) for the requested workspace/environment/path.

Use either flag only when the agent's task is "fetch all the secrets and pass them to X." Treat the result as sensitive and do not echo it into a final user-facing answer.

For one-off reads, prefer the targeted get_secret/kv_get/get_item tool -- they read a single value at a time and make the access pattern explicit. They still return the value (that is the point of the tool), so the same sensitivity rule applies.

#Destructive tools (require user confirmation)

Identity: delete_user (Auth0, JumpCloud, OneLogin, Duo), suspend_user / deactivate_user (Okta), lock_user (OneLogin), disable_user (Duo), remove_user_from_group (Okta).

Secrets: kv_delete, kv_destroy (Vault), delete_item (1Password), delete_projects, delete_secrets (Bitwarden), delete_project (Doppler), delete_secret (Infisical).

Security / messaging: deactivate_project (Snyk), send_message, start_verification, make_call (Twilio -- call out separately: these trigger real billable messages / calls to real phone numbers and emails. Confirm the recipient and body with the user before invoking).

#Auth0ToolSet

Python
from maivn_tools import Auth0ToolSet

connector = Auth0ToolSet(
    domain="tenant.us.auth0.com",
    access_token=secrets["AUTH0_MGMT_TOKEN"],
)

Tools: list_users, get_user, create_user, update_user, delete_user (destructive), list_roles, assign_roles_to_user, list_connections, list_clients, list_organizations, list_logs.

Agent-ready behavior

  • list_users (default per_page=25, hard max 100): summary with user_ref, email, name, blocked, email_verified, last_login, logins_count. Raw user_id hidden; opt in with include_ids=True (needed by update_user, delete_user, assign_roles_to_user).
  • list_roles: summary with role_ref, name, description. Opt in for role_id (needed by assign_roles_to_user).
  • list_connections: summary with connection_ref, name, strategy, is_domain_connection. name is what create_user takes -- opt in only for connection_id if you need it.
  • list_clients: summary with app_ref, name, app_type, is_first_party. Raw client_id is sensitive and hidden by default.
  • list_organizations: summary with org_ref, name, display_name. Opt in for org_id.
  • Tolerant inputs: update_user, delete_user, assign_roles_to_user accept a raw user_id string or a user dict from list_users(include_ids=True).
Python
users = connector.list_users(q='email:"alice@example.com"', include_ids=True)
connector.update_user(users["users"][0], blocked=True)  # dict accepted

#OktaToolSet

Python
from maivn_tools import OktaToolSet

connector = OktaToolSet(
    org_url="https://my-tenant.okta.com",
    api_token=secrets["OKTA_TOKEN"],
)

Tools: list_users, get_user, create_user, update_user, suspend_user (destructive), unsuspend_user, deactivate_user (destructive), list_groups, add_user_to_group, remove_user_from_group (destructive), list_applications, list_factors, list_system_logs.

Agent-ready behavior

  • list_users (default limit 25, hard max 200): summary with user_ref, email, name, login, status, last_login. Raw Okta user_id hidden; opt in with include_ids=True (needed by write tools).
  • list_groups (default limit 25, hard max 200): summary with group_ref, name, description, type. Opt in for group_id (needed by add_user_to_group / remove_user_from_group).
  • list_applications (default limit 25, hard max 200): summary with app_ref, name, label, status, sign_on_mode. Opt in for app_id.
  • Tolerant inputs: update_user, suspend_user, unsuspend_user, deactivate_user, add_user_to_group, remove_user_from_group accept a string ID / login / email or a user dict.
  • Destructive: suspend_user, deactivate_user, remove_user_from_group. Confirm before invoking.

#VaultToolSet

Python
from maivn_tools import VaultToolSet

connector = VaultToolSet(
    base_url="https://vault.example:8200",
    token=secrets["VAULT_TOKEN"],
    namespace="org/team",  # optional enterprise namespace
)

KV v2 + transit + token operations. Tools: get_health, list_mounts, kv_get, kv_put, kv_patch, kv_delete (destructive), kv_destroy (destructive), kv_list, lookup_token_self, renew_token_self, transit_encrypt, transit_decrypt.

Agent-ready behavior

  • kv_list: summary with secret_ref, key, is_directory. Never returns secret values -- only child key names. Set include_ids=True to also attach the full path for each key (handy for follow-up kv_get calls).
  • kv_get returns Vault's raw payload with data.data (the actual secret material) -- treat the result as sensitive.
  • Destructive: kv_delete (soft-delete, reversible via undelete) and kv_destroy (permanent). Confirm before invoking.

#OnePasswordToolSet

Python
from maivn_tools import OnePasswordToolSet

connector = OnePasswordToolSet(
    base_url="https://op-connect.example.com",
    access_token=secrets["OP_CONNECT_TOKEN"],
)

1Password Connect (self-hosted). Tools: list_vaults, get_vault, list_items, get_item, create_item, update_item, patch_item, delete_item (destructive), get_item_files, get_heartbeat.

Agent-ready behavior

  • list_vaults: summary with vault_ref, name, description, type, item_count. Raw vault_id hidden; opt in with include_ids=True.
  • list_items: summary with item_ref, title, category, tags, updated_at, optional primary_url. Item values are not in the list response -- even if a value-bearing field leaks in, the stripper drops it. Use get_item for a single item's full payload (which does include secret fields -- treat as sensitive).
  • Tolerant inputs: get_vault, list_items, get_item, create_item, update_item, patch_item, delete_item, get_item_files accept the relevant ID string or a vault/item dict.
  • Destructive: delete_item. Confirm before invoking (item cannot be recovered).

#BitwardenToolSet

Python
from maivn_tools import BitwardenToolSet

connector = BitwardenToolSet(
    access_token=secrets["BWS_ACCESS_TOKEN"],
    organization_id="org-uuid",
)

Bitwarden Secrets Manager. Tools: list_projects, create_project, get_project, update_project, delete_projects (destructive), list_secrets, get_secret, create_secret, update_secret, delete_secrets (destructive).

Agent-ready behavior

  • list_projects: summary with project_ref, name, created_at, revised_at. Raw project_id hidden; opt in with include_ids=True.
  • list_secrets: summary with secret_ref, key, note, created_at, revised_at. Never returns the value. Use get_secret for a single targeted read (which does include the value -- treat as sensitive).
  • Tolerant inputs: get_project, update_project, delete_projects, get_secret, update_secret, delete_secrets accept the relevant ID string, a resource dict, or a list of either (for the bulk delete tools).
  • Destructive: delete_projects, delete_secrets. Confirm before invoking.

#DopplerToolSet

Python
from maivn_tools import DopplerToolSet

connector = DopplerToolSet(token=secrets["DOPPLER_TOKEN"])

Tools: list_projects, create_project, delete_project (destructive), list_configs, list_secrets, get_secret, update_secrets, download_secrets.

Agent-ready behavior

  • list_projects (default per_page=20): summary with project_ref, name, description, created_at. Raw project_slug hidden; opt in with include_ids=True.
  • list_configs: summary with config_ref, name, environment, root, locked.
  • list_secrets: summary with secret_ref, key, optional value_type, note. Never returns secret values unless you pass include_values=True -- that is the explicit opt-in path for bulk-reading values; treat the result as sensitive.
  • get_secret and download_secrets both return values; treat as sensitive.
  • Destructive: delete_project (removes the project and all its configs + secrets). Confirm before invoking.
Python
secrets = connector.list_secrets(project="my-app", config="prd")  # metadata only
values = connector.list_secrets(project="my-app", config="prd", include_values=True)

#InfisicalToolSet

Python
from maivn_tools import InfisicalToolSet

connector = InfisicalToolSet(access_token=secrets["INFISICAL_TOKEN"])

Tools: list_projects, get_project, list_secrets, get_secret, create_secret, update_secret, delete_secret (destructive).

Agent-ready behavior

  • list_projects: summary with project_ref, name, slug, environments. Raw workspace_id hidden; opt in with include_ids=True.
  • list_secrets: summary with secret_ref, key, type, comment, updated_at. Never returns secret values unless you pass include_values=True -- that is the explicit opt-in path; treat the result as sensitive. Set include_ids=True to also attach secret_id and secret_path.
  • get_secret returns the value; treat as sensitive.
  • Destructive: delete_secret. Confirm before invoking.

#SnykToolSet

Python
from maivn_tools import SnykToolSet

connector = SnykToolSet(api_token=secrets["SNYK_TOKEN"])

Tools: list_organizations, list_projects, get_project, list_issues, list_aggregated_issues, trigger_test, deactivate_project (destructive), list_dependencies.

Agent-ready behavior

  • list_organizations (default limit 25, hard max 100): summary with org_ref, name, slug. Opt in for org_id.
  • list_projects (default limit 25, hard max 100): summary with project_ref, name, origin, type, target_reference, status. Opt in for project_id.
  • list_issues (default limit 25, hard max 100): summary with vuln_ref, title, severity, type, status, ignored, created_at. Opt in for vuln_id / key.
  • Destructive: deactivate_project (stops scans; reversible via the Snyk UI). Confirm before invoking.

#TwilioToolSet

Python
from maivn_tools import TwilioToolSet

connector = TwilioToolSet(
    account_sid=secrets["TWILIO_ACCOUNT_SID"],
    auth_token=secrets["TWILIO_AUTH_TOKEN"],
)

Programmable Messaging, Verify, and Voice in one toolset. Tools: send_message, list_messages, get_message, start_verification, check_verification, make_call, lookup_phone_number.

Agent-ready behavior

  • list_messages (default page_size=25, hard max 1000): summary with message_ref, from, to, status, direction, body, date_sent, price. Raw message_sid hidden; opt in with include_ids=True.
  • Destructive (real billable side effects): send_message, start_verification, make_call. Each one sends a real SMS / OTP / phone call to a real number -- always confirm the recipient and content with the user before invoking. The destructive=True marker also makes them filterable via exclude_tags=["destructive"] for fully autonomous runs.

#JumpCloudToolSet

Python
from maivn_tools import JumpCloudToolSet

connector = JumpCloudToolSet(api_key=secrets["JUMPCLOUD_KEY"])

Tools: list_users, get_user, create_user, update_user, delete_user (destructive), list_user_groups, manage_user_group_member, list_systems, list_applications.

Agent-ready behavior

  • list_users (default limit 25, hard max 100): summary with user_ref, email, username, name, suspended, activated, last_login. Raw user_id hidden; opt in with include_ids=True.
  • list_user_groups: summary with group_ref, name, description, type. Opt in for group_id.
  • list_systems: summary with system_ref, hostname, os, version, active, last_contact. Opt in for system_id.
  • list_applications: summary with app_ref, name, sso_type, active. Opt in for app_id.
  • Tolerant inputs: update_user, delete_user, manage_user_group_member accept a user-id string or a user dict.
  • Destructive: delete_user. Confirm before invoking (terminates sessions and removes group membership).

#OneLoginToolSet

Python
from maivn_tools import OneLoginToolSet

connector = OneLoginToolSet(
    access_token=token,           # via OAuth client-credentials
    subdomain="my-tenant",
    region="us",                  # "us" or "eu"
)

Tools: list_users, get_user, create_user, update_user, delete_user (destructive), lock_user (destructive), list_roles, assign_role_to_user, list_apps, list_events.

Agent-ready behavior

  • list_users: summary with user_ref, email, username, name, status, last_login, locked_until. Raw numeric user_id hidden; opt in with include_ids=True.
  • list_roles: summary with role_ref, name (and admin metadata). Opt in for role_id.
  • list_apps: summary with app_ref, name, connector_id.
  • Destructive: delete_user, lock_user. Confirm before invoking.

#DuoToolSet

Python
from maivn_tools import DuoToolSet

connector = DuoToolSet(
    ikey=secrets["DUO_IKEY"],
    skey=secrets["DUO_SKEY"],
    api_host="api-abc123.duosecurity.com",
)

The toolset computes the per-request HMAC-SHA512 signature in-process so callers only provide ikey / skey / api_host. Tools: list_users, get_user, create_user, disable_user (destructive), delete_user (destructive), list_phones, list_groups, associate_group_with_user, list_integrations, list_authentication_logs.

Agent-ready behavior

  • list_users: summary with user_ref, username, email, status, last_login. Raw user_id hidden; opt in with include_ids=True.
  • list_phones: summary with phone_ref, number, type, platform, activated. Opt in for phone_id.
  • list_groups: summary with group_ref, name, desc, status. Opt in for group_id.
  • list_integrations: summary with integration_ref, name, type, enroll_policy. Opt in for integration_key.
  • Destructive: disable_user, delete_user. Confirm before invoking (Duo deletes are permanent).