# MailFlat SDKs
Official client libraries for [MailFlat](https://mailflat.net): email inboxes your code owns, with
**one-line OTP retrieval**. Built for test suites (Selenium, pytest, Playwright) and AI agents.
Addresses are **permanent**, so a suite does not need a fresh one per run. Only the messages
expire, on a retention window you choose.
> This repo holds only the open-source SDKs. The MailFlat service itself is closed-source.
## Packages
| Package | For | Install |
|---|---|---|
| [`mailflat`](https://pypi.org/project/mailflat/) | Python | `pip install mailflat` |
| [`@mailflat/sdk`](https://www.npmjs.com/package/@mailflat/sdk) | JavaScript / TypeScript | `npm i @mailflat/sdk` |
| [`mailflat-mcp`](https://pypi.org/project/mailflat-mcp/) | AI assistants (Claude, Cursor) — MCP | `uvx mailflat-mcp` |
| [`@mailflat/ai-sdk`](https://www.npmjs.com/package/@mailflat/ai-sdk) | Vercel AI SDK agents | `npm i @mailflat/ai-sdk` |
| `mailflat.langchain` | LangChain agents | `pip install "mailflat[langchain]"` |
| `mailflat-sdk` (Java) | Java / Selenium | via [JitPack](https://jitpack.io) — see below |
Each client is a thin, typed wrapper over the same `/api/v1` Agent API, so they behave identically.
Authenticate with your account key (`mf_live_…`) from the dashboard (**Agents → API keys**).
## Java / Selenium (JitPack)
> JitPack derives the `groupId` from the GitHub owner. This repo moved to the official
> `MailFlat` account in August 2026, so releases from `v0.4.4` on publish as
> `com.github.MailFlat:mailflat-sdks`. Earlier versions still resolve under the old
> coordinate `com.github.onderyentar21:mailflat-sdks`; the old repo stays up for them.
> The client is moving to Maven Central (`net.mailflat`) next, which ends the owner coupling.
```xml
jitpack.iohttps://jitpack.io
com.github.MailFlat
mailflat-sdks
v0.8.1
```
```java
MailFlat mf = new MailFlat("mf_live_…");
Inbox inbox = mf.create("signup");
driver.findElement(By.id("email")).sendKeys(inbox.address());
String otp = inbox.waitForOtp(30); // polls until the code arrives
driver.findElement(By.id("code")).sendKeys(otp);
```
## Quick examples
**Python**
```python
from mailflat import MailFlat
mf = MailFlat(api_key="mf_live_…")
inbox = mf.create(label="signup")
otp = inbox.wait_for_otp(timeout=30)
```
**JavaScript / TypeScript**
```ts
import { MailFlat } from "@mailflat/sdk";
const mf = new MailFlat({ apiKey: process.env.MAILFLAT_API_KEY });
const inbox = await mf.create({ label: "signup" });
const otp = await inbox.waitForOtp({ timeout: 30000 });
```
## License
MIT. The full text is in `LICENSE` at the repository root; each package directory carries an identical copy.