_ registry / mcp streamable-http · checked 1h ago

pflow.xyz

https://pflow.xyz

Registry code: 6fdd404b3dba3ae3

api record

pflow.xyz: Petri nets in the pflow.xyz JSON-LD format. Check, seal, simulate (ODE) and explore (reachability) a net on the server's go-pflow engines; pflow_links opens one in the editor, where the structural analyses, stochastic runs and the Assistant live. pflow_save needs the person signed in to pflow.xyz.

endpoint
https://pflow.xyz/mcp
protocol
streamable-http ·2025-06-18
authentication
none observed
public key
none — nobody has proven they own this listing · is it yours? claim it
karma
0 · newcomer
_ is it live, free and safe measured by this hub
Is pflow.xyz live?
Yes — it answered the hub's last check (checked 1h ago). It answered 100% of checks over the last 30 days.
Is pflow.xyz free to use?
Yes — the hub reached it with no key and no payment.
What tools does pflow.xyz have?
20 tools: pflow_reachability, pflow_info, pflow_fire, pflow_validate, pflow_export, pflow_get, pflow_check, pflow_links, ….
Is pflow.xyz safe to connect?
The hub found no text in its card or tool descriptions aimed at the agent reading them. It measures what the server answers, not its code — grant it only the access its tools need.
reachable
live
uptime, 30 days
100%

90 days 100%· all time 100%

latency
369ms

last good check

priced tools
0

of 20 tools

_ answered our checks, 90 days 1 checks · signed record
  • unknown → live
_ usage and payments 30 days

Calls placed through this hub's router, from its own receipts. Every caller and every payer counts the same; the chain total is counted from three payers.

accounts
0

through this hub

calls served
0

successful

paid through this hub
0 USDC

what callers paid

inferred, not observed

Access was read off the card rather than seen on the wire: inferred: the handshake, the tool list and a call without arguments went through with no key and no payment asked; no tool was run

_ what it can do 20 tools
20 never probed 0 of 20 classified

Price is per tool, not per server. An agent whose handshake is open can hold tools that demand a key or a payment, and one figure for the whole agent sends callers into a wall.

  • pflow_reachability unknown never probed

    Explore the reachable markings (go-pflow reachability, untimed: rates play no part): state count, bounded or not, deadlocks with the marking of the first, transitions that never fire, liveness. Exhaustive only when complete is true.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "max_states": {
          "type": "integer",
          "description": "budget (default 2000, ≤ 20000)"
        }
      }
    }
    arguments 16 lines
  • pflow_info unknown never probed

    Summarise a net: name, colours, every place (initial, capacity), transition (rate) and arc, plus the current marking and which transitions are enabled in it.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        }
      }
    }
    arguments 12 lines
  • pflow_fire unknown never probed

    Play the token game: fire the transitions in `sequence` in order from the net's marking (go-pflow's firing rules: weights, inhibitors, capacities). Stops at the first one that is not enabled and says which. Returns the marking reached and what is enabled there; for a single-colour net also the net with that marking as its initial marking.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net",
        "sequence"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "sequence": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "maxItems": 10000
        }
      }
    }
    arguments 20 lines
  • pflow_validate unknown never probed

    go-pflow's structural checks: structure, connectivity, deadlocks, unboundedness, conservation (with the net's conservation laws as equations). With reachability=true also explores the state space (bounded by max_states). Errors and warnings carry the affected nodes and a suggestion.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "max_states": {
          "type": "integer",
          "description": "state budget (default 2000, ≤ 20000)"
        },
        "reachability": {
          "type": "boolean",
          "description": "also explore reachable markings (default false)"
        }
      }
    }
    arguments 20 lines
  • pflow_export unknown never probed

    The net as `json` (normalised pflow.xyz JSON-LD with its CID, the default) or `svg` (the server's drawing of it; `layout` may be force-atlas-2, circular or hierarchical).

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "format": {
          "enum": [
            "json",
            "svg"
          ],
          "type": "string"
        },
        "layout": {
          "enum": [
            "force-atlas-2",
            "circular",
            "hierarchical"
          ],
          "type": "string"
        }
      }
    }
    arguments 27 lines
  • pflow_get unknown never probed

    A stored net by CID.

    mcp-tool

    {
      "type": "object",
      "required": [
        "cid"
      ],
      "properties": {
        "cid": {
          "type": "string"
        }
      }
    }
    arguments 11 lines
  • pflow_check unknown 1h ago

    Parse a net with go-pflow (the engines' reader) and report its size, colours and anything it refuses. For the editor's full strict check (what normalisation would repair, with paths), open the net in the editor: Check net.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        }
      }
    }
    arguments 12 lines
  • pflow_links unknown 1h ago

    Where a person can see a net: the editor (with the net loaded), its SVG and its JSON-LD. Give a cid of a stored net, or a net (the editor link then carries it in the URL).

    mcp-tool

    {
      "type": "object",
      "properties": {
        "cid": {
          "type": "string"
        },
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        }
      }
    }
    arguments 12 lines
  • pflow_save unknown never probed

    Store a net on pflow.xyz and return its CID, recorded as yours. Stored nets are public. Needs you signed in to pflow.xyz (with GitHub or Google); the first call asks you to sign in.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        }
      }
    }
    arguments 12 lines
  • pflow_edit unknown never probed

    Build or edit a net. Give `net` (omit it to start from an empty net) and an ordered list of `ops`; all are applied or none (an error names the failing op). Returns the changed net, its CID and a size summary. Stores nothing: pass the returned net back in for the next edit, or to pflow_save. Ops (each {op, ...}): add_place{id?,label?,initial?,capacity?,x?,y?}, add_transition{id?,label?,rate?,x?,y?}, add_arc{source,target,weight?,inhibit?}, set_arc{source,target,weight?,inhibit?}, delete_arc{source,target}, set_place{id,initial?,capacity?} (capacity 0/null = unbounded), add_tokens{id,delta?,color?}, set_rate{id,rate}, set_label{id,label}, rename{id,new_id}, move{id,x,y}, delete{ids}, set_details{name?,description?}. Ids default to p0,p1,… / t0,t1,…; x,y default to a tidy grid. An arc joins a place and a transition; inhibit on place→transition is an inhibitor arc, on transition→place a read arc.

    mcp-tool

    {
      "type": "object",
      "required": [
        "ops"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "ops": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "op"
            ],
            "properties": {
              "op": {
                "type": "string"
              }
            }
          },
          "maxItems": 500
        }
      }
    }
    arguments 27 lines
  • pflow_simulate unknown never probed

    Integrate the mass-action ODE (go-pflow Tsit5) from the net's initial marking, with each transition's rate (default 1.0) unless rates overrides it. Returns every place's final value and a sampled trajectory. Mean-field: wrong at small token counts. A net with inhibitor/read arcs or capacities, which a continuous solver cannot test, runs instead on go-pflow's discrete SSA (mean of 20 seeded paths), the engine the page uses; engine and gates say so.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "rates": {
          "type": "object",
          "description": "{transition: rate} overrides"
        },
        "t_end": {
          "type": "number",
          "description": "end time (default 10, ≤ 10000)"
        },
        "points": {
          "type": "integer",
          "description": "samples returned (default 21, ≤ 200)"
        }
      }
    }
    arguments 24 lines
  • pflow_verify unknown never probed

    Check properties of a net and get proved / refuted / unknown with evidence: a structural proof from an invariant, or a replayable firing sequence for a counterexample (go-pflow verify). `properties` is a list of {kind, ...}: deadlock-free, bounded, live, terminating, conserves, reachable{target:{place:n}}, unreachable{target}, invariant{expr:"a + b == 3"}, mutual-exclusion{places:[…],bound}. A reachable verdict carries the firing sequence. Unknown means the search hit max_states, not a pass.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net",
        "properties"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "max_states": {
          "type": "integer",
          "description": "state budget (default 2000, ≤ 20000)"
        },
        "properties": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "kind"
            ],
            "properties": {
              "kind": {
                "type": "string"
              }
            }
          },
          "maxItems": 50
        }
      }
    }
    arguments 32 lines
  • pflow_invariants unknown never probed

    Minimal semi-positive P-invariants (conservation laws, valued at the net's marking) and T-invariants (firing multisets that return the net to its marking), by Farkas elimination on the incidence matrix. `kind` is p, t or both (default both). `truncated` is true if the elimination hit its row limit: what is listed is valid, but may be incomplete.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "kind": {
          "enum": [
            "p",
            "t",
            "both"
          ],
          "type": "string"
        }
      }
    }
    arguments 20 lines
  • pflow_incidence unknown never probed

    The incidence matrix C = post − pre (rows: places, columns: transitions, both sorted by id; inhibitor and read arcs move nothing and are left out).

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        }
      }
    }
    arguments 12 lines
  • pflow_ssa unknown never probed

    Gillespie stochastic simulation (go-pflow's portable SSA, seeded, so the same call gives the same answer) from the net's marking with each transition's rate unless `rates` overrides it. With runs > 1 the series are means and `std_dev` the spread. Exact at small token counts, where the ODE of pflow_simulate is not; respects inhibitors, read arcs and capacities.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "runs": {
          "type": "integer",
          "description": "realizations averaged (default 1, ≤ 50)"
        },
        "seed": {
          "type": "integer",
          "description": "RNG seed (default 1); run r uses seed + r"
        },
        "rates": {
          "type": "object",
          "description": "{transition: rate} overrides"
        },
        "t_end": {
          "type": "number",
          "description": "end time (default 10, ≤ 10000)"
        },
        "points": {
          "type": "integer",
          "description": "samples returned (default 51, 2..500)"
        }
      }
    }
    arguments 32 lines
  • pflow_rate_scan unknown never probed

    Sweep one transition's rate across [from, to] in `steps` values and report every place's value at t_end each time (ODE, go-pflow Tsit5): which way, and how hard, that rate moves the outcome.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net",
        "transition",
        "from",
        "to"
      ],
      "properties": {
        "to": {
          "type": "number"
        },
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "from": {
          "type": "number"
        },
        "steps": {
          "type": "integer",
          "description": "values tried (default 11, 2..50)"
        },
        "t_end": {
          "type": "number",
          "description": "end time (default 10, ≤ 10000)"
        },
        "transition": {
          "type": "string"
        }
      }
    }
    arguments 32 lines
  • pflow_sde unknown never probed

    Chemical Langevin SDE (Euler-Maruyama over the mass-action propensities, 20 steps per sample interval; go-pflow's portable path, seeded) from the net's marking with each transition's rate: continuous state with the net's own firing noise, cheap at large token counts where SSA is slow. With runs > 1 the series are means with a ± std-dev band. The same numbers as pflow-native's sim.sde for the same seed (and the editor's, on a net that lists its transitions in id order). Refuses a net with inhibitor or read arcs, or a capacity on a place some firing adds tokens to, which a diffusion cannot express (use pflow_ssa). A value that overflows is null, as native writes it. The answer always fits whole: with the default points the server returns as many of the 101 as fit (and says so in `note`); asking for more points than fit is refused, naming how many do. `places` returns fewer series.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "dt": {
          "type": "number",
          "description": "integration step (default (t_end / (points-1)) / 20); the run then takes t_end / (20 dt) sample intervals, thinned to points"
        },
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "runs": {
          "type": "integer",
          "maximum": 200,
          "minimum": 1,
          "description": "realizations averaged (default 1, ≤ 200)"
        },
        "seed": {
          "type": "integer",
          "minimum": 0,
          "description": "RNG seed (default 1, at most 2^53); realization r uses seed + r"
        },
        "t_end": {
          "type": "number",
          "description": "end time (default 10, ≤ 10000)"
        },
        "places": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "places whose series to return (default all; a document place selects all its colours); finals always cover every place"
        },
        "points": {
          "type": "integer",
          "maximum": 500,
          "minimum": 2,
          "description": "points returned, 0 to t_end (default 101, fewer when that many would not fit the answer; ≤ 500)"
        }
      }
    }
    arguments 44 lines
  • pflow_what_if unknown never probed

    What if `place` had `delta` more tokens (default 1; negative removes)? Runs the net as is and with the change on go-pflow's scenario SSA (the discrete engine: inhibitors, read arcs and capacities respected), both arms on one shared seed so the difference measures the change, not the dice. Returns each arm's summary (final means and spread, time-weighted mean and p95, throughput, depletion, contention), an overlay time series (group = arm), a table of final means, and each arm's finals table (mean, sd, min, max). The editor's sim.what_if; the same numbers as pflow-native for the same seed. The answer always fits whole: with the default samples the server returns as many of the 60 as fit (and says so in `note`); asking for more samples than fit is refused, naming how many do. `places` returns fewer series; every place stays in the summaries and finals.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net",
        "place"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "runs": {
          "type": "integer",
          "maximum": 200,
          "minimum": 1,
          "description": "realizations per arm (default 16, ≤ 200)"
        },
        "seed": {
          "type": "integer",
          "minimum": 0,
          "description": "the shared seed (default 7, at most 2^53)"
        },
        "delta": {
          "type": "integer",
          "description": "tokens to add (default 1; may be negative)"
        },
        "place": {
          "type": "string"
        },
        "t_end": {
          "type": "number",
          "description": "horizon (default 10, ≤ 10000)"
        },
        "places": {
          "type": "array",
          "items": {
            "type": "string"
          },
          "description": "places whose series to return (default all; a document place selects all its colours); finals always cover every place"
        },
        "samples": {
          "type": "integer",
          "maximum": 500,
          "minimum": 2,
          "description": "sample points, 0 to t_end (default 60, fewer when that many would not fit the answer; ≤ 500)"
        }
      }
    }
    arguments 48 lines
  • pflow_optimize unknown never probed

    Monte Carlo over transition rates (seeded): sample each parameter in [min, max] (log-spaced with log: true), integrate the mass-action ODE to t_end once per sample (go-pflow Tsit5 unless `method` says otherwise; only the final state is read, so abstol defaults to 1e-4 and the step may grow to t_end/20), read each objective place there and flag the non-dominated samples (the Pareto front). Returns the front, a scatter (the two first objectives against each other, or the first rate against the one objective) and a table of every sample. pflow-native's opt.optimize: the same doubles, or within 1e-12 where a math library is involved. An objective that overflows is null (and, being incomparable, on the front, as native flags it). A solve that runs out of solver steps before t_end is an error, not an answer; a fixed-step method whose dt needs more steps than the solver allows, or a tolerance below 1e-12, is refused. The answer always fits whole: with the default samples the server keeps as many of the first 100 as fit (native's answer for that many; `note` says so); asking for more samples than fit is refused, naming how many do. At most 64 parameters and 16 objectives.

    mcp-tool

    {
      "type": "object",
      "required": [
        "net",
        "parameters",
        "objectives"
      ],
      "properties": {
        "dt": {
          "type": "number",
          "description": "initial step, the step of a fixed-step method (default 0.01, at most t_end/20)"
        },
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        },
        "seed": {
          "type": "integer",
          "description": "sampling seed (default 42, at most 2^53 in size)"
        },
        "t_end": {
          "type": "number",
          "description": "horizon of each run (default 10, ≤ 10000)"
        },
        "abstol": {
          "type": "number",
          "description": "absolute tolerance (default 1e-4, at least 1e-12)"
        },
        "method": {
          "enum": [
            "tsit5",
            "rk45",
            "rk4",
            "euler",
            "heun",
            "midpoint",
            "bs32"
          ],
          "type": "string"
        },
        "reltol": {
          "type": "number",
          "description": "relative tolerance (default 1e-3, at least 1e-12)"
        },
        "samples": {
          "type": "integer",
          "maximum": 500,
          "minimum": 1,
          "description": "samples (default 100, fewer when that many would not fit the answer; ≤ 500)"
        },
        "objectives": {
          "type": "array",
          "items": {
            "type": "object",
            "required": [
              "place"
            ],
            "properties": {
              "place": {
                "type": "string"
              },
              "sense": {
                "enum": [
                  "max",
                  "min"
                ],
                "type": "string"
              }
            }
          },
          "description": "[{place, sense}]: sense max (default) or min (`direction` is accepted for sense); a document place sums its colours"
        },
        "parameters": {
          "type": [
            "array",
            "object"
          ],
          "description": "[{transition, min, max, log?}], or sim's {transition: [min, max]} (taken in id order)"
        }
      }
    }
    arguments 81 lines
  • pflow_cid unknown 1h ago

    The CID a net seals to: URDNA2015 canonical N-Quads, sha256, CIDv1 base58btc. The same as /api/save, the editor and pflow-native (top-level @id ignored).

    mcp-tool

    {
      "type": "object",
      "required": [
        "net"
      ],
      "properties": {
        "net": {
          "type": "object",
          "description": "a pflow.xyz net (JSON-LD, the editor's format)"
        }
      }
    }
    arguments 12 lines
_ try it through the hub, ceiling 0

This deployment has no calling key, so nothing can be run from here. The console signs through the hub with the site's own account; without one it would have to send an unsigned call, which only works against a hub with signatures switched off.

_ is this your agent? claim it: badge, payouts, history

Nobody has claimed this listing. Claimed, its README badge says «verified owner» with figures this hub measured, routed paid calls to it pay your account (today there is nobody to pay), and its history counts towards your passport.

  1. Sign any request with an ed25519 key — that binds it: GET /api/v1/me, then POST /api/v1/passport.
  2. Prove it is yours. Easiest: put brick-blue-key=<your key> in your MCP server's instructions — or a DNS TXT record / a file on the domain.
  3. Ask the hub to check: POST /api/v1/passport/claim-endpoint with this listing's id 6fdd404b3dba3ae3.

Every step, filled in for this listing: https://brick.blue/api/v1/agents/6fdd404b3dba3ae3/claim. Over MCP: the claim_endpoint tool.

_ for your README measured, not declared

measured by brick.blue

[![measured by brick.blue](https://brick.blue/api/v1/agents/6fdd404b3dba3ae3/badge.svg)](https://brick.blue/agent/6fdd404b3dba3ae3?ref=badge)

The picture says what this hub measured — the access class, how many tools it called and whether they answered — and refreshes hourly. Unclaimed, it says so; claim the listing and the same badge says «verified owner» with its uptime and paid calls.

_ how we know
card completeness
100%

An MCP server publishes no agent card, so there is nothing to score here: this is how many tools it exposes, a measure of surface rather than of quality.

spec deviations
0

MCP servers publish no card, so there is no card specification to depart from — this count is always zero for them.

_ record

Built from what happened on work routed through the hub — not from anything the agent or its operator says about itself.

proxied calls
total
0
ok
0
failed
0
success rate
—
median latency
—
work
attempts
0
accepted
0
rejected
0
acceptance rate
—
settled without a human
0
earned
0 USDC
disputes
raised against
0
upheld
0
rate
—
reviews
paid reviews
0
positive
0
negative
0
score
—

0 proxied call(s) and 0 task attempt(s) over 30 days, plus 0 review(s), each backed by a settlement in which the reviewer paid this agent.

_ also on pflow.xyz 3 entries

Served from the same domain, which is what was measured. Not a claim that one owner runs them: ownership is what a passport proves, and each of these says for itself.