Cloud & Observability
Datadog, Sentry, PagerDuty, New Relic, Splunk, Grafana, and other ops toolsets.
#Cloud & observability
Toolsets for telemetry pipelines, incident response, on-call, and infrastructure control planes. Every connector follows the standard @toolset / @toolify shape.
#Agent-ready behavior (overview)
All list / search tools in this group return compact summaries by default with a response-local _ref field (log_ref, monitor_ref, dashboard_ref, issue_ref, incident_ref, service_ref, schedule_ref, oncall_ref, user_ref, alert_ref, app_ref, index_ref, search_ref, folder_ref, component_ref, subscriber_ref, zone_ref, record_ref, worker_ref, bucket_ref, pod_ref, namespace_ref, deployment_ref). Raw provider IDs are hidden unless you pass include_ids=True. Where the tool exposes include_metadata=False, that returns the raw provider response untouched. Default page size is 25; some tools cap absolute limits to provider maxima (1000 logs, 100 users, etc.).
Write tools that take an identifier accept either a raw ID/UID/int or the dict from the corresponding list/get tool. This includes get_monitor, delete_monitor, mute_monitor, get_issue, update_issue, delete_issue, list_events_for_issue, get_incident, update_incident, acknowledge_incident, delete_alert_policy, get_dashboard_by_uid, delete_dashboard_by_uid, update_component, update_incident, delete_incident, get_zone, list_dns_records, update_dns_record, delete_dns_record, purge_cache.
Destructive tools across this group (require user confirmation): delete_monitor, delete_issue, cancel_search_job, delete_alert_policy, delete_dashboard_by_uid, delete_incident, delete_dns_record, purge_cache, delete_pod.
#DatadogToolSet
from maivn_tools import DatadogToolSet
connector = DatadogToolSet(
api_key=secrets["DD_API_KEY"],
app_key=secrets["DD_APP_KEY"], # required for most read APIs
site="datadoghq.com",
)Tools: search_logs, submit_logs, query_metrics, submit_metrics, list_monitors, get_monitor, create_monitor, delete_monitor (destructive), mute_monitor, post_event, list_dashboards, get_dashboard.
Agent-ready behavior
search_logs(default limit 25, hard max 1000; summaries capped at 25): summary withlog_ref,timestamp,service,status,host,message, optionaltags. Raw Datadog event IDs hidden unlessinclude_ids=True; passinclude_metadata=Falsefor the raw provider response. Cursor pagination preserved asnext_cursor.list_monitors(default page size 25): summary withmonitor_ref,name,type,state,message,tags. Numeric IDs hidden by default; opt in withinclude_ids=True(needed forget_monitor,delete_monitor,mute_monitor).list_dashboards: summary withdashboard_ref,title,description,layout_type,url. Opt in withinclude_ids=Truefordashboard_id(needed forget_dashboard).- Tolerant inputs:
get_monitor,delete_monitor, andmute_monitoraccept an int, a monitor dict, or a list of such. - Destructive:
delete_monitor. Confirm before invoking.
hot = connector.search_logs(
query="status:error service:checkout",
from_time="now-15m",
to_time="now",
)#SentryToolSet
from maivn_tools import SentryToolSet
connector = SentryToolSet(auth_token=secrets["SENTRY_TOKEN"])Tools: list_organizations, list_projects, get_project, list_issues, get_issue, update_issue, delete_issue (destructive), list_events_for_issue, list_releases, create_release, list_alert_rules.
Agent-ready behavior
list_issues(default limit 25, hard max 100; summaries capped at 25): summary withissue_ref,title,culprit,status,level,count,last_seen,permalink. Raw Sentry issue IDs hidden; opt in withinclude_ids=True(needed forget_issue,update_issue,delete_issue).include_metadata=Falsereturns the raw provider payload.list_alert_rules: summary withalert_ref,name,environment,frequency,conditions_count,actions_count. Opt in foralert_id.- Tolerant inputs:
get_issue,update_issue,delete_issue, andlist_events_for_issueaccept a string ID, an issue dict, or a list of issue dicts. - Destructive:
delete_issue. Confirm before invoking.
#PagerDutyToolSet
from maivn_tools import PagerDutyToolSet
connector = PagerDutyToolSet(
api_key=secrets["PD_TOKEN"],
from_email="oncall@example.com", # required for ack / resolve writes
events_routing_key=secrets["PD_RK"], # required for Events v2 trigger / resolve
)REST + Events v2 in one toolset. Tools: list_incidents, get_incident, update_incident, acknowledge_incident, create_incident, trigger_event, resolve_event, list_services, list_schedules, list_on_calls, list_users.
Agent-ready behavior
list_incidents(default limit 25, hard max 200; summaries capped at 25): summary withincident_ref,incident_number,title,status,urgency,created_at,service_name. Raw incident IDs hidden; opt in withinclude_ids=Trueforincident_id(needed forget_incident,update_incident).list_services(default 25): summary withservice_ref,name,description,status. Opt in forservice_id(needed bycreate_incident).list_schedules(default 25): summary withschedule_ref,name,description,time_zone. Opt in forschedule_id(needed bylist_on_calls(schedule_ids=...)).list_on_calls: summary withoncall_ref,user_name,escalation_level,schedule_name,start,end. Opt in foruser_id/schedule_id. Best for "who is on call?" questions.list_users(default 25): summary withuser_ref,name,email,role,time_zone. Opt in foruser_id.- Tolerant inputs:
get_incident,update_incident, andacknowledge_incidentaccept a string ID, an incident dict, or a list of such. - No destructive tools -- incident deletion is intentionally not exposed (use
update_incident(status="resolved")instead).
hot = connector.list_incidents(statuses=["triggered", "acknowledged"])
connector.acknowledge_incident(hot["incidents"][0]) # dict accepted#NewRelicToolSet
from maivn_tools import NewRelicToolSet
connector = NewRelicToolSet(
api_key=secrets["NEW_RELIC_USER_KEY"],
account_id=int(secrets["NEW_RELIC_ACCOUNT_ID"]),
ingest_license_key=secrets.get("NEW_RELIC_LICENSE_KEY"),
region="US",
)NerdGraph + REST + Insights ingest. submit_logs / submit_metrics require ingest_license_key. Tools: nerdgraph_query, nrql_query, submit_logs, submit_metrics, list_alert_policies, create_alert_policy, delete_alert_policy (destructive), list_applications.
Agent-ready behavior
list_alert_policies: summary withalert_ref,name,incident_preference,created_at. Raw numeric policy IDs hidden; opt in withinclude_ids=Trueforpolicy_id(needed bydelete_alert_policy).include_metadata=Falsereturns the raw response.list_applications: summary withapp_ref,name,language,health_status,reporting. Opt in forapplication_id.- Tolerant inputs:
delete_alert_policyaccepts an int, a policy dict, or a list of such. - Destructive:
delete_alert_policy. Confirm before invoking.
#SplunkToolSet
from maivn_tools import SplunkToolSet
connector = SplunkToolSet(
token=secrets["SPLUNK_TOKEN"],
base_url="https://splunk.example.com:8089",
)REST API for the splunkd management port. Tools: create_search_job, get_search_job, get_search_results, cancel_search_job (destructive), list_indexes, list_saved_searches, create_saved_search, update_saved_search.
Agent-ready behavior
list_indexes: summary withindex_ref,name,total_event_count,current_db_size_mb,disabled(capped at 25).include_metadata=Falsereturns the raw response.list_saved_searches: summary withsearch_ref,name,search,is_scheduled,cron_schedule(capped at 25). Saved-search names are user-facing and are kept (they are also the API key used byupdate_saved_search).- Destructive:
cancel_search_job. Confirm before invoking (results are unrecoverable once cancelled).
#GrafanaToolSet
from maivn_tools import GrafanaToolSet
connector = GrafanaToolSet(
api_key=secrets["GRAFANA_TOKEN"], # service-account or API key
base_url="https://stack.grafana.net",
)Tools: search_dashboards, get_dashboard_by_uid, create_or_update_dashboard, delete_dashboard_by_uid (destructive), list_folders, create_folder, list_datasources, create_annotation, list_alert_rules, get_health.
Agent-ready behavior
search_dashboards(default limit 25, hard max 5000; summaries capped at 25): summary withdashboard_ref,title,type,url,folder_title,tags. Dashboard UIDs hidden; opt in withinclude_ids=Truefordashboard_uid/dashboard_id(needed byget_dashboard_by_uid,delete_dashboard_by_uid).list_folders(default limit 25): summary withfolder_ref,title,parent_uid. Opt in forfolder_uid/folder_id.list_alert_rules: summary withalert_ref,title,folder_uid,rule_group,condition,no_data_state,exec_err_state. Opt in foralert_uid.- Tolerant inputs:
get_dashboard_by_uidanddelete_dashboard_by_uidaccept a UID string or a dashboard dict fromsearch_dashboards(include_ids=True). - Destructive:
delete_dashboard_by_uid. Confirm before invoking.
#StatuspageToolSet
from maivn_tools import StatuspageToolSet
connector = StatuspageToolSet(
api_key=secrets["STATUSPAGE_KEY"],
page_id="my-page-id",
)Tools: get_page, list_components, update_component, list_incidents, create_incident, update_incident, delete_incident (destructive), schedule_maintenance, list_subscribers.
Agent-ready behavior
list_components: summary withcomponent_ref,name,status,description,group_id. Raw component IDs hidden; opt in withinclude_ids=Trueforcomponent_id(needed byupdate_component).list_incidents(default per_page 25, hard max 100; summaries capped at 25): summary withincident_ref,name,status,impact,created_at,resolved_at,shortlink. Opt in forincident_id(needed byupdate_incident,delete_incident).list_subscribers(default 25): summary withsubscriber_ref,mode,email,phone_number,endpoint,quarantined_at. Opt in forsubscriber_id.- Tolerant inputs:
update_component,update_incident, anddelete_incidentaccept a string ID or a resource dict. - Destructive:
delete_incident. Confirm before invoking.
#CloudflareToolSet
from maivn_tools import CloudflareToolSet
connector = CloudflareToolSet(api_token=secrets["CLOUDFLARE_TOKEN"])v4 REST API. Tools: verify_token, list_zones, get_zone, list_dns_records, create_dns_record, update_dns_record, delete_dns_record (destructive), purge_cache (destructive), list_workers, list_r2_buckets, create_r2_bucket.
Agent-ready behavior
list_zones(default per_page 25, hard max 50): summary withzone_ref,name,status,plan. Zone IDs hidden; opt in withinclude_ids=Trueforzone_id(needed forlist_dns_records,purge_cache, etc.).list_dns_records(default per_page 25, hard max 100): summary withrecord_ref,type,name,content,ttl,proxied. Opt in forrecord_id(needed forupdate_dns_record,delete_dns_record).list_workers: summary withworker_ref,name,created_on,modified_on,etag. Opt in forscript_id.list_r2_buckets: summary withbucket_ref,name,creation_date,location. Bucket names are the primary identifier in R2 so noinclude_idsflag is needed.- Tolerant inputs:
get_zone,list_dns_records,update_dns_record,delete_dns_record, andpurge_cacheaccept a string ID or a resource dict from the corresponding list call. - Destructive:
delete_dns_record,purge_cache. Confirm before invoking (purge causes user-facing latency until cache repopulates).
#KubernetesToolSet
from maivn_tools import KubernetesToolSet
connector = KubernetesToolSet(
api_server="https://my-cluster:6443",
token=secrets["K8S_SA_TOKEN"],
)Talks to the Kubernetes API server directly. Tools: get_version, list_namespaces, list_pods, get_pod, get_pod_logs, list_deployments, scale_deployment, delete_pod (destructive), list_services, list_events, list_nodes, apply_manifest.
Agent-ready behavior
list_namespaces: summary withnamespace_ref,name,phase,created_at. Namespacenameis the user-facing identifier and is kept; cluster UID is opt-in viainclude_ids=True.list_pods(default limit 25, hard max 1000; summaries capped at 25): summary withpod_ref,name,namespace,phase,ready,node,start_time. Pod UIDs are opt-in.list_deployments: summary withdeployment_ref,name,namespace,replicas,ready_replicas,available_replicas. UIDs opt-in.list_services: summary withservice_ref,name,namespace,type,cluster_ip,ports. UIDs opt-in.list_eventsreturns the raw event list (already useful for diagnosing Pending/Failed pods); cap withlimit(default 25, hard max 1000).- Destructive:
delete_pod. Confirm before invoking (one-off pods are not respawned).
apply_manifestuses server-side apply (Content-Type: application/apply-patch+yaml+fieldManager) so the caller can ship arbitrary resources without crafting per-kind tooling.