├── .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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 <b>Continue Task After Error</b> 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 |
--------------------------------------------------------------------------------