Skip to content

Commit 8b6e67c

Browse files
feat: optimize contact enforcement with batch queries + add SPA support
Performance optimization for send_message contact policy checks: - Replace N+1 per-recipient queries with batch fetches - Pre-fetch recent message contacts in two efficient queries: 1. Messages sent by sender TO recipients within TTL 2. Messages sent BY recipients TO sender within TTL - Pre-fetch all approved AgentLink records in single query - Store results in sets for O(1) lookup during recipient iteration - Remove obsolete per-recipient raw SQL and ORM queries - Fix: contact enforcement now applies regardless of ack_required flag (previously ack_required=true bypassed all contact checks) HTTP transport improvements (http.py): - Change default HTTP_PATH from /mcp/ to /api/ for consistency - Add StaticFiles mount for web/ directory when present - Add SPA fallback: 404s on non-API paths serve index.html - Fix server_task cleanup: check done() before cancel to avoid errors - Add proper exception handler for SPA routing Config changes: - Update default HTTP_PATH in config.py This significantly reduces database round-trips when sending messages to multiple recipients with contact enforcement enabled, especially in projects with many agents. Co-Authored-By: Claude <noreply@anthropic.com>
1 parent b5088df commit 8b6e67c

19 files changed

+179
-75
lines changed

.beads/issues.jsonl

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
{"id":"bd-10s","title":"Document attachment_paths resolution semantics","description":"README/docs do not state how attachment_paths are resolved; currently non-absolute paths resolve relative to the project archive root. Clarify in README and/or adjust behavior.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-20T04:20:51.344765737Z","created_by":"ubuntu","updated_at":"2026-01-20T22:03:51.146956183Z","closed_at":"2026-01-20T22:03:51.146912761Z","close_reason":"Document attachment_paths resolution (archive root)","source_repo":".","compaction_level":0,"original_size":0}
2-
{"id":"bd-11g","title":"mcp-toon-fixtures-expand","description":"Capture additional real-world fixtures (fetch_inbox, file_reservation_paths, macro_start_session) in /dp/toon_test_fixtures/real_world for bd-21h; document sizes and token savings.","status":"open","priority":2,"issue_type":"task","created_at":"2026-01-24T20:29:11.761111953Z","created_by":"ubuntu","updated_at":"2026-01-24T20:29:11.761111953Z","source_repo":".","compaction_level":0,"original_size":0}
2+
{"id":"bd-11g","title":"mcp-toon-fixtures-expand","description":"Capture additional real-world fixtures (fetch_inbox, file_reservation_paths, macro_start_session) in /dp/toon_test_fixtures/real_world for bd-21h; document sizes and token savings.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-24T20:29:11.761111953Z","created_by":"ubuntu","updated_at":"2026-02-01T20:20:44.024919326Z","closed_at":"2026-02-01T20:20:44.024830899Z","source_repo":".","compaction_level":0,"original_size":0}
33
{"id":"bd-11w","title":"Add Factory Droid (~/.factory) integration support (GH #63)","description":"Add detection and configuration for Factory Droid AI coding tool. Need to add ~/.factory to installer script and update documentation.","status":"closed","priority":3,"issue_type":"feature","created_at":"2026-01-21T20:14:36.166776741Z","created_by":"ubuntu","updated_at":"2026-01-21T21:10:21.577919248Z","closed_at":"2026-01-21T21:10:21.577566844Z","close_reason":"Added ~/.factory detection, created integrate_factory_droid.sh, updated README","external_ref":"https://github.com/Dicklesworthstone/mcp_agent_mail/issues/63","source_repo":".","compaction_level":0,"original_size":0}
44
{"id":"bd-17e","title":"Clarify RBAC behavior for bearer-only deployments","description":"RBAC defaults to reader role; with JWT disabled and bearer-only auth, remote tool calls may be blocked unless RBAC is configured. Document expected setup or adjust defaults/logic.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-20T04:21:02.328996395Z","created_by":"ubuntu","updated_at":"2026-01-20T22:08:03.215698437Z","closed_at":"2026-01-20T22:08:03.215651018Z","close_reason":"Document bearer-only RBAC behavior","source_repo":".","compaction_level":0,"original_size":0}
55
{"id":"bd-2bi","title":"Clear notification signal when inbox is read","description":"clear_notification_signal is defined but never used. Consider clearing signals after fetch_inbox/mark_message_read/mark-all-read to avoid stale notifications.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-20T04:25:44.983178631Z","created_by":"ubuntu","updated_at":"2026-01-20T04:41:40.218069437Z","closed_at":"2026-01-20T04:41:40.218026656Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0}
@@ -13,7 +13,7 @@
1313
{"id":"bd-3lz","title":"Optimize historical inbox snapshot commit traversal","description":"get_historical_inbox_snapshot iterates up to 10k commits without path scoping; consider limiting to inbox path or using git rev-list with path filter to reduce cost on large archives.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-20T04:11:51.610711768Z","created_by":"ubuntu","updated_at":"2026-01-20T04:48:11.933110087Z","closed_at":"2026-01-20T04:48:11.933067517Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0}
1414
{"id":"bd-3ss","title":"Handle Z-suffixed timestamps in write_message_bundle","description":"write_message_bundle uses datetime.fromisoformat without handling trailing Z; add robust parsing (accept Z and offsets) and tests.","status":"closed","priority":2,"issue_type":"task","created_at":"2026-01-20T04:11:19.761582730Z","created_by":"ubuntu","updated_at":"2026-01-20T04:42:58.006562906Z","closed_at":"2026-01-20T04:42:58.006519023Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0}
1515
{"id":"bd-7z9","title":"Review server-side file reservation enforcement semantics","description":"send_message enforcement checks reservation patterns against mail archive paths (agents/*/inbox/outbox). Docs describe reservations as project file paths; review mismatch, decide intended enforcement surface, and update logic or docs.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-20T04:12:09.220672324Z","created_by":"ubuntu","updated_at":"2026-01-20T04:52:57.758727711Z","closed_at":"2026-01-20T04:52:57.758685491Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0}
16-
{"id":"bd-icd","title":"Add web UI routing support","description":"## Summary\nAdd web UI routing support to serve static files and handle SPA routing alongside MCP API endpoints.\n\n## Context\n- GitHub Issue #71 provides patch outline for web UI routing\n- Need to serve static files from web/ directory\n- Need /api/ prefix for MCP endpoints\n- Need SPA fallback routing\n\n## Requirements\n1. Serve static files from web/ directory at root\n2. Prefix all MCP tool endpoints with /api/\n3. SPA fallback: non-API routes return index.html\n4. CORS headers for local development\n\n## Technical Approach\nUsing FastAPI/Starlette:\n```python\napp.mount(\"/api\", mcp_router)\napp.mount(\"/\", StaticFiles(directory=\"web\", html=True))\n\n@app.exception_handler(404)\nasync def spa_fallback(request, exc):\n if not request.url.path.startswith(\"/api\"):\n return FileResponse(\"web/index.html\")\n raise exc\n```\n\n## Files to Modify \n- src/mcp_agent_mail/server.py - Add routing logic\n- Create web/ directory structure\n\n## Acceptance Criteria\n- [ ] Static files served at /\n- [ ] MCP endpoints at /api/*\n- [ ] SPA routes return index.html\n- [ ] Development CORS working","status":"open","priority":2,"issue_type":"feature","created_at":"2026-01-23T05:03:13.490874378Z","created_by":"ubuntu","updated_at":"2026-01-23T05:03:13.490874378Z","source_repo":".","compaction_level":0,"original_size":0}
16+
{"id":"bd-icd","title":"Add web UI routing support","description":"## Summary\nAdd web UI routing support to serve static files and handle SPA routing alongside MCP API endpoints.\n\n## Context\n- GitHub Issue #71 provides patch outline for web UI routing\n- Need to serve static files from web/ directory\n- Need /api/ prefix for MCP endpoints\n- Need SPA fallback routing\n\n## Requirements\n1. Serve static files from web/ directory at root\n2. Prefix all MCP tool endpoints with /api/\n3. SPA fallback: non-API routes return index.html\n4. CORS headers for local development\n\n## Technical Approach\nUsing FastAPI/Starlette:\n```python\napp.mount(\"/api\", mcp_router)\napp.mount(\"/\", StaticFiles(directory=\"web\", html=True))\n\n@app.exception_handler(404)\nasync def spa_fallback(request, exc):\n if not request.url.path.startswith(\"/api\"):\n return FileResponse(\"web/index.html\")\n raise exc\n```\n\n## Files to Modify \n- src/mcp_agent_mail/server.py - Add routing logic\n- Create web/ directory structure\n\n## Acceptance Criteria\n- [ ] Static files served at /\n- [ ] MCP endpoints at /api/*\n- [ ] SPA routes return index.html\n- [ ] Development CORS working","status":"closed","priority":2,"issue_type":"feature","created_at":"2026-01-23T05:03:13.490874378Z","created_by":"ubuntu","updated_at":"2026-02-01T19:45:57.592876552Z","closed_at":"2026-02-01T19:45:57.592802813Z","source_repo":".","compaction_level":0,"original_size":0}
1717
{"id":"bd-p6n","title":"Integrate TOON into MCP Agent Mail (MCP server)","description":"## Goal\nAdd TOON (Token-Optimized Object Notation) output format to MCP Agent Mail tools/resources while keeping MCP JSON-RPC semantics intact.\n\n## Current Implementation (2026-01-22)\n\n### Output Envelope (when format=toon)\n- Return a **compact envelope** instead of the original JSON payload:\n```json\n{\n \"format\": \"toon\",\n \"data\": \"<toon string>\",\n \"meta\": {\n \"requested\": \"toon\",\n \"source\": \"param|default|implicit\",\n \"encoder\": \"tru\",\n \"toon_stats\": {\"json_tokens\": 10, \"toon_tokens\": 5, \"saved_tokens\": 5, \"saved_percent\": 50.0}\n }\n}\n```\n- The envelope is **JSON** (required by MCP), but the payload is **TOON** (token-optimized).\n- When format is omitted and no defaults are set, outputs are unchanged (JSON as before).\n\n### Format Resolution\nPrecedence: tool/resource `format` param > `MCP_AGENT_MAIL_OUTPUT_FORMAT` > `TOON_DEFAULT_FORMAT` > json.\nInvalid values raise a ValueError (expected json|toon).\n\n### Config / Env Vars\n- `MCP_AGENT_MAIL_OUTPUT_FORMAT` - default format for tool outputs.\n- `TOON_DEFAULT_FORMAT` - global fallback default for all tools/resources.\n- `TOON_TRU_BIN` - override `tru` binary path (highest precedence).\n- `TOON_BIN` - secondary override for `tru` path/command.\n- `TOON_STATS` - enable `tru --stats` and parse stderr into `meta.toon_stats`.\n\n## Implementation Summary (Done)\n- **config**: Added defaults and env mapping in `src/mcp_agent_mail/config.py`.\n- **format helpers**: `_normalize_output_format`, `_resolve_output_format` in `app.py`.\n- **TOON encode**: `_run_toon_encode`, `_encode_payload_to_toon_sync` with graceful fallback.\n- **tools**: Optional `format` param added to all MCP tools; wrapper applies TOON when requested.\n- **resources**: `?format=toon` supported for resources; format param supported in resource handlers.\n- **internal calls**: Macros and auto-handshake pass `format=\"json\"` to avoid nested TOON.\n- **docs**: README updated (Tools + Resources sections) and `resource://tooling` schemas include output format hints.\n\n## Tests (Added)\n- `tests/test_toon_formatting.py` (unit): tool & resource envelope + fallback.\n- `tests/e2e/test_toon_format_e2e.py` (e2e): smoke coverage with detailed logging.\n\n## Remaining Tasks\n1) Run quality gates (requires explicit command approval):\n - `uvx ty check`\n - `uvx ruff check --fix --unsafe-fixes`\n - `pytest tests/test_toon_formatting.py tests/e2e/test_toon_format_e2e.py`\n2) Ensure `tru` binary exists (build `toon_rust` or set `TOON_TRU_BIN` or `TOON_BIN`).\n3) Manual verification:\n - `format=toon` returns envelope with TOON payload.\n - `format=json` returns unchanged shape.\n - TOON payload decodes to JSON-equivalent.\n\n## Acceptance Criteria\n- format=toon works for tools/resources without breaking JSON defaults.\n- Envelope has minimal overhead and includes TOON payload + metadata.\n- README/Tooling schemas document format usage.\n- Unit tests + E2E pass with detailed logs.","notes":"Status update (2026-01-23):\n- Resource URI templates now include {?format,...} so FastMCP accepts query params.\n- Added test_resource_format_query_param_fastmcp.\n- README now notes optional format query param for resources.\n- Fixtures captured in /dp/toon_test_fixtures/real_world: mcp_agent_mail_health_check.{json,toon}, mcp_agent_mail_projects.{json,toon}.\n- Quality gates: uvx ty check, uvx ruff check, pytest (5 tests) all pass.\n- tru binary path resolved to /tmp/cargo-target/release/tru (CARGO_TARGET_DIR).\n- NOTE: FastMCP does not accept resource://projects without a query param; use ?format=json or ?format=toon.","status":"in_progress","priority":1,"issue_type":"task","created_at":"2026-01-22T21:49:12.340633763Z","created_by":"ubuntu","updated_at":"2026-01-24T20:40:42.594718025Z","source_repo":".","compaction_level":0,"original_size":0,"comments":[{"id":1,"issue_id":"bd-p6n","author":"QuietCanyon","text":"Updated description to tru naming (TOON_TRU_BIN/TOON_BIN, encoder=tru). Note: prior note about tr path is legacy; use tru path/env now.","created_at":"2026-01-24T20:40:01Z"}]}
1818
{"id":"bd-ycg","title":"Harden CLI ISO parsing for Z/offset timestamps","description":"CLI commands (e.g., file_reservations check) use datetime.fromisoformat without handling 'Z' suffix; add a helper to accept Z/offset and reuse for expiry comparisons and since filters.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-20T04:20:41.524010312Z","created_by":"ubuntu","updated_at":"2026-01-20T21:53:09.444366371Z","closed_at":"2026-01-20T21:53:09.444289776Z","close_reason":"Add ISO parser helper for Z/offset in CLI","source_repo":".","compaction_level":0,"original_size":0}
1919
{"id":"bd-zqs","title":"Add LIKE fallback for search_messages when FTS fails","description":"HTTP search falls back to LIKE when FTS errors; MCP search_messages currently returns empty on FTS failure. Consider adding LIKE fallback for robustness and aligning CLI/tool behavior.","status":"closed","priority":3,"issue_type":"task","created_at":"2026-01-20T04:12:49.159161289Z","created_by":"ubuntu","updated_at":"2026-01-20T04:44:53.108822487Z","closed_at":"2026-01-20T04:44:53.108667365Z","close_reason":"Completed","source_repo":".","compaction_level":0,"original_size":0}

.env.example

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ WORKTREES_ENABLED=0
1111
# HTTP transport
1212
HTTP_HOST=127.0.0.1
1313
HTTP_PORT=8765
14-
HTTP_PATH=/mcp/
14+
HTTP_PATH=/api/
1515
HTTP_BEARER_TOKEN=
1616
HTTP_RATE_LIMIT_ENABLED=false
1717
HTTP_RATE_LIMIT_PER_MINUTE=60
@@ -52,4 +52,4 @@ QUOTA_ATTACHMENTS_LIMIT_BYTES=500000000
5252
QUOTA_INBOX_LIMIT_COUNT=10000
5353
RETENTION_REPORT_ENABLED=true
5454

55-
CONTACT_AUTO_RETRY_ENABLED=true
55+
CONTACT_AUTO_RETRY_ENABLED=true

README.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2008,7 +2008,7 @@ decouple_config = DecoupleConfig(RepositoryEnv(".env"))
20082008
STORAGE_ROOT = decouple_config("STORAGE_ROOT", default="~/.mcp_agent_mail_git_mailbox_repo")
20092009
HTTP_HOST = decouple_config("HTTP_HOST", default="127.0.0.1")
20102010
HTTP_PORT = int(decouple_config("HTTP_PORT", default=8765))
2011-
HTTP_PATH = decouple_config("HTTP_PATH", default="/mcp/")
2011+
HTTP_PATH = decouple_config("HTTP_PATH", default="/api/")
20122012
```
20132013

20142014
Common variables you may set:
@@ -2020,7 +2020,7 @@ Common variables you may set:
20202020
| `STORAGE_ROOT` | `~/.mcp_agent_mail_git_mailbox_repo` | Root for per-project repos and SQLite DB |
20212021
| `HTTP_HOST` | `127.0.0.1` | Bind host for HTTP transport |
20222022
| `HTTP_PORT` | `8765` | Bind port for HTTP transport |
2023-
| `HTTP_PATH` | `/mcp/` | HTTP path where MCP endpoint is mounted |
2023+
| `HTTP_PATH` | `/api/` | HTTP path where MCP endpoint is mounted |
20242024
| `HTTP_JWT_ENABLED` | `false` | Enable JWT validation middleware |
20252025
| `HTTP_JWT_SECRET` | | HMAC secret for HS* algorithms (dev) |
20262026
| `HTTP_JWT_JWKS_URL` | | JWKS URL for public key verification |
@@ -2139,7 +2139,7 @@ uv run python -m mcp_agent_mail.cli serve-http
21392139
uv run python -m mcp_agent_mail.http --host 127.0.0.1 --port 8765
21402140
```
21412141

2142-
Connect with your MCP client using the HTTP (Streamable HTTP) transport on the configured host/port. The endpoint tolerates both `/mcp` and `/mcp/`.
2142+
Connect with your MCP client using the HTTP (Streamable HTTP) transport on the configured host/port. The endpoint tolerates both `/api` and `/api/`.
21432143

21442144
## Search syntax tips (SQLite FTS5)
21452145

@@ -2188,7 +2188,7 @@ This section has been removed to keep the README focused. See API Quick Referenc
21882188
server_name mcp.example.com;
21892189
ssl_certificate /etc/letsencrypt/live/mcp.example.com/fullchain.pem;
21902190
ssl_certificate_key /etc/letsencrypt/live/mcp.example.com/privkey.pem;
2191-
location /mcp/ { proxy_pass http://mcp_mail; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto https; }
2191+
location /api/ { proxy_pass http://mcp_mail; proxy_set_header Host $host; proxy_set_header X-Forwarded-Proto https; }
21922192
}
21932193
```
21942194
- Backups and retention
@@ -2589,7 +2589,7 @@ The inbox check hooks accept these environment variables (set automatically by t
25892589
|----------|-------------|---------|
25902590
| `AGENT_MAIL_PROJECT` | Project key (absolute path) | *required* |
25912591
| `AGENT_MAIL_AGENT` | Agent name | *required* |
2592-
| `AGENT_MAIL_URL` | Server URL | `http://127.0.0.1:8765/mcp/` |
2592+
| `AGENT_MAIL_URL` | Server URL | `http://127.0.0.1:8765/api/` |
25932593
| `AGENT_MAIL_TOKEN` | Bearer token | *none* |
25942594
| `AGENT_MAIL_INTERVAL` | Seconds between checks | `120` |
25952595

cline.mcp.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"mcpServers": {
33
"mcp-agent-mail": {
44
"type": "http",
5-
"url": "http://127.0.0.1:8765/mcp/",
5+
"url": "http://127.0.0.1:8765/api/",
66
"headers": { "Authorization": "Bearer YOUR_BEARER_TOKEN" },
77
"note": "Import or configure this server in Cline's MCP settings"
88
}

codex.mcp.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"mcpServers": {
33
"mcp-agent-mail": {
44
"type": "http",
5-
"url": "http://127.0.0.1:8765/mcp/",
5+
"url": "http://127.0.0.1:8765/api/",
66
"headers": { "Authorization": "Bearer YOUR_BEARER_TOKEN"}
77
}
88
}

cursor.mcp.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
"mcpServers": {
33
"mcp-agent-mail": {
44
"type": "http",
5-
"url": "http://127.0.0.1:8765/mcp/",
5+
"url": "http://127.0.0.1:8765/api/",
66
"headers": { "Authorization": "Bearer YOUR_BEARER_TOKEN"}
77
}
88
}

examples/client_bootstrap.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@ async def main() -> None:
3131
# Supply capability tokens for this agent (examples/capability template in
3232
# deploy/capabilities/agent_capabilities.example.yaml). Most MCP client
3333
# libraries accept metadata at connection time; refer to your client docs.
34-
async with Client("http://127.0.0.1:8765/mcp/") as client:
34+
async with Client("http://127.0.0.1:8765/api/") as client:
3535
directory_blocks = await client.read_resource("resource://tooling/directory")
3636
directory_payload = json.loads(getattr(directory_blocks[0], "text", "{}"))
3737
print("==> Loaded tooling directory; clusters available:")

gemini.mcp.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"mcpServers": {
33
"mcp-agent-mail": {
4-
"httpUrl": "http://127.0.0.1:8765/mcp/",
4+
"httpUrl": "http://127.0.0.1:8765/api/",
55
"headers": { "Authorization": "Bearer YOUR_BEARER_TOKEN"}
66
}
77
}

scripts/hooks/check_inbox.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@
1515
# Environment variables:
1616
# AGENT_MAIL_PROJECT - Project key (absolute path)
1717
# AGENT_MAIL_AGENT - Agent name
18-
# AGENT_MAIL_URL - Server URL (default: http://127.0.0.1:8765/mcp/)
18+
# AGENT_MAIL_URL - Server URL (default: http://127.0.0.1:8765/api/)
1919
# AGENT_MAIL_TOKEN - Bearer token
2020
# AGENT_MAIL_INTERVAL - Minimum seconds between checks (default: 120)
2121

@@ -25,7 +25,7 @@ set -uo pipefail
2525
# Configuration with defaults
2626
PROJECT="${AGENT_MAIL_PROJECT:-}"
2727
AGENT="${AGENT_MAIL_AGENT:-}"
28-
URL="${AGENT_MAIL_URL:-http://127.0.0.1:8765/mcp/}"
28+
URL="${AGENT_MAIL_URL:-http://127.0.0.1:8765/api/}"
2929
TOKEN="${AGENT_MAIL_TOKEN:-}"
3030
INTERVAL="${AGENT_MAIL_INTERVAL:-120}"
3131

scripts/hooks/codex_notify.sh

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@
1313
# Environment variables:
1414
# AGENT_MAIL_PROJECT - Project key (absolute path)
1515
# AGENT_MAIL_AGENT - Agent name
16-
# AGENT_MAIL_URL - Server URL (default: http://127.0.0.1:8765/mcp/)
16+
# AGENT_MAIL_URL - Server URL (default: http://127.0.0.1:8765/api/)
1717
# AGENT_MAIL_TOKEN - Bearer token
1818
# AGENT_MAIL_INTERVAL - Minimum seconds between checks (default: 120)
1919

@@ -27,7 +27,7 @@ set -uo pipefail
2727
# Configuration with defaults
2828
PROJECT="${AGENT_MAIL_PROJECT:-}"
2929
AGENT="${AGENT_MAIL_AGENT:-}"
30-
URL="${AGENT_MAIL_URL:-http://127.0.0.1:8765/mcp/}"
30+
URL="${AGENT_MAIL_URL:-http://127.0.0.1:8765/api/}"
3131
TOKEN="${AGENT_MAIL_TOKEN:-}"
3232
INTERVAL="${AGENT_MAIL_INTERVAL:-120}"
3333

0 commit comments

Comments
 (0)