[{"data":1,"prerenderedAt":859},["ShallowReactive",2],{"docs-\u002Fdocs\u002Fmcp":3},{"id":4,"title":5,"body":6,"description":850,"extension":851,"meta":852,"navigation":853,"path":854,"redirect":855,"seo":856,"stem":857,"__hash__":858},"docs\u002Fdocs\u002Fmcp\u002Findex.md","AI Assistants via MCP",{"type":7,"value":8,"toc":831},"minimark",[9,13,17,22,25,28,32,40,83,90,99,116,120,123,128,140,333,337,340,347,415,419,426,440,524,530,534,547,576,580,587,617,621,631,652,656,663,715,727,731,746,758,765,769,786,793,797],[10,11,5],"h1",{"id":12},"ai-assistants-via-mcp",[14,15,16],"p",{},"DBConvert Streams ships an MCP (Model Context Protocol) server that lets your AI assistant inspect databases, schemas, files, and stream state through the same workspace you already use. It reads from your existing connections and never writes — the AI can look and advise, but can't change anything.",[18,19,21],"h2",{"id":20},"what-it-gives-you","What it gives you",[14,23,24],{},"Without MCP, you copy-paste schemas, error messages, and query results into chat windows — and they go stale the moment something changes. With MCP, your AI assistant calls DBConvert Streams directly and always works from live state: the same connections, schemas, files, and stream status you see in the app.",[14,26,27],{},"Because the AI reads through the workspace that already powers Data Explorer, it sees exactly what you see — no separate credentials, no second copy of your schema to keep in sync.",[18,29,31],{"id":30},"quickstart","Quickstart",[14,33,34,35,39],{},"Connect by ",[36,37,38],"strong",{},"how DBConvert Streams runs",":",[41,42,43,62],"ul",{},[44,45,46,49,50,53,54,57,58,61],"li",{},[36,47,48],{},"Desktop app"," → ",[36,51,52],{},"stdio",": open the ",[36,55,56],{},"✨ AI Assistants"," panel, click ",[36,59,60],{},"Connect"," next to your client, and restart it.",[44,63,64,67,68,71,72,76,77,82],{},[36,65,66],{},"Docker"," (local or remote) → ",[36,69,70],{},"HTTP",": point your client at ",[73,74,75],"code",{},"http(s):\u002F\u002F\u003Chost>\u002Fmcp"," with your API key — see ",[78,79,81],"a",{"href":80},"\u002Fdocs\u002Fmcp\u002Fsetup#connect-a-remote-ai-client-http","Connect a remote AI client",".",[14,84,85,86,89],{},"Then ask your assistant ",[73,87,88],{},"List my DBConvert connections."," — if the connections you see in Data Explorer come back, you're done.",[14,91,92],{},[36,93,94,95,82],{},"→ Full step-by-step, screenshots, and Docker setup: ",[78,96,98],{"href":97},"\u002Fdocs\u002Fmcp\u002Fsetup","Setup",[100,101,102],"blockquote",{},[14,103,104,107,108,111,112,82],{},[36,105,106],{},"No connections yet?"," An empty list back means MCP is wired up correctly — there's just nothing to show. Add one in the Data Explorer sidebar (",[36,109,110],{},"+ New Connection",") and ask again; see ",[78,113,115],{"href":114},"\u002Fdocs\u002Fconnections\u002Fconnection-management","Connection management",[18,117,119],{"id":118},"what-you-can-ask-your-ai-assistant","What you can ask your AI assistant",[14,121,122],{},"Real prompts, real answers — every exchange below came back from a live workspace, numbers and all:",[124,125,127],"h3",{"id":126},"database-inspection","Database inspection",[100,129,130],{},[14,131,132,135,136,139],{},[36,133,134],{},"You:"," Describe the ",[73,137,138],{},"orders"," table on my Postgres demo connection — columns, keys, indexes. Lay it out as a table.",[100,141,142,155,327],{},[14,143,144,147,148,151,152,39],{},[36,145,146],{},"AI:"," ",[73,149,150],{},"public.orders"," — 10 columns, primary key ",[73,153,154],{},"order_id",[156,157,158,177],"table",{},[159,160,161],"thead",{},[162,163,164,168,171,174],"tr",{},[165,166,167],"th",{},"Column",[165,169,170],{},"Type",[165,172,173],{},"Null",[165,175,176],{},"Notes",[178,179,180,196,210,224,239,252,266,284,297,311],"tbody",{},[162,181,182,187,190,193],{},[183,184,185],"td",{},[73,186,154],{},[183,188,189],{},"bigint",[183,191,192],{},"no",[183,194,195],{},"primary key",[162,197,198,203,206,208],{},[183,199,200],{},[73,201,202],{},"customer_name",[183,204,205],{},"text",[183,207,192],{},[183,209],{},[162,211,212,217,219,222],{},[183,213,214],{},[73,215,216],{},"customer_email",[183,218,205],{},[183,220,221],{},"yes",[183,223],{},[162,225,226,231,234,236],{},[183,227,228],{},[73,229,230],{},"order_date",[183,232,233],{},"timestamp",[183,235,192],{},[183,237,238],{},"indexed",[162,240,241,246,248,250],{},[183,242,243],{},[73,244,245],{},"status",[183,247,205],{},[183,249,192],{},[183,251,238],{},[162,253,254,259,262,264],{},[183,255,256],{},[73,257,258],{},"amount",[183,260,261],{},"numeric(10,2)",[183,263,221],{},[183,265],{},[162,267,268,273,276,278],{},[183,269,270],{},[73,271,272],{},"currency",[183,274,275],{},"char(3)",[183,277,192],{},[183,279,280,281],{},"default ",[73,282,283],{},"'USD'",[162,285,286,291,293,295],{},[183,287,288],{},[73,289,290],{},"region",[183,292,205],{},[183,294,192],{},[183,296],{},[162,298,299,304,307,309],{},[183,300,301],{},[73,302,303],{},"items",[183,305,306],{},"integer",[183,308,192],{},[183,310],{},[162,312,313,318,320,322],{},[183,314,315],{},[73,316,317],{},"updated_at",[183,319,233],{},[183,321,192],{},[183,323,280,324],{},[73,325,326],{},"now()",[14,328,329,330,332],{},"No index on ",[73,331,290],{}," — add one if you group orders by region.",[124,334,336],{"id":335},"analytics","Analytics",[14,338,339],{},"A light analytical question returns real numbers, not a guess — the AI writes the multi-table join, runs it read-only, and hands back the rows:",[100,341,342],{},[14,343,344,346],{},[36,345,134],{}," What are my top film categories by rental revenue? (sakila sample)",[100,348,349,353,408],{},[14,350,351],{},[36,352,146],{},[156,354,355,366],{},[159,356,357],{},[162,358,359,362],{},[165,360,361],{},"Category",[165,363,365],{"align":364},"right","Revenue",[178,367,368,376,384,392,400],{},[162,369,370,373],{},[183,371,372],{},"Sports",[183,374,375],{"align":364},"$5,314.21",[162,377,378,381],{},[183,379,380],{},"Sci-Fi",[183,382,383],{"align":364},"$4,756.98",[162,385,386,389],{},[183,387,388],{},"Animation",[183,390,391],{"align":364},"$4,656.30",[162,393,394,397],{},[183,395,396],{},"Drama",[183,398,399],{"align":364},"$4,587.39",[162,401,402,405],{},[183,403,404],{},"Comedy",[183,406,407],{"align":364},"$4,383.58",[14,409,410,411,414],{},"Joined ",[73,412,413],{},"category → film_category → film → inventory → rental → payment",", ran in ~55 ms. Want the query to reuse, or the full top 15?",[124,416,418],{"id":417},"federated-query-across-sources","Federated query across sources",[14,420,421,422,425],{},"A federated ",[73,423,424],{},"SELECT"," joins data that lives in different systems — no ETL, no staging table. The everyday case: your transactional table sits in one database, but the reference data you need to group by lives in another.",[100,427,428],{},[14,429,430,432,433,435,436,439],{},[36,431,134],{}," Roll up revenue from my live Postgres ",[73,434,138],{}," by sales manager. The ",[73,437,438],{},"region → manager"," mapping lives in my MySQL reference DB, not in the orders table.",[100,441,442,457,517],{},[14,443,444,446,447,449,450,453,454,456],{},[36,445,146],{}," Joined ",[73,448,138],{}," (Postgres) to ",[73,451,452],{},"territories"," (MySQL) on ",[73,455,290],{}," in a single federated query — neither table left its database:",[156,458,459,471],{},[159,460,461],{},[162,462,463,466,469],{},[165,464,465],{},"Manager",[165,467,468],{},"Regions",[165,470,365],{"align":364},[178,472,473,484,495,506],{},[162,474,475,478,481],{},[183,476,477],{},"Dana Ruiz",[183,479,480],{},"US-West, US-East",[183,482,483],{"align":364},"$1,679,420.18",[162,485,486,489,492],{},[183,487,488],{},"Lena Fischer",[183,490,491],{},"EU-Central, EU-West",[183,493,494],{"align":364},"$1,284,905.77",[162,496,497,500,503],{},[183,498,499],{},"Arun Mehta",[183,501,502],{},"APAC, MEA",[183,504,505],{"align":364},"$1,251,330.42",[162,507,508,511,514],{},[183,509,510],{},"Marco Silva",[183,512,513],{},"LATAM",[183,515,516],{"align":364},"$864,508.96",[14,518,519,520,523],{},"That's the full ",[36,521,522],{},"$5,080,165.33"," across 5,000 orders, attributed by territory — a grouping neither database could produce on its own.",[14,525,526,527,529],{},"(The orders total and region names here are live; the ",[73,528,452],{}," mapping is illustrative.)",[124,531,533],{"id":532},"query-review","Query review",[100,535,536],{},[14,537,538,147,540,543,544],{},[36,539,134],{},[73,541,542],{},"EXPLAIN"," this and tell me whether an index would help: ",[73,545,546],{},"SELECT * FROM orders WHERE region = 'EU-Central' AND status = 'pending'",[100,548,549],{},[14,550,551,553,554,557,558,561,562,564,565,567,568,571,572,575],{},[36,552,146],{}," The planner already uses ",[73,555,556],{},"idx_orders_status"," — a bitmap index scan pulls the ",[73,559,560],{},"pending"," rows, then it filters ",[73,563,290],{}," on the heap (estimated cost 89.62, ~86 rows out). ",[73,566,290],{}," isn't indexed on its own. A composite index on ",[73,569,570],{},"(status, region)"," would push the region filter into the index instead of rechecking ~503 pending rows — a modest win at 5,000 rows, more worth it if this query runs hot or the table grows. Here's the ",[73,573,574],{},"CREATE INDEX","; you run it.",[124,577,579],{"id":578},"stream-troubleshooting","Stream troubleshooting",[100,581,582],{},[14,583,584,586],{},[36,585,134],{}," My MySQL → PostgreSQL CDC stream stopped overnight. List my streams, check status and recent errors, and tell me what to fix.",[100,588,589],{},[14,590,591,593,594,597,598,147,601,604,605,608,609,612,613,616],{},[36,592,146],{}," Found it — ",[73,595,596],{},"get_stream_status"," shows the latest run of ",[73,599,600],{},"10M-cdc-mysql2pg",[36,602,603],{},"FAILED"," with ",[73,606,607],{},"Error 1049 (42000): Unknown database 'target'",", flagged source-side (\"Source run failed\"). The CDC source is pointed at a database ",[73,610,611],{},"target"," that doesn't exist on the MySQL server. Fix: create it (or correct the database name on the connection), then restart. (",[73,614,615],{},"get_stream_recent_errors"," came back empty — the failure lived in the run history, so that's where I looked.)",[124,618,620],{"id":619},"cross-source-validation","Cross-source validation",[100,622,623],{},[14,624,625,627,628,630],{},[36,626,134],{}," Is my Parquet export of ",[73,629,138],{}," still in sync with the live Postgres table?",[100,632,633],{},[14,634,635,637,638,640,641,644,645,648,649,651],{},[36,636,146],{}," Joined the live table and the Parquet file in one cross-source query, matched on ",[73,639,154],{},": both hold ",[36,642,643],{},"5,000 rows",", with ",[36,646,647],{},"0"," present only in Postgres and ",[36,650,647],{}," only in Parquet — no rows added or removed since the export. The snapshot is still current.",[18,653,655],{"id":654},"what-it-cannot-do","What it cannot do",[14,657,658,659,662],{},"The MCP server is ",[36,660,661],{},"read-only"," — it inspects and advises, it never writes:",[41,664,665,699,705],{},[44,666,667,670,671,674,675,674,678,681,682,674,685,674,688,691,692,694,695,698],{},[36,668,669],{},"No data or schema changes"," — no ",[73,672,673],{},"INSERT"," \u002F ",[73,676,677],{},"UPDATE",[73,679,680],{},"DELETE",", no ",[73,683,684],{},"DROP",[73,686,687],{},"ALTER",[73,689,690],{},"CREATE",". Only ",[73,693,424],{}," and ",[73,696,697],{},"WITH ... SELECT"," pass the safety filter; everything else is rejected at the server before it reaches your database.",[44,700,701,704],{},[36,702,703],{},"No connection or credential changes"," — connections are read from your workspace, never edited.",[44,706,707,714],{},[36,708,709,710],{},"No stream control ",[711,712,713],"em",{},"in this version"," — the AI can't start, stop, pause, resume, or reset streams yet. It surfaces status, errors, and the fix; you run the action. (Controlled write actions may arrive later, behind explicit safeguards.)",[14,716,717,718,721,722,726],{},"When the AI suggests a change, ",[36,719,720],{},"you"," (or DBConvert Streams via the UI) run it. The AI never touches the trigger. See ",[78,723,725],{"href":724},"\u002Fdocs\u002Fmcp\u002Fsafety-and-privacy","Safety & privacy"," for the full boundary.",[18,728,730],{"id":729},"how-it-works","How it works",[14,732,733,734,737,738,741,742,745],{},"On the ",[36,735,736],{},"desktop app",", the MCP server runs as a small process alongside DBConvert Streams; your AI client (Claude Code, Cursor, etc.) starts it on demand and talks to it over standard input\u002Foutput (stdio). On a ",[36,739,740],{},"Docker or server"," deployment it runs as a service in your own stack and your client reaches it over HTTP. Either way it runs on ",[36,743,744],{},"your"," infrastructure and only ever responds to your client's read-only requests — it never calls out to DBConvert or your AI provider on its own.",[100,747,748],{},[14,749,750,753,754,757],{},[36,751,752],{},"⚡ Always live, never snapshotted."," Edit a connection in the DBConvert Streams UI and the MCP server picks up the change in a fraction of a second — ",[36,755,756],{},"no restart of your AI assistant required."," The AI always reads current state, so it never advises you from a stale schema or a connection you already changed.",[14,759,760,761,82],{},"For the full, plain-language list of everything the AI can reach, see the ",[78,762,764],{"href":763},"\u002Fdocs\u002Fmcp\u002Ftools","MCP tools reference",[18,766,768],{"id":767},"see-full-sessions","See full sessions",[14,770,771,772,776,777,781,782,785],{},"The exchanges above are trimmed. For complete transcripts — ",[78,773,775],{"href":774},"\u002Fdocs\u002Fmcp\u002Fexamples\u002Fsql-exploration","plain-English SQL on the sakila sample"," and a ",[78,778,780],{"href":779},"\u002Fdocs\u002Fmcp\u002Fexamples\u002Ffederated-validation","federated Postgres + Parquet diff",", both on the cheap-and-fast ",[36,783,784],{},"Claude Haiku 4.5"," (no Opus needed).",[14,787,788,789,792],{},"The pattern throughout: ",[36,790,791],{},"the AI does the writing and the read-only verification; you decide what actually runs against your data"," — a fast analyst on tap, not an autopilot for your production database.",[18,794,796],{"id":795},"in-this-section","In this section",[41,798,799,804,810,815,824],{},[44,800,801,803],{},[78,802,98],{"href":97}," — wire the MCP server into Cursor, VS Code with GitHub Copilot, Windsurf, Claude Code, Claude Desktop, Gemini CLI, or Codex CLI.",[44,805,806,809],{},[78,807,808],{"href":763},"Tools reference"," — the 26 read-only tools, in plain language.",[44,811,812,814],{},[78,813,725],{"href":724}," — what the AI can and cannot do, what it sees, and how secrets are redacted.",[44,816,817,818,694,821,82],{},"Examples — real end-to-end sessions: ",[78,819,820],{"href":774},"plain-English SQL",[78,822,823],{"href":779},"federated validation",[44,825,826,830],{},[78,827,829],{"href":828},"\u002Fdocs\u002Fmcp\u002Ftroubleshooting","Troubleshooting"," — fixes for common setup and runtime issues.",{"title":832,"searchDepth":833,"depth":833,"links":834},"",2,[835,836,837,846,847,848,849],{"id":20,"depth":833,"text":21},{"id":30,"depth":833,"text":31},{"id":118,"depth":833,"text":119,"children":838},[839,841,842,843,844,845],{"id":126,"depth":840,"text":127},3,{"id":335,"depth":840,"text":336},{"id":417,"depth":840,"text":418},{"id":532,"depth":840,"text":533},{"id":578,"depth":840,"text":579},{"id":619,"depth":840,"text":620},{"id":654,"depth":833,"text":655},{"id":729,"depth":833,"text":730},{"id":767,"depth":833,"text":768},{"id":795,"depth":833,"text":796},"Let Claude, Cursor, GitHub Copilot, Codex, and other MCP-compatible AI clients inspect your DBConvert Streams workspace. Read-only by design.","md",{},false,"\u002Fdocs\u002Fmcp",null,{"title":5,"description":850},"docs\u002Fmcp\u002Findex","5nLGuhTiXoL_75ozEtNkPuWTTprNj9C6_NnLamusQfo",1781271516328]