Atlas / MCP servers / thenavidm / slipway

slipwaySAFE

mcp/thenavidm/slipway

TypeScript framework for MCP servers and CLIs, for Claude Code, Codex and AI agents. Describe each tool once and Slipway ships both, with write safety, typed results and release checks built in.

Verdict
SAFE
Grade
B
Trust score
89 /100
Exposed tools
56 26r · 24w · 6d
Transport
—
License
Apache-2.0
Stars
0
01

Overview

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

[](https://www.npmjs.com/package/@thenavidm/slipway) [](https://github.com/thenavidm/slipway/actions/workflows/ci.yml) [](./LICENSE) [](https://youtube.com/@thenavidm?sub_confirmation=1) [](https://x.com/thenavidm) [](https://linkedin.com/in/thenavidm)

TypeScript framework for MCP servers and CLIs, for Claude Code, Codex and AI agents. Describe each tool once and Slipway ships it as an MCP server tool and a command line command, with write safety, typed results and release checks built in.

The two surfaces cannot drift apart. They are generated from the same tool list, and every call on either one runs through the same code: the same validation, the same guard, the same errors.

Built and maintained by Navid Moazzez.

Two ways to use it

Every server built on Slipway ships both, from one definition like this:

import { defineTool, slipway, z } from "@thenavidm/slipway";

const deleteNote = defineTool({
name: "delete_note",
title: "Delete a note",
description: "Delete a note forever. There is no undo and no trash.",
input: z.object({ id: z.number().int().describe("The note id.") }),
risk: "destructive",
positional: ["id"],
summary: ({
Read from source at commit b63ed3e246f4OBSERVED · 2026-10-11
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. Replace the environment placeholders with a token scoped to the least it needs.

claude-code
claude mcp add slipway --env SOME_API_KEY=${SOME_API_KEY} -- npx -y @thenavidm/[email protected]
claude-desktop
{
  "mcpServers": {
    "slipway": {
      "command": "npx",
      "args": [
        "-y",
        "@thenavidm/[email protected]"
      ],
      "env": {
        "SOME_API_KEY": "${SOME_API_KEY}"
      }
    }
  }
}
03

Exposed tools (56)

26 read · 24 write · 6 destructive. Blast radius: 6 tools can delete or overwrite — an agent that can be talked into calling a tool can be talked into calling this one.

ToolRiskDescription
add_notewriteAdd a note to the list.
api_postwritePost something.
api_putwritePut something.
api_rawdestructiveCall any method of the API. A GET only reads; a POST writes, and a DELETE cannot be undone.
bookreadBook one slot on the calendar at a given time.
chartreadRender the number of notes as a tiny PNG chart image.
create_notewriteCreate a new note with a title and body text. Returns the new note.
create_postwritePublish a post.
create_topicwriteCreate a topic in a forum group, as the account.
delete_mediadestructiveDelete one media file.
delete_notedestructiveDelete a note for good.
delete_postdestructiveDelete a post.
draftwriteSave a draft only you can see.
drop_alldestructiveDrop every record in the account, with no undo.
export_allreadExport every note as one JSON document. Counts against the monthly export quota.
export_archivereadExport every video
get_bookreadRead one book by its id, with its blurb.
get_media_itemreadFetch a single media item by id. To reach anything else, use start_pick_session.
get_notereadRead one note by its id.
get_postwriteRead one post by its id.
get_thingreadGets it.
hugereadA tool whose input schema is far too large to load cheaply.
imaginereadGenerate four images from a prompt, which costs GPU time from the plan.
import_mediawriteImport a media file from a URL.
list_booksreadList books in the catalog, two at a time, optionally by one author.
list_jobsreadList recent generation jobs, newest first.
list_notesreadList every note, newest first.
list_postsreadList the posts.
local_searchreadSearch the records synced to this machine from ${listed}. Fast, offline, and costs no API calls. If nothing is found, or the data may be old, run local_sync first.
local_syncwriteCopy every record one of ${listed} lists to this machine, page by page, so local_search can find them offline. Runs in the background, since a long list takes a while.
mute_accountreadMute an account for a while, or for good when no duration is given.
peekreadLook at one job by its id.
photo_inforeadEverything known about specific items, by uuid.
pingreadAnswer pong, to prove the server is alive and answering.
probereadReturn the client
publishwritePublish a post for everyone to see.
publish_stagedwritePublish a post that was staged earlier, by its container id.
read_postwriteRead a post back.
refund_orderwriteRefund an order in full, which sends the money back to the buyer at once.
removedestructiveRemove one item for good.
rename_bookwriteChange a book
rename_notewriteChange a note
render_videowriteStart rendering a video from a title. Rendering runs on the service and takes a while.
replyreadReply in a chat.
rerun_jobwriteSubmit the same job again with the same settings.
save_postwriteSave a post as a draft, or publish it, which everyone can read at once.
send_messagewriteSend a private message, which cannot be unsent.
set_fieldswriteSet custom fields on a post, by name, to the values given.
set_titlewriteSet the title on one item, by its uuid.
slow_reportreadBuild a report that takes a long time, for testing timeouts.
start_nothingwriteStart a job but forget to say which one, for testing a broken service.
start_pick_sessionwriteOpen a picker so the user can choose photos from their library.
summarizereadSummarize every note.
twicereadA tool that carries the same definitions twice in its input schema.
vary_imagereadMake variations of one generated image.
whoamireadSay which account the server acts as.
04

Trust audit

SAFEgrade B · trust 89/100 Nothing in the source contradicts what it says it does. Grade A is reserved for packages that have also passed the behavioural sandbox.

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

What the source does

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

Findings (8)

MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
api_raw, delete_media, delete_note, delete_post, drop_all, remove
Why it matters. 6 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
src/cli/context.ts:18
export const SLIPWAY_VERSION: string = (require("../../package.json") as { version: string }).version;
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/fixtures/library.ts:9
import { slipway, toolkit, z } from "../../src/index.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/fixtures/notes-bin.mjs:3
import { defineTool, slipway } from "../../dist/index.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/fixtures/notes.ts:8
import { AuthError, content, httpError, image, jsonSchema, slipway, toolkit, z } from "../../src/index.js";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
tests/fixtures/renders.ts:6
import { slipway, toolkit, z } from "../../src/index.js";
LOWNetwork egress · net.raw_ip · CWE-200, CWE-319
tests/openapi.test.ts:179
return { seen, url: `http://127.0.0.1:${port}/v1`, close: () => new Promise<void>((resolve) => server.close(() => resolve())) };
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@modelcontextprotocol/server, zod, @modelcontextprotocol/client, @types/node, ajv, typescript, vite, vitest
Why it matters. 8 dependency range(s) float
Fix. pin exact versions or ship a lockfile

Gates applied: no_behavioural_pass.

Audited 2026-10-11 · audit v0.4.1 · source sha b63ed3e246f4full audit observations/trust-audit/mcp-server/thenavidm__slipway.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-11b63ed3e246f4SAFEB89first audit
06

Questions

What is the slipway MCP server?

TypeScript framework for MCP servers and CLIs, for Claude Code, Codex and AI agents. Describe each tool once and Slipway ships both, with write safety, typed results and release checks built in.

What tools does slipway expose?

56 in total: 26 read-only, 24 that write, and 6 that can delete or overwrite (api_raw, delete_media, delete_note, delete_post, drop_all). Every one is listed on this page with its risk.

Is slipway safe to connect to an agent?

The audit found nothing in the source that contradicts what it says it does, and graded it B (89/100). Grade A is held back for packages that have also passed a sandboxed behavioural run, which is why a clean server reads B. Separately from the audit: 6 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does slipway need?

It reads SOME_API_KEY from the environment. Give it a token scoped to the least it needs — an agent that can be talked into calling a tool can be talked into calling it with your credentials.

How current is this page?

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

Advertisement