mcp
Provides tools for executing SQL queries and performing database operations on PostgreSQL databases.
Provides tools for interacting with Swagger/OpenAPI endpoints, enabling API exploration and testing.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@mcpshow me all tables in the database"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
mcp
MCP server combining PostgreSQL, Swagger/OpenAPI, and browser/frontend automation tools.
The Swagger side is designed as an execution layer for another agent:
auth is managed inside MCP memory
operation tools are generated from Swagger
operationIdconsumers do not pass
Authorizationheaders, API paths, or HTTP methods
The browser side is designed for frontend diagnostics and UI automation:
stateful Playwright Chromium sessions
screenshots and DOM/layout inspection
frontend auth hydration via API login ->
localStorageconsole and network diagnostics
Browser tool behavior
Registered browser tools:
browser_open_sessionbrowser_close_sessionbrowser_navigatebrowser_auth_from_api_loginbrowser_set_local_storagebrowser_seed_auth_statebrowser_open_profile_pagebrowser_open_account_homebrowser_open_security_pagebrowser_capture_profile_mobilebrowser_wait_forbrowser_clickbrowser_fillbrowser_set_input_filesbrowser_pressbrowser_evaluatebrowser_get_textbrowser_get_attributebrowser_screenshotbrowser_get_bounding_rectbrowser_get_computed_stylesbrowser_assert_layoutbrowser_save_storage_statebrowser_load_storage_statebrowser_get_console_logsbrowser_get_network_errorsbrowser_inspect_page
Browser auth flow
Preferred frontend authentication flow:
Obtain API tokens using
auth_loginorbrowser_auth_from_api_login.Write
{ accessToken, refreshToken, user: null }into frontendlocalStorageviabrowser_auth_from_api_login,browser_seed_auth_state, orbrowser_set_local_storage.Navigate directly to the target authenticated route.
This avoids brittle UI-login dependencies and keeps browser automation stable.
Supported auth modes in high-level browser tools:
apiLogin- perform API login and hydrate frontend auth state intolocalStorageuseExistingMcpAuth- reuse an already authenticated MCP auth session (for example afterauth_login)none- skip auth hydration entirely
Auth hardening notes:
browser_auth_from_api_loginandbrowser_inspect_pagenow return structured auth failures:AUTH_API_LOGIN_FAILEDAUTH_REDIRECTED_TO_LOGINAUTH_SESSION_EXPIRED
when a valid shared MCP auth session exists, browser auth can fall back to
useExistingMcpAuthbrowser_set_local_storageworks on an explicitoriginand can optionallynavigateToOriginand/orreloadPagebrowser_seed_auth_stateis a convenience wrapper for common auth objects like{ accessToken, refreshToken, user }auth error payloads include:
finalUrldebugScreenshotPathdebugHtmlPath
Browser file upload flow
browser_set_input_files supports:
one or many files
local disk paths
in-memory files from
textin-memory files from
base64regular and
multiplefile inputs
Recommended input file descriptor shapes:
local file path as plain string
{ "path": "/abs/file.png" }{ "name": "avatar.txt", "mimeType": "text/plain", "text": "hello" }{ "name": "avatar.png", "mimeType": "image/png", "base64": "..." }
Browser diagnostics
Browser diagnostics are intentionally split to reduce noise:
consoleErrors- actual console errors and page errorsconsoleWarnings- warnings that survived filteringnetworkErrors- failed requests and HTTP 4xx/5xx responsesignoredNoiseCount- filtered Vite/dev noise or harmlessnet::ERR_ABORTEDrequests
Backward-compatible fields are still returned where practical:
browser_get_console_logsstill returnslogsbrowser_get_network_errorsstill returnsrequests
Interpretation guidelines:
non-zero
ignoredNoiseCountis expected in dev-mode frontendsinvestigate
consoleErrorsfirst, thennetworkErrorsconsoleWarningsare useful for regressions, but not all warnings are fatalfiltered noise should not hide real app errors: only known Vite/dev chatter and harmless aborted requests are ignored
Artifacts are written under artifacts/browser/<sessionId>/....
Swagger tool behavior
Registered core Swagger tools:
auth_login- stores token in MCP session memoryauth_logout- clears stored tokenauth_status- shows auth session statecall_api_raw- universal raw HTTP caller with custom method/path/query/headers/body/multipart controlcall_api_by_swagger- low-level operationId caller with internal auth header injectionget_profile_page- high-level profile page wrapperget_translations- high-level translations wrapperupdate_profile- high-level profile update wrapperlist_api_endpointsget_endpointinspect_swagger_endpointget_schemafind_endpoint_by_keyword
call_api_raw contract
call_api_raw accepts:
methodeither absolute
url, orbaseUrl+pathpathParamsqueryheadersexactly one body mode:
jsonBodytextBodymultipart.fields[]
timeoutMsexpectedResponseType:auto | json | text | base64includeRawBodyuseExistingMcpAuth
multipart.fields[] item shape:
name(required)one of:
valuefilePathtextbase64
optional
fileNameoptional
contentType
Response shape:
okrequestwith resolved URL/method/body moderesponsewith:statusstatusTextheaderscontentTypebodyrawBody(when requested or useful for debug)parseError(when response could not be parsed as expected)
structured
errorfor4xx/5xx, timeouts, or network failures
Swagger inspection helpers
inspect_swagger_endpoint accepts either:
operationId, orpath+method
Optional flags:
includeSchemaDefinitionsforceRefresh
It returns:
resolved
operationIdcombined required params
request body content-types and schema refs
response content-types and schema refs
referenced schema names
optional inline
schemaDefinitions
Additionally, MCP generates one tool per Swagger operation:
tool name pattern:
api_<operation_id_normalized>fallback when
operationIdis missing:api_<method>_<path>input shape for generated tools:
pathParams(optional)query(optional)body(optional)
Example generated tools:
api_get_profileapi_update_profileapi_get_translations
Wrapper mapping order is deterministic:
fixed table
tool_name -> operationIdstartup validation fails fast if mapped
operationIdis absent in Swagger
Authentication flow
Preferred usage:
Call
auth_loginonce (or configure env credentials for auto-login).Call wrapper tools or
api_*tools mapped by SwaggeroperationId.
MCP handles:
token storage in process memory
automatic
Authorizationheader injectionclear unauthorized errors:
Unauthorized: call auth_login first
Internal translations auth
Internal translation endpoints are handled separately from regular user/session auth:
GET /api/v1/internal/translations/{locale}/{file}POST /api/v1/internal/translations/merge
For these endpoints MCP injects a dedicated internal bearer token automatically, even when Swagger does not declare security for the operation.
Behavior summary:
generated tools like
api_get_internal_translationsandapi_merge_internal_translationsuse the internal token automaticallycall_api_rawalso auto-injects the same token for paths under/api/v1/internal/translations...when no explicitAuthorizationheader is providedregular endpoints continue using the existing MCP auth session /
auth_loginflow unchangedwhen
API_DEBUG=true, MCP logs:whether an internal token source was found
whether an
Authorizationheader was formedonly masked token metadata (
len=<n> sha256=<prefix>), never the token value itself
Environment
Create
.envand/or.env.localin repository root.Env source priority is:
process.env->.env.local->.env.SQL tools require:
DB_HOST,DB_PORT,DB_USER,DB_PASSWORD,DB_NAME.Swagger tools require:
SWAGGER_URL.
Auth/API controls:
AUTH_LOGIN_PATH(default:/api/v1/login)AUTH_LOGIN_METHOD(default:post)AUTH_USERNAME_FIELD(default:login)AUTH_PASSWORD_FIELD(default:password)AUTH_TOKEN_FIELD_PATH(default:content.accessToken)AUTH_REFRESH_TOKEN_FIELD_PATH(default:content.refreshToken)AUTH_TOKEN_TYPE_FIELD_PATH(default:content.tokenType)AUTH_DEFAULT_TOKEN_TYPE(default:Bearer)AUTH_TOKEN(optional pre-seeded static token)AUTH_REFRESH_TOKEN(optional pre-seeded static refresh token)AUTH_USERNAME/AUTH_PASSWORD(optional for auto-login)AUTH_AUTO_LOGIN(default:true)API_DEBUG(default:false) - enables masked debug logging for auth/header diagnosticsAPI_REQUEST_TIMEOUT_MS(default:15000)API_RETRY_ON_UNAUTHORIZED(default:true)
Internal translations token controls:
token priority:
INTERNAL_TRANSLATION_API_TOKENINTERNAL_TRANSLATIONS_API_TOKENAUTH_TOKEN(legacy fallback only)
token type priority:
INTERNAL_TRANSLATION_API_TOKEN_TYPEINTERNAL_TRANSLATIONS_API_TOKEN_TYPEAUTH_DEFAULT_TOKEN_TYPE
default token type is
Bearer
Recommended configuration:
INTERNAL_TRANSLATION_API_TOKEN=your-internal-token
INTERNAL_TRANSLATION_API_TOKEN_TYPE=Bearer
API_DEBUG=falseBrowser controls:
BROWSER_TOOLS_ENABLED(default:true)BROWSER_HEADLESS_DEFAULT(default:true)BROWSER_SESSION_TTL_MS(default:600000)BROWSER_CLEANUP_INTERVAL_MS(default:60000)BROWSER_NAVIGATION_TIMEOUT_MS(default:30000)BROWSER_ACTION_TIMEOUT_MS(default:30000)BROWSER_MAX_CONSOLE_ENTRIES(default:200)BROWSER_MAX_NETWORK_ERRORS(default:200)FRONTEND_AUTH_STORAGE_KEY(default:auth)BROWSER_ARTIFACTS_DIR(default:artifacts/browser)
If required variables are missing, corresponding tool groups are not registered.
tool_status is always available.
Structure
index.js- bootstrap and wiring.src/config/env.js- environment config parsing.src/infrastructure/db/client.js- PostgreSQL client factory.src/services/auth/auth-session.js- auth session and token management.src/services/browser/session-manager.js- stateful Playwright browser/context/page lifecycle.src/services/browser/playwright-service.js- navigate, wait, screenshot, DOM geometry, computed styles.src/services/browser/artifact-service.js- runtime screenshots, HTML dumps, JSON artifacts.src/services/browser/auth-bridge.js- API login to frontendlocalStorageauth hydration.src/services/swagger/swagger-cache.js- Swagger loading and cache.src/services/swagger/http-executor.js- shared raw HTTP execution, query/path resolution, multipart handling, and response parsing.src/tools/register-browser-tools.js- browser automation MCP tools.src/tools/register-sql-tools.js- SQL MCP tools.src/tools/register-swagger-tools.js- auth and generated Swagger operation tools.src/tools/register-health-tool.js- combined health check tool.src/tools/register-status-tool.js- tool availability diagnostics.scripts/browser-smoke.js- local end-to-end smoke scenario for browser tools.scripts/swagger-smoke.js- local smoke scenario for raw API and Swagger inspection tools.
Run
npm install
npx playwright install chromium
npm startQuick check
npm run check
npm run smoke:swagger
npm run smoke:browserExample raw API tool calls
GET with query params and custom headers
{
"method": "get",
"baseUrl": "http://outvento.test",
"path": "/api/v1/users/{userId}",
"pathParams": {
"userId": 42
},
"query": {
"details": "full"
},
"headers": {
"Authorization": "Bearer <token>",
"X-Locale": "uk",
"X-Requested-With": "XMLHttpRequest"
},
"includeRawBody": true
}POST JSON
{
"method": "post",
"baseUrl": "http://outvento.test",
"path": "/api/v1/profile",
"headers": {
"X-Locale": "en"
},
"jsonBody": {
"firstName": "Ada",
"lastName": "Lovelace"
}
}POST multipart/form-data
{
"method": "post",
"baseUrl": "http://outvento.test",
"path": "/api/v1/user/avatar",
"useExistingMcpAuth": true,
"multipart": {
"fields": [
{
"name": "avatar",
"filePath": "/abs/path/avatar.png",
"contentType": "image/png"
},
{
"name": "folder",
"value": "profile"
}
]
}
}Parse non-JSON responses for debug
{
"method": "get",
"url": "http://outvento.test/api/v1/debug/raw-response",
"expectedResponseType": "json",
"includeRawBody": true
}Example browser tool calls
Open a mobile session
{
"baseUrl": "http://outvento.test",
"device": "iPhone 14 Pro Max",
"headless": true
}Authenticate frontend via API login + localStorage
{
"sessionId": "browser-session-001",
"baseUrl": "http://outvento.test",
"login": "user@example.com",
"password": "secret"
}Set arbitrary localStorage state on an origin
{
"sessionId": "browser-session-001",
"origin": "http://outvento.test",
"key": "settings",
"value": {
"locale": "uk",
"theme": "dark"
},
"navigateToOrigin": true,
"reloadPage": true
}Seed auth state directly
{
"sessionId": "browser-session-001",
"origin": "http://outvento.test",
"accessToken": "<access-token>",
"refreshToken": "<refresh-token>",
"user": {
"id": 1,
"email": "user@example.com"
}
}Upload a single file from text
{
"sessionId": "browser-session-001",
"selector": "input[type='file']",
"files": [
{
"name": "avatar.txt",
"mimeType": "text/plain",
"text": "avatar-content"
}
]
}Upload multiple files to <input multiple>
{
"sessionId": "browser-session-001",
"selector": "input[type='file'][multiple]",
"files": [
"/abs/path/avatar.png",
{
"name": "meta.json",
"mimeType": "application/json",
"base64": "eyJoZWxsbyI6IndvcmxkIn0="
}
]
}Example Swagger inspection calls
Inspect by path + method
{
"path": "/api/v1/user/avatar",
"method": "post",
"includeSchemaDefinitions": true,
"forceRefresh": true
}Inspect by operationId
{
"operationId": "saveUserAvatar",
"includeSchemaDefinitions": true
}Open profile page with existing MCP auth
{
"baseUrl": "http://outvento.test",
"auth": {
"mode": "useExistingMcpAuth"
}
}Open security page in a dedicated session
{
"baseUrl": "http://outvento.test",
"device": "Desktop Chrome",
"auth": {
"mode": "apiLogin",
"login": "user@example.com",
"password": "secret"
}
}Navigate and inspect
{
"sessionId": "browser-session-001",
"url": "http://outvento.test/account/profile",
"waitUntil": "networkidle"
}Interact with the page
{
"sessionId": "browser-session-001",
"selector": ".profile-input",
"value": "Ada Lovelace"
}{
"sessionId": "browser-session-001",
"selector": ".save-button"
}{
"sessionId": "browser-session-001",
"selector": ".shortcut-input",
"key": "Enter"
}{
"sessionId": "browser-session-001",
"expression": "document.querySelector('.save-status').textContent"
}{
"sessionId": "browser-session-001",
"selector": ".save-status"
}{
"sessionId": "browser-session-001",
"selector": ".save-button",
"name": "data-role"
}{
"sessionId": "browser-session-001",
"selector": ".profile-page",
"assertions": {
"topLessThanOrEqual": 80,
"widthGreaterThanOrEqual": 390
}
}Save and restore storage state
{
"sessionId": "browser-session-001",
"fileName": "auth-state.json"
}{
"sessionId": "browser-session-002",
"path": "/.../artifacts/browser/browser-session-001/auth-state.json"
}{
"sessionId": "browser-session-001",
"selector": ".profile-page",
"includeParents": true,
"stopAt": "body"
}High-level inspection
{
"baseUrl": "http://outvento.test",
"url": "http://outvento.test/account/profile",
"device": "iPhone 14 Pro Max",
"headless": true,
"auth": {
"mode": "apiLogin",
"login": "user@example.com",
"password": "secret"
},
"targetSelector": ".profile-page",
"captureStyles": true,
"captureConsole": true,
"captureNetworkErrors": true,
"takeFullPageScreenshot": true,
"takeElementScreenshot": true
}Mobile profile capture
{
"baseUrl": "http://outvento.test",
"headless": true,
"auth": {
"mode": "useExistingMcpAuth"
}
}Example smoke flow
Short end-to-end browser smoke flow:
auth_login(optional but recommended whenuseExistingMcpAuthis used)browser_open_profile_pagebrowser_assert_layoutbrowser_get_console_logsbrowser_get_network_errorsbrowser_open_security_pageorbrowser_open_account_homebrowser_capture_profile_mobilebrowser_close_session
Browser smoke scenario
The included smoke harness starts a local mock frontend/API and validates this flow:
browser_open_sessionbrowser_auth_from_api_loginbrowser_open_profile_pagebrowser_open_account_homebrowser_open_security_pagebrowser_capture_profile_mobilebrowser_navigatebrowser_wait_forbrowser_fillbrowser_set_input_files(single file)browser_set_input_files(multiple files)browser_clickbrowser_pressbrowser_evaluatebrowser_get_textbrowser_get_attributebrowser_assert_layoutbrowser_save_storage_statebrowser_load_storage_statebrowser_set_local_storagebrowser_seed_auth_statebrowser_screenshot(full page)browser_screenshot(element)browser_get_bounding_rectbrowser_get_computed_stylesbrowser_get_console_logsbrowser_get_network_errorsbrowser_inspect_pageauth failure coverage for
AUTH_API_LOGIN_FAILED,AUTH_REDIRECTED_TO_LOGIN,AUTH_SESSION_EXPIREDbrowser_close_session
Artifacts are written under artifacts/browser/<sessionId>/... and are intentionally ignored by Git.
Agent runbook (autonomous mode)
Use this policy for any AI agent that consumes this MCP server.
1) Mandatory first-step diagnostics
Always run, in this order:
tool_statushealthauth_status
Do not ask the user what to do before these checks are complete.
2) Decision policy
tool_status=okandhealth=ok:server is healthy
if request requires auth and
auth_statusis not authenticated, runauth_login(when credentials are available) or ask only for missing credentials
tool_status=okandhealth!=ok:perform a soft recovery:
auth_logoutre-run
auth_statusre-run
health
if still unhealthy, escalate to hard restart instructions
tool_status!=ok:skip soft recovery and escalate directly to hard restart instructions
3) Soft recovery definition
Soft recovery means MCP session reset only (token/session cleanup), not process restart:
auth_logoutre-check
tool_status,health,auth_status
4) Hard restart policy
If hard restart is required, the agent must explicitly state that host-level restart is outside MCP tool scope. Then provide concrete commands by runtime option:
# Docker Compose
docker-compose restart <mcp_service_name>
docker-compose restart
# systemd
sudo systemctl restart mcpIf runtime is unknown, ask one short question: docker, systemd, or other?
5) Response format requirements
Every operational response should include:
Current state (
tool_status,health,auth_status)Action taken automatically
Next automatic step (or one minimal blocking question)
Avoid open-ended prompts like "How do we proceed?" when a deterministic next step exists.
This server cannot be installed
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/VictorMyschik/mcp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server