{"name":"io.elaan/mcp","slug":"elaan-mcp","title":null,"description":"Create Elaan notification types, templates and brands, trigger sends, and debug delivery.","url":"https://mcp.market/server/elaan-mcp","rating":null,"grade":"B","score":77,"certified":false,"status":"active","category":"other","tags":[],"presence":{"score":13,"stars":0,"forks":0,"downloads_week":null,"last_push_at":"2026-08-15T07:31:13.000Z","license":"MIT"},"uptime":null,"claimed":false,"transport":"npm","callable_via_gateway":false,"default_price_micros":0,"repository":"https://github.com/ThingsIDoForLove/elaan-js","website":"https://elaan.io/docs.html","version":"0.1.3","remotes":[],"packages":[{"registryType":"npm","identifier":"@elaanio/mcp","version":"0.1.3","transport":{"type":"stdio"},"environmentVariables":[{"description":"Elaan service key (sk_...) from console.elaan.io. Read from the environment only, never passed as a tool argument.","isRequired":true,"format":"string","isSecret":true,"name":"ELAAN_API_KEY"}]}],"tools":[{"name":"create_branding","description":"Create a brand. `values` is an arbitrary key/value bag interpolated into templates, so one template can render for every customer you have \\u2014 put whatever the templates reference here (product name, logo URL, colour, support address).","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_contact","description":"Create a contact. `attributes` are available to every template rendered for this recipient, so anything you would otherwise repeat in every trigger belongs here.","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_notification_type","description":"Create a notification type. The key is its permanent identity and is referenced by every template and preference, so choose it carefully \\u2014 it cannot be renamed. Set allows_opt_out to false for transactional types (password resets, email verification) that a recipient must not be able to switch off; note that this removes only the recipient's veto, and channel_defaults still decides which chan","write_action":true,"price_micros":0,"input_schema":null},{"name":"create_template","description":"Create a template for one notification type on one channel. Content uses {{ slot }} placeholders filled at send time from the recipient's contact attributes, the resolved brand's values and the trigger's variables (most specific wins). A slot nobody filled renders empty rather than failing the send. Repeat blocks are supported for list data: {{#each lines}} ... {{ item.field }} ... {{/each}} \\u201","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_branding","description":"Delete a brand. The account default cannot be deleted and will return 409. Templates overriding this brand are not deleted, but sends naming it will fall back to the default.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_notification_type","description":"Soft-delete a notification type. The row survives because templates and preferences reference it by key, and restore_notification_type brings it back. Templates of a deleted type can still be edited.","write_action":true,"price_micros":0,"input_schema":null},{"name":"delete_template","description":"Permanently delete a template. This is a hard delete with no restore. Deleting the last template for a (type, channel) also removes that channel from the contact-facing preference matrix, because a channel with no template can never be delivered.","write_action":true,"price_micros":0,"input_schema":null},{"name":"get_contact","description":"Fetch one contact. Accepts either Elaan's internal id or your own identifier prefixed with 'ext:', e.g. 'ext:crm-12345'.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_contact_preferences","description":"The per-type by per-channel matrix for one contact, with the effective on/off and whether they overrode the default. Only channels a type can actually reach (i.e. that have a template) are offered, and non-opt-out types are omitted entirely.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_delivery_stats","description":"Aggregate delivery counts for the account.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_notification_event","description":"The outcome of one triggered event: pending, processed or failed, with per-channel errors. Channel failures are isolated, so a broken email template shows here without having blocked the inbox or push delivery of the same event. Start here when someone reports a notification did not arrive.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_notification_type","description":"Fetch a single notification type by its key.","write_action":false,"price_micros":0,"input_schema":null},{"name":"get_template","description":"Fetch one template by id.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_brandings","description":"List the account's brands. Every account has exactly one default brand, which cannot be deleted and is the fallback whenever a send names no brand or an unknown one.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_contacts","description":"List or search contacts.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_deliveries","description":"The delivery log, filterable by channel, status, recipient, notification type and time range. This is the tool for 'did this person get it, and if not why'.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_notification_types","description":"List every notification type in the account, with its per-channel defaults, declared variables and opt-out policy. Start here when you need to know what already exists.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_templates","description":"List every template on one channel, across all notification types, brands and languages.","write_action":false,"price_micros":0,"input_schema":null},{"name":"list_templates_affected_by","description":"Report which email templates reference which of a notification type's declared variables. Advisory only \\u2014 a template may legitimately use brand keys and contact attributes that are not declared variables \\u2014 but it is the right check before changing or removing one.","write_action":false,"price_micros":0,"input_schema":null},{"name":"preview_email_render","description":"Render an email template with sample variables and a chosen brand, without sending anything. Use this to check that slots resolve and that the brand-major fallback picked the template you expected.","write_action":true,"price_micros":0,"input_schema":null},{"name":"restore_notification_type","description":"Undo a soft delete, bringing the type and its configuration back.","write_action":false,"price_micros":0,"input_schema":null},{"name":"set_contact_preference","description":"Override one (type, channel) for one contact. Attempting this on a non-opt-out type returns 409.","write_action":false,"price_micros":0,"input_schema":null},{"name":"trigger_notification","description":"Send a notification to 1-100 recipients. Returns 202 immediately with one event_id per recipient; delivery happens asynchronously, so use get_notification_event afterwards to see the outcome. An omitted or unknown branding_key falls back to the account default rather than failing. Variables may be flat strings or arrays of flat row objects for {{#each}} blocks. This sends real messages.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_branding","description":"Update a brand's values and/or its email sender. Values are replaced wholesale, not merged \\u2014 read the brand first if you mean to change one key.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_notification_type","description":"Update any combination of a type's channel defaults, declared variables and opt-out policy. Only the fields you pass are changed. Note that channel_defaults and variables are replaced wholesale, not merged.","write_action":true,"price_micros":0,"input_schema":null},{"name":"update_template","description":"Replace a template's content. Same field rules as create_template. The notification type, brand and channel of an existing template cannot be changed \\u2014 delete and recreate to move it.","write_action":true,"price_micros":0,"input_schema":null}],"scan":{"score":77,"grade":"B","scanned_at":"2026-09-24T11:59:38.928Z","report":{"scannerVersion":"0.1.9","scannedAt":"2026-09-24T11:59:38.889Z","components":{"code":{"score":25,"max":25,"notes":["2 source files scanned"]},"reliability":{"score":-1,"max":20,"notes":["no gateway calls yet and no remote to probe"]},"poisoning":{"score":-1,"max":15,"notes":["tools not inspected (local package is not executed); not counted"]},"auth":{"score":6,"max":15,"notes":["static API keys via environment variables"]},"maintenance":{"score":12,"max":15,"notes":["last push 40 days ago"]},"identity":{"score":7,"max":10,"notes":["namespace and repository owner differ","GitHub account older than a year","website matches verified namespace"]}},"findings":[],"inputs":{"packages":[{"registryType":"npm","identifier":"@elaanio/mcp","version":"0.1.3","found":true,"license":"MIT","hasInstallScripts":false,"dependencyCount":2,"publishedAt":"2026-08-03T08:52:21.757Z","repositoryUrl":"git+https://github.com/ThingsIDoForLove/elaan-js.git"}],"repo":{"found":true,"owner":"ThingsIDoForLove","repo":"elaan-js","archived":false,"pushedAt":"2026-08-15T07:31:13Z","stars":0,"forks":0,"openIssues":0,"ownerType":"User","ownerAvatarUrl":"https://avatars.githubusercontent.com/u/45471481?v=4","ownerCreatedAt":"2018-11-29T22:40:34Z","license":"MIT"},"icon":{"url":"data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 32 32'%3E%3Crect width='32' height='32' rx='8' fill='%230c0f16'/%3E%3Cpath d='M16.5 9.3H10.8a5.5 5.5 0 0 0-5.5 5.5v6.4a5.5 5.5 0 0 0 5.5 5.5h6.4a5.5 5.5 0 0 0 5.5-5.5v-5.7a6.2 6.2 0 0 1-6.2-6.2z' fill='%2345b0ee'/%3E%3Ccircle cx='22.7' cy='9.3' r='4' fill='%2345b0ee'/%3E%3C/svg%3E","source":"site"},"presence":{"stars":0,"forks":0,"downloadsWeek":null,"license":"MIT","lastPushAt":"2026-08-15T07:31:13.000Z","score":13}}}},"grade_history":[],"reviews":[]}