MCP server wrapping UOF SOAP/ASMX services into AI Agent-callable workflow tools
Project description
MCP UOF
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.
What This Does
- 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.
API Reference
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.
Quick Start
Install
pip install mcp-uof
Or use uvx:
uvx --from mcp-uof mcp-uof
For local development from source:
git clone https://github.com/asgard-ai-platform/mcp-uof.git
cd mcp-uof
uv sync
cp .env.example .env
Set 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_password
Use with Claude Code
Add the server via the Claude CLI:
claude mcp add --transport stdio uof -- mcp-uof
Or 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-uof
If you clone the repo locally, run it through uv:
claude mcp add --transport stdio uof -- uv --directory /absolute/path/to/mcp-uof run mcp-uof
Use with Claude Desktop
Add 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.
Tools (12)
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.
Project Structure
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
Development
uv sync
uv run python tests/run.py smoke
uv run python -m compileall src tests
Tests that connect to a real UOF test environment require .env:
uv run python tests/run.py e2e
uv run python tests/run.py mounted
See CONTRIBUTING.md and docs/testing.md for development and testing guidelines.
License
MIT
Project details
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_uof-0.1.6.tar.gz.
File metadata
- Download URL: mcp_uof-0.1.6.tar.gz
- Upload date:
- Size: 230.8 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
ab8ef4741ba54f78a33c6a4e8e6953dd47c4c5e4b0653667fbd8a35b7293158a
|
|
| MD5 |
8ef93c11ea634c3d3c1aa23b336f7801
|
|
| BLAKE2b-256 |
e6d42ee1f1bae2fe02c1023451186965846a740631336741e3d7de544cee6610
|
Provenance
The following attestation bundles were made for mcp_uof-0.1.6.tar.gz:
Publisher:
publish.yml on asgard-ai-platform/mcp-uof
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_uof-0.1.6.tar.gz -
Subject digest:
ab8ef4741ba54f78a33c6a4e8e6953dd47c4c5e4b0653667fbd8a35b7293158a - Sigstore transparency entry: 2043487243
- Sigstore integration time:
-
Permalink:
asgard-ai-platform/mcp-uof@2de44f39019cab04b56ed6dabff9f13c04482bef -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/asgard-ai-platform
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2de44f39019cab04b56ed6dabff9f13c04482bef -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcp_uof-0.1.6-py3-none-any.whl.
File metadata
- Download URL: mcp_uof-0.1.6-py3-none-any.whl
- Upload date:
- Size: 89.9 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.12
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5a99c4494ff6e3e53c85c7033ac3b60f85a659ac4c02430ea82a43a5f4387b4f
|
|
| MD5 |
b139428a746ccd745fe3375ef7e88dbb
|
|
| BLAKE2b-256 |
cbb14d6c9951db07568ab71ad13785656dcca18e5a2b7b35bc971bbbd81771a1
|
Provenance
The following attestation bundles were made for mcp_uof-0.1.6-py3-none-any.whl:
Publisher:
publish.yml on asgard-ai-platform/mcp-uof
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
mcp_uof-0.1.6-py3-none-any.whl -
Subject digest:
5a99c4494ff6e3e53c85c7033ac3b60f85a659ac4c02430ea82a43a5f4387b4f - Sigstore transparency entry: 2043487281
- Sigstore integration time:
-
Permalink:
asgard-ai-platform/mcp-uof@2de44f39019cab04b56ed6dabff9f13c04482bef -
Branch / Tag:
refs/tags/v0.1.6 - Owner: https://github.com/asgard-ai-platform
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@2de44f39019cab04b56ed6dabff9f13c04482bef -
Trigger Event:
push
-
Statement type: