TextForge
TextForge — Human Approval for AI Email <img src="https://raw.githubusercontent.com/textforge-app/openclaw-textforge/master/assets/textforge-logo.png"…
What it can do
- Sync Thread: Sync a thread from the email provider to fetch any new messages. Use this before composing a reply to ensure you have the latest conversation context. Requires 'threads:sync' permission.
- Delete Draft: Permanently delete a draft. Only drafts that will not be sent can be deleted: Draft (not yet submitted), Rejected, Expired, or SendFailed status. Cannot delete drafts that are PendingApp
- Submit Draft: Submit a draft for human approval. Note: create_draft automatically submits, so this is only needed for drafts that were not auto-submitted.
What data it sees
Do you need an account
No: the server works without sign-in
TextForge — Human Approval for AI Email
AI agents can read your inbox, draft replies, and manage threads — but nothing sends without you.
Start free trial → — 7 days free, no credit card required.
What It Does
TextForge is a hosted MCP server that gives AI agents access to Gmail with a mandatory human approval step on every outgoing email. Your agent handles the reading, searching, and drafting. You review and approve before anything sends.
Works with Claude Code, OpenClaw, Cursor, Windsurf, or any MCP-compatible client.
Installation
Not sure which config format your client needs? Use the TextForge MCP Setup Generator — pick your client, get the exact config to paste. Free, instant, no signup.
Claude Code (OAuth):
claude mcp add textforge https://textforge.net/mcp
Other clients (manual config):
{
"mcpServers": {
"textforge": {
"url": "https://textforge.net/mcp"
}
}
}
New users are walked through account creation on first connect (5–15 min). Existing users are connected in under 60 seconds.
Available Tools (22)
Draft Management
| Tool | What It Does |
|---|---|
create_draft |
Create a draft and submit for approval |
list_drafts |
List drafts with optional status/recipient filtering |
get_draft |
Get draft details including approval history |
update_draft |
Update draft content or recipients |
submit_draft |
Submit a draft for approval |
get_draft_activity |
View full draft activity log |
reject_draft |
Reject a pending draft |
delete_draft |
Delete a draft |
Thread Management
| Tool | What It Does |
|---|---|
list_threads |
List recent email threads |
list_engaged_threads |
Threads where you've sent messages |
get_thread |
Read a full thread |
get_thread_by_external_id |
Look up thread by provider ID |
sync_thread |
Sync a thread for latest messages |
sync_inbox |
Trigger full inbox sync |
search_messages |
Search with Gmail-style query syntax |
search_threads_by_contact |
Find threads by contact email |
import_thread |
Import a thread from your email provider |
Attachment Management
| Tool | What It Does |
|---|---|
list_message_attachments |
List attachments on a received message |
get_attachment_download_url |
Get presigned download URL for an attachment |
list_draft_attachments |
List attachments on a draft |
get_draft_attachment_upload_url |
Get presigned upload URL to attach a file |
remove_draft_attachment |
Remove an attachment from a draft |
Pricing
- Solo — $9.99/mo
- Pro — $19.99/mo
- 7-day free trial, no credit card required at signup
Server tool list (22)
Raw names from tools/list. Only developers need these.
| sync_thread | Sync a thread from the email provider to fetch any new messages. Use this before composing a reply to ensure you have the latest conversation context. Requires 'threads:sync' permission. |
| delete_draft | Permanently delete a draft. Only drafts that will not be sent can be deleted: Draft (not yet submitted), Rejected, Expired, or SendFailed status. Cannot delete drafts that are PendingApproval, Approved, or Sent. |
| submit_draft | Submit a draft for human approval. Note: create_draft automatically submits, so this is only needed for drafts that were not auto-submitted. |
| import_thread | Import a specific thread by its provider thread ID (e.g., Gmail thread ID from search_messages). If the thread already exists locally, syncs it instead. Use after search_messages when get_thread_by_external_id returns 'not found'. Requires 'threads:sync' permission. |
| get_thread | Get full details of a specific email thread including messages. By default returns the latest 5 messages with quoted reply content stripped to reduce payload size. Set maxMessages=0 for all messages, stripQuotedReplies=false for full body text. Returns pre-computed threading headers (In-Reply-To, References) needed for proper email threading. |
| search_messages | Search provider threads using delegated search syntax. Returns thread summaries only (thread ID, snippet). Use get_thread to fetch full messages. Requires 'threads:read' permission. |
| list_message_attachments | List attachments for a received email message. Returns attachment metadata including filename, MIME type, and size. Use get_attachment_download_url to download content. |
| get_thread_by_external_id | Look up a thread by the provider's thread ID. By default returns the latest 5 messages with quoted reply content stripped. Set maxMessages=0 for all messages, stripQuotedReplies=false for full body text. Useful when you have a thread ID from provider API responses or email headers. |
| get_draft_activity | Get the complete activity history for a draft, including creation, updates, approval/rejection, and sending events. |
| get_draft | Get detailed information about a specific draft including subject, body, recipients, status, and approval history. |
| remove_draft_attachment | Remove an attachment from a draft email. The attachment will be permanently deleted. |
| reject_draft | Reject a draft that is pending approval. Only drafts in 'PendingApproval' status can be rejected. Use this to withdraw a draft that should not be sent. |
| list_engaged_threads | List threads where you have previously sent at least one message, ordered by most recent activity. Use this to find conversations you are actively participating in. |
| sync_inbox | Trigger a full inbox sync to discover new threads and update existing ones from the email provider. Like hitting refresh in an email client. Use this when you need to find recently arrived emails that aren't yet in TextForge. Requires 'threads:sync' permission. |
| get_draft_attachment_upload_url | Get a presigned URL to upload an attachment to a draft. The URL is single-use and expires in 10 minutes. Use HTTP PUT to upload raw file bytes to the returned URL. |
| get_attachment_download_url | Get a presigned URL to download an attachment. The URL expires in 10 minutes. Works for both message attachments and draft attachments. |
| list_threads | List email threads (conversations) for the authenticated user's organization. Threads are created when emails are sent and track both outbound and inbound messages. Use this to find threads for context when composing replies. |
| update_draft | Update an existing draft's content. Only drafts in 'Draft' or 'PendingApproval' status can be updated. |
| create_draft | Create a new email draft and submit it for human approval. This is the primary way for LLM agents to initiate the email sending workflow. The draft will be created and automatically submitted for approval. To create a reply to an existing thread, provide either threadId or externalThreadId. |
| list_draft_attachments | List attachments currently attached to a draft email. Returns attachment metadata including filename, MIME type, size, and upload time. |
| search_threads_by_contact | Search for email threads involving a specific contact (email address). Searches across From, To, and CC fields of all messages in threads. Useful for finding all email history with a particular person or company. |
| list_drafts | List email drafts with optional filtering by status or recipient email. Returns paginated results with draft metadata including subject, status, recipients, and creation info. |