threads@0.1.0
CAUTION· install onlyPublisher claims: "Enables AI agents to access one social-media account for publishing, replying, reading feeds, profiles and comments, searching, and performing likes, follows, and reposts, using official APIs where available and a persistent remote browser otherwise." Observed in sandbox: no network, touches nothing outside the project, writes no memory.
Coverage
Nothing executable in the bundle ran; the trace covers the install step only.- Tested
- every file read, file written and host contacted by what ran
- Not tested
- use of the skill by an agent
What this means for the label: Caution here covers what ran. The server's tools were not exercised with a real credential, so nothing about their behavior is asserted; the credential summary below says what to do with that.
Before you give it your token
- It will ask for
API_TOKENConfiguration, not credentials: BROWSER_HEADED, DATA_DIR, PUBLIC_MEDIA_BASE_URL, THREADS_API_URL- Where it talks to
- no vendor host named in the codeAlso threads.net, threads.com, cdn.test — not the publisher's domain; check what for before connecting.
- What the honeypot saw
- no credential files read · no network
- What we could not test
- use of the skill by an agent
Connect it with a scoped credential, under the guard, and read the third-party hosts first. The code names threads.net, threads.com, cdn.test as well as its own vendor. The guard injects API_TOKEN only into requests to the host you bind (and its subdomains) and refuses the rest.
Never paste a credential into a chat, a ticket or a report, including ours. How the guard holds it.
Is [email protected] safe to install?
KillerSkills ran it in the KillerSkills honeypot sandbox (1 scenario; nothing executable in the bundle ran; the trace covers the install step only) on 2026-11-12 and scored it 73/100 (Caution). It is not known to be malicious, but it has behaviour or code a security policy should decide on before install. Notable findings: Access to sensitive file paths; Privileged sudo command; Access to sensitive file paths. Summary: no network, touches nothing outside the project, writes no memory.
Behavior trace
Honeypot run · 0 s · 1 scenarios · 0 deviationsStatic findings
if [[ ! -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo " sudo htpasswd -cB ${HTPASSWD} admin" >&2Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.set -a; source .env; set +aFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Генерирует конфиг nginx из шаблона, подставляя домен и порты из .env.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "Нет файла .env — скопируй .env.example и заполни." >&2Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.if [[ ! -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "Это предпросмотр. Установить: sudo ./deploy/render-nginx.sh --install" >&2Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# Проверяет, свободны ли хостовые порты из .env, до того как docker composeFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "Установка требует root: sudo ./deploy/render-nginx.sh --install" >&2Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.echo "Нет файла .env — скопируй .env.example и заполни." >&2Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.npm run dev # tsx watch src/main.ts (нужен заполненный .env)Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Порт задан ровно в одном месте (.env) и потому не может разъехаться сFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.`.env`**: оттуда их берёт и `docker-compose.yml`, и `deploy/render-nginx.sh`,Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.# Контейнер отдаёт наружу порт из .env, а сборщик по умолчанию идёт на 8080 —Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.RUN mkdir -p /var/lib/threads-api && chown -R pwuser:pwuser /var/lib/threads-api /appFix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.if [[ ! -f .env ]]; thenFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.kill -TERM -- "-$pid" 2>/dev/null || kill -TERM "$pid"Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.const server = createMcpServer(callOverHttp);Fix: Namespace tool names and keep tool descriptions literal; no instructions to the agent inside them.console.error("Сервис не принял токен — проверь API_TOKEN в .env.");Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.set -a; source .env; set +aFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.echo "Нет файла .env — без него неизвестен токен сервиса." >&2Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.npx vitest run test/oauth.test.ts # один файлFix: Pin versions and sources; vendor anything fetched at install time.kill -0 "$pid" 2>/dev/null || return 1Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.# pidfile (после kill -9 или перезагрузки) не должен выглядеть как работа.Fix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.expect(response.json()).toEqual({ ok: true, data: { id: "post-1" } });Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.chown -R pwuser:pwuser "${PROFILE_DIR}"Fix: Request the narrowest permission that works; replace wildcards with the exact paths or hosts.# Наружу — только петлевой интерфейс хоста и порт из .env.Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.npx vitest run -t "имя теста" # один тест по названиюFix: Pin versions and sources; vendor anything fetched at install time.expect(response.json().error.code).toBe("INVALID_INPUT");Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.console.log(`Выгружено ${posts.length} постов в ${args.exportTo}`);Fix: Remove the call, or declare the host in frontmatter and explain in the README what is sent and why.echo "В .env не задан API_TOKEN — сервис не пустит." >&2Fix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.env_file: .envFix: Stop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.kill -0 "$pid" 2>/dev/null || breakFix: Build commands from fixed arguments; do not interpolate untrusted strings into a shell.Cost to the agent
Tokens estimated at four characters each. Skills load their instruction text when triggered; the figure is what that costs.
Known vulnerabilities
Vulnerability advisories (OSV) cover npm and PyPI packages; this registry has no advisory database.
What would make this Verified
7 points to 80 · weights: behavior 45%, static 25%, prompt 15%, publisher 15%- Unclaimed publisher≈ +8 on the totalClaim astroboyfromspace: a verified publisher gets +50 on publisher trust. It is free and usually instant with GitHub sign-in.
- Access to sensitive file paths≈ +4 on the totalStop enumerating or reading credential locations; take secrets from a declared environment variable the user sets on purpose.
- Privileged sudo command≈ +4 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- File permission modification command≈ +2 on the totalRequest the narrowest permission that works; replace wildcards with the exact paths or hosts.
- Process kill command≈ +2 on the totalBuild commands from fixed arguments; do not interpolate untrusted strings into a shell.
- MCP server using network transport (SSE/HTTP)≈ +2 on the totalNamespace tool names and keep tool descriptions literal; no instructions to the agent inside them.