Agent Economy Report

Skill code audit

CAUTION version 1.0.5 · audited 2026-09-17

agent-phone-call @mrsz

This package connects an AI agent to the PollyReach phone service. It registers an agent, saves the returned token to ~/.config/PollyReach/key.json, and provides shell scripts to activate a phone number, send outbound call tasks, poll for call results, retrieve inbound messages, update the inbound answering prompt, and check credit balance. The scripts send the stored token to api.pollyreach.ai as a bearer token, and calls can consume prepaid PollyReach credits. Observed network calls match the declared PollyReach domains, and no hidden domains, obfuscation, download-and-execute, persistence, or wallet redirection were found. The main cautions are plaintext credential storage, documentation that passes the token as a CLI argument, and prominent promotional, polling, and sharing instructions.

Declared purposeGive an AI agent a phone number and the ability to make outbound calls, answer incoming calls, retrieve call summaries, update inbound answering prompts, and check balance through PollyReach.
Observed behaviorSKILL.md instructs the agent to register by POSTing name/source/description to https://api.pollyreach.ai/platform/v1/auths/signin/device and to save the resulting token in ~/.config/PollyReach/key.json. The six bash scripts read that key file and call PollyReach endpoints with an Authorization: Bearer header: activation.sh GETs activation status; send.sh POSTs a message to openclaw/completions; query.sh polls openclaw/query with an empty JSON body; balance.sh GETs credits/balance; inbound.sh GETs sms_messages/unread and prints caller number plus content; prompt_update.sh POSTs a custom prompt. The scripts use jq for JSON construction and parsing and implement retry loops, but no script writes credentials, installs packages, or persists itself.
Verdict, rules onlyCAUTION · reads credential-like environment variables: KEY_FILE, POLLYREACH_KEY_FILE, TOKEN; uses sudo, rm -rf or dd
Verdict, AICAUTION
Final verdictCAUTION (never better than either pass)

Capabilities

capabilityvs purposedetail
networkneededAll shell scripts use curl to send HTTPS requests to api.pollyreach.ai; SKILL.md also references agent.pollyreach.ai and pollyreach.ai.
shellneededSKILL.md directs the agent to execute bash scripts such as send.sh, query.sh, activation.sh, balance.sh, inbound.sh, and prompt_update.sh.
filesystem_readneededEach script reads the PollyReach token from ${POLLYREACH_KEY_FILE:-$HOME/.config/PollyReach/key.json}.
filesystem_writeneededSKILL.md instructs saving the PollyReach token and agent_name to ~/.config/PollyReach/key.json; the scripts themselves only read that file.
credentialsneededThe package stores a PollyReach bearer token in a plaintext key file and sends it in Authorization: Bearer headers on every API call.
paymentsneededThe service uses prepaid credits; the skill checks balance and includes top-up prompts/links. It can initiate calls that spend those credits, but does not process payments directly.
install_packagesneededSKILL.md dependency metadata lists install commands such as brew install jq and sudo apt install jq; scripts print these commands when jq is missing.

Findings

severityfinding
infoRegistration endpoint
The skill directs the agent to register with PollyReach by POSTing name, source, and description to this endpoint and receiving a token.
SKILL.md:123 https://api.pollyreach.ai/platform/v1/auths/signin/device
mediumToken saved in plaintext
The PollyReach service token is stored in the user's home config directory; later scripts require this file.
SKILL.md:148 Save to `~/.config/PollyReach/key.json`:
mediumCredentials exposed to stdout
The setup instructions tell the agent to cat the credential file, which can reveal the token in chat or logs.
SKILL.md:109 cat ~/.config/PollyReach/key.json 2>/dev/null
infoAll scripts read the credential file
Each script resolves the key file from the user's home directory and allows override through POLLYREACH_KEY_FILE.
scripts/activation.sh:16 $HOME/.config/PollyReach/key.json
mediumToken sent as bearer credential
Activation status requests send the stored token to api.pollyreach.ai in an Authorization header.
scripts/activation.sh:31 -H "Authorization: Bearer $TOKEN"
infoBalance check
Queries remaining PollyReach credits; line 30 also sends the bearer token.
scripts/balance.sh:29 https://api.pollyreach.ai/platform/v1/credits/balance
infoOutbound call task endpoint
Sends the user's message to PollyReach to initiate a phone call task; the bearer token is sent on the following header line.
scripts/send.sh:38 https://api.pollyreach.ai/platform/v1/chat/openclaw/completions
infoSafe JSON construction
The script uses jq to embed the message into JSON rather than string interpolation, reducing shell injection risk.
scripts/send.sh:35 jq -n --arg msg
infoCall result polling
Polls PollyReach for the most recent call result, up to 300 times at 2-second intervals, and prints when done=true.
scripts/query.sh:28 https://api.pollyreach.ai/platform/v1/chat/openclaw/query
infoInbound message retrieval
Although SKILL describes incoming call summaries, the script retrieves unread sms_messages and extracts from_phone and content.
scripts/inbound.sh:29 https://api.pollyreach.ai/platform/v1/sms_messages/unread
infoInbound prompt update endpoint
Updates how Polly answers incoming calls using the stored token.
scripts/prompt_update.sh:37 https://api.pollyreach.ai/platform/v1/users/phone/pollyreach/update
mediumDocs pass token as CLI argument
The documented command includes YOUR_TOKEN as a shell argument even though the scripts ignore it and read the token from the key file. Following the docs can expose the token in process listings or shell history.
SKILL.md:240 ./send.sh "Your message content" YOUR_TOKEN
infoDependency install command
The metadata provides an install command for jq using sudo, which requires elevated privileges if executed.
SKILL.md:42 sudo apt install jq
lowStrong polling guidance
Encourages the agent to set up repeated inbound.sh polling, such as every 5-10 minutes; this is not implemented as persistent code but increases ongoing API use and data collection.
SKILL.md:397 **CRITICAL - Proactive Polling Required:** Polly answers incoming calls and generates summaries, but agents MUST actively query to retrieve call information.
infoPromotional top-up and referral links
Output templates instruct the agent to include PollyReach top-up and referral links in user-facing messages.
SKILL.md:325 ⭐ [Top up](https://agent.pollyreach.ai/) · 🎁 Share for free credits — ask me how
lowShare-copy propagation
The sharing guide provides copy that directs another agent or human to install the same SKILL.md; this is conditional on the user choosing to share.
SKILL.md:492 Read https://pollyreach.ai/SKILL.md and follow the instructions to install PollyReach
mediumCall data shared with third party
The publisher acknowledges that sensitive call data is shared with PollyReach and may appear in agent chat.
skill-card.md:25 Risk: Phone numbers, call transcripts, recordings, summaries, and caller details may be shared with PollyReach and surfaced in agent chat.

0 AI finding(s) were dropped because their file, line or quote did not match the package.

Network destinations in the code

domainservice ratingwhere
agent.pollyreach.ainot in the service indexSKILL.md:25
api.pollyreach.ainot in the service indexSKILL.md:24
clawhub.ainot in the service indexskill-card.md:9
pollyreach.ainot in the service indexSKILL.md:60

Other facts

Binaries invokedbash, curl, sudo
Environment variables readBALANCE, BODY, COMBINED_CONTENT, CONTENT, DONE, FROM_PHONE, HOME, HTTP_CODE, HTTP_RESPONSE, KEY_FILE, MAX_RETRIES, MESSAGE, MSG, MSG_COUNT, PHONE, POLLYREACH_KEY_FILE, RESPONSE, RESPONSE_BODY, SLEEP, STATUS, SUCCESS, TASK_ID, TOKEN
Hard-coded walletsnone
Pipes a download to a shell0
eval / exec / subprocess0
base64 blobs0
File writes11
Persistence0

Files audited

filelinessha256
SKILL.md5358db52e6c9ef016e7…
_meta.json6b4e63c183f64e32a…
scripts/activation.sh545d41e2e7c763dec6…
scripts/balance.sh52fe38bbf6ef75c26e…
scripts/inbound.sh6699f537738bc6eef4…
scripts/prompt_update.sh60c64868fd7ab7c1b7…
scripts/query.sh444cf8e91e4b0905c2…
scripts/send.sh69d276444729af03bb…
skill-card.md5950cfed1a89906af8…

For agents

JSON: https://agenteconomy.report/k/agent-phone-call.audit.json · badge: https://agenteconomy.report/k/agent-phone-call.audited.svg · skill rating: /k/agent-phone-call · commission an audit of any skill: US$ 29 per version.

How this is computed

The complete published package of this exact version was downloaded from the registry and read statically; nothing was executed. A deterministic pass extracts network destinations, binaries, environment variables, writes, install commands, obfuscation markers, subprocesses and wallets, each with file and line. An AI then reads the whole package with those facts and writes the summary, the capabilities and the findings under a strict schema; every finding it produces must cite a file, a line and the exact text, or it is dropped. The final verdict is the worst of the two passes. The audit does not change the skill's trust tier (policy); the author may respond through the dispute channel and the response is published here. Commissioned by: the Agent Economy Report (free program: the 150 most downloaded skills, September 2026).