MCP server turning UOF workflow operations into AI Agent-callable tools via httpx web automation
Project description
MCP UOF
An open-source MCP (Model Context Protocol) server that turns UOF (U-Office Force) workflow operations into AI-callable tools, driven entirely through httpx web 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, sign off, and close workflow tasks through natural language.
What This Does
- 17 exposed tools for UOF workflow operations.
preview_workflowandget_external_form_listcurrently return capability guidance rather than live data. - MCP server over stdio for local AI clients.
- Tool-first interface: users call the same tools without ever choosing a mechanism — how each tool talks to UOF is an internal, developer-time decision.
- Single identity model: one server process represents one UOF account configured through environment variables.
- httpx web automation: operations use HTTPS requests (
httpx+lxml) against UOF'saspx/ashxendpoints, without a browser runtime. On Alpine Linux or musl, ensure binary wheels or native build dependencies are available.
API Reference
This project targets UOF first-generation web flows, driven over httpx.
- Authentication: UOF account/password posted to
Login.aspx, maintaining a cookie session. - Base URL: configured with
UOF_BASE_URL, for examplehttps://your-uof-domain.com/VirtualPath. - Required UOF settings: see docs/configuration.md.
Quick Start
Install From Source
Install and run the current 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_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_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_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_ACCOUNT": "your_account",
"UOF_PASSWORD": "your_password"
}
}
}
}
See docs/integration.md and examples/ for more client configuration examples.
Tools (17)
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_pending_sign_list, search_users, get_form_structure, get_form_structure_by_id, get_dialog_structure, search_dialog_options, operate_dialog, preview_workflow, apply_form, get_task_data, get_task_result, sign_next, terminate_task |
Important behavior and constraints:
get_pending_sign_listreturns every form awaiting the current identity's signature (with TaskId/SiteId/NodeSeq), sourced from the Homepage pending-sign widget.query_formsis a different set — the forms you submitted or signed, by date range (query_mode=apply/sign). Ask "what do I need to sign?" →get_pending_sign_list.- Composite fields (line items, vendor pickers, expense details) live inside dialogs. Use
get_dialog_structureto see a dialog field's inner controls,search_dialog_optionsto look up real picker candidates (never fabricate codes), and pass them intoapply_formvia the_lookups/_fill_before/_press_after/_rowsreserved keys.operate_dialogis a probe only — it cannot accumulate rows. sign_nextperforms approval for the current pending step and can close the flow or route to a designated next signer. It does not accept a signing comment; return, parallel/countersign, and fixed-flow stepping still require the Web UI.terminate_taskcloses a task:Cancelvoids an in-flight form (via the web recall page),Adopt/Rejectapprove/reject through the web sign flow. It checks task status first and blocks repeated closure of an already-closed task.preview_workflow(flow simulation) is not available over httpx and directs the user to the Web UI; you can still submit directly withapply_formand inspect the real signing route afterward withget_task_result.apply_formalways submits as the configuredUOF_ACCOUNT. Itsapplicant_accountandfirst_signer_accountparameters are currently retained for interface compatibility but do not change the submitted identity or routing.
See docs/tools.md for full tool specs, role model, examples, and operational boundaries.
Project Structure
mcp-uof/
├── src/mcp_uof/ # MCP server, auth (web session), routing, httpx web backend
├── docs/ # Architecture, configuration, integration, tools, testing
├── examples/ # Claude Desktop and VS Code MCP config examples
├── tests/ # smoke / 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 mounted
See CONTRIBUTING.md and docs/testing.md for development and testing guidelines.
License
MIT
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_uof-0.2.0.tar.gz.
File metadata
- Download URL: mcp_uof-0.2.0.tar.gz
- Upload date:
- Size: 195.2 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
75736ae87dceeb41453e0eb71df7396b9dcc7c2fa2ec0fcfdac9f53f4efca694
|
|
| MD5 |
ff92ea98983a864a65e3e441f01073df
|
|
| BLAKE2b-256 |
624b3cda9f232b2b0639ca1b93b7b22e764d0ec3c7280931d690b3571c693347
|
Provenance
The following attestation bundles were made for mcp_uof-0.2.0.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.2.0.tar.gz -
Subject digest:
75736ae87dceeb41453e0eb71df7396b9dcc7c2fa2ec0fcfdac9f53f4efca694 - Sigstore transparency entry: 2222370265
- Sigstore integration time:
-
Permalink:
asgard-ai-platform/mcp-uof@69682a7a0b1b4f47fc2670d7502955ef95187258 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/asgard-ai-platform
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@69682a7a0b1b4f47fc2670d7502955ef95187258 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcp_uof-0.2.0-py3-none-any.whl.
File metadata
- Download URL: mcp_uof-0.2.0-py3-none-any.whl
- Upload date:
- Size: 66.5 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59249eb9c422d95bc9f9323c1d7ac011ce63bf27740a6de0fc26f04374ee48fd
|
|
| MD5 |
92eebe3725013932532e4af0efe7c949
|
|
| BLAKE2b-256 |
f9a00944f9502cedf9848dd9f368b01b4fc2219ffd473559895a83a1475bc9da
|
Provenance
The following attestation bundles were made for mcp_uof-0.2.0-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.2.0-py3-none-any.whl -
Subject digest:
59249eb9c422d95bc9f9323c1d7ac011ce63bf27740a6de0fc26f04374ee48fd - Sigstore transparency entry: 2222370700
- Sigstore integration time:
-
Permalink:
asgard-ai-platform/mcp-uof@69682a7a0b1b4f47fc2670d7502955ef95187258 -
Branch / Tag:
refs/tags/v0.2.0 - Owner: https://github.com/asgard-ai-platform
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@69682a7a0b1b4f47fc2670d7502955ef95187258 -
Trigger Event:
push
-
Statement type: