{"apiVersion":"v1","directorySlug":"cushing-mcp-2497293b41","title":"The Cushing Family - Oregon","description":"Family website for the Cushings in Oregon. Our family motto: Virtute et numine - by valor and divine aid.","pageUrl":"https://www.mcpbundles.com/skills/cushing-mcp-2497293b41","connectPath":"importable","connectAction":"import_server","catalogListing":false,"bundleSlug":null,"listingKind":"remote_mcp","kind":"provider","transportUrl":"https://mcp.cushing.cc/mcp","hostedMcpUrl":null,"toolCount":51,"toolInventoryStatus":"observed","refreshedAt":"2026-11-03T13:26:00.516172+00:00","registryName":"cc.cushing/cushing-mcp-2497293b41","registryVersion":"2026.11.3","registryEligible":true,"tools":[{"name":"list_docker_containers","description":"List Docker containers on node0.\n    USE WHEN: user asks about running/stopped containers, what's deployed, container inventory.\n    RETURNS: one container per line with name, status, image tag.\n    Args:\n        all_containers: True (default) includes stopped; False = running only.","inputSchema":{"type":"object","properties":{"all_containers":{"type":"boolean","default":true}}},"logicalName":"list_docker_containers","displayName":"list_docker_containers","title":"list_docker_containers","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_container_logs","description":"Tail logs from a single Docker container.\n    USE WHEN: investigating container errors, checking recent activity, debugging a service.\n    RETURNS: raw log text (last N lines). Get container_name from list_docker_containers.","inputSchema":{"type":"object","required":["container_name"],"properties":{"lines":{"type":"integer","default":50},"container_name":{"type":"string"}}},"logicalName":"get_container_logs","displayName":"get_container_logs","title":"get_container_logs","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_node_health","description":"Quick node0 hardware health summary.\n    USE WHEN: user asks 'how is node0', 'system status', CPU/GPU/RAM check.\n    RETURNS: 6 lines — CPU load%, CPU temp, GPU load%, GPU temp, RAM used, RAM free.\n    For detailed per-sensor data use get_node_hardware.","inputSchema":{"type":"object","properties":{}},"logicalName":"get_node_health","displayName":"get_node_health","title":"get_node_health","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_node_hardware","description":"Detailed hardware sensor readings on node0.\n    USE WHEN: deeper hardware question than get_node_health — specific component temps, fan speeds, power draw, clock speeds.\n    RETURNS: sensors grouped by hardware path with value, min, max.\n    Args:\n        sensor_type: filter — Temperature, Load, Power, Clock, Fan, Voltage, Data. Empty = all.\n        hardware_filter: substring of hardware name — CPU, GPU, SSD, NVMe, etc.","inputSchema":{"type":"object","properties":{"sensor_type":{"type":"string","default":""},"hardware_filter":{"type":"string","default":""}}},"logicalName":"get_node_hardware","displayName":"get_node_hardware","title":"get_node_hardware","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"send_notification","description":"Send a push notification via ntfy.\n    USE WHEN: user EXPLICITLY asks to notify/alert/ping someone. Do not send unsolicited notifications.\n    RETURNS: 'HTTP 200: OK' on success, error text on failure. Admin topic is 'Admin'.\n    Args:\n        topic: ntfy topic name (e.g. 'Admin', 'family').\n        message: body of the notification.\n        title: short title (default 'node0').\n        priority: min, low, default, high, urgent — or 1-5.","inputSchema":{"type":"object","required":["topic","message"],"properties":{"topic":{"type":"string"},"message":{"type":"string"},"priority":{"anyOf":[{"type":"integer"},{"type":"string"}],"default":"default"}}},"logicalName":"send_notification","displayName":"send_notification","title":"send_notification","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"create_blinko_note","description":"Save a new note to Blinko (personal note-taking app).\n    USE WHEN: user asks to 'save a note', 'remember this', 'jot down'.\n    RETURNS: confirmation with new note ID. Use update_blinko_note to edit later.","inputSchema":{"type":"object","required":["content"],"properties":{"content":{"type":"string"},"is_archive":{"type":"boolean","default":false}}},"logicalName":"create_blinko_note","displayName":"create_blinko_note","title":"create_blinko_note","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"update_blinko_note","description":"Replace the content of an existing Blinko note.\n    USE WHEN: user asks to edit/modify/correct a known note. Get note_id from list_blinko_notes or search_blinko_notes first.\n    RETURNS: confirmation. Note: content is REPLACED, not appended.","inputSchema":{"type":"object","required":["note_id","content"],"properties":{"content":{"type":"string"},"note_id":{"type":"integer"}}},"logicalName":"update_blinko_note","displayName":"update_blinko_note","title":"update_blinko_note","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_blinko_note","description":"Move a Blinko note to the recycle bin (soft delete; Blinko has no hard-delete API).\n    USE WHEN: user asks to delete/remove a note. Get note_id from list_blinko_notes or search_blinko_notes first.\n    RETURNS: confirmation.","inputSchema":{"type":"object","required":["note_id"],"properties":{"note_id":{"type":"integer"}}},"logicalName":"delete_blinko_note","displayName":"delete_blinko_note","title":"delete_blinko_note","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"archive_blinko_note","description":"Archive or restore a Blinko note (keeps it but hides from main list).\n    USE WHEN: user asks to archive a note, or restore one from archive.\n    RETURNS: confirmation. Use list_blinko_notes(archived=True) to see archived notes.","inputSchema":{"type":"object","required":["note_id"],"properties":{"archive":{"type":"boolean","default":true},"note_id":{"type":"integer"}}},"logicalName":"archive_blinko_note","displayName":"archive_blinko_note","title":"archive_blinko_note","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"pin_blinko_note","description":"Pin or unpin a Blinko note to the top of the list.\n    USE WHEN: user asks to pin/highlight/promote a note, or remove a pin.\n    RETURNS: confirmation.","inputSchema":{"type":"object","required":["note_id"],"properties":{"pin":{"type":"boolean","default":true},"note_id":{"type":"integer"}}},"logicalName":"pin_blinko_note","displayName":"pin_blinko_note","title":"pin_blinko_note","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"list_blinko_notes","description":"Browse Blinko notes (most recent first).\n    USE WHEN: user asks 'what notes do I have', 'show my notes', or before editing/deleting an unknown note.\n    RETURNS: notes separated by --- with [id] and first 300 chars of content.\n    Args:\n        archived: True to list archived notes instead of active ones.","inputSchema":{"type":"object","properties":{"page":{"type":"integer","default":1},"limit":{"type":"integer","default":20},"archived":{"type":"boolean","default":false}}},"logicalName":"list_blinko_notes","displayName":"list_blinko_notes","title":"list_blinko_notes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"search_blinko_notes","description":"Find Blinko notes containing specific text.\n    USE WHEN: user asks 'do I have a note about X' or wants to locate a known topic.\n    RETURNS: matching notes separated by --- with [id] and first 300 chars.","inputSchema":{"type":"object","required":["query"],"properties":{"limit":{"type":"integer","default":10},"query":{"type":"string"}}},"logicalName":"search_blinko_notes","displayName":"search_blinko_notes","title":"search_blinko_notes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_kitchenowl_lists","description":"List all shopping lists in KitchenOwl.\n    USE WHEN: user wants to add/check/clear items but hasn't specified a list, or to inventory lists.\n    RETURNS: '[id] name' per line. There is usually one default list.","inputSchema":{"type":"object","properties":{}},"logicalName":"get_kitchenowl_lists","displayName":"get_kitchenowl_lists","title":"get_kitchenowl_lists","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"add_kitchenowl_item","description":"Add a single item to a KitchenOwl shopping list.\n    USE WHEN: user asks to add/buy/need something. If list_id unknown, call get_kitchenowl_lists first.\n    RETURNS: 'HTTP 200: Added' on success.","inputSchema":{"type":"object","required":["list_id","item_name"],"properties":{"list_id":{"type":"integer"},"item_name":{"type":"string"}}},"logicalName":"add_kitchenowl_item","displayName":"add_kitchenowl_item","title":"add_kitchenowl_item","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_kitchenowl_items","description":"See what's currently on a KitchenOwl shopping list.\n    USE WHEN: user asks 'what's on the list', or before removing/checking specific items (need item_id).\n    RETURNS: '[item_id] name — description' per line.","inputSchema":{"type":"object","required":["list_id"],"properties":{"list_id":{"type":"integer"}}},"logicalName":"get_kitchenowl_items","displayName":"get_kitchenowl_items","title":"get_kitchenowl_items","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"remove_kitchenowl_item","description":"Check off / remove ONE item from a KitchenOwl list.\n    USE WHEN: user says 'got the milk', 'remove eggs', 'cross off X'. For wiping the whole list use clear_kitchenowl_list.\n    RETURNS: 'HTTP 200: Removed'. Must call get_kitchenowl_items first to find item_id by name.","inputSchema":{"type":"object","required":["list_id","item_id"],"properties":{"item_id":{"type":"integer"},"list_id":{"type":"integer"}}},"logicalName":"remove_kitchenowl_item","displayName":"remove_kitchenowl_item","title":"remove_kitchenowl_item","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"clear_kitchenowl_list","description":"Remove EVERY item from a shopping list in one go.\n    USE WHEN: user says 'clear the list', 'I'm done shopping', 'start over'. Destructive — don't use for single items (use remove_kitchenowl_item).\n    RETURNS: count of items cleared.","inputSchema":{"type":"object","required":["list_id"],"properties":{"list_id":{"type":"integer"}}},"logicalName":"clear_kitchenowl_list","displayName":"clear_kitchenowl_list","title":"clear_kitchenowl_list","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"create_kitchenowl_list","description":"Create a new named shopping list in KitchenOwl.\n    USE WHEN: user wants a separate list (e.g. 'create a hardware list'). Most households just use the default — don't create unless asked.\n    RETURNS: new list id and name.","inputSchema":{"type":"object","required":["name"],"properties":{"name":{"type":"string"}}},"logicalName":"create_kitchenowl_list","displayName":"create_kitchenowl_list","title":"create_kitchenowl_list","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_kitchenowl_list","description":"Permanently delete a KitchenOwl list (cannot delete the default).\n    USE WHEN: user explicitly asks to remove a list entirely. Destructive.\n    RETURNS: 'HTTP 200: Deleted'.","inputSchema":{"type":"object","required":["list_id"],"properties":{"list_id":{"type":"integer"}}},"logicalName":"delete_kitchenowl_list","displayName":"delete_kitchenowl_list","title":"delete_kitchenowl_list","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_emby_system_info","description":"Emby server identity (name, version, OS, server ID).\n    USE WHEN: troubleshooting Emby, checking version, confirming server identity.\n    RETURNS: 4 lines: Server, Version, OS, ID.","inputSchema":{"type":"object","properties":{}},"logicalName":"get_emby_system_info","displayName":"get_emby_system_info","title":"get_emby_system_info","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_emby_library_stats","description":"Count of items in Emby by type.\n    USE WHEN: user asks 'how many movies/shows/songs do we have'.\n    RETURNS: one line per type: MovieCount, SeriesCount, EpisodeCount, SongCount, etc.","inputSchema":{"type":"object","properties":{}},"logicalName":"get_emby_library_stats","displayName":"get_emby_library_stats","title":"get_emby_library_stats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_emby_libraries","description":"List Emby library folders (Movies, TV, Music, etc.) with collection types.\n    USE WHEN: user wants library inventory, or you need a library id for other tools.\n    RETURNS: '[id] name  type=X' per line.","inputSchema":{"type":"object","properties":{}},"logicalName":"get_emby_libraries","displayName":"get_emby_libraries","title":"get_emby_libraries","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"search_emby","description":"Search the Emby library by title.\n    USE WHEN: user asks 'do we have X', 'find Y in Emby', or before calling get_emby_item_details/get_emby_episodes (need item_id).\n    RETURNS: '[id] Type: Name (year)' per hit.\n    Args:\n        media_type: comma-separated — Movie, Series, Episode, MusicAlbum, etc.","inputSchema":{"type":"object","required":["query"],"properties":{"limit":{"type":"integer","default":10},"query":{"type":"string"},"media_type":{"type":"string","default":"Movie,Series,MusicAlbum"}}},"logicalName":"search_emby","displayName":"search_emby","title":"search_emby","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_emby_item_details","description":"Full metadata for one Emby item (movie/show/episode/album).\n    USE WHEN: user asks for details/overview/cast/rating after finding an item via search_emby.\n    RETURNS: Name, Type, Runtime, Rating, Genres, Studios, Cast, Overview.","inputSchema":{"type":"object","required":["item_id"],"properties":{"item_id":{"type":"string"}}},"logicalName":"get_emby_item_details","displayName":"get_emby_item_details","title":"get_emby_item_details","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_emby_sessions","description":"Who is currently streaming from Emby and what they're watching.\n    USE WHEN: user asks 'who's watching', 'what's playing right now', 'any active streams'.\n    RETURNS: 'User @ Device (Client): title [progress%]' per session, or 'No active sessions.'","inputSchema":{"type":"object","properties":{}},"logicalName":"get_emby_sessions","displayName":"get_emby_sessions","title":"get_emby_sessions","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_emby_recently_added","description":"Latest items added to the Emby library.\n    USE WHEN: user asks 'what's new', 'recently added', 'what was just added'.\n    RETURNS: 'Type: title (year)' per item, newest first.\n    Args:\n        media_type: comma-separated — Movie, Series, Episode, MusicAlbum.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":20},"media_type":{"type":"string","default":"Movie,Series,Episode,MusicAlbum"}}},"logicalName":"get_emby_recently_added","displayName":"get_emby_recently_added","title":"get_emby_recently_added","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_emby_next_up","description":"Next unwatched episode for each TV show you're watching.\n    USE WHEN: user asks 'what should I watch next', 'next episode', 'where was I'.\n    RETURNS: 'Series: S##E## - Episode title' per line, or 'Nothing next up.'","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":15}}},"logicalName":"get_emby_next_up","displayName":"get_emby_next_up","title":"get_emby_next_up","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_emby_episodes","description":"List all episodes of a TV series (optionally filtered to one season).\n    USE WHEN: user asks 'list episodes of X', 'season 2 of Y'. Call search_emby first to get series_id.\n    RETURNS: 'S##E## - Episode title' per line.","inputSchema":{"type":"object","required":["series_id"],"properties":{"season":{"type":"integer","default":null},"series_id":{"type":"string"}}},"logicalName":"get_emby_episodes","displayName":"get_emby_episodes","title":"get_emby_episodes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_emby_activity_log","description":"Recent Emby server events (playback, logins, library scans, errors).\n    USE WHEN: user asks about Emby history, recent activity, last played, errors, or troubleshooting.\n    RETURNS: '[timestamp] event — detail' per line, newest first. This is the closest tool to 'last played movie'.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":20}}},"logicalName":"get_emby_activity_log","displayName":"get_emby_activity_log","title":"get_emby_activity_log","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_jellyseerr_requests","description":"List media requests in Jellyseerr (the family's 'I want to watch X' queue).\n    USE WHEN: user asks 'any pending requests', 'what's been requested', 'what's in the queue'.\n    RETURNS: '[id] type status by user tmdb=N date' per request.\n    Args:\n        status: pending, approved, declined, available, processing. Empty = all.","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":20},"status":{"type":"string","default":""}}},"logicalName":"get_jellyseerr_requests","displayName":"get_jellyseerr_requests","title":"get_jellyseerr_requests","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"search_jellyseerr","description":"Search TMDB via Jellyseerr to find a movie/show before requesting it.\n    USE WHEN: user wants to request something but you need the TMDB id; or wants to know if it's already available.\n    RETURNS: '[tmdb:id] Title (year) — status' per hit.\n    Args:\n        media_type: 'movie' or 'tv'.","inputSchema":{"type":"object","required":["query"],"properties":{"query":{"type":"string"},"media_type":{"type":"string","default":"movie"}}},"logicalName":"search_jellyseerr","displayName":"search_jellyseerr","title":"search_jellyseerr","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_jellyseerr_request_details","description":"Full details of one Jellyseerr request by ID.\n    USE WHEN: user asks specifics about a known request (status, seasons, who requested).\n    RETURNS: 8 lines: id, type, status, requester+date, tmdb, seasons, media status, service URL.","inputSchema":{"type":"object","required":["request_id"],"properties":{"request_id":{"type":"integer"}}},"logicalName":"get_jellyseerr_request_details","displayName":"get_jellyseerr_request_details","title":"get_jellyseerr_request_details","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_jellyseerr_stats","description":"Aggregate Jellyseerr request counts.\n    USE WHEN: user asks 'how many pending', 'request totals', 'queue size'.\n    RETURNS: key:value per line (pending, approved, declined, etc.).","inputSchema":{"type":"object","properties":{}},"logicalName":"get_jellyseerr_stats","displayName":"get_jellyseerr_stats","title":"get_jellyseerr_stats","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"create_jellyseerr_request","description":"Submit a new media request to Jellyseerr (routes to Radarr/Sonarr).\n    USE WHEN: user explicitly asks to 'request X', 'add Y to the library'. Always call search_jellyseerr first to get tmdb_id and confirm with user.\n    RETURNS: new request id + status.\n    Args:\n        media_type: 'movie' or 'tv'.\n        seasons: for TV, list of season numbers (e.g. [1,2]); omit/empty for all seasons.","inputSchema":{"type":"object","required":["tmdb_id","media_type"],"properties":{"seasons":{"type":"array","items":{"type":"integer"},"default":null},"tmdb_id":{"type":"integer"},"media_type":{"type":"string"}}},"logicalName":"create_jellyseerr_request","displayName":"create_jellyseerr_request","title":"create_jellyseerr_request","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"approve_jellyseerr_request","description":"Approve a pending Jellyseerr request.\n    USE WHEN: admin user (Ryan) asks to approve a request. Do not approve on behalf of non-admin users.\n    RETURNS: confirmation + new status.","inputSchema":{"type":"object","required":["request_id"],"properties":{"request_id":{"type":"integer"}}},"logicalName":"approve_jellyseerr_request","displayName":"approve_jellyseerr_request","title":"approve_jellyseerr_request","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"decline_jellyseerr_request","description":"Decline a Jellyseerr request (admin action).\n    USE WHEN: admin user explicitly declines. Optional reason is shown to requester.\n    RETURNS: confirmation.","inputSchema":{"type":"object","required":["request_id"],"properties":{"reason":{"type":"string","default":""},"request_id":{"type":"integer"}}},"logicalName":"decline_jellyseerr_request","displayName":"decline_jellyseerr_request","title":"decline_jellyseerr_request","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"delete_jellyseerr_request","description":"Permanently remove a request from Jellyseerr (does not delete the media).\n    USE WHEN: admin asks to delete/remove a request entry. Destructive — confirm intent first.\n    RETURNS: confirmation.","inputSchema":{"type":"object","required":["request_id"],"properties":{"request_id":{"type":"integer"}}},"logicalName":"delete_jellyseerr_request","displayName":"delete_jellyseerr_request","title":"delete_jellyseerr_request","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"retry_jellyseerr_request","description":"Re-send a failed request to Radarr/Sonarr.\n    USE WHEN: a request is stuck or failed and user asks to retry.\n    RETURNS: confirmation + new status.","inputSchema":{"type":"object","required":["request_id"],"properties":{"request_id":{"type":"integer"}}},"logicalName":"retry_jellyseerr_request","displayName":"retry_jellyseerr_request","title":"retry_jellyseerr_request","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_host_processes","description":"List native Windows processes on node0 (NOT containers — use list_docker_containers for those).\n    USE WHEN: user asks about a Windows process, RAM/CPU usage, or to find a PID.\n    RETURNS: list of dicts (name, pid, rss_mb, cpu_pct, exe), sorted by RSS desc.\n    Args:\n        filter: case-insensitive substring on process name. Empty = all (top by RSS).","inputSchema":{"type":"object","properties":{"limit":{"type":"integer","default":50},"filter":{"type":"string","default":""}}},"logicalName":"get_host_processes","displayName":"get_host_processes","title":"get_host_processes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_host_services","description":"List Windows services on node0 (running first).\n    USE WHEN: user asks about a Windows service status, or whether something is installed.\n    RETURNS: list of dicts (name, display_name, status, start_type).\n    Args:\n        filter: substring on service name or display name.\n        status: 'running', 'stopped', 'paused'. Empty = any.","inputSchema":{"type":"object","properties":{"filter":{"type":"string","default":""},"status":{"type":"string","default":""}}},"logicalName":"get_host_services","displayName":"get_host_services","title":"get_host_services","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_listening_ports","description":"Show what process owns each listening TCP/UDP port on node0.\n    USE WHEN: user asks 'what's on port N', 'what port does X use', 'is something listening on Y'. THIS IS THE TOOL for any port question — never guess defaults.\n    RETURNS: list of dicts (port, ip, pid, process, proto).\n    Args:\n        filter: case-insensitive substring on process name, or exact port number as string.","inputSchema":{"type":"object","properties":{"filter":{"type":"string","default":""}}},"logicalName":"get_listening_ports","displayName":"get_listening_ports","title":"get_listening_ports","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_host_disks","description":"Disk partition usage on node0 (C:, D:, H:, etc.) plus per-disk IO.\n    USE WHEN: user asks about disk space, free space, drive usage, capacity.\n    RETURNS: dict with 'partitions' (mountpoint, total_gb, used_gb, free_gb, pct) and 'io' (read/write per disk).","inputSchema":{"type":"object","properties":{}},"logicalName":"get_host_disks","displayName":"get_host_disks","title":"get_host_disks","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_host_network_io","description":"Per-NIC network statistics on node0.\n    USE WHEN: user asks about network throughput, link state, errors, NIC speed.\n    RETURNS: list per NIC (name, ipv4, link, speed_mbps, bytes_sent, bytes_recv, errors, drops).","inputSchema":{"type":"object","properties":{}},"logicalName":"get_host_network_io","displayName":"get_host_network_io","title":"get_host_network_io","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_host_uptime","description":"How long node0 has been running.\n    USE WHEN: user asks 'how long has it been up', 'last boot', 'uptime'.\n    RETURNS: dict with boot_time, uptime_seconds, uptime_human.","inputSchema":{"type":"object","properties":{}},"logicalName":"get_host_uptime","displayName":"get_host_uptime","title":"get_host_uptime","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_host_users","description":"Users currently logged in to the node0 Windows host.\n    USE WHEN: user asks 'who's logged in', 'any sessions', 'active users'.\n    RETURNS: list of dicts (name, terminal, host, started, pid).","inputSchema":{"type":"object","properties":{}},"logicalName":"get_host_users","displayName":"get_host_users","title":"get_host_users","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"find_files","description":"Find files by NAME on node0 (filename glob, not content).\n    USE WHEN: user asks 'is there a file named X', 'where is file Y', 'find *.ps1'. For searching INSIDE files use grep_files instead.\n    RETURNS: dict with count, truncated, hits (list of paths).\n    Args:\n        pattern: fnmatch glob — '*.ps1', 'docker-compose*', '*nginx*.conf'. Case-insensitive.\n        path: optional sub-path to narrow (must be under C:\\node0 or C:\\node, e.g. 'C:\\node0\\Scripts').\n    Scope: ONLY C:\\node0 and C:\\node","inputSchema":{"type":"object","required":["pattern"],"properties":{"path":{"type":"string","default":""},"limit":{"type":"integer","default":100},"pattern":{"type":"string"}}},"logicalName":"find_files","displayName":"find_files","title":"find_files","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"grep_files","description":"Search INSIDE file contents on node0 for a substring (not regex).\n    USE WHEN: user asks 'find references to X', 'which file mentions Y', 'grep for Z'. For finding files by name use find_files.\n    RETURNS: dict with count, truncated, hits (list of {path, line_no, line}).\n    Args:\n        query: substring to find.\n        path: optional sub-path to narrow.\n        extensions: comma-separated like '.py,.yml,.md'. Empty = all text-ish files.\n    Scope: ONLY C:\\node0 and C:\\node. Skips files >5MB","inputSchema":{"type":"object","required":["query"],"properties":{"path":{"type":"string","default":""},"limit":{"type":"integer","default":100},"query":{"type":"string"},"extensions":{"type":"string","default":""},"ignore_case":{"type":"boolean","default":true}}},"logicalName":"grep_files","displayName":"grep_files","title":"grep_files","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_container_health","description":"Docker container health status (deeper than list_docker_containers).\n    USE WHEN: user asks about container HEALTH specifically, or for ops audits / what's broken.\n    RETURNS: list per container (name, state, health, image, restart_count, started_at).\n    Args:\n        unhealthy_only: True to return ONLY containers that are unhealthy or not running.","inputSchema":{"type":"object","properties":{"unhealthy_only":{"type":"boolean","default":false}}},"logicalName":"get_container_health","displayName":"get_container_health","title":"get_container_health","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_host_dir_sizes","description":"Find which subdirectories are taking up space.\n    USE WHEN: user asks 'what's eating my disk', 'biggest folders under X', drilling into disk usage.\n    RETURNS: tree of dirs with recursive sizes, sorted largest-first. Capped at 30s; partial flagged truncated=true.\n    Args:\n        path: directory to inspect (must be under C:\\node0 or C:\\node).\n        depth: recursion depth in returned tree (1-3). Each subdir still gets full recursive size.\n        top_n: max entries per level.","inputSchema":{"type":"object","required":["path"],"properties":{"path":{"type":"string"},"depth":{"type":"integer","default":1},"top_n":{"type":"integer","default":20}}},"logicalName":"get_host_dir_sizes","displayName":"get_host_dir_sizes","title":"get_host_dir_sizes","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_host_physical_disks","description":"Physical disk inventory + SMART health on node0.\n    USE WHEN: user asks about disk health, SMART status, drive temps, power-on hours, wear, serials.\n    RETURNS: list per physical disk (model, serial, bus, size_gb, health, drive_letters, temp_c, wear_pct, smart_passed, power_on_hours).","inputSchema":{"type":"object","properties":{"include_smart":{"type":"boolean","default":true}}},"logicalName":"get_host_physical_disks","displayName":"get_host_physical_disks","title":"get_host_physical_disks","annotations":{"untrustedContentHint":true,"readOnlyHint":true}},{"name":"get_host_scheduled_tasks","description":"Windows Scheduled Tasks on node0 (Microsoft\\* hidden by default).\n    USE WHEN: user asks about scheduled jobs, last run results, what's automated, cron-like questions.\n    RETURNS: list per task (name, path, state, last_run_time, last_result, next_run_time). last_result=0 means success.\n    Args:\n        filter: token-AND match on task name/path. Whitespace/hyphens/underscores act as word boundaries —\n            filter='Content Engine' matches 'Content-Engine-Hourly-00'. Single token broadens,","inputSchema":{"type":"object","properties":{"state":{"type":"string","default":""},"filter":{"type":"string","default":""}}},"logicalName":"get_host_scheduled_tasks","displayName":"get_host_scheduled_tasks","title":"get_host_scheduled_tasks","annotations":{"untrustedContentHint":true,"readOnlyHint":true}}],"toolSource":"directory_preview","agentAction":"both","installLinks":[{"id":"cursor","label":"Cursor","href":"cursor://anysphere.cursor-deeplink/mcp/install?name=The-Cushing-Family---Oregon&config=eyJ1cmwiOiAiaHR0cHM6Ly9tY3AuY3VzaGluZy5jYy9tY3AifQ%3D%3D"},{"id":"vscode","label":"VS Code","href":"vscode:mcp/install?%7B%22name%22%3A%22The-Cushing-Family---Oregon%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.cushing.cc%2Fmcp%22%7D"},{"id":"vscode-insiders","label":"VS Code Insiders","href":"vscode-insiders:mcp/install?%7B%22name%22%3A%22The-Cushing-Family---Oregon%22%2C%22type%22%3A%22http%22%2C%22url%22%3A%22https%3A%2F%2Fmcp.cushing.cc%2Fmcp%22%7D"},{"id":"claude-web","label":"Claude.ai","href":"https://claude.ai/customize/connectors?modal=add-custom-connector&connectorName=The+Cushing+Family+-+Oregon&connectorUrl=https%3A%2F%2Fmcp.cushing.cc%2Fmcp"},{"id":"codex","label":"Codex","copyText":"codex mcp add \"The-Cushing-Family---Oregon\" --url \"https://mcp.cushing.cc/mcp\""},{"id":"chatgpt","label":"ChatGPT","href":"https://www.mcpbundles.com/docs/integrations/chatgpt"}],"catalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/cushing-mcp-2497293b41","callUrl":"https://www.mcpbundles.com/api/directory/v1/servers/cushing-mcp-2497293b41/tools/{tool}","mcpServerUrl":"https://mcp.cushing.cc/mcp","liveCatalogUrl":"https://www.mcpbundles.com/api/directory/v1/servers/cushing-mcp-2497293b41?live=1"}