@koderlabs/inbox-mcp 0.1.0 → 0.1.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +7 -7
- package/dist/stdio.js +1 -1
- package/dist/stdio.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
# @koderlabs/inbox-mcp
|
|
1
|
+
# @koderlabs/inbox-mcp
|
|
2
2
|
|
|
3
3
|
MCP server for InstantInbox (inbox.koderlabs.net). Lets AI dev agents create
|
|
4
4
|
disposable inboxes and read received emails so any app's email-driven flow
|
|
@@ -9,7 +9,7 @@ disposable inboxes and read received emails so any app's email-driven flow
|
|
|
9
9
|
| | |
|
|
10
10
|
|---|---|
|
|
11
11
|
| Port | 10405 |
|
|
12
|
-
| Transports | Streamable HTTP (`/mcp`) + stdio (`instantinbox-mcp
|
|
12
|
+
| Transports | Streamable HTTP (`/mcp`) + stdio (`instantinbox-mcp`) |
|
|
13
13
|
| Auth | Bearer token: user JWT or `sk_live_*` / `sk_test_*` key |
|
|
14
14
|
| Scopes | `inbox:read`, `inbox:write`, `email:read`, `email:write` |
|
|
15
15
|
|
|
@@ -36,8 +36,8 @@ disposable inboxes and read received emails so any app's email-driven flow
|
|
|
36
36
|
| Var | Default | Notes |
|
|
37
37
|
|---|---|---|
|
|
38
38
|
| `PORT` | `10405` | HTTP transport |
|
|
39
|
-
| `API_BASE_URL` | `http://localhost:10402/api/v1` |
|
|
40
|
-
| `INBOX_API_BASE_URL` |
|
|
39
|
+
| `API_BASE_URL` | `http://localhost:10402/api/v1` | HTTP transport — points at local API (self-host) |
|
|
40
|
+
| `INBOX_API_BASE_URL` | `https://inbox.koderlabs.net/api/v1` | stdio transport — defaults to hosted instance |
|
|
41
41
|
| `INBOX_API_KEY` | — | stdio: required Bearer token |
|
|
42
42
|
| `MCP_ALLOWED_ORIGINS` | empty | CSV; required for browser-hosted clients |
|
|
43
43
|
| `MCP_RATE_LIMIT_RPM` | `120` | Per-token request budget per minute |
|
|
@@ -52,7 +52,7 @@ disposable inboxes and read received emails so any app's email-driven flow
|
|
|
52
52
|
"mcpServers": {
|
|
53
53
|
"instantinbox": {
|
|
54
54
|
"command": "npx",
|
|
55
|
-
"args": ["-y", "@koderlabs/inbox-mcp
|
|
55
|
+
"args": ["-y", "@koderlabs/inbox-mcp"],
|
|
56
56
|
"env": {
|
|
57
57
|
"INBOX_API_BASE_URL": "https://inbox.koderlabs.net/api/v1",
|
|
58
58
|
"INBOX_API_KEY": "<your token>"
|
|
@@ -76,8 +76,8 @@ disposable inboxes and read received emails so any app's email-driven flow
|
|
|
76
76
|
## Local dev
|
|
77
77
|
|
|
78
78
|
```bash
|
|
79
|
-
pnpm --filter @koderlabs/inbox-mcp
|
|
80
|
-
PORT=10405 INBOX_API_KEY=<token> pnpm --filter @koderlabs/inbox-mcp
|
|
79
|
+
pnpm --filter @koderlabs/inbox-mcp build
|
|
80
|
+
PORT=10405 INBOX_API_KEY=<token> pnpm --filter @koderlabs/inbox-mcp start
|
|
81
81
|
```
|
|
82
82
|
|
|
83
83
|
## Deviations from InstantTasks MCP
|
package/dist/stdio.js
CHANGED
|
@@ -8,7 +8,7 @@ import {
|
|
|
8
8
|
|
|
9
9
|
// src/stdio.ts
|
|
10
10
|
import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
|
|
11
|
-
var API_BASE_URL = (process.env.INBOX_API_BASE_URL ?? "
|
|
11
|
+
var API_BASE_URL = (process.env.INBOX_API_BASE_URL ?? "https://inbox.koderlabs.net/api/v1").replace(/\/$/, "");
|
|
12
12
|
var API_KEY = process.env.INBOX_API_KEY ?? "";
|
|
13
13
|
async function main() {
|
|
14
14
|
if (!API_KEY) {
|
package/dist/stdio.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/stdio.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * stdio transport entry — for `instantinbox-mcp` (Claude Desktop, etc).\n *\n * Env:\n * INBOX_API_BASE_URL — InstantInbox API (default http://localhost:10402/api/v1)\n * INBOX_API_KEY — Bearer token (sk_live_* / sk_test_* / user JWT)\n */\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createMcpServer } from './server.js';\nimport { ApiClient } from './api-client.js';\nimport { ScopeSet } from './auth/scopes.js';\nimport { validateSecretKey } from './auth/secret-key.js';\n\nconst API_BASE_URL = (process.env.INBOX_API_BASE_URL ?? '
|
|
1
|
+
{"version":3,"sources":["../src/stdio.ts"],"sourcesContent":["#!/usr/bin/env node\n/**\n * stdio transport entry — for `instantinbox-mcp` (Claude Desktop, etc).\n *\n * Env:\n * INBOX_API_BASE_URL — InstantInbox API (default http://localhost:10402/api/v1)\n * INBOX_API_KEY — Bearer token (sk_live_* / sk_test_* / user JWT)\n */\nimport { StdioServerTransport } from '@modelcontextprotocol/sdk/server/stdio.js';\nimport { createMcpServer } from './server.js';\nimport { ApiClient } from './api-client.js';\nimport { ScopeSet } from './auth/scopes.js';\nimport { validateSecretKey } from './auth/secret-key.js';\n\nconst API_BASE_URL = (process.env.INBOX_API_BASE_URL ?? 'https://inbox.koderlabs.net/api/v1').replace(/\\/$/, '');\nconst API_KEY = process.env.INBOX_API_KEY ?? '';\n\nasync function main(): Promise<void> {\n if (!API_KEY) {\n process.stderr.write(\n 'Error: INBOX_API_KEY environment variable is required.\\n' +\n 'Set it to a user JWT or sk_live_* / sk_test_* key from your InstantInbox account.\\n',\n );\n process.exit(1);\n }\n\n // Validate once at startup — refuse to start on bad creds, never serve\n // tool calls with permissive scopes.\n let scopes: ScopeSet;\n try {\n const identity = await validateSecretKey(API_KEY, API_BASE_URL);\n scopes = identity.scopes;\n process.stderr.write(\n `InstantInbox MCP stdio: authenticated as ${identity.email ?? identity.userId} ` +\n `(scopes: ${scopes.toArray().join(', ')})\\n`,\n );\n } catch (err) {\n process.stderr.write(`InstantInbox MCP stdio: auth failed — ${(err as Error).message}\\n`);\n process.exit(2);\n throw err; // unreachable — narrows scopes for TS\n }\n\n const apiClient = new ApiClient({ baseUrl: API_BASE_URL, token: API_KEY });\n const server = createMcpServer(() => ({ apiClient, scopes }));\n\n const transport = new StdioServerTransport();\n await server.connect(transport);\n\n process.stderr.write('InstantInbox MCP server ready on stdio.\\n');\n}\n\nmain().catch((err) => {\n process.stderr.write(`Fatal: ${err.message}\\n`);\n process.exit(1);\n});\n"],"mappings":";;;;;;;;;AAQA,SAAS,4BAA4B;AAMrC,IAAM,gBAAgB,QAAQ,IAAI,sBAAsB,sCAAsC,QAAQ,OAAO,EAAE;AAC/G,IAAM,UAAU,QAAQ,IAAI,iBAAiB;AAE7C,eAAe,OAAsB;AACnC,MAAI,CAAC,SAAS;AACZ,YAAQ,OAAO;AAAA,MACb;AAAA,IAEF;AACA,YAAQ,KAAK,CAAC;AAAA,EAChB;AAIA,MAAI;AACJ,MAAI;AACF,UAAM,WAAW,MAAM,kBAAkB,SAAS,YAAY;AAC9D,aAAS,SAAS;AAClB,YAAQ,OAAO;AAAA,MACb,4CAA4C,SAAS,SAAS,SAAS,MAAM,aACjE,OAAO,QAAQ,EAAE,KAAK,IAAI,CAAC;AAAA;AAAA,IACzC;AAAA,EACF,SAAS,KAAK;AACZ,YAAQ,OAAO,MAAM,8CAA0C,IAAc,OAAO;AAAA,CAAI;AACxF,YAAQ,KAAK,CAAC;AACd,UAAM;AAAA,EACR;AAEA,QAAM,YAAY,IAAI,UAAU,EAAE,SAAS,cAAc,OAAO,QAAQ,CAAC;AACzE,QAAM,SAAS,gBAAgB,OAAO,EAAE,WAAW,OAAO,EAAE;AAE5D,QAAM,YAAY,IAAI,qBAAqB;AAC3C,QAAM,OAAO,QAAQ,SAAS;AAE9B,UAAQ,OAAO,MAAM,2CAA2C;AAClE;AAEA,KAAK,EAAE,MAAM,CAAC,QAAQ;AACpB,UAAQ,OAAO,MAAM,UAAU,IAAI,OAAO;AAAA,CAAI;AAC9C,UAAQ,KAAK,CAAC;AAChB,CAAC;","names":[]}
|
package/package.json
CHANGED