Buckets:

download
raw
54.5 kB
import{s as Xl,o as Wl,n as nl}from"../chunks/scheduler.4048030c.js";import{S as ql,i as Hl,e as T,s as a,c as o,h as Nl,a as w,d as l,b as n,f as Vl,j as r,g as j,k as el,l as zl,m as e,n as c,t as y,o as J,p as u}from"../chunks/index.5d0b9360.js";import{C as Yl,H as h,E as Fl}from"../chunks/MermaidChart.svelte_svelte_type_style_lang.99c2e6c8.js";import{C as g}from"../chunks/CodeBlock.ff2a3276.js";import{H as Pl,a as al}from"../chunks/HfOption.0fd5270b.js";function Ll(b){let M,U;return M=new g({props:{code:"Y2xhdWRlJTIwbWNwJTIwYWRkJTIwLS10cmFuc3BvcnQlMjBodHRwJTIwLS1zY29wZSUyMHVzZXIlMjBteS10b29scyUyMGh0dHBzJTNBJTJGJTJGeW91cm5hbWUtc3BhY2UtbmFtZS5oZi5zcGFjZSUyRmdyYWRpb19hcGklMkZtY3AlMkY=",highlighted:"claude mcp add --transport http --scope user my-tools https://yourname-space-name.hf.space/gradio_api/mcp/",wrap:!1}}),{c(){o(M.$$.fragment)},l(i){r(M.$$.fragment,i)},m(i,d){c(M,i,d),U=!0},p:nl,i(i){U||(y(M.$$.fragment,i),U=!0)},o(i){J(M.$$.fragment,i),U=!1},d(i){u(M,i)}}}function Kl(b){let M,U;return M=new g({props:{code:"JTIzJTIwSW4lMjB+JTJGLmNvZGV4JTJGY29uZmlnLnRvbWwlMEElNUJtY3Bfc2VydmVycy5teS10b29scyU1RCUwQXVybCUyMCUzRCUyMCUyMmh0dHBzJTNBJTJGJTJGeW91cm5hbWUtc3BhY2UtbmFtZS5oZi5zcGFjZSUyRmdyYWRpb19hcGklMkZtY3AlMkYlMjI=",highlighted:`<span class="hljs-comment"># In ~/.codex/config.toml</span>
<span class="hljs-section">[mcp_servers.my-tools]</span>
<span class="hljs-attr">url</span> = <span class="hljs-string">&quot;https://yourname-space-name.hf.space/gradio_api/mcp/&quot;</span>`,wrap:!1}}),{c(){o(M.$$.fragment)},l(i){r(M.$$.fragment,i)},m(i,d){c(M,i,d),U=!0},p:nl,i(i){U||(y(M.$$.fragment,i),U=!0)},o(i){J(M.$$.fragment,i),U=!1},d(i){u(M,i)}}}function Dl(b){let M,U;return M=new g({props:{code:"JTdCJTBBJTIwJTIwJTIybWNwJTIyJTNBJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIybXktdG9vbHMlMjIlM0ElMjAlN0IlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjJ0eXBlJTIyJTNBJTIwJTIycmVtb3RlJTIyJTJDJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIydXJsJTIyJTNBJTIwJTIyaHR0cHMlM0ElMkYlMkZ5b3VybmFtZS1zcGFjZS1uYW1lLmhmLnNwYWNlJTJGZ3JhZGlvX2FwaSUyRm1jcCUyRiUyMiUwQSUyMCUyMCUyMCUyMCU3RCUwQSUyMCUyMCU3RCUwQSU3RA==",highlighted:`<span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;mcp&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;my-tools&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;type&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;remote&quot;</span><span class="hljs-punctuation">,</span>
<span class="hljs-attr">&quot;url&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;https://yourname-space-name.hf.space/gradio_api/mcp/&quot;</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>`,wrap:!1}}),{c(){o(M.$$.fragment)},l(i){r(M.$$.fragment,i)},m(i,d){c(M,i,d),U=!0},p:nl,i(i){U||(y(M.$$.fragment,i),U=!0)},o(i){J(M.$$.fragment,i),U=!1},d(i){u(M,i)}}}function Ol(b){let M,U="With <code>pi-mcp-adapter</code> installed, add the Space endpoint to <code>.mcp.json</code>:",i,d,I,f,C="Open <code>pi</code> and use <code>/mcp tools</code> to confirm the adapter can see the Gradio-generated tools.",B;return d=new g({props:{code:"JTdCJTBBJTIwJTIwJTIybWNwU2VydmVycyUyMiUzQSUyMCU3QiUwQSUyMCUyMCUyMCUyMCUyMm15LXRvb2xzJTIyJTNBJTIwJTdCJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIydXJsJTIyJTNBJTIwJTIyaHR0cHMlM0ElMkYlMkZ5b3VybmFtZS1zcGFjZS1uYW1lLmhmLnNwYWNlJTJGZ3JhZGlvX2FwaSUyRm1jcCUyRiUyMiUwQSUyMCUyMCUyMCUyMCU3RCUwQSUyMCUyMCU3RCUwQSU3RA==",highlighted:`<span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;mcpServers&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;my-tools&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-punctuation">{</span>
<span class="hljs-attr">&quot;url&quot;</span><span class="hljs-punctuation">:</span> <span class="hljs-string">&quot;https://yourname-space-name.hf.space/gradio_api/mcp/&quot;</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>
<span class="hljs-punctuation">}</span>`,wrap:!1}}),{c(){M=T("p"),M.innerHTML=U,i=a(),o(d.$$.fragment),I=a(),f=T("p"),f.innerHTML=C},l(p){M=w(p,"P",{"data-svelte-h":!0}),j(M)!=="svelte-1cusvko"&&(M.innerHTML=U),i=n(p),r(d.$$.fragment,p),I=n(p),f=w(p,"P",{"data-svelte-h":!0}),j(f)!=="svelte-k8real"&&(f.innerHTML=C)},m(p,m){e(p,M,m),e(p,i,m),c(d,p,m),e(p,I,m),e(p,f,m),B=!0},p:nl,i(p){B||(y(d.$$.fragment,p),B=!0)},o(p){J(d.$$.fragment,p),B=!1},d(p){p&&(l(M),l(i),l(I),l(f)),u(d,p)}}}function se(b){let M,U,i,d,I,f,C,B;return M=new al({props:{id:"tool",option:"Claude Code",$$slots:{default:[Ll]},$$scope:{ctx:b}}}),i=new al({props:{id:"tool",option:"Codex",$$slots:{default:[Kl]},$$scope:{ctx:b}}}),I=new al({props:{id:"tool",option:"OpenCode",$$slots:{default:[Dl]},$$scope:{ctx:b}}}),C=new al({props:{id:"tool",option:"Pi",$$slots:{default:[Ol]},$$scope:{ctx:b}}}),{c(){o(M.$$.fragment),U=a(),o(i.$$.fragment),d=a(),o(I.$$.fragment),f=a(),o(C.$$.fragment)},l(p){r(M.$$.fragment,p),U=n(p),r(i.$$.fragment,p),d=n(p),r(I.$$.fragment,p),f=n(p),r(C.$$.fragment,p)},m(p,m){c(M,p,m),e(p,U,m),c(i,p,m),e(p,d,m),c(I,p,m),e(p,f,m),c(C,p,m),B=!0},p(p,m){const Z={};m&2&&(Z.$$scope={dirty:m,ctx:p}),M.$set(Z);const $={};m&2&&($.$$scope={dirty:m,ctx:p}),i.$set($);const k={};m&2&&(k.$$scope={dirty:m,ctx:p}),I.$set(k);const A={};m&2&&(A.$$scope={dirty:m,ctx:p}),C.$set(A)},i(p){B||(y(M.$$.fragment,p),y(i.$$.fragment,p),y(I.$$.fragment,p),y(C.$$.fragment,p),B=!0)},o(p){J(M.$$.fragment,p),J(i.$$.fragment,p),J(I.$$.fragment,p),J(C.$$.fragment,p),B=!1},d(p){p&&(l(U),l(d),l(f)),u(M,p),u(i,p),u(I,p),u(C,p)}}}function te(b){let M,U,i,d,I,f,C,B,p,m="This lesson picks up where the previous server-building lesson left off. You already saw the minimal <code>mcp_server=True</code> pattern; here the goal is to go deeper on when Gradio is a good fit, how to expose MCP-only surfaces, and how to deploy the result safely.",Z,$,k,A,pl="Gradio is a Python library for building web UIs for machine learning models and data processing tools. When you enable MCP support, Gradio:",Hs,_,Ml="<li>Converts your functions into MCP tools automatically</li> <li>Creates a web interface for humans</li> <li>Exposes an MCP endpoint for agents</li> <li>Handles JSON-RPC serialization and protocol details</li>",Ns,R,il="You get two interfaces for the price of one: humans use the web UI, agents use MCP.",zs,Q,Ys,x,ol="Install Gradio with MCP support:",Fs,v,Ps,V,rl="Create a <code>requirements.txt</code> for deployment:",Ls,X,Ks,S,cl="<p>Type hints and docstrings are essential. Gradio uses them to generate the MCP tool schema. Always include:</p> <ul><li>Type hints on all parameters and return value</li> <li>A docstring description</li> <li>An <code>Args:</code> section documenting each parameter</li> <li>A <code>Returns:</code> section describing the output</li></ul>",Ds,W,Os,q,yl="Instead of another hello-world example, let’s build a small text toolkit that is useful both in a browser and through MCP:",st,H,tt,N,Jl="Each function becomes a separate MCP tool that agents can call independently.",lt,z,et,Y,at,F,ul="Define read-only data resources that agents can access:",nt,P,pt,L,Tl="Resources are identified by URIs and provide static or semi-static content that agents can read.",Mt,K,it,D,wl="Define tools that exist only in MCP, not in the web UI:",ot,O,rt,ss,ct,ts,jl="Gradio’s <code>auth</code> argument on <code>launch()</code> gates the <strong>web UI</strong> with HTTP basic auth. It does <strong>not</strong> protect the <code>/gradio_api/mcp/</code> MCP endpoint — by design, agents can reach it without logging in.",yt,ls,Jt,es,Ul='For production, authenticate the MCP endpoint outside Gradio: put the app behind a reverse proxy that enforces auth on <code>/gradio_api/mcp/</code>, deploy it as a private Hugging Face Space, or use an MCP gateway that implements the <a href="https://modelcontextprotocol.io/specification/basic/authorization" rel="nofollow">MCP Authorization spec</a>.',ut,as,Tt,ns,ml="Hugging Face Spaces provides free hosting for Gradio apps with MCP support.",wt,ps,jt,Ms,dl='<li>Go to <a href="https://huggingface.co/new-space" rel="nofollow">huggingface.co/new-space</a></li> <li>Name your Space</li> <li>Select “Gradio” as the SDK</li> <li>Create the Space</li>',Ut,is,mt,os,Il="Create <code>app.py</code> in your Space:",dt,rs,It,cs,ht,ys,hl="Create <code>requirements.txt</code>:",Ct,Js,ft,us,Cl="Your Space automatically installs dependencies on each build.",gt,Ts,Bt,ws,fl="Once deployed, your MCP server is available at:",bt,js,$t,Us,gl="Configure your agent to use it:",At,G,St,E,Bl="<p>Your Space’s MCP endpoint uses Streamable HTTP transport. Configuration changes take effect immediately without agent restarts.</p>",Gt,ms,Et,ds,bl="For optimal MCP tool generation, follow these patterns:",Zt,Is,kt,hs,$l="Best practices:",_t,Cs,Al="<li>Use simple, clear type hints (str, int, float, bool, list)</li> <li>Include docstring with description</li> <li>Document every parameter in Args section</li> <li>Describe the return value in Returns section</li> <li>Return strings, numbers, or lists (simple types)</li> <li>Return JSON strings for complex data</li>",Rt,fs,Qt,gs,xt,Bs,Sl="Check your function signatures:",vt,bs,Gl="<li>Must have type hints on all parameters</li> <li>Must have a docstring</li> <li>Docstring must include “Args:” section</li> <li>Return type must be specified</li>",Vt,$s,Xt,As,Wt,Ss,El="If the endpoint doesn’t work:",qt,Gs,Zl="<li>Check Space is running (not in error state)</li> <li>Use correct endpoint: <code>https://user-space.hf.space/gradio_api/mcp/</code></li> <li>Test with curl: <code>curl https://user-space.hf.space/gradio_api/mcp/</code></li> <li>Check Space logs for errors</li>",Ht,Es,Nt,Zs,kl="Agents may fail if return types don’t match specification:",zt,ks,Yt,_s,_l="Always ensure actual return types match declared types.",Ft,Rs,Pt,Qs,Rl="<li><strong>Keep functions fast</strong> — Agents timeout after ~60 seconds</li> <li><strong>Validate inputs</strong> — Check data size before processing</li> <li><strong>Handle errors gracefully</strong> — Return error messages instead of crashing</li> <li><strong>Cache expensive results</strong> — Avoid redundant computation</li> <li><strong>Monitor resource usage</strong> — Spaces have limited CPU/memory</li>",Lt,xs,Kt,vs,Dt,Vs,Ql="<code>mcp_server=True</code> gives you a web UI and an MCP server from the same Gradio app. Gradio relies on type hints and docstrings to build the tool schemas, so keep both tight. Spaces is a quick way to host MCP servers publicly; <code>@gr.api()</code> hides tools from the UI, and <code>@gr.mcp.resource()</code> exposes read-only data.",Ot,Xs,xl="Next we’ll put these pieces together in a hands-on project.",sl,Ws,tl,qs,ll;return I=new Yl({props:{containerStyle:"float: right; margin-left: 10px; display: inline-flex; position: relative; z-index: 10;"}}),C=new h({props:{title:"Gradio MCP Integration: Web UIs + MCP Servers",local:"gradio-mcp-integration-web-uis--mcp-servers",headingTag:"h1"}}),$=new h({props:{title:"What Is Gradio MCP Integration?",local:"what-is-gradio-mcp-integration",headingTag:"h2"}}),Q=new h({props:{title:"Installing Gradio with MCP Support",local:"installing-gradio-with-mcp-support",headingTag:"h2"}}),v=new g({props:{code:"cGlwJTIwaW5zdGFsbCUyMCUyMmdyYWRpbyU1Qm1jcCU1RCUyMg==",highlighted:'pip install <span class="hljs-string">&quot;gradio[mcp]&quot;</span>',wrap:!1}}),X=new g({props:{code:"Z3JhZGlvJTNFJTNENC4wLjA=",highlighted:'<span class="hljs-attribute">gradio</span>&gt;=<span class="hljs-number">4</span>.<span class="hljs-number">0</span>.<span class="hljs-number">0</span>',wrap:!1}}),W=new h({props:{title:"Building a Practical Gradio MCP App",local:"building-a-practical-gradio-mcp-app",headingTag:"h2"}}),H=new g({props:{code:"aW1wb3J0JTIwZ3JhZGlvJTIwYXMlMjBnciUwQWltcG9ydCUyMGpzb24lMEElMEFkZWYlMjBhbmFseXplX3RleHQodGV4dCUzQSUyMHN0ciklMjAtJTNFJTIwc3RyJTNBJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyQW5hbHl6ZSUyMHRleHQlMjBhbmQlMjBjb21wdXRlJTIwc3RhdGlzdGljcy4lMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjBBcmdzJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdGV4dCUzQSUyMFRoZSUyMGlucHV0JTIwdGV4dCUyMHRvJTIwYW5hbHl6ZSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMFJldHVybnMlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBKU09OJTIwd2l0aCUyMGFuYWx5c2lzJTIwcmVzdWx0cyUwQSUyMCUyMCUyMCUyMCUyMiUyMiUyMiUwQSUyMCUyMCUyMCUyMHdvcmRzJTIwJTNEJTIwdGV4dC5zcGxpdCgpJTBBJTIwJTIwJTIwJTIwY2hhcnMlMjAlM0QlMjBsZW4odGV4dCklMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjByZXR1cm4lMjBqc29uLmR1bXBzKCU3QiUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMndvcmRzJTIyJTNBJTIwbGVuKHdvcmRzKSUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmNoYXJhY3RlcnMlMjIlM0ElMjBjaGFycyUyQyUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMmF2ZXJhZ2Vfd29yZF9sZW5ndGglMjIlM0ElMjByb3VuZChjaGFycyUyMCUyRiUyMGxlbih3b3JkcyklMkMlMjAyKSUyMGlmJTIwd29yZHMlMjBlbHNlJTIwMCUwQSUyMCUyMCUyMCUyMCU3RCklMEElMEFkZWYlMjByZXZlcnNlX3RleHQodGV4dCUzQSUyMHN0ciklMjAtJTNFJTIwc3RyJTNBJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyUmV2ZXJzZSUyMGElMjBzdHJpbmcuJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwQXJncyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRleHQlM0ElMjBJbnB1dCUyMHRleHQlMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjBSZXR1cm5zJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwVGhlJTIwcmV2ZXJzZWQlMjB0ZXh0JTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwdGV4dCU1QiUzQSUzQS0xJTVEJTBBJTBBZGVmJTIwY291bnRfdm93ZWxzKHRleHQlM0ElMjBzdHIpJTIwLSUzRSUyMGludCUzQSUwQSUyMCUyMCUyMCUyMCUyMiUyMiUyMkNvdW50JTIwdm93ZWxzJTIwaW4lMjB0ZXh0LiUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMEFyZ3MlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjB0ZXh0JTNBJTIwSW5wdXQlMjB0ZXh0JTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwUmV0dXJucyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyME51bWJlciUyMG9mJTIwdm93ZWxzJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyJTBBJTIwJTIwJTIwJTIwdm93ZWxzJTIwJTNEJTIwJTIyYWVpb3VBRUlPVSUyMiUwQSUyMCUyMCUyMCUyMHJldHVybiUyMHN1bSgxJTIwZm9yJTIwY2hhciUyMGluJTIwdGV4dCUyMGlmJTIwY2hhciUyMGluJTIwdm93ZWxzKSUwQSUwQSUyMyUyMENyZWF0ZSUyMGludGVyZmFjZSUwQXdpdGglMjBnci5CbG9ja3ModGl0bGUlM0QlMjJUZXh0JTIwVG9vbHMlMjIpJTIwYXMlMjBkZW1vJTNBJTBBJTIwJTIwJTIwJTIwZ3IuTWFya2Rvd24oJTIyJTIzJTIwVGV4dCUyMFByb2Nlc3NpbmclMjBUb29scyUyMiklMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjB3aXRoJTIwZ3IuVGFiKCUyMkFuYWx5emUlMjBUZXh0JTIyKSUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRleHRfaW5wdXQxJTIwJTNEJTIwZ3IuVGV4dGJveChsYWJlbCUzRCUyMkVudGVyJTIwdGV4dCUyMiUyQyUyMGxpbmVzJTNENSklMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBhbmFseXNpc19vdXRwdXQlMjAlM0QlMjBnci5UZXh0Ym94KGxhYmVsJTNEJTIyQW5hbHlzaXMlMjIlMkMlMjBsaW5lcyUzRDUpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZ3IuQnV0dG9uKCUyMkFuYWx5emUlMjIpLmNsaWNrKGFuYWx5emVfdGV4dCUyQyUyMHRleHRfaW5wdXQxJTJDJTIwYW5hbHlzaXNfb3V0cHV0KSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMHdpdGglMjBnci5UYWIoJTIyUmV2ZXJzZSUyMFRleHQlMjIpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdGV4dF9pbnB1dDIlMjAlM0QlMjBnci5UZXh0Ym94KGxhYmVsJTNEJTIyRW50ZXIlMjB0ZXh0JTIyJTJDJTIwbGluZXMlM0Q1KSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldmVyc2Vfb3V0cHV0JTIwJTNEJTIwZ3IuVGV4dGJveChsYWJlbCUzRCUyMlJldmVyc2VkJTIyJTJDJTIwbGluZXMlM0Q1KSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGdyLkJ1dHRvbiglMjJSZXZlcnNlJTIyKS5jbGljayhyZXZlcnNlX3RleHQlMkMlMjB0ZXh0X2lucHV0MiUyQyUyMHJldmVyc2Vfb3V0cHV0KSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMHdpdGglMjBnci5UYWIoJTIyQ291bnQlMjBWb3dlbHMlMjIpJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdGV4dF9pbnB1dDMlMjAlM0QlMjBnci5UZXh0Ym94KGxhYmVsJTNEJTIyRW50ZXIlMjB0ZXh0JTIyKSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHZvd2VsX291dHB1dCUyMCUzRCUyMGdyLk51bWJlcihsYWJlbCUzRCUyMlZvd2VsJTIwQ291bnQlMjIpJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZ3IuQnV0dG9uKCUyMkNvdW50JTIyKS5jbGljayhjb3VudF92b3dlbHMlMkMlMjB0ZXh0X2lucHV0MyUyQyUyMHZvd2VsX291dHB1dCklMEElMEFpZiUyMF9fbmFtZV9fJTIwJTNEJTNEJTIwJTIyX19tYWluX18lMjIlM0ElMEElMjAlMjAlMjAlMjBkZW1vLmxhdW5jaChtY3Bfc2VydmVyJTNEVHJ1ZSk=",highlighted:`<span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr
<span class="hljs-keyword">import</span> json
<span class="hljs-keyword">def</span> <span class="hljs-title function_">analyze_text</span>(<span class="hljs-params">text: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-string">&quot;&quot;&quot;Analyze text and compute statistics.
Args:
text: The input text to analyze
Returns:
JSON with analysis results
&quot;&quot;&quot;</span>
words = text.split()
chars = <span class="hljs-built_in">len</span>(text)
<span class="hljs-keyword">return</span> json.dumps({
<span class="hljs-string">&quot;words&quot;</span>: <span class="hljs-built_in">len</span>(words),
<span class="hljs-string">&quot;characters&quot;</span>: chars,
<span class="hljs-string">&quot;average_word_length&quot;</span>: <span class="hljs-built_in">round</span>(chars / <span class="hljs-built_in">len</span>(words), <span class="hljs-number">2</span>) <span class="hljs-keyword">if</span> words <span class="hljs-keyword">else</span> <span class="hljs-number">0</span>
})
<span class="hljs-keyword">def</span> <span class="hljs-title function_">reverse_text</span>(<span class="hljs-params">text: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-string">&quot;&quot;&quot;Reverse a string.
Args:
text: Input text
Returns:
The reversed text
&quot;&quot;&quot;</span>
<span class="hljs-keyword">return</span> text[::-<span class="hljs-number">1</span>]
<span class="hljs-keyword">def</span> <span class="hljs-title function_">count_vowels</span>(<span class="hljs-params">text: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">int</span>:
<span class="hljs-string">&quot;&quot;&quot;Count vowels in text.
Args:
text: Input text
Returns:
Number of vowels
&quot;&quot;&quot;</span>
vowels = <span class="hljs-string">&quot;aeiouAEIOU&quot;</span>
<span class="hljs-keyword">return</span> <span class="hljs-built_in">sum</span>(<span class="hljs-number">1</span> <span class="hljs-keyword">for</span> char <span class="hljs-keyword">in</span> text <span class="hljs-keyword">if</span> char <span class="hljs-keyword">in</span> vowels)
<span class="hljs-comment"># Create interface</span>
<span class="hljs-keyword">with</span> gr.Blocks(title=<span class="hljs-string">&quot;Text Tools&quot;</span>) <span class="hljs-keyword">as</span> demo:
gr.Markdown(<span class="hljs-string">&quot;# Text Processing Tools&quot;</span>)
<span class="hljs-keyword">with</span> gr.Tab(<span class="hljs-string">&quot;Analyze Text&quot;</span>):
text_input1 = gr.Textbox(label=<span class="hljs-string">&quot;Enter text&quot;</span>, lines=<span class="hljs-number">5</span>)
analysis_output = gr.Textbox(label=<span class="hljs-string">&quot;Analysis&quot;</span>, lines=<span class="hljs-number">5</span>)
gr.Button(<span class="hljs-string">&quot;Analyze&quot;</span>).click(analyze_text, text_input1, analysis_output)
<span class="hljs-keyword">with</span> gr.Tab(<span class="hljs-string">&quot;Reverse Text&quot;</span>):
text_input2 = gr.Textbox(label=<span class="hljs-string">&quot;Enter text&quot;</span>, lines=<span class="hljs-number">5</span>)
reverse_output = gr.Textbox(label=<span class="hljs-string">&quot;Reversed&quot;</span>, lines=<span class="hljs-number">5</span>)
gr.Button(<span class="hljs-string">&quot;Reverse&quot;</span>).click(reverse_text, text_input2, reverse_output)
<span class="hljs-keyword">with</span> gr.Tab(<span class="hljs-string">&quot;Count Vowels&quot;</span>):
text_input3 = gr.Textbox(label=<span class="hljs-string">&quot;Enter text&quot;</span>)
vowel_output = gr.Number(label=<span class="hljs-string">&quot;Vowel Count&quot;</span>)
gr.Button(<span class="hljs-string">&quot;Count&quot;</span>).click(count_vowels, text_input3, vowel_output)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:
demo.launch(mcp_server=<span class="hljs-literal">True</span>)`,wrap:!1}}),z=new h({props:{title:"Advanced Gradio MCP Features",local:"advanced-gradio-mcp-features",headingTag:"h2"}}),Y=new h({props:{title:"Exposing Resources with @gr.mcp.resource()",local:"exposing-resources-with-grmcpresource",headingTag:"h3"}}),P=new g({props:{code:"aW1wb3J0JTIwZ3JhZGlvJTIwYXMlMjBnciUwQSUwQSU0MGdyLm1jcC5yZXNvdXJjZSglMjJjb25maWclM0ElMkYlMkZhcGklMjIpJTBBZGVmJTIwYXBpX2RvY3VtZW50YXRpb24oKSUyMC0lM0UlMjBzdHIlM0ElMEElMjAlMjAlMjAlMjAlMjIlMjIlMjJBUEklMjBkb2N1bWVudGF0aW9uJTIwYW5kJTIwZW5kcG9pbnRzLiUyMiUyMiUyMiUwQSUyMCUyMCUyMCUyMHJldHVybiUyMCUyMiUyMiUyMiUyMyUyMEFQSSUyMERvY3VtZW50YXRpb24lMEElMjAlMjAlMjAlMjAlMEElMjMlMjMlMjBFbmRwb2ludHMlMEEtJTIwR0VUJTIwJTJGdXNlcnMlMjAtJTIwTGlzdCUyMGFsbCUyMHVzZXJzJTBBLSUyMFBPU1QlMjAlMkZ1c2VycyUyMC0lMjBDcmVhdGUlMjB1c2VyJTBBLSUyMEdFVCUyMCUyRnVzZXJzJTJGJTdCaWQlN0QlMjAtJTIwR2V0JTIwc3BlY2lmaWMlMjB1c2VyJTBBJTBBJTIzJTIzJTIwQXV0aGVudGljYXRpb24lMEFVc2UlMjBCZWFyZXIlMjB0b2tlbiUyMGluJTIwQXV0aG9yaXphdGlvbiUyMGhlYWRlci4lMEElMjIlMjIlMjIlMEElMEElMjMlMjBZb3VyJTIwdG9vbHMlMjBhbmQlMjBVSSUyMGhlcmUuLi4lMEElMEFpZiUyMF9fbmFtZV9fJTIwJTNEJTNEJTIwJTIyX19tYWluX18lMjIlM0ElMEElMjAlMjAlMjAlMjBkZW1vLmxhdW5jaChtY3Bfc2VydmVyJTNEVHJ1ZSk=",highlighted:`<span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr
<span class="hljs-meta">@gr.mcp.resource(<span class="hljs-params"><span class="hljs-string">&quot;config://api&quot;</span></span>)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">api_documentation</span>() -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-string">&quot;&quot;&quot;API documentation and endpoints.&quot;&quot;&quot;</span>
<span class="hljs-keyword">return</span> <span class="hljs-string">&quot;&quot;&quot;# API Documentation
## Endpoints
- GET /users - List all users
- POST /users - Create user
- GET /users/{id} - Get specific user
## Authentication
Use Bearer token in Authorization header.
&quot;&quot;&quot;</span>
<span class="hljs-comment"># Your tools and UI here...</span>
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:
demo.launch(mcp_server=<span class="hljs-literal">True</span>)`,wrap:!1}}),K=new h({props:{title:"MCP-Only Functions with @gr.api()",local:"mcp-only-functions-with-grapi",headingTag:"h3"}}),O=new g({props:{code:"aW1wb3J0JTIwZ3JhZGlvJTIwYXMlMjBnciUwQSUwQSU0MGdyLmFwaSgpJTBBZGVmJTIwcXVlcnlfZGF0YWJhc2Uoc3FsJTNBJTIwc3RyKSUyMC0lM0UlMjBzdHIlM0ElMEElMjAlMjAlMjAlMjAlMjIlMjIlMjJFeGVjdXRlJTIwYSUyMGRhdGFiYXNlJTIwcXVlcnklMjAoTUNQJTIwb25seSkuJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwQXJncyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHNxbCUzQSUyMFNRTCUyMHF1ZXJ5JTIwc3RyaW5nJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwUmV0dXJucyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMFF1ZXJ5JTIwcmVzdWx0cyUwQSUyMCUyMCUyMCUyMCUyMiUyMiUyMiUwQSUyMCUyMCUyMCUyMCUyMyUyME9ubHklMjBhY2Nlc3NpYmxlJTIwdmlhJTIwTUNQJTJDJTIwbm90JTIwd2ViJTIwVUklMEElMjAlMjAlMjAlMjByZXR1cm4lMjAlMjJRdWVyeSUyMHJlc3VsdHMuLi4lMjIlMEElMEElNDBnci5hcGkoKSUwQWRlZiUyMHNlbmRfZW1haWwodG8lM0ElMjBzdHIlMkMlMjBzdWJqZWN0JTNBJTIwc3RyJTJDJTIwYm9keSUzQSUyMHN0ciklMjAtJTNFJTIwc3RyJTNBJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyU2VuZCUyMGFuJTIwZW1haWwlMjAoTUNQJTIwb25seSkuJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwQXJncyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHRvJTNBJTIwUmVjaXBpZW50JTIwZW1haWwlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBzdWJqZWN0JTNBJTIwRW1haWwlMjBzdWJqZWN0JTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwYm9keSUzQSUyMEVtYWlsJTIwYm9keSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMFJldHVybnMlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBDb25maXJtYXRpb24lMjBtZXNzYWdlJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyJTBBJTIwJTIwJTIwJTIwJTIzJTIwT25seSUyMGFjY2Vzc2libGUlMjB2aWElMjBNQ1AlMEElMjAlMjAlMjAlMjByZXR1cm4lMjBmJTIyRW1haWwlMjBzZW50JTIwdG8lMjAlN0J0byU3RCUyMiUwQSUwQSUyMyUyMFJlZ3VsYXIlMjBVSSUyMGNvbXBvbmVudHMlMjBoZXJlLi4uJTBBJTBBaWYlMjBfX25hbWVfXyUyMCUzRCUzRCUyMCUyMl9fbWFpbl9fJTIyJTNBJTBBJTIwJTIwJTIwJTIwZGVtby5sYXVuY2gobWNwX3NlcnZlciUzRFRydWUp",highlighted:`<span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr
<span class="hljs-meta">@gr.api()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">query_database</span>(<span class="hljs-params">sql: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-string">&quot;&quot;&quot;Execute a database query (MCP only).
Args:
sql: SQL query string
Returns:
Query results
&quot;&quot;&quot;</span>
<span class="hljs-comment"># Only accessible via MCP, not web UI</span>
<span class="hljs-keyword">return</span> <span class="hljs-string">&quot;Query results...&quot;</span>
<span class="hljs-meta">@gr.api()</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">send_email</span>(<span class="hljs-params">to: <span class="hljs-built_in">str</span>, subject: <span class="hljs-built_in">str</span>, body: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-string">&quot;&quot;&quot;Send an email (MCP only).
Args:
to: Recipient email
subject: Email subject
body: Email body
Returns:
Confirmation message
&quot;&quot;&quot;</span>
<span class="hljs-comment"># Only accessible via MCP</span>
<span class="hljs-keyword">return</span> <span class="hljs-string">f&quot;Email sent to <span class="hljs-subst">{to}</span>&quot;</span>
<span class="hljs-comment"># Regular UI components here...</span>
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:
demo.launch(mcp_server=<span class="hljs-literal">True</span>)`,wrap:!1}}),ss=new h({props:{title:"Authentication",local:"authentication",headingTag:"h3"}}),ls=new g({props:{code:"aW1wb3J0JTIwZ3JhZGlvJTIwYXMlMjBnciUwQSUwQWRlZiUyMGF1dGhlbnRpY2F0ZSh1c2VybmFtZSUzQSUyMHN0ciUyQyUyMHBhc3N3b3JkJTNBJTIwc3RyKSUyMC0lM0UlMjBib29sJTNBJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwdXNlcm5hbWUlMjAlM0QlM0QlMjAlMjJhZG1pbiUyMiUyMGFuZCUyMHBhc3N3b3JkJTIwJTNEJTNEJTIwJTIyc2VjcmV0JTIyJTBBJTBBJTIzJTIwJTYwYXV0aCU2MCUyMHByb3RlY3RzJTIwdGhlJTIwd2ViJTIwVUklMjBvbmx5JTNCJTIwTUNQJTIwcmVtYWlucyUyMG9wZW4uJTBBaWYlMjBfX25hbWVfXyUyMCUzRCUzRCUyMCUyMl9fbWFpbl9fJTIyJTNBJTBBJTIwJTIwJTIwJTIwZGVtby5sYXVuY2gobWNwX3NlcnZlciUzRFRydWUlMkMlMjBhdXRoJTNEYXV0aGVudGljYXRlKQ==",highlighted:`<span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr
<span class="hljs-keyword">def</span> <span class="hljs-title function_">authenticate</span>(<span class="hljs-params">username: <span class="hljs-built_in">str</span>, password: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">bool</span>:
<span class="hljs-keyword">return</span> username == <span class="hljs-string">&quot;admin&quot;</span> <span class="hljs-keyword">and</span> password == <span class="hljs-string">&quot;secret&quot;</span>
<span class="hljs-comment"># \`auth\` protects the web UI only; MCP remains open.</span>
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:
demo.launch(mcp_server=<span class="hljs-literal">True</span>, auth=authenticate)`,wrap:!1}}),as=new h({props:{title:"Deploying to Hugging Face Spaces",local:"deploying-to-hugging-face-spaces",headingTag:"h2"}}),ps=new h({props:{title:"Step 1: Create a New Space",local:"step-1-create-a-new-space",headingTag:"h3"}}),is=new h({props:{title:"Step 2: Upload Your Code",local:"step-2-upload-your-code",headingTag:"h3"}}),rs=new g({props:{code:"aW1wb3J0JTIwZ3JhZGlvJTIwYXMlMjBnciUwQSUwQWRlZiUyMG15X3Rvb2woaW5wdXRfdGV4dCUzQSUyMHN0ciklMjAtJTNFJTIwc3RyJTNBJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyRG8lMjBzb21ldGhpbmclMjB3aXRoJTIwaW5wdXQuJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwQXJncyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGlucHV0X3RleHQlM0ElMjBUaGUlMjBpbnB1dCUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMFJldHVybnMlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBUaGUlMjByZXN1bHQlMEElMjAlMjAlMjAlMjAlMjIlMjIlMjIlMEElMjAlMjAlMjAlMjByZXR1cm4lMjBmJTIyUHJvY2Vzc2VkJTNBJTIwJTdCaW5wdXRfdGV4dCU3RCUyMiUwQSUwQWRlbW8lMjAlM0QlMjBnci5JbnRlcmZhY2UoZm4lM0RteV90b29sJTJDJTIwaW5wdXRzJTNEJTIydGV4dCUyMiUyQyUyMG91dHB1dHMlM0QlMjJ0ZXh0JTIyKSUwQSUwQWlmJTIwX19uYW1lX18lMjAlM0QlM0QlMjAlMjJfX21haW5fXyUyMiUzQSUwQSUyMCUyMCUyMCUyMGRlbW8ubGF1bmNoKG1jcF9zZXJ2ZXIlM0RUcnVlKQ==",highlighted:`<span class="hljs-keyword">import</span> gradio <span class="hljs-keyword">as</span> gr
<span class="hljs-keyword">def</span> <span class="hljs-title function_">my_tool</span>(<span class="hljs-params">input_text: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-string">&quot;&quot;&quot;Do something with input.
Args:
input_text: The input
Returns:
The result
&quot;&quot;&quot;</span>
<span class="hljs-keyword">return</span> <span class="hljs-string">f&quot;Processed: <span class="hljs-subst">{input_text}</span>&quot;</span>
demo = gr.Interface(fn=my_tool, inputs=<span class="hljs-string">&quot;text&quot;</span>, outputs=<span class="hljs-string">&quot;text&quot;</span>)
<span class="hljs-keyword">if</span> __name__ == <span class="hljs-string">&quot;__main__&quot;</span>:
demo.launch(mcp_server=<span class="hljs-literal">True</span>)`,wrap:!1}}),cs=new h({props:{title:"Step 3: Add Dependencies (if needed)",local:"step-3-add-dependencies-if-needed",headingTag:"h3"}}),Js=new g({props:{code:"Z3JhZGlvJTNFJTNENC4wLjAlMEFyZXF1ZXN0cyUzRSUzRDIuMjguMA==",highlighted:`<span class="hljs-attribute">gradio</span>&gt;=<span class="hljs-number">4</span>.<span class="hljs-number">0</span>.<span class="hljs-number">0</span>
<span class="hljs-attribute">requests</span>&gt;=<span class="hljs-number">2</span>.<span class="hljs-number">28</span>.<span class="hljs-number">0</span>`,wrap:!1}}),Ts=new h({props:{title:"Step 4: Access Your MCP Server",local:"step-4-access-your-mcp-server",headingTag:"h3"}}),js=new g({props:{code:"aHR0cHMlM0ElMkYlMkYlNUJ5b3VyLXVzZXJuYW1lJTVELSU1QnNwYWNlLW5hbWUlNUQuaGYuc3BhY2UlMkZncmFkaW9fYXBpJTJGbWNwJTJG",highlighted:'<span class="hljs-link">https://</span>[<span class="hljs-string">your-username</span>]-[space-name].hf.space/gradio_api/mcp/',wrap:!1}}),G=new Pl({props:{id:"tool",options:["Claude Code","Codex","OpenCode","Pi"],$$slots:{default:[se]},$$scope:{ctx:b}}}),ms=new h({props:{title:"Function Signature Best Practices",local:"function-signature-best-practices",headingTag:"h2"}}),Is=new g({props:{code:"JTIzJTIwR29vZCUzQSUyMENsZWFyJTIwdHlwZXMlMkMlMjBkb2NzdHJpbmclMkMlMjBBcmdzJTJGUmV0dXJucyUyMHNlY3Rpb25zJTBBZGVmJTIwcHJvY2Vzc19kYXRhKGRhdGElM0ElMjBzdHIlMkMlMjBmb3JtYXQlM0ElMjBzdHIlMjAlM0QlMjAlMjJqc29uJTIyKSUyMC0lM0UlMjBzdHIlM0ElMEElMjAlMjAlMjAlMjAlMjIlMjIlMjJQcm9jZXNzJTIwZGF0YSUyMGluJTIwc3BlY2lmaWVkJTIwZm9ybWF0LiUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMEFyZ3MlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBkYXRhJTNBJTIwSW5wdXQlMjBkYXRhJTIwc3RyaW5nJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwZm9ybWF0JTNBJTIwT3V0cHV0JTIwZm9ybWF0JTIwKGRlZmF1bHQlM0ElMjBqc29uKSUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMFJldHVybnMlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBQcm9jZXNzZWQlMjBkYXRhJTIwYXMlMjBzdHJpbmclMEElMjAlMjAlMjAlMjAlMjIlMjIlMjIlMEElMjAlMjAlMjAlMjByZXR1cm4lMjBkYXRhJTBBJTBBJTIzJTIwR29vZCUzQSUyMEhhbmRsZXMlMjBtdWx0aXBsZSUyMHBhcmFtZXRlcnMlMEFkZWYlMjBjYWxjdWxhdGUoYSUzQSUyMGZsb2F0JTJDJTIwYiUzQSUyMGZsb2F0JTJDJTIwb3BlcmF0aW9uJTNBJTIwc3RyKSUyMC0lM0UlMjBmbG9hdCUzQSUwQSUyMCUyMCUyMCUyMCUyMiUyMiUyMlBlcmZvcm0lMjBtYXRoZW1hdGljYWwlMjBvcGVyYXRpb24uJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwQXJncyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGElM0ElMjBGaXJzdCUyMG51bWJlciUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGIlM0ElMjBTZWNvbmQlMjBudW1iZXIlMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBvcGVyYXRpb24lM0ElMjBPcGVyYXRpb24lMjAoYWRkJTJDJTIwc3VidHJhY3QlMkMlMjBtdWx0aXBseSUyQyUyMGRpdmlkZSklMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjBSZXR1cm5zJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwUmVzdWx0JTIwb2YlMjBvcGVyYXRpb24lMEElMjAlMjAlMjAlMjAlMjIlMjIlMjIlMEElMjAlMjAlMjAlMjBpZiUyMG9wZXJhdGlvbiUyMCUzRCUzRCUyMCUyMmFkZCUyMiUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMHJldHVybiUyMGElMjAlMkIlMjBiJTBBJTIwJTIwJTIwJTIwJTIzJTIwLi4uJTIwbW9yZSUyMG9wZXJhdGlvbnMlMEElMEElMjMlMjBBdm9pZCUzQSUyME1pc3NpbmclMjB0eXBlJTIwaGludHMlMEFkZWYlMjBiYWRfZnVuY3Rpb24oZGF0YSklM0ElMjAlMjAlMjMlMjBObyUyMHJldHVybiUyMHR5cGUhJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwZGF0YSUwQSUwQSUyMyUyMEF2b2lkJTNBJTIwTm8lMjBkb2NzdHJpbmclMEFkZWYlMjBhbHNvX2JhZCh0ZXh0JTNBJTIwc3RyKSUyMC0lM0UlMjBzdHIlM0ElMEElMjAlMjAlMjAlMjByZXR1cm4lMjB0ZXh0LnVwcGVyKCklMEElMEElMjMlMjBBdm9pZCUzQSUyMENvbXBsZXglMjB0eXBlcyUyMHdpdGhvdXQlMjBjbGFyaWZpY2F0aW9uJTBBZGVmJTIwY29uZnVzaW5nKGRhdGElM0ElMjBkaWN0KSUyMC0lM0UlMjBsaXN0JTNBJTIwJTIwJTIzJTIwV2hhdCdzJTIwaW4lMjB0aGUlMjBkaWN0JTJGbGlzdCUzRiUwQSUyMCUyMCUyMCUyMHJldHVybiUyMCU1QiU1RA==",highlighted:`<span class="hljs-comment"># Good: Clear types, docstring, Args/Returns sections</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">process_data</span>(<span class="hljs-params">data: <span class="hljs-built_in">str</span>, <span class="hljs-built_in">format</span>: <span class="hljs-built_in">str</span> = <span class="hljs-string">&quot;json&quot;</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-string">&quot;&quot;&quot;Process data in specified format.
Args:
data: Input data string
format: Output format (default: json)
Returns:
Processed data as string
&quot;&quot;&quot;</span>
<span class="hljs-keyword">return</span> data
<span class="hljs-comment"># Good: Handles multiple parameters</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">calculate</span>(<span class="hljs-params">a: <span class="hljs-built_in">float</span>, b: <span class="hljs-built_in">float</span>, operation: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">float</span>:
<span class="hljs-string">&quot;&quot;&quot;Perform mathematical operation.
Args:
a: First number
b: Second number
operation: Operation (add, subtract, multiply, divide)
Returns:
Result of operation
&quot;&quot;&quot;</span>
<span class="hljs-keyword">if</span> operation == <span class="hljs-string">&quot;add&quot;</span>:
<span class="hljs-keyword">return</span> a + b
<span class="hljs-comment"># ... more operations</span>
<span class="hljs-comment"># Avoid: Missing type hints</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">bad_function</span>(<span class="hljs-params">data</span>): <span class="hljs-comment"># No return type!</span>
<span class="hljs-keyword">return</span> data
<span class="hljs-comment"># Avoid: No docstring</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">also_bad</span>(<span class="hljs-params">text: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-keyword">return</span> text.upper()
<span class="hljs-comment"># Avoid: Complex types without clarification</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">confusing</span>(<span class="hljs-params">data: <span class="hljs-built_in">dict</span></span>) -&gt; <span class="hljs-built_in">list</span>: <span class="hljs-comment"># What&#x27;s in the dict/list?</span>
<span class="hljs-keyword">return</span> []`,wrap:!1}}),fs=new h({props:{title:"Troubleshooting Gradio MCP",local:"troubleshooting-gradio-mcp",headingTag:"h2"}}),gs=new h({props:{title:"Functions Not Appearing as MCP Tools",local:"functions-not-appearing-as-mcp-tools",headingTag:"h3"}}),$s=new g({props:{code:"JTIzJTIwVGhpcyUyMHdpbGwlMjB3b3JrJTBBZGVmJTIwbXlfdG9vbCh0ZXh0JTNBJTIwc3RyKSUyMC0lM0UlMjBzdHIlM0ElMEElMjAlMjAlMjAlMjAlMjIlMjIlMjJQcm9jZXNzJTIwdGV4dC4lMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjBBcmdzJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwdGV4dCUzQSUyMElucHV0JTIwdGV4dCUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMFJldHVybnMlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjBQcm9jZXNzZWQlMjB0ZXh0JTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIwdGV4dC51cHBlcigpJTBBJTBBJTIzJTIwVGhpcyUyMHdvbid0JTIwd29yayUyMChubyUyMGRvY3N0cmluZyklMEFkZWYlMjBiYWRfdG9vbCh0ZXh0JTNBJTIwc3RyKSUyMC0lM0UlMjBzdHIlM0ElMEElMjAlMjAlMjAlMjByZXR1cm4lMjB0ZXh0LnVwcGVyKCk=",highlighted:`<span class="hljs-comment"># This will work</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">my_tool</span>(<span class="hljs-params">text: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-string">&quot;&quot;&quot;Process text.
Args:
text: Input text
Returns:
Processed text
&quot;&quot;&quot;</span>
<span class="hljs-keyword">return</span> text.upper()
<span class="hljs-comment"># This won&#x27;t work (no docstring)</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">bad_tool</span>(<span class="hljs-params">text: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-keyword">return</span> text.upper()`,wrap:!1}}),As=new h({props:{title:"MCP Endpoint Not Responding",local:"mcp-endpoint-not-responding",headingTag:"h3"}}),Es=new h({props:{title:"Type Mismatch Errors",local:"type-mismatch-errors",headingTag:"h3"}}),ks=new g({props:{code:"JTIzJTIwQ29ycmVjdCUzQSUyMFJldHVybnMlMjBzdHJpbmclMjBhcyUyMGRlY2xhcmVkJTBBZGVmJTIwY29ycmVjdCh4JTNBJTIwaW50KSUyMC0lM0UlMjBzdHIlM0ElMEElMjAlMjAlMjAlMjByZXR1cm4lMjBzdHIoeCUyMColMjAyKSUwQSUwQSUyMyUyMFdyb25nJTNBJTIwRGVjbGFyZXMlMjBzdHJpbmclMjBidXQlMjByZXR1cm5zJTIwaW50JTBBZGVmJTIwd3JvbmcoeCUzQSUyMGludCklMjAtJTNFJTIwc3RyJTNBJTBBJTIwJTIwJTIwJTIwcmV0dXJuJTIweCUyMColMjAyJTIwJTIwJTIzJTIwUmV0dXJucyUyMGludCUyQyUyMG5vdCUyMHN0cmluZyE=",highlighted:`<span class="hljs-comment"># Correct: Returns string as declared</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">correct</span>(<span class="hljs-params">x: <span class="hljs-built_in">int</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-keyword">return</span> <span class="hljs-built_in">str</span>(x * <span class="hljs-number">2</span>)
<span class="hljs-comment"># Wrong: Declares string but returns int</span>
<span class="hljs-keyword">def</span> <span class="hljs-title function_">wrong</span>(<span class="hljs-params">x: <span class="hljs-built_in">int</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-keyword">return</span> x * <span class="hljs-number">2</span> <span class="hljs-comment"># Returns int, not string!</span>`,wrap:!1}}),Rs=new h({props:{title:"Performance Tips for Production Spaces",local:"performance-tips-for-production-spaces",headingTag:"h2"}}),xs=new g({props:{code:"aW1wb3J0JTIwdGltZSUwQSUwQWRlZiUyMGFuYWx5emUoZGF0YSUzQSUyMHN0ciklMjAtJTNFJTIwc3RyJTNBJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyQW5hbHl6ZSUyMGxhcmdlJTIwZGF0YXNldHMuJTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwQXJncyUzQSUwQSUyMCUyMCUyMCUyMCUyMCUyMCUyMCUyMGRhdGElM0ElMjBJbnB1dCUyMGRhdGElMEElMjAlMjAlMjAlMjAlMEElMjAlMjAlMjAlMjBSZXR1cm5zJTNBJTBBJTIwJTIwJTIwJTIwJTIwJTIwJTIwJTIwQW5hbHlzaXMlMjByZXN1bHRzJTBBJTIwJTIwJTIwJTIwJTIyJTIyJTIyJTBBJTIwJTIwJTIwJTIwJTIzJTIwUmVqZWN0JTIwdG9vLWxhcmdlJTIwaW5wdXRzJTBBJTIwJTIwJTIwJTIwaWYlMjBsZW4oZGF0YSklMjAlM0UlMjAxXzAwMF8wMDAlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlMjJFcnJvciUzQSUyMElucHV0JTIwdG9vJTIwbGFyZ2UlMjAobWF4JTIwMU1CKSUyMiUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMCUyMyUyMFNob3clMjBwcm9ncmVzcyUwQSUyMCUyMCUyMCUyMHN0YXJ0JTIwJTNEJTIwdGltZS50aW1lKCklMEElMjAlMjAlMjAlMjAlMjMlMjAuLi4lMjBkbyUyMGFuYWx5c2lzJTBBJTIwJTIwJTIwJTIwZWxhcHNlZCUyMCUzRCUyMHRpbWUudGltZSgpJTIwLSUyMHN0YXJ0JTBBJTIwJTIwJTIwJTIwJTBBJTIwJTIwJTIwJTIwaWYlMjBlbGFwc2VkJTIwJTNFJTIwMzAlM0ElMEElMjAlMjAlMjAlMjAlMjAlMjAlMjAlMjByZXR1cm4lMjAlMjJFcnJvciUzQSUyMFByb2Nlc3NpbmclMjB0b29rJTIwdG9vJTIwbG9uZyUyMiUwQSUyMCUyMCUyMCUyMCUwQSUyMCUyMCUyMCUyMHJldHVybiUyMCUyMlJlc3VsdHMuLi4lMjI=",highlighted:`<span class="hljs-keyword">import</span> time
<span class="hljs-keyword">def</span> <span class="hljs-title function_">analyze</span>(<span class="hljs-params">data: <span class="hljs-built_in">str</span></span>) -&gt; <span class="hljs-built_in">str</span>:
<span class="hljs-string">&quot;&quot;&quot;Analyze large datasets.
Args:
data: Input data
Returns:
Analysis results
&quot;&quot;&quot;</span>
<span class="hljs-comment"># Reject too-large inputs</span>
<span class="hljs-keyword">if</span> <span class="hljs-built_in">len</span>(data) &gt; <span class="hljs-number">1_000_000</span>:
<span class="hljs-keyword">return</span> <span class="hljs-string">&quot;Error: Input too large (max 1MB)&quot;</span>
<span class="hljs-comment"># Show progress</span>
start = time.time()
<span class="hljs-comment"># ... do analysis</span>
elapsed = time.time() - start
<span class="hljs-keyword">if</span> elapsed &gt; <span class="hljs-number">30</span>:
<span class="hljs-keyword">return</span> <span class="hljs-string">&quot;Error: Processing took too long&quot;</span>
<span class="hljs-keyword">return</span> <span class="hljs-string">&quot;Results...&quot;</span>`,wrap:!1}}),vs=new h({props:{title:"Key Takeaways",local:"key-takeaways",headingTag:"h2"}}),Ws=new Fl({props:{source:"https://github.com/huggingface/context-course/blob/main/units/en/unit2/gradio-mcp.mdx"}}),{c(){M=T("meta"),U=a(),i=T("p"),d=a(),o(I.$$.fragment),f=a(),o(C.$$.fragment),B=a(),p=T("p"),p.innerHTML=m,Z=a(),o($.$$.fragment),k=a(),A=T("p"),A.textContent=pl,Hs=a(),_=T("ol"),_.innerHTML=Ml,Ns=a(),R=T("p"),R.textContent=il,zs=a(),o(Q.$$.fragment),Ys=a(),x=T("p"),x.textContent=ol,Fs=a(),o(v.$$.fragment),Ps=a(),V=T("p"),V.innerHTML=rl,Ls=a(),o(X.$$.fragment),Ks=a(),S=T("blockquote"),S.innerHTML=cl,Ds=a(),o(W.$$.fragment),Os=a(),q=T("p"),q.textContent=yl,st=a(),o(H.$$.fragment),tt=a(),N=T("p"),N.textContent=Jl,lt=a(),o(z.$$.fragment),et=a(),o(Y.$$.fragment),at=a(),F=T("p"),F.textContent=ul,nt=a(),o(P.$$.fragment),pt=a(),L=T("p"),L.textContent=Tl,Mt=a(),o(K.$$.fragment),it=a(),D=T("p"),D.textContent=wl,ot=a(),o(O.$$.fragment),rt=a(),o(ss.$$.fragment),ct=a(),ts=T("p"),ts.innerHTML=jl,yt=a(),o(ls.$$.fragment),Jt=a(),es=T("p"),es.innerHTML=Ul,ut=a(),o(as.$$.fragment),Tt=a(),ns=T("p"),ns.textContent=ml,wt=a(),o(ps.$$.fragment),jt=a(),Ms=T("ol"),Ms.innerHTML=dl,Ut=a(),o(is.$$.fragment),mt=a(),os=T("p"),os.innerHTML=Il,dt=a(),o(rs.$$.fragment),It=a(),o(cs.$$.fragment),ht=a(),ys=T("p"),ys.innerHTML=hl,Ct=a(),o(Js.$$.fragment),ft=a(),us=T("p"),us.textContent=Cl,gt=a(),o(Ts.$$.fragment),Bt=a(),ws=T("p"),ws.textContent=fl,bt=a(),o(js.$$.fragment),$t=a(),Us=T("p"),Us.textContent=gl,At=a(),o(G.$$.fragment),St=a(),E=T("blockquote"),E.innerHTML=Bl,Gt=a(),o(ms.$$.fragment),Et=a(),ds=T("p"),ds.textContent=bl,Zt=a(),o(Is.$$.fragment),kt=a(),hs=T("p"),hs.textContent=$l,_t=a(),Cs=T("ul"),Cs.innerHTML=Al,Rt=a(),o(fs.$$.fragment),Qt=a(),o(gs.$$.fragment),xt=a(),Bs=T("p"),Bs.textContent=Sl,vt=a(),bs=T("ul"),bs.innerHTML=Gl,Vt=a(),o($s.$$.fragment),Xt=a(),o(As.$$.fragment),Wt=a(),Ss=T("p"),Ss.textContent=El,qt=a(),Gs=T("ol"),Gs.innerHTML=Zl,Ht=a(),o(Es.$$.fragment),Nt=a(),Zs=T("p"),Zs.textContent=kl,zt=a(),o(ks.$$.fragment),Yt=a(),_s=T("p"),_s.textContent=_l,Ft=a(),o(Rs.$$.fragment),Pt=a(),Qs=T("ol"),Qs.innerHTML=Rl,Lt=a(),o(xs.$$.fragment),Kt=a(),o(vs.$$.fragment),Dt=a(),Vs=T("p"),Vs.innerHTML=Ql,Ot=a(),Xs=T("p"),Xs.textContent=xl,sl=a(),o(Ws.$$.fragment),tl=a(),qs=T("p"),this.h()},l(s){const t=Nl("svelte-u9bgzb",document.head);M=w(t,"META",{name:!0,content:!0}),t.forEach(l),U=n(s),i=w(s,"P",{}),Vl(i).forEach(l),d=n(s),r(I.$$.fragment,s),f=n(s),r(C.$$.fragment,s),B=n(s),p=w(s,"P",{"data-svelte-h":!0}),j(p)!=="svelte-1gjzq"&&(p.innerHTML=m),Z=n(s),r($.$$.fragment,s),k=n(s),A=w(s,"P",{"data-svelte-h":!0}),j(A)!=="svelte-e3y19g"&&(A.textContent=pl),Hs=n(s),_=w(s,"OL",{"data-svelte-h":!0}),j(_)!=="svelte-1yyy4kk"&&(_.innerHTML=Ml),Ns=n(s),R=w(s,"P",{"data-svelte-h":!0}),j(R)!=="svelte-12qfc12"&&(R.textContent=il),zs=n(s),r(Q.$$.fragment,s),Ys=n(s),x=w(s,"P",{"data-svelte-h":!0}),j(x)!=="svelte-1ywgbwm"&&(x.textContent=ol),Fs=n(s),r(v.$$.fragment,s),Ps=n(s),V=w(s,"P",{"data-svelte-h":!0}),j(V)!=="svelte-1j8eecg"&&(V.innerHTML=rl),Ls=n(s),r(X.$$.fragment,s),Ks=n(s),S=w(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),j(S)!=="svelte-yc7wkj"&&(S.innerHTML=cl),Ds=n(s),r(W.$$.fragment,s),Os=n(s),q=w(s,"P",{"data-svelte-h":!0}),j(q)!=="svelte-1v13gkr"&&(q.textContent=yl),st=n(s),r(H.$$.fragment,s),tt=n(s),N=w(s,"P",{"data-svelte-h":!0}),j(N)!=="svelte-4rsmm5"&&(N.textContent=Jl),lt=n(s),r(z.$$.fragment,s),et=n(s),r(Y.$$.fragment,s),at=n(s),F=w(s,"P",{"data-svelte-h":!0}),j(F)!=="svelte-1epfrkk"&&(F.textContent=ul),nt=n(s),r(P.$$.fragment,s),pt=n(s),L=w(s,"P",{"data-svelte-h":!0}),j(L)!=="svelte-1gpi5ac"&&(L.textContent=Tl),Mt=n(s),r(K.$$.fragment,s),it=n(s),D=w(s,"P",{"data-svelte-h":!0}),j(D)!=="svelte-ca3coq"&&(D.textContent=wl),ot=n(s),r(O.$$.fragment,s),rt=n(s),r(ss.$$.fragment,s),ct=n(s),ts=w(s,"P",{"data-svelte-h":!0}),j(ts)!=="svelte-m2hcc9"&&(ts.innerHTML=jl),yt=n(s),r(ls.$$.fragment,s),Jt=n(s),es=w(s,"P",{"data-svelte-h":!0}),j(es)!=="svelte-ddce2u"&&(es.innerHTML=Ul),ut=n(s),r(as.$$.fragment,s),Tt=n(s),ns=w(s,"P",{"data-svelte-h":!0}),j(ns)!=="svelte-1lam62t"&&(ns.textContent=ml),wt=n(s),r(ps.$$.fragment,s),jt=n(s),Ms=w(s,"OL",{"data-svelte-h":!0}),j(Ms)!=="svelte-151765w"&&(Ms.innerHTML=dl),Ut=n(s),r(is.$$.fragment,s),mt=n(s),os=w(s,"P",{"data-svelte-h":!0}),j(os)!=="svelte-3y6ott"&&(os.innerHTML=Il),dt=n(s),r(rs.$$.fragment,s),It=n(s),r(cs.$$.fragment,s),ht=n(s),ys=w(s,"P",{"data-svelte-h":!0}),j(ys)!=="svelte-q21qoj"&&(ys.innerHTML=hl),Ct=n(s),r(Js.$$.fragment,s),ft=n(s),us=w(s,"P",{"data-svelte-h":!0}),j(us)!=="svelte-ccn7zf"&&(us.textContent=Cl),gt=n(s),r(Ts.$$.fragment,s),Bt=n(s),ws=w(s,"P",{"data-svelte-h":!0}),j(ws)!=="svelte-hqymo5"&&(ws.textContent=fl),bt=n(s),r(js.$$.fragment,s),$t=n(s),Us=w(s,"P",{"data-svelte-h":!0}),j(Us)!=="svelte-1wolui5"&&(Us.textContent=gl),At=n(s),r(G.$$.fragment,s),St=n(s),E=w(s,"BLOCKQUOTE",{class:!0,"data-svelte-h":!0}),j(E)!=="svelte-siurbm"&&(E.innerHTML=Bl),Gt=n(s),r(ms.$$.fragment,s),Et=n(s),ds=w(s,"P",{"data-svelte-h":!0}),j(ds)!=="svelte-o86lsg"&&(ds.textContent=bl),Zt=n(s),r(Is.$$.fragment,s),kt=n(s),hs=w(s,"P",{"data-svelte-h":!0}),j(hs)!=="svelte-1d7misi"&&(hs.textContent=$l),_t=n(s),Cs=w(s,"UL",{"data-svelte-h":!0}),j(Cs)!=="svelte-xxa863"&&(Cs.innerHTML=Al),Rt=n(s),r(fs.$$.fragment,s),Qt=n(s),r(gs.$$.fragment,s),xt=n(s),Bs=w(s,"P",{"data-svelte-h":!0}),j(Bs)!=="svelte-a4wjzm"&&(Bs.textContent=Sl),vt=n(s),bs=w(s,"UL",{"data-svelte-h":!0}),j(bs)!=="svelte-jgnd2h"&&(bs.innerHTML=Gl),Vt=n(s),r($s.$$.fragment,s),Xt=n(s),r(As.$$.fragment,s),Wt=n(s),Ss=w(s,"P",{"data-svelte-h":!0}),j(Ss)!=="svelte-ulsk6k"&&(Ss.textContent=El),qt=n(s),Gs=w(s,"OL",{"data-svelte-h":!0}),j(Gs)!=="svelte-1gp83m2"&&(Gs.innerHTML=Zl),Ht=n(s),r(Es.$$.fragment,s),Nt=n(s),Zs=w(s,"P",{"data-svelte-h":!0}),j(Zs)!=="svelte-133echt"&&(Zs.textContent=kl),zt=n(s),r(ks.$$.fragment,s),Yt=n(s),_s=w(s,"P",{"data-svelte-h":!0}),j(_s)!=="svelte-zd5wm6"&&(_s.textContent=_l),Ft=n(s),r(Rs.$$.fragment,s),Pt=n(s),Qs=w(s,"OL",{"data-svelte-h":!0}),j(Qs)!=="svelte-m87nxl"&&(Qs.innerHTML=Rl),Lt=n(s),r(xs.$$.fragment,s),Kt=n(s),r(vs.$$.fragment,s),Dt=n(s),Vs=w(s,"P",{"data-svelte-h":!0}),j(Vs)!=="svelte-1hqx8ff"&&(Vs.innerHTML=Ql),Ot=n(s),Xs=w(s,"P",{"data-svelte-h":!0}),j(Xs)!=="svelte-5d8ckg"&&(Xs.textContent=xl),sl=n(s),r(Ws.$$.fragment,s),tl=n(s),qs=w(s,"P",{}),Vl(qs).forEach(l),this.h()},h(){el(M,"name","hf:doc:metadata"),el(M,"content",le),el(S,"class","tip"),el(E,"class","tip")},m(s,t){zl(document.head,M),e(s,U,t),e(s,i,t),e(s,d,t),c(I,s,t),e(s,f,t),c(C,s,t),e(s,B,t),e(s,p,t),e(s,Z,t),c($,s,t),e(s,k,t),e(s,A,t),e(s,Hs,t),e(s,_,t),e(s,Ns,t),e(s,R,t),e(s,zs,t),c(Q,s,t),e(s,Ys,t),e(s,x,t),e(s,Fs,t),c(v,s,t),e(s,Ps,t),e(s,V,t),e(s,Ls,t),c(X,s,t),e(s,Ks,t),e(s,S,t),e(s,Ds,t),c(W,s,t),e(s,Os,t),e(s,q,t),e(s,st,t),c(H,s,t),e(s,tt,t),e(s,N,t),e(s,lt,t),c(z,s,t),e(s,et,t),c(Y,s,t),e(s,at,t),e(s,F,t),e(s,nt,t),c(P,s,t),e(s,pt,t),e(s,L,t),e(s,Mt,t),c(K,s,t),e(s,it,t),e(s,D,t),e(s,ot,t),c(O,s,t),e(s,rt,t),c(ss,s,t),e(s,ct,t),e(s,ts,t),e(s,yt,t),c(ls,s,t),e(s,Jt,t),e(s,es,t),e(s,ut,t),c(as,s,t),e(s,Tt,t),e(s,ns,t),e(s,wt,t),c(ps,s,t),e(s,jt,t),e(s,Ms,t),e(s,Ut,t),c(is,s,t),e(s,mt,t),e(s,os,t),e(s,dt,t),c(rs,s,t),e(s,It,t),c(cs,s,t),e(s,ht,t),e(s,ys,t),e(s,Ct,t),c(Js,s,t),e(s,ft,t),e(s,us,t),e(s,gt,t),c(Ts,s,t),e(s,Bt,t),e(s,ws,t),e(s,bt,t),c(js,s,t),e(s,$t,t),e(s,Us,t),e(s,At,t),c(G,s,t),e(s,St,t),e(s,E,t),e(s,Gt,t),c(ms,s,t),e(s,Et,t),e(s,ds,t),e(s,Zt,t),c(Is,s,t),e(s,kt,t),e(s,hs,t),e(s,_t,t),e(s,Cs,t),e(s,Rt,t),c(fs,s,t),e(s,Qt,t),c(gs,s,t),e(s,xt,t),e(s,Bs,t),e(s,vt,t),e(s,bs,t),e(s,Vt,t),c($s,s,t),e(s,Xt,t),c(As,s,t),e(s,Wt,t),e(s,Ss,t),e(s,qt,t),e(s,Gs,t),e(s,Ht,t),c(Es,s,t),e(s,Nt,t),e(s,Zs,t),e(s,zt,t),c(ks,s,t),e(s,Yt,t),e(s,_s,t),e(s,Ft,t),c(Rs,s,t),e(s,Pt,t),e(s,Qs,t),e(s,Lt,t),c(xs,s,t),e(s,Kt,t),c(vs,s,t),e(s,Dt,t),e(s,Vs,t),e(s,Ot,t),e(s,Xs,t),e(s,sl,t),c(Ws,s,t),e(s,tl,t),e(s,qs,t),ll=!0},p(s,[t]){const vl={};t&2&&(vl.$$scope={dirty:t,ctx:s}),G.$set(vl)},i(s){ll||(y(I.$$.fragment,s),y(C.$$.fragment,s),y($.$$.fragment,s),y(Q.$$.fragment,s),y(v.$$.fragment,s),y(X.$$.fragment,s),y(W.$$.fragment,s),y(H.$$.fragment,s),y(z.$$.fragment,s),y(Y.$$.fragment,s),y(P.$$.fragment,s),y(K.$$.fragment,s),y(O.$$.fragment,s),y(ss.$$.fragment,s),y(ls.$$.fragment,s),y(as.$$.fragment,s),y(ps.$$.fragment,s),y(is.$$.fragment,s),y(rs.$$.fragment,s),y(cs.$$.fragment,s),y(Js.$$.fragment,s),y(Ts.$$.fragment,s),y(js.$$.fragment,s),y(G.$$.fragment,s),y(ms.$$.fragment,s),y(Is.$$.fragment,s),y(fs.$$.fragment,s),y(gs.$$.fragment,s),y($s.$$.fragment,s),y(As.$$.fragment,s),y(Es.$$.fragment,s),y(ks.$$.fragment,s),y(Rs.$$.fragment,s),y(xs.$$.fragment,s),y(vs.$$.fragment,s),y(Ws.$$.fragment,s),ll=!0)},o(s){J(I.$$.fragment,s),J(C.$$.fragment,s),J($.$$.fragment,s),J(Q.$$.fragment,s),J(v.$$.fragment,s),J(X.$$.fragment,s),J(W.$$.fragment,s),J(H.$$.fragment,s),J(z.$$.fragment,s),J(Y.$$.fragment,s),J(P.$$.fragment,s),J(K.$$.fragment,s),J(O.$$.fragment,s),J(ss.$$.fragment,s),J(ls.$$.fragment,s),J(as.$$.fragment,s),J(ps.$$.fragment,s),J(is.$$.fragment,s),J(rs.$$.fragment,s),J(cs.$$.fragment,s),J(Js.$$.fragment,s),J(Ts.$$.fragment,s),J(js.$$.fragment,s),J(G.$$.fragment,s),J(ms.$$.fragment,s),J(Is.$$.fragment,s),J(fs.$$.fragment,s),J(gs.$$.fragment,s),J($s.$$.fragment,s),J(As.$$.fragment,s),J(Es.$$.fragment,s),J(ks.$$.fragment,s),J(Rs.$$.fragment,s),J(xs.$$.fragment,s),J(vs.$$.fragment,s),J(Ws.$$.fragment,s),ll=!1},d(s){s&&(l(U),l(i),l(d),l(f),l(B),l(p),l(Z),l(k),l(A),l(Hs),l(_),l(Ns),l(R),l(zs),l(Ys),l(x),l(Fs),l(Ps),l(V),l(Ls),l(Ks),l(S),l(Ds),l(Os),l(q),l(st),l(tt),l(N),l(lt),l(et),l(at),l(F),l(nt),l(pt),l(L),l(Mt),l(it),l(D),l(ot),l(rt),l(ct),l(ts),l(yt),l(Jt),l(es),l(ut),l(Tt),l(ns),l(wt),l(jt),l(Ms),l(Ut),l(mt),l(os),l(dt),l(It),l(ht),l(ys),l(Ct),l(ft),l(us),l(gt),l(Bt),l(ws),l(bt),l($t),l(Us),l(At),l(St),l(E),l(Gt),l(Et),l(ds),l(Zt),l(kt),l(hs),l(_t),l(Cs),l(Rt),l(Qt),l(xt),l(Bs),l(vt),l(bs),l(Vt),l(Xt),l(Wt),l(Ss),l(qt),l(Gs),l(Ht),l(Nt),l(Zs),l(zt),l(Yt),l(_s),l(Ft),l(Pt),l(Qs),l(Lt),l(Kt),l(Dt),l(Vs),l(Ot),l(Xs),l(sl),l(tl),l(qs)),l(M),u(I,s),u(C,s),u($,s),u(Q,s),u(v,s),u(X,s),u(W,s),u(H,s),u(z,s),u(Y,s),u(P,s),u(K,s),u(O,s),u(ss,s),u(ls,s),u(as,s),u(ps,s),u(is,s),u(rs,s),u(cs,s),u(Js,s),u(Ts,s),u(js,s),u(G,s),u(ms,s),u(Is,s),u(fs,s),u(gs,s),u($s,s),u(As,s),u(Es,s),u(ks,s),u(Rs,s),u(xs,s),u(vs,s),u(Ws,s)}}}const le='{"title":"Gradio MCP Integration: Web UIs + MCP Servers","local":"gradio-mcp-integration-web-uis--mcp-servers","sections":[{"title":"What Is Gradio MCP Integration?","local":"what-is-gradio-mcp-integration","sections":[],"depth":2},{"title":"Installing Gradio with MCP Support","local":"installing-gradio-with-mcp-support","sections":[],"depth":2},{"title":"Building a Practical Gradio MCP App","local":"building-a-practical-gradio-mcp-app","sections":[],"depth":2},{"title":"Advanced Gradio MCP Features","local":"advanced-gradio-mcp-features","sections":[{"title":"Exposing Resources with @gr.mcp.resource()","local":"exposing-resources-with-grmcpresource","sections":[],"depth":3},{"title":"MCP-Only Functions with @gr.api()","local":"mcp-only-functions-with-grapi","sections":[],"depth":3},{"title":"Authentication","local":"authentication","sections":[],"depth":3}],"depth":2},{"title":"Deploying to Hugging Face Spaces","local":"deploying-to-hugging-face-spaces","sections":[{"title":"Step 1: Create a New Space","local":"step-1-create-a-new-space","sections":[],"depth":3},{"title":"Step 2: Upload Your Code","local":"step-2-upload-your-code","sections":[],"depth":3},{"title":"Step 3: Add Dependencies (if needed)","local":"step-3-add-dependencies-if-needed","sections":[],"depth":3},{"title":"Step 4: Access Your MCP Server","local":"step-4-access-your-mcp-server","sections":[],"depth":3}],"depth":2},{"title":"Function Signature Best Practices","local":"function-signature-best-practices","sections":[],"depth":2},{"title":"Troubleshooting Gradio MCP","local":"troubleshooting-gradio-mcp","sections":[{"title":"Functions Not Appearing as MCP Tools","local":"functions-not-appearing-as-mcp-tools","sections":[],"depth":3},{"title":"MCP Endpoint Not Responding","local":"mcp-endpoint-not-responding","sections":[],"depth":3},{"title":"Type Mismatch Errors","local":"type-mismatch-errors","sections":[],"depth":3}],"depth":2},{"title":"Performance Tips for Production Spaces","local":"performance-tips-for-production-spaces","sections":[],"depth":2},{"title":"Key Takeaways","local":"key-takeaways","sections":[],"depth":2}],"depth":1}';function ee(b){return Wl(()=>{new URLSearchParams(window.location.search).get("fw")}),[]}class oe extends ql{constructor(M){super(),Hl(this,M,ee,te,Xl,{})}}export{oe as component};

Xet Storage Details

Size:
54.5 kB
·
Xet hash:
c3ac1f0b8b63d188892949df08580f87f67fd403b4510102f7e9b55021075ac6

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.