Neon Mcp Server — independently scanned and version-tracked by SaferSkills.
SaferSkills independently audited Neon Mcp Server (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.
Connect your business database to Claude using the Model Context Protocol. Natural language queries, CRUD operations, and analytics — all through conversation.
graph LR
A["Claude Desktop / Code"] -- "stdio" --> B["MCP Server<br/>(Node.js + TypeScript)"]
B -- "Neon Serverless Driver" --> C["PostgreSQL<br/>(Neon)"]
C -- "query results" --> B
B -- "tool responses" --> A
style A fill:#6366f1,stroke:#4338ca,color:#fff
style B fill:#0ea5e9,stroke:#0284c7,color:#fff
style C fill:#22c55e,stroke:#16a34a,color:#fffClaude communicates with the MCP server over stdio. The server translates natural language tool calls into parameterized SQL queries via the Neon serverless driver and returns structured results that Claude interprets for the user.
List open support tickets
Create a new ticket for Sarah Chen
Business summary with customer, ticket, and product stats
| Tool | Description |
|---|---|
list_customers | List all customers, optionally filter by status or company name |
get_customer | Get a single customer by ID, including open/total ticket counts and recent tickets |
create_customer | Add a new customer with name, email, optional company and status |
update_customer | Update any combination of customer fields by ID |
| Tool | Description |
|---|---|
list_tickets | List tickets with filters by status, priority, customer ID, or customer name |
get_ticket | Get full ticket details including linked customer information |
create_ticket | Create a support ticket linked by customer ID or customer name lookup |
close_ticket | Mark a ticket as resolved with an optional resolution note |
| Tool | Description |
|---|---|
list_products | List all products with formatted pricing |
search_products | Search products by name, category, or description |
| Tool | Description |
|---|---|
get_summary | Dashboard stats: customer counts by status, ticket breakdown by priority, product catalog value by category, recent activity |
| Resource | URI | Description |
|---|---|---|
| Database schema | schema://tables | Full schema for all tables including columns, types, constraints, and relationships |
git clone https://github.com/voyagi/upwork-mcp-server.git
cd upwork-mcp-server
npm installGo to neon.tech and create a new project. Copy the connection string from the Connection Details panel.
cp .env.example .envFill in your Neon connection string:
DATABASE_URL — your Neon Postgres connection string (e.g., postgresql://user:[email protected]/neondb?sslmode=require)npm run build
node seed/run-seed.mjsThis creates the tables and populates the database with 22 customers, 12 products, and 32 support tickets.
npm startThe server starts listening on stdio. To verify it works, connect it to Claude Desktop (see below).
Add the following to your Claude Desktop config file:
~/Library/Application Support/Claude/claude_desktop_config.json%APPDATA%\Claude\claude_desktop_config.json{
"mcpServers": {
"techstart-crm": {
"command": "node",
"args": ["/absolute/path/to/upwork-mcp-server/dist/index.js"],
"env": {
"DATABASE_URL": "postgresql://user:[email protected]/neondb?sslmode=require"
}
}
}
}Replace /absolute/path/to/upwork-mcp-server with the actual path where you cloned the repository, and fill in your Neon connection string.
Once connected, try a conversation like this:
User: What data do you have access to?
Claude: [Reads schema://tables] I have access to a CRM database with three tables: customers (name, email, company, status), tickets (subject, priority, status, linked to customers), and products (name, category, pricing). I can query, create, and update records across all of them.
User: How are things looking today?
Claude: [Calls get_summary] Here is your dashboard overview:
The 4 urgent tickets should be your first priority.
User: Show me the urgent tickets.
Claude: [Calls list_tickets with status: "open", priority: "urgent"] There are 4 urgent open tickets:
The SSL certificate issue is customer-facing — want me to look into any of these?
User: Close the SSL ticket. We renewed the certificate and updated the configuration.
Claude: [Calls close_ticket with resolution: "SSL certificate renewed and server configuration updated. Verified HTTPS connectivity restored."] Done. The SSL certificate ticket for Ironclad Security has been closed with your resolution note. That brings your urgent count down to 3.
User: Before we onboard them — what integration options do we offer?
Claude: [Calls search_products with query: "integration"] We have two integration-related products:
The API Access add-on covers standard integrations. If they need connections to specific internal systems, the Custom Integrations package includes hands-on setup.
User: We just signed Pinnacle Retail as a new customer. Contact is Dana Park, [email protected].
Claude: [Calls create_customer with name: "Dana Park", email: "[email protected]", company: "Pinnacle Retail"] Created. Dana Park from Pinnacle Retail has been added as an active customer. Would you like to create a welcome ticket or onboarding task for them?
User: What is the updated summary now?
Claude: [Calls get_summary] Updated numbers after your changes:
One fewer urgent ticket and one more customer compared to a few minutes ago. The 3 remaining urgent tickets are the data export blocking quarterly report (Marcus Reed), checkout integration dropping orders (Amira Hassan), and suspicious login attempts (David Kim).
-- Customers: name, email, company, status (active/inactive/lead)
create table customers (
id uuid primary key default gen_random_uuid(),
name text not null,
email text not null unique,
company text,
status text not null default 'active'
check (status in ('active', 'inactive', 'lead')),
created_at timestamptz default now()
);
-- Products: catalog with pricing in cents
create table products (
id uuid primary key default gen_random_uuid(),
name text not null,
category text not null,
price_cents integer not null,
description text,
created_at timestamptz default now()
);
-- Tickets: support tickets linked to customers
create table tickets (
id uuid primary key default gen_random_uuid(),
customer_id uuid references customers(id) on delete cascade,
subject text not null,
description text,
status text not null default 'open'
check (status in ('open', 'in_progress', 'closed')),
priority text not null default 'medium'
check (priority in ('low', 'medium', 'high', 'urgent')),
resolution text,
created_at timestamptz default now(),
closed_at timestamptz
);npm run dev # Run with hot reload (tsx watch)
npm run build # Compile TypeScript
npm run start # Run compiled version
npm run check # Biome lint + formatnpm test # Run all tests once
npm run test:watch # Run tests in watch mode during developmentThe test suite covers:
All tool tests use InMemoryTransport for full MCP client/server integration testing with a mocked database backend, so no database connection is needed.
node seed/e2e-test.mjs # 14 tests against live Neon database"Missing required environment variable: DATABASE_URL" You haven't created the .env file. Copy .env.example to .env and fill in your Neon connection string.
"Failed to connect to database" The server starts but can't reach Neon. Check that:
DATABASE_URL is your full Neon connection string (e.g., postgresql://user:[email protected]/neondb?sslmode=require)"relation customers does not exist" or similar The database tables haven't been created. Run node seed/run-seed.mjs to create tables and seed demo data.
Server starts but Claude doesn't see the tools Verify the path in claude_desktop_config.json points to the compiled dist/index.js (not src/index.ts). Run npm run build first if you haven't.
MIT
~30 seconds. Free. No account. Every finding cites a rule and a line of evidence.