# mcpctl fish completions # Erase any stale completions from previous versions complete -c mcpctl -e set -l commands status login logout config get describe delete logs create edit apply patch backup restore mcp console approve help set -l project_commands attach-server detach-server get describe delete logs create edit help # Disable file completions by default complete -c mcpctl -f # Global options complete -c mcpctl -s v -l version -d 'Show version' complete -c mcpctl -l daemon-url -d 'mcplocal daemon URL' -x complete -c mcpctl -l direct -d 'Bypass mcplocal, connect directly to mcpd' complete -c mcpctl -l project -d 'Target project context' -x complete -c mcpctl -s h -l help -d 'Show help' # Helper: check if --project was given function __mcpctl_has_project set -l tokens (commandline -opc) for i in (seq (count $tokens)) if test "$tokens[$i]" = "--project" return 0 end end return 1 end # Helper: check if a resource type has been selected after get/describe/delete/edit set -l resources servers instances secrets templates projects users groups rbac prompts promptrequests # All accepted resource aliases (plural + singular + short forms) set -l resource_aliases servers server srv instances instance inst secrets secret sec templates template tpl projects project proj users user groups group rbac rbac-definition rbac-binding prompts prompt promptrequests promptrequest pr function __mcpctl_needs_resource_type set -l tokens (commandline -opc) set -l found_cmd false for tok in $tokens if $found_cmd # Check if next token after get/describe/delete/edit is a resource type or alias if contains -- $tok $resource_aliases return 1 # resource type already present end end if contains -- $tok get describe delete edit patch set found_cmd true end end if $found_cmd return 0 # command found but no resource type yet end return 1 end # Map any resource alias to the canonical plural form for API calls function __mcpctl_resolve_resource switch $argv[1] case server srv servers; echo servers case instance inst instances; echo instances case secret sec secrets; echo secrets case template tpl templates; echo templates case project proj projects; echo projects case user users; echo users case group groups; echo groups case rbac rbac-definition rbac-binding; echo rbac case prompt prompts; echo prompts case promptrequest promptrequests pr; echo promptrequests case '*'; echo $argv[1] end end function __mcpctl_get_resource_type set -l tokens (commandline -opc) set -l found_cmd false for tok in $tokens if $found_cmd if contains -- $tok $resource_aliases __mcpctl_resolve_resource $tok return end end if contains -- $tok get describe delete edit patch set found_cmd true end end end # Fetch resource names dynamically from the API (jq extracts only top-level names) function __mcpctl_resource_names set -l resource (__mcpctl_get_resource_type) if test -z "$resource" return end # Instances don't have a name field — use server.name instead if test "$resource" = "instances" mcpctl get instances -o json 2>/dev/null | jq -r '.[][].server.name' 2>/dev/null else if test "$resource" = "prompts" -o "$resource" = "promptrequests" # Use -A to include all projects, not just global mcpctl get $resource -A -o json 2>/dev/null | jq -r '.[][].name' 2>/dev/null else mcpctl get $resource -o json 2>/dev/null | jq -r '.[][].name' 2>/dev/null end end # Fetch project names for --project value function __mcpctl_project_names mcpctl get projects -o json 2>/dev/null | jq -r '.[][].name' 2>/dev/null end # Helper: get the --project value from the command line function __mcpctl_get_project_value set -l tokens (commandline -opc) for i in (seq (count $tokens)) if test "$tokens[$i]" = "--project"; and test $i -lt (count $tokens) echo $tokens[(math $i + 1)] return end end end # Servers currently attached to the project (for detach-server) function __mcpctl_project_servers set -l proj (__mcpctl_get_project_value) if test -z "$proj" return end mcpctl --project $proj get servers -o json 2>/dev/null | jq -r '.[][].name' 2>/dev/null end # Servers NOT attached to the project (for attach-server) function __mcpctl_available_servers set -l proj (__mcpctl_get_project_value) if test -z "$proj" # No project — show all servers mcpctl get servers -o json 2>/dev/null | jq -r '.[][].name' 2>/dev/null return end set -l all (mcpctl get servers -o json 2>/dev/null | jq -r '.[][].name' 2>/dev/null) set -l attached (mcpctl --project $proj get servers -o json 2>/dev/null | jq -r '.[][].name' 2>/dev/null) for s in $all if not contains -- $s $attached echo $s end end end # --project value completion complete -c mcpctl -l project -xa '(__mcpctl_project_names)' # Top-level commands (without --project) complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a status -d 'Show status and connectivity' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a login -d 'Authenticate with mcpd' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a logout -d 'Log out' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a config -d 'Manage configuration' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a get -d 'List resources' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a describe -d 'Show resource details' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a delete -d 'Delete a resource' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a logs -d 'Get instance logs' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a create -d 'Create a resource' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a edit -d 'Edit a resource' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a apply -d 'Apply configuration from file' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a backup -d 'Backup configuration' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a restore -d 'Restore from backup' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a patch -d 'Patch a resource field' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a console -d 'Interactive MCP console' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a approve -d 'Approve a prompt request' complete -c mcpctl -n "not __mcpctl_has_project; and not __fish_seen_subcommand_from $commands" -a help -d 'Show help' # Project-scoped commands (with --project) complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a attach-server -d 'Attach a server to the project' complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a detach-server -d 'Detach a server from the project' complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a get -d 'List resources (scoped to project)' complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a describe -d 'Show resource details' complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a delete -d 'Delete a resource' complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a logs -d 'Get instance logs' complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a create -d 'Create a resource' complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a edit -d 'Edit a resource' complete -c mcpctl -n "__mcpctl_has_project; and not __fish_seen_subcommand_from $project_commands" -a help -d 'Show help' # Resource types — only when resource type not yet selected complete -c mcpctl -n "__fish_seen_subcommand_from get describe delete patch; and __mcpctl_needs_resource_type" -a "$resources" -d 'Resource type' complete -c mcpctl -n "__fish_seen_subcommand_from edit; and __mcpctl_needs_resource_type" -a 'servers secrets projects groups rbac prompts promptrequests' -d 'Resource type' # Resource names — after resource type is selected complete -c mcpctl -n "__fish_seen_subcommand_from get describe delete edit patch; and not __mcpctl_needs_resource_type" -a '(__mcpctl_resource_names)' -d 'Resource name' # Helper: check if attach-server/detach-server already has a server argument function __mcpctl_needs_server_arg set -l tokens (commandline -opc) set -l found_cmd false for tok in $tokens if $found_cmd if not string match -q -- '-*' $tok return 1 # server arg already present end end if contains -- $tok attach-server detach-server set found_cmd true end end if $found_cmd return 0 # command found but no server arg yet end return 1 end # attach-server: show servers NOT in the project (only if no server arg yet) complete -c mcpctl -n "__fish_seen_subcommand_from attach-server; and __mcpctl_needs_server_arg" -a '(__mcpctl_available_servers)' -d 'Server' # detach-server: show servers IN the project (only if no server arg yet) complete -c mcpctl -n "__fish_seen_subcommand_from detach-server; and __mcpctl_needs_server_arg" -a '(__mcpctl_project_servers)' -d 'Server' # get/describe options complete -c mcpctl -n "__fish_seen_subcommand_from get" -s o -l output -d 'Output format' -xa 'table json yaml' complete -c mcpctl -n "__fish_seen_subcommand_from get" -l project -d 'Filter by project' -xa '(__mcpctl_project_names)' complete -c mcpctl -n "__fish_seen_subcommand_from get" -s A -l all -d 'Show all resources across projects' complete -c mcpctl -n "__fish_seen_subcommand_from describe" -s o -l output -d 'Output format' -xa 'detail json yaml' complete -c mcpctl -n "__fish_seen_subcommand_from describe" -l show-values -d 'Show secret values' # login options complete -c mcpctl -n "__fish_seen_subcommand_from login" -l url -d 'mcpd URL' -x complete -c mcpctl -n "__fish_seen_subcommand_from login" -l email -d 'Email address' -x complete -c mcpctl -n "__fish_seen_subcommand_from login" -l password -d 'Password' -x # config subcommands set -l config_cmds view set path reset claude claude-generate setup impersonate complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a view -d 'Show configuration' complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a set -d 'Set a config value' complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a path -d 'Show config file path' complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a reset -d 'Reset to defaults' complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a claude -d 'Generate .mcp.json for project' complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a setup -d 'Configure LLM provider' complete -c mcpctl -n "__fish_seen_subcommand_from config; and not __fish_seen_subcommand_from $config_cmds" -a impersonate -d 'Impersonate a user' # create subcommands set -l create_cmds server secret project user group rbac prompt promptrequest complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a server -d 'Create a server' complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a secret -d 'Create a secret' complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a project -d 'Create a project' complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a user -d 'Create a user' complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a group -d 'Create a group' complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a rbac -d 'Create an RBAC binding' complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a prompt -d 'Create an approved prompt' complete -c mcpctl -n "__fish_seen_subcommand_from create; and not __fish_seen_subcommand_from $create_cmds" -a promptrequest -d 'Create a prompt request' # create prompt/promptrequest options complete -c mcpctl -n "__fish_seen_subcommand_from create; and __fish_seen_subcommand_from prompt promptrequest" -l project -d 'Project name' -xa '(__mcpctl_project_names)' complete -c mcpctl -n "__fish_seen_subcommand_from create; and __fish_seen_subcommand_from prompt promptrequest" -l content -d 'Prompt content text' -x complete -c mcpctl -n "__fish_seen_subcommand_from create; and __fish_seen_subcommand_from prompt promptrequest" -l content-file -d 'Read content from file' -rF complete -c mcpctl -n "__fish_seen_subcommand_from create; and __fish_seen_subcommand_from prompt promptrequest" -l priority -d 'Priority 1-10' -xa '(seq 1 10)' complete -c mcpctl -n "__fish_seen_subcommand_from create; and __fish_seen_subcommand_from prompt" -l link -d 'Link to MCP resource (project/server:uri)' -x # create project --gated/--no-gated complete -c mcpctl -n "__fish_seen_subcommand_from create; and __fish_seen_subcommand_from project" -l gated -d 'Enable gated sessions' complete -c mcpctl -n "__fish_seen_subcommand_from create; and __fish_seen_subcommand_from project" -l no-gated -d 'Disable gated sessions' # logs: takes a server/instance name, then options function __mcpctl_instance_names mcpctl get instances -o json 2>/dev/null | jq -r '.[][].server.name' 2>/dev/null end complete -c mcpctl -n "__fish_seen_subcommand_from logs" -a '(__mcpctl_instance_names)' -d 'Server name' complete -c mcpctl -n "__fish_seen_subcommand_from logs" -l tail -d 'Number of lines' -x complete -c mcpctl -n "__fish_seen_subcommand_from logs" -l since -d 'Since timestamp' -x complete -c mcpctl -n "__fish_seen_subcommand_from logs" -s f -l follow -d 'Follow log output' # backup options complete -c mcpctl -n "__fish_seen_subcommand_from backup" -s o -l output -d 'Output file' -rF complete -c mcpctl -n "__fish_seen_subcommand_from backup" -s p -l password -d 'Encryption password' -x # restore options complete -c mcpctl -n "__fish_seen_subcommand_from restore" -s i -l input -d 'Input file' -rF complete -c mcpctl -n "__fish_seen_subcommand_from restore" -s p -l password -d 'Decryption password' -x complete -c mcpctl -n "__fish_seen_subcommand_from restore" -s c -l conflict -d 'Conflict strategy' -xa 'skip overwrite fail' # approve: first arg is resource type, second is name function __mcpctl_approve_needs_type set -l tokens (commandline -opc) set -l found false for tok in $tokens if $found if contains -- $tok promptrequest promptrequests return 1 # type already given end end if test "$tok" = "approve" set found true end end if $found return 0 # approve found but no type yet end return 1 end function __mcpctl_approve_needs_name set -l tokens (commandline -opc) set -l found_type false for tok in $tokens if $found_type # next non-flag token after type is the name if not string match -q -- '-*' $tok return 1 # name already given end end if contains -- $tok promptrequest promptrequests set found_type true end end if $found_type return 0 # type given but no name yet end return 1 end function __mcpctl_promptrequest_names mcpctl get promptrequests -A -o json 2>/dev/null | jq -r '.[][].name' 2>/dev/null end complete -c mcpctl -n "__fish_seen_subcommand_from approve; and __mcpctl_approve_needs_type" -a 'promptrequest' -d 'Resource type' complete -c mcpctl -n "__fish_seen_subcommand_from approve; and __mcpctl_approve_needs_name" -a '(__mcpctl_promptrequest_names)' -d 'Prompt request name' # console: takes a project name as first argument function __mcpctl_console_needs_project set -l tokens (commandline -opc) set -l found false for tok in $tokens if $found if not string match -q -- '-*' $tok return 1 # project arg already present end end if test "$tok" = "console" set found true end end if $found return 0 # console found but no project yet end return 1 end complete -c mcpctl -n "__fish_seen_subcommand_from console; and __mcpctl_console_needs_project" -a '(__mcpctl_project_names)' -d 'Project name' # apply takes a file complete -c mcpctl -n "__fish_seen_subcommand_from apply" -s f -l file -d 'Configuration file' -rF complete -c mcpctl -n "__fish_seen_subcommand_from apply" -F # help completions complete -c mcpctl -n "__fish_seen_subcommand_from help" -a "$commands"