Atlas / MCP servers / gusnips / serverkit

serverkitBLOCK

mcp/gusnips/serverkit

The shared base of a TypeScript backend on Postgres: plain SQL migrations first.

Verdict
BLOCK
Grade
F
Trust score
53 /100
Exposed tools
10 9r · 1w · 0d
Transport
streamable-http
License
MIT
Stars
0
01

Overview

From the repository's own README, as read at the audited commit. Badges and raw HTML are left out.

Packages for the server side of a Bun or Node app on Postgres.

bun add @gusnips/migrate pg
DATABASE_URL=postgresql://postgres@localhost:5432/app bunx gusnips-migrate --dir migrations

That applies every .sql file in migrations/ that has not run yet, in order, each in its own transaction.

To see these next to frontkit's in one app, read the guide. It shows how we lay out a project, then builds a small app from an empty folder: an API on Hono and Postgres, and a web app on React.

Why it exists

Eleven apps each wrote their own migration runner, and ten wrote their own type generator: about 5,700 lines in all. They were not copies. Each one had fixed something the others had not, and each one still had a bug another had already fixed. A few of them:

  • A runner asked "apply this? [y/N]" while holding its lock. Nobody answered, and the next deploy

waited on that lock with no end.

  • In eight runners, migrate --status ignored the flag it did not know and applied every pending

file.

  • A database dump sets search_path to empty and leaves it that way for the session, so replaying

from an empty database failed at the first file after it.

  • A status check that could not reach the database printed nothing, and the workflow read nothing

as "up to date".

This package i

Read from source at commit 978c5fe29aaeOBSERVED · 2026-10-11
Advertisement
02

Connect

Built from this server's own package name, version and transport as found in its source — not copied from anyone's documentation, so it cannot drift against a page we do not control.

claude-code
claude mcp add server -- npx -y @gusnips/[email protected]
claude-desktop
{
  "mcpServers": {
    "server": {
      "command": "npx",
      "args": [
        "-y",
        "@gusnips/[email protected]"
      ]
    }
  }
}
03

Exposed tools (10)

9 read · 1 write · 0 destructive.

ToolRiskDescription
Idempotency-KeywriteSend the same key to get the first answer back.
NumbersreadYour numbers.
X-TracereadYours to follow.
countreadAdds one.
echoreadSays it back.
find_placesreadFinds places by name.
get_placereadReads one place.
list_numbersreadLists them.
pair_numberreadPairs it.
xreadx
04

Trust audit

BLOCKgrade F · trust 53/100 Do not install this without reading the findings. The audit found something that could harm you or your machine.

LayerWhat it checksResult
L0Provenance & inventoryPASS
L1Static analysis of the codeFAIL
L2Instruction surface (what it tells the agent)PASS
L3Class-specific surfaceWARN
L4Behavioural (sandbox)SKIPPED

What the source does

Filesystem
declared (1 observation(s))
Network
declared (2 observation(s))
Shell
declared (1 observation(s))
Dependencies
not all pinned
Secrets in source
found

Findings (25)

HIGHCode injection · code.eval_exec · CWE-78, CWE-94, CWE-95
server/src/redis/window-store.ts:7
exec(): Promise<[error: Error | null, result: unknown][] | null>;
Why it matters. evaluates text as code
Fix. remove; use a parser or a dispatch table
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
migrate/src/ssl.ts:22
ssl?: false | { rejectUnauthorized: false };
Why it matters. certificate verification is disabled
Fix. leave verification on
HIGHNetwork egress · net.tls_off · CWE-200, CWE-319
migrate/src/ssl.ts:34
return { ssl: supabaseCloud ? { rejectUnauthorized: false } : false };
Why it matters. certificate verification is disabled
Fix. leave verification on
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
server/src/env.test.ts:65
DATABASE_URL: "postgres://app:[email protected]/app",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
server/src/logger/index.test.ts:220
createLogger({ write }).error("connect to postgres://app:hunter2@db:5432/x failed", {
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
server/src/logger/index.test.ts:233
createLogger({ write }).error("connect to postgresql://app:first@[email protected]/app failed");
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
server/src/readme.test.ts:160
dsn: "postgres://app:hunter2@db/x",
MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
server/src/redis/index.test.ts:146
const url = "redis://default:[email protected]:6379";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
server/src/readme.test.ts:415
const secret = "a-service-key-the-deployment-already-holds";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
server/src/token.test.ts:5
const SECRET = "sb_secret_a-service-key-the-deployment-already-holds";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
server/src/webhook.test.ts:13
const SECRET = "whsec_c2lnbmluZy1zZWNyZXQtZm9yLXRlc3Rz";
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
server/src/webhook.test.ts:117
secret: "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw",
MEDIUMAuth / authz · mcp.remote_no_auth · CWE-287, CWE-862
streamable-http
Why it matters. a network transport with no auth environment variable found
Fix. require a token
LOWInventory / provenance · inv.hidden_file · CWE-1104
.prettierignore
.prettierignore
Why it matters. hidden member outside the usual dotfiles
Fix. review its purpose
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
sdkgen/src/methods.test.ts:400
`import type { OpenApiOperation } from ${JSON.stringify(join(here, "../../server/src/openapi/index.ts"))};
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
server/src/node/mail/index.test.ts:5
import { AppError } from "../../errors.ts";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
server/src/node/mail/index.ts:25
import { listUnsubscribeHeaders } from "../../unsubscribe.ts";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
server/src/pg/idempotency.test.ts:9
readFileSync(new URL("../../README.md", import.meta.url), "utf8"),
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
server/README.md:950
at 169.254.169.254, so an unchecked URL lets anyone who can save one aim it inward.
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
server/README.md:955
checkUrlShape("https://169.254.169.254/latest/meta-data/");
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
server/src/node/public-fetch.test.ts:64
"/to-metadata": (res) => redirect(res, 302, "http://169.254.169.254/latest/meta-data/"),
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
server/src/readme.test.ts:257
expect(checkUrlShape("https://169.254.169.254/latest/meta-data/")).toEqual({
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.metadata_ip · CWE-200, CWE-319
server/src/url-guard.test.ts:21
"169.254.169.254",
Why it matters. cloud metadata endpoint: the classic SSRF credential grab
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
AGENTS.md:924
loopback, so all four production references advertised `http://127.0.0.1:<port>`. The fifth
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
server/README.md:955
checkUrlShape("https://169.254.169.254/latest/meta-data/");

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha 978c5fe29aaefull audit observations/trust-audit/mcp-server/gusnips__serverkit.json · Report an issue / request a re-scan
05

Audit history

Every audit this server has had. A grade with a past is a grade somebody is still checking.

DateSourceVerdictGradeScoreChange
2026-10-11978c5fe29aaeBLOCKF53first audit
06

Questions

What is the @gusnips/server MCP server?

The shared base of a TypeScript backend on Postgres: plain SQL migrations first.

What tools does @gusnips/server expose?

10 in total: 9 read-only, 1 that write, and 0 that can delete or overwrite. Every one is listed on this page with its risk.

Is @gusnips/server safe to connect to an agent?

No — not without reading the findings first. The audit graded it F (53/100) and found 3 critical or high issues in the source. Each one is listed on this page with the file and line it is on.

What credentials does @gusnips/server need?

No credential environment variables were found in its source, so it appears to need none.

How does @gusnips/server run?

It speaks streamable-http, so it runs as a service you connect to over the network. It is published on npm as @gusnips/server at 0.9.0.

How current is this page?

The grade is for one exact copy of the source (978c5fe29aae), read on 2026-10-11. The repository is watched and re-audited when it changes.

Advertisement