{"_id":"@bryanberger/jmap-mcp","_rev":"5-5ac4dfd117504eb1c389a9db217a1291","name":"@bryanberger/jmap-mcp","dist-tags":{"latest":"0.3.0"},"versions":{"0.1.0":{"name":"@bryanberger/jmap-mcp","version":"0.1.0","keywords":["mcp","jmap","stalwart","email","calendar","caldav"],"author":"Bryan Berger","license":"MIT","_id":"@bryanberger/jmap-mcp@0.1.0","maintainers":[{"name":"bryanberger","email":"bryan.berger98@gmail.com"}],"homepage":"https://github.com/BryanBerger98/jmap-mcp#readme","bugs":"https://github.com/BryanBerger98/jmap-mcp/issues","bin":{"jmap-mcp":"./dist/index.js"},"dist":{"shasum":"f6ad0acc4d9b9396d8f44354c29000cb12c87b5c","tarball":"https://registry.npmjs.org/@bryanberger/jmap-mcp/-/jmap-mcp-0.1.0.tgz","fileCount":249,"integrity":"sha512-jFYuZBD3ji5xe6/jg+Vfnd9FH5D+FBfAc3zph0PCIzTEdq1tw0jZAl9WJzXQyQOzT+nfEP4YFCrieIE5MTx3dg==","signatures":[{"sig":"MEYCIQD69PGEpPDlwDRVAkjAYZv7Z57AwBCIITSdFjdBc6Xj+QIhAPemEdSNV5me0IfBgyTPiYglV9s74WISlcvSxV3XrNLR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1121431},"type":"module","engines":{"node":">=24"},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsc -p tsconfig.build.json","format":"biome check --write .","release":"pnpm build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc -p tsconfig.json","test:watch":"vitest"},"_npmUser":{"name":"bryanberger","email":"bryan.berger98@gmail.com"},"repository":{"url":"git+https://github.com/BryanBerger98/jmap-mcp.git","type":"git"},"description":"Local MCP server exposing a Stalwart JMAP server (mail, calendar, contacts, files, sharing, Sieve) to an AI assistant, with a configurable write policy.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"~4.4.3","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"4.1.11","typescript":"7.0.2","@types/node":"^24.0.0","@biomejs/biome":"2.5.11","@changesets/cli":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/jmap-mcp_0.1.0_1788361693344_0.7360380186549116","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@bryanberger/jmap-mcp","version":"0.2.0","keywords":["mcp","jmap","stalwart","email","calendar","caldav"],"author":"Bryan Berger","license":"MIT","_id":"@bryanberger/jmap-mcp@0.2.0","maintainers":[{"name":"bryanberger","email":"bryan.berger98@gmail.com"}],"homepage":"https://github.com/BryanBerger98/jmap-mcp#readme","bugs":"https://github.com/BryanBerger98/jmap-mcp/issues","bin":{"jmap-mcp":"./dist/index.js"},"dist":{"shasum":"6773875ced4979c270d8a5ca749455ef52e6fbea","tarball":"https://registry.npmjs.org/@bryanberger/jmap-mcp/-/jmap-mcp-0.2.0.tgz","fileCount":246,"integrity":"sha512-TDo822H8Mu/XqG8bLey28o7XbWli8nKWvRgIAydg/6M20kLdfqxVJauX2YEKYOYxfhYv13JFYZkgyA9hw5aQSw==","signatures":[{"sig":"MEUCID6IAdzPg2ota7FZukw2JOUONvdbLJoao+qe/388GfY7AiEAvQExn9kC3O5Tn8p0gJkyXvzDrVE834uN4ZY8fvLO/b4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bryanberger%2fjmap-mcp@0.2.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1122613},"type":"module","engines":{"node":">=24"},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsc -p tsconfig.build.json","format":"biome check --write .","release":"pnpm build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc -p tsconfig.json","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6ee468fd-0fc7-4825-8983-5c7a748438da"}},"repository":{"url":"git+https://github.com/BryanBerger98/jmap-mcp.git","type":"git"},"description":"Local MCP server exposing a Stalwart JMAP server (mail, calendar, contacts, files, sharing, Sieve) to an AI assistant, with a configurable write policy.","directories":{},"_nodeVersion":"24.19.0","dependencies":{"zod":"~4.4.3","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"4.1.11","typescript":"7.0.2","@types/node":"^24.0.0","@biomejs/biome":"2.5.11","@changesets/cli":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/jmap-mcp_0.2.0_1788388565169_0.026790848377901355","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@bryanberger/jmap-mcp","version":"0.2.1","keywords":["mcp","jmap","stalwart","email","calendar","caldav"],"author":"Bryan Berger","license":"MIT","_id":"@bryanberger/jmap-mcp@0.2.1","maintainers":[{"name":"bryanberger","email":"bryan.berger98@gmail.com"}],"homepage":"https://github.com/BryanBerger98/jmap-mcp#readme","bugs":"https://github.com/BryanBerger98/jmap-mcp/issues","bin":{"jmap-mcp":"./dist/index.js"},"dist":{"shasum":"27aae3ad7e88a48309c619653a5078c1581ff639","tarball":"https://registry.npmjs.org/@bryanberger/jmap-mcp/-/jmap-mcp-0.2.1.tgz","fileCount":246,"integrity":"sha512-q0xK8EPECQgCSq+wgmbuDilE1DZj0uRaoRJwrqLj3i22XU0lAqOroxTKAoMpLbxQWa5Fxj4+DQ6TT5bn2H+sLQ==","signatures":[{"sig":"MEYCIQClPkvU52f4JggDN0LUbhKRKoPas8FsI+XNAJQ1wmqhLAIhAPLjqInclZetw25IYTzij+PAkts5+8ZydSHnF20enkSu","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bryanberger%2fjmap-mcp@0.2.1","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1109905},"type":"module","engines":{"node":">=24"},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsc -p tsconfig.build.json","format":"biome check --write .","release":"pnpm build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc -p tsconfig.json","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6ee468fd-0fc7-4825-8983-5c7a748438da"}},"repository":{"url":"git+https://github.com/BryanBerger98/jmap-mcp.git","type":"git"},"description":"Local MCP server exposing a Stalwart JMAP server (mail, calendar, contacts, files, sharing, Sieve) to an AI assistant, with a configurable write policy.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"~4.4.3","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"4.1.11","typescript":"7.0.2","@types/node":"^24.0.0","@biomejs/biome":"2.5.11","@changesets/cli":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/jmap-mcp_0.2.1_1788439950019_0.4660752031068811","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@bryanberger/jmap-mcp","version":"0.2.2","keywords":["mcp","jmap","stalwart","email","calendar","caldav"],"author":"Bryan Berger","license":"MIT","_id":"@bryanberger/jmap-mcp@0.2.2","maintainers":[{"name":"bryanberger","email":"bryan.berger98@gmail.com"}],"homepage":"https://github.com/BryanBerger98/jmap-mcp#readme","bugs":"https://github.com/BryanBerger98/jmap-mcp/issues","bin":{"jmap-mcp":"./dist/index.js"},"dist":{"shasum":"89bf1c4c53602eed19f5a7887ddd800ef7c4f8c7","tarball":"https://registry.npmjs.org/@bryanberger/jmap-mcp/-/jmap-mcp-0.2.2.tgz","fileCount":246,"integrity":"sha512-cD8rT5RumUK5hwv3db79qffoTlJP7JOZ43NpTb3SHLcORtFhClzGvbEroniHKEKSjHv5AOtHrX6BA4kNI4gO1w==","signatures":[{"sig":"MEUCIDBwZQNpXM+3YA9ZeHBJZop7a/MVvhB/W+iHi6xK52xgAiEAsk+DCNYSEEqQrRdSEWGOZgK5GSmg6A8rMY3kR+Xxsf0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCICVW9E0CiWmqaMZx/dEIZLZuyhfZ9pzEhZ1g60kiFD9OAiAI0Zyax8AnTSwyO9bwtpXLqmTkTd/DkgNUsxBJzYiYsQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bryanberger%2fjmap-mcp@0.2.2","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1115125},"type":"module","engines":{"node":">=24"},"scripts":{"lint":"biome check .","test":"vitest run","build":"tsc -p tsconfig.build.json","format":"biome check --write .","release":"pnpm build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc -p tsconfig.json","test:watch":"vitest"},"_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6ee468fd-0fc7-4825-8983-5c7a748438da"}},"repository":{"url":"git+https://github.com/BryanBerger98/jmap-mcp.git","type":"git"},"description":"Local MCP server exposing a Stalwart JMAP server (mail, calendar, contacts, files, sharing, Sieve) to an AI assistant, with a configurable write policy.","directories":{},"_nodeVersion":"24.20.0","dependencies":{"zod":"~4.4.3","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"4.1.11","typescript":"7.0.2","@types/node":"^24.0.0","@biomejs/biome":"2.5.11","@changesets/cli":"^3.0.1"},"_npmOperationalInternal":{"tmp":"tmp/jmap-mcp_0.2.2_1789817046514_0.5428768292694872","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"_id":"@bryanberger/jmap-mcp@0.3.0","bin":{"jmap-mcp":"./dist/index.js"},"bugs":"https://github.com/BryanBerger98/jmap-mcp/issues","dist":{"shasum":"0fcacac47b960242f7e77a015a3dd3245ef0c350","tarball":"https://registry.npmjs.org/@bryanberger/jmap-mcp/-/jmap-mcp-0.3.0.tgz","fileCount":249,"integrity":"sha512-S6XVEF1v62HLLl2HvzJajG8rHzZ3h4MRMB/LYiwO4e/zYJUR98hlNDa4oWMkj1uzTucH85RVayIsZU4mrglt6w==","signatures":[{"sig":"MEUCIQCBf8cC3dLpGyRdNiDZgEXUBXGXSdsrP5fTnCWAk5j7xwIgDeAmoBJxodienUT8u4faqc1XGkoqh+2fIbr2v4aLTh8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQDStUNprscvEeuEdjBoAs6tuJ2mgmBYiJB0wV6cnRihdwIhAJkGW304dBqthsMDkz9YO6B32OmBmpYNa6DvCjDGV9qS"}],"attestations":{"url":"https://registry.npmjs.org/-/npm/v1/attestations/@bryanberger%2fjmap-mcp@0.3.0","provenance":{"predicateType":"https://slsa.dev/provenance/v1"}},"unpackedSize":1147102},"name":"@bryanberger/jmap-mcp","type":"module","author":"Bryan Berger","engines":{"node":">=24"},"license":"MIT","scripts":{"lint":"biome check .","test":"vitest run","build":"tsc -p tsconfig.build.json","format":"biome check --write .","release":"pnpm build && changeset publish","version":"changeset version","changeset":"changeset","typecheck":"tsc -p tsconfig.json","test:watch":"vitest"},"version":"0.3.0","_npmUser":{"name":"GitHub Actions","email":"npm-oidc-no-reply@github.com","trustedPublisher":{"id":"github","oidcConfigId":"oidc:6ee468fd-0fc7-4825-8983-5c7a748438da"}},"homepage":"https://github.com/BryanBerger98/jmap-mcp#readme","keywords":["mcp","jmap","stalwart","email","calendar","caldav"],"repository":{"url":"git+https://github.com/BryanBerger98/jmap-mcp.git","type":"git"},"description":"Local MCP server exposing a Stalwart JMAP server (mail, calendar, contacts, files, sharing, Sieve) to an AI assistant, with a configurable write policy.","directories":{},"maintainers":[{"name":"bryanberger","email":"bryan.berger98@gmail.com"}],"_nodeVersion":"24.20.0","dependencies":{"zod":"~4.4.3","fflate":"^0.8.3","@modelcontextprotocol/server":"2.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"vitest":"4.1.11","typescript":"7.0.2","@types/node":"^24.0.0","@biomejs/biome":"2.5.11","@changesets/cli":"^3.0.1"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/jmap-mcp_0.3.0_1789824479119_0.41453539529159533"}}},"time":{"created":"2026-09-02T15:08:13.090Z","modified":"2026-09-19T13:27:59.530Z","0.1.0":"2026-09-02T15:08:13.560Z","0.2.0":"2026-09-02T22:36:05.366Z","0.2.1":"2026-09-03T12:52:30.170Z","0.2.2":"2026-09-19T11:24:06.621Z","0.3.0":"2026-09-19T13:27:59.210Z"},"bugs":"https://github.com/BryanBerger98/jmap-mcp/issues","author":"Bryan Berger","license":"MIT","homepage":"https://github.com/BryanBerger98/jmap-mcp#readme","keywords":["mcp","jmap","stalwart","email","calendar","caldav"],"repository":{"url":"git+https://github.com/BryanBerger98/jmap-mcp.git","type":"git"},"description":"Local MCP server exposing a Stalwart JMAP server (mail, calendar, contacts, files, sharing, Sieve) to an AI assistant, with a configurable write policy.","maintainers":[{"name":"bryanberger","email":"bryan.berger98@gmail.com"}],"readme":"# @bryanberger/jmap-mcp\n\nLocal MCP server that exposes a [Stalwart](https://stalw.art) mail server's JMAP surface to an AI assistant, with no data leaving your machine except the exchange with your own server.\n\n## What it covers\n\n- **Mail**: search, read, fetch attachments, compose, send, file and delete messages, manage folders.\n- **Contacts**: search and read cards, write them, manage address books.\n- **Calendar**: search and read events, check availability, create, correct, answer and delete.\n- **Files**: browse, fetch to disk, upload from disk, organize and delete.\n- **Sieve**: list scripts, store one, choose which one filters, manage the vacation response.\n- **Sharing**: read who an object is open to, grant and revoke rights, dismiss notifications.\n\nThirty tools in all, described one by one in [the tools reference](docs/reference/tools/README.md).\n\n## Quick start with Claude Code\n\nYou need the URL of your server's JMAP session and a bearer token it accepts, obtained as [the token page](docs/getting-started/stalwart-token.md) describes.\n\n```sh\nclaude mcp add jmap --transport stdio --scope user \\\n  --env JMAP_SESSION_URL=https://mail.example.com/.well-known/jmap \\\n  --env JMAP_BEARER_TOKEN=API_xxx \\\n  -- npx -y @bryanberger/jmap-mcp\n```\n\nClaude Desktop and Cursor take the same server through a JSON file; see [the documentation](docs/README.md).\n\n## Write policy\n\nEvery call is classified from its arguments into one of four classes: `read`, `draft`, `send`, `destroy`.\nEach class has a level, `allow`, `confirm` or `deny`, and by default `send` and `destroy` are confirmed before they run.\nA confirmation is a question asked through your MCP client, which must support elicitation; when it does not, the call is refused rather than run silently.\nThe question names what the call is about to do: the recipients, the messages, the rights, the script.\n[The write policy page](docs/explanation/write-policy.md) explains the whole mechanism and how to tune it.\n\n## Documentation\n\n| Page | Answers |\n| --- | --- |\n| [Getting a token from Stalwart](docs/getting-started/stalwart-token.md) | Which bearer the server accepts, and how to check it |\n| [Claude Code](docs/getting-started/claude-code.md), [Claude Desktop](docs/getting-started/claude-desktop.md), [Cursor](docs/getting-started/cursor.md) | How to register the server in each client |\n| [Configuration](docs/reference/configuration.md) | Every key and variable, with its default |\n| [Tools](docs/reference/tools/README.md) | What each of the thirty tools does, and when it asks |\n| [Limits](docs/reference/limits.md) | Every ceiling, and what happens past it |\n| [Write policy](docs/explanation/write-policy.md) | Classes, levels, confirmation, recipient perimeter |\n| [Troubleshooting](docs/troubleshooting.md) | What a refusal or a startup error means |\n\nThe documentation lives on GitHub and is not shipped in the npm package.\n\n## Development\n\nRequires Node 24 (`nvm use`) and pnpm.\n\n```sh\npnpm install\npnpm typecheck   # tsc, native Go compiler\npnpm test        # vitest\npnpm lint        # biome\npnpm build       # emits dist/\n```\n\nArchitecture, decisions and the full file tree live in [`aidd_docs/INSTALL.md`](aidd_docs/INSTALL.md). Contribution workflow in [`CONTRIBUTING.md`](CONTRIBUTING.md).\n\n## License\n\nMIT\n","readmeFilename":""}