added disposable email skill#560
Conversation
There was a problem hiding this comment.
Pull request overview
Note
Copilot was unable to run its full agentic suite in this review.
Adds a new “disposable_email” skill document to guide using Mail.tm as a live disposable inbox for workflows like signups, OTPs, password resets, and magic links.
Changes:
- Introduces a reusable workflow for creating/authenticating Mail.tm accounts and reading messages
- Documents key Mail.tm endpoints with example Python/cURL requests
- Provides sample response shapes plus snippets for extracting URLs/OTPs
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
| "@type": "Source", | ||
| "data": "Received: from mail.example.com...\r\nSubject: Verify your email\r\n...", | ||
| "downloadUrl": "https://api.mail.tm/messages/<msg_id>/source", | ||
| "mimeTree": { ... }, |
Greptile SummaryAdds a
Confidence Score: 4/5Safe to merge with the caveat that agents following the Python example verbatim cannot clean up created accounts. The Python example captures resp from account creation but discards it without extracting resp[id], making it impossible for a reading agent to supply the account ID to the DELETE /accounts/{id} endpoint that the Constraints section explicitly requires. strix/skills/custom/disposable_email.md — specifically the Python example block around account creation and cleanup. Important Files Changed
Prompt To Fix All With AIFix the following 1 code review issue. Work through them one at a time, proposing concise fixes.
---
### Issue 1 of 1
strix/skills/custom/disposable_email.md:69-72
**Account ID silently discarded — cleanup step is unreachable**
`resp` is assigned but never used, so `resp["id"]` (the account ID required by `DELETE /accounts/{id}`) is immediately lost. The Constraints section explicitly instructs agents to clean up with `DELETE /accounts/{id}`, but an agent following the example code has no value to substitute for `{id}`. The variable should capture `account_id = resp["id"]` immediately after creation, and a corresponding delete call should be shown at the end of the example — ideally in a `finally` block — to make the documented cleanup step executable.
Reviews (2): Last reviewed commit: "Enhance disposable email skill documenta..." | Re-trigger Greptile |
| requests.get(f"{BASE}/domains").json() | ||
|
|
||
| # Create an account | ||
| requests.post( | ||
| f"{BASE}/accounts", | ||
| json={"address": "user@web-library.net", "password": "secret"}, | ||
| ).json() | ||
|
|
There was a problem hiding this comment.
Hardcoded email address will cause 422 conflicts and the hardcoded domain may not be available
The examples fix the address to user@web-library.net, but Mail.tm rejects account creation with 422 if that address is already registered — which is almost certain across repeated test runs. Separately, Mail.tm's available domains rotate over time; web-library.net may no longer be listed when an agent reads this skill. The workflow already documents GET /domains as the first step; the example should actually call it, pick a domain from hydra:member, and combine it with a randomly generated local-part before calling POST /accounts. Without that, the account-creation step will fail silently in most automated runs.
Prompt To Fix With AI
This is a comment left during a code review.
Path: strix/skills/custom/disposable_email.md
Line: 63-70
Comment:
**Hardcoded email address will cause 422 conflicts and the hardcoded domain may not be available**
The examples fix the address to `user@web-library.net`, but Mail.tm rejects account creation with `422` if that address is already registered — which is almost certain across repeated test runs. Separately, Mail.tm's available domains rotate over time; `web-library.net` may no longer be listed when an agent reads this skill. The workflow already documents `GET /domains` as the first step; the example should actually call it, pick a domain from `hydra:member`, and combine it with a randomly generated local-part before calling `POST /accounts`. Without that, the account-creation step will fail silently in most automated runs.
How can I resolve this? If you propose a fix, please make it concise.| |--------|------------------------|-----------------------------------------| | ||
| | `GET` | `/domains` | List available email domains | | ||
| | `POST` | `/accounts` | Create a temporary mailbox account | | ||
| | `POST` | `/token` | Authenticate and receive a Bearer token | | ||
| | `GET` | `/me` | Get current account info | | ||
| | `GET` | `/messages` | List inbox messages | | ||
| | `GET` | `/messages/{id}` | Read a message | | ||
| | `GET` | `/messages/{id}/source` | Read raw RFC 2822 message source | | ||
|
|
There was a problem hiding this comment.
DELETE /accounts/{id} endpoint is absent from the API table
Mail.tm exposes DELETE /accounts/{id} for removing a mailbox. Without it, agents have no way to clean up accounts between test runs, which matters for quota exhaustion and for keeping a test environment tidy. Adding it to the endpoint table and noting it in the constraints section would complete the lifecycle coverage.
Prompt To Fix With AI
This is a comment left during a code review.
Path: strix/skills/custom/disposable_email.md
Line: 30-38
Comment:
**`DELETE /accounts/{id}` endpoint is absent from the API table**
Mail.tm exposes `DELETE /accounts/{id}` for removing a mailbox. Without it, agents have no way to clean up accounts between test runs, which matters for quota exhaustion and for keeping a test environment tidy. Adding it to the endpoint table and noting it in the constraints section would complete the lifecycle coverage.
How can I resolve this? If you propose a fix, please make it concise.| "updatedAt": "2026-01-01T00:00:00+00:00" | ||
| } | ||
| ] | ||
| } | ||
| ``` | ||
|
|
||
| ### GET /messages/{id} | ||
|
|
||
| ```json | ||
| { | ||
| "@id": "/messages/<msg_id>", | ||
| "@type": "Message", | ||
| "id": "<msg_id>", | ||
| "from": { | ||
| "address": "noreply@example.com", |
There was a problem hiding this comment.
html field in the message response is an array, not a plain string
Mail.tm's GET /messages/{id} response returns html as an array of strings (e.g. ["<html>...</html>"]), not a bare string. The example shows "html": "<html>...</html>", which will mislead agents that index or iterate the field. The extraction snippet in the "Extracting Useful Data" section concatenates message.get("html", "") as a string, which would also silently produce "['<html>...']" instead of the actual HTML if the field is an array. Both the response schema and the extraction example should reflect the array shape.
Prompt To Fix With AI
This is a comment left during a code review.
Path: strix/skills/custom/disposable_email.md
Line: 196-210
Comment:
**`html` field in the message response is an array, not a plain string**
Mail.tm's `GET /messages/{id}` response returns `html` as an array of strings (e.g. `["<html>...</html>"]`), not a bare string. The example shows `"html": "<html>...</html>"`, which will mislead agents that index or iterate the field. The extraction snippet in the "Extracting Useful Data" section concatenates `message.get("html", "")` as a string, which would also silently produce `"['<html>...']"` instead of the actual HTML if the field is an array. Both the response schema and the extraction example should reflect the array shape.
How can I resolve this? If you propose a fix, please make it concise.| resp = requests.post( | ||
| f"{BASE}/accounts", | ||
| json={"address": f"{local}@{domain}", "password": "secret"}, | ||
| ).json() |
There was a problem hiding this comment.
Account ID silently discarded — cleanup step is unreachable
resp is assigned but never used, so resp["id"] (the account ID required by DELETE /accounts/{id}) is immediately lost. The Constraints section explicitly instructs agents to clean up with DELETE /accounts/{id}, but an agent following the example code has no value to substitute for {id}. The variable should capture account_id = resp["id"] immediately after creation, and a corresponding delete call should be shown at the end of the example — ideally in a finally block — to make the documented cleanup step executable.
Prompt To Fix With AI
This is a comment left during a code review.
Path: strix/skills/custom/disposable_email.md
Line: 69-72
Comment:
**Account ID silently discarded — cleanup step is unreachable**
`resp` is assigned but never used, so `resp["id"]` (the account ID required by `DELETE /accounts/{id}`) is immediately lost. The Constraints section explicitly instructs agents to clean up with `DELETE /accounts/{id}`, but an agent following the example code has no value to substitute for `{id}`. The variable should capture `account_id = resp["id"]` immediately after creation, and a corresponding delete call should be shown at the end of the example — ideally in a `finally` block — to make the documented cleanup step executable.
How can I resolve this? If you propose a fix, please make it concise.
Summary
Adds a
disposable_emailskill using Mail.tm for live disposable inbox workflows.Changes
disposable_emailskillUse Cases
This skill helps test email-based authentication workflows, including:
Related Issue
Closes #559