# `MPP`
[🔗](https://github.com/ZenHive/mpp/blob/v0.10.0/lib/mpp.ex#L1)

Elixir implementation of the [Machine Payments Protocol](https://mpp.dev) (MPP).

MPP enables machine-to-machine payments via HTTP 402. This library provides
Plug middleware that adds pay-per-call billing to any Phoenix or Plug application.

## How it works

1. Client requests a protected resource
2. Server responds with `402 Payment Required` and a payment challenge
3. Client fulfills payment (Stripe, stablecoins, or on-chain)
4. Client retries with payment credential in `Authorization: Payment` header
5. Server verifies payment and returns the resource with a `Payment-Receipt` header

No user accounts. No API keys. No signup flow. Payment is authentication.

## Protocol

Built on the [MPP specification](https://github.com/tempoxyz/mpp-specs) —
an IETF draft co-developed by Stripe and Tempo Labs. Also supports
[x402](https://docs.x402.org) for on-chain payments.

## Modules

  * `MPP.Plug` — Plug middleware implementing the 402 payment handshake
  * `MPP.Challenge` — HMAC-SHA256 bound challenge creation and verification
  * `MPP.Credential` — Payment credential encoding/decoding
  * `MPP.Receipt` — Proof-of-payment receipt serialization
  * `MPP.Headers` — WWW-Authenticate, Authorization, Payment-Receipt header formatting
  * `MPP.AcceptPayment` — Accept-Payment client-preference header parse/format/rank
  * `MPP.Errors` — RFC 9457 Problem Detail error types
  * `MPP.Method` — Behaviour for pluggable payment methods
  * `MPP.Methods.Stripe` — Stripe SPT payment verification
  * `MPP.Methods.Tempo` — Tempo on-chain TIP-20 payment verification
  * `MPP.Methods.EVM` — Generic EVM on-chain payment verification (any EVM chain)
  * `MPP.Intents.Charge` — Charge intent request schema
  * `MPP.BodyDigest` — SHA-256 body digest computation and verification
  * `MPP.Amount` — Amount/decimals helpers (parse_units, dollar parsing)
  * `MPP.Expires` — Expiration timestamp helpers (duration offsets, assert!)
  * `MPP.DID` — DID helpers for EVM credential sources
  * `MPP.JCS` — RFC 8785 JSON Canonicalization Scheme for HMAC interop
  * `MPP.Verifier` — Transport-neutral payment credential verification
  * `MPP.Mcp` — MCP (JSON-RPC) transport constants and helpers
  * `MPP.Client.PaymentProvider` — Behaviour for client-side payment providers
  * `MPP.Client.MultiProvider` — Multi-provider dispatch (first-match routing)
  * `MPP.Client.AcceptPolicy` — Gate `Accept-Payment` header injection by URL

## Discovery

Use `MPP.describe/0-2` for progressive API discovery:

    MPP.describe()                          # Level 1: all modules
    MPP.describe(:challenge)                # Level 2: functions in Challenge
    MPP.describe(:challenge, :create)       # Level 3: full contract for create/2

# `__descripex_modules__`

```elixir
@spec __descripex_modules__() :: [module()]
```

Return the list of modules registered with this library.

# `describe`

```elixir
@spec describe() :: [map()]
```

Return a Level 1 overview of all modules in this library.

# `describe`

```elixir
@spec describe(module() | atom()) :: [map()]
```

Return Level 2 function list for a module (by full atom or short name).

# `describe`

```elixir
@spec describe(module() | atom(), atom()) :: map() | nil
```

Return Level 3 function detail (or `nil` if not found).

---

*Consult [api-reference.md](api-reference.md) for complete listing*
