Visitproject — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Visitproject (Agent Skill) and scored it 100/100 (green). The audit ran 55 deterministic rules across Security, Supply Chain, Maintenance, Transparency, and Community; it found 0 high-severity and 0 lower-severity findings. The full rule-by-rule trace and per-finding evidence are below. Free, methodology-open.
Findings & checks · 0 flagged
Every scanned point with the score it earned and what moved between them.
First recorded scan — no prior version to compare against.
The primary manifest — the file an agent reads to learn what this artifact does.
Convert legacy enterprise systems into standard MCP servers for AI agents. Pointvisitprojectat a database, get atools/listof every table exposed as a parameterised MCP tool. No SQL, no ad-hoc glue code, no; DROP TABLErisks.
visitproject - DB-to-MCP adapter for AI agents
=============================================
DB-TO-MCP FILE-TO-MCP MCP-SERVER-OVER-STDIO
(stage 2 ✅) (stage 3) (stage 4 + TUI gateway)Most enterprise systems (WMS, OMS, TMS, BMS, ERPs) are decades old: closed databases, file drops, no public APIs. AI agents can't talk to them without a custom integration for every system.
visitproject is the opposite: a single CLI that points at a database and emits a standards-compliant Model Context Protocol tools/list — one MCP tool per table operation, all parameterised, all safe.
| Stage | Command | Status | ||
|---|---|---|---|---|
| 1 | `visitproject db --type <sqlite\ | mysql\ | postgres> --conn <str>` (scaffold) | ✅ shipped |
| 2 | visitproject db ... — full DB-to-MCP, parameterised queries, MCP JSON Schema | ✅ shipped (this release) | ||
| 3 | `visitproject watch --dir <path> --type <csv\ | xlsx>` — File-to-MCP | 🔜 | |
| 4 | visitproject start --config <path> — stdio MCP server + TUI + safety gateway | 🔜 |
git clone https://github.com/linmy666/visitproject
cd visitproject
npm install --include=dev
npm run build
# Generate the example database
node scripts/seed-example-db.js
# → wrote examples/sample.db (4 tables: users, products, orders, line_items)
# Emit MCP tool JSON for every table in the database
node dist/cli/index.js db --type sqlite --conn sqlite:examples/sample.db --print | head -40
# Or get a human-readable summary
node dist/cli/index.js db --type sqlite --conn sqlite:examples/sample.db
# → [stage 2] 16 MCP tool(s) generated for sqlite://examples/sample.db
# • db_select_line_items — Read rows from table 'line_items'. …
# • db_insert_line_items — Insert one row into table 'line_items'.
# • db_update_line_items — Update rows in table 'line_items' matching …
# • db_delete_line_items — Delete rows from table 'line_items' matching …
# • db_select_orders — Read rows from table 'orders'. …
# … (16 tools total: 4 tables × 4 operations)node dist/cli/index.js db --type sqlite --conn sqlite:examples/sample.db \
--tables users,orders --print
# → only db_{select,insert,update,delete}_{users,orders} appear (8 tools)┌──────────────────────────────────────────────────────────────────┐
│ L4 TUI Dashboard + AI Safety Gateway [stage 4] │
│ (blessed dashboard, real-time MCP traffic, Y/N circuit- │
│ breaker before any write tool fires) │
├──────────────────────────────────────────────────────────────────┤
│ L3 MCP Server on stdio [stage 4] │
│ (@modelcontextprotocol/sdk Server + transport) │
├──────────────────────────────────────────────────────────────────┤
│ L2 Resource Pipeline (File-to-MCP) [stage 3] │
│ (chokidar watcher → CSV/XLSX parse → MCP Resources) │
├──────────────────────────────────────────────────────────────────┤
│ L1 DB-to-MCP Adapter [stage 2 ✅] │
│ ┌─────────────┐ ┌──────────────┐ ┌──────────────────────┐ │
│ │ SqliteAdapter│ │ buildWhere() │ │ toolsForAdapter() │ │
│ │ (better-sql3)│ │ (whitelist) │ │ → JSON Schema + name │ │
│ └─────────────┘ └──────────────┘ └──────────────────────┘ │
└──────────────────────────────────────────────────────────────────┘buildWhere() produces?-placeholder SQL with a parallel params array. Identifiers go through a strict ASCII whitelist (/^[a-zA-Z_][a-zA-Z0-9_$]*$/).
non-whitelisted column throws DbError(UNKNOWN_COLUMN). A column with ; or -- or a hyphen fails validateIdentifier() with DbError(INVALID_IDENTIFIER).
SELECT always appends LIMIT ? (clamped to1-1000). Truncation is signalled to the LLM via SelectResult.truncated = true.
where clause;empty where is rejected with DbError(QUERY_REJECTED).
npm test59/59 tests passing across 5 suites:
test/db/schema.test.ts — 13 tests for SQLite type parsing + identifierwhitelist (covers injection attack vectors)
test/db/sqlite.test.ts — 15 tests for SqliteAdapter (connection lifecycle,listTables, describeTable, select/insert/update/delete)
test/db/query.test.ts — 14 tests for buildWhere (all operators,whitelist enforcement, MAX_PARAMS, like/in edge cases)
test/db/mcp-tools.test.ts — 8 tests for toolsForTable and toolsForAdapter(per-table tool count, JSON Schema shape, enums, integration)
test/unit/cli.test.ts — 9 tests for commander wiring (stage 1 smoketests + stage 2 db subcommand end-to-end via a seeded SQLite file)
src/
├── cli/
│ └── index.ts # commander entry point
├── db/ # stage 2: DB-to-MCP
│ ├── adapter.ts # DbAdapter interface (SQL injection boundary)
│ ├── schema.ts # PRAGMA table_info parsing + type normalisation
│ ├── sqlite.ts # SqliteAdapter (better-sqlite3)
│ ├── query.ts # buildWhere() — parameterised WHERE builder
│ ├── mcp-tools.ts # table → McpTool[] (JSON Schema)
│ └── index.ts # public surface (barrel)
├── filewatch/ # stage 3: File-to-MCP (placeholder)
├── server/ # stage 4: stdio MCP server (placeholder)
├── tui/ # stage 4: blessed TUI (placeholder)
└── util/better-sqlite3If npm install is run with --ignore-scripts and you later need better-sqlite3, run npm run build-release inside node_modules/better-sqlite3.
MCP Tool JSON, parameterise queries (no SQL injection), MySQL/PostgreSQL adapters in 2.5
circuit-breaker for write tools
MIT. See LICENSE.
Lin Ruihan — [email protected] — github.com/linmy666
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.