Cloud storage and incoming email for Gemini CLI
Use Gemini CLI to save files in Revdoku, pick up another agent’s work, and read incoming emails and attachments.
Connect your AI app to an inbox.
Create and manage email inboxes, read emails and attachments, and store files with your AI agents. See connection steps.
Run ChatGPT Desktop, open Settings → MCP servers, and add a custom Streamable HTTP server. Paste the URL below and save.
Open Customize → Connectors → + → Add custom connector. Paste the URL below and save.
POST /v1/buckets
Host: api.revdoku.com
Authorization: Bearer YOUR_API_KEY
Content-Type: application/json
{
"bucket": {
"email": {
"username": "acme-orders",
"domain": "revdokumail.com"
}
}
}
curl --fail-with-body --request POST \
'https://api.revdoku.com/v1/buckets' \
--header "Authorization: Bearer $REVDOKU_API_KEY" \
--header 'Content-Type: application/json' \
--data '{
"bucket": {
"email": {
"username": "acme-orders",
"domain": "revdokumail.com"
}
}
}'
revdoku create \
--username acme-orders \
--domain revdokumail.com
Install the CLI, then run revdoku login once.
const response = await fetch("https://api.revdoku.com/v1/buckets", {
method: "POST",
redirect: "error",
signal: AbortSignal.timeout(30000),
headers: {
Authorization: `Bearer ${process.env.REVDOKU_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
bucket: {
email: {
username: "acme-orders",
domain: "revdokumail.com"
}
}
})
});
const result = await response.json();
if (!response.ok) {
throw new Error(`${result.error.code}: ${result.error.message}`);
}
console.log(JSON.stringify(result, null, 2));
const response = await fetch("https://api.revdoku.com/v1/buckets", {
method: "POST",
redirect: "error",
signal: AbortSignal.timeout(30000),
headers: {
Authorization: `Bearer ${process.env.REVDOKU_API_KEY}`,
"Content-Type": "application/json"
},
body: JSON.stringify({
bucket: {
email: {
username: "acme-orders",
domain: "revdokumail.com"
}
}
})
});
const result: {
error?: { code: string; message: string };
data?: unknown;
} = await response.json();
if (!response.ok) {
throw new Error(`${result.error?.code}: ${result.error?.message}`);
}
console.log(JSON.stringify(result, null, 2));
import json
import os
import requests
response = requests.post(
"https://api.revdoku.com/v1/buckets",
headers={
"Authorization": f"Bearer {os.environ['REVDOKU_API_KEY']}",
"Content-Type": "application/json",
},
timeout=30,
allow_redirects=False,
json={
"bucket": {
"email": {
"username": "acme-orders",
"domain": "revdokumail.com",
}
}
},
)
result = response.json()
if not response.ok:
raise RuntimeError(f"{result['error']['code']}: {result['error']['message']}")
print(json.dumps(result, indent=2))
using System.Net.Http.Headers;
using System.Text.Json;
using System.Net.Http.Json;
var apiKey = Environment.GetEnvironmentVariable("REVDOKU_API_KEY")
?? throw new Exception("Set REVDOKU_API_KEY first");
using var client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", apiKey);
using var response = await client.PostAsJsonAsync(
"https://api.revdoku.com/v1/buckets",
new
{
bucket = new
{
email = new
{
username = "acme-orders",
domain = "revdokumail.com"
}
}
});
using var result = JsonDocument.Parse(await response.Content.ReadAsStringAsync());
if (!response.IsSuccessStatusCode)
{
var error = result.RootElement.GetProperty("error");
throw new Exception($"{error.GetProperty("code").GetString()}: {error.GetProperty("message").GetString()}");
}
Console.WriteLine(JsonSerializer.Serialize(result.RootElement, new JsonSerializerOptions { WriteIndented = true }));
201 Created
{
"success": true,
"data": {
"bucket": {
"id": "bkt_example",
"email": {
"address": "[email protected]",
"receiving_enabled": true,
"sending_enabled": false
}
}
}
}
AI agent? Create an account via API →
Connect and test
For a local session with shell access, let the agent follow the Revdoku setup instructions and complete sign-in in the browser. For a client with remote MCP and OAuth support, use the hosted MCP connection.
Then ask:
Select my project bucket. Save a short handoff note as README.md, read it back, and show me its version history. Tell me the bucket’s incoming email address.
A remote MCP server cannot read arbitrary local files. Use the local skill or CLI when the files are on your computer.
Share a bucket with another agent
Choose the intended account and bucket, then authorize each agent with the access it needs. Multiple agents can read and update the same files. An account can have multiple buckets for separate projects.
Use version notes, atomic appends, and temporary locks to coordinate changes. Review the history and access logs in the Revdoku dashboard.
Read incoming email
Every bucket has its own incoming email address. Messages and attachments are saved as files agents can read. Use the address for a service signup, then let your agent read the verification code or link and complete the browser step. Later account notifications arrive in the same bucket.
See the signup and email workflow.