├── .gitignore ├── .repomixignore ├── LICENSE ├── README.md ├── cli ├── go.mod ├── go.sum └── main.go ├── dist ├── mcp_server.prj.xml ├── tasker-mcp-server-cli-aarch64 ├── tasker-mcp-server-cli-x86_64 └── toolDescriptions.json ├── docs └── tasker.xsd ├── examples └── claude_desktop_config.json ├── plugin ├── go.mod ├── go.sum ├── main.go ├── pdk.gen.go ├── prepare.sh └── xtp.toml ├── repomix.config.json └── utils ├── package-lock.json ├── package.json └── xml-to-tools.js /.gitignore: -------------------------------------------------------------------------------- 1 | **/node_modules/ 2 | 3 | repomix-output.* 4 | 5 | docs/llms/ 6 | -------------------------------------------------------------------------------- /.repomixignore: -------------------------------------------------------------------------------- 1 | # Add patterns to ignore here, one per line 2 | # Example: 3 | # *.log 4 | # tmp/ 5 | .gitignore 6 | 7 | dist/*-cli-* 8 | 9 | .repomixignore 10 | repomix.config.json 11 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2025 Luis Sanchez 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tasker MCP 2 | 3 | This document will guide you through setting up and running the Tasker MCP integration, including instructions for installing dependencies, preparing servers, and updating tasks. 4 | 5 | --- 6 | 7 | ## Usage Guide 8 | 9 | ### Step 1: Import the Tasker Profile 10 | 11 | - Import `dist/mcp_server.prj.xml` into your Tasker app. 12 | - After importing, run the `MCP generate_api_key` task to generate an API key for secure access. 13 | 14 | ### Step 2: Select and Run Your Server 15 | 16 | **CLI Server:** 17 | 18 | - From the `dist/` folder, select the correct CLI server binary for your device's architecture, such as `tasker-mcp-server-cli-aarch64`. 19 | - Copy both the binary and the `toolDescriptions.json` file to your device (phone or PC). 20 | - Rename the binary to `mcp-server` after copying. 21 | 22 | **Example:** 23 | 24 | Using `scp`: 25 | 26 | ```bash 27 | scp dist/tasker-mcp-server-cli-aarch64 user@phone_ip:/data/data/com.termux/files/home/mcp-server 28 | ``` 29 | 30 | Using `adb push`: 31 | 32 | ```bash 33 | adb push dist/tasker-mcp-server-cli-aarch64 /data/data/com.termux/files/home/mcp-server 34 | ``` 35 | 36 | - Run the server in SSE mode with: 37 | 38 | ```bash 39 | ./mcp-server --tools /path/to/toolDescriptions.json --tasker-api-key=tk_... --mode sse 40 | ``` 41 | 42 | - Or call it through the stdio transport: 43 | 44 | ```bash 45 | payload='{"jsonrpc": "2.0", "id": 1, "method": "tools/call", "params": { "name": "tasker_flash_text", "arguments": { "text": "Hi" } } }' 46 | echo $payload | ./mcp-server --tools /path/to/toolDescriptions.json --tasker-api-key=tk_... 47 | ``` 48 | 49 | #### Command-Line Flags 50 | 51 | The `tasker-mcp-server-cli` application accepts the following flags: 52 | 53 | - `--tools`: Path to JSON file with Tasker tool definitions. 54 | - `--host`: Host address to listen on for SSE server (default: `0.0.0.0`). 55 | - `--port`: Port to listen on for SSE server (default: `8000`). 56 | - `--mode`: Transport mode: `sse`, or `stdio` (default: `stdio`). 57 | - `--tasker-host`: Tasker server host (default: `0.0.0.0`). 58 | - `--tasker-port`: Tasker server port (default: `1821`). 59 | - `--tasker-api-key`: The Tasker API Key. 60 | 61 | ### Step 3: Connect Your MCP-enabled App 62 | 63 | - Connect your MCP-enabled application by pointing it to the running server. 64 | 65 | #### Example Configuration for Claude Desktop with stdio transport 66 | 67 | ```json 68 | { 69 | "mcpServers": { 70 | "tasker": { 71 | "command": "/home/luis/tasker-mcp/dist/tasker-mcp-server-cli-x86_64", 72 | "args": [ 73 | "--tools", 74 | "/home/luis/tasker-mcp/dist/toolDescriptions.json", 75 | "--tasker-host", 76 | "192.168.1.123", 77 | "--tasker-api-key", 78 | "tk_...", 79 | "--mode", 80 | "stdio" 81 | ] 82 | } 83 | } 84 | } 85 | ``` 86 | 87 | --- 88 | 89 | ## Building the CLI Server Yourself 90 | 91 | ### Unix/Linux: 92 | 93 | - Install Go using your package manager: 94 | 95 | ```bash 96 | sudo apt-get install golang-go 97 | ``` 98 | 99 | - Build the CLI server (cross-compiling example for ARM64): 100 | 101 | ```bash 102 | cd cli 103 | GOOS=linux GOARCH=arm64 go build -o dist/tasker-mcp-server-cli-aarch64 main.go 104 | ``` 105 | 106 | --- 107 | 108 | ## Updating the MCP Profile with Additional Tasks 109 | 110 | Due to limitations in Tasker's argument handling, follow these steps carefully to mark tasks as MCP-enabled: 111 | 112 | ### Step 1: Set Task Comment 113 | 114 | - Add a comment directly in the task settings. This comment becomes the tool description. 115 | 116 | ### Step 2: Configure Tool Arguments Using Task Variables 117 | 118 | Tasker supports only two positional arguments (`par1`, `par2`). To work around this, we'll use Task Variables: 119 | 120 | - **A TaskVariable becomes an MCP argument if:** 121 | 1. **Configure on Import**: unchecked 122 | 2. **Immutable**: true 123 | 3. **Value**: empty 124 | 125 | After setting the above values you can also set some additional metadata: 126 | 127 | - **Metadata mapping:** 128 | - **Type**: Derived from Task Variable's type (`number`, `string`, `onoff`, etc). 129 | - **Description**: Set via the variable's `Prompt` field. 130 | - **Required**: If the `Same as Value` field is checked. 131 | 132 | **Note:** Temporarily enable "Configure on Import" to set the Prompt description if hidden, then disable it again. The prompt will survive.\ 133 | 134 | 135 | These steps will make sure valid tool descriptions can be generated when we export our custom project later.\ 136 | Task Variables cannot be pass-through from other tasks, though, so we need to do one last thing in order to get all the variables from the MCP request properly set. 137 | 138 | ### Step 3: Copy the special action 139 | 140 | Copy the action `MCP#parse_args` to the top of your MCP task to enable argument parsing. You can get this from any of the default tasks. But do not modify this action! 141 | 142 | ### Step 4: Exporting and Generating Updated Tool Descriptions 143 | 144 | Now your custom tasks are ready: 145 | 146 | - Export your `mcp-server` project and save it on your PC. 147 | - Ensure Node.js is installed, then run: 148 | 149 | ```bash 150 | cd utils 151 | npm install 152 | node xml-to-tools.js /path/to/your/exported/mcp_server.prj.xml > toolDescriptions.json 153 | ``` 154 | 155 | Use this `toolDescriptions.json` file with your server. 156 | 157 | --- 158 | 159 | Happy automation! 160 | 161 | -------------------------------------------------------------------------------- /cli/go.mod: -------------------------------------------------------------------------------- 1 | module cli 2 | 3 | go 1.23.7 4 | 5 | require github.com/dceluis/mcp-go v0.0.0-20250310024233-0431826d7f09 6 | 7 | require github.com/google/uuid v1.6.0 // indirect 8 | -------------------------------------------------------------------------------- /cli/go.sum: -------------------------------------------------------------------------------- 1 | github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= 2 | github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= 3 | github.com/dceluis/mcp-go v0.0.0-20250310024233-0431826d7f09 h1:pjXafo7WPSM4pXx+XyPI60nIHaMGVcTiGwjilZjutTM= 4 | github.com/dceluis/mcp-go v0.0.0-20250310024233-0431826d7f09/go.mod h1:ANwC+LJnudFGKPOUlJQFqeVfqhbpaq5XdLlVQy/eea0= 5 | github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0= 6 | github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= 7 | github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= 8 | github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= 9 | github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= 10 | github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= 11 | gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= 12 | gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= 13 | -------------------------------------------------------------------------------- /cli/main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "bytes" 5 | "context" 6 | "encoding/json" 7 | "flag" 8 | "fmt" 9 | "io" 10 | "log" 11 | "net/http" 12 | "os" 13 | 14 | "github.com/dceluis/mcp-go/mcp" 15 | "github.com/dceluis/mcp-go/server" 16 | ) 17 | 18 | // Global variables for Tasker server host and port. 19 | var toolsPath string 20 | var taskerHost string 21 | var taskerPort string 22 | var taskerApiKey string 23 | 24 | // GenericMap is a new type for tool arguments. 25 | type GenericMap map[string]interface{} 26 | 27 | // TaskerTool defines the structure for a tool loaded from JSON. 28 | type TaskerTool struct { 29 | TaskerName string `json:"tasker_name"` 30 | Name string `json:"name"` 31 | Description string `json:"description"` 32 | InputSchema map[string]interface{} `json:"inputSchema"` 33 | } 34 | 35 | // genericToolHandler returns a tool handler function for a given Tasker tool. 36 | func genericToolHandler(tool TaskerTool) server.ToolHandlerFunc { 37 | return func(ctx context.Context, request mcp.CallToolRequest) (*mcp.CallToolResult, error) { 38 | args := request.Params.Arguments 39 | if args == nil { 40 | return mcp.NewToolResultError("Arguments must be provided"), nil 41 | } 42 | // Log the tool call. 43 | log.Printf("Tool called: %s with args: %+v", tool.Name, args) 44 | // Execute the Tasker task. 45 | result, err := runTaskerTask(tool.TaskerName, args) 46 | if err != nil { 47 | return nil, err 48 | } 49 | // Return the result using the new result constructor. 50 | return mcp.NewToolResultText(result), nil 51 | } 52 | } 53 | 54 | // runTaskerTask sends an HTTP POST to the Tasker endpoint to execute the task. 55 | func runTaskerTask(taskerName string, args map[string]interface{}) (string, error) { 56 | payload := map[string]interface{}{ 57 | "name": taskerName, 58 | "arguments": args, 59 | } 60 | jsonData, err := json.Marshal(payload) 61 | if err != nil { 62 | return "", err 63 | } 64 | 65 | // Build the URL using the specified taskerHost and taskerPort. 66 | taskerURL := fmt.Sprintf("http://%s:%s/run_task", taskerHost, taskerPort) 67 | req, err := http.NewRequest("POST", taskerURL, bytes.NewBuffer(jsonData)) 68 | if err != nil { 69 | return "", err 70 | } 71 | req.Header.Set("Content-Type", "application/json") 72 | if taskerApiKey != "" { 73 | req.Header.Set("Authorization", "Bearer "+taskerApiKey) 74 | } 75 | client := &http.Client{} 76 | resp, err := client.Do(req) 77 | if err != nil { 78 | return "", err 79 | } 80 | defer resp.Body.Close() 81 | 82 | if resp.StatusCode != http.StatusOK { 83 | bodyBytes, _ := io.ReadAll(resp.Body) 84 | return "", fmt.Errorf("HTTP error: %d, body: %s", resp.StatusCode, string(bodyBytes)) 85 | } 86 | 87 | bodyBytes, err := io.ReadAll(resp.Body) 88 | if err != nil { 89 | return "", err 90 | } 91 | return string(bodyBytes), nil 92 | } 93 | 94 | // loadToolsFromFile reads and unmarshals the JSON file containing tool definitions. 95 | func loadToolsFromFile(filePath string) ([]TaskerTool, error) { 96 | fileBytes, err := os.ReadFile(filePath) 97 | if err != nil { 98 | return nil, err 99 | } 100 | var tools []TaskerTool 101 | if err := json.Unmarshal(fileBytes, &tools); err != nil { 102 | return nil, err 103 | } 104 | return tools, nil 105 | } 106 | 107 | func NewMCPServer() *server.MCPServer { 108 | mcpServer := server.NewMCPServer( 109 | "tasker-mcp-server", 110 | "1.0.0", 111 | server.WithLogging(), 112 | ) 113 | 114 | taskerTools, err := loadToolsFromFile(toolsPath) 115 | if err != nil { 116 | log.Fatalf("Failed to load tools from file: %v", err) 117 | } 118 | 119 | // Map to hold tool handlers for STDIO transport. 120 | toolHandlers := make(map[string]server.ToolHandlerFunc) 121 | 122 | for _, tool := range taskerTools { 123 | // Since tool.InputSchema is already a map[string]interface{}, assign it directly. 124 | inputSchema := tool.InputSchema 125 | 126 | var opts []mcp.ToolOption 127 | // Check if inputSchema is not nil. 128 | if inputSchema != nil { 129 | // Extract required fields if available. 130 | var required []string 131 | if req, ok := inputSchema["required"].([]interface{}); ok { 132 | for _, r := range req { 133 | if str, ok := r.(string); ok { 134 | required = append(required, str) 135 | } 136 | } 137 | } 138 | // Process properties. 139 | if props, ok := inputSchema["properties"].(map[string]interface{}); ok { 140 | for key, propRaw := range props { 141 | if prop, ok := propRaw.(map[string]interface{}); ok { 142 | desc := "" 143 | if d, ok := prop["description"].(string); ok { 144 | desc = d 145 | } 146 | var propOpts []mcp.PropertyOption 147 | for _, reqKey := range required { 148 | if reqKey == key { 149 | propOpts = append(propOpts, mcp.Required()) 150 | break 151 | } 152 | } 153 | if desc != "" { 154 | propOpts = append(propOpts, mcp.Description(desc)) 155 | } 156 | // Based on type, add the proper argument option. 157 | switch t := prop["type"].(string); t { 158 | case "string": 159 | opts = append(opts, mcp.WithString(key, propOpts...)) 160 | case "number": 161 | opts = append(opts, mcp.WithNumber(key, propOpts...)) 162 | default: 163 | opts = append(opts, mcp.WithString(key, propOpts...)) 164 | } 165 | } 166 | } 167 | } 168 | } 169 | // Use ... to expand the opts slice into variadic arguments. 170 | allOpts := append([]mcp.ToolOption{mcp.WithDescription(tool.Description)}, opts...) 171 | toolObj := mcp.NewTool(tool.Name, allOpts...) 172 | handler := genericToolHandler(tool) 173 | mcpServer.AddTool(toolObj, handler) 174 | toolHandlers[tool.Name] = handler 175 | } 176 | 177 | return mcpServer 178 | } 179 | 180 | func main() { 181 | toolsPathFlag := flag.String("tools", "", "Path to JSON file with Tasker tool definitions") 182 | host := flag.String("host", "0.0.0.0", "Host address to listen on for SSE server (default: 0.0.0.0)") 183 | port := flag.String("port", "8000", "Port to listen on for SSE server (default: 8000)") 184 | mode := flag.String("mode", "stdio", "Transport mode: sse, or stdio (default: stdio)") 185 | taskerHostFlag := flag.String("tasker-host", "0.0.0.0", "Tasker server host (default: 0.0.0.0)") 186 | taskerPortFlag := flag.String("tasker-port", "1821", "Tasker server port (default: 1821)") 187 | taskerApiKeyFlag := flag.String("tasker-api-key", "", "Tasker API Key") 188 | flag.Parse() 189 | 190 | // Set the global Tasker server variables. 191 | taskerHost = *taskerHostFlag 192 | taskerPort = *taskerPortFlag 193 | taskerApiKey = *taskerApiKeyFlag 194 | toolsPath = *toolsPathFlag 195 | 196 | if toolsPath == "" { 197 | log.Fatal("Please provide the -tools flag with the path to the JSON file containing tool definitions") 198 | } 199 | 200 | // Instantiate the MCP server using the new mcp-go-sdk API. 201 | mcpServer := NewMCPServer() 202 | 203 | switch *mode { 204 | case "sse": 205 | addr := fmt.Sprintf("%s:%s", *host, *port) 206 | // Create an SSE server to wrap the MCP server. 207 | sseServer := server.NewSSEServer(mcpServer) 208 | log.Printf("Starting SSE server on %s...", addr) 209 | if err := sseServer.Start(addr); err != nil { 210 | log.Fatalf("SSE server error: %v", err) 211 | } 212 | case "stdio": 213 | if err := server.ServeStdio(mcpServer); err != nil { 214 | log.Fatalf("Server error: %v", err) 215 | } 216 | default: 217 | log.Fatalf("Unknown transport mode: %s", *mode) 218 | } 219 | } 220 | -------------------------------------------------------------------------------- /dist/mcp_server.prj.xml: -------------------------------------------------------------------------------- 1 | 2 | 3 | 1741542333325 4 | 1741630110379 5 | 8 6 | 425 7 | 403 8 | MCP Request Received 9 | 50 10 | 11 | 2089 12 | 0 13 | 14 | 15 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%http_request_body 16 | Body 17 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%http_request_files() 18 | Files 19 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%http_request_multipart_names() 20 | Files 21 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%http_request_multipart_types() 22 | Files 23 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>%http_request_multipart_values() 24 | Files 25 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5>%http_request_headers() 26 | Headers 27 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6>%http_request_ip_address_v4 28 | IP Address v4 29 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7>%http_request_method 30 | Method 31 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8>%http_request_path 32 | Path 33 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES9>%http_request_port 34 | Port 35 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES9><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES10>%http_request_id 36 | Request ID 37 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES10></StringArray> 38 | [Ljava.lang.String; 39 | 40 | 41 | 42 | POST 43 | /run_task 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 1740795769088 52 | mcp-server 53 | 425 54 | 411,417,422,399,400,409,410,421,414,406,401,412,403,418,420,407,405,419,402,424,397,423,398,416,396,408,404,413,173,415 55 | 56 | false 57 | 58 | false 59 | false 60 | 61 | 62 | 10 63 | pj 64 | %tasker_api_key 65 | t 66 | true 67 | 68 | 69 | 70 | 1741624990153 71 | 1741630616832 72 | 173 73 | MCP generate_api_key 74 | 100 75 | 76 | 664 77 | uuid 78 | UUID 79 | randomUUID 80 | {UUID} () 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 664 91 | bytes 92 | byte[] 93 | new 94 | {byte[]} (int) 95 | 16 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 377 105 | false 106 | 107 | 108 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%td_button 109 | Button 110 | The label of the button that was clicked</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0></StringArray> 111 | [Ljava.lang.String; 112 | 113 | 114 | Generated API Key 115 | API Key: %tasker_api_key 116 | 117 | Copy this, store it securely, and use it to configure the MCP server 118 | COPY 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 37 128 | false 129 | 130 | And 131 | 132 | %td_button 133 | 12 134 | 135 | 136 | 137 | %td_button 138 | 0 139 | COPY 140 | 141 | 142 | 143 | 144 | 105 145 | %tasker_api_key 146 | 147 | 148 | 149 | 150 | 151 | 664 152 | bb 153 | ByteBuffer 154 | wrap 155 | {ByteBuffer} (byte[]) 156 | bytes 157 | 158 | 159 | 160 | 161 | 162 | 163 | 164 | 165 | 664 166 | msb 167 | uuid 168 | getMostSignificantBits 169 | {long} () 170 | 171 | 172 | 173 | 174 | 175 | 176 | 177 | 178 | 179 | 664 180 | lsb 181 | uuid 182 | getLeastSignificantBits 183 | {long} () 184 | 185 | 186 | 187 | 188 | 189 | 190 | 191 | 192 | 193 | 664 194 | bb 195 | bb 196 | putLong 197 | {ByteBuffer} (long) 198 | msb 199 | 200 | 201 | 202 | 203 | 204 | 205 | 206 | 207 | 664 208 | bb 209 | bb 210 | putLong 211 | {ByteBuffer} (long) 212 | lsb 213 | 214 | 215 | 216 | 217 | 218 | 219 | 220 | 221 | 664 222 | 223 | %secret 224 | Base64 225 | encodeToString 226 | {String} (byte[], int) 227 | bytes 228 | 9 229 | 230 | 231 | 232 | 233 | 234 | 235 | 236 | 598 237 | %secret 238 | \n 239 | 240 | 241 | 242 | 243 | 244 | 245 | 246 | 247 | 547 248 | %tasker_api_key 249 | tk_%secret 250 | 251 | 252 | 253 | 254 | 255 | 256 | 257 | 258 | 1740942789399 259 | 1741522611859 260 | 396 261 | MCP Set Volume 262 | Sets the phone media volume level. 263 | 100 264 | 265 | 129 266 | 267 | // DO NOT MODIFY THIS ACTION! 268 | // ================================= 269 | // Copy and paste this action to the start of 270 | // any task toenable it as an MCP tool. 271 | // 272 | // Calling this action indirectly through 273 | // Perform Task will not set args correctly. 274 | // ================================= 275 | 276 | // Parse args as local variables 277 | const args = JSON.parse(local('par1')); 278 | 279 | for (const name in args) { 280 | const value = args[name]; 281 | setLocal(name, value); 282 | } 283 | 284 | exit(); 285 | 286 | 287 | 288 | 289 | 290 | %par1 291 | 12 292 | 293 | 294 | 295 | 296 | 297 | 307 298 | 299 | %level 300 | 301 | 302 | 303 | 304 | 305 | %level 306 | 12 307 | 308 | 309 | 310 | 311 | 312 | true 313 | 314 | true 315 | false 316 | The media volume level to set (0-15). max equals 15, min equals 1. 317 | level 318 | 320 319 | t 320 | %level 321 | n 322 | true 323 | 324 | 325 | 326 | 1740942857557 327 | 1741522604065 328 | 397 329 | MCP Get Volume 330 | Retrieves the current phone media volume level. 331 | 332 | 129 333 | 334 | // DO NOT MODIFY THIS ACTION! 335 | // ================================= 336 | // Copy and paste this action to the start of 337 | // any task toenable it as an MCP tool. 338 | // 339 | // Calling this action indirectly through 340 | // Perform Task will not set args correctly. 341 | // ================================= 342 | 343 | // Parse args as local variables 344 | const args = JSON.parse(local('par1')); 345 | 346 | for (const name in args) { 347 | const value = args[name]; 348 | setLocal(name, value); 349 | } 350 | 351 | exit(); 352 | 353 | 354 | 355 | 356 | 357 | %par1 358 | 12 359 | 360 | 361 | 362 | 363 | 364 | 126 365 | %VOLM 366 | 367 | 368 | 369 | 370 | 371 | 372 | 373 | 1740957535727 374 | 1741542437736 375 | 398 376 | MCP Print 377 | Prints a document on the phone. 378 | 100 379 | 380 | 129 381 | 382 | // DO NOT MODIFY THIS ACTION! 383 | // ================================= 384 | // Copy and paste this action to the start of 385 | // any task toenable it as an MCP tool. 386 | // 387 | // Calling this action indirectly through 388 | // Perform Task will not set args correctly. 389 | // ================================= 390 | 391 | // Parse args as local variables 392 | const args = JSON.parse(local('par1')); 393 | 394 | for (const name in args) { 395 | const value = args[name]; 396 | setLocal(name, value); 397 | } 398 | 399 | exit(); 400 | 401 | 402 | 403 | 404 | 405 | %par1 406 | 12 407 | 408 | 409 | 410 | 411 | 412 | 37 413 | false 414 | 415 | 416 | %path 417 | 12 418 | 419 | 420 | 421 | 422 | 423 | 365 424 | 425 | 426 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%content_uri 427 | Content URI 428 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0></StringArray> 429 | [Ljava.lang.String; 430 | 431 | 432 | FilePathToContentUri(%path) 433 | 434 | 435 | 548 436 | false 437 | %content_uri 438 | 439 | 440 | 441 | 442 | 443 | 444 | 445 | 446 | 447 | 448 | 449 | 450 | 451 | 452 | 453 | 454 | 455 | 940160580 456 | false 457 | 458 | 459 | SEND 460 | java.lang.String 461 | AutoShare 462 | java.lang.String 463 | <null> 464 | java.lang.String 465 | application/pdf 466 | java.lang.String 467 | (Uri) %content_uri 468 | java.lang.String 469 | <null> 470 | java.lang.String 471 | <null> 472 | java.lang.String 473 | Package: org.mopria.printplugin 474 | Class: org.mopria.printplugin.ShareToPrintActivity 475 | App: AutoShare 476 | Action: Share 477 | MimeType: application/pdf 478 | File: (Uri) %content_uri 479 | java.lang.String 480 | org.mopria.printplugin.ShareToPrintActivity 481 | java.lang.String 482 | org.mopria.printplugin 483 | java.lang.String 484 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%err 485 | Error Code 486 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%errmsg 487 | Error Message 488 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1></StringArray> 489 | [Ljava.lang.String; 490 | IntentApp configpackage configclass IntentAction IntentMimeType android.intent.extra.STREAMSEND plugininstanceid plugintypeid 491 | java.lang.String 492 | true 493 | java.lang.Boolean 494 | 921a16a1-c5f4-472a-9921-2f291078ddcb 495 | java.lang.String 496 | com.joaomgcd.autoshare.intent.IntentShare 497 | java.lang.String 498 | 499 | 500 | com.joaomgcd.autoshare 501 | com.joaomgcd.autoshare.activity.ActivityConfigShare 502 | 503 | 504 | 505 | 506 | 877 507 | android.intent.action.SEND 508 | 509 | application/pdf 510 | 511 | android.intent.extra.STREAM:(Uri)%content_uri 512 | 513 | 514 | org.mopria.printplugin 515 | org.mopria.printplugin.ShareToPrintActivity 516 | 517 | 518 | 519 | 30 520 | 521 | 522 | 523 | 524 | 525 | 526 | 527 | 107361459 528 | 529 | 530 | <null> 531 | java.lang.String 532 | <null> 533 | java.lang.String 534 | Actions To Perform: click(id,com.android.printspooler:id/print_button) 535 | Not In AutoInput: true 536 | Not In Tasker: true 537 | Separator: , 538 | Check Millis: 1000 539 | java.lang.String 540 | parameters 541 | java.lang.String 542 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ailastbounds 543 | Last Bounds 544 | Bounds (left,top,right,bottom) of the item that the action last interacted with</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%ailastcoordinates 545 | Last Coordinates 546 | Center coordinates (x,y) of the item that the action last interacted with</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%err 547 | Error Code 548 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%errmsg 549 | Error Message 550 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3></StringArray> 551 | [Ljava.lang.String; 552 | parameters plugininstanceid plugintypeid 553 | java.lang.String 554 | true 555 | java.lang.Boolean 556 | {"_action":"click(id,com.android.printspooler:id/print_button)","_additionalOptions":{"checkMs":"1000","preActionDelay":"","separator":",","withCoordinates":false},"_whenToPerformAction":{"notInAutoInput":true,"notInTasker":true},"generatedValues":{}} 557 | java.lang.String 558 | 5582ecbc-28b1-4b00-af94-d6d7501eae77 559 | java.lang.String 560 | com.joaomgcd.autoinput.intent.IntentActionv2 561 | java.lang.String 562 | 563 | 564 | com.joaomgcd.autoinput 565 | com.joaomgcd.autoinput.activity.ActivityConfigActionv2 566 | 567 | 568 | 569 | 570 | true 571 | 572 | true 573 | false 574 | The path to the document to print. 575 | path 576 | 322 577 | t 578 | %path 579 | f 580 | true 581 | 582 | 583 | 584 | 1740961618833 585 | 1741522552121 586 | 399 587 | MCP Set Clipboard 588 | Sets the phone clipboard. 589 | 590 | 129 591 | 592 | // DO NOT MODIFY THIS ACTION! 593 | // ================================= 594 | // Copy and paste this action to the start of 595 | // any task toenable it as an MCP tool. 596 | // 597 | // Calling this action indirectly through 598 | // Perform Task will not set args correctly. 599 | // ================================= 600 | 601 | // Parse args as local variables 602 | const args = JSON.parse(local('par1')); 603 | 604 | for (const name in args) { 605 | const value = args[name]; 606 | setLocal(name, value); 607 | } 608 | 609 | exit(); 610 | 611 | 612 | 613 | 614 | 615 | %par1 616 | 12 617 | 618 | 619 | 620 | 621 | 622 | 105 623 | %text 624 | 625 | 626 | 627 | 628 | 629 | %text 630 | 12 631 | 632 | 633 | 634 | 635 | 636 | true 637 | 638 | true 639 | false 640 | The text to set the phone clipboard to. 641 | text 642 | 323 643 | t 644 | %text 645 | t 646 | true 647 | 648 | 649 | 650 | 1740961618833 651 | 1741522547275 652 | 400 653 | MCP Get Clipboard 654 | Retrieves the current phone text clipboard. 655 | 656 | 129 657 | 658 | // DO NOT MODIFY THIS ACTION! 659 | // ================================= 660 | // Copy and paste this action to the start of 661 | // any task toenable it as an MCP tool. 662 | // 663 | // Calling this action indirectly through 664 | // Perform Task will not set args correctly. 665 | // ================================= 666 | 667 | // Parse args as local variables 668 | const args = JSON.parse(local('par1')); 669 | 670 | for (const name in args) { 671 | const value = args[name]; 672 | setLocal(name, value); 673 | } 674 | 675 | exit(); 676 | 677 | 678 | 679 | 680 | 681 | %par1 682 | 12 683 | 684 | 685 | 686 | 687 | 688 | 402 689 | 690 | 691 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%cl_extras 692 | Extras 693 | Optional extra info in JSON format that the clipboard may contains</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%cl_html_text 694 | HTML Text 695 | Current clipboard text if set as HTML text</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%cl_image_uri 696 | Image URI 697 | If the URI corresponds to an image, this will have a value</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%cl_mimetypes() 698 | Mime Type 699 | The types of data that the clipboard contains</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>%cl_text 700 | Text 701 | Current clipboard text</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5>%cl_uri 702 | URI 703 | Current clipboard URI (could be image or something else)</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5></StringArray> 704 | [Ljava.lang.String; 705 | 706 | 707 | 708 | 709 | 37 710 | 711 | 712 | %cl_text 713 | 9 714 | \%cl_text 715 | 716 | 717 | 718 | 719 | 126 720 | %cl_text 721 | 722 | 723 | 724 | 725 | 726 | 727 | 728 | 1740961810062 729 | 1741593501037 730 | 401 731 | MCP List Files 732 | Retrieves the list of files on the phone's Documents folder. 733 | 100 734 | 735 | 129 736 | 737 | // DO NOT MODIFY THIS ACTION! 738 | // ================================= 739 | // Copy and paste this action to the start of 740 | // any task toenable it as an MCP tool. 741 | // 742 | // Calling this action indirectly through 743 | // Perform Task will not set args correctly. 744 | // ================================= 745 | 746 | // Parse args as local variables 747 | const args = JSON.parse(local('par1')); 748 | 749 | for (const name in args) { 750 | const value = args[name]; 751 | setLocal(name, value); 752 | } 753 | 754 | exit(); 755 | 756 | 757 | 758 | 759 | 760 | %par1 761 | 12 762 | 763 | 764 | 765 | 766 | 767 | 412 768 | Documents 769 | 770 | 771 | 772 | 773 | %files 774 | 775 | 776 | 777 | 592 778 | %files 779 | 780 | 781 | 782 | 783 | 784 | 548 785 | %files 786 | 787 | 788 | 789 | 790 | 791 | 792 | 793 | 794 | 795 | 796 | 797 | 798 | 799 | 800 | 801 | 802 | 803 | %caller() 804 | 2 805 | ui 806 | 807 | 808 | 809 | 810 | 126 811 | %files 812 | 813 | 814 | 815 | 816 | 817 | 818 | 819 | 1740962988274 820 | 1741522496985 821 | 402 822 | MCP Lamp ON 823 | Turns the bedroom lamp on. 824 | 825 | 129 826 | 827 | // DO NOT MODIFY THIS ACTION! 828 | // ================================= 829 | // Copy and paste this action to the start of 830 | // any task toenable it as an MCP tool. 831 | // 832 | // Calling this action indirectly through 833 | // Perform Task will not set args correctly. 834 | // ================================= 835 | 836 | // Parse args as local variables 837 | const args = JSON.parse(local('par1')); 838 | 839 | for (const name in args) { 840 | const value = args[name]; 841 | setLocal(name, value); 842 | } 843 | 844 | exit(); 845 | 846 | 847 | 848 | 849 | 850 | %par1 851 | 12 852 | 853 | 854 | 855 | 856 | 857 | 189227986 858 | 859 | 860 | 861 | Device: Bedside Lamp, Action: ON 862 | java.lang.String 863 | ON 864 | java.lang.String 865 | 685734476 866 | java.lang.String 867 | type_device 868 | java.lang.String 869 | 35402 870 | java.lang.Integer 871 | 872 | java.lang.String 873 | com.yeelight.tasker.extra.PARAM 874 | java.lang.String 875 | true 876 | java.lang.Boolean 877 | 878 | 879 | com.yeelight.cherry 880 | com.yeelight.yeelib_tasker.ui.TaskerEditActivity 881 | 882 | 883 | 884 | 885 | 886 | 1740811870335 887 | 1741630110379 888 | 403 889 | MCP perform_task 890 | 51 891 | 2 892 | 893 | 61 894 | 895 | 896 | 897 | 130 898 | false 899 | MCP print_extras 900 | 901 | %priority 902 | 903 | 904 | 905 | 906 | 907 | 908 | 909 | 910 | 911 | 912 | 913 | 914 | 130 915 | %task_name 916 | 917 | %priority 918 | 919 | 920 | %task_arguments 921 | 922 | %task_result 923 | 924 | 925 | 926 | 927 | 928 | 929 | 930 | 43 931 | 932 | 933 | 130 934 | %task_name 935 | 936 | %priority+1 937 | 938 | 939 | 940 | 941 | %task_result 942 | 943 | 944 | 945 | 946 | 947 | 948 | 949 | 38 950 | 951 | 952 | 37 953 | 954 | 955 | %task_result 956 | 1 957 | \%task_result 958 | 959 | 960 | 961 | 962 | 380 963 | 964 | 965 | <StringArray sr=""/> 966 | [Ljava.lang.String; 967 | 968 | 969 | %http_request_id 970 | 200 971 | 972 | 973 | %task_result 974 | 975 | 976 | 977 | 978 | 979 | 980 | 43 981 | 982 | 983 | 380 984 | 985 | 986 | <StringArray sr=""/> 987 | [Ljava.lang.String; 988 | 989 | 990 | %http_request_id 991 | 200 992 | 993 | 994 | 995 | 996 | 997 | 998 | 999 | 1000 | 1001 | 38 1002 | 1003 | 1004 | 43 1005 | 1006 | 1007 | 37 1008 | 1009 | Or 1010 | 1011 | %tasker_api_key 1012 | 0 1013 | \%tasker_api_key 1014 | 1015 | 1016 | %http_request_headers() 1017 | 5 1018 | %tasker_api_key 1019 | 1020 | 1021 | 1022 | 1023 | 380 1024 | 1025 | 1026 | <StringArray sr=""/> 1027 | [Ljava.lang.String; 1028 | 1029 | 1030 | %http_request_id 1031 | 404 1032 | 1033 | 1034 | 1035 | 1036 | 1037 | 1038 | 1039 | 1040 | 1041 | 38 1042 | 1043 | 1044 | 380 1045 | 1046 | 1047 | <StringArray sr=""/> 1048 | [Ljava.lang.String; 1049 | 1050 | 1051 | %http_request_id 1052 | 403 1053 | 1054 | 1055 | 1056 | 1057 | 1058 | 1059 | 1060 | 1061 | 1062 | 137 1063 | 1064 | 1065 | 1066 | 1067 | 38 1068 | 1069 | 1070 | 547 1071 | %task_name 1072 | %name 1073 | 1074 | 1075 | 1076 | 1077 | 1078 | 1079 | 1080 | %name 1081 | 12 1082 | 1083 | 1084 | 1085 | 1086 | 1087 | 547 1088 | %task_arguments 1089 | %arguments 1090 | 1091 | 1092 | 1093 | 1094 | 1095 | 1096 | 1097 | %arguments 1098 | 12 1099 | 1100 | 1101 | 1102 | 1103 | 1104 | 37 1105 | 1106 | And 1107 | 1108 | %task_name 1109 | 12 1110 | 1111 | 1112 | 1113 | %task_name 1114 | 1 1115 | \%task_name 1116 | 1117 | 1118 | 1119 | 1120 | 37 1121 | false 1122 | 1123 | And 1124 | 1125 | %task_arguments 1126 | 12 1127 | %task_arguments 1128 | 1129 | 1130 | %task_arguments 1131 | 1 1132 | \%task_arguments 1133 | 1134 | 1135 | 1136 | 1137 | 1138 | 1740963031937 1139 | 1741522495824 1140 | 404 1141 | MCP Lamp OFF 1142 | Turns the bedroom lamp off. 1143 | 1144 | 129 1145 | 1146 | // DO NOT MODIFY THIS ACTION! 1147 | // ================================= 1148 | // Copy and paste this action to the start of 1149 | // any task toenable it as an MCP tool. 1150 | // 1151 | // Calling this action indirectly through 1152 | // Perform Task will not set args correctly. 1153 | // ================================= 1154 | 1155 | // Parse args as local variables 1156 | const args = JSON.parse(local('par1')); 1157 | 1158 | for (const name in args) { 1159 | const value = args[name]; 1160 | setLocal(name, value); 1161 | } 1162 | 1163 | exit(); 1164 | 1165 | 1166 | 1167 | 1168 | 1169 | %par1 1170 | 12 1171 | 1172 | 1173 | 1174 | 1175 | 1176 | 189227986 1177 | 1178 | 1179 | Device: Bedside Lamp, Action: OFF 1180 | java.lang.String 1181 | OFF 1182 | java.lang.String 1183 | 685734476 1184 | java.lang.String 1185 | type_device 1186 | java.lang.String 1187 | 35402 1188 | java.lang.Integer 1189 | 1190 | java.lang.String 1191 | com.yeelight.tasker.extra.PARAM 1192 | java.lang.String 1193 | true 1194 | java.lang.Boolean 1195 | 1196 | 1197 | com.yeelight.cherry 1198 | com.yeelight.yeelib_tasker.ui.TaskerEditActivity 1199 | 1200 | 1201 | 1202 | 1203 | 1204 | 1740963538576 1205 | 1741522490784 1206 | 405 1207 | MCP Play Music 1208 | Plays music on the phone. 1209 | 100 1210 | 1211 | 129 1212 | 1213 | // DO NOT MODIFY THIS ACTION! 1214 | // ================================= 1215 | // Copy and paste this action to the start of 1216 | // any task toenable it as an MCP tool. 1217 | // 1218 | // Calling this action indirectly through 1219 | // Perform Task will not set args correctly. 1220 | // ================================= 1221 | 1222 | // Parse args as local variables 1223 | const args = JSON.parse(local('par1')); 1224 | 1225 | for (const name in args) { 1226 | const value = args[name]; 1227 | setLocal(name, value); 1228 | } 1229 | 1230 | exit(); 1231 | 1232 | 1233 | 1234 | 1235 | 1236 | %par1 1237 | 12 1238 | 1239 | 1240 | 1241 | 1242 | 1243 | 547 1244 | false 1245 | %query 1246 | pokemon red ost 1247 | 1248 | 1249 | 1250 | 1251 | 1252 | 1253 | 1254 | %caller() 1255 | 2 1256 | ui 1257 | 1258 | 1259 | 1260 | 1261 | 43 1262 | 1263 | 1264 | 20 1265 | 1266 | com.google.android.apps.youtube.music.activities.MusicActivity 1267 | com.google.android.apps.youtube.music 1268 | 1269 | 1270 | 1271 | 1272 | 1273 | 1274 | 1275 | 30 1276 | 1277 | 1278 | 1279 | 1280 | 1281 | 1282 | 1283 | 940160580 1284 | 1285 | 1286 | SEARCH 1287 | java.lang.String 1288 | AutoShare 1289 | java.lang.String 1290 | <null> 1291 | java.lang.String 1292 | <null> 1293 | java.lang.String 1294 | Package: com.google.android.apps.youtube.music 1295 | Class: com.google.android.apps.youtube.music.activities.MusicActivity 1296 | App: AutoShare 1297 | Action: Search 1298 | Query: %query 1299 | java.lang.String 1300 | com.google.android.apps.youtube.music.activities.MusicActivity 1301 | java.lang.String 1302 | com.google.android.apps.youtube.music 1303 | java.lang.String 1304 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%err 1305 | Error Code 1306 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%errmsg 1307 | Error Message 1308 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1></StringArray> 1309 | [Ljava.lang.String; 1310 | IntentApp configpackage configclass IntentAction querySEARCH plugininstanceid plugintypeid 1311 | java.lang.String 1312 | true 1313 | java.lang.Boolean 1314 | c1f454d5-b5b5-41a3-9502-f1356a74a956 1315 | java.lang.String 1316 | com.joaomgcd.autoshare.intent.IntentShare 1317 | java.lang.String 1318 | %query 1319 | java.lang.String 1320 | 1321 | 1322 | com.joaomgcd.autoshare 1323 | com.joaomgcd.autoshare.activity.ActivityConfigShare 1324 | 1325 | 1326 | 1327 | 1328 | 30 1329 | 1330 | 1331 | 1332 | 1333 | 1334 | 1335 | 1336 | 1040876951 1337 | 1338 | 1339 | com.google.android.apps.youtube.music 1340 | java.lang.String 1341 | <null> 1342 | java.lang.String 1343 | false 1344 | java.lang.Boolean 1345 | false 1346 | java.lang.Boolean 1347 | true 1348 | java.lang.Boolean 1349 | <null> 1350 | java.lang.String 1351 | false 1352 | java.lang.Boolean 1353 | com.google.android.apps.youtube.music:id/second_entity_button=:=save,com.google.android.apps.youtube.music:id/first_entity_button=:=play 1354 | java.lang.String 1355 | <null> 1356 | java.lang.String 1357 | App Package: com.google.android.apps.youtube.music 1358 | Variables: save, play 1359 | Only Visible: true 1360 | java.lang.String 1361 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%aiapp 1362 | App Name 1363 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%aicoordinates() 1364 | Element Coordinates 1365 | List of coordinates in the x,y format</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%aiid() 1366 | Element Ids 1367 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%aipackage 1368 | App Package Name 1369 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>%aitext() 1370 | Element Texts 1371 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5>%play 1372 | play 1373 | play</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6>%save 1374 | save 1375 | save</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7>%err 1376 | Error Code 1377 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8>%errmsg 1378 | Error Message 1379 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8></StringArray> 1380 | [Ljava.lang.String; 1381 | AppPackage UIUpdateFields plugininstanceid plugintypeid 1382 | java.lang.String 1383 | true 1384 | java.lang.Boolean 1385 | c3d9709d-f1fd-49e9-b749-455b2925dfef 1386 | java.lang.String 1387 | com.joaomgcd.autoinput.intent.IntentUIQuery 1388 | java.lang.String 1389 | 1390 | 1391 | com.joaomgcd.autoinput 1392 | com.joaomgcd.autoinput.activity.ActivityConfigUIQuery 1393 | 1394 | 1395 | 1396 | 1397 | 37 1398 | 1399 | And 1400 | 1401 | %play 1402 | 0 1403 | Play 1404 | 1405 | 1406 | %save 1407 | 0 1408 | Save 1409 | 1410 | 1411 | 1412 | 1413 | 107361459 1414 | false 1415 | 1416 | 1417 | <null> 1418 | java.lang.String 1419 | <null> 1420 | java.lang.String 1421 | Actions To Perform: click(id,com.google.android.apps.youtube.music:id/first_entity_button) 1422 | Not In AutoInput: true 1423 | Not In Tasker: true 1424 | Separator: , 1425 | Check Millis: 1000 1426 | java.lang.String 1427 | parameters 1428 | java.lang.String 1429 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ailastbounds 1430 | Last Bounds 1431 | Bounds (left,top,right,bottom) of the item that the action last interacted with</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%ailastcoordinates 1432 | Last Coordinates 1433 | Center coordinates (x,y) of the item that the action last interacted with</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%err 1434 | Error Code 1435 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%errmsg 1436 | Error Message 1437 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3></StringArray> 1438 | [Ljava.lang.String; 1439 | parameters plugininstanceid plugintypeid 1440 | java.lang.String 1441 | true 1442 | java.lang.Boolean 1443 | {"_action":"click(id,com.google.android.apps.youtube.music:id/first_entity_button)","_additionalOptions":{"checkMs":"1000","separator":",","withCoordinates":false},"_whenToPerformAction":{"notInAutoInput":true,"notInTasker":true,"textMustBePresent":""},"generatedValues":{}} 1444 | java.lang.String 1445 | c84806a3-f4ba-4618-9df5-4ff5aa5726d6 1446 | java.lang.String 1447 | com.joaomgcd.autoinput.intent.IntentActionv2 1448 | java.lang.String 1449 | 1450 | 1451 | com.joaomgcd.autoinput 1452 | com.joaomgcd.autoinput.activity.ActivityConfigActionv2 1453 | 1454 | 1455 | 1456 | 1457 | 43 1458 | 1459 | 1460 | 107361459 1461 | 1462 | 1463 | <null> 1464 | java.lang.String 1465 | <null> 1466 | java.lang.String 1467 | Actions To Perform: click(id,com.google.android.apps.youtube.music:id/generic_button_text_item=:=Songs) 1468 | 1469 | click(id,com.google.android.apps.youtube.music:id/subtitle) 1470 | Not In AutoInput: true 1471 | Not In Tasker: true 1472 | Separator: , 1473 | Check Millis: 1000 1474 | java.lang.String 1475 | parameters 1476 | java.lang.String 1477 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ailastbounds 1478 | Last Bounds 1479 | Bounds (left,top,right,bottom) of the item that the action last interacted with</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%ailastcoordinates 1480 | Last Coordinates 1481 | Center coordinates (x,y) of the item that the action last interacted with</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%err 1482 | Error Code 1483 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%errmsg 1484 | Error Message 1485 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3></StringArray> 1486 | [Ljava.lang.String; 1487 | parameters plugininstanceid plugintypeid 1488 | java.lang.String 1489 | true 1490 | java.lang.Boolean 1491 | {"_action":"click(id,com.google.android.apps.youtube.music:id/generic_button_text_item=:=Songs)\n\nclick(id,com.google.android.apps.youtube.music:id/subtitle)","_additionalOptions":{"checkMs":"1000","separator":",","withCoordinates":false},"_whenToPerformAction":{"notInAutoInput":true,"notInTasker":true,"textMustBePresent":""},"generatedValues":{}} 1492 | java.lang.String 1493 | c84806a3-f4ba-4618-9df5-4ff5aa5726d6 1494 | java.lang.String 1495 | com.joaomgcd.autoinput.intent.IntentActionv2 1496 | java.lang.String 1497 | 1498 | 1499 | com.joaomgcd.autoinput 1500 | com.joaomgcd.autoinput.activity.ActivityConfigActionv2 1501 | 1502 | 1503 | 1504 | 1505 | 348 1506 | 1507 | 1508 | %locked 1509 | 1510 | 1511 | 38 1512 | 1513 | 1514 | 38 1515 | 1516 | 1517 | 877 1518 | false 1519 | android.media.action.MEDIA_PLAY_FROM_SEARCH 1520 | 1521 | 1522 | 1523 | android.intent.extra.focus:vnd.android.cursor.item/* 1524 | query:%par1 1525 | 1526 | com.google.android.apps.youtube.music 1527 | 1528 | 1529 | 1530 | 1531 | 37 1532 | 1533 | 1534 | %locked 1535 | 0 1536 | true 1537 | 1538 | 1539 | 1540 | 1541 | 658527372 1542 | 1543 | 1544 | URL: https://music.youtube.com/search?q=%query 1545 | CSS Queries: a.yt-simple-endpoint()=:=href 1546 | Output HTML: true 1547 | Use Javascript: true 1548 | Javascript Delay: 5000 1549 | Request Desktop Website: true 1550 | java.lang.String 1551 | parameters 1552 | java.lang.String 1553 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%a_ytsimpleendpoint() 1554 | a_ytsimpleendpoint() 1555 | a_ytsimpleendpoint()</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%atcount() 1556 | Number Of Results 1557 | Number of results read from HTML</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%err 1558 | Error Code 1559 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%errmsg 1560 | Error Message 1561 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3></StringArray> 1562 | [Ljava.lang.String; 1563 | parameters plugininstanceid plugintypeid 1564 | java.lang.String 1565 | true 1566 | java.lang.Boolean 1567 | {"htmlReadAdvanced":{"htmlReadJavascriptDelay":"5000","htmlReadRequestDesktopWebsite":true,"htmlReadUseJavascript":true},"htmlReadCCSQuery":"a.yt-simple-endpoint()=:=href","htmlReadUrl":"https://music.youtube.com/search?q=%query","htmlReadVarNames":"","outputHtml":true,"generatedValues":{}} 1568 | java.lang.String 1569 | d5c1cafd-0598-493a-ba5b-1ea1e7124eb4 1570 | java.lang.String 1571 | com.joaomgcd.autotools.intent.IntentHTMLRead 1572 | java.lang.String 1573 | 1574 | 1575 | com.joaomgcd.autotools 1576 | com.joaomgcd.autotools.activity.ActivityConfigHTMLRead 1577 | 1578 | 1579 | 1580 | 1581 | 39 1582 | false 1583 | %val 1584 | %a_ytsimpleendpoint() 1585 | 1586 | 1587 | 1588 | 37 1589 | false 1590 | 1591 | 1592 | %val 1593 | 4 1594 | .*watch.* 1595 | 1596 | 1597 | 1598 | 1599 | 877 1600 | android.intent.action.VIEW 1601 | 1602 | 1603 | %val 1604 | 1605 | 1606 | 1607 | com.google.android.apps.youtube.music 1608 | 1609 | 1610 | 1611 | 1612 | 38 1613 | 1614 | 1615 | 40 1616 | 1617 | 1618 | true 1619 | 1620 | true 1621 | false 1622 | The music to search and play on YouTube Music. 1623 | query 1624 | 329 1625 | t 1626 | %query 1627 | t 1628 | true 1629 | 1630 | 1631 | 1632 | 1599508864110 1633 | 1741628291796 1634 | 406 1635 | MCP print_extras 1636 | 100 1637 | 1638 | 347 1639 | 1640 | 1641 | 1642 | %vars 1643 | 1644 | 1645 | 547 1646 | %extras 1647 | %vars() 1648 | 1649 | 1650 | 1651 | 1652 | 1653 | 1654 | 1655 | 547 1656 | %text 1657 | %extra = %%extra 1658 | 1659 | 1660 | 1661 | 1662 | 1663 | 1664 | 1665 | 1666 | %%extra 1667 | 5 1668 | %extra 1669 | 1670 | 1671 | 1672 | 1673 | 40 1674 | 1675 | 1676 | 548 1677 | %text 1678 | 1679 | 1680 | 1681 | 1682 | Top 1683 | 1684 | 1685 | 1686 | 1687 | 1688 | 1689 | 1690 | 1691 | 10000 1692 | 1693 | 1694 | 1695 | %text 1696 | 1 1697 | \%text 1698 | 1699 | 1700 | 1701 | 1702 | 598 1703 | 1704 | %extras 1705 | evtprm1|evtprm2|evtprm3|evtprm4|evtprm5|evtprm6|evtprm7|evtprm8|caller1|caller2|priority|QTIME|qtime|tasker_current_action_number 1706 | 1707 | 1708 | 1709 | 1710 | 1711 | 1712 | 1713 | 1714 | 598 1715 | 1716 | %extras 1717 | http_request_id|http_request_method|http_request_body|http_request_port|http_request_path|http_request_headers1|http_request_headers2|http_request_headers3|http_request_headers4|http_request_headers5|http_request_headers6|http_request_headers7|http_request_headers8|http_request_ip_address_v4 1718 | 1719 | 1720 | 1721 | 1722 | 1723 | 1724 | 1725 | 1726 | 598 1727 | %extras 1728 | %, 1729 | 1730 | 1731 | 1732 | 1733 | 1734 | 1735 | 1736 | 1737 | 598 1738 | %extras 1739 | % 1740 | 1741 | 1742 | 1743 | 1744 | 1745 | 1746 | 1747 | 1748 | 590 1749 | %extras 1750 | , 1751 | 1752 | 1753 | 1754 | 1755 | %extras 1756 | 3 1757 | %*extras* 1758 | 1759 | 1760 | 1761 | 1762 | 369 1763 | %extras 1764 | 1765 | 1766 | 1767 | %extras 1768 | 3 1769 | %*extras* 1770 | 1771 | 1772 | 1773 | 1774 | 39 1775 | 1776 | %extra 1777 | %extras() 1778 | 1779 | 1780 | 1781 | %extras 1782 | 3 1783 | %*extras* 1784 | 1785 | 1786 | 1787 | 1788 | 547 1789 | %text 1790 | %extra = unset 1791 | 1792 | 1793 | 1794 | 1795 | 1796 | 1797 | 1798 | 1799 | %%extra 1800 | 4 1801 | %extra 1802 | 1803 | 1804 | 1805 | 1806 | 1807 | 1740827420192 1808 | 1741542451895 1809 | 407 1810 | MCP Get Battery Level 1811 | Returns the current battery percentage. 1812 | 1813 | 129 1814 | 1815 | // DO NOT MODIFY THIS ACTION! 1816 | // ================================= 1817 | // Copy and paste this action to the start of 1818 | // any task toenable it as an MCP tool. 1819 | // 1820 | // Calling this action indirectly through 1821 | // Perform Task will not set args correctly. 1822 | // ================================= 1823 | 1824 | // Parse args as local variables 1825 | const args = JSON.parse(local('par1')); 1826 | 1827 | for (const name in args) { 1828 | const value = args[name]; 1829 | setLocal(name, value); 1830 | } 1831 | 1832 | exit(); 1833 | 1834 | 1835 | 1836 | 1837 | 1838 | %par1 1839 | 12 1840 | 1841 | 1842 | 1843 | 1844 | 1845 | 424 1846 | 1847 | 1848 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%bi_level 1849 | 01. Level 1850 | The current battery level, from 0 to scale</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%bi_scale 1851 | 02. Scale 1852 | The maximum battery level</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%bi_status 1853 | 03. Status 1854 | 1=Unknown; 2=Charging; 3=Discharging; 4=Not Charging; 5=Full;</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%bi_status_string 1855 | 04. Status Description 1856 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>%bi_temperature 1857 | 05. Temperature 1858 | Current battery temperature in degree Celsius. May always show as 0 on some devices.</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5>%bi_power_source 1859 | 06. Power Source 1860 | 1=AC; 2=USB; 4=Wireless; 8=Dock;</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6>%bi_power_source_string 1861 | 07. Power Source Description 1862 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7>%bi_health 1863 | 08. Battery Health 1864 | 1=Unknown; 2=Good; 3=Overheat; 4=Dead; 5=Over Voltage; 6=Failure;</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8>%bi_time_until_charged 1865 | 08. Time Until Charged 1866 | Approximate time (MS) remaining until the battery is fully charged or -1 if not possible to get</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES9>%bi_health_string 1867 | 09. Battery Health Description 1868 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES9><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES10>%bi_battery_low 1869 | 10. Battery Low 1870 | true if device battery level is low (corresponds to the Low battery warning system dialog), false otherwise</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES10><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES11>%bi_voltage 1871 | 11. Voltage 1872 | Current battery voltage in millivolts</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES11><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES12>%bi_present 1873 | 12. Present 1874 | true if device has a battery, false otherwise</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES12><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES13>%bi_technology 1875 | 13. Technology 1876 | Description of the technology of the current battery</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES13><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES14>%bi_capacity_percentage 1877 | 14. Capacity Percentage 1878 | Remaining battery capacity percentage</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES14><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES15>%bi_capacity 1879 | 15. Capacity 1880 | Battery capacity in microampere-hours</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES15><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES16>%bi_current_average 1881 | 16. Average Current 1882 | Average battery current in microamperes. Can be positive (charging) or negative (discharging)</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES16><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES17>%bi_current_now 1883 | 17. Instantaneous Current 1884 | Instantaneous battery current in microamperes. Can be positive (charging) or negative (discharging)</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES17><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES18>%bi_energy_counter 1885 | 18. Energy Counter 1886 | Battery remaining energy in nanowatt-hours</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES18><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES19>%bi_adaptive_charging_enabled 1887 | 19. Adaptive Charging Enabled 1888 | true if adaptive charging is enabled on your device, false if not. May not be correct on all devices.</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES19><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES20>%bi_manufacturing_date 1889 | 19. Battery Manufacturing Date 1890 | Seconds Since Epoch</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES20><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES21>%bi_adaptive_battery_management_enabled 1891 | 20. Adaptive Battery Enabled 1892 | true if the "Adaptive Battery" setting is enabled on your phone, false if not. May not be correct on all devices.</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES21><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES22>%bi_first_usage_date 1893 | 20. Battery First Usage Date 1894 | Seconds Since Epoch</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES22><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES23>%bi_charging_policy 1895 | 21. Battery Charging Policy 1896 | 1=Default; 2=Adaptive Static; 3=Adaptive Dynamic; 4=Adaptive Long Life;</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES23><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES24>%bi_state_of_health 1897 | 22. Battery State of Health 1898 | Percentage representing the measured battery state of health (remaining estimated full charge capacity relative to the rated capacity in %)</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES24></StringArray> 1899 | [Ljava.lang.String; 1900 | 1901 | 1902 | 1903 | 1904 | 126 1905 | %bi_level 1906 | 1907 | 1908 | 1909 | 1910 | 1911 | 1912 | 1913 | 1740827473547 1914 | 1741522493500 1915 | 408 1916 | MCP Get Location 1917 | Retrieves the current GPS coordinates. 1918 | 1919 | 129 1920 | 1921 | // DO NOT MODIFY THIS ACTION! 1922 | // ================================= 1923 | // Copy and paste this action to the start of 1924 | // any task toenable it as an MCP tool. 1925 | // 1926 | // Calling this action indirectly through 1927 | // Perform Task will not set args correctly. 1928 | // ================================= 1929 | 1930 | // Parse args as local variables 1931 | const args = JSON.parse(local('par1')); 1932 | 1933 | for (const name in args) { 1934 | const value = args[name]; 1935 | setLocal(name, value); 1936 | } 1937 | 1938 | exit(); 1939 | 1940 | 1941 | 1942 | 1943 | 1944 | %par1 1945 | 12 1946 | 1947 | 1948 | 1949 | 1950 | 1951 | 366 1952 | 1953 | 1954 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%gl_latitude 1955 | 1. Latitude 1956 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%gl_longitude 1957 | 2. Longitude 1958 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%gl_coordinates_accuracy 1959 | 3. Lat, Lon Accuracy 1960 | In meters</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%gl_altitude 1961 | Altitude (meters) 1962 | In meters</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>%gl_altitude_accuracy 1963 | Altitude Accuracy 1964 | In meters</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5>%gl_bearing 1965 | Bearing 1966 | in the range 0.0–360.0; Horizontal direction of travel of this device; not related to the device orientation</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6>%gl_bearing_accuracy 1967 | Bearing Accuracy 1968 | In degrees</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7>%gl_map_url 1969 | Google Maps URL 1970 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8>%gl_coordinates 1971 | Latitude and Longitude 1972 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES9>%gl_satellites 1973 | Satellites 1974 | The number of satellites used to derive the fix. May not always be available.</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES9><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES10>%gl_speed 1975 | Speed 1976 | In meters per second</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES10><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES11>%gl_speed_accuracy 1977 | Speed 1978 | In meters per second</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES11><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES12>%gl_time_seconds 1979 | Time 1980 | Time in seconds since EPOCH the location was gotten</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES12><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES13>%gl_time_adjusted_milliseconds 1981 | Time Adjusted Milliseconds 1982 | Result of adding the current system time with the offset between the system time and the location time</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES13><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES14>%gl_time_gnss_milliseconds 1983 | Time GNSS Milliseconds 1984 | Time in milliseconds since EPOCH the location was gotten synchrined to the device's location provider</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES14><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES15>%gl_time_milliseconds 1985 | Time Milliseconds 1986 | Time in milliseconds since EPOCH the location was gotten</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES15><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES16>%gl_time_offset_milliseconds 1987 | Time Offset Milliseconds 1988 | Time difference in milliseconds between the system time and the location time</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES16><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES17>%gl_time_taken_millis 1989 | Time Taken 1990 | Time in milliseconds that it took for Tasker to get the location</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES17></StringArray> 1991 | [Ljava.lang.String; 1992 | 1993 | 1994 | 1995 | 1996 | 1997 | 1998 | 1999 | 2000 | 2001 | 2002 | 2003 | 2004 | 2005 | 548 2006 | %gl_coordinates 2007 | 2008 | 2009 | 2010 | 2011 | 2012 | 2013 | 2014 | 2015 | 2016 | 2017 | 2018 | 2019 | 2020 | 2021 | 2022 | 2023 | 2024 | 126 2025 | %gl_coordinates 2026 | 2027 | 2028 | 2029 | 2030 | 2031 | 2032 | 2033 | 1740964475086 2034 | 1741518331891 2035 | 409 2036 | MCP build_data_url 2037 | 100 2038 | 2039 | 37 2040 | 2041 | 2042 | %par1 2043 | 1 2044 | \%par1 2045 | 2046 | 2047 | 2048 | 2049 | 130 2050 | MCP detect_mime_type 2051 | 2052 | %priority 2053 | 2054 | 2055 | %par1 2056 | 2057 | %mime_type 2058 | 2059 | 2060 | 2061 | 2062 | 2063 | 2064 | 2065 | 548 2066 | %mime_type 2067 | 2068 | 2069 | 2070 | 2071 | 2072 | 2073 | 2074 | 2075 | 2076 | 2077 | 2078 | 2079 | 2080 | 2081 | 2082 | 2083 | 2084 | %caller() 2085 | 2 2086 | ui 2087 | 2088 | 2089 | 2090 | 2091 | 776 2092 | false 2093 | %par1 2094 | %b64 2095 | 2096 | 2097 | 37 2098 | 2099 | 2100 | %b64 2101 | 12 2102 | 2103 | 2104 | 2105 | 2106 | 2107 | 598 2108 | %b64 2109 | [\r\n]+ 2110 | 2111 | 2112 | 2113 | 2114 | 2115 | 2116 | 2117 | 2118 | 126 2119 | data:%mime_type;base64,%b64 2120 | 2121 | 2122 | 2123 | 2124 | 2125 | 2126 | 2127 | 1740964562687 2128 | 1741518296130 2129 | 410 2130 | MCP detect_mime_type 2131 | 100 2132 | 2133 | 547 2134 | %par1 2135 | /storage/emulated/0/Tasker/test.txt 2136 | 2137 | 2138 | 2139 | 2140 | 2141 | 2142 | 2143 | %caller() 2144 | 2 2145 | ui 2146 | 2147 | 2148 | 2149 | 2150 | 37 2151 | false 2152 | 2153 | 2154 | %par1 2155 | 1 2156 | \%par1 2157 | 2158 | 2159 | 2160 | 2161 | 548 2162 | Error: "%extension" invalid 2163 | Return: */* 2164 | 2165 | 2166 | 2167 | 2168 | 2169 | 2170 | 2171 | 2172 | 2173 | 2174 | 2175 | 2176 | 2177 | 2178 | 2179 | 2180 | 2181 | 38 2182 | 2183 | 2184 | 126 2185 | */* 2186 | 2187 | 2188 | 2189 | 2190 | 2191 | 2192 | 547 2193 | %file 2194 | %par1 2195 | 2196 | 2197 | 2198 | 2199 | 2200 | 2201 | 2202 | 664 2203 | %extension 2204 | MimeTypeMap 2205 | getFileExtensionFromUrl 2206 | {String} (String) 2207 | "%file" 2208 | 2209 | 2210 | 2211 | 2212 | 2213 | 2214 | 2215 | 2216 | 664 2217 | mimetype 2218 | MimeTypeMap 2219 | getSingleton 2220 | {MimeTypeMap} () 2221 | "%file" 2222 | 2223 | 2224 | 2225 | 2226 | 2227 | 2228 | 2229 | 2230 | 664 2231 | %mimetype 2232 | mimetype 2233 | getMimeTypeFromExtension 2234 | {String} (String) 2235 | "%extension" 2236 | 2237 | 2238 | 2239 | 2240 | 2241 | 2242 | 2243 | 2244 | 37 2245 | 2246 | 2247 | %mimetype 2248 | 12 2249 | 2250 | 2251 | 2252 | 2253 | 2254 | 548 2255 | %mimetype 2256 | 2257 | 2258 | 2259 | 2260 | 2261 | 2262 | 2263 | 2264 | 2265 | 2266 | 2267 | 2268 | 2269 | 2270 | 2271 | 2272 | 2273 | 126 2274 | %mimetype 2275 | 2276 | 2277 | 2278 | 2279 | 2280 | 2281 | 38 2282 | 2283 | 2284 | 2285 | 1740966228035 2286 | 1741522705095 2287 | 411 2288 | MCP Take Photo 2289 | Takes a photo using the phone's camera. 2290 | 2291 | 129 2292 | 2293 | // DO NOT MODIFY THIS ACTION! 2294 | // ================================= 2295 | // Copy and paste this action to the start of 2296 | // any task toenable it as an MCP tool. 2297 | // 2298 | // Calling this action indirectly through 2299 | // Perform Task will not set args correctly. 2300 | // ================================= 2301 | 2302 | // Parse args as local variables 2303 | const args = JSON.parse(local('par1')); 2304 | 2305 | for (const name in args) { 2306 | const value = args[name]; 2307 | setLocal(name, value); 2308 | } 2309 | 2310 | exit(); 2311 | 2312 | 2313 | 2314 | 2315 | 2316 | %par1 2317 | 12 2318 | 2319 | 2320 | 2321 | 2322 | 2323 | 394 2324 | 2325 | 2326 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%formatted 2327 | 00. Formatted 2328 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%dt_millis 2329 | 1. MilliSeconds 2330 | Milliseconds Since Epoch</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%dt_seconds 2331 | 2. Seconds 2332 | Seconds Since Epoch</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%dt_day_of_month 2333 | 3. Day Of Month 2334 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>%dt_month_of_year 2335 | 4. Month Of Year 2336 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5>%dt_year 2337 | 5. Year 2338 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5></StringArray> 2339 | [Ljava.lang.String; 2340 | 2341 | 2342 | 2343 | 2344 | 2345 | 2346 | 2347 | 2348 | 2349 | y_MM_dd_HH_mm_ss 2350 | 2351 | 2352 | 2353 | 2354 | 2355 | 2356 | 126 2357 | %data_url 2358 | 2359 | 2360 | 2361 | 2362 | 2363 | 2364 | 547 2365 | %png 2366 | Tasker/Photos/%formatted 2367 | 2368 | 2369 | 2370 | 2371 | 2372 | 2373 | 2374 | 101 2375 | 2376 | %png 2377 | 2378 | 2379 | 2380 | 1280x720 2381 | 2382 | 2383 | 2384 | 2385 | 2386 | 2387 | 188 2388 | 2389 | %png 2390 | 2391 | 2392 | %img 2393 | 2394 | 2395 | 2396 | 2397 | 406 2398 | false 2399 | %png 2400 | 2401 | 2402 | 2403 | 2404 | 2405 | 547 2406 | %webp 2407 | Tasker/Photos/%uuid.webp 2408 | 2409 | 2410 | 2411 | 2412 | 2413 | 2414 | 2415 | 187 2416 | %webp 2417 | 2418 | 2419 | 2420 | 2421 | 130 2422 | MCP build_data_url 2423 | 2424 | %priority 2425 | 2426 | 2427 | %webp 2428 | 2429 | %data_url 2430 | 2431 | 2432 | 2433 | 2434 | 2435 | 2436 | 2437 | 548 2438 | %data_url 2439 | 2440 | 2441 | 2442 | 2443 | 2444 | 2445 | 2446 | 2447 | 2448 | 2449 | 2450 | 2451 | 2452 | 2453 | 2454 | 2455 | 2456 | 2457 | 1740966267094 2458 | 1741522699883 2459 | 412 2460 | MCP Call Number 2461 | Initiates a phone call to the specified number. 2462 | 2463 | 129 2464 | 2465 | // DO NOT MODIFY THIS ACTION! 2466 | // ================================= 2467 | // Copy and paste this action to the start of 2468 | // any task toenable it as an MCP tool. 2469 | // 2470 | // Calling this action indirectly through 2471 | // Perform Task will not set args correctly. 2472 | // ================================= 2473 | 2474 | // Parse args as local variables 2475 | const args = JSON.parse(local('par1')); 2476 | 2477 | for (const name in args) { 2478 | const value = args[name]; 2479 | setLocal(name, value); 2480 | } 2481 | 2482 | exit(); 2483 | 2484 | 2485 | 2486 | 2487 | 2488 | %par1 2489 | 12 2490 | 2491 | 2492 | 2493 | 2494 | 2495 | 90 2496 | %number 2497 | 2498 | 2499 | 2500 | 2501 | true 2502 | 2503 | true 2504 | false 2505 | Recipient phone number. 2506 | number 2507 | 306 2508 | t 2509 | %number 2510 | cn 2511 | true 2512 | 2513 | 2514 | 2515 | 1740966343079 2516 | 1741522695464 2517 | 413 2518 | MCP Create Task 2519 | Creates a new task in Google tasks. 2520 | 2521 | 129 2522 | 2523 | // DO NOT MODIFY THIS ACTION! 2524 | // ================================= 2525 | // Copy and paste this action to the start of 2526 | // any task toenable it as an MCP tool. 2527 | // 2528 | // Calling this action indirectly through 2529 | // Perform Task will not set args correctly. 2530 | // ================================= 2531 | 2532 | // Parse args as local variables 2533 | const args = JSON.parse(local('par1')); 2534 | 2535 | for (const name in args) { 2536 | const value = args[name]; 2537 | setLocal(name, value); 2538 | } 2539 | 2540 | exit(); 2541 | 2542 | 2543 | 2544 | 2545 | 2546 | %par1 2547 | 12 2548 | 2549 | 2550 | 2551 | 2552 | 2553 | 547 2554 | false 2555 | %text 2556 | sample 2557 | 2558 | 2559 | 2560 | 2561 | 2562 | 2563 | 2564 | %caller() 2565 | 2 2566 | ui 2567 | 2568 | 2569 | 2570 | 2571 | 370 2572 | 2573 | 2574 | <StringArray sr=""/> 2575 | [Ljava.lang.String; 2576 | 2577 | 2578 | #Intent;action=com.google.android.apps.tasks.NewTask;component=com.google.android.apps.tasks/.common.TrampolineActivity;B.from-launcher-shortcut=true;end 2579 | 2580 | 2581 | 37 2582 | 2583 | 2584 | %text 2585 | 12 2586 | 2587 | 2588 | 2589 | 2590 | 2591 | 328 2592 | 2593 | 2594 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%kb_text_selected 2595 | Selected Text 2596 | Text selected on the current input, if any</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%kb_text 2597 | Text 2598 | Text present on the current input, if any</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%kb_text_after_cursor 2599 | Text After Cursor 2600 | Text after the cursor on the current input, if any</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%kb_text_before_cursor 2601 | Text Before Cursor 2602 | Text before the cursor on the current input, if any</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3></StringArray> 2603 | [Ljava.lang.String; 2604 | 2605 | 2606 | wait(200),write(%text) 2607 | 2608 | 2609 | 2610 | 2611 | 107361459 2612 | 2613 | 2614 | <null> 2615 | java.lang.String 2616 | <null> 2617 | java.lang.String 2618 | Actions To Perform: click(id,com.google.android.apps.tasks:id/add_task_done) 2619 | Not In AutoInput: true 2620 | Not In Tasker: true 2621 | Separator: , 2622 | Check Millis: 1000 2623 | java.lang.String 2624 | parameters 2625 | java.lang.String 2626 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%ailastbounds 2627 | Last Bounds 2628 | Bounds (left,top,right,bottom) of the item that the action last interacted with</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%ailastcoordinates 2629 | Last Coordinates 2630 | Center coordinates (x,y) of the item that the action last interacted with</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%err 2631 | Error Code 2632 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%errmsg 2633 | Error Message 2634 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3></StringArray> 2635 | [Ljava.lang.String; 2636 | parameters plugininstanceid plugintypeid 2637 | java.lang.String 2638 | true 2639 | java.lang.Boolean 2640 | {"_action":"click(id,com.google.android.apps.tasks:id/add_task_done)","_additionalOptions":{"checkMs":"1000","separator":",","withCoordinates":false},"_whenToPerformAction":{"notInAutoInput":true,"notInTasker":true},"generatedValues":{}} 2641 | java.lang.String 2642 | 6f5193ea-697b-4de2-a212-f608afd7f2b2 2643 | java.lang.String 2644 | com.joaomgcd.autoinput.intent.IntentActionv2 2645 | java.lang.String 2646 | 2647 | 2648 | com.joaomgcd.autoinput 2649 | com.joaomgcd.autoinput.activity.ActivityConfigActionv2 2650 | 2651 | 2652 | 2653 | 2654 | 38 2655 | 2656 | 2657 | true 2658 | 2659 | true 2660 | false 2661 | Task content. 2662 | text 2663 | 307 2664 | t 2665 | %text 2666 | t 2667 | true 2668 | 2669 | 2670 | 2671 | 1740966388936 2672 | 1741522836693 2673 | 414 2674 | MCP Say 2675 | Uses Tasker Say action to speak the given text. Use this when asked to 'say', 'recite', 'sing', etc. 2676 | 2677 | 129 2678 | 2679 | // DO NOT MODIFY THIS ACTION! 2680 | // ================================= 2681 | // Copy and paste this action to the start of 2682 | // any task toenable it as an MCP tool. 2683 | // 2684 | // Calling this action indirectly through 2685 | // Perform Task will not set args correctly. 2686 | // ================================= 2687 | 2688 | // Parse args as local variables 2689 | const args = JSON.parse(local('par1')); 2690 | 2691 | for (const name in args) { 2692 | const value = args[name]; 2693 | setLocal(name, value); 2694 | } 2695 | 2696 | exit(); 2697 | 2698 | 2699 | 2700 | 2701 | 2702 | %par1 2703 | 12 2704 | 2705 | 2706 | 2707 | 2708 | 2709 | 137 2710 | 2711 | 2712 | 2713 | 2714 | %speech 2715 | 13 2716 | 2717 | 2718 | 2719 | 2720 | 2721 | 547 2722 | %lang 2723 | en-usa 2724 | 2725 | 2726 | 2727 | 2728 | 2729 | 2730 | 2731 | %lang 2732 | 13 2733 | 2734 | 2735 | 2736 | 2737 | 2738 | 559 2739 | %speech 2740 | com.google.android.tts:%lang 2741 | 2742 | 2743 | 2744 | 2745 | 2746 | 2747 | 2748 | 2749 | true 2750 | 2751 | true 2752 | false 2753 | The text to be spoken. 2754 | speech 2755 | 308 2756 | t 2757 | %speech 2758 | t 2759 | true 2760 | 2761 | 2762 | false 2763 | 2764 | true 2765 | false 2766 | The language in Android format (e.g., en-usa, spa-usa). 2767 | lang 2768 | 308 2769 | t 2770 | %lang 2771 | ln 2772 | true 2773 | 2774 | 2775 | 2776 | 1740966611671 2777 | 1741522670937 2778 | 415 2779 | MCP Set Alarm 2780 | Sets an alarm on the phone. 2781 | 2782 | 129 2783 | 2784 | // DO NOT MODIFY THIS ACTION! 2785 | // ================================= 2786 | // Copy and paste this action to the start of 2787 | // any task toenable it as an MCP tool. 2788 | // 2789 | // Calling this action indirectly through 2790 | // Perform Task will not set args correctly. 2791 | // ================================= 2792 | 2793 | // Parse args as local variables 2794 | const args = JSON.parse(local('par1')); 2795 | 2796 | for (const name in args) { 2797 | const value = args[name]; 2798 | setLocal(name, value); 2799 | } 2800 | 2801 | exit(); 2802 | 2803 | 2804 | 2805 | 2806 | 2807 | %par1 2808 | 12 2809 | 2810 | 2811 | 2812 | 2813 | 2814 | 547 2815 | false 2816 | %time 2817 | 14:20 2818 | 2819 | 2820 | 2821 | 2822 | 2823 | 2824 | 2825 | %caller() 2826 | 2 2827 | ui 2828 | 2829 | 2830 | 2831 | 2832 | 37 2833 | 2834 | 2835 | %time 2836 | 13 2837 | 2838 | 2839 | 2840 | 2841 | 2842 | 137 2843 | 2844 | 2845 | 2846 | 2847 | 43 2848 | 2849 | 2850 | 590 2851 | %time 2852 | : 2853 | 2854 | 2855 | 2856 | 2857 | 566 2858 | 2859 | %time(1) 2860 | 2861 | 2862 | %time(2) 2863 | 2864 | 2865 | 2866 | 2867 | 2868 | 2869 | 2870 | 38 2871 | 2872 | 2873 | true 2874 | 2875 | true 2876 | false 2877 | Time in 24:00 format. 2878 | time 2879 | 309 2880 | t 2881 | %time 2882 | ti 2883 | true 2884 | 2885 | 2886 | 2887 | 1740966828289 2888 | 1741587556035 2889 | 416 2890 | MCP Toggle Flashlight 2891 | Turns flashlight on or off. 2892 | 2893 | 129 2894 | 2895 | // DO NOT MODIFY THIS ACTION! 2896 | // ================================= 2897 | // Copy and paste this action to the start of 2898 | // any task toenable it as an MCP tool. 2899 | // 2900 | // Calling this action indirectly through 2901 | // Perform Task will not set args correctly. 2902 | // ================================= 2903 | 2904 | // Parse args as local variables 2905 | const args = JSON.parse(local('par1')); 2906 | 2907 | for (const name in args) { 2908 | const value = args[name]; 2909 | setLocal(name, value); 2910 | } 2911 | 2912 | exit(); 2913 | 2914 | 2915 | 2916 | 2917 | 2918 | %par1 2919 | 12 2920 | 2921 | 2922 | 2923 | 2924 | 2925 | 37 2926 | 2927 | 2928 | %state 2929 | 2 2930 | on 2931 | 2932 | 2933 | 2934 | 2935 | 511 2936 | 2937 | 2938 | 2939 | 2940 | 43 2941 | 2942 | 2943 | %state 2944 | 2 2945 | off 2946 | 2947 | 2948 | 2949 | 2950 | 511 2951 | 2952 | 2953 | 2954 | 2955 | true 2956 | 2957 | true 2958 | false 2959 | Allowed values: on, off. 2960 | state 2961 | 310 2962 | t 2963 | %state 2964 | onoff 2965 | true 2966 | 2967 | 2968 | 2969 | 1740972162152 2970 | 1741522645519 2971 | 417 2972 | MCP Get Contacts 2973 | Retrieves the phone contacts. 2974 | 100 2975 | 2976 | 129 2977 | 2978 | // DO NOT MODIFY THIS ACTION! 2979 | // ================================= 2980 | // Copy and paste this action to the start of 2981 | // any task toenable it as an MCP tool. 2982 | // 2983 | // Calling this action indirectly through 2984 | // Perform Task will not set args correctly. 2985 | // ================================= 2986 | 2987 | // Parse args as local variables 2988 | const args = JSON.parse(local('par1')); 2989 | 2990 | for (const name in args) { 2991 | const value = args[name]; 2992 | setLocal(name, value); 2993 | } 2994 | 2995 | exit(); 2996 | 2997 | 2998 | 2999 | 3000 | 3001 | %par1 3002 | 12 3003 | 3004 | 3005 | 3006 | 3007 | 3008 | 1452528931 3009 | 3010 | 3011 | Default Phone Number: true 3012 | Sort: name 3013 | Sort Direction: Ascending 3014 | Fields to Get: Id,Name,Nickname,Note,Phone Number 3015 | Joiner: =:= 3016 | java.lang.String 3017 | parameters 3018 | java.lang.String 3019 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%acid 3020 | `First Id 3021 | Unique ID for the contact (Lookup)</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%acid() 3022 | ´Id 3023 | Unique ID for the contact (Lookup)</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%acname 3024 | `First Name 3025 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%acname() 3026 | ´Name 3027 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>%acnickname 3028 | `First Nickname 3029 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5>%acnickname() 3030 | ´Nickname 3031 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6>%acnote 3032 | `First Note 3033 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES6><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7>%acnote() 3034 | ´Note 3035 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES7><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8>%acnumber 3036 | `First Phone Number 3037 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES8><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES9>%acnumber() 3038 | ´Phone Number 3039 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES9><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES10>%err 3040 | Error Code 3041 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES10><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES11>%errmsg 3042 | Error Message 3043 | Only available if you select &lt;b&gt;Continue Task After Error&lt;/b&gt; and the action ends in error</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES11></StringArray> 3044 | [Ljava.lang.String; 3045 | parameters plugininstanceid plugintypeid 3046 | java.lang.String 3047 | true 3048 | java.lang.Boolean 3049 | {"contactSort":"name","contactSortDirection":"0","queryAdvanced":{"queryJoiner":"=:="},"queryContactsFieldsToGet":"acid,acname,acnickname,acnote,acnumber","queryFilter":{"contactOnlyPhoneDefault":true,"filterAdvanced":{"queryGetEmptyFields":false},"queryContactStarred":false},"generatedValues":{}} 3050 | java.lang.String 3051 | 19e02c75-dac3-45ff-83d9-e22aeff54c2b 3052 | java.lang.String 3053 | com.joaomgcd.autocontacts.intent.IntentQuery2 3054 | java.lang.String 3055 | 3056 | 3057 | com.joaomgcd.autocontacts 3058 | com.joaomgcd.autocontacts.activity.ActivityConfigQuery2 3059 | 3060 | 3061 | 3062 | 3063 | 547 3064 | %content 3065 | ## Contacts: 3066 | 3067 | 3068 | 3069 | 3070 | 3071 | 3072 | 3073 | 3074 | 547 3075 | %len 3076 | %acname(#) 3077 | 3078 | 3079 | 3080 | 3081 | 3082 | 3083 | 3084 | 129 3085 | var contents = []; 3086 | 3087 | for(var idx = 1; idx <= len; idx++){ 3088 | let row = []; 3089 | let name = local("acname"+idx) 3090 | let nickname = local("acnickname"+idx) 3091 | let notes = local("acnotes"+idx) 3092 | let number = local("acnumber"+idx) 3093 | 3094 | if(name) 3095 | row.push(`(Name:${name})`); 3096 | 3097 | if(nickname && nickname != ' ') 3098 | row.push(`(Nickname:${nickname})`); 3099 | 3100 | if(number) 3101 | row.push(`(Number:${number})`); 3102 | 3103 | if(notes) 3104 | row.push(`(Notes:${notes})`); 3105 | 3106 | 3107 | contents.push(row.join(', ')); 3108 | } 3109 | 3110 | contents = contents.join("\n"); 3111 | 3112 | 3113 | 3114 | 3115 | 3116 | 547 3117 | %prompt_extra 3118 | %contents 3119 | 3120 | 3121 | 3122 | 3123 | 3124 | 3125 | 3126 | 126 3127 | %contents 3128 | 3129 | 3130 | 3131 | 3132 | 3133 | 3134 | 3135 | 1740827524920 3136 | 1741522640471 3137 | 418 3138 | MCP Send SMS 3139 | Sends an SMS message. 3140 | 3141 | 129 3142 | 3143 | // DO NOT MODIFY THIS ACTION! 3144 | // ================================= 3145 | // Copy and paste this action to the start of 3146 | // any task toenable it as an MCP tool. 3147 | // 3148 | // Calling this action indirectly through 3149 | // Perform Task will not set args correctly. 3150 | // ================================= 3151 | 3152 | // Parse args as local variables 3153 | const args = JSON.parse(local('par1')); 3154 | 3155 | for (const name in args) { 3156 | const value = args[name]; 3157 | setLocal(name, value); 3158 | } 3159 | 3160 | exit(); 3161 | 3162 | 3163 | 3164 | 3165 | 3166 | %par1 3167 | 12 3168 | 3169 | 3170 | 3171 | 3172 | 3173 | 41 3174 | %number 3175 | %message 3176 | 3177 | 3178 | 3179 | 3180 | 3181 | true 3182 | 3183 | true 3184 | false 3185 | Recipient phone number. 3186 | number 3187 | 312 3188 | t 3189 | %number 3190 | cn 3191 | true 3192 | 3193 | 3194 | true 3195 | 3196 | true 3197 | false 3198 | Message content. 3199 | message 3200 | 312 3201 | t 3202 | %message 3203 | t 3204 | true 3205 | 3206 | 3207 | 3208 | 1740827601291 3209 | 1741542885381 3210 | 419 3211 | MCP Toggle Wifi 3212 | Turns WiFi on or off. 3213 | 100 3214 | 3215 | 129 3216 | 3217 | // DO NOT MODIFY THIS ACTION! 3218 | // ================================= 3219 | // Copy and paste this action to the start of 3220 | // any task toenable it as an MCP tool. 3221 | // 3222 | // Calling this action indirectly through 3223 | // Perform Task will not set args correctly. 3224 | // ================================= 3225 | 3226 | // Parse args as local variables 3227 | const args = JSON.parse(local('par1')); 3228 | 3229 | for (const name in args) { 3230 | const value = args[name]; 3231 | setLocal(name, value); 3232 | } 3233 | 3234 | exit(); 3235 | 3236 | 3237 | 3238 | 3239 | 3240 | %par1 3241 | 12 3242 | 3243 | 3244 | 3245 | 3246 | 3247 | 37 3248 | 3249 | 3250 | %state 3251 | 2 3252 | on 3253 | 3254 | 3255 | 3256 | 3257 | 425 3258 | 3259 | 3260 | 3261 | 43 3262 | 3263 | 3264 | %state 3265 | 2 3266 | off 3267 | 3268 | 3269 | 3270 | 3271 | 425 3272 | 3273 | 3274 | 3275 | true 3276 | 3277 | true 3278 | false 3279 | Allowed values: on, off. 3280 | state 3281 | 313 3282 | t 3283 | %state 3284 | onoff 3285 | true 3286 | 3287 | 3288 | 3289 | 1740827721772 3290 | 1741522492160 3291 | 420 3292 | MCP Flash Text 3293 | Displays a short message using tasker Flash action. 3294 | 3295 | 129 3296 | 3297 | // DO NOT MODIFY THIS ACTION! 3298 | // ================================= 3299 | // Copy and paste this action to the start of 3300 | // any task toenable it as an MCP tool. 3301 | // 3302 | // Calling this action indirectly through 3303 | // Perform Task will not set args correctly. 3304 | // ================================= 3305 | 3306 | // Parse args as local variables 3307 | const args = JSON.parse(local('par1')); 3308 | 3309 | for (const name in args) { 3310 | const value = args[name]; 3311 | setLocal(name, value); 3312 | } 3313 | 3314 | exit(); 3315 | 3316 | 3317 | 3318 | 3319 | 3320 | %par1 3321 | 12 3322 | 3323 | 3324 | 3325 | 3326 | 3327 | 548 3328 | %text 3329 | 3330 | 3331 | 3332 | 3333 | 3334 | 3335 | 3336 | 3337 | 3338 | 3339 | 3340 | 3341 | 3342 | 3343 | 3344 | 3345 | 3346 | true 3347 | 3348 | true 3349 | false 3350 | The text to show on the user phone. 3351 | text 3352 | 314 3353 | t 3354 | %text 3355 | t 3356 | true 3357 | 3358 | 3359 | 3360 | 1740827768006 3361 | 1740827792959 3362 | 421 3363 | -------------------- 3364 | 3365 | 547 3366 | %noop 3367 | noop 3368 | 3369 | 3370 | 3371 | 3372 | 3373 | 3374 | 3375 | 3376 | 1740849983224 3377 | 1741542911250 3378 | 422 3379 | MCP Browse URL 3380 | Opens a URL in the default browser on the phone. 3381 | 100 3382 | 3383 | 129 3384 | 3385 | // DO NOT MODIFY THIS ACTION! 3386 | // ================================= 3387 | // Copy and paste this action to the start of 3388 | // any task toenable it as an MCP tool. 3389 | // 3390 | // Calling this action indirectly through 3391 | // Perform Task will not set args correctly. 3392 | // ================================= 3393 | 3394 | // Parse args as local variables 3395 | const args = JSON.parse(local('par1')); 3396 | 3397 | for (const name in args) { 3398 | const value = args[name]; 3399 | setLocal(name, value); 3400 | } 3401 | 3402 | exit(); 3403 | 3404 | 3405 | 3406 | 3407 | 3408 | %par1 3409 | 12 3410 | 3411 | 3412 | 3413 | 3414 | 3415 | 104 3416 | %url 3417 | 3418 | 3419 | 3420 | 3421 | 3422 | true 3423 | 3424 | true 3425 | false 3426 | The URL to open in the browser. 3427 | url 3428 | 316 3429 | t 3430 | %url 3431 | t 3432 | true 3433 | 3434 | 3435 | 3436 | 1740858001436 3437 | 1741522623769 3438 | 423 3439 | MCP Screenshot 3440 | Takes a screenshot of the current screen on the phone. 3441 | 100 3442 | 3443 | 129 3444 | 3445 | // DO NOT MODIFY THIS ACTION! 3446 | // ================================= 3447 | // Copy and paste this action to the start of 3448 | // any task toenable it as an MCP tool. 3449 | // 3450 | // Calling this action indirectly through 3451 | // Perform Task will not set args correctly. 3452 | // ================================= 3453 | 3454 | // Parse args as local variables 3455 | const args = JSON.parse(local('par1')); 3456 | 3457 | for (const name in args) { 3458 | const value = args[name]; 3459 | setLocal(name, value); 3460 | } 3461 | 3462 | exit(); 3463 | 3464 | 3465 | 3466 | 3467 | 3468 | %par1 3469 | 12 3470 | 3471 | 3472 | 3473 | 3474 | 3475 | 365 3476 | 3477 | 3478 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%uuid 3479 | UUID 3480 | </_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0></StringArray> 3481 | [Ljava.lang.String; 3482 | 3483 | 3484 | GenerateUUID() 3485 | 3486 | 3487 | 547 3488 | %png 3489 | Tasker/Screenshots/%uuid.png 3490 | 3491 | 3492 | 3493 | 3494 | 3495 | 3496 | 3497 | 176 3498 | %png 3499 | 3500 | 3501 | 3502 | 188 3503 | 3504 | %png 3505 | 3506 | 3507 | 3508 | 3509 | 3510 | 406 3511 | false 3512 | %png 3513 | 3514 | 3515 | 3516 | 3517 | 3518 | 547 3519 | %webp 3520 | Tasker/Screenshots/%uuid.webp 3521 | 3522 | 3523 | 3524 | 3525 | 3526 | 3527 | 3528 | 187 3529 | %webp 3530 | 3531 | 3532 | 3533 | 3534 | 130 3535 | MCP build_data_url 3536 | 3537 | %priority 3538 | 3539 | 3540 | %webp 3541 | 3542 | %data_url 3543 | 3544 | 3545 | 3546 | 3547 | 3548 | 3549 | 3550 | 126 3551 | %data_url 3552 | 3553 | 3554 | 3555 | 3556 | 3557 | 3558 | 3559 | 1740935899578 3560 | 1741630635040 3561 | 424 3562 | MCP test_call_task 3563 | 8 3564 | 2 3565 | 3566 | 339 3567 | false 3568 | 3569 | 3570 | <StringArray sr=""><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0>%http_cookies 3571 | Cookies 3572 | The cookies the server sent in the response in the Cookie:COOKIE_VALUE format. You can use this directly in the 'Headers' field of the HTTP Request action</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES0><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1>%http_data 3573 | Data 3574 | Data that the server responded from the HTTP request.</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES1><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2>%http_file_output 3575 | File Output 3576 | Will always contain the file's full path even if you specified a directory as the File to save.</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES2><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3>%http_response_code 3577 | Response Code 3578 | The HTTP Code the server responded</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES3><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4>%http_headers() 3579 | Response Headers 3580 | The HTTP Headers the server sent in the response. Each header is in the 'key:value' format</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES4><_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5>%http_response_length 3581 | Response Length 3582 | The size of the response in bytes</_array_net.dinglisch.android.tasker.RELEVANT_VARIABLES5></StringArray> 3583 | [Ljava.lang.String; 3584 | 3585 | 3586 | 3587 | 3588 | 3589 | 3590 | http://0.0.0.0:1821/run_task 3591 | Authorization:Bearer %tasker_api_key 3592 | 3593 | { 3594 | "name": "MCP Flash Text", 3595 | "arguments": {"text": "Hi"} 3596 | } 3597 | 3598 | 3599 | 3600 | 3601 | 3602 | 3603 | 548 3604 | %http_data 3605 | 3606 | Code: %http_response_code 3607 | 3608 | 3609 | 3610 | 3611 | 3612 | 3613 | 3614 | 3615 | 3616 | 3617 | 3618 | 3619 | 3620 | 3621 | 3622 | 3623 | 3624 | 3625 | -------------------------------------------------------------------------------- /dist/tasker-mcp-server-cli-aarch64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dceluis/tasker-mcp/830193d799d64908d6e5405b391bce009e747786/dist/tasker-mcp-server-cli-aarch64 -------------------------------------------------------------------------------- /dist/tasker-mcp-server-cli-x86_64: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/dceluis/tasker-mcp/830193d799d64908d6e5405b391bce009e747786/dist/tasker-mcp-server-cli-x86_64 -------------------------------------------------------------------------------- /dist/toolDescriptions.json: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "tasker_name": "MCP Set Volume", 4 | "name": "tasker_set_volume", 5 | "description": "Sets the phone media volume level.", 6 | "inputSchema": { 7 | "type": "object", 8 | "properties": { 9 | "level": { 10 | "type": "number", 11 | "description": "The media volume level to set (0-15). max equals 15, min equals 1." 12 | } 13 | }, 14 | "required": [ 15 | "level" 16 | ] 17 | } 18 | }, 19 | { 20 | "tasker_name": "MCP Get Volume", 21 | "name": "tasker_get_volume", 22 | "description": "Retrieves the current phone media volume level.", 23 | "inputSchema": { 24 | "type": "object", 25 | "properties": {} 26 | } 27 | }, 28 | { 29 | "tasker_name": "MCP Print", 30 | "name": "tasker_print", 31 | "description": "Prints a document on the phone.", 32 | "inputSchema": { 33 | "type": "object", 34 | "properties": { 35 | "path": { 36 | "type": "string", 37 | "description": "The path to the document to print." 38 | } 39 | }, 40 | "required": [ 41 | "path" 42 | ] 43 | } 44 | }, 45 | { 46 | "tasker_name": "MCP Set Clipboard", 47 | "name": "tasker_set_clipboard", 48 | "description": "Sets the phone clipboard.", 49 | "inputSchema": { 50 | "type": "object", 51 | "properties": { 52 | "text": { 53 | "type": "string", 54 | "description": "The text to set the phone clipboard to." 55 | } 56 | }, 57 | "required": [ 58 | "text" 59 | ] 60 | } 61 | }, 62 | { 63 | "tasker_name": "MCP Get Clipboard", 64 | "name": "tasker_get_clipboard", 65 | "description": "Retrieves the current phone text clipboard.", 66 | "inputSchema": { 67 | "type": "object", 68 | "properties": {} 69 | } 70 | }, 71 | { 72 | "tasker_name": "MCP List Files", 73 | "name": "tasker_list_files", 74 | "description": "Retrieves the list of files on the phone's Documents folder.", 75 | "inputSchema": { 76 | "type": "object", 77 | "properties": {} 78 | } 79 | }, 80 | { 81 | "tasker_name": "MCP Lamp ON", 82 | "name": "tasker_lamp_on", 83 | "description": "Turns the bedroom lamp on.", 84 | "inputSchema": { 85 | "type": "object", 86 | "properties": {} 87 | } 88 | }, 89 | { 90 | "tasker_name": "MCP Lamp OFF", 91 | "name": "tasker_lamp_off", 92 | "description": "Turns the bedroom lamp off.", 93 | "inputSchema": { 94 | "type": "object", 95 | "properties": {} 96 | } 97 | }, 98 | { 99 | "tasker_name": "MCP Play Music", 100 | "name": "tasker_play_music", 101 | "description": "Plays music on the phone.", 102 | "inputSchema": { 103 | "type": "object", 104 | "properties": { 105 | "query": { 106 | "type": "string", 107 | "description": "The music to search and play on YouTube Music." 108 | } 109 | }, 110 | "required": [ 111 | "query" 112 | ] 113 | } 114 | }, 115 | { 116 | "tasker_name": "MCP Get Battery Level", 117 | "name": "tasker_get_battery_level", 118 | "description": "Returns the current battery percentage.", 119 | "inputSchema": { 120 | "type": "object", 121 | "properties": {} 122 | } 123 | }, 124 | { 125 | "tasker_name": "MCP Get Location", 126 | "name": "tasker_get_location", 127 | "description": "Retrieves the current GPS coordinates.", 128 | "inputSchema": { 129 | "type": "object", 130 | "properties": {} 131 | } 132 | }, 133 | { 134 | "tasker_name": "MCP Take Photo", 135 | "name": "tasker_take_photo", 136 | "description": "Takes a photo using the phone's camera.", 137 | "inputSchema": { 138 | "type": "object", 139 | "properties": {} 140 | } 141 | }, 142 | { 143 | "tasker_name": "MCP Call Number", 144 | "name": "tasker_call_number", 145 | "description": "Initiates a phone call to the specified number.", 146 | "inputSchema": { 147 | "type": "object", 148 | "properties": { 149 | "number": { 150 | "type": "string", 151 | "description": "Recipient phone number." 152 | } 153 | }, 154 | "required": [ 155 | "number" 156 | ] 157 | } 158 | }, 159 | { 160 | "tasker_name": "MCP Create Task", 161 | "name": "tasker_create_task", 162 | "description": "Creates a new task in Google tasks.", 163 | "inputSchema": { 164 | "type": "object", 165 | "properties": { 166 | "text": { 167 | "type": "string", 168 | "description": "Task content." 169 | } 170 | }, 171 | "required": [ 172 | "text" 173 | ] 174 | } 175 | }, 176 | { 177 | "tasker_name": "MCP Say", 178 | "name": "tasker_say", 179 | "description": "Uses Tasker Say action to speak the given text. Use this when asked to 'say', 'recite', 'sing', etc.", 180 | "inputSchema": { 181 | "type": "object", 182 | "properties": { 183 | "speech": { 184 | "type": "string", 185 | "description": "The text to be spoken." 186 | }, 187 | "lang": { 188 | "type": "string", 189 | "description": "The language in Android format (e.g., en-usa, spa-usa)." 190 | } 191 | }, 192 | "required": [ 193 | "speech" 194 | ] 195 | } 196 | }, 197 | { 198 | "tasker_name": "MCP Set Alarm", 199 | "name": "tasker_set_alarm", 200 | "description": "Sets an alarm on the phone.", 201 | "inputSchema": { 202 | "type": "object", 203 | "properties": { 204 | "time": { 205 | "type": "string", 206 | "description": "Time in 24:00 format." 207 | } 208 | }, 209 | "required": [ 210 | "time" 211 | ] 212 | } 213 | }, 214 | { 215 | "tasker_name": "MCP Toggle Flashlight", 216 | "name": "tasker_toggle_flashlight", 217 | "description": "Turns flashlight on or off.", 218 | "inputSchema": { 219 | "type": "object", 220 | "properties": { 221 | "state": { 222 | "type": "string", 223 | "description": "Allowed values: on, off.", 224 | "enum": [ 225 | "on", 226 | "off" 227 | ] 228 | } 229 | }, 230 | "required": [ 231 | "state" 232 | ] 233 | } 234 | }, 235 | { 236 | "tasker_name": "MCP Get Contacts", 237 | "name": "tasker_get_contacts", 238 | "description": "Retrieves the phone contacts.", 239 | "inputSchema": { 240 | "type": "object", 241 | "properties": {} 242 | } 243 | }, 244 | { 245 | "tasker_name": "MCP Send SMS", 246 | "name": "tasker_send_sms", 247 | "description": "Sends an SMS message.", 248 | "inputSchema": { 249 | "type": "object", 250 | "properties": { 251 | "number": { 252 | "type": "string", 253 | "description": "Recipient phone number." 254 | }, 255 | "message": { 256 | "type": "string", 257 | "description": "Message content." 258 | } 259 | }, 260 | "required": [ 261 | "number", 262 | "message" 263 | ] 264 | } 265 | }, 266 | { 267 | "tasker_name": "MCP Toggle Wifi", 268 | "name": "tasker_toggle_wifi", 269 | "description": "Turns WiFi on or off.", 270 | "inputSchema": { 271 | "type": "object", 272 | "properties": { 273 | "state": { 274 | "type": "string", 275 | "description": "Allowed values: on, off.", 276 | "enum": [ 277 | "on", 278 | "off" 279 | ] 280 | } 281 | }, 282 | "required": [ 283 | "state" 284 | ] 285 | } 286 | }, 287 | { 288 | "tasker_name": "MCP Flash Text", 289 | "name": "tasker_flash_text", 290 | "description": "Displays a short message using tasker Flash action.", 291 | "inputSchema": { 292 | "type": "object", 293 | "properties": { 294 | "text": { 295 | "type": "string", 296 | "description": "The text to show on the user phone." 297 | } 298 | }, 299 | "required": [ 300 | "text" 301 | ] 302 | } 303 | }, 304 | { 305 | "tasker_name": "MCP Browse URL", 306 | "name": "tasker_browse_url", 307 | "description": "Opens a URL in the default browser on the phone.", 308 | "inputSchema": { 309 | "type": "object", 310 | "properties": { 311 | "url": { 312 | "type": "string", 313 | "description": "The URL to open in the browser." 314 | } 315 | }, 316 | "required": [ 317 | "url" 318 | ] 319 | } 320 | }, 321 | { 322 | "tasker_name": "MCP Screenshot", 323 | "name": "tasker_screenshot", 324 | "description": "Takes a screenshot of the current screen on the phone.", 325 | "inputSchema": { 326 | "type": "object", 327 | "properties": {} 328 | } 329 | } 330 | ] 331 | -------------------------------------------------------------------------------- /docs/tasker.xsd: -------------------------------------------------------------------------------- 1 | 2 | 8 | 9 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 100 | 101 | 102 | 103 | The ID of the parent Task element. This value must match the task's id. 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | -------------------------------------------------------------------------------- /examples/claude_desktop_config.json: -------------------------------------------------------------------------------- 1 | { 2 | "mcpServers": { 3 | "tasker": { 4 | "command": "/home/luis/tasker-mcp/dist/tasker-mcp-server-cli-x86_64", 5 | "args": [ 6 | "-tools", 7 | "/home/luis/tasker-mcp/dist/toolDescriptions.json", 8 | "-tasker-host", 9 | "192.168.1.123" 10 | ] 11 | } 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /plugin/go.mod: -------------------------------------------------------------------------------- 1 | module tasker 2 | 3 | go 1.22.1 4 | 5 | require github.com/extism/go-pdk v1.1.0 6 | -------------------------------------------------------------------------------- /plugin/go.sum: -------------------------------------------------------------------------------- 1 | github.com/extism/go-pdk v1.1.0 h1:K2On6XOERxrYdsgu0uLzCxeu/FYRHE8jId/hdEVSYoY= 2 | github.com/extism/go-pdk v1.1.0/go.mod h1:Gz+LIU/YCKnKXhgge8yo5Yu1F/lbv7KtKFkiCSzW/P4= 3 | -------------------------------------------------------------------------------- /plugin/main.go: -------------------------------------------------------------------------------- 1 | // Note: run `go doc -all` in this package to see all of the types and functions available. 2 | // ./pdk.gen.go contains the domain types from the host where your plugin will run. 3 | package main 4 | 5 | import "errors" 6 | 7 | // Called when the tool is invoked. 8 | // If you support multiple tools, you must switch on the input.params.name to detect which tool is being called. 9 | // It takes CallToolRequest as input (The incoming tool request from the LLM) 10 | // And returns CallToolResult (The servlet's response to the given tool call) 11 | func Call(input CallToolRequest) (CallToolResult, error) { 12 | args := input.Params.Arguments 13 | if args == nil { 14 | return CallToolResult{}, errors.New("Arguments must be provided") 15 | } 16 | 17 | argsMap := args.(map[string]interface{}) 18 | text := "Hello " + argsMap["name"].(string) + "!!!" 19 | 20 | return CallToolResult{ 21 | Content: []Content{{ 22 | Type: ContentTypeText, 23 | Text: &text, 24 | }}, 25 | }, nil 26 | 27 | } 28 | 29 | // Called by mcpx to understand how and why to use this tool. 30 | // Note: Your servlet configs will not be set when this function is called, 31 | // so do not rely on config in this function 32 | // And returns ListToolsResult (The tools' descriptions, supporting multiple tools from a single servlet.) 33 | func Describe() (ListToolsResult, error) { 34 | return ListToolsResult{ 35 | Tools: []ToolDescription{{ 36 | Name: "greet", 37 | Description: "A very simple tool to provide a greeting", 38 | InputSchema: map[string]interface{}{ 39 | "type": "object", 40 | "properties": map[string]interface{}{ 41 | "name": map[string]interface{}{ 42 | "type": "string", 43 | "description": "the name of the person to greet", 44 | }, 45 | }, 46 | "required": []string{"name"}, 47 | }, 48 | }}, 49 | }, nil 50 | 51 | } 52 | -------------------------------------------------------------------------------- /plugin/pdk.gen.go: -------------------------------------------------------------------------------- 1 | // THIS FILE WAS GENERATED BY `xtp-go-bindgen`. DO NOT EDIT. 2 | package main 3 | 4 | import ( 5 | "errors" 6 | 7 | pdk "github.com/extism/go-pdk" 8 | ) 9 | 10 | //export call 11 | func _Call() int32 { 12 | var err error 13 | _ = err 14 | pdk.Log(pdk.LogDebug, "Call: getting JSON input") 15 | var input CallToolRequest 16 | err = pdk.InputJSON(&input) 17 | if err != nil { 18 | pdk.SetError(err) 19 | return -1 20 | } 21 | 22 | pdk.Log(pdk.LogDebug, "Call: calling implementation function") 23 | output, err := Call(input) 24 | if err != nil { 25 | pdk.SetError(err) 26 | return -1 27 | } 28 | 29 | pdk.Log(pdk.LogDebug, "Call: setting JSON output") 30 | err = pdk.OutputJSON(output) 31 | if err != nil { 32 | pdk.SetError(err) 33 | return -1 34 | } 35 | 36 | pdk.Log(pdk.LogDebug, "Call: returning") 37 | return 0 38 | } 39 | 40 | //export describe 41 | func _Describe() int32 { 42 | var err error 43 | _ = err 44 | output, err := Describe() 45 | if err != nil { 46 | pdk.SetError(err) 47 | return -1 48 | } 49 | 50 | pdk.Log(pdk.LogDebug, "Describe: setting JSON output") 51 | err = pdk.OutputJSON(output) 52 | if err != nil { 53 | pdk.SetError(err) 54 | return -1 55 | } 56 | 57 | pdk.Log(pdk.LogDebug, "Describe: returning") 58 | return 0 59 | } 60 | 61 | // 62 | type BlobResourceContents struct { 63 | // A base64-encoded string representing the binary data of the item. 64 | Blob string `json:"blob"` 65 | // The MIME type of this resource, if known. 66 | MimeType *string `json:"mimeType,omitempty"` 67 | // The URI of this resource. 68 | Uri string `json:"uri"` 69 | } 70 | 71 | // Used by the client to invoke a tool provided by the server. 72 | type CallToolRequest struct { 73 | Method *string `json:"method,omitempty"` 74 | Params Params `json:"params"` 75 | } 76 | 77 | // The server's response to a tool call. 78 | // 79 | // Any errors that originate from the tool SHOULD be reported inside the result 80 | // object, with `isError` set to true, _not_ as an MCP protocol-level error 81 | // response. Otherwise, the LLM would not be able to see that an error occurred 82 | // and self-correct. 83 | // 84 | // However, any errors in _finding_ the tool, an error indicating that the 85 | // server does not support tool calls, or any other exceptional conditions, 86 | // should be reported as an MCP error response. 87 | type CallToolResult struct { 88 | Content []Content `json:"content"` 89 | // Whether the tool call ended in an error. 90 | // 91 | // If not set, this is assumed to be false (the call was successful). 92 | IsError *bool `json:"isError,omitempty"` 93 | } 94 | 95 | // A content response. 96 | // For text content set type to ContentType.Text and set the `text` property 97 | // For image content set type to ContentType.Image and set the `data` and `mimeType` properties 98 | type Content struct { 99 | Annotations *TextAnnotation `json:"annotations,omitempty"` 100 | // The base64-encoded image data. 101 | Data *string `json:"data,omitempty"` 102 | // The MIME type of the image. Different providers may support different image types. 103 | MimeType *string `json:"mimeType,omitempty"` 104 | // The text content of the message. 105 | Text *string `json:"text,omitempty"` 106 | Type ContentType `json:"type"` 107 | } 108 | 109 | // 110 | type ContentType string 111 | 112 | const ( 113 | ContentTypeText ContentType = "text" 114 | ContentTypeImage ContentType = "image" 115 | ContentTypeResource ContentType = "resource" 116 | ) 117 | 118 | func (v ContentType) String() string { 119 | switch v { 120 | case ContentTypeText: 121 | return `text` 122 | case ContentTypeImage: 123 | return `image` 124 | case ContentTypeResource: 125 | return `resource` 126 | default: 127 | return "" 128 | } 129 | } 130 | 131 | func stringToContentType(s string) (ContentType, error) { 132 | switch s { 133 | case `text`: 134 | return ContentTypeText, nil 135 | case `image`: 136 | return ContentTypeImage, nil 137 | case `resource`: 138 | return ContentTypeResource, nil 139 | default: 140 | return ContentType(""), errors.New("unable to convert string to ContentType") 141 | } 142 | } 143 | 144 | // Provides one or more descriptions of the tools available in this servlet. 145 | type ListToolsResult struct { 146 | // The list of ToolDescription objects provided by this servlet. 147 | Tools []ToolDescription `json:"tools"` 148 | } 149 | 150 | // 151 | type Params struct { 152 | Arguments interface{} `json:"arguments,omitempty"` 153 | Name string `json:"name"` 154 | } 155 | 156 | // The sender or recipient of messages and data in a conversation. 157 | type Role string 158 | 159 | const ( 160 | RoleAssistant Role = "assistant" 161 | RoleUser Role = "user" 162 | ) 163 | 164 | func (v Role) String() string { 165 | switch v { 166 | case RoleAssistant: 167 | return `assistant` 168 | case RoleUser: 169 | return `user` 170 | default: 171 | return "" 172 | } 173 | } 174 | 175 | func stringToRole(s string) (Role, error) { 176 | switch s { 177 | case `assistant`: 178 | return RoleAssistant, nil 179 | case `user`: 180 | return RoleUser, nil 181 | default: 182 | return Role(""), errors.New("unable to convert string to Role") 183 | } 184 | } 185 | 186 | // A text annotation 187 | type TextAnnotation struct { 188 | // Describes who the intended customer of this object or data is. 189 | // 190 | // It can include multiple entries to indicate content useful for multiple audiences (e.g., `["user", "assistant"]`). 191 | Audience []Role `json:"audience,omitempty"` 192 | // Describes how important this data is for operating the server. 193 | // 194 | // A value of 1 means "most important," and indicates that the data is 195 | // effectively required, while 0 means "least important," and indicates that 196 | // the data is entirely optional. 197 | Priority float32 `json:"priority,omitempty"` 198 | } 199 | 200 | // 201 | type TextResourceContents struct { 202 | // The MIME type of this resource, if known. 203 | MimeType *string `json:"mimeType,omitempty"` 204 | // The text of the item. This must only be set if the item can actually be represented as text (not binary data). 205 | Text string `json:"text"` 206 | // The URI of this resource. 207 | Uri string `json:"uri"` 208 | } 209 | 210 | // Describes the capabilities and expected paramters of the tool function 211 | type ToolDescription struct { 212 | // A description of the tool 213 | Description string `json:"description"` 214 | // The JSON schema describing the argument input 215 | InputSchema interface{} `json:"inputSchema"` 216 | // The name of the tool. It should match the plugin / binding name. 217 | Name string `json:"name"` 218 | } 219 | -------------------------------------------------------------------------------- /plugin/prepare.sh: -------------------------------------------------------------------------------- 1 | #!/bin/bash 2 | set -eou pipefail 3 | 4 | # Function to check if a command exists 5 | command_exists () { 6 | command -v "$1" >/dev/null 2>&1 7 | } 8 | 9 | # Function to compare version numbers 10 | version_gt() { 11 | test "$(echo "$@" | tr " " "\n" | sort -V | head -n 1)" != "$1" 12 | } 13 | 14 | missing_deps=0 15 | 16 | # Check for Go 17 | if ! (command_exists go); then 18 | missing_deps=1 19 | echo "❌ Go (supported version between 1.18 - 1.23) is not installed." 20 | echo "" 21 | echo "To install Go, visit the official download page:" 22 | echo "👉 https://go.dev/dl/" 23 | echo "" 24 | echo "Or install it using a package manager:" 25 | echo "" 26 | echo "🔹 macOS (Homebrew):" 27 | echo " brew install go" 28 | echo "" 29 | echo "🔹 Ubuntu/Debian:" 30 | echo " sudo apt-get -y install golang-go" 31 | echo "" 32 | echo "🔹 Arch Linux:" 33 | echo " sudo pacman -S go" 34 | echo "" 35 | echo "🔹 Windows:" 36 | echo " scoop install go" 37 | echo "" 38 | fi 39 | 40 | # Check for the right version of Go, needed by TinyGo (supports go 1.18 - 1.23) 41 | if (command_exists go); then 42 | compat=0 43 | for v in `seq 18 23`; do 44 | if (go version | grep -q "go1.$v"); then 45 | compat=1 46 | fi 47 | done 48 | 49 | if [ $compat -eq 0 ]; then 50 | echo "❌ Supported Go version is not installed. Must be Go 1.18 - 1.23." 51 | echo "" 52 | fi 53 | fi 54 | 55 | ARCH=$(uname -m) 56 | 57 | # Check for TinyGo and its version 58 | if ! (command_exists tinygo); then 59 | missing_deps=1 60 | echo "❌ TinyGo is not installed." 61 | echo "" 62 | echo "To install TinyGo, visit the official download page:" 63 | echo "👉 https://tinygo.org/getting-started/install/" 64 | echo "" 65 | echo "Or install it using a package manager:" 66 | echo "" 67 | echo "🔹 macOS (Homebrew):" 68 | echo " brew tap tinygo-org/tools" 69 | echo " brew install tinygo" 70 | echo "" 71 | echo "🔹 Ubuntu/Debian:" 72 | echo " wget https://github.com/tinygo-org/tinygo/releases/download/v0.34.0/tinygo_0.34.0_$ARCH.deb" 73 | echo " sudo dpkg -i tinygo_0.34.0_$ARCH.deb" 74 | echo "" 75 | echo "🔹 Arch Linux:" 76 | echo " pacman -S extra/tinygo" 77 | echo "" 78 | echo "🔹 Windows:" 79 | echo " scoop install tinygo" 80 | echo "" 81 | else 82 | # Check TinyGo version 83 | tinygo_version=$(tinygo version | grep -o '[0-9]\+\.[0-9]\+\.[0-9]\+' | head -n1) 84 | if ! version_gt "$tinygo_version" "0.34.0"; then 85 | missing_deps=1 86 | echo "❌ TinyGo version must be greater than 0.34.0 (current version: $tinygo_version)" 87 | echo "Please update TinyGo to a newer version." 88 | echo "" 89 | fi 90 | fi 91 | 92 | go install golang.org/x/tools/cmd/goimports@latest 93 | -------------------------------------------------------------------------------- /plugin/xtp.toml: -------------------------------------------------------------------------------- 1 | app_id = "app_01je4dgpcyfvgrz8f1ys3pbxas" 2 | 3 | # This is where 'xtp plugin push' expects to find the wasm file after the build script has run. 4 | bin = "dist/plugin.wasm" 5 | extension_point_id = "ext_01je4jj1tteaktf0zd0anm8854" 6 | name = "tasker" 7 | 8 | [scripts] 9 | 10 | # xtp plugin build runs this script to generate the wasm file 11 | build = "mkdir -p dist && tinygo build -buildmode c-shared -target wasip1 -o dist/plugin.wasm ." 12 | 13 | # xtp plugin init runs this script to format the plugin code 14 | format = "go fmt && go mod tidy && goimports -w main.go" 15 | 16 | # xtp plugin init runs this script before running the format script 17 | prepare = "bash prepare.sh && go get ./..." 18 | -------------------------------------------------------------------------------- /repomix.config.json: -------------------------------------------------------------------------------- 1 | { 2 | "output": { 3 | "filePath": "repomix-output.txt", 4 | "style": "plain", 5 | "removeComments": false, 6 | "removeEmptyLines": false, 7 | "topFilesLength": 20, 8 | "showLineNumbers": false, 9 | "copyToClipboard": true 10 | }, 11 | "include": [], 12 | "ignore": { 13 | "useGitignore": false, 14 | "useDefaultPatterns": true, 15 | "customPatterns": [] 16 | }, 17 | "security": { 18 | "enableSecurityCheck": true 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /utils/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "tasker-mcp", 3 | "lockfileVersion": 3, 4 | "requires": true, 5 | "packages": { 6 | "": { 7 | "dependencies": { 8 | "xml2js": "^0.6.2" 9 | } 10 | }, 11 | "node_modules/sax": { 12 | "version": "1.4.1", 13 | "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", 14 | "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", 15 | "license": "ISC" 16 | }, 17 | "node_modules/xml2js": { 18 | "version": "0.6.2", 19 | "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", 20 | "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", 21 | "license": "MIT", 22 | "dependencies": { 23 | "sax": ">=0.6.0", 24 | "xmlbuilder": "~11.0.0" 25 | }, 26 | "engines": { 27 | "node": ">=4.0.0" 28 | } 29 | }, 30 | "node_modules/xmlbuilder": { 31 | "version": "11.0.1", 32 | "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", 33 | "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", 34 | "license": "MIT", 35 | "engines": { 36 | "node": ">=4.0" 37 | } 38 | } 39 | } 40 | } 41 | -------------------------------------------------------------------------------- /utils/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "dependencies": { 3 | "xml2js": "^0.6.2" 4 | } 5 | } 6 | -------------------------------------------------------------------------------- /utils/xml-to-tools.js: -------------------------------------------------------------------------------- 1 | // xml-to-tools.js 2 | const fs = require('fs'); 3 | const xml2js = require('xml2js'); 4 | 5 | async function convertXmlToJsonTools(xmlFilePath) { 6 | try { 7 | const xmlData = fs.readFileSync(xmlFilePath, 'utf-8'); 8 | 9 | const parser = new xml2js.Parser({ 10 | explicitArray: false, // To avoid arrays for single elements 11 | ignoreAttrs: false, 12 | tagNameProcessors: [xml2js.processors.stripPrefix] // To remove namespaces 13 | }); 14 | 15 | const result = await parser.parseStringPromise(xmlData); 16 | let tasks = result.TaskerData.Task; 17 | if (!Array.isArray(tasks)) { 18 | tasks = [tasks]; 19 | } 20 | 21 | const tools = []; 22 | 23 | for (const task of tasks) { 24 | const taskName = task.nme; 25 | // Only create tool definitions for tasks with a description (pc tag) 26 | if (!task.pc) { 27 | continue; 28 | } 29 | 30 | const toolDescription = { 31 | tasker_name: taskName, 32 | name: taskNameToToolName(taskName), 33 | description: generateDescription(task), 34 | inputSchema: extractInputSchema(task) 35 | }; 36 | 37 | tools.push(toolDescription); 38 | } 39 | 40 | return JSON.stringify(tools, null, 2); // Pretty print JSON 41 | 42 | } catch (error) { 43 | console.error("Error processing XML:", error); 44 | return null; 45 | } 46 | } 47 | 48 | function taskNameToToolName(taskName) { 49 | // Lowercase, replace spaces with underscores, remove 'mcp_' prefix if present, and add 'tasker_' prefix. 50 | return taskName.toLowerCase() 51 | .replace(/ /g, "_") 52 | .replace(/^mcp_/, "tasker_") 53 | .replace(/^mcp/, "tasker"); 54 | } 55 | 56 | function generateDescription(task) { 57 | return task.pc ? task.pc : `Tasker Tool: ${task.nme}`; 58 | } 59 | 60 | function extractInputSchema(task) { 61 | const schema = { type: "object", properties: {} }; 62 | const required = []; 63 | let profileVars = task.ProfileVariable; 64 | if (!profileVars) return schema; 65 | if (!Array.isArray(profileVars)) { 66 | profileVars = [profileVars]; 67 | } 68 | profileVars.forEach(variable => { 69 | // Only consider ProfileVariables if: 70 | // - pvci is false 71 | // - immutable is true 72 | // - pvv (the current value) is empty or missing 73 | const pvci = variable.pvci; 74 | const immutable = variable.immutable; 75 | const pvv = variable.pvv; 76 | if ((pvci === "false" || pvci === false) && 77 | (immutable === "true" || immutable === true) && 78 | (!pvv || pvv.trim() === "")) { 79 | 80 | // Remove leading '%' from the variable name (pvn) 81 | let key = variable.pvn || ""; 82 | if (key.startsWith("%")) { 83 | key = key.slice(1); 84 | } 85 | const desc = variable.pvd || ""; 86 | 87 | // Infer type based on pvt value 88 | let type = "string"; 89 | let enumVals; 90 | if (variable.pvt === "onoff") { 91 | type = "string"; 92 | enumVals = ["on", "off"]; 93 | } else if (variable.pvt === "n") { 94 | type = "number"; 95 | } else { 96 | type = "string"; 97 | } 98 | 99 | schema.properties[key] = { type: type }; 100 | if (desc) { 101 | schema.properties[key].description = desc; 102 | } 103 | if (enumVals) { 104 | schema.properties[key].enum = enumVals; 105 | } 106 | 107 | // Use clearout as the 'required' flag: 108 | // if clearout is true, then the argument is required. 109 | if (variable.clearout === "true" || variable.clearout === true) { 110 | required.push(key); 111 | } 112 | } 113 | }); 114 | if (required.length > 0) { 115 | schema.required = required; 116 | } 117 | return schema; 118 | } 119 | 120 | // --- Main execution --- 121 | const xmlFilePath = process.argv[2]; // Get XML file path from command line argument 122 | 123 | if (!xmlFilePath) { 124 | console.error("Usage: node xml-to-tools.js "); 125 | process.exit(1); 126 | } 127 | 128 | convertXmlToJsonTools(xmlFilePath) 129 | .then(jsonOutput => { 130 | if (jsonOutput) { 131 | console.log(jsonOutput); 132 | } else { 133 | console.error("Failed to convert XML to JSON Tools."); 134 | } 135 | }); 136 | --------------------------------------------------------------------------------