dsh-mail-reader
DeepSeek Harness 只读邮件插件:一个 email_read 工具读取 Gmail 与 Outlook,不实现发送、回复、删除、移动、标记或归档。 / Read-only mail for DSH: one email_read tool over Gmail and Outlook, with no send, reply, delete, move, mark, or archive capability. 适合需要让 Agent 安全读取邮件但禁止发送、删除等操作的任务。
Install
npx -p @deepseek-ai/dsh dsh plugin --profile web add github:DWJZ/dsh-mail-readerREADME
Read the full README ↗Configuration
| Field | Default | Meaning |
|---|---|---|
accounts | [] | The mailboxes the model may read; none by default |
accessTokenTtlSeconds | 3000 | Access-token validity used when the provider omits expires_in |
authorizationTimeoutMs | 300000 | Longest a first-time browser authorization may take |
requestTimeoutMs | 30000 | Deadline for one mailbox API call |
read | true | Register the email_read tool; false mounts the plugin with no tool |
defaultLimit | 10 | Messages returned when a call omits limit |
maxLimit | 50 | Hardest limit a call may request |
maxResultChars | 60000 | Character bound on one rendered result |
maxProviderResponseBytes | 16777216 | Largest provider response read; a larger one is refused before it is parsed |
maxRawBodyChars | 100000 | Largest raw message body; a larger one is omitted before HTML conversion |
maxNormalizedBodyChars | 20000 | Largest converted body kept for the model |
An account entry accepts only provider, clientIdEnv, clientSecretEnv, and (Outlook) tenant. There is no endpoint override: a field that could redirect a request is an error at load, not a deployment option. The account id is simultaneously the model-facing account argument and the credential record id, so it must be a lowercase hyphenated identifier.
How a response is bounded
The order is the guarantee:
HTTP response read → refused past maxProviderResponseBytes, before parsing
JSON parse
raw body size → past maxRawBodyChars, omitted before conversion
HTML → text
normalized body → cut at maxNormalizedBodyChars, with a marker
result → cut at maxResultChars, keeping whole messages
A body that is omitted for size is reported as "textOmitted": true and renders as [message body omitted: too large]; a body that was cut renders with an explicit [body truncated] marker. Neither case fails the call, and neither converts the oversized document first.