@sendora/mcp 1.1.1 → 1.2.12
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 -5
- package/dist/docs.js +4 -1
- package/dist/exclusions.js +3 -1
- package/dist/generated/docs.json +1 -1
- package/dist/instructions.js +2 -2
- package/dist/prompts.js +13 -7
- package/dist/tools/broadcast-input.js +1 -1
- package/dist/tools/broadcasts.js +1 -1
- package/dist/tools/docs.js +2 -2
- package/dist/tools/inbound.js +11 -72
- package/dist/tools/send.js +2 -2
- package/dist/tools/webhooks.js +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
package/README.md
CHANGED
|
@@ -2,12 +2,12 @@
|
|
|
2
2
|
|
|
3
3
|
The official [Model Context Protocol](https://modelcontextprotocol.io) server for
|
|
4
4
|
[Sendora](https://sendora.se), transactional email delivery. It helps a coding
|
|
5
|
-
agent such as Claude Code, Cursor or VS Code build against the API
|
|
6
|
-
`@sendora/sdk
|
|
5
|
+
agent such as Claude Code, Cursor or VS Code build against the API,
|
|
6
|
+
`@sendora/sdk` for TypeScript or `sendora` for Python: it reads Sendora's documentation, sends a test mail and reads what
|
|
7
7
|
happened to it, and sets up streams, webhooks and sending domains.
|
|
8
8
|
|
|
9
9
|
The documentation is built into it: the guides, every operation of the API
|
|
10
|
-
reference, the error codes and
|
|
10
|
+
reference, the error codes and each SDK's README and rules for agents, from the
|
|
11
11
|
same sources as [sendora.se/docs](https://sendora.se/docs), bundled with the
|
|
12
12
|
release. It works offline and cannot describe a different version of the API
|
|
13
13
|
than the one it shipped with.
|
|
@@ -63,12 +63,14 @@ on a test server, and what cannot be undone happens only to a test server.
|
|
|
63
63
|
`read_inbound_message`, `list_inbound_domains`, `check_inbound_domain` and
|
|
64
64
|
`add_inbound_domain`. The text of a received mail was written by a stranger:
|
|
65
65
|
it reaches the model only from `read_inbound_message`, fenced and marked as
|
|
66
|
-
data,
|
|
66
|
+
data, in an answer that is text alone so that every client shows the model
|
|
67
|
+
the fence, which lessens prompt injection without preventing it.
|
|
67
68
|
- The account key: `list_servers`, `list_domains`, `check_domain`,
|
|
68
69
|
`add_domain` and `delete_test_server`, which refuses a live server.
|
|
69
70
|
|
|
70
71
|
The documents are resources under `sendora://docs/…`, `sendora://reference/…`,
|
|
71
|
-
`sendora://errors`, `sendora://sdk/readme
|
|
72
|
+
`sendora://errors`, `sendora://sdk/readme`, `sendora://sdk/skill`,
|
|
73
|
+
`sendora://sdk/python/readme` and `sendora://sdk/python/skill`, listed by
|
|
72
74
|
`sendora://index`. Three prompts: `set_up_sendora`, `why_not_delivered` and
|
|
73
75
|
`verify_webhooks`.
|
|
74
76
|
|
package/dist/docs.js
CHANGED
|
@@ -23,6 +23,7 @@ function indexOf(documents) {
|
|
|
23
23
|
].join('\n'),
|
|
24
24
|
};
|
|
25
25
|
}
|
|
26
|
+
const SKILLS = new Set(['sendora://sdk/skill', 'sendora://sdk/python/skill']);
|
|
26
27
|
/** The bundle as `scripts/build-docs.ts` writes it, checked, with the index in front. */
|
|
27
28
|
export function docsFrom(bundle) {
|
|
28
29
|
const built = bundleSchema.parse(bundle).documents;
|
|
@@ -31,7 +32,9 @@ export function docsFrom(bundle) {
|
|
|
31
32
|
if (byUri.size !== documents.length) {
|
|
32
33
|
throw new Error('two documents of the bundle share an address');
|
|
33
34
|
}
|
|
34
|
-
|
|
35
|
+
// The skills are rules an agent reads whole, as the instructions say; searched,
|
|
36
|
+
// their condensed code ranked above the guides it condenses.
|
|
37
|
+
const index = searchIndex(documents.filter((doc) => !SKILLS.has(doc.uri)));
|
|
35
38
|
return {
|
|
36
39
|
documents,
|
|
37
40
|
find: (uri) => byUri.get(uri.split('#')[0] ?? uri),
|
package/dist/exclusions.js
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
* operation arrives with its tool or its line here.
|
|
6
6
|
*/
|
|
7
7
|
export const exclusions = {
|
|
8
|
-
'POST /v1/email/batch': 'An agent sends one message and reads its outcome; a batch is code’s work, which the
|
|
8
|
+
'POST /v1/email/batch': 'An agent sends one message and reads its outcome; a batch is code’s work, which the SDKs serve.',
|
|
9
9
|
'GET /v1/inbound/{id}/raw': 'The raw MIME is bytes for a parser; read_inbound_message gives the parsed message inside the fence.',
|
|
10
10
|
'GET /v1/inbound/{id}/attachments/{attachmentId}': 'A stranger’s attachment bytes are not for a model’s context; the read describes each attachment.',
|
|
11
11
|
'GET /v1/inbound/domains/{id}': 'list_inbound_domains returns every field.',
|
|
@@ -25,4 +25,6 @@ export const exclusions = {
|
|
|
25
25
|
'DELETE /v1/servers/{id}/tokens/{tokenId}': 'Revoking a key can break a live integration and cannot be undone.',
|
|
26
26
|
'GET /v1/domains/{id}': 'list_domains returns every field.',
|
|
27
27
|
'DELETE /v1/domains/{id}': 'A sending domain serves every server, live ones included; deleting it stops their mail and cannot be undone.',
|
|
28
|
+
'POST /v1/erasures': 'It deletes a person’s data on every server and cannot be undone; the customer’s staff or code asks for it.',
|
|
29
|
+
'GET /v1/erasures/{id}': 'It reads an erasure, which no tool requests.',
|
|
28
30
|
};
|