Skip to content

asgard-ai-platform/mcp-uof

Repository files navigation

MCP UOF

PyPI version Python versions License GitHub stars GitHub issues GitHub last commit MCP compatible

繁體中文

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 example https://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_task with Adopt or Reject when used by the current signer.
  • terminate_task can overwrite already-closed results at the API layer; this server checks task status first and blocks repeated closure.
  • query_forms, get_form_structure, and apply_form use 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

About

No description, website, or topics provided.

Resources

License

Contributing

Security policy

Stars

0 stars

Watchers

0 watching

Forks

Packages

 
 
 

Contributors

Languages