Atlas / MCP servers / mkly / thelastsaas

thelastsaasCAUTION

mcp/mkly/thelastsaas

An open-source MCP server, API, and CLI for records, files, permissions, and reminders. Single binary, self-hosted.

Verdict
CAUTION
Grade
D
Trust score
66 /100
Exposed tools
64 38r · 18w · 8d
Transport
streamable-http
License
MIT
Stars
6
01

Overview

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

The Last SaaS is a TypeScript backend for records, files, team permissions, notifications, and audit logs, accessed through an HTTP API, MCP, or CLI. It runs on Bun and supports SQLite(mostly for dev and evaluation) and PostgreSQL(preferred).

Local development

Requires Bun 1.2 or later. From the repository root:

bun install
cd packages/server
cp .env.example .env
mkdir -p data
DATABASE_URL=file:../data/lastsaas.db bunx prisma migrate deploy
bun run prisma:generate
bun run dev

The server runs with file watching at http://localhost:8787. Sign up at /auth/signup; the MCP endpoint is /v1/mcp. On subsequent runs, start it from the repository root with bun run dev.

Bun loads packages/server/.env when starting the server. The example uses SQLite, local file storage, and console output for email. See the configuration reference for environment variables. The migration command uses a path relative to the Prisma schema directory; the runtime SQLite path is relative to packages/server.

Disable password authentication

Set PASSWORD_AUTH_ENABLED=false in the server environment and restart to disable password signup, login, reset, and password changes. Password forms are hidden; Google (when configured) and magic-link authentication remain available. Existing accounts, passwords, sessions, and API keys are retained. The default is true; set it back to true and restart to re-enable password authentication.

Repository layout

  • packages/server/ — HTTP API, MCP, authentication, storage, and background jobs.
  • packages/client/ — the saas CLI.
  • packages/shared/ — shared types, validation, and errors.
  • packages/server/prisma/ — database schema and SQLite migrations.
  • scripts/ — build, generation, and backend test scripts.
  • skills/lastsaas/ — operator guide embedded in the CLI.
  • agent_docs/ and docs/ — implementation and behavior references.

Checks

Run from th

Read from source at commit 75daf643799cOBSERVED · 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.

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

Exposed tools (64)

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

ToolRiskDescription
audit_logread
collections_createwrite
collections_deletedestructive
collections_describeread
collections_listread
collections_update_schemawrite
contactsreadCRM contacts
entriesreadFiltered entries
field_filter_deletedestructive
field_filter_listread
field_filter_setwrite
files_complete_uploadwrite
files_deletedestructive
files_downloadread
files_download_linkread
files_getread
files_listread
files_prepare_uploadwrite
files_uploadwrite
files_upload_linkwrite
files_upload_statuswrite
getting_startedread
invitations_acceptread
invitations_cancelread
invitations_createwrite
invitations_listread
mcp_eventsreadCreated by the MCP walkthrough
members_change_roleread
members_listread
members_removedestructive
notification_preferences_setwrite
notification_preferences_showread
notification_schedules_cancelread
notification_schedules_create_oncewrite
notification_schedules_create_recurringwrite
notification_schedules_listread
notifications_deletedestructive
notifications_listread
notifications_queueread
org_exportread
org_importwrite
organizations_createwrite
organizations_listread
organizations_selectread
permissions_assign_roleread
permissions_checkread
permissions_grantread
permissions_listread
permissions_revokedestructive
permissions_unassign_roleread
records_aggregateread
records_batchread
records_countread
records_deletedestructive
records_getread
records_insertwrite
records_queryread
records_updatewrite
row_filter_deletedestructive
row_filter_listread
row_filter_setwrite
server_inforead
service_accounts_createwrite
statsread
04

Trust audit

CAUTIONgrade D · trust 66/100 Install with care. The audit found things worth knowing before you trust its output.

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

What the source does

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

Findings (19)

MEDIUMHard-coded secrets · secret.db_uri · CWE-798, CWE-321
.github/workflows/query-backends.yml:47
TEST_POSTGRES_URL: postgresql://postgres:test_password@localhost:5432/lastsaas_test
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/server/test/e2e-walkthrough.test.ts:78
body: JSON.stringify({ email, password: "walkthrough-password", name }),
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/server/test/e2e-walkthrough.test.ts:85
body: JSON.stringify({ email, password: "walkthrough-password" }),
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/server/test/organizations.test.ts:38
password: "organization-password",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/server/test/organizations.test.ts:47
password: "organization-password",
MEDIUMHard-coded secrets · secret.generic · CWE-798, CWE-321
packages/server/test/service-accounts.test.ts:145
password: "converted-bot-password",
MEDIUMFilesystem / path · mcp.destructive_tools · CWE-22, CWE-59
collections_delete, field_filter_delete, files_delete, members_remove, notifications_delete, permissions_revoke, records_delete, row_filter_delete
Why it matters. 8 tool(s) can delete or overwrite
Fix. prefer a read-only mode or scoped tokens; the page states the blast radius
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
LOWInventory / provenance · inv.symlink · CWE-1104
CLAUDE.md
CLAUDE.md
Why it matters. link not followed
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/server/src/build-info.ts:2
import { version as BUNDLED_CLI_VERSION } from "../../client/package.json";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/server/src/mcp/tools/access.ts:1
import { invitationPermissionsSchema } from "../../invitation-permissions";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/server/src/mcp/tools/access.ts:13
import { addAuditLog } from "../../db/audit";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/server/src/mcp/tools/access.ts:14
import { log } from "../../logger";
LOWFilesystem / path · fs.traversal · CWE-22, CWE-59
packages/server/src/mcp/tools/access.ts:25
} from "../../db/casbin";
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
package.json
@types/bun, eslint, prettier, typescript, typescript-eslint
Why it matters. 5 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
packages/client/package.json
commander, hono
Why it matters. 2 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
packages/server/package.json
@hono/mcp, @modelcontextprotocol/sdk, @prisma/client, busboy, casbin, croner, hono, kysely
Why it matters. 19 dependency range(s) float
Fix. pin exact versions or ship a lockfile
LOWSupply chain · supply.unpinned · CWE-829, CWE-1357
packages/shared/package.json
zod
Why it matters. 1 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 75daf643799cfull audit observations/trust-audit/mcp-server/mkly__thelastsaas.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-1175daf643799cCAUTIOND66first audit
06

Questions

What is the thelastsaas MCP server?

An open-source MCP server, API, and CLI for records, files, permissions, and reminders. Single binary, self-hosted.

What tools does thelastsaas expose?

64 in total: 38 read-only, 18 that write, and 8 that can delete or overwrite (collections_delete, field_filter_delete, files_delete, members_remove, notifications_delete). Every one is listed on this page with its risk.

Is thelastsaas safe to connect to an agent?

With care. The audit graded it D (66/100) and found 19 things worth knowing before you trust this server, listed below with the exact line each was found on. Separately from the audit: 8 of its tools can destroy data, so scope the token you give it to what you actually need.

What credentials does thelastsaas need?

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

How does thelastsaas run?

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

How current is this page?

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

Advertisement