> **Can't find what you're looking for?** Use `search_docs` on the docs MCP server at `https://mpp.dev/api/mcp` to find what you need.

# Rust SDK \[The mpp Rust library]

## Overview

The `mpp` Rust library provides a typed interface over the Machine Payments Protocol, from high-level abstractions to low-level primitives and building blocks.

<div className="flex gap-2">
  [GitHub: tempoxyz/mpp-rs](https://github.com/tempoxyz/mpp-rs)

  Maintained by [Tempo](https://github.com/tempoxyz)
</div>

## Install

```bash [install.sh]
$ cargo add mpp
```

With Tempo blockchain support:

```bash [install-with-tempo.sh]
$ cargo add mpp --features tempo,client,server
```

## Requirements

* Rust 1.75+
* `reqwest` for HTTP requests
* `alloy` for Tempo signing (with the `tempo` feature)

## Quick start

### Server

```rust
use mpp::server::{Mpp, tempo, TempoConfig};
use mpp::{parse_authorization, format_www_authenticate};

let mpp = Mpp::create(tempo(TempoConfig {
    recipient: "0xf39Fd6e51aad88F6F4ce6aB8827279cffFb92266",
}))?;

// Generate a Challenge for $0.50
let challenge = mpp.charge("0.50")?;
let header = format_www_authenticate(&challenge)?;
// → respond with 402 + WWW-Authenticate header

// Later, verify the Credential from the retry request
let credential = parse_authorization(auth_header)?;
let receipt = mpp.verify_credential(&credential).await?;
// → respond with 200 + paid content
```

### Client

```rust
use mpp::client::{Fetch, TempoProvider};
use mpp::PrivateKeySigner;

let signer: PrivateKeySigner = "0xac0974bec..."
    .parse()?;
let provider = TempoProvider::new(signer, "https://rpc.tempo.xyz")?;

// Handles 402 automatically — pay and retry
let response = reqwest::Client::new()
    .get("https://api.example.com/paid")
    .send_with_payment(&provider)
    .await?;
```

## Feature flags

| Feature | Description |
|---------|-------------|
| `client` | Client-side providers, `Fetch` extension trait |
| `evm` | Shared EVM utilities (Address, U256, signing) |
| `middleware` | reqwest-middleware integration (implies `client`) |
| `server` | Server verification, `ChargeMethod` trait |
| `tempo` | Tempo blockchain support (includes `evm`) |

### Common combinations

```toml
# Client only
mpp = { version = "0.10.3", features = ["tempo", "client"] }

# Server only
mpp = { version = "0.10.3", features = ["tempo", "server"] }

# Both
mpp = { version = "0.10.3", features = ["tempo", "client", "server"] }

# With middleware
mpp = { version = "0.10.3", features = ["tempo", "client", "middleware"] }
```

## Next steps

* [Core types](/sdk/rust/core): Challenge, Credential, and Receipt primitives
* [Client](/sdk/rust/client): Handle `402` responses automatically
* [Server](/sdk/rust/server): Protect endpoints with payments
