serverkitBLOCK
The shared base of a TypeScript backend on Postgres: plain SQL migrations first.
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 --statusignored the flag it did not know and applied every pending
file.
- A database dump sets
search_pathto 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
978c5fe29aaeOBSERVED · 2026-10-11Connect
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 mcp add server -- npx -y @gusnips/[email protected]
{
"mcpServers": {
"server": {
"command": "npx",
"args": [
"-y",
"@gusnips/[email protected]"
]
}
}
}Exposed tools (10)
9 read · 1 write · 0 destructive.
| Tool | Risk | Description |
|---|---|---|
Idempotency-Key | write | Send the same key to get the first answer back. |
Numbers | read | Your numbers. |
X-Trace | read | Yours to follow. |
count | read | Adds one. |
echo | read | Says it back. |
find_places | read | Finds places by name. |
get_place | read | Reads one place. |
list_numbers | read | Lists them. |
pair_number | read | Pairs it. |
x | read | x |
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.
| Layer | What it checks | Result |
|---|---|---|
| L0 | Provenance & inventory | PASS |
| L1 | Static analysis of the code | FAIL |
| L2 | Instruction surface (what it tells the agent) | PASS |
| L3 | Class-specific surface | WARN |
| L4 | Behavioural (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)
exec(): Promise<[error: Error | null, result: unknown][] | null>;
ssl?: false | { rejectUnauthorized: false };return { ssl: supabaseCloud ? { rejectUnauthorized: false } : false };DATABASE_URL: "postgres://app:[email protected]/app",
createLogger({ write }).error("connect to postgres://app:hunter2@db:5432/x failed", {createLogger({ write }).error("connect to postgresql://app:first@[email protected]/app failed");dsn: "postgres://app:hunter2@db/x",
const url = "redis://default:[email protected]:6379";
const secret = "a-service-key-the-deployment-already-holds";
const SECRET = "sb_secret_a-service-key-the-deployment-already-holds";
const SECRET = "whsec_c2lnbmluZy1zZWNyZXQtZm9yLXRlc3Rz";
secret: "whsec_MfKQ9r8GKYqrTwjUPD8ILPZIo2LaLaSw",
streamable-http
.prettierignore
`import type { OpenApiOperation } from ${JSON.stringify(join(here, "../../server/src/openapi/index.ts"))};import { AppError } from "../../errors.ts";import { listUnsubscribeHeaders } from "../../unsubscribe.ts";readFileSync(new URL("../../README.md", import.meta.url), "utf8"),at 169.254.169.254, so an unchecked URL lets anyone who can save one aim it inward.
checkUrlShape("https://169.254.169.254/latest/meta-data/");"/to-metadata": (res) => redirect(res, 302, "http://169.254.169.254/latest/meta-data/"),
expect(checkUrlShape("https://169.254.169.254/latest/meta-data/")).toEqual({"169.254.169.254",
loopback, so all four production references advertised `http://127.0.0.1:<port>`. The fifth
checkUrlShape("https://169.254.169.254/latest/meta-data/");Gates applied: no_behavioural_pass.
978c5fe29aaefull audit observations/trust-audit/mcp-server/gusnips__serverkit.json · Report an issue / request a re-scanAudit history
Every audit this server has had. A grade with a past is a grade somebody is still checking.
| Date | Source | Verdict | Grade | Score | Change |
|---|---|---|---|---|---|
| 2026-10-11 | 978c5fe29aae | BLOCK | F | 53 | first audit |
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.