From 511fc9dfe624ffd51df46ce3e1c16bf6365323cd Mon Sep 17 00:00:00 2001 From: Matthew Printz Date: Tue, 14 Jul 2026 16:09:21 -0600 Subject: [PATCH 1/7] Backend implementation of mcp server --- .gitignore | 6 + beaker-vue/public/icons/mcp.webp | Bin 0 -> 26770 bytes beaker-vue/public/icons/skill.png | Bin 0 -> 1638 bytes .../integrations/IntegrationPanel.vue | 17 +- .../integrations/MCPIntegrationViewer.vue | 368 +++++++ .../src/pages/IntegrationsInterface.vue | 8 + beaker-vue/src/util/integration.ts | 90 ++ pyproject.toml | 2 + src/beaker_notebook/lib/agent.py | 5 + src/beaker_notebook/lib/context.py | 41 +- src/beaker_notebook/lib/context_dump.py | 4 +- src/beaker_notebook/lib/integrations/base.py | 40 +- src/beaker_notebook/lib/integrations/mcp.py | 930 ++++++++++++++++++ .../lib/integrations/registry.py | 37 +- src/beaker_notebook/lib/integrations/skill.py | 161 +-- src/beaker_notebook/lib/integrations/types.py | 2 +- src/beaker_notebook/lib/subkernel.py | 29 +- src/beaker_notebook/lib/workflow.py | 4 + tests/integrations/mcp/__init__.py | 0 tests/integrations/mcp/test_mcp_provider.py | 894 +++++++++++++++++ .../skills/test_skill_provider.py | 7 +- 21 files changed, 2530 insertions(+), 115 deletions(-) create mode 100644 beaker-vue/public/icons/mcp.webp create mode 100644 beaker-vue/public/icons/skill.png create mode 100644 beaker-vue/src/components/integrations/MCPIntegrationViewer.vue create mode 100644 src/beaker_notebook/lib/integrations/mcp.py create mode 100644 tests/integrations/mcp/__init__.py create mode 100644 tests/integrations/mcp/test_mcp_provider.py diff --git a/.gitignore b/.gitignore index 638075ac..69c55abe 100644 --- a/.gitignore +++ b/.gitignore @@ -80,3 +80,9 @@ src/beaker_notebook/**/ui/* beaker-ts/package-lock.json beaker-vue/package-lock.json + +# Personal integrations +.mcp.yaml +.mcp.yml +.mcp.json +.skills.json diff --git a/beaker-vue/public/icons/mcp.webp b/beaker-vue/public/icons/mcp.webp new file mode 100644 index 0000000000000000000000000000000000000000..fe44a97112c0be61432adbbf2c41e8109d9a2a8c GIT binary patch literal 26770 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 H00000?mAw7 literal 0 HcmV?d00001 diff --git a/beaker-vue/public/icons/skill.png b/beaker-vue/public/icons/skill.png new file mode 100644 index 0000000000000000000000000000000000000000..7632824eb680bcc3e0266bd718abcf713d21d01b GIT binary patch literal 1638 zcmeAS@N?(olHy`uVBq!ia0vp^2SAvE8Azrw%`s(QU_24v6XNP#-~$vH1w%aqP6ljG z1o~lmNswPKLuXw6qK1i^JN_{-&SVbtWhwvl^Y8EPBCM+f(m1$X)T4I)c>C?om#s=% zylm2(Ji@Xsu6_La`tz%I&p+6^%NScp%4rCRIeV*U@tfHx8d*x{35qK7nJO5Hv#aSi zc$|Om^vLN)`)e&1JUiJFVrDtbpOx*D1-QDl^?(9DIUU<&*&*xS2cd|Qh%(eY+-G-%jDr;8f zqKQcc!6&x1)vYepXJjtzzZ{=yn=mWRzd+Ak@aObq&slrE{y(C=i0M9;fvZJ&lbAuI z9Fy`F-$16ze;4d;^w0^cTa@rp;ltjTiw^E|-o2?er%>_u#2=x(DYLt)bNlz}2PDMTEjo0fF8XnM z%#*%c=7w8u01h=wB8J(YBJy+uHi7yxIN+!>!t()igCv0_pnyBIV z#G^k{-|;SKWqU6;_0QDp9@5({+iy9(Z$j8R8DH(XnR|h@9Wwbhy*;Mf)46n|+^ys9 zCN6s?@2~hTi$C+s{4e#DTbqGO7QIrDZ&+eEg+HO~5`*y+wiyde4)82xOw-^saL#Oy z^kO~}AT@weGv4xs%>HM=Gvl8Pzr=qBp&9>OL?!-vMBJG%-=}VwF1Oq%=H7W)Z$he9 zUHEfc>1)Nh&#$?Ete5v;{XBmSYs2)IezyHgi|6Oo7?}_)wNAyYm zni%y@^7r)bAy5CARHeuSMXV|LmJwzs(5c!duOrLy_p7h!Df_$pZXC~jbVTYm*|03j z_;l@jfBb{wD8;ZV*6%N*-DwQFYHKIHe=R$Y$gj=w literal 0 HcmV?d00001 diff --git a/beaker-vue/src/components/integrations/IntegrationPanel.vue b/beaker-vue/src/components/integrations/IntegrationPanel.vue index ccd4ef1d..873fb7b5 100644 --- a/beaker-vue/src/components/integrations/IntegrationPanel.vue +++ b/beaker-vue/src/components/integrations/IntegrationPanel.vue @@ -78,6 +78,13 @@ >