Skip to main content
Glama
README.md
# oflow-mcp

> Agent-native workflow kernel. 工作流不必只能是 Dify、n8n 或扣子。

`oflow-mcp` is a workflow-only MCP server. It treats workflow as an open execution protocol for AI Agents: text-defined, versionable, checkpointed, recoverable, and callable through MCP tools.

## Product positioning

Traditional workflow platforms often center on visual canvases, proprietary node graphs, and hosted platform state. `oflow-mcp` starts from a different premise:

- **Agent native**: prompts, outputs, checkpoints, and step state are first-class workflow concepts.
- **Text is the source of truth**: workflows are `flow.yaml + prompts/*.md`, so they can be reviewed, diffed, versioned, and reused.
- **Verifiable execution**: each step can require outputs, natural confirmations, deterministic checks, and persisted state.
- **Local-first kernel**: the first version runs on MCP + filesystem; UI, connectors, triggers, remote execution, and enterprise governance can layer on top later.
- **Replacement path, not a plugin**: the long-term goal is to replace the core capabilities of general workflow tools such as Dify, n8n, and Coze/扣子, starting with the execution kernel.

## Non-goals for the first release

This first release intentionally excludes:

- TAPD, Confluence, GitLab, CI, or IM integrations
- memory, inbox, init, or instructions tools from `flow-mcp`
- visual canvas UI
- database storage
- multi-tenant permissions

## Install

```bash
npm install
npm run build
```

## Start

```bash
npm start
```

MCP configuration example:

```json
{
  "mcpServers": {
    "oflow-mcp": {
      "command": "node",
      "args": ["/path/to/oflow-mcp/dist/index.js"],
      "env": {
        "OFLOW_MCP_FLOWS_DIR": "/path/to/oflow-mcp/flows",
        "OFLOW_MCP_DATA_DIR": "/tmp/oflow-mcp-instances"
      }
    }
  }
}
```

## Environment variables

| Variable | Default | Description |
| --- | --- | --- |
| `OFLOW_MCP_HOME` | `~/.oflow-mcp` | Base data directory |
| `OFLOW_MCP_FLOWS_DIR` | `$OFLOW_MCP_HOME/flows` | Workflow template directory |
| `OFLOW_MCP_DATA_DIR` | `$OFLOW_MCP_HOME/instances` | Workflow instance directory |

## Tools

`oflow-mcp` exposes only workflow tools:

| Tool | Description |
| --- | --- |
| `workflow_list_templates` | List available templates |
| `workflow_get_template` | Get template details |
| `workflow_start` | Start a workflow instance |
| `workflow_current` | Get current step and rendered prompt |
| `workflow_advance` | Complete current step and advance |
| `workflow_status` | Show full instance status |
| `workflow_list_instances` | List instances |
| `workflow_bind` | Bind alias to an instance |
| `workflow_override_prompt` | Override one step prompt for one instance |
| `workflow_create_template` | Create a template from YAML-like data and prompts |
| `workflow_events` | Query append-only event log by instance/type/step/limit |
| `workflow_dashboard` | Show Agent control-plane state, checkpoint blockers, inbox summary, and suggested actions |
| `workflow_worklog` | Generate a Markdown worklog from instance state and events |
| `workflow_inbox_save` | Save lightweight inbox entries for an instance |
| `workflow_inbox_list` | List lightweight inbox entries |
| `workflow_inbox_mark` | Mark inbox entries as `new`, `seen`, or `acted` |
| `workflow_validate_template` | Report template health issues such as unreachable steps and invalid prompt references |

No `flow_memory_*`, `flow_init`, TAPD, or Confluence tools are exposed. `workflow_inbox_*` is a local lightweight inbox for workflow control-plane coordination; it does not call external systems.

## Template structure

```text
flows/
  basic-dev/
    flow.yaml
    prompts/
      analyze.md
      design.md
      verify.md
```

Minimal `flow.yaml`:

```yaml
name: basic-dev
description: Minimal Agent-native development workflow
params:
  change_name:
    type: string
    required: true
steps:
  - id: analyze
    name: Analyze
    checkpoint:
      required_outputs:
        analysis_summary:
          type: string
          min_length: 20
      optional_outputs:
        risk_notes:
          type: string
      evidence:
        - key: test_log
          required: true
          description: Test log or command output
      approvals:
        - key: user_confirmed
          required: false
          description: User approval when needed
      conditions:
        - natural: analysis_summary has been produced
          check: outputs.analysis_summary != null AND len(outputs.analysis_summary) > 20
    next: design
  - id: design
    name: Design
    next: null
```

Prompt variables:

- `{{change_name}}` reads workflow params.
- `{{steps.analyze.outputs.analysis_summary}}` reads prior step outputs.
- Unresolved variables are left unchanged for debugging.

## DSL support matrix

| Feature | Status |
| --- | --- |
| `params` object and string-array compatibility | Supported |
| `steps` with `id`, `name`, `checkpoint`, `next` | Supported |
| `next` as string/null/object branch map | Supported |
| `prompts/<step_id>.md` | Supported |
| `required_outputs` array or object | Supported |
| natural conditions | Supported |
| deterministic `check` expressions | Supported subset |
| `token_budget.total` and `token_consumed` | Supported |
| loops | Not supported in first release |
| optimization hints | Not supported |
| worklog generation | Supported through `workflow_worklog` |
| local inbox | Supported through `workflow_inbox_*`; no external sync |
| memory/external bindings | Not supported |

Supported check expressions:

- `outputs.foo != null`
- `outputs.foo == null`
- `outputs.foo == 'value'`
- `len(outputs.foo) > N`
- `AND`, `OR`, parentheses

Unsupported expressions fail closed and do not mutate workflow state.

## Control plane tools

`workflow_events` accepts:

```json
{
  "instance_id": "wf_...",
  "type": "step.completed",
  "step_id": "verify",
  "since": "2026-06-23T00:00:00.000Z",
  "until": "2026-06-24T00:00:00.000Z",
  "only_failures": false,
  "include_payload": false,
  "summary": true,
  "limit": 50
}
```

`limit` defaults to 50 and is capped at 200. Malformed JSONL audit lines are skipped so one bad event does not hide the rest. Payloads are omitted by default; use `summary=true` for safe payload summaries or `include_payload=true` for full payloads.

`workflow_dashboard` accepts:

```json
{
  "instance_id": "wf_...",
  "include_prompt": true,
  "include_recent_events": true,
  "include_inbox": true,
  "verbose": false
}
```

The dashboard reports `progress`, `risk`, checkpoint `readiness`, and structured `suggested_actions` with `action_type`, `title`, `reason`, `tool_hint`, and `risk`. It summarizes outputs with keys and short previews rather than returning full output payloads.

`workflow_worklog` returns `{ "markdown": "...", "summary": { ... } }`. It supports `mode: "summary" | "full" | "handoff" | "release_note"` and optional `write_file`; when writing, paths are resolved under `OFLOW_MCP_DATA_DIR`. The generated Markdown includes step timeline, output summaries, validation failures, and current state.

`workflow_inbox_save/list/mark` stores local coordination items under `OFLOW_MCP_DATA_DIR/inbox/<instance_id>.json`. Entries support `priority: "low" | "medium" | "high" | "blocking"` and optional `step_id`; dashboard risk aggregates high/blocking items. Deduplication uses `external_id` first; otherwise it uses `source + type + title + date`. These tools do not call Git, CI, TAPD, IM, or review systems.

`workflow_validate_template` returns `{ "valid": boolean, "errors": [], "warnings": [] }` for control-plane health checks including unreachable steps, invalid checkpoint expressions, undeclared prompt params, missing step references, duplicate evidence/approval keys, empty conditions, unused prompts, branch shape warnings, and missing descriptions. Issues include `severity` and `suggestion` when available.

## Kernel hardening

The workflow kernel includes the first P0/P1 hardening batch:

- Template names, step ids, instance ids, and aliases are validated before file access.
- Template, instance, and event paths are resolved inside their configured base directories to prevent path traversal.
- Instances carry a `version` field and state writes use optimistic locking to reject stale saves.
- Running instances store `template_snapshot` and `prompt_snapshots`, so later template edits do not change in-flight workflow semantics.
- Key runtime transitions are appended to `events/<instance_id>.jsonl` for audit/debug.
- Prompt, outputs, and instance payload sizes are bounded.
- `workflow_status` returns output keys and short previews rather than full outputs by default.
- Tool responses are JSON envelopes: `{ "ok": true, "data": ... }` or `{ "ok": false, "error": ... }`.

## Example lifecycle

1. `workflow_list_templates`
2. `workflow_start`:

```json
{
  "template": "basic-dev",
  "params": { "change_name": "demo" },
  "alias": "demo-run"
}
```

3. `workflow_current` with `demo-run`
4. `workflow_dashboard` to inspect blockers and suggested actions
5. `workflow_advance` with required outputs, confirmed conditions, and any required evidence/approvals
6. `workflow_events` or `workflow_worklog` for audit/debug
7. Continue `workflow_advance` until completed

## Development

```bash
npm install
npm run build
npm test
```

## Common errors

- **Template not found**: set `OFLOW_MCP_FLOWS_DIR` or copy templates to `~/.oflow-mcp/flows`.
- **Prompt not found**: every step requires `prompts/<step_id>.md`.
- **Checkpoint validation failed**: provide required outputs, confirmed conditions, and any required evidence/approvals. The error envelope may include `details.missing_required`, `details.missing_evidence`, `details.missing_approvals`, and `details.suggestions`.
- **No branch matched**: pass a `condition_result` matching the branch keys in `next`.
- **Alias already bound**: choose another alias or use the existing instance ID.

TDQS

A3.7/5.0

Scored across 10 tools

Disambiguation5/5

Each tool targets a distinct operation: creation, starting, advancing, binding, querying, and overriding. No two tools have overlapping purposes.

Naming Consistency5/5

All tools use the consistent 'workflow_verb_noun' pattern in snake_case, making the purpose clear and predictable.

Tool Count5/5

With 10 tools, the surface is well-scoped for managing workflow templates and instances, covering all essential operations without unnecessary bloat.

Completeness4/5

Core CRUD and lifecycle operations are present (create, start, advance, status). Missing delete or stop operations for templates/instances is a minor gap, but the main workflows are covered.

Maintenance

ActivityStale
ResponsivenessNo issues