Chat2DB is a free, cross-platform, local-first database client and SQL workspace for developers, DBAs, analysts, and data teams. Connect to 40+ databases, manage data, edit and run SQL, and use your own AI model to generate, explain, and optimize queries. Available on desktop, web, Docker, and CLI, with MCP support.
Drift inferred · capture-to-capture
No drift recorded — single capability capture; advisories appear once its surface changes.
transport — counts 0 tools · 0 res
· 0 prompts
permission surface via code analysis
No tools enumerated yet for this server.
prompt-surface
shipped agent-instruction files + hidden-content / dangerous-code findings —
quoted from the analyzed source
analyzed commit f8b8f98 · analyzer v32 · 1h ago
skills & prompt files 1
- agent-rules OtterMind-Chat2DB-f8b8f98/AGENTS.md
danger signals3
- dynamic code execution new Function() OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/3523.async.js :8
={},f=34,s=10,t=13;function r(y){return new Function("d","return {"+y.map(function(w,S){return JSON.stringify(w)+": d["+S+'] || ""'}).join(",")+"}")}function p(y,w){var S=r(y);return function(P,B){ret - dynamic code execution new Function() OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/npm.echarts.async.js :3
!="undefined"&&JSON.parse?JSON.parse(a):new Function("return ("+a+");")():a}var Jn=(0,c.kW)(),Xr={registerMap:function(a,e,t){if(e.svg){var r=new Ag(a,e.svg);Jn.set(a,r)}else{var n=e.geoJson||e.geoJSO - dynamic code execution new Function() OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/utils/index.ts :30
return new Function('return ' + data.toString())();
evidence-backed
findings quoted directly from the published source artifact — not inferred
code files: 3569
filesystem 13
- fs (weak) OtterMind-Chat2DB-f8b8f98/chat2db-community-client/scripts/modify-package-name.js :1
const fs = require('fs'); - fs (weak) OtterMind-Chat2DB-f8b8f98/chat2db-community-client/scripts/validate-i18n.cjs :4
const fs = require('node:fs'); - fs (weak) OtterMind-Chat2DB-f8b8f98/chat2db-community-client/scripts/verify-production-bundles.cjs :1
const fs = require('fs'); - fs (weak) OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/blocks/RedisAllData/redisExplorer.test.ts :2
import { readFileSync } from 'node:fs'; - fs (weak) OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/blocks/SearchResult/components/ResultSet/resultSetUi.test.ts :2
import { readFileSync } from 'node:fs'; - fs (weak) OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/blocks/Setting/settingsLayout.test.ts :2
import { readFileSync } from 'node:fs'; - fs (weak) OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/components/BaseTable/treeInteraction.test.ts :2
import { readFileSync } from 'node:fs'; - fs (weak) OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/pages/main/navigationItems.test.ts :2
import { readFileSync } from 'node:fs'; - fs (weak) OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/utils/editorCloseGuard.test.ts :2
import { readFileSync } from 'node:fs'; - fs OtterMind-Chat2DB-f8b8f98/script/github/issue-claim.js :3
const fs = require('node:fs'); - fs (weak) OtterMind-Chat2DB-f8b8f98/script/github/issue-claim.test.js :4
const fs = require('node:fs'); - fs OtterMind-Chat2DB-f8b8f98/script/github/sync-community-project.js :3
const fs = require('node:fs'); - fs (weak) OtterMind-Chat2DB-f8b8f98/script/github/sync-community-project.test.js :2
const fs = require('node:fs');
shell / exec 1
- shell OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/npm.shikiji.async.js :2666
prepare|error(msg)?|exec(ute)?|field_(scale|num|name|type|precision|len)|foreignkeys|free_result|
network 13
- net OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/6931.async.js :1
re(this,null,function*(){const k=yield fetch(e,i);if(k.status===404)throw new Error(`Resource "${k.url}" not found`);const G=yield k.blob();return new Promise((V,wt)=>{const St=new FileReader;St.oner - net OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/json.worker.js :89
ch!="undefined"&&(pr=function(r){return fetch(r).then(l=>l.text())});var $i=class{constructor(r,l){this._ctx=r,this._languageSettings=l.languageSettings,this._languageId=l.languageI - net OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/npm._at_antv.async.js :17
void 0,void 0,function*(){const u=yield fetch(n);if(r==="csv"){const f=yield u.text();return(0,Ng.Z)(e).parse(f,o?jg.Z:ee.yR)}else if(r==="json")return yield u.json();throw new Error(` - net OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/npm._at_visactor.async.js :86
eturn document.body}loadJson(i){const t=fetch(i).then(e=>e.json());return t.then(e=>({data:e,state:"success"})).catch(()=>({data:null,state:"fail"})),t}loadArrayBuffer(i){return fetch(i).then(t=>t.arr - net OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/npm.ali-oss.async.js :67
ontroller.abort()},v.requestTimeout))}t.fetch(c._opts.url,{method:c._opts.method,headers:S,body:T||void 0,mode:"cors",credentials:v.withCredentials?"include":"same-origin",signal:b}).then(function(k){ - net OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/npm.shikiji.async.js :2596
fetch(_(object|fields|field(_direct)?|assoc|all|array|row))?|rpl_(parse_enabled|probe|query_type)| - net OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/umi.js :18
rPath||q),"__serverLoader?").concat(ve);fetch(pe,{credentials:"include"}).then(function(me){return me.json()}).then(J).catch(console.error)}function Oi(){var $=arguments.length>0&&arguments[0]!==void - net (weak) OtterMind-Chat2DB-f8b8f98/chat2db-community-client/scripts/bind-dev-server-loopback.cjs :1
const http = require('node:http'); - net OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/blocks/AI/components/AIButton/APNGPlayer/index.tsx :20
const response = await fetch(apngUrl); - net OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/utils/file.ts :23
fetch(url, { - net OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/utils/network.ts :5
const response = await fetch(`${appConfig.gatewayUrl}/api/version/get_latest_a`, { - net OtterMind-Chat2DB-f8b8f98/script/github/issue-claim.js :303
const response = await fetch(requestUrl, { - net OtterMind-Chat2DB-f8b8f98/script/github/sync-community-project.js :51
const response = await fetch(`${this.apiUrl}${endpoint}`, {
secrets 2
- secrets OtterMind-Chat2DB-f8b8f98/script/github/issue-claim.js :707
token: process.env.GITHUB_TOKEN, - secrets OtterMind-Chat2DB-f8b8f98/script/github/sync-community-project.js :246
token: process.env.GH_PROJECT_TOKEN,
install hooks 1
- postinstall OtterMind-Chat2DB-f8b8f98/chat2db-community-client/package.json :27
umi setup
declared dependencies 97
- @chat2db/ui@^1.45.3
- @dnd-kit/core@^6.1.0
- @dnd-kit/modifiers@^6.0.1
- @dnd-kit/sortable@^8.0.0
- @radix-ui/react-dropdown-menu@^2.0.6
- @radix-ui/react-popover@^1.1.1
- @visactor/vtable@^1.14.1
- @visactor/vtable-editors@^1.10.1
- @visactor/vtable-search@^1.13.0
- @xyflow/react@^12.4.2
- @xterm/addon-fit@^0.11.0
- @xterm/addon-serialize@^0.14.0
- @xterm/xterm@^6.0.0
- ahooks@^3.7.8
- ali-oss@^6.20.0
- ali-react-table@^2.6.1
- antd@~5.24.1
- antd-style@^3.6.1
- apng-js@^1.1.5
- babel-plugin-antd-style@^1.0.4
- big.js@^5.2.2
- copy-to-clipboard@^3.3.3
- dayjs@^1.11.11
- dexie@^4.0.11
- echarts@^5.5.1
- echarts-wordcloud@^2.1.0
- elkjs@^0.9.3
- event-source-polyfill@^1.0.31
- html-to-image@1.11.11
- html2canvas@^1.4.1
- idb-keyval@^6.2.1
- is-online@^11.0.0
- katex@^0.16.21
- localforage@^1.10.0
- lodash@^4.17.21
- lottie-react@^2.4.0
- lucide-react@^1.29.0
- mermaid@^11.12.0
- monaco-editor@^0.52.0
- node-schedule@^2.1.1
- pako@^2.1.0
- qrcode@^1.5.3
- query-string@^9.0.0
- react-grid-layout@^1.4.4
- react-infinite-scroll-component@^6.1.0
- react-mentions@^4.4.10
- react-resizable@^3.0.5
- react-markdown@^9.0.3
- react-sortablejs@^6.1.4
- react-split-pane@^0.1.92
- rehype-katex@^7.0.1
- remark-gfm@^4.0.1
- remark-math@^6.0.0
- umi@^4.0.87
- umi-request@^1.4.0
- url-parse@^1.5.10
- utility-types@^3.11.0
- uuid@^9.0.0
- zod@^3.24.2
- zustand@^4.4.4
- @types/event-source-polyfill@^1.0.1
- @types/lodash@^4.14.195
- @types/react@^18.0.33
- @types/react-dom@^18.2.23
- @types/react-mentions@^4.4.1
- @types/uuid@^9.0.1
- @typescript-eslint/eslint-plugin@^6.7.2
- @typescript-eslint/parser@^6.7.2
- @umijs/plugins@^4.0.55
- concurrently@^8.1.0
- cross-env@^7.0.3
- eslint@^8.49.0
- eslint-config-airbnb-base@^15.0.0
- eslint-config-prettier@^9.0.0
- eslint-import-resolver-webpack@^0.13.7
- eslint-plugin-babel@^5.3.1
- eslint-plugin-import@^2.28.1
- eslint-plugin-prettier@^5.0.0
- eslint-plugin-react@^7.33.2
- eslint-plugin-react-hooks@^4.6.0
- eslint-plugin-unused-imports@3.2.0
- monaco-editor-webpack-plugin@^7.1.0
- postcss-less@6.0.0
- prettier@^2
- prettier-plugin-organize-imports@^2
- prettier-plugin-packagejson@^2
- stylelint@16.26.1
- stylelint-config-standard@38.0.0
- stylelint-config-standard-less@3.0.1
- tailwindcss@^3
- typescript@^5.4.3
- react@^16.8.0
- react-dom@^16.8.0
- org.projectlombok:lombok@*
- org.projectlombok:lombok-mapstruct-binding@*
- org.mongodb:bson@*
- org.jetbrains:annotations@*
clipboard 1
- navigator.clipboard OtterMind-Chat2DB-f8b8f98/chat2db-community-client/src/utils/clipboard.ts :9
return navigator.clipboard.readText();
perm:untrusted 5
- untrusted OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/6931.async.js :1
if(i!=null)return i;const k=yield(yield fetch(e)).text();return i={url:e,cssText:k},Ct[e]=i,i})}function Gt(e,i){return re(this,null,function*(){let R=e.cssText;const k=/url\(["']?([^"')]+)["']?\)/g,V - untrusted OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/json.worker.js :89
ch!="undefined"&&(pr=function(r){return fetch(r).then(l=>l.text())});var $i=class{constructor(r,l){this._ctx=r,this._languageSettings=l.languageSettings,this._languageId=l.languageI - untrusted OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/npm._at_visactor.async.js :86
eturn document.body}loadJson(i){const t=fetch(i).then(e=>e.json());return t.then(e=>({data:e,state:"success"})).catch(()=>({data:null,state:"fail"})),t}loadArrayBuffer(i){return fetch(i).then(t=>t.arr - untrusted OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/npm.ali-oss.async.js :67
ontroller.abort()},v.requestTimeout))}t.fetch(c._opts.url,{method:c._opts.method,headers:S,body:T||void 0,mode:"cors",credentials:v.withCredentials?"include":"same-origin",signal:b}).then(function(k){ - untrusted OtterMind-Chat2DB-f8b8f98/chat2db-community-client/dist.zip!/dist/umi.js :18
rPath||q),"__serverLoader?").concat(ve);fetch(pe,{credentials:"include"}).then(function(me){return me.json()}).then(J).catch(console.error)}function Oi(){var $=arguments.length>0&&arguments[0]!==void