Let users install MCP servers from a registry with their own credentials.
An MCP hub is a catalog of MCP servers your users browse and install from inside the app. Register one and nobody has to hand-write an MCP configuration, or wait for a redeploy when the catalog grows.Installing does not equip an agent. It adds the server to the user’s own pool of installed MCP servers, and equipping an agent is a separate step:
1
Install into the pool
The user picks a server, fills in whatever it asks for, and it joins their pool. Every hub feeds the same pool, so what came from which registry stops mattering once it is installed.
2
Equip an agent's workspace
In a chat, the user picks from the pool to add the server to that agent’s workspace. Its tools reach the agent immediately.
Splitting the two is what makes credentials a one-time cost. An API key is entered once at install time, and equipping that server in ten different workspaces never asks for it again. The pool belongs to the user, so it also outlives any single chat.
GitHub’s public registry of MCP servers. Works anonymously; a token raises the rate limit.
Coming soon
—
More registries are being built.
GitHubMCPHub works with no arguments, and every field below has a default:
Configure GitHubMCPHub
from agentscope.app.hub import GitHubMCPHubhub = GitHubMCPHub( # Addresses this hub in the API and the frontend URL. Keep it stable. hub_id="github", # Shown in the frontend's hub switcher. display_name="GitHub MCP Registry", # Optional token. Anonymous requests work, but are rate-limited. api_token=None,)
Parameter
Default
Description
hub_id
"github"
The identifier addressing this hub in routes and URLs
Register several to give users a choice of catalogs, each with its own hub_id:
Register several MCP hubs
app = create_app( # ...existing code... mcp_hubs=[ GitHubMCPHub(), # A second instance pointed at your own registry. GitHubMCPHub( hub_id="internal", display_name="Internal Registry", base_url="https://mcp.corp.example.com", ), ],)
Registering two MCP hubs under the same hub_id fails at startup rather than silently shadowing one.
3
Browse and install
Restart the service and open the MCP page. The sidebar lists your registered hubs plus Mine, the user’s own collection. Pick a hub, search, and open a card to see what the server does and what it needs.
Browsing an MCP registry from the MCP page.
Install opens a form built from what the listing declares. On submit, the server is contacted straight away, so wrong credentials come back as an error on the form instead of a broken install. Everything installed shows up under Installed MCPs:
The MCP servers a user has installed.
4
Equip an agent
Open a chat, expand the MCP panel, choose Add, and pick from Installed MCPs. The server’s tools reach the agent immediately.
Equipping an agent with installed MCP servers.
From Installed MCPs, users rename an install, turn it off without losing its configuration, update a rotated key, or delete it. Deleting leaves chats that already use it untouched.
Any catalog becomes a hub by subclassing MCPHubBase: a public registry, your company’s approved list, or a fixed set of servers you want to offer. Two methods are required, one to browse and one to fetch a single listing:
A hub over an internal catalog
from agentscope.app.hub import MCPCard, MCPHubBase, MCPHubPageclass InternalMCPHub(MCPHubBase): """The MCP servers approved for use inside our company.""" def __init__(self) -> None: super().__init__( hub_id="internal", display_name="Internal Registry", description="MCP servers approved by the platform team.", ) async def list_mcps( self, user_id: str, # The keyword the user typed, or `None` to browse everything. q: str | None = None, # The opaque cursor from the previous page, or `None` to start. cursor: str | None = None, limit: int = 20, ) -> MCPHubPage: """Return one page of listings.""" page = await fetch_our_catalog(query=q, after=cursor, limit=limit) return MCPHubPage( cards=[self._to_card(c) for c in page.items], # `None` tells the frontend there is nothing more to load. next_cursor=page.next_cursor, ) async def get_mcp(self, user_id: str, card_id: str) -> MCPCard: """Return one listing, or raise `KeyError` if there is no such card.""" return self._to_card(await fetch_one(card_id))
Two more things shape how a hub behaves:
Point
Description
Cursor pagination
Return whatever opaque string lets you resume, and None when the catalog is exhausted. The frontend loads more as the user scrolls
Missing cards
Raise KeyError from get_mcp for an unknown id, and the service answers 404
Both methods receive user_id as their first argument, so a catalog does not have to look the same to everybody. Filter on it to run a per-team allowlist, gate paid listings on entitlements from your billing system, or keep an unreleased server visible only to its authors:
A catalog that differs per user
class InternalMCPHub(MCPHubBase): async def list_mcps( self, user_id: str, q: str | None = None, cursor: str | None = None, limit: int = 20, ) -> MCPHubPage: """Return only the listings this user is allowed to see.""" # Whatever your own system says this user may install. allowed = await our_entitlements(user_id) page = await fetch_our_catalog(query=q, after=cursor, limit=limit) return MCPHubPage( cards=[ self._to_card(c) for c in page.items if c.id in allowed ], next_cursor=page.next_cursor, ) async def get_mcp(self, user_id: str, card_id: str) -> MCPCard: """Refuse a hidden card, so guessing an id gains nothing.""" if card_id not in await our_entitlements(user_id): raise KeyError(card_id) return self._to_card(await fetch_one(card_id))
Apply the same filter in get_mcp that you apply in list_mcps. Hiding a card from the listing alone is not access control: get_mcp is reachable with any id the caller cares to guess.
A card is a template rather than a ready connection. Write the parts the user supplies as ${placeholder}, then describe them with a standard JSON Schema so the frontend can render the form:
A card that asks for an API key
MCPCard( hub_id=self.hub_id, id="weather", name="weather", display_name="Weather", description="Current conditions and forecasts.", config_template=HttpMCPConfig( url="https://weather.example.com/mcp", # Placeholders work in any string: URLs, headers, env vars, args. headers={"Authorization": "Bearer ${api_key}"}, ), inputs_schema={ "type": "object", "required": ["api_key"], "properties": { "api_key": { "type": "string", "title": "API key", "description": "Found under Settings, API in your account.", # Renders as a masked field, and is never echoed back. "writeOnly": True, "format": "password", }, }, },)
Mark every credential field with "writeOnly": true and "format": "password". That is what tells the frontend to mask the value and to leave the field blank when the user edits the install later.
A hub lives for the whole lifetime of the service, so it can hold a connection pool instead of opening one per request. Implement the async context manager methods and the service enters every hub on startup, closing them on shutdown:
{"docsConfig":{"theme":"mint","$schema":"https://mintlify.com/docs.json","name":"AgentScope","colors":{"primary":"#0064FD","light":"#3B87FF","dark":"#0050CC"},"logo":{"light":"https://mintcdn.com/agentscope-ai-786677c7/ypv6xWD33tVApmTg/logo/agentscope.svg?fit=max\u0026auto=format\u0026n=ypv6xWD33tVApmTg\u0026q=85\u0026s=1c9a848ffa88ffa648f07542fe23e3e7","dark":"https://mintcdn.com/agentscope-ai-786677c7/ypv6xWD33tVApmTg/logo/agentscope.svg?fit=max\u0026auto=format\u0026n=ypv6xWD33tVApmTg\u0026q=85\u0026s=1c9a848ffa88ffa648f07542fe23e3e7"},"favicon":"https://mintcdn.com/agentscope-ai-786677c7/ypv6xWD33tVApmTg/logo/agentscope.svg?fit=max\u0026auto=format\u0026n=ypv6xWD33tVApmTg\u0026q=85\u0026s=1c9a848ffa88ffa648f07542fe23e3e7","navbar":{},"footer":{"socials":{"x":"https://x.com/agentscope","github":"https://github.com/agentscope-ai","discord":"https://discord.gg/eYMpfnkG8h"}},"contextual":{"options":["copy","view","chatgpt","claude","perplexity","mcp","cursor","vscode"],"display":"header"},"markdown":{"instructions":["For AgentScope Python, use https://docs.agentscope.io/stable/en/index for new projects. For existing projects, check the installed agentscope version and use matching versioned documentation.","The /latest/ alias points to the newest documentation and may move ahead of /stable/ when a development version exists. Do not mix AgentScope 1.x and 2.x APIs.","State the AgentScope version when providing installation commands or code examples. ReMe uses its own continuously updated /reme/latest/ documentation."]},"styling":{"latex":true},"navigation":{"global":{"anchors":[{"anchor":"Home Page","icon":"book-open-cover","href":"https://agentscope.io/"},{"anchor":"Blog","icon":"newspaper","href":"https://agentscope.io/blog/"}]},"languages":[{"language":"en","default":true,"href":"en/versions/2.0.12dev"},{"language":"zh","href":"zh/versions/2.0.12dev"}]}},"deployment":{"deploymentMetadataValue":{"subdomain":"agentscope-ai-786677c7","hasAudioNarration":false,"actualSubdomain":"agentscope-ai-786677c7","customDomains":["docs.agentscope.io"],"gitSource":{"type":"github","owner":"agentscope-ai","repo":"docs","deployBranch":"main","contentDirectory":"","isPrivate":true,"mountPath":"","label":""},"chroma":{"liveDeploymentHistoryId":"6acf927233db61125561fb77","collectionId":"7ac31d24-f1ab-45c3-85f4-86092cf1e1b6","schemaVersion":"v3","latestBuiltDeploymentHistoryId":"6acf927233db61125561fb77"},"entitlements":{},"buildId":"6ae020fa971f41769d3546e9","clientVersion":"0.0.3971","searchFilterCounts":[{"language":"en","tag":"AgentScope","count":519},{"language":"zh","tag":"AgentScope","count":487},{"language":"en","tag":"Building Blocks","count":326},{"language":"zh","tag":"核心模块","count":319},{"language":"en","tag":"Agent as Service","count":112},{"language":"zh","tag":"智能体即服务","count":112},{"language":"default","tag":"AgentScope","count":101},{"language":"default","tag":"API","count":101},{"language":"default","tag":"Agent as Service","count":72},{"language":"en","tag":"Channel","count":41},{"language":"zh","tag":"消息渠道","count":41},{"language":"en","tag":"Agent","count":40},{"language":"en","tag":"Tool","count":40},{"language":"zh","tag":"智能体","count":40},{"language":"zh","tag":"工具","count":40},{"language":"en","tag":"Get Started","count":38},{"language":"zh","tag":"快速开始","count":36},{"language":"en","tag":"Model","count":34},{"language":"zh","tag":"模型","count":34},{"language":"en","tag":"Context","count":32},{"language":"en","tag":"Permission System","count":32},{"language":"zh","tag":"上下文管理","count":32},{"language":"zh","tag":"权限系统","count":32},{"language":"default","tag":"Deploy \u0026 Serve","count":29},{"language":"default","tag":"knowledge_bases","count":16},{"language":"default","tag":"channels","count":14},{"language":"default","tag":"workspace","count":13},{"language":"default","tag":"sop","count":11},{"language":"default","tag":"hub","count":8},{"language":"default","tag":"sessions","count":8}]},"assistantConfig":{"enableAskAiButton":false,"enableStarterQuestions":false,"enableContextualStarterQuestions":false,"enableAskAiSearchBar":true},"basePath":"","hasChatPermissions":false,"hasWebMcpPermissions":false,"toggles":[{"name":"kill-isr","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-mintlify-slack","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-v7-file-tree","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"agent-integrations-settings","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-pr-grouping","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"custom-prefix","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"analytics-v7","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"user-flows-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"no-publish-flow","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-onboarding","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"llms-txt-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"pause-universal-search-reconcile","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving-live","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"stripTemperatureMiddleware","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"per-site-search-delta","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"support-platform-pylon-zendesk","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"snapshot-serving","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"instant-rollback","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications-server","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"granular-notifications","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-private-page-search","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automations-fable","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fixed-ai-action-pricing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"automation-resolve-merge-conflict","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"scoped-publishing","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"mintql","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"page-level-analytics","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-version-history-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-nav-generations","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-page-v2","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workspace-projects","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"assistant-v5","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"byok-sep-25","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"fork-pr-previews","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"revalidation-jwt","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"vite-origin","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"editor-agent-model-picker","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"billing-updated-9-15","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-sso-scim","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"hobby-abuse-scan","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"dashboard-inbox","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-signup","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false},{"name":"workos-enabled","enabled":true,"variant":{"name":"disabled","enabled":false,"feature_enabled":true},"impressionData":false}],"isAtlas":false,"googleFontsInlined":false},"customCss":[],"page":{"pagePath":"en/versions/2.0.11/deploy/hub/mcp-hub","slug":"/en/versions/2.0.11/deploy/hub/mcp-hub","pageMetadata":{"title":"MCP Hub","description":"Let users install MCP servers from a registry with their own credentials.","href":"/en/versions/2.0.11/deploy/hub/mcp-hub"},"description":{"compiledSource":"\"use strict\";\nconst {jsx: _jsx} = arguments[0];\nconst {useMDXComponents: _provideComponents} = arguments[0];\nfunction _createMdxContent(props) {\n const _components = {\n p: \"p\",\n ..._provideComponents(),\n ...props.components\n };\n return _jsx(_components.p, {\n children: \"Let users install MCP servers from a registry with their own credentials.\"\n });\n}\nfunction MDXContent(props = {}) {\n const {wrapper: MDXLayout} = {\n ..._provideComponents(),\n ...props.components\n };\n return MDXLayout ? _jsx(MDXLayout, {\n ...props,\n children: _jsx(_createMdxContent, {\n ...props\n })\n }) : _createMdxContent(props);\n}\nreturn {\n default: MDXContent\n};\n","frontmatter":{},"scope":{}},"pageType":"default","mdx":{"mdxSource":{"compiledSource":"\"use strict\";const{Fragment:_Fragment,jsx:_jsx,jsxs:_jsxs}=arguments[0];const{useMDXComponents:_provideComponents}=arguments[0];function _createMdxContent(props){const _components={a:`a`,code:`code`,em:`em`,p:`p`,pre:`pre`,span:`span`,strong:`strong`,tbody:`tbody`,td:`td`,th:`th`,thead:`thead`,tr:`tr`,..._provideComponents(),...props.components},{Card,CardGroup,CodeBlock,Frame,Heading,Note,OptimizedImage,Step,Steps,Table,Warning}=_components;if(!Card)_missingMdxReference(`Card`,true);if(!CardGroup)_missingMdxReference(`CardGroup`,true);if(!CodeBlock)_missingMdxReference(`CodeBlock`,true);if(!Frame)_missingMdxReference(`Frame`,true);if(!Heading)_missingMdxReference(`Heading`,true);if(!Note)_missingMdxReference(`Note`,true);if(!OptimizedImage)_missingMdxReference(`OptimizedImage`,true);if(!Step)_missingMdxReference(`Step`,true);if(!Steps)_missingMdxReference(`Steps`,true);if(!Table)_missingMdxReference(`Table`,true);if(!Warning)_missingMdxReference(`Warning`,true);return _jsxs(_Fragment,{children:[_jsxs(_components.p,{children:[`An MCP hub is a catalog of `,_jsx(_components.a,{href:`/en/versions/2.0.11/building-blocks/tool/mcp`,children:`MCP`}),` servers your users browse and install from inside the app. Register one and nobody has to hand-write an MCP configuration, or wait for a redeploy when the catalog grows.`]}),`\n`,_jsx(_components.p,{children:`Installing does not equip an agent. It adds the server to the user’s own pool of installed MCP servers, and equipping an agent is a separate step:`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Install into the pool`,children:_jsx(_components.p,{children:`The user picks a server, fills in whatever it asks for, and it joins their pool. Every hub feeds the same pool, so what came from which registry stops mattering once it is installed.`})}),_jsx(Step,{title:`Equip an agent's workspace`,children:_jsxs(_components.p,{children:[`In a chat, the user picks from the pool to add the server to that agent’s `,_jsx(_components.a,{href:`/en/versions/2.0.11/deploy/workspace-manager`,children:`workspace`}),`. Its tools reach the agent immediately.`]})})]}),`\n`,_jsx(_components.p,{children:`Splitting the two is what makes credentials a one-time cost. An API key is entered once at install time, and equipping that server in ten different workspaces never asks for it again. The pool belongs to the user, so it also outlives any single chat.`}),`\n`,_jsx(Heading,{level:`2`,id:`available-mcp-hubs`,children:`Available MCP Hubs`}),`\n`,_jsxs(_components.p,{children:[`AgentScope ships one MCP hub today, and any other catalog can be wrapped with a `,_jsx(_components.a,{href:`#custom-mcp-hub`,children:`custom hub`}),`:`]}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Class`}),_jsx(_components.th,{children:`Registry`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`GitHubMCPHub`})}),_jsx(_components.td,{children:_jsx(_components.a,{href:`https://github.com/mcp`,children:`GitHub MCP Registry`})}),_jsx(_components.td,{children:`GitHub’s public registry of MCP servers. Works anonymously; a token raises the rate limit.`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.em,{children:`Coming soon`})}),_jsx(_components.td,{children:`—`}),_jsx(_components.td,{children:`More registries are being built.`})]})]})]}),`\n`,_jsxs(_components.p,{children:[_jsx(_components.code,{children:`GitHubMCPHub`}),` works with no arguments, and every field below has a default:`]}),`\n`,_jsx(CodeBlock,{filename:`Configure GitHubMCPHub`,numberOfLines:`10`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`10`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` agentscope.app.hub `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` GitHubMCPHub`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`hub `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` GitHubMCPHub(`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Addresses this hub in the API and the frontend URL. Keep it stable.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` hub_id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"github\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Shown in the frontend's hub switcher.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` display_name`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"GitHub MCP Registry\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Optional token. Anonymous requests work, but are rate-limited.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` api_token`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Parameter`}),_jsx(_components.th,{children:`Default`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`hub_id`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`\"github\"`})}),_jsx(_components.td,{children:`The identifier addressing this hub in routes and URLs`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`display_name`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`\"GitHub MCP Registry\"`})}),_jsx(_components.td,{children:`The name shown in the hub switcher`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`description`})}),_jsx(_components.td,{children:`GitHub’s registry blurb`}),_jsx(_components.td,{children:`The one-line description under the name`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`icon_url`})}),_jsx(_components.td,{children:`GitHub’s avatar`}),_jsx(_components.td,{children:`The icon shown beside the name`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`base_url`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`\"https://api.mcp.github.com\"`})}),_jsx(_components.td,{children:`The registry endpoint`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`api_token`})}),_jsx(_components.td,{children:_jsx(_components.code,{children:`None`})}),_jsx(_components.td,{children:`A GitHub token, affecting rate limits only`})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:_jsx(_components.code,{children:`timeout`})}),_jsx(_components.td,{\"data-numeric\":`true`,children:_jsx(_components.code,{children:`30.0`})}),_jsx(_components.td,{children:`Per-request timeout in seconds`})]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`quickstart`,children:`Quickstart`}),`\n`,_jsxs(Steps,{children:[_jsx(Step,{title:`Start the Agent Service`,children:_jsxs(_components.p,{children:[`MCP hubs are a feature of `,_jsx(_components.a,{href:`/en/versions/2.0.11/deploy/agent-service`,children:`Agent Service`}),`, so you need a running service and a frontend to browse from. Follow the `,_jsx(_components.a,{href:`/en/versions/2.0.11/deploy/agent-service#try-the-bundled-example`,children:`Agent Service quickstart`}),` to boot the bundled `,_jsx(_components.a,{href:`https://github.com/agentscope-ai/agentscope/tree/main/examples/agent_service`,children:_jsx(_components.code,{children:`examples/agent_service`})}),` backend together with the `,_jsx(_components.a,{href:`https://github.com/agentscope-ai/agentscope/tree/main/examples/web_ui`,children:_jsx(_components.code,{children:`examples/web_ui`})}),` frontend.`]})}),_jsxs(Step,{title:`Register the hub`,children:[_jsxs(_components.p,{children:[`Pass your hubs to `,_jsx(_components.code,{children:`create_app`}),` through `,_jsx(_components.code,{children:`mcp_hubs`}),`. That one argument brings the routes, the store page, and the install flow with it:`]}),_jsx(CodeBlock,{filename:`Register an MCP hub`,numberOfLines:`7`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` agentscope.app `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` create_app`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` agentscope.app.hub `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` GitHubMCPHub`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`app `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` create_app(`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ...existing code...`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` mcp_hubs`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[GitHubMCPHub()],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})}),_jsxs(_components.p,{children:[`Register several to give users a choice of catalogs, each with its own `,_jsx(_components.code,{children:`hub_id`}),`:`]}),_jsx(CodeBlock,{filename:`Register several MCP hubs`,numberOfLines:`12`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`12`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`app `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` create_app(`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # ...existing code...`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` mcp_hubs`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` GitHubMCPHub(),`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # A second instance pointed at your own registry.`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` GitHubMCPHub(`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` hub_id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"internal\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` display_name`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Internal Registry\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` base_url`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://mcp.corp.example.com\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ),`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})}),_jsx(Note,{children:_jsxs(_components.p,{children:[`Registering two MCP hubs under the same `,_jsx(_components.code,{children:`hub_id`}),` fails at startup rather than silently shadowing one.`]})})]}),_jsxs(Step,{title:`Browse and install`,children:[_jsxs(_components.p,{children:[`Restart the service and open the `,_jsx(_components.strong,{children:`MCP`}),` page. The sidebar lists your registered hubs plus `,_jsx(_components.strong,{children:`Mine`}),`, the user’s own collection. Pick a hub, search, and open a card to see what the server does and what it needs.`]}),_jsx(Frame,{caption:`Browsing an MCP registry from the MCP page.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/mcp_hub.png?fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=c1b9d278018f6d73505bcb6a62b7c6e1`,alt:`Browsing an MCP registry`,\"data-og-width\":`2932`,width:`2932`,\"data-og-height\":`1730`,height:`1730`,\"data-path\":`images/agentscope/mcp_hub.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/mcp_hub.png?w=280\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=9d58335cd4ad591cd3c4052fdf47a671 280w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/mcp_hub.png?w=560\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=5e15a82f1ef4c8524809d45e46c0c7be 560w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/mcp_hub.png?w=840\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=71da060e3c077392a85154c8be1bcd6f 840w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/mcp_hub.png?w=1100\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=7e3c74f35ac10cfa0c24ce61691e5c2b 1100w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/mcp_hub.png?w=1650\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=c53b4d3474fee8bfdf1aef942e48cced 1650w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/mcp_hub.png?w=2500\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=2d05a642ee74b5c2168fdf40ef3648fd 2500w`})}),_jsxs(_components.p,{children:[_jsx(_components.strong,{children:`Install`}),` opens a form built from what the listing declares. On submit, the server is contacted straight away, so wrong credentials come back as an error on the form instead of a broken install. Everything installed shows up under `,_jsx(_components.strong,{children:`Installed MCPs`}),`:`]}),_jsx(Frame,{caption:`The MCP servers a user has installed.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/installed_mcp.png?fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=a960b36ebc65e5fe4e995021a86e4150`,alt:`Installed MCP servers`,\"data-og-width\":`2932`,width:`2932`,\"data-og-height\":`1730`,height:`1730`,\"data-path\":`images/agentscope/installed_mcp.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/installed_mcp.png?w=280\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=17c7e5f5987fbf5775b7cf01721ce970 280w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/installed_mcp.png?w=560\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=1e5797ada0ecd8b8d4ead6fcd6c391cb 560w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/installed_mcp.png?w=840\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=8fef7c7041ccaec271a8b9f5828c2ffd 840w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/installed_mcp.png?w=1100\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=dbae02b9561fd69b17c72de366a65045 1100w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/installed_mcp.png?w=1650\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=20acb63440a6927bc042e16b168aabd9 1650w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/installed_mcp.png?w=2500\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=044329a6f128964bb6ac76c5b6b9e1be 2500w`})})]}),_jsxs(Step,{title:`Equip an agent`,children:[_jsxs(_components.p,{children:[`Open a chat, expand the `,_jsx(_components.strong,{children:`MCP`}),` panel, choose `,_jsx(_components.strong,{children:`Add`}),`, and pick from `,_jsx(_components.strong,{children:`Installed MCPs`}),`. The server’s tools reach the agent immediately.`]}),_jsx(Frame,{caption:`Equipping an agent with installed MCP servers.`,children:_jsx(OptimizedImage,{src:`https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/assign_mcp.png?fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=75cc37a431341aa59351f82a391b7407`,alt:`Equipping an agent with an installed MCP server`,\"data-og-width\":`2932`,width:`2932`,\"data-og-height\":`1730`,height:`1730`,\"data-path\":`images/agentscope/assign_mcp.png`,\"data-optimize\":`true`,\"data-opv\":`3`,srcset:`https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/assign_mcp.png?w=280\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=10c826ee1895a4de7b447a9cbb36345b 280w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/assign_mcp.png?w=560\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=07ddfcc43c6b8bb55868921a33f2f86c 560w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/assign_mcp.png?w=840\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=deef8063582dfeffcc878746800fd94d 840w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/assign_mcp.png?w=1100\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=46650ee232781c083709c47f0bb8f694 1100w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/assign_mcp.png?w=1650\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=497d1170df451271b41025dbd2667c30 1650w, https://mintcdn.com/agentscope-ai-786677c7/TlC5p3qpf2MkjDvZ/images/agentscope/assign_mcp.png?w=2500\u0026fit=max\u0026auto=format\u0026n=TlC5p3qpf2MkjDvZ\u0026q=85\u0026s=3fbaa791e7f030b7e49e0908d37c11ce 2500w`})}),_jsxs(_components.p,{children:[`From `,_jsx(_components.strong,{children:`Installed MCPs`}),`, users rename an install, turn it off without losing its configuration, update a rotated key, or delete it. Deleting leaves chats that already use it untouched.`]})]})]}),`\n`,_jsx(Heading,{level:`2`,id:`custom-mcp-hub`,children:`Custom MCP Hub`}),`\n`,_jsxs(_components.p,{children:[`Any catalog becomes a hub by subclassing `,_jsx(_components.code,{children:`MCPHubBase`}),`: a public registry, your company’s approved list, or a fixed set of servers you want to offer. Two methods are required, one to browse and one to fetch a single listing:`]}),`\n`,_jsx(CodeBlock,{filename:`A hub over an internal catalog`,numberOfLines:`33`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`33`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`from`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` agentscope.app.hub `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`import`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` MCPCard, MCPHubBase, MCPHubPage`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` InternalMCPHub`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`MCPHubBase`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"\"The MCP servers approved for use inside our company.\"\"\"`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` __init__`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` super`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`().`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:`__init__`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` hub_id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"internal\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` display_name`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Internal Registry\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` description`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"MCP servers approved by the platform team.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` list_mcps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` user_id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" # The keyword the user typed, or `None` to browse everything.\"})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` q`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" # The opaque cursor from the previous page, or `None` to start.\"})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` cursor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` limit`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`int`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 20`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ) -> MCPHubPage:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"\"Return one page of listings.\"\"\"`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` page `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` fetch_our_catalog(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`query`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`q, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`after`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`cursor, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`limit`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`limit)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` MCPHubPage(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` cards`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`._to_card(c) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` c `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` page.items],`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:\" # `None` tells the frontend there is nothing more to load.\"})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` next_cursor`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`page.next_cursor,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` get_mcp`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`user_id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`card_id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> MCPCard:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:' \"\"\"Return one listing, or raise `KeyError` if there is no such card.\"\"\"'})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`._to_card(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` fetch_one(card_id))`})]}),`\n`]})})}),`\n`,_jsx(_components.p,{children:`Two more things shape how a hub behaves:`}),`\n`,_jsxs(Table,{children:[_jsx(_components.thead,{children:_jsxs(_components.tr,{children:[_jsx(_components.th,{children:`Point`}),_jsx(_components.th,{children:`Description`})]})}),_jsxs(_components.tbody,{children:[_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Cursor pagination`}),_jsxs(_components.td,{children:[`Return whatever opaque string lets you resume, and `,_jsx(_components.code,{children:`None`}),` when the catalog is exhausted. The frontend loads more as the user scrolls`]})]}),_jsxs(_components.tr,{children:[_jsx(_components.td,{children:`Missing cards`}),_jsxs(_components.td,{children:[`Raise `,_jsx(_components.code,{children:`KeyError`}),` from `,_jsx(_components.code,{children:`get_mcp`}),` for an unknown id, and the service answers 404`]})]})]})]}),`\n`,_jsx(Heading,{level:`3`,id:`control-visibility-per-user`,children:`Control Visibility Per User`}),`\n`,_jsxs(_components.p,{children:[`Both methods receive `,_jsx(_components.code,{children:`user_id`}),` as their first argument, so a catalog does not have to look the same to everybody. Filter on it to run a per-team allowlist, gate paid listings on entitlements from your billing system, or keep an unreleased server visible only to its authors:`]}),`\n`,_jsx(CodeBlock,{filename:`A catalog that differs per user`,numberOfLines:`24`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`24`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` InternalMCPHub`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`MCPHubBase`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` list_mcps`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` user_id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` q`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` cursor`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` |`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:` limit`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`int`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:` =`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:` 20`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ) -> MCPHubPage:`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"\"Return only the listings this user is allowed to see.\"\"\"`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Whatever your own system says this user may install.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` allowed `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` our_entitlements(user_id)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` page `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` fetch_our_catalog(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`query`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`q, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`after`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`cursor, `}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`limit`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`limit)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` MCPHubPage(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` cards`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`[`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`._to_card(c) `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`for`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` c `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` page.items `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` c.id `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`in`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` allowed`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ],`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` next_cursor`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`page.next_cursor,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` )`})}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#8250DF`,\"--shiki-dark\":`#DCDCAA`},children:` get_mcp`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`user_id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`card_id`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`str`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> MCPCard:`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"\"\"Refuse a hidden card, so guessing an id gains nothing.\"\"\"`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` if`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` card_id `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`not`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` in`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` our_entitlements(user_id):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` raise`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:` KeyError`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(card_id)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`._to_card(`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:`await`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` fetch_one(card_id))`})]}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Apply the same filter in `,_jsx(_components.code,{children:`get_mcp`}),` that you apply in `,_jsx(_components.code,{children:`list_mcps`}),`. Hiding a card from the listing alone is not access control: `,_jsx(_components.code,{children:`get_mcp`}),` is reachable with any id the caller cares to guess.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`declare-required-inputs`,children:`Declare Required Inputs`}),`\n`,_jsxs(_components.p,{children:[`A card is a template rather than a ready connection. Write the parts the user supplies as `,_jsx(_components.code,{children:\"${placeholder}\"}),`, then describe them with a standard `,_jsx(_components.a,{href:`https://json-schema.org/`,children:`JSON Schema`}),` so the frontend can render the form:`]}),`\n`,_jsx(CodeBlock,{filename:`A card that asks for an API key`,numberOfLines:`26`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`26`,children:[_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`MCPCard(`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` hub_id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`.hub_id,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` id`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"weather\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` name`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"weather\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` display_name`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Weather\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` description`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Current conditions and forecasts.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` config_template`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`HttpMCPConfig(`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` url`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"https://weather.example.com/mcp\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Placeholders work in any string: URLs, headers, env vars, args.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` headers`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Authorization\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Bearer $`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`{api_key}`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`},`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` ),`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:` inputs_schema`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`{`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"object\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"required\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: [`}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"api_key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`],`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"properties\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"api_key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: {`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"type\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"string\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"title\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"API key\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"description\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"Found under Settings, API in your account.\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#6E7781`,\"--shiki-dark\":`#6A9955`},children:` # Renders as a masked field, and is never echoed back.`})}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"writeOnly\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`True`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:` \"format\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"password\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`,`})]}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` },`})}),`\n`,_jsx(_components.span,{className:`line`,children:_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})}),`\n`]})})}),`\n`,_jsx(Warning,{children:_jsxs(_components.p,{children:[`Mark every credential field with `,_jsx(_components.code,{children:`\"writeOnly\": true`}),` and `,_jsx(_components.code,{children:`\"format\": \"password\"`}),`. That is what tells the frontend to mask the value and to leave the field blank when the user edits the install later.`]})}),`\n`,_jsx(Heading,{level:`3`,id:`reuse-one-http-client`,children:`Reuse One HTTP Client`}),`\n`,_jsx(_components.p,{children:`A hub lives for the whole lifetime of the service, so it can hold a connection pool instead of opening one per request. Implement the async context manager methods and the service enters every hub on startup, closing them on shutdown:`}),`\n`,_jsx(CodeBlock,{filename:`Open and close a shared client`,numberOfLines:`7`,language:`python`,children:_jsx(_components.pre,{className:`shiki shiki-themes github-light-default dark-plus`,style:{backgroundColor:`#ffffff`,\"--shiki-dark-bg\":`#0B0C0E`,color:`#1f2328`,\"--shiki-dark\":`#D4D4D4`},language:`python`,children:_jsxs(_components.code,{language:`python`,numberOfLines:`7`,children:[_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:`class`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#4EC9B0`},children:` InternalMCPHub`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`MCPHubBase`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`):`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` __aenter__`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> `}),_jsx(_components.span,{style:{color:`#0A3069`,\"--shiki-dark\":`#CE9178`},children:`\"InternalMCPHub\"`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`._client `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:` httpx.AsyncClient(`}),_jsx(_components.span,{style:{color:`#953800`,\"--shiki-dark\":`#9CDCFE`},children:`timeout`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`=`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#B5CEA8`},children:`30.0`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`)`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` return`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`})]}),`\n`,_jsx(_components.span,{className:`line`}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` async`}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#569CD6`},children:` def`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#DCDCAA`},children:` __aexit__`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`(`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`, `}),_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#D4D4D4`},children:`*`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#9CDCFE`},children:`exc`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`: `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#4EC9B0`},children:`object`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`) -> `}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:`None`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`:`})]}),`\n`,_jsxs(_components.span,{className:`line`,children:[_jsx(_components.span,{style:{color:`#CF222E`,\"--shiki-dark\":`#C586C0`},children:` await`}),_jsx(_components.span,{style:{color:`#0550AE`,\"--shiki-dark\":`#569CD6`},children:` self`}),_jsx(_components.span,{style:{color:`#1F2328`,\"--shiki-dark\":`#D4D4D4`},children:`._client.aclose()`})]}),`\n`]})})}),`\n`,_jsx(Heading,{level:`2`,id:`further-reading`,children:`Further Reading`}),`\n`,_jsxs(CardGroup,{cols:2,children:[_jsx(Card,{title:`Skill Hub`,icon:`book-open`,href:`/en/versions/2.0.11/deploy/hub/skill-hub`,cta:`Read more`,arrow:true,children:_jsx(_components.p,{children:`The same idea for skills.`})}),_jsx(Card,{title:`MCP`,icon:`plug`,href:`/en/versions/2.0.11/building-blocks/tool/mcp`,cta:`Read more`,arrow:true,children:_jsx(_components.p,{children:`How the agent calls an MCP server’s tools.`})})]})]})}function MDXContent(props={}){const{wrapper:MDXLayout}={..._provideComponents(),...props.components};return MDXLayout?_jsx(MDXLayout,{...props,children:_jsx(_createMdxContent,{...props})}):_createMdxContent(props)}return{default:MDXContent};function _missingMdxReference(id,component){throw new Error(`Expected `+(component?`component`:`object`)+\" `\"+id+\"` to be defined: you likely forgot to import, pass, or provide it.\")}","frontmatter":{},"scope":{"config":{},"pageMetadata":{"title":"MCP Hub","description":"Let users install MCP servers from a registry with their own credentials.","href":"/en/versions/2.0.11/deploy/hub/mcp-hub"}}},"mdxSourceWithNoJs":null},"mdxExtracts":{"tableOfContents":[{"title":"Available MCP Hubs","slug":"available-mcp-hubs","depth":2,"children":[]},{"title":"Quickstart","slug":"quickstart","depth":2,"children":[]},{"title":"Custom MCP Hub","slug":"custom-mcp-hub","depth":2,"children":[{"title":"Control Visibility Per User","slug":"control-visibility-per-user","depth":3,"children":[]},{"title":"Declare Required Inputs","slug":"declare-required-inputs","depth":3,"children":[]},{"title":"Reuse One HTTP Client","slug":"reuse-one-http-client","depth":3,"children":[]}]},{"title":"Further Reading","slug":"further-reading","depth":2,"children":[]}],"codeExamples":{}},"jsLinks":[],"subdomain":"agentscope-ai-786677c7","siteName":"AgentScope","title":"MCP Hub - AgentScope","navMaps":{"firstHrefInVersion":{"2.0.12dev":{"href":"/en/versions/2.0.12dev/deploy/hub/mcp-hub","matchLevel":1},"2.0.11":{"href":"/en/versions/2.0.11/deploy/hub/mcp-hub","matchLevel":0},"2.0.10":{"href":"/en/versions/2.0.10/deploy/hub/mcp-hub","matchLevel":1},"2.0.9":{"href":"/en/versions/2.0.9/deploy/hub/mcp-hub","matchLevel":1},"2.0.8":{"href":"/en/versions/2.0.8/deploy/hub/mcp-hub","matchLevel":1},"2.0.7":{"href":"/en/versions/2.0.7/deploy/hub/mcp-hub","matchLevel":1},"2.0.6":{"href":"/en/versions/2.0.6/deploy/hub/mcp-hub","matchLevel":1},"2.0.5":{"href":"/en/versions/2.0.5/deploy/agent-service","matchLevel":2},"2.0.4":{"href":"/en/versions/2.0.4/deploy/agent-service","matchLevel":2},"2.0.3":{"href":"/en/versions/2.0.3/deploy/agent-service","matchLevel":2},"2.0.2":{"href":"/en/versions/2.0.2","matchLevel":3},"1.0.21":{"href":"/en/versions/1.0.21","matchLevel":3},"latest":{"href":"/en/reme/latest/overview","matchLevel":4}},"firstHrefInLanguage":{"en":{"href":"/en/versions/2.0.11/deploy/hub/mcp-hub","matchLevel":0},"zh":{"href":"/zh/versions/2.0.11/deploy/hub/mcp-hub","matchLevel":1}}},"lastModified":"2026-10-27T03:57:37.475Z","originalFileLocation":"en/versions/2.0.11/deploy/hub/mcp-hub.mdx","locale":"en"},"headHtml":"\u003cscript data-mint-head>(function(){var d=document.documentElement,p=null;if(!p){try{p=localStorage.getItem(\"isDarkMode\")}catch(e){}if(p==='true')p='dark';else if(p==='false')p='light';if(p!=='light'\u0026\u0026p!=='dark'\u0026\u0026p!=='system')p=\"system\"}var r=p==='system'?(matchMedia(\"(prefers-color-scheme: dark)\").matches?'dark':'light'):p;d.classList.remove(r==='dark'?'light':'dark');d.classList.add(r);d.setAttribute(\"data-theme-preference\",p)})();\u003c/script>\u003cmeta data-mint-head name=\"description\" content=\"Let users install MCP servers from a registry with their own credentials.\">\u003cmeta data-mint-head name=\"application-name\" content=\"AgentScope\">\u003cmeta data-mint-head name=\"generator\" content=\"Mintlify\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/agentscope-ai-786677c7/1CzZcOuOvJAMkPRv/_generated/favicon/android-chrome-192x192.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"apple-touch-icon\" type=\"image/png\" sizes=\"180x180\" href=\"/mintlify-assets/_mintlify/favicons/agentscope-ai-786677c7/1CzZcOuOvJAMkPRv/_generated/favicon/apple-touch-icon.png\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/agentscope-ai-786677c7/1CzZcOuOvJAMkPRv/_generated/favicon/favicon-16x16.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/agentscope-ai-786677c7/1CzZcOuOvJAMkPRv/_generated/favicon/favicon-32x32.png\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/agentscope-ai-786677c7/1CzZcOuOvJAMkPRv/_generated/favicon/favicon.ico\" media=\"(prefers-color-scheme: light)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"192x192\" href=\"/mintlify-assets/_mintlify/favicons/agentscope-ai-786677c7/1CzZcOuOvJAMkPRv/_generated/favicon-dark/android-chrome-192x192.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"16x16\" href=\"/mintlify-assets/_mintlify/favicons/agentscope-ai-786677c7/1CzZcOuOvJAMkPRv/_generated/favicon-dark/favicon-16x16.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"icon\" type=\"image/png\" sizes=\"32x32\" href=\"/mintlify-assets/_mintlify/favicons/agentscope-ai-786677c7/1CzZcOuOvJAMkPRv/_generated/favicon-dark/favicon-32x32.png\" media=\"(prefers-color-scheme: dark)\">\u003clink data-mint-head rel=\"shortcut icon\" type=\"image/x-icon\" href=\"/mintlify-assets/_mintlify/favicons/agentscope-ai-786677c7/1CzZcOuOvJAMkPRv/_generated/favicon-dark/favicon.ico\" media=\"(prefers-color-scheme: dark)\">\u003cmeta data-mint-head property=\"og:title\" content=\"MCP Hub - AgentScope\">\u003cmeta data-mint-head property=\"og:description\" content=\"Let users install MCP servers from a registry with their own credentials.\">\u003cmeta data-mint-head property=\"og:site_name\" content=\"AgentScope\">\u003cmeta data-mint-head property=\"og:url\" content=\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub\">\u003cmeta data-mint-head property=\"og:type\" content=\"website\">\u003cmeta data-mint-head property=\"og:image\" content=\"https://agentscope-ai-786677c7.mintlify.app/_mintlify/api/og/v2?division=MCP+%26+Skill+Hub\u0026amp;title=MCP+Hub\u0026amp;description=Let+users+install+MCP+servers+from+a+registry+with+their+own+credentials.\u0026amp;theme=010675907e6e5009270e69a1\u0026amp;signature=c952c0803c899dc1f20f76a82fbe032811c811a24a9e476ebfa011337b1adab5\">\u003cmeta data-mint-head property=\"og:image:width\" content=\"1200\">\u003cmeta data-mint-head property=\"og:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"twitter:card\" content=\"summary_large_image\">\u003cmeta data-mint-head name=\"twitter:title\" content=\"MCP Hub - AgentScope\">\u003cmeta data-mint-head name=\"twitter:description\" content=\"Let users install MCP servers from a registry with their own credentials.\">\u003cmeta data-mint-head name=\"twitter:image\" content=\"https://agentscope-ai-786677c7.mintlify.app/_mintlify/api/og/v2?division=MCP+%26+Skill+Hub\u0026amp;title=MCP+Hub\u0026amp;description=Let+users+install+MCP+servers+from+a+registry+with+their+own+credentials.\u0026amp;theme=010675907e6e5009270e69a1\u0026amp;signature=c952c0803c899dc1f20f76a82fbe032811c811a24a9e476ebfa011337b1adab5\">\u003cmeta data-mint-head name=\"twitter:image:width\" content=\"1200\">\u003cmeta data-mint-head name=\"twitter:image:height\" content=\"630\">\u003cmeta data-mint-head name=\"msapplication-config\" content=\"/mintlify-assets/_mintlify/favicons/agentscope-ai-786677c7/1CzZcOuOvJAMkPRv/_generated/favicon/browserconfig.xml\">\u003cmeta data-mint-head name=\"apple-mobile-web-app-title\" content=\"AgentScope\">\u003cmeta data-mint-head name=\"msapplication-TileColor\" content=\"#0064FD\">\u003clink data-mint-head rel=\"canonical\" href=\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub\">\u003clink data-mint-head rel=\"alternate\" type=\"application/xml\" href=\"/sitemap.xml\">\u003clink data-mint-head rel=\"alternate\" type=\"text/markdown\" href=\"/en/versions/2.0.11/deploy/hub/mcp-hub.md\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"en\" href=\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"zh\" href=\"https://docs.agentscope.io/zh/versions/2.0.11/deploy/hub/mcp-hub\">\u003clink data-mint-head rel=\"alternate\" hreflang=\"x-default\" href=\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub\">\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@graph\":[{\"@type\":\"Organization\",\"@id\":\"https://docs.agentscope.io/#organization\",\"name\":\"AgentScope\",\"url\":\"https://docs.agentscope.io\",\"logo\":{\"@type\":\"ImageObject\",\"url\":\"https://mintcdn.com/agentscope-ai-786677c7/ypv6xWD33tVApmTg/logo/agentscope.svg?fit=max\u0026auto=format\u0026n=ypv6xWD33tVApmTg\u0026q=85\u0026s=1c9a848ffa88ffa648f07542fe23e3e7\"}},{\"@type\":\"WebSite\",\"@id\":\"https://docs.agentscope.io#website\",\"name\":\"AgentScope\",\"url\":\"https://docs.agentscope.io\",\"publisher\":{\"@id\":\"https://docs.agentscope.io/#organization\"}},{\"@type\":\"WebPage\",\"@id\":\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub#webpage\",\"url\":\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub\",\"name\":\"MCP Hub\",\"description\":\"Let users install MCP servers from a registry with their own credentials.\",\"dateModified\":\"2026-10-27T03:57:37.475Z\",\"isPartOf\":{\"@id\":\"https://docs.agentscope.io#website\"},\"breadcrumb\":{\"@id\":\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub#breadcrumb\"}},{\"@type\":\"BreadcrumbList\",\"@id\":\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Agent as Service\",\"item\":\"https://docs.agentscope.io/en/versions/2.0.11/deploy/agent-service\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"MCP \u0026 Skill Hub\",\"item\":\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/overview\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"MCP Hub\",\"item\":\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub\"}]},{\"@type\":[\"Article\",\"TechArticle\"],\"@id\":\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub#article\",\"headline\":\"MCP Hub\",\"name\":\"MCP Hub\",\"description\":\"Let users install MCP servers from a registry with their own credentials.\",\"url\":\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub\",\"mainEntityOfPage\":{\"@id\":\"https://docs.agentscope.io/en/versions/2.0.11/deploy/hub/mcp-hub#webpage\"},\"dateModified\":\"2026-10-27T03:57:37.475Z\",\"publisher\":{\"@id\":\"https://docs.agentscope.io/#organization\"},\"isPartOf\":{\"@id\":\"https://docs.agentscope.io#website\"}}]}\u003c/script>\u003cscript data-mint-head type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"WebSite\",\"name\":\"AgentScope\",\"creator\":{\"@type\":\"Organization\",\"name\":\"Mintlify\",\"url\":\"https://mintlify.com\"}}\u003c/script>","siteName":"AgentScope","nav":{"global":{"anchors":[{"anchor":"Home Page","icon":"book-open-cover","href":"https://agentscope.io/"},{"anchor":"Blog","icon":"newspaper","href":"https://agentscope.io/blog/"}]},"languages":[{"language":"en","default":true,"tabs":[{"tab":"AgentScope","versions":[{"version":"2.0.12dev","tag":"Development","pages":[{"title":"2.0.12dev","href":"/en/versions/2.0.12dev/deploy/hub/mcp-hub"}]},{"version":"2.0.11","default":true,"groups":[{"group":"Get Started","pages":[{"title":"What's AgentScope 2.0?","href":"/en/versions/2.0.11"},{"title":"Quickstart","href":"/en/versions/2.0.11/quickstart"},{"title":"Release Notes","href":"/en/versions/2.0.11/release-notes"}]},{"group":"Building Blocks","pages":[{"title":"Message \u0026 Event","href":"/en/versions/2.0.11/building-blocks/message-and-event"},{"group":"Agent","pages":[{"title":"Overview","href":"/en/versions/2.0.11/building-blocks/agent/overview"},{"title":"Configure Agent","href":"/en/versions/2.0.11/building-blocks/agent/configure-agent"},{"title":"Run Agent","href":"/en/versions/2.0.11/building-blocks/agent/run-agent"},{"title":"Interrupt Agent","href":"/en/versions/2.0.11/building-blocks/agent/interrupt-agent"},{"title":"Human-in-the-Loop","href":"/en/versions/2.0.11/building-blocks/agent/human-in-the-loop"}]},{"group":"Model","pages":[{"title":"Overview","href":"/en/versions/2.0.11/building-blocks/model/overview"},{"title":"LLM","href":"/en/versions/2.0.11/building-blocks/model/llm"},{"title":"TTS","href":"/en/versions/2.0.11/building-blocks/model/tts"},{"title":"ASR","href":"/en/versions/2.0.11/building-blocks/model/asr"},{"title":"Embedding","href":"/en/versions/2.0.11/building-blocks/model/embedding"}]},{"group":"Context","pages":[{"title":"Overview","href":"/en/versions/2.0.11/building-blocks/context/overview"},{"title":"Environment Awareness","href":"/en/versions/2.0.11/building-blocks/context/environment-awareness"},{"title":"Compress Context","href":"/en/versions/2.0.11/building-blocks/context/compress-context"},{"title":"Offload Context","href":"/en/versions/2.0.11/building-blocks/context/offload-context"}]},{"group":"Tool","pages":[{"title":"Overview","href":"/en/versions/2.0.11/building-blocks/tool/overview"},{"title":"Python Tool","href":"/en/versions/2.0.11/building-blocks/tool/python-tool"},{"title":"MCP","href":"/en/versions/2.0.11/building-blocks/tool/mcp"},{"title":"Skill","href":"/en/versions/2.0.11/building-blocks/tool/skill"},{"title":"Meta Tool","href":"/en/versions/2.0.11/building-blocks/tool/manage-tools"}]},{"title":"Plan","href":"/en/versions/2.0.11/building-blocks/plan"},{"group":"Pipeline","tag":"EXP","pages":[{"title":"Overview","href":"/en/versions/2.0.11/building-blocks/pipeline/overview"},{"title":"Goal Pipeline","href":"/en/versions/2.0.11/building-blocks/pipeline/goal"},{"title":"Team Pipeline","href":"/en/versions/2.0.11/building-blocks/pipeline/team"}]},{"title":"Standard Operating Procedure","tag":"EXP","href":"/en/versions/2.0.11/building-blocks/sop"},{"group":"Permission System","pages":[{"title":"Overview","href":"/en/versions/2.0.11/building-blocks/permission-system/overview"},{"title":"Permission Mode","href":"/en/versions/2.0.11/building-blocks/permission-system/permission-mode"},{"title":"Permission Rule","href":"/en/versions/2.0.11/building-blocks/permission-system/permission-rule"},{"title":"Tool-Level Checks","href":"/en/versions/2.0.11/building-blocks/permission-system/tool-check"}]},{"title":"Middleware","href":"/en/versions/2.0.11/building-blocks/middleware"},{"title":"RAG","href":"/en/versions/2.0.11/building-blocks/rag"},{"title":"Long-Term Memory","href":"/en/versions/2.0.11/building-blocks/long-term-memory"},{"group":"Workspace","pages":[{"title":"Overview","href":"/en/versions/2.0.11/building-blocks/workspace/overview"},{"title":"Run Workspace","href":"/en/versions/2.0.11/building-blocks/workspace/run-workspace"},{"title":"Manage Resources","href":"/en/versions/2.0.11/building-blocks/workspace/manage-resources"},{"title":"MCP Gateway","href":"/en/versions/2.0.11/building-blocks/workspace/mcp-gateway"}]},{"group":"Realtime Agent","tag":"EXP","pages":[{"title":"Overview","href":"/en/versions/2.0.11/building-blocks/realtime/overview"},{"title":"Speech-to-Speech","href":"/en/versions/2.0.11/building-blocks/realtime/speech-to-speech"}]},{"title":"Console","href":"/en/versions/2.0.11/building-blocks/console"},{"title":"A2A Protocol","href":"/en/versions/2.0.11/building-blocks/a2a"}]},{"group":"Agent as Service","pages":[{"title":"Architecture","href":"/en/versions/2.0.11/deploy/agent-service"},{"title":"Agent Team","href":"/en/versions/2.0.11/deploy/agent-team"},{"title":"SOP Service","tag":"EXP","href":"/en/versions/2.0.11/deploy/sop"},{"title":"Resource Sharing","tag":"NEW","href":"/en/versions/2.0.11/deploy/sharing"},{"title":"RAG Service","href":"/en/versions/2.0.11/deploy/rag"},{"title":"Workspace Manager","href":"/en/versions/2.0.11/deploy/workspace-manager"},{"group":"MCP \u0026 Skill Hub","pages":[{"title":"Overview","description":"Plug sources of MCP servers and skills into your service.","href":"/en/versions/2.0.11/deploy/hub/overview"},{"title":"MCP Hub","href":"/en/versions/2.0.11/deploy/hub/mcp-hub"},{"title":"Skill Hub","description":"Let users install skills published by others and equip their agents with them.","href":"/en/versions/2.0.11/deploy/hub/skill-hub"}]},{"group":"Channel","pages":[{"title":"Overview","href":"/en/versions/2.0.11/deploy/channel/overview"},{"title":"Message Routing","href":"/en/versions/2.0.11/deploy/channel/routing"},{"title":"Feishu","href":"/en/versions/2.0.11/deploy/channel/feishu"},{"title":"DingTalk","href":"/en/versions/2.0.11/deploy/channel/dingtalk"},{"title":"Discord","href":"/en/versions/2.0.11/deploy/channel/discord"},{"title":"Custom Channel","href":"/en/versions/2.0.11/deploy/channel/custom"}]},{"group":"API","pages":[{"group":"agent","pages":[{"title":"[Deprecated] Legacy sectioned schema — use /schema/v2","deprecated":true,"version":null,"openapi":"/en/versions/2.0.4/deploy/openapi.json get /agent/schema","href":"/api-reference/agent/[deprecated]-legacy-sectioned-schema-—-use-schemav2"},{"title":"Full AgentData JSON Schema for the agent form","deprecated":null,"version":null,"openapi":"/en/versions/2.0.4/deploy/openapi.json get /agent/schema/v2","href":"/api-reference/agent/full-agentdata-json-schema-for-the-agent-form"},{"title":"List all agents","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /agent/","href":"/api-reference/agent/list-all-agents"},{"title":"Create a new agent","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json post /agent/","href":"/api-reference/agent/create-a-new-agent"},{"title":"Delete an agent","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json delete /agent/{agent_id}","href":"/api-reference/agent/delete-an-agent"},{"title":"Update an agent","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json patch /agent/{agent_id}","href":"/api-reference/agent/update-an-agent"}]},{"group":"chat","pages":[{"title":"Trigger a chat run (fire-and-forget)","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json post /chat/","href":"/api-reference/chat/trigger-a-chat-run-fire-and-forget"}]},{"group":"credential","pages":[{"title":"List JSON schemas for all credential types","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /credential/schemas","href":"/api-reference/credential/list-json-schemas-for-all-credential-types"},{"title":"List all credentials","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /credential/","href":"/api-reference/credential/list-all-credentials"},{"title":"Create a new credential","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json post /credential/","href":"/api-reference/credential/create-a-new-credential"},{"title":"Delete a credential","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json delete /credential/{credential_id}","href":"/api-reference/credential/delete-a-credential"},{"title":"Update a credential","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json patch /credential/{credential_id}","href":"/api-reference/credential/update-a-credential"}]},{"group":"health","pages":[{"title":"Report service liveness and per-component readiness","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /health","href":"/api-reference/health/report-service-liveness-and-per-component-readiness"}]},{"group":"hub","pages":[{"title":"List Mcp Hubs","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /hub/mcp","href":"/api-reference/hub/list-mcp-hubs"},{"title":"List Mcp Cards","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /hub/mcp/{hub_id}/cards","href":"/api-reference/hub/list-mcp-cards"},{"title":"Get Mcp Card","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /hub/mcp/{hub_id}/cards/{card_id}","href":"/api-reference/hub/get-mcp-card"},{"title":"Install Mcp","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json post /hub/mcp/{hub_id}/cards/{card_id}/install","href":"/api-reference/hub/install-mcp"},{"title":"List Skill Hubs","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /hub/skill","href":"/api-reference/hub/list-skill-hubs"},{"title":"List Skill Cards","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /hub/skill/{hub_id}/cards","href":"/api-reference/hub/list-skill-cards"},{"title":"Install Skill","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json post /hub/skill/{hub_id}/cards/{card_id}/install","href":"/api-reference/hub/install-skill"},{"title":"Get Skill Card","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /hub/skill/{hub_id}/cards/{card_id}","href":"/api-reference/hub/get-skill-card"}]},{"group":"knowledge_bases","pages":[{"title":"List embedding models compatible with the KB dimension policy","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json get /knowledge_bases/embedding_models","href":"/api-reference/knowledge_bases/list-embedding-models-compatible-with-the-kb-dimension-policy"},{"title":"List available chunker types and their parameter schemas","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json get /knowledge_bases/chunkers","href":"/api-reference/knowledge_bases/list-available-chunker-types-and-their-parameter-schemas"},{"title":"JSON Schema for the KB middleware's tunable parameters","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json get /knowledge_bases/middleware/parameters_schema","href":"/api-reference/knowledge_bases/json-schema-for-the-kb-middlewares-tunable-parameters"},{"title":"List file types the configured parsers can ingest","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json get /knowledge_bases/supported_content_types","href":"/api-reference/knowledge_bases/list-file-types-the-configured-parsers-can-ingest"},{"title":"List the caller's knowledge bases","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json get /knowledge_bases/","href":"/api-reference/knowledge_bases/list-the-callers-knowledge-bases"},{"title":"Create a new knowledge base","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json post /knowledge_bases/","href":"/api-reference/knowledge_bases/create-a-new-knowledge-base"},{"title":"Delete a knowledge base","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json delete /knowledge_bases/{knowledge_base_id}","href":"/api-reference/knowledge_bases/delete-a-knowledge-base"},{"title":"Update mutable fields on a knowledge base","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json patch /knowledge_bases/{knowledge_base_id}","href":"/api-reference/knowledge_bases/update-mutable-fields-on-a-knowledge-base"},{"title":"List documents registered in a knowledge base","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json get /knowledge_bases/{knowledge_base_id}/documents","href":"/api-reference/knowledge_bases/list-documents-registered-in-a-knowledge-base"},{"title":"Upload a document into a knowledge base","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json post /knowledge_bases/{knowledge_base_id}/documents","href":"/api-reference/knowledge_bases/upload-a-document-into-a-knowledge-base"},{"title":"Batch-query indexing status of one or more documents","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json get /knowledge_bases/{knowledge_base_id}/documents/status","href":"/api-reference/knowledge_bases/batch-query-indexing-status-of-one-or-more-documents"},{"title":"Fetch the original uploaded file of a document","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json get /knowledge_bases/{knowledge_base_id}/documents/{document_id}","href":"/api-reference/knowledge_bases/fetch-the-original-uploaded-file-of-a-document"},{"title":"Delete a document from a knowledge base","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json delete /knowledge_bases/{knowledge_base_id}/documents/{document_id}","href":"/api-reference/knowledge_bases/delete-a-document-from-a-knowledge-base"},{"title":"Search a knowledge base by natural-language query","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json post /knowledge_bases/{knowledge_base_id}/search","href":"/api-reference/knowledge_bases/search-a-knowledge-base-by-natural-language-query"},{"title":"Browse one document's chunks in order","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json get /knowledge_bases/{knowledge_base_id}/documents/{document_id}/chunks","href":"/api-reference/knowledge_bases/browse-one-documents-chunks-in-order"},{"title":"Mint a short-lived token for a browser-native fetch","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json post /knowledge_bases/{knowledge_base_id}/documents/{document_id}/download_token","href":"/api-reference/knowledge_bases/mint-a-short-lived-token-for-a-browser-native-fetch"}]},{"group":"mcp","pages":[{"title":"List Mcps","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /mcp","href":"/api-reference/mcp/list-mcps"},{"title":"Delete Mcp","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json delete /mcp/{mcp_id}","href":"/api-reference/mcp/delete-mcp"},{"title":"Update Mcp","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json patch /mcp/{mcp_id}","href":"/api-reference/mcp/update-mcp"}]},{"group":"schedule","pages":[{"title":"List all schedules","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /schedule/","href":"/api-reference/schedule/list-all-schedules"},{"title":"Create a new schedule","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json post /schedule/","href":"/api-reference/schedule/create-a-new-schedule"},{"title":"Delete a schedule","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json delete /schedule/{schedule_id}","href":"/api-reference/schedule/delete-a-schedule"},{"title":"Update a schedule","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json patch /schedule/{schedule_id}","href":"/api-reference/schedule/update-a-schedule"},{"title":"List execution sessions for a schedule","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /schedule/{schedule_id}/sessions","href":"/api-reference/schedule/list-execution-sessions-for-a-schedule"}]},{"group":"sessions","pages":[{"title":"List sessions for an agent","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /sessions/","href":"/api-reference/sessions/list-sessions-for-an-agent"},{"title":"Create a new session","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json post /sessions/","href":"/api-reference/sessions/create-a-new-session"},{"title":"Delete a session","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json delete /sessions/{session_id}","href":"/api-reference/sessions/delete-a-session"},{"title":"Update a session","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json patch /sessions/{session_id}","href":"/api-reference/sessions/update-a-session"},{"title":"Interrupt a running or HITL-parked chat run for a session","deprecated":null,"version":null,"openapi":"/en/versions/2.0.4/deploy/openapi.json post /sessions/{session_id}/interrupt","href":"/api-reference/sessions/interrupt-a-running-or-hitl-parked-chat-run-for-a-session"},{"title":"List messages for a session","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /sessions/{session_id}/messages","href":"/api-reference/sessions/list-messages-for-a-session"},{"title":"Probe the session's high-level status","deprecated":null,"version":null,"openapi":"/en/versions/2.0.4/deploy/openapi.json get /sessions/{session_id}/status","href":"/api-reference/sessions/probe-the-sessions-high-level-status"},{"title":"Subscribe to a session's event stream (SSE)","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /sessions/{session_id}/stream","href":"/api-reference/sessions/subscribe-to-a-sessions-event-stream-sse"}]},{"group":"skill","pages":[{"title":"List Skills","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /skill","href":"/api-reference/skill/list-skills"},{"title":"Get Skill","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /skill/{skill_id}","href":"/api-reference/skill/get-skill"},{"title":"Delete Skill","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json delete /skill/{skill_id}","href":"/api-reference/skill/delete-skill"}]},{"group":"sop","pages":[{"title":"The schema a procedure's editor is built from","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json get /sop/schema","href":"/api-reference/sop/the-schema-a-procedures-editor-is-built-from"},{"title":"List procedures","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json get /sop/","href":"/api-reference/sop/list-procedures"},{"title":"Create a procedure","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json post /sop/","href":"/api-reference/sop/create-a-procedure"},{"title":"List runs","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json get /sop/runs","href":"/api-reference/sop/list-runs"},{"title":"Read one run","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json get /sop/runs/{sop_run_id}","href":"/api-reference/sop/read-one-run"},{"title":"Delete a run","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json delete /sop/runs/{sop_run_id}","href":"/api-reference/sop/delete-a-run"},{"title":"File a person's verdict on a step","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json post /sop/runs/{sop_run_id}/verdict","href":"/api-reference/sop/file-a-persons-verdict-on-a-step"},{"title":"Read one procedure","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json get /sop/{sop_id}","href":"/api-reference/sop/read-one-procedure"},{"title":"Delete a procedure and its runs","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json delete /sop/{sop_id}","href":"/api-reference/sop/delete-a-procedure-and-its-runs"},{"title":"Replace a procedure's contents","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json patch /sop/{sop_id}","href":"/api-reference/sop/replace-a-procedures-contents"},{"title":"Start a run","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json post /sop/{sop_id}/runs","href":"/api-reference/sop/start-a-run"}]},{"group":"workspace","pages":[{"title":"List Mcps","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /workspace/mcp","href":"/api-reference/workspace/list-mcps"},{"title":"Add Mcp","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json post /workspace/mcp","href":"/api-reference/workspace/add-mcp"},{"title":"Add Mcps From Library","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json post /workspace/mcp/from-library","href":"/api-reference/workspace/add-mcps-from-library"},{"title":"Remove Mcp","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json delete /workspace/mcp/{mcp_name}","href":"/api-reference/workspace/remove-mcp"},{"title":"List Skills","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /workspace/skill","href":"/api-reference/workspace/list-skills"},{"title":"Add Skill","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json post /workspace/skill","href":"/api-reference/workspace/add-skill"},{"title":"Upload Skill","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json post /workspace/skill/upload","href":"/api-reference/workspace/upload-skill"},{"title":"Add Skills From Library","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json post /workspace/skill/from-library","href":"/api-reference/workspace/add-skills-from-library"},{"title":"Remove Skill","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json delete /workspace/skill/{skill_name}","href":"/api-reference/workspace/remove-skill"},{"title":"List Workspace Directory","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /workspace/directories","href":"/api-reference/workspace/list-workspace-directory"},{"title":"Get Workspace Status","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json get /workspace/status","href":"/api-reference/workspace/get-workspace-status"},{"title":"Create Download Token","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json post /workspace/files/download-token","href":"/api-reference/workspace/create-download-token"},{"title":"Read Workspace File","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /workspace/files","href":"/api-reference/workspace/read-workspace-file"}]},{"group":"model","pages":[{"title":"List all candidate models under the given credential type","deprecated":null,"version":null,"openapi":"/en/versions/2.0.2/deploy/openapi.json get /model/","href":"/api-reference/model/list-all-candidate-models-under-the-given-credential-type"}]},{"group":"realtime","pages":[{"title":"List realtime models for a credential provider","deprecated":null,"version":null,"openapi":"/en/versions/2.0.10/deploy/openapi.json get /realtime/models","href":"/api-reference/realtime/list-realtime-models-for-a-credential-provider"},{"title":"Get browser WebRTC configuration","deprecated":null,"version":null,"openapi":"/en/versions/2.0.10/deploy/openapi.json get /realtime/config","href":"/api-reference/realtime/get-browser-webrtc-configuration"},{"title":"Start a realtime session from a WebRTC offer","deprecated":null,"version":null,"openapi":"/en/versions/2.0.10/deploy/openapi.json post /realtime/sessions/{session_id}/offer","href":"/api-reference/realtime/start-a-realtime-session-from-a-webrtc-offer"}]},{"group":"tts-model","pages":[{"title":"List all candidate TTS models under the given credential type","deprecated":null,"version":null,"openapi":"/en/versions/2.0.3/deploy/openapi.json get /tts-model/","href":"/api-reference/tts-model/list-all-candidate-tts-models-under-the-given-credential-type"}]},{"group":"embedding-model","pages":[{"title":"List all candidate embedding models under the given credential type","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /embedding-model/","href":"/api-reference/embedding-model/list-all-candidate-embedding-models-under-the-given-credential-type"}]},{"group":"channels","pages":[{"title":"List Channel Types","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /channels/types","href":"/api-reference/channels/list-channel-types"},{"title":"List Channels","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /channels/","href":"/api-reference/channels/list-channels"},{"title":"Create Channel","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json post /channels/","href":"/api-reference/channels/create-channel"},{"title":"Start Credential Binding","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json post /channels/bindings","href":"/api-reference/channels/start-credential-binding"},{"title":"Poll Credential Binding","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json get /channels/bindings/{binding_id}","href":"/api-reference/channels/poll-credential-binding"},{"title":"Cancel Credential Binding","deprecated":null,"version":null,"openapi":"/en/versions/2.0.9/deploy/openapi.json post /channels/bindings/{binding_id}/cancel","href":"/api-reference/channels/cancel-credential-binding"},{"title":"Get Channel","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /channels/{channel_id}","href":"/api-reference/channels/get-channel"},{"title":"Delete Channel","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json delete /channels/{channel_id}","href":"/api-reference/channels/delete-channel"},{"title":"Update Channel","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json patch /channels/{channel_id}","href":"/api-reference/channels/update-channel"},{"title":"Enable Channel","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json post /channels/{channel_id}/enable","href":"/api-reference/channels/enable-channel"},{"title":"Disable Channel","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json post /channels/{channel_id}/disable","href":"/api-reference/channels/disable-channel"},{"title":"Channel Status","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /channels/{channel_id}/status","href":"/api-reference/channels/channel-status"},{"title":"List Channel Sessions","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /channels/{channel_id}/sessions","href":"/api-reference/channels/list-channel-sessions"},{"title":"List Chat Ids","deprecated":null,"version":null,"openapi":"/en/versions/2.0.6/deploy/openapi.json get /channels/{channel_id}/chat_ids","href":"/api-reference/channels/list-chat-ids"}]}]}]},{"group":"Others","pages":[{"title":"FAQ","href":"/en/versions/2.0.11/others/faq"},{"title":"Changelog","href":"/en/versions/2.0.11/others/change-log"}]}]},{"version":"2.0.10","pages":[{"title":"2.0.10","href":"/en/versions/2.0.10/deploy/hub/mcp-hub"}]},{"version":"2.0.9","pages":[{"title":"2.0.9","href":"/en/versions/2.0.9/deploy/hub/mcp-hub"}]},{"version":"2.0.8","pages":[{"title":"2.0.8","href":"/en/versions/2.0.8/deploy/hub/mcp-hub"}]},{"version":"2.0.7","pages":[{"title":"2.0.7","href":"/en/versions/2.0.7/deploy/hub/mcp-hub"}]},{"version":"2.0.6","pages":[{"title":"2.0.6","href":"/en/versions/2.0.6/deploy/hub/mcp-hub"}]},{"version":"2.0.5","pages":[{"title":"2.0.5","href":"/en/versions/2.0.5/deploy/agent-service"}]},{"version":"2.0.4","pages":[{"title":"2.0.4","href":"/en/versions/2.0.4/deploy/agent-service"}]},{"version":"2.0.3","pages":[{"title":"2.0.3","href":"/en/versions/2.0.3/deploy/agent-service"}]},{"version":"2.0.2","pages":[{"title":"2.0.2","href":"/en/versions/2.0.2"}]},{"version":"1.0.21","pages":[{"title":"1.0.21","href":"/en/versions/1.0.21"}]}]},{"tab":"ReMe","versions":[{"version":"latest","groups":[{"group":"Get Started","pages":[{"title":"What's ReMe?","href":"/en/reme/latest/overview"},{"title":"Quick Start","href":"/en/reme/latest/quickstart"},{"title":"Concepts","href":"/en/reme/latest/concepts"}]},{"group":"Integration","pages":[{"title":"Overview","href":"/en/reme/latest/integration/overview"},{"title":"Deployment","href":"/en/reme/latest/integration/deployment"},{"title":"Python SDK","href":"/en/reme/latest/integration/python-sdk"},{"title":"Agent Integrations","href":"/en/reme/latest/integration/plugins"}]},{"group":"Resources","pages":[{"title":"Reference","href":"/en/reme/latest/reference"},{"title":"FAQ","href":"/en/reme/latest/faq"},{"title":"Contribution","href":"/en/reme/latest/contribution"}]}]}]}]},{"language":"zh","pages":[{"title":"zh","href":"/zh/versions/2.0.11/deploy/hub/mcp-hub"}]}]},"title":"MCP Hub - AgentScope","buildId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","deploymentId":"dpl_DFJrtvUi8HS5F9nkooKuDJsuD5BM","dynamics":["07c022d89b","a74be98ba7"],"chunks":["Frame-COGkNuA6.js","DynamicMarkdown-85clUA0i.js","zoom-image-lightbox-BZxD9MAj.js","lightbox-handle-r17bVUz3.js"]}