sqemo-mcp
MCP server for Sqemo — AI agents that follow your team's database naming standard.
Your agent models in business terms ("Customer Number"); the column comes out as cust_no
because your word list says customer → cust, number → no (case and delimiter are rules
too, so CUST_NO is one setting away). Same input, same name, every
table, every agent. Overrides are allowed but flagged, and a CLI lint catches drift in CI.
{ "mcpServers": { "sqemo": { "command": "npx", "args": ["-y", "sqemo-mcp"] } } }
Works with Claude Code, Claude Desktop, Cursor, and any MCP client. Local .erd.json files
need no account; cloud ERDs and Pro tools need npx sqemo-mcp login.
What it looks like
Model a discussion board where members post articles, a post can be a reply to another post, and members comment on posts.
The agent calls the tools with logical names and never types a column name:
upsert_entity { logicalName: "Post" }
// → { physicalName: "POST" }
upsert_attribute { logicalName: "Post Content", domain: "Content" }
// → { physicalName: "POST_CNTS" } // Content → CNTS: from the team word list
upsert_attribute { logicalName: "Delete Flag", domain: "Flag" }
// → { physicalName: "DELETE_YN" } // Flag → YN: same rule in every table
lint_erd
// → naming drift, missing words, referential integrity — before any DDL is written
CNTS and YN are not the agent's taste. They are your word list's abbreviations, applied the
same way they were applied in every other table your team has modelled. Domains carry the data
type, so Content is varchar(1000) everywhere it appears.
Full walkthrough with every tool call: Describe the work, get a governed schema.
Overview
AI agents can query and edit entities, relationships, and domains; generate physical names
from a shared team glossary; import/export SQL (7 dialects) and DBML; and compare the model
against a live database. Works with both local .erd.json files and ERDs stored on the
Sqemo cloud.
- npm:
sqemo-mcp - Official MCP Registry:
io.github.sqemo/sqemo - Web app: app.sqemo.com
Requires Node.js >= 22. Local-file tools work without any account or configuration. Login is needed for cloud ERD tools, and for the tools marked (Pro) below.
Installation
Claude Code (.mcp.json)
{
"mcpServers": {
"sqemo": { "command": "npx", "args": ["-y", "sqemo-mcp"] }
}
}
Claude Desktop
Add the same mcpServers entry to your config file:
- Windows:
%APPDATA%\Claude\claude_desktop_config.json - macOS:
~/Library/Application Support/Claude/claude_desktop_config.json
Cursor (.cursor/mcp.json)
{
"mcpServers": {
"sqemo": { "command": "npx", "args": ["-y", "sqemo-mcp"] }
}
}
Login (cloud ERDs and Pro tools)
npx sqemo-mcp login # pick Google, GitHub, or email + password
npx sqemo-mcp logout # removes stored credentials
login asks how you want to sign in. Google and GitHub open a browser tab, complete a
PKCE OAuth flow, and hand the session back through a one-shot loopback server on
127.0.0.1; the third option takes an email and password in the terminal. Only a
refresh token is ever stored.
- Credentials are stored in
~/.erdmaker/credentials.json(mode 0600 on POSIX); your password is never persisted. - Non-interactive shortcuts:
--passwordforces the email + password path,--provider google|githubforces a browser path. - Piped input skips the menu and goes straight to email + password, so existing
automation keeps working:
printf 'email\npassword\n' | npx sqemo-mcp login - The browser paths need a browser on the same machine (the callback returns to
127.0.0.1). Over SSH or in CI, use--passwordor theSQEMO_EMAIL/SQEMO_PASSWORDenvironment variables.
What you can do
36 tools in total.
Read (17 tools)
Live database (2 tools)
Read-only against your own database. Both query only the information schema — never table data — and the connection URL is used by this local process only, never sent to Sqemo servers.
Write (17 tools)
Cloud writes require owner or shared-editor permission and are protected by version CAS with 3-way auto-merge for concurrent edits.
CLI for CI pipelines
Offline, file-based subcommands (no login needed):
# Naming-standard check — exits 1 on violations, great as a CI gate
npx sqemo-mcp lint schema.erd.json
# Schema export to stdout
npx sqemo-mcp export schema.erd.json --format sql --dialect postgres > schema.sql
npx sqemo-mcp export schema.erd.json --format dbml > schema.dbml
Drift mode compares the model against a real database or a dump, and exits 1 when they disagree (Pro, requires login):
npx sqemo-mcp lint schema.erd.json --db "$DATABASE_URL" [--db-schema public] [--strict]
npx sqemo-mcp lint schema.erd.json --schema dump.sql --dialect postgres
npx sqemo-mcp lint --erd <cloud-erd-id> --db "$DATABASE_URL" --ignore 'tmp_*'
GitHub Actions example:
- run: npx sqemo-mcp lint schema.erd.json
- run: npx sqemo-mcp lint schema.erd.json --db "${{ secrets.DATABASE_URL }}"
Environment variables
The request caps are a safety net against agents stuck in loops; exceeding them
returns a rate_limited error that tells the agent to stop and notify the user.
Errors
All tool errors return { code, message } — e.g. not_authenticated, no_permission,
save_conflict (retry after re-reading), validation_failed, rate_limited.
Links
- Sqemo — team naming standards + ERD design in the browser
- Live database guide — drift checks in CI, step by step
- Plans — which tools need Pro
- sqemo-mcp on npm
- Feedback and bug reports: issues or [email protected]
