49b9bb6724
Deploy Docs / deploy-docs (push) Failing after 1s
Conformance Tests / client-conformance (push) Failing after 3s
Conformance Tests / server-conformance (push) Failing after 1s
GitHub Actions Security Analysis / zizmor (push) Failing after 1s
CI / checks (push) Failing after 59m20s
CI / all-green (push) Waiting to run
40 lines
1.1 KiB
Python
40 lines
1.1 KiB
Python
from mcp import Client
|
|
from mcp.client import advertise
|
|
from mcp.server.apps import APP_MIME_TYPE, EXTENSION_ID, Apps, client_supports_apps
|
|
from mcp.server.mcpserver import MCPServer
|
|
from mcp.server.mcpserver.context import Context
|
|
|
|
CLOCK_HTML = """\
|
|
<!doctype html>
|
|
<title>Clock</title>
|
|
<h1 id="now">...</h1>
|
|
<script>
|
|
window.addEventListener("message", (event) => {
|
|
const text = event.data?.result?.content?.[0]?.text;
|
|
if (text) document.getElementById("now").textContent = text;
|
|
});
|
|
</script>
|
|
"""
|
|
|
|
apps = Apps()
|
|
|
|
|
|
@apps.tool(resource_uri="ui://clock/app.html", description="The current time.")
|
|
def get_time(ctx: Context) -> str:
|
|
now = "2026-06-26T12:00:00Z"
|
|
if not client_supports_apps(ctx):
|
|
return f"The time is {now}."
|
|
return now
|
|
|
|
|
|
apps.add_html_resource("ui://clock/app.html", CLOCK_HTML, title="Clock")
|
|
|
|
mcp = MCPServer("clock", extensions=[apps])
|
|
|
|
|
|
async def main() -> None:
|
|
async with Client(mcp, extensions=[advertise(EXTENSION_ID, {"mimeTypes": [APP_MIME_TYPE]})]) as client:
|
|
result = await client.call_tool("get_time", {})
|
|
print(result.content)
|
|
# [TextContent(text='2026-06-26T12:00:00Z')]
|