Most static findings are false positives caused by Markdown backticks, placeholders, or intended requests to the local TaskNotes API. Semantic review found unvalidated URL construction, optional authentication, and deletion without confirmation. No prompt injection or malicious exfiltration intent was found.
The skill intentionally runs local CLI commands and uses the TaskNotes localhost HTTP API to read, create, update, and delete Obsidian tasks. No prompt injection or external cloud endpoint was found, but the skill handles an API token, loads a vault-root .env file, and has mutating and destructive task operations.
The comment describes loading .env from the vault root, and the following code performs that load. A vault-root environment file may contain unrelated secrets.
3. **Environment variables** in `.env` file at vault root (if using auth):
The documentation instructs users to keep TaskNotes API configuration in a vault-root .env file. This is sensitive configuration guidance, though the actual file read is in scripts/tasks.py.
Unvalidated API Port Can Redirect Authenticated Requests
TASKNOTES_API_PORT is inserted into BASE_URL without numeric validation, and TASKNOTES_API_KEY is sent as a bearer header. A crafted port value could change URL parsing and send task data or the token away from localhost.
The code directly interpolates API_PORT into an HTTP URL and sends headers through requests. Exploitation requires malicious environment or config control, so confidence is high but not absolute.
The CLI exposes a delete command that calls DELETE /tasks/{id} without an in-script confirmation, dry-run, or soft-delete safeguard. A mistaken task path can remove a TaskNotes task from the vault.
The documented delete command maps directly to a DELETE API request in code. No confirmation or recovery safeguard is visible in the cited lines.
Capability review items (25)
These are real local capabilities that may be expected for this skill, so they require review but are not counted as confirmed malicious behavior.
The conditional shows API_KEY is used in the request flow when present. This confirms runtime credential handling, although the value is user supplied.
The bash block documents uv run scripts/tasks.py commands that agents may execute, including create, update, and delete. The commands are local and purposeful, but external command execution is real.
api_request constructs HTTP calls to the TaskNotes API and is used by list, create, update, delete, stats, and options commands. The endpoint is intended for localhost, but this confirms network access to task data.
requests.request sends parameters, JSON bodies, and headers to BASE_URL. The URL is intended for localhost, but the skill performs real HTTP network I/O.
The script reads TASKNOTES_API_PORT from the environment and uses it to construct the API URL. This is configuration access that influences the network target.
The skill documents http://localhost:8080/api as its base endpoint. It is local rather than external, but it confirms dependence on a plaintext local HTTP API.
The skill is a legitimate Obsidian TaskNotes CLI, but it has real security surface: it loads a vault-root .env, reads API credentials, and sends HTTP requests to a local API that can create, update, and delete tasks. Most markdown backtick detections are false positives, and no prompt injection text was found. The main unresolved risk is unvalidated TASKNOTES_API_PORT, which can affect the parsed request host when an Authorization header is present.
Unvalidated Local API Port Can Change Request Host
TASKNOTES_API_PORT is inserted into the URL without numeric validation. A crafted port value can change the parsed host and send the Authorization header away from localhost.
The code builds BASE_URL with an unvalidated environment value and passes headers containing the API key to requests.request. URL userinfo parsing makes host confusion possible if the port value is crafted.
Capability review items (23)
These are real local capabilities that may be expected for this skill, so they require review but are not counted as confirmed malicious behavior.
The script loads a .env file from the vault root before making API requests. This is intended configuration, but it broadens access to local secret material.
The script loads a .env file from the vault root before making API requests. This is intended configuration, but it broadens access to local secret material.
The script places TASKNOTES_API_KEY into an Authorization bearer header. This is intended auth behavior, but it creates a credential transmission path.
The markdown section contains bash examples that run uv with scripts/tasks.py. The command is expected, but it still instructs external command execution.
The script reads TASKNOTES_API_PORT from the environment to configure the local API endpoint. This is legitimate configuration access but affects request construction.
The script reads TASKNOTES_API_PORT from the environment to configure the local API endpoint. This is legitimate configuration access but affects request construction.
Static analysis found network access, environment variable access, documented shell commands, and several weak-crypto heuristics. Review confirms the skill uses a local TaskNotes HTTP API and optional bearer token, while the weak-crypto and prompt-injection signals are false positives. Publication is acceptable with a warning because API credentials are read from .env and sent over plain HTTP to the configured local endpoint.
2
Files scanned
447
Lines analyzed
8
Review items
1
False positives ignored
Capability review items (4)
These are real local capabilities that may be expected for this skill, so they require review but are not counted as confirmed malicious behavior.
The script loads TASKNOTES_API_KEY from a vault .env file and adds it as a bearer token for requests to the TaskNotes API. The target is intended to be localhost, but plain HTTP and an unvalidated port configuration make credential exposure possible if local configuration is changed or traffic is intercepted on the host.
The code clearly reads an API token and sends it in an Authorization header on HTTP requests. The intended localhost use lowers confidence of malicious intent, but the credential-handling risk is real.
Task titles, details, project names, dates, contexts, and task identifiers are transmitted to the TaskNotes HTTP API. This is core functionality, but it can expose private task content to any process serving the configured local endpoint.
The request payload is built directly from user task fields and sent through api_request. This matches the skill purpose, but it carries sensitive personal task data.
SKILL.md contains uv run examples for invoking the bundled CLI. These are documentation examples rather than dynamic shell execution in code, so command execution findings are mostly false positives.
The flagged lines are fenced command examples in documentation. They do execute the local script when followed, but no dynamic command construction is present there.
Reconnaissance Heuristics Are URL Encoding And Task Queries
Static reconnaissance matches point to URL encoding of task identifiers and normal TaskNotes list or options commands. No evidence found of host, network, or system discovery behavior.
The cited code quotes a task path for a URL and calls documented TaskNotes endpoints. The behavior is scoped to task management, not reconnaissance.
Static false positives ignored (1)
These static matches were dismissed by semantic review or matched schema-only tokens, so they are shown for transparency but do not drive the quality score.
Static weak-cryptography matches refer to markdown syntax, date examples, or argparse help text rather than cryptographic functions. No evidence found of MD5, SHA1, DES, RC4, or similar weak algorithms being used.
Manual review of the cited lines found task descriptions, markdown API documentation, and command-line argument definitions. There is no cryptographic operation at those locations.
Standard task management tool with minimal risk. All 89 static findings are false positives. Network calls go exclusively to localhost (Obsidian TaskNotes API), not external endpoints. Environment variables are for local configuration only. No dangerous patterns, data exfiltration, or credential exfiltration detected.
Standard task management tool with minimal risk. All 89 static findings are false positives. Network calls go exclusively to localhost (Obsidian TaskNotes API), not external endpoints. Environment variables are for local configuration only. No dangerous patterns, data exfiltration, or credential exfiltration detected.
Standard task management tool with minimal risk. Only communicates with local Obsidian API on localhost. Reads specific environment variables for configuration. No dangerous patterns or data exfiltration capabilities detected.
Standard task management tool with minimal risk. Only communicates with local Obsidian API on localhost. Reads specific environment variables for configuration. No dangerous patterns or data exfiltration capabilities detected.
Standard task management tool with minimal risk. Only communicates with local Obsidian API on localhost. Reads specific environment variables for configuration. No dangerous patterns or data exfiltration capabilities detected.