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
- 22 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.
- Browser sign-in:
uof_custom_loginopens the real UOF login page in the user's own browser and captures the session. The local MCP proxy relays the login form to UOF, so the password transits the server process in memory but is never parsed, logged, persisted, written to a config file, or returned to the AI. An unattended username/password fallback stays available for CI. - Single identity model: one server process represents one UOF identity, and the session persists across restarts.
- External session handoff: agent runtimes with per-user storage can bind an exported session artifact to each new subprocess, then export refreshed cookies after use.
- 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: a
Login.aspxcookie session, obtained either through browser sign-in or the credential fallback. - Base URL: configured with
UOF_BASE_URL, for examplehttps://your-uof-domain.com/VirtualPath. - Required UOF settings: see docs/configuration.md.
Quick Start
Install
Install from PyPI:
pip install mcp-uof
Or run without installing:
uvx --from mcp-uof mcp-uof
To install and run the current source instead:
git clone https://github.com/asgard-ai-platform/mcp-uof.git
cd mcp-uof
uv sync
cp .env.example .env
Set the connection URL — that is the only required variable:
export UOF_BASE_URL=https://your-uof-domain.com/VirtualPath
Sign in by calling the uof_custom_login tool in your chat: it opens the real UOF login page in
your default browser, and the session is handed back to the server once you log in. Credentials
are relayed as-is by the local proxy — never parsed, logged, persisted, or returned to the AI, and
never written to a config file. See docs/configuration.md
for the unattended (username/password) fallback used by CI.
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 \
-- 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"
}
}
}
}
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"
}
}
}
}
See docs/integration.md and examples/ for more client configuration examples.
Tools (22)
All tool names use the uof_custom_ prefix.
| Domain | Tools |
|---|---|
| System | check_auth, login, logout, bind_session, bind_browser_session, export_session |
| 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 identity this server process is signed in as (the browser-login user, or the configuredUOF_ACCOUNTwhen the credential fallback is used). 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.6.0rc3.tar.gz.
File metadata
- Download URL: mcp_uof-0.6.0rc3.tar.gz
- Upload date:
- Size: 231.3 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.14
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
9e4c468a6691cd6ded0f848a336a1943b58b202e98c21ebedd9f725fc02692e4
|
|
| MD5 |
707a914b69fd625e076313dd8a42e9ed
|
|
| BLAKE2b-256 |
5a9afee01236fda1386bf32d5b1dc64fc274070efcdba1aa93c5388a2048a786
|
Provenance
The following attestation bundles were made for mcp_uof-0.6.0rc3.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.6.0rc3.tar.gz -
Subject digest:
9e4c468a6691cd6ded0f848a336a1943b58b202e98c21ebedd9f725fc02692e4 - Sigstore transparency entry: 2279478046
- Sigstore integration time:
-
Permalink:
asgard-ai-platform/mcp-uof@e395d22f4ad31e2b6aab5cfc5357421de45c2ed0 -
Branch / Tag:
refs/tags/v0.6.0rc3 - Owner: https://github.com/asgard-ai-platform
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e395d22f4ad31e2b6aab5cfc5357421de45c2ed0 -
Trigger Event:
push
-
Statement type:
File details
Details for the file mcp_uof-0.6.0rc3-py3-none-any.whl.
File metadata
- Download URL: mcp_uof-0.6.0rc3-py3-none-any.whl
- Upload date:
- Size: 107.2 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 |
ed38a804732d2d3645c1c2f9e89e169a09754489bbb830c443a9f013935ed1bf
|
|
| MD5 |
d998e6b02d005f1f2e16cd37a2c514f7
|
|
| BLAKE2b-256 |
83cf1346d9e4caeb717ce2dcce1ab371f0ef977c8ff6f816bef4776838bd82b1
|
Provenance
The following attestation bundles were made for mcp_uof-0.6.0rc3-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.6.0rc3-py3-none-any.whl -
Subject digest:
ed38a804732d2d3645c1c2f9e89e169a09754489bbb830c443a9f013935ed1bf - Sigstore transparency entry: 2279478051
- Sigstore integration time:
-
Permalink:
asgard-ai-platform/mcp-uof@e395d22f4ad31e2b6aab5cfc5357421de45c2ed0 -
Branch / Tag:
refs/tags/v0.6.0rc3 - Owner: https://github.com/asgard-ai-platform
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish.yml@e395d22f4ad31e2b6aab5cfc5357421de45c2ed0 -
Trigger Event:
push
-
Statement type: