mcp-ui Server SDK for Python
Project description
MCP UI Server SDK for Python
A Python SDK for creating MCP UI resources on the server side, enabling rich interactive experiences in MCP applications.
Installation
pip install mcp-ui-server
Quick Start
from mcp_ui_server import create_ui_resource
# Create an HTML resource
resource = create_ui_resource({
"uri": "ui://my-component",
"content": {
"type": "rawHtml",
"htmlString": "<h1>Hello MCP UI!</h1>"
},
"encoding": "text"
})
# Use in MCP tool result
tool_result = {
"content": [resource.to_dict()]
}
Features
Resource Types
The SDK supports three main content types:
1. Raw HTML
Direct HTML content for embedding in the UI:
html_resource = create_ui_resource({
"uri": "ui://html-example",
"content": {
"type": "rawHtml",
"htmlString": "<div><h1>Dynamic Content</h1><p>Generated server-side</p></div>"
},
"encoding": "text" # or "blob" for base64 encoding
})
2. External URLs
Embed external websites via iframe:
url_resource = create_ui_resource({
"uri": "ui://external-site",
"content": {
"type": "externalUrl",
"iframeUrl": "https://example.com"
},
"encoding": "text"
})
3. Remote DOM Components
Interactive components using React or Web Components:
# React component
react_resource = create_ui_resource({
"uri": "ui://react-component",
"content": {
"type": "remoteDom",
"script": """
function WeatherWidget({ location }) {
return (
<div>
<h3>Weather for {location}</h3>
<p>Temperature: 72°F</p>
</div>
);
}
""",
"framework": "react"
},
"encoding": "text"
})
# Web Components
wc_resource = create_ui_resource({
"uri": "ui://web-component",
"content": {
"type": "remoteDom",
"script": """
class StatusIndicator extends HTMLElement {
connectedCallback() {
this.innerHTML = `
<div style="color: green;">
✅ System Online
</div>
`;
}
}
customElements.define('status-indicator', StatusIndicator);
""",
"framework": "webcomponents"
},
"encoding": "blob"
})
Encoding Options
Choose between text and blob encoding:
- text: Direct string content (recommended for development)
- blob: Base64-encoded content (recommended for production)
# Text encoding - content stored as plain text
text_resource = create_ui_resource({
"uri": "ui://text-example",
"content": {"type": "rawHtml", "htmlString": "<p>Text content</p>"},
"encoding": "text"
})
# Blob encoding - content base64 encoded
blob_resource = create_ui_resource({
"uri": "ui://blob-example",
"content": {"type": "rawHtml", "htmlString": "<p>Blob content</p>"},
"encoding": "blob"
})
UI Actions
Create action results for user interactions:
from mcp_ui_server import (
ui_action_result_tool_call,
ui_action_result_prompt,
ui_action_result_link,
ui_action_result_intent,
ui_action_result_notification
)
# Tool execution
tool_action = ui_action_result_tool_call("search_database", {
"query": "user input",
"limit": 10
})
# User prompt
prompt_action = ui_action_result_prompt("Enter search query:")
# External link
link_action = ui_action_result_link("https://docs.example.com")
# Intent trigger
intent_action = ui_action_result_intent("show_details", {
"item_id": "123"
})
# Notification
notify_action = ui_action_result_notification("Search completed!")
Advanced Usage
MCP Integration
Convert UI resources for MCP tool results:
from mcp_ui_server.utils import create_mcp_tool_result_content
# Create resource
resource = create_ui_resource({...})
# Convert to MCP format
mcp_content = create_mcp_tool_result_content(resource)
# Use in tool result
return {
"content": [mcp_content],
"isError": False
}
HTML Enhancement
Automatically enhance HTML with communication capabilities:
from mcp_ui_server.utils import wrap_html_with_communication
# Basic HTML
html = "<div>My content</div>"
# Enhanced with MCP UI communication
enhanced_html = wrap_html_with_communication(html)
# Use in resource
resource = create_ui_resource({
"uri": "ui://enhanced-html",
"content": {"type": "rawHtml", "htmlString": enhanced_html},
"encoding": "text"
})
Error Handling
The SDK provides specific exception types:
from mcp_ui_server.exceptions import (
MCPUIServerError,
InvalidURIError,
InvalidContentError,
EncodingError
)
try:
resource = create_ui_resource({
"uri": "invalid://test", # Must start with ui://
"content": {"type": "rawHtml", "htmlString": "<p>Test</p>"},
"encoding": "text"
})
except InvalidURIError as e:
print(f"URI validation failed: {e}")
except InvalidContentError as e:
print(f"Content validation failed: {e}")
except MCPUIServerError as e:
print(f"General SDK error: {e}")
API Reference
Core Functions
create_ui_resource(options: CreateUIResourceOptions) -> UIResource
Creates a UI resource from the given options.
Parameters:
options: Configuration dictionary withuri,content, andencoding
Returns:
UIResourceinstance ready for use in MCP tool results
Action Result Functions
ui_action_result_tool_call(tool_name: str, params: dict) -> UIActionResultToolCallui_action_result_prompt(prompt: str) -> UIActionResultPromptui_action_result_link(url: str) -> UIActionResultLinkui_action_result_intent(intent: str, params: dict) -> UIActionResultIntentui_action_result_notification(message: str) -> UIActionResultNotification
Types
CreateUIResourceOptions
{
"uri": str, # Must start with "ui://"
"content": Union[RawHtmlPayload, ExternalUrlPayload, RemoteDomPayload],
"encoding": Literal["text", "blob"]
}
Content Payloads
# Raw HTML
{
"type": "rawHtml",
"htmlString": str
}
# External URL
{
"type": "externalUrl",
"iframeUrl": str
}
# Remote DOM
{
"type": "remoteDom",
"script": str,
"framework": Literal["react", "webcomponents"]
}
Examples
See the examples/ directory for complete usage examples:
basic_server_usage.py: Basic resource creation and action resultsadvanced_features.py: Advanced patterns and integrationsmcp_tool_integration.py: Complete MCP tool implementation
Development
Setup
# Install development dependencies
pip install -e ".[dev]"
# Run tests
pytest
# Run linting
ruff check .
black .
# Type checking
mypy src/
Project Structure
src/mcp_ui_server/
├── __init__.py # Main exports
├── types.py # Type definitions
├── core.py # Core functionality
├── utils.py # Utility functions
└── exceptions.py # Custom exceptions
License
Apache 2.0
Contributing
See CONTRIBUTING.md for contribution guidelines.
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file mcp_ui_server-0.1.0.tar.gz.
File metadata
- Download URL: mcp_ui_server-0.1.0.tar.gz
- Upload date:
- Size: 46.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
280ca8c44551bde2c3f246d8e6c84b5e68fce44f3114ed87f7c2960fb8ea5650
|
|
| MD5 |
5b82a5edb15fdd43f8f830f9076421ac
|
|
| BLAKE2b-256 |
ad76bec82bae33bdd1f726001ccec19d0928ee316f4bd245ac0ee90698eab254
|
Provenance
The following attestation bundles were made for mcp_ui_server-0.1.0.tar.gz:
Publisher:
ci.yml on idosal/mcp-ui
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_ui_server-0.1.0.tar.gz -
Subject digest:
280ca8c44551bde2c3f246d8e6c84b5e68fce44f3114ed87f7c2960fb8ea5650 - Sigstore transparency entry: 563673526
- Sigstore integration time:
-
Permalink:
idosal/mcp-ui@15f1c11ab4671e89dc77b4dc17ddb2c69b4234da -
Branch / Tag:
refs/heads/main - Owner: https://github.com/idosal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@15f1c11ab4671e89dc77b4dc17ddb2c69b4234da -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcp_ui_server-0.1.0-py3-none-any.whl.
File metadata
- Download URL: mcp_ui_server-0.1.0-py3-none-any.whl
- Upload date:
- Size: 9.1 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9b66958117df9368295878e1a474868df82eb143b2f2a1ae94ce064ccac8fe95
|
|
| MD5 |
52915131e571a22e2084d1c4dd5910ef
|
|
| BLAKE2b-256 |
6915465a293bf5dba0908735e19889353518dd9a305549aaaa4252ee5ae826ab
|
Provenance
The following attestation bundles were made for mcp_ui_server-0.1.0-py3-none-any.whl:
Publisher:
ci.yml on idosal/mcp-ui
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_ui_server-0.1.0-py3-none-any.whl -
Subject digest:
9b66958117df9368295878e1a474868df82eb143b2f2a1ae94ce064ccac8fe95 - Sigstore transparency entry: 563673528
- Sigstore integration time:
-
Permalink:
idosal/mcp-ui@15f1c11ab4671e89dc77b4dc17ddb2c69b4234da -
Branch / Tag:
refs/heads/main - Owner: https://github.com/idosal
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
ci.yml@15f1c11ab4671e89dc77b4dc17ddb2c69b4234da -
Trigger Event:
push
-
Statement type: