An open-source MCP (Model Context Protocol) server that wraps UOF (U-Office Force) SOAP/ASMX services into AI-callable tools for workflow automation.
Built for Claude Code, Claude Desktop, VS Code, and any MCP-compatible client. It lets AI agents query workflow forms, inspect form schemas, submit forms, track workflow progress, and close workflow tasks through natural language.
- 12 ready-to-use tools for UOF workflow operations, including authentication checks, form discovery, schema lookup, workflow preview, form submission, task status, task result, and task closure.
- MCP server over stdio for local AI clients, plus an optional SSE server for HTTP integrations.
- Tool-first interface: users call the same tools regardless of whether the implementation uses SOAP/PublicAPI or httpx web scraping internally.
- Single identity model: one server process represents one UOF account configured through environment variables.
- SOAP and httpx web support: SOAP is used where PublicAPI supports the operation; httpx + lxml web scraping fills gaps such as form listing, form structure lookup, and form submission. No Playwright or Chromium required — works on Alpine Linux.
This project targets UOF first-generation SOAP/ASMX services and selected web flows.
- Authentication: UOF account/password encrypted with the configured RSA public key for SOAP token access; httpx web flows maintain a cookie session independently.
- Base URL: configured with
UOF_BASE_URL, for examplehttps://your-uof-domain.com/VirtualPath. - Required UOF settings: see docs/configuration.md.
pip install mcp-uofOr use uvx:
uvx --from mcp-uof mcp-uofFor local development from source:
git clone https://github.com/asgard-ai-platform/mcp-uof.git
cd mcp-uof
uv sync
cp .env.example .envSet the required environment variables:
export UOF_BASE_URL=https://your-uof-domain.com/VirtualPath
export UOF_APP_NAME=your_app_name
export UOF_RSA_PUBLIC_KEY=your_rsa_public_key_base64
export UOF_ACCOUNT=your_account
export UOF_PASSWORD=your_passwordAdd the server via the Claude CLI:
claude mcp add --transport stdio uof -- mcp-uofOr with environment variables inline:
claude mcp add --transport stdio uof \
-e UOF_BASE_URL=https://your-uof-domain.com/VirtualPath \
-e UOF_APP_NAME=your_app_name \
-e UOF_RSA_PUBLIC_KEY=your_rsa_public_key_base64 \
-e UOF_ACCOUNT=your_account \
-e UOF_PASSWORD=your_password \
-- mcp-uofIf you clone the repo locally, run it through uv:
claude mcp add --transport stdio uof -- uv --directory /absolute/path/to/mcp-uof run mcp-uofAdd to your claude_desktop_config.json:
{
"mcpServers": {
"uof": {
"command": "mcp-uof",
"env": {
"UOF_BASE_URL": "https://your-uof-domain.com/VirtualPath",
"UOF_APP_NAME": "your_app_name",
"UOF_RSA_PUBLIC_KEY": "your_rsa_public_key_base64",
"UOF_ACCOUNT": "your_account",
"UOF_PASSWORD": "your_password"
}
}
}
}Or with a local checkout:
{
"mcpServers": {
"uof": {
"command": "uv",
"args": ["--directory", "/absolute/path/to/mcp-uof", "run", "mcp-uof"],
"env": {
"UOF_BASE_URL": "https://your-uof-domain.com/VirtualPath",
"UOF_APP_NAME": "your_app_name",
"UOF_RSA_PUBLIC_KEY": "your_rsa_public_key_base64",
"UOF_ACCOUNT": "your_account",
"UOF_PASSWORD": "your_password"
}
}
}
}See docs/integration.md and examples/ for more client configuration examples.
All tool names use the uof_custom_ prefix.
| Domain | Tools |
|---|---|
| System | check_auth |
| WKF Workflow | get_form_list, get_external_form_list, query_forms, get_form_structure, get_form_structure_by_id, preview_workflow, apply_form, get_task_data, get_task_result, terminate_task, sign_next |
Important behavior and constraints:
- UOF first-generation PublicAPI does not provide an inbox or pending-task list API. Users must provide a TaskId from the UOF UI or notification email.
- UOF does not provide a general per-step approval API. Single-step free-flow approvals can be represented through
terminate_taskwithAdoptorRejectwhen used by the current signer. terminate_taskcan overwrite already-closed results at the API layer; this server checks task status first and blocks repeated closure.query_forms,get_form_structure, andapply_formuse httpx + lxml web scraping when SOAP intermediary fields cannot represent the full form body. No browser or Playwright installation required.
See docs/tools.md for full tool specs, role model, examples, and operational boundaries.
mcp-uof/
├── src/mcp_uof/ # MCP server, auth, routing, SOAP/web backends
├── docs/ # Architecture, configuration, integration, tools, testing
├── examples/ # Claude Desktop and VS Code MCP config examples
├── scripts/ # RSA key and WSDL helper scripts
├── tests/ # smoke / e2e / mounted test layers
├── .env.example # Environment variable template
├── README.zh-TW.md # Traditional Chinese README
└── pyproject.toml
uv sync
uv run python tests/run.py smoke
uv run python -m compileall src testsTests that connect to a real UOF test environment require .env:
uv run python tests/run.py e2e
uv run python tests/run.py mountedSee CONTRIBUTING.md and docs/testing.md for development and testing guidelines.
MIT