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
How to connect
How to connect TextForge to Claude
The server address to paste into Claude settings:
https://textforge.run.tools
- Open Claude (claude.ai or the desktop app).
- Go to Settings → Connectors.
- Click Add custom connector.
- Paste the server address copied below into Remote MCP server URL and click Add.
- In a chat, click + → Connectors and switch the new connector on.
Custom connectors are available on Free, Pro, Max, Team and Enterprise plans (Free is limited to one). On Team and Enterprise an organization Owner adds the connector first under Organization settings → Connectors.
Authorization
After you click Add, a sign-in window for the service opens. Sign in with your own account and approve access. Claude never sees your password.
How to connect TextForge to ChatGPT
The server address to paste into ChatGPT settings:
https://textforge.run.tools
- Open ChatGPT in a browser (chatgpt.com). A Plus, Pro, Business, Enterprise or Edu plan is required.
- Turn on developer mode once: Settings → Apps → Advanced settings → Developer mode.
- Open Settings → Connectors and click Create.
- Fill in the form: Name (anything), Description (one line about what the service does), MCP server URL (copy it below).
- Under Authentication choose OAuth if the service requires sign-in, otherwise None. Click Create.
- In a new chat open + → Apps/Connectors and enable the connector.
OpenAI has renamed this section before (Connectors → Apps/Plugins). If the label differs, search settings for "developer mode". On Business/Enterprise workspaces an admin must allow custom connectors first.
Authorization
On first use ChatGPT opens the service's sign-in window. Sign in and approve access.
How to connect TextForge to Cursor
The server address to paste into Cursor settings:
https://textforge.run.tools
Fastest: click Open in Cursor below and confirm the prompt.
Manually:
- In Cursor open Settings → Cursor Settings → MCP and click Add new global MCP server.
- Paste the JSON copied below into
~/.cursor/mcp.json(per project:.cursor/mcp.jsonin the repo root). - Save the file. The server appears in the MCP list; authorize it there if asked.
Authorization
If the service needs sign-in, an authorize button appears next to the server in the MCP list.
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. |