Skip to main content
proxy2model: every endpoint, page and role you captured, each tied to its request

// the instrument

Every claim cites the request that proves it, and the model names what the capture could not see. proxy2model turns the traffic you already capture into a model of the web app: its endpoints, pages, parameters and roles. It compares what each role reached and hands an AI cited evidence instead of raw traffic. It does not scan or attack, and it never calls anything a vulnerability: it gives hypotheses and the next safe check.

pypi tests secrets license

git clone https://github.com/falc0n-researcher/proxy2model && cd proxy2model && ./demo.sh

Sixty seconds, nothing to install, no network: four recorded OWASP Juice Shop sessions are modelled, anonymous is compared with a signed-in user, the surface the login opened is diffed, and the report opens.


// cross-role — what each role should not have reached

From the Juice Shop sample: an admin endpoint answered anonymous with 200, anonymous changed a product with PUT, and context.json is 37k tokens instead of about 440k of raw traffic

Record the app once per role (--role anon, --role user, ...) and ask what the lower one reached:

$ proxy2model cross-role juiceshop --low anon --high user
anon vs user: 2 privileged-looking reached · 3 object reads to test · 2 writes by anon · 31 untested · 12 enforced

'anon' reached privileged-looking endpoints (2)  [function-level authorization (OWASP API5)]
  GET /rest/admin/application-configuration    ev_93  anon=[200] user=[200]
    unknown: whether the low-role response was authorised or a leak · next: compare 'anon' and 'user' response bodies

'anon' changed state (2)  [function-level authorization (OWASP API5)]
  PUT /api/Products/{id}                       ev_285  anon=[200]
    unknown: whether 'anon' may PUT here on a record it does not own · next: confirm in the app's design ...

Each divergence is named for the question it raises:

Intent What it means The next safe check
privileged-looking reached the low role got through to an admin-style path compare both roles' response bodies
object reads the low role read an object by id (a BOLA question) ask for another account's id as the low role
writes the low role changed state and got a 2xx confirm the design allows it, on a record you own
untested only the high role ever tried it replay it as the low role
enforced 401/403 for the low role, 2xx for the high the control every other replay is compared with

// hand an AI the model, not the traffic

Raw traffic pasted into an LLM is huge, full of secrets, and invites guessing. context.json is the model packed for an AI: about 37k tokens for the Juice Shop capture instead of ~440k, every value masked, every fact tied to an evidence id, and rules the model must follow:

Cite an evidence id (ev_N) for every claim; each id is resolved in `evidence`.
Never name an endpoint, route or parameter that is not in this package.
State unknowns explicitly; do not guess authorization behaviour.
Treat an absence in this package as an absence in the capture, never in the target.

Or let an agent ask the model itself over MCP (proxy2model mcp): the same cited answers as the CLI, read-only. The skill is the method as a playbook an AI follows, nothing to install.


// diff — what changed since the last capture

Every build is kept. Capture the app again next week, or as another role, and ask what moved:

$ proxy2model diff juiceshop demo-anon demo-user
  1 new workflow(s) · 24 new · 42 changed · 3 gone
  ▸ route /profile  (79 things: 2 routes, 29 endpoints, 45 parameters, 2 auths, 1 role)
      /profile → /rest/user/change-password → DELETE /api/Addresss/{id} → ...

New workflows, changed fingerprints and what is gone, each with its requests: drift, never findings. proxy2model watch builds every export dropped into a folder and prints the change.


// intake

Traffic from Command
Burp (Save items XML), Logger++ CSV, Caido (JSON or CSV), or a HAR (browser, ZAP, mitmproxy) proxy2model FILE -w app
A browser it opens and records while you use the app proxy2model browse
A crawl of a running app proxy2model crawl URL -w app --yes

Every value is masked as it is read. One model comes out: a report, a SQLite graph you can query, OpenAPI, and a compact package for an AI. Runs locally.

pip install proxy2model
proxy2model history.xml -w shop     # build from an export
proxy2model browse                  # or open a browser and use the app (asks for URL, scope, mode)

proxy2model query shop help         # ask the model; answers cite requests, no AI involved
proxy2model mcp --out "$PWD/proxy2model-out"   # or let an AI agent ask (see Using it with an AI)

proxy2model on its own lists the everyday commands; proxy2model <command> --help explains each.


// what comes out

proxy2model-out/shop/
├── report.html     interactive report: overview, what to check, endpoints, map, every request, query console
├── model.json      the model, and the request behind every claim
├── openapi.json    the observed API, OpenAPI 3.0
├── context.json    what to hand an AI instead of raw traffic
├── graph.db        SQLite graph, queried with `proxy2model q`
├── exports/        graph.json · graph.graphml · build.svg
└── inputs/         masked records of every capture, merged on rebuild

// boundaries

It does It never
Read traffic you captured Upload, forward or replay it
Mask every value before the first write Store a token, cookie, key or PII value
Say what it could not observe Claim coverage it did not have
Offer hypotheses and the evidence to test them Call anything a vulnerability

A plain build is offline. crawl, browse --active and osint send requests of their own: use them only on systems you are authorized to test. CI plants fake secrets in the samples and fails if one reaches any output.


// field manual

fa1c0n@recon ~ $   every claim cites a request · every gap is named

Metadata

Release files for proxy2model 2.1.0

For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.

Source distribution (sdist)

Source distribution for proxy2model 2.1.0
File Size Uploaded Provenance Actions
proxy2model-2.1.0.tar.gz 1.9 MB With provenance Details for proxy2model-2.1.0.tar.gz

Built distribution (wheel)

Table of built distributions (wheels) for proxy2model 2.1.0
File Interpreter ABI Platform Actions
proxy2model-2.1.0-py3-none-any.whl Python 3 none any Details for proxy2model-2.1.0-py3-none-any.whl

Total release size: 2.4 MB

Release files / proxy2model-2.1.0.tar.gz

Download URL proxy2model-2.1.0.tar.gz
Size 1.9 MB
Tags Source
SHA-256 checksum
How to use checksums
9be854ecc4fadddbd44fac502a1e061e093ac187f49245de46acb1ba8b23fd71
BLAKE2b-256 checksum
How to use checksums
62fa16b625154871cff9b5d434cc48a3b5a1ddf50ec47dce4eb21f50721c2af9
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Release files / proxy2model-2.1.0-py3-none-any.whl

Download URL proxy2model-2.1.0-py3-none-any.whl
Size 494.8 kB
Tags Python 3
SHA-256 checksum
How to use checksums
e8a6e950334615183c2f43ef9cd236be44aa74087cd53dcb01e381037cbea1b4
BLAKE2b-256 checksum
How to use checksums
25cf54d58bb977f01ba1419fa51817ce273706cff33e09649a690913158fc94a
Upload date
Uploaded using Trusted Publishing?
What is trusted publishing?
Yes
Uploaded via twine/7.0.0 CPython/3.13.16

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

Security for proxy2model 2.1.0

Provenance

Provenance describes where a file came from. On PyPI, provenance is shared via attestations, which provide a verifiable record of the build or publishing details. View details, limitations and caveats.

Full provenance

Both files in this release have been uploaded with provenance metadata.

Select from 2 files

Attestation for proxy2model-2.1.0.tar.gz

PyPI Publish Attestation

PyPI verified that this artifact, at this checksum, originated from the publisher listed below.

Signed by GitHub Actions, verified by PyPI on Nov 5, 2026.

Transparency log

A note on package security

PyPI is a repository for distributing packages, not a service for auditing them. While third-party security researchers and our staff do their best to detect and remove malicious packages, PyPI cannot guarantee the quality, security or suitability of any given package.

To learn more about protecting yourself from malicious actors, visit our package security documentation.

Anthropic, PBC Visionary sponsor Bloomberg Visionary sponsor Hudson River Trading Visionary sponsor Meta Visionary sponsor NVIDIA Visionary sponsor Microsoft Sustainability sponsor Depot Continuous Integration AWS Cloud computing and Security Sponsor Datadog Monitoring Fastly CDN Google Download Analytics Sentry Error logging StatusPage Status page