Puter MCP enables AI tools to interact with Puter: manage files, websites, workers, and more
Drift inferred · capture-to-capture
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
- HIGH code analysis flagged dynamic code execution in HeyPuter/puter
transport http counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit a8a7873 · analyzer v33 · 5h ago
skills & prompt files 2
- agent-rules HeyPuter-puter-a8a7873/AGENTS.md
- agent-rules HeyPuter-puter-a8a7873/CLAUDE.md
danger signals8
- dynamic code execution new Function() HeyPuter-puter-a8a7873/src/backend/services/events/workerSource.ts :88
new Function(registerEntry(name, source)); - dynamic code execution new Function() HeyPuter-puter-a8a7873/src/backend/services/homepage/PuterHomepageService.test.ts :456
new Function( - dynamic code execution vm exec HeyPuter-puter-a8a7873/src/puter-js/src/init.cjs :39
vm.runInNewContext(code, context); - dynamic code execution new Function() HeyPuter-puter-a8a7873/src/puter-js/src/modules/events/lib/handlerSource.test.js :29
expect(() => new Function(`return (\n${source}\n);`)).not.toThrow(); - suspicious endpoint 169.254.169.254 (cloud metadata) HeyPuter-puter-a8a7873/src/backend/util/secureHttp.test.ts :334
res.writeHead(302, { location: 'http://169.254.169.254/' }); - suspicious endpoint t.me HeyPuter-puter-a8a7873/src/gui/src/helpers/socialLink.js :132
'telegram.me': `https://t.me/share/url?url=${ url }&text=${ text }&to=${ phone_number}`, - over-broad OAuth scope https://mail.google.com/ HeyPuter-puter-a8a7873/src/gui/src/helpers/socialLink.js :117
'gmail': `https://mail.google.com/mail/?view=cm&to=${ email_address }&su=${ title }&body=${ url }&bcc=${ bcc_email_address }&cc=${ cc_email_address}`, - credential in logs credential in log HeyPuter-puter-a8a7873/src/backend/services/selfhosted/DefaultUserService.ts :145
console.log(`password for admin is: ${tmpPassword}`);
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 1383
filesystem 93
- fs (weak) HeyPuter-puter-a8a7873/extensions/devWatcher.test.ts :1
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/extensions/devWatcher.ts :5
import { existsSync, readFileSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/extensions/serverInfo.ts :3
import fs from 'fs/promises'; - fs (weak) HeyPuter-puter-a8a7873/src/backend/clients/database/MySQLDatabaseClient.test.ts :20
import { mkdtempSync, rmSync, writeFileSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/src/backend/clients/database/MySQLDatabaseClient.ts :20
import { readdirSync, readFileSync } from 'fs'; - fs HeyPuter-puter-a8a7873/src/backend/clients/database/PostgresDatabaseClient.ts :20
import { readdirSync, readFileSync } from 'fs'; - fs (weak) HeyPuter-puter-a8a7873/src/backend/clients/database/SqliteDatabaseClient.test.ts :21
import { existsSync, mkdtempSync, readFileSync, rmSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/src/backend/clients/database/SqliteDatabaseClient.ts :20
import { existsSync, mkdirSync, readFileSync } from 'fs'; - fs (weak) HeyPuter-puter-a8a7873/src/backend/clients/s3/S3Client.test.ts :21
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/src/backend/clients/s3/S3Client.ts :33
import { existsSync } from 'node:fs'; - fs (weak) HeyPuter-puter-a8a7873/src/backend/controllers/auth/AuthController.test.ts :2564
await server.services.fs.mkdir(user.id, { - fs HeyPuter-puter-a8a7873/src/backend/controllers/auth/AuthController.ts :3244
await this.services.fs.mkdir(userId, {
show 28 more
- fs HeyPuter-puter-a8a7873/src/backend/controllers/fs/FSController.ts :1452
const entry = await this.services.fs.mkdir(userId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/controllers/fs/LegacyFSController.test.ts :2502
it('forwards overwrite, dedupe_name, create_missing_parents to fs.mkdir', async () => { - fs HeyPuter-puter-a8a7873/src/backend/controllers/fs/LegacyFSController.ts :652
// the entry to exist — `services.fs.mkdir` honors `create_missing_parents` - fs (weak) HeyPuter-puter-a8a7873/src/backend/controllers/static/StaticAssetsController.test.ts :20
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/src/backend/controllers/static/StaticAssetsController.ts :21
import { existsSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/src/backend/controllers/webdav/WebDAVController.ts :785
const entry = await this.services.fs.mkdir(userId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/core/http/middleware/hostRedirects.test.ts :21
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/src/backend/core/http/middleware/hostRedirects.ts :21
import { stat } from 'node:fs/promises'; - fs (weak) HeyPuter-puter-a8a7873/src/backend/core/http/middleware/puterSite.test.ts :1229
await server.services.fs.mkdir(owner.id, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/drivers/ai-chat/providers/modelCatalogs.test.ts :50
import { readdirSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/src/backend/drivers/workers/WorkerDriver.ts :21
import { existsSync, readFileSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/src/backend/index.ts :20
import { existsSync, readFileSync } from 'node:fs'; - fs HeyPuter-puter-a8a7873/src/backend/server.ts :27
import { existsSync, readdirSync, readFileSync } from 'node:fs'; - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/auth/AuthService.test.ts :1988
await server.services.fs.mkdir(user.id, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/anchors.integration.test.ts :51
const created = await env.server.services.fs.mkdir(user!.id, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/appDeletion.integration.test.ts :137
await env.server.services.fs.mkdir(userId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/appSockets.integration.test.ts :76
await env.server.services.fs.mkdir(forUserId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/durable.integration.test.ts :813
await tiered.server.services.fs.mkdir(tieredUserId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/handlers.integration.test.ts :174
await env.server.services.fs.mkdir(userId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/registry.test.ts :20
import { readFileSync } from 'node:fs'; - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/scoping.integration.test.ts :141
await env.server.services.fs.mkdir(userId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/workerInvoker.integration.test.ts :294
await env.server.services.fs.mkdir(userId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/workerRuntime.integration.test.ts :365
await env.server.services.fs.mkdir(userId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/workerSource.test.ts :29
import { readFileSync } from 'node:fs'; - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/events/workers.integration.test.ts :115
await env.server.services.fs.mkdir(userId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/fs/FSService.test.ts :544
await fs.mkdir(user.userId, { - fs (weak) HeyPuter-puter-a8a7873/src/backend/services/homepage/PuterHomepageService.test.ts :20
import { mkdtemp, writeFile } from 'node:fs/promises'; - fs HeyPuter-puter-a8a7873/src/backend/services/homepage/PuterHomepageService.ts :21
import { readFile } from 'node:fs/promises';
53 more not shown — this panel samples each group; the count above is the real total.
shell / exec 12
- shell HeyPuter-puter-a8a7873/extensions/devWatcher.ts :4
import { spawn, type ChildProcess } from 'node:child_process'; - shell HeyPuter-puter-a8a7873/src/backend/core/http/middleware/rateLimit.js :134
// ioredis MULTI/EXEC reports per-command failures inside the exec() result - shell (weak) HeyPuter-puter-a8a7873/src/docs/src/sidebar.js :539
title: '<code>exec()</code>', - shell HeyPuter-puter-a8a7873/src/gui/build.js :23
import { execSync } from 'node:child_process'; - shell HeyPuter-puter-a8a7873/src/gui/src/services/ExecService.js :202
child_process.onchange('ipc_status', value => { - shell (weak) HeyPuter-puter-a8a7873/src/mcp-connector/scripts/buildPreamble.mjs :2
import { execSync } from 'node:child_process'; - shell HeyPuter-puter-a8a7873/src/puter-js/src/modules/Workers.js :123
async exec (...args) { - shell (weak) HeyPuter-puter-a8a7873/src/worker/scripts/buildPreamble.mjs :2
import { execSync } from 'node:child_process'; - shell HeyPuter-puter-a8a7873/tools/checkPuterjsTypes.mjs :20
import { execFileSync } from 'node:child_process'; - shell HeyPuter-puter-a8a7873/tools/extensionSetup.mjs :8
import { spawn } from 'node:child_process'; - shell HeyPuter-puter-a8a7873/tools/start.mjs :22
import { spawn } from 'node:child_process'; - shell HeyPuter-puter-a8a7873/tools/typecheck.mjs :30
import { execFileSync } from 'node:child_process';
network 125
- net HeyPuter-puter-a8a7873/src/backend/clients/alarm/slack.ts :154
const res = await fetch(webhookUrl, { - net (weak) HeyPuter-puter-a8a7873/src/backend/clients/dynamodb/DDBClient.test.ts :21
import { createServer, type Server } from 'node:http'; - net HeyPuter-puter-a8a7873/src/backend/clients/dynamodb/DDBClient.ts :43
import { Agent as httpsAgent } from 'node:https'; - net (weak) HeyPuter-puter-a8a7873/src/backend/clients/events/EventsWorkerInvokerClient.test.ts :25
import type { fetch as undiciFetch } from 'undici'; - net HeyPuter-puter-a8a7873/src/backend/clients/events/EventsWorkerInvokerClient.ts :24
import { Agent, fetch as undiciFetch } from 'undici'; - net HeyPuter-puter-a8a7873/src/backend/clients/prelude/PreludeClient.ts :207
const res = await fetch(`${PRELUDE_API_BASE}${path}`, { - net HeyPuter-puter-a8a7873/src/backend/clients/s3/S3Client.ts :35
import { Agent as HttpsAgent } from 'node:https'; - net HeyPuter-puter-a8a7873/src/backend/controllers/events/EventsController.ts :119
async fetch(req: Request, res: Response): Promise<void> { - net (weak) HeyPuter-puter-a8a7873/src/backend/controllers/fs/FSController.http.test.ts :51
const response = await fetch( - net (weak) HeyPuter-puter-a8a7873/src/backend/controllers/notification/NotificationController.http.test.ts :40
fetch(new URL(path, env.apiOrigin), { - net HeyPuter-puter-a8a7873/src/backend/controllers/peer/PeerController.ts :304
const cfRes = await fetch( - net (weak) HeyPuter-puter-a8a7873/src/backend/controllers/puterai/PuterAIController.subscription.http.test.ts :76
fetch(new URL(route, env.apiOrigin), {
show 28 more
- net HeyPuter-puter-a8a7873/src/backend/controllers/puterai/PuterAIController.ts :262
const upstream = await fetch( - net (weak) HeyPuter-puter-a8a7873/src/backend/controllers/share/ShareController.http.test.ts :48
fetch(new URL(path, env.apiOrigin), { - net (weak) HeyPuter-puter-a8a7873/src/backend/controllers/team/TeamController.http.test.ts :47
fetch(new URL(path, env.apiOrigin), { - net (weak) HeyPuter-puter-a8a7873/src/backend/controllers/team/TeamIsolation.http.test.ts :62
fetch(new URL('/stat', env.apiOrigin), { - net (weak) HeyPuter-puter-a8a7873/src/backend/core/http/middleware/egressMetering.http.test.ts :81
const read = await fetch(readUrl, { - net HeyPuter-puter-a8a7873/src/backend/core/http/middleware/localWorkerProxy.ts :63
// Express (Node) request → WHATWG Request the Worker's `fetch(request)` sees. - net (weak) HeyPuter-puter-a8a7873/src/backend/core/http/middleware/reputation.http.test.ts :68
fetch(new URL(path, env.apiOrigin), { - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-chat/providers/infron/InfronProvider.ts :20
import axios from 'axios'; - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-chat/providers/neuralwatt/NeuralwattProvider.ts :20
import axios from 'axios'; - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-chat/providers/ollama/OllamaProvider.ts :20
import axios from 'axios'; - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-chat/providers/openrouter/OpenRouterProvider.ts :20
import axios from 'axios'; - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-image/providers/cloudflare/CloudflareImageProvider.ts :384
const response = await fetch(endpoint, { - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-speech2speech/VoiceChangerDriver.ts :251
const response = await fetch(url, { - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-speech2txt/providers/xai/XAISpeechToTextProvider.ts :192
const response = await fetch(`${API_BASE}/stt`, { - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-tts/providers/elevenlabs/ElevenLabsTTSProvider.ts :77
const response = await fetch(`${this.baseUrl}${path}`, { - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-tts/providers/speechify/SpeechifyTTSProvider.ts :173
const response = await fetch(`${API_BASE}/v1/audio/speech`, { - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-tts/providers/xai/XAITTSProvider.ts :157
const response = await fetch(`${API_BASE}/tts`, { - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-video/providers/byteplus/BytePlusVideoProvider.ts :353
const response = await fetch(`${this.#baseUrl}${path}`, { - net HeyPuter-puter-a8a7873/src/backend/drivers/ai-video/providers/polling.ts :156
job = await opts.fetch(job); - net (weak) HeyPuter-puter-a8a7873/src/backend/drivers/workers/WorkerDriver.cloudflare.test.ts :172
'export default { fetch() {} }', - net HeyPuter-puter-a8a7873/src/backend/drivers/workers/WorkerDriver.ts :771
const res = await fetch( - net (weak) HeyPuter-puter-a8a7873/src/backend/server.test.ts :21
import http from 'node:http'; - net HeyPuter-puter-a8a7873/src/backend/server.ts :31
import http from 'node:http'; - net HeyPuter-puter-a8a7873/src/backend/services/auth/OIDCService.ts :311
const res = await fetch(config.token_endpoint, { - net HeyPuter-puter-a8a7873/src/backend/services/broadcast/BroadcastService.ts :20
import axios from 'axios'; - net (weak) HeyPuter-puter-a8a7873/src/backend/services/events/appDeletion.integration.test.ts :79
const response = await fetch(new URL(path, env.apiOrigin), { - net (weak) HeyPuter-puter-a8a7873/src/backend/services/events/appSockets.integration.test.ts :119
const response = await fetch(new URL('/mkdir', env.apiOrigin), { - net (weak) HeyPuter-puter-a8a7873/src/backend/services/events/authorization.integration.test.ts :78
const response = await fetch(new URL('/mkdir', env.apiOrigin), {
85 more not shown — this panel samples each group; the count above is the real total.
secrets 3
- secrets HeyPuter-puter-a8a7873/src/cli/src/lib/config.js :46
return process.env.PUTER_AUTH_TOKEN ?? getStoredToken(); - secrets HeyPuter-puter-a8a7873/src/mcp-connector/mcpb/server/index.cjs :27
const TOKEN = process.env.PUTER_TOKEN || ''; - secrets (weak) HeyPuter-puter-a8a7873/src/puter-js/tests/e2e/globalSetup.js :69
const ADMIN_PASSWORD = process.env.PUTER_ADMIN_PASSWORD || '';
database 9
- db HeyPuter-puter-a8a7873/src/backend/clients/database/MySQLDatabaseClient.ts :23
import { createPool, type Pool } from 'mysql2'; - db (weak) HeyPuter-puter-a8a7873/src/backend/clients/database/PostgresDatabaseClient.integration.test.ts :20
import { Pool } from 'pg'; - db (weak) HeyPuter-puter-a8a7873/src/backend/clients/database/PostgresDatabaseClient.test.ts :20
import type { FieldDef, QueryResult } from 'pg'; - db HeyPuter-puter-a8a7873/src/backend/clients/database/PostgresDatabaseClient.ts :22
import { Pool, type PoolConfig, type QueryResult } from 'pg'; - db (weak) HeyPuter-puter-a8a7873/src/backend/clients/database/SqliteDatabaseClient.test.ts :20
import Database from 'better-sqlite3'; - db HeyPuter-puter-a8a7873/src/backend/clients/redis/RedisClient.ts :20
import Redis, { Cluster } from 'ioredis'; - db (weak) HeyPuter-puter-a8a7873/src/backend/controllers/webdav/locks.test.ts :20
import type { Cluster } from 'ioredis'; - db HeyPuter-puter-a8a7873/src/backend/controllers/webdav/locks.ts :22
import type { Cluster } from 'ioredis'; - db HeyPuter-puter-a8a7873/src/backend/testUtil.ts :15
import type { PoolConfig } from 'pg';
install hooks 2
- prepare HeyPuter-puter-a8a7873/package.json :57
husky - prepublishOnly HeyPuter-puter-a8a7873/src/puter-js/package.json :43
npm run build && mv dist/puter.js dist/puter.cjs && npm version patch
declared dependencies 35
- @aws-sdk/client-s3@^3.1020.0
- @aws-sdk/s3-request-presigner@^3.1028.0
- dedent@^1.5.3
- javascript-time-ago@^2.5.11
- libphonenumber-js@1.13.12
- miniflare@^4.20260617.1
- open@^10.1.0
- @babel/core@^7.29.7
- @eslint/js@^9.35.0
- @playwright/test@^1.56.1
- @typescript-eslint/eslint-plugin@^8.46.1
- @typescript-eslint/parser@^8.46.1
show 23 more
- @vitest/coverage-v8@^4.0.14
- babel-loader@^10.1.1
- babel-plugin-istanbul@^8.0.0
- chalk@^4.1.0
- clean-css@^5.3.2
- dotenv@^16.4.5
- esbuild@^0.28.0
- eslint@^9.35.0
- eslint-config-prettier@^10.1.8
- eslint-plugin-prettier@^5.5.5
- globals@^15.15.0
- husky@^9.1.7
- istanbul-lib-coverage@^3.2.2
- istanbul-lib-report@^3.0.1
- istanbul-reports@^3.2.0
- nodemon@^3.1.0
- prettier@^3.8.3
- prettier-plugin-jsdoc@^1.8.1
- typescript@^5.4.5
- uglify-js@^3.17.4
- vitest@^4.1.5
- webpack@^5.88.2
- webpack-cli@^5.1.1
perm:untrusted 1
- untrusted HeyPuter-puter-a8a7873/src/gui/build.js :30
const assetsTar = Buffer.from(await fetch(argv.assets_url).then(r => r.arrayBuffer()));