github analyzed a8a7873 deep scan · partial (156/2,213 files) unconfirmed MCP

HeyPuter/puter

github

Puter MCP enables AI tools to interact with Puter: manage files, websites, workers, and more

maintainer
HeyPuter
licence
first seen
2026-06-13
last seen
2026-06-13
releases · 30d
0
short id

Drift inferred · capture-to-capture

  1. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  2. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  3. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  4. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  5. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  6. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  7. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  8. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  9. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  10. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  11. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  12. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  13. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  14. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  15. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  16. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  17. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  18. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  19. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
  20. HIGH code analysis flagged dynamic code execution in HeyPuter/puter
capabilities 0 tools
transport http counts 0 tools · 0 res · 0 prompts permission surface via code analysis

No tools enumerated yet for this server.

skills & danger signals github-tarball
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

danger signals8

code evidence vHEAD · github-tarball
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()));