onesignal-mcp 1.0.0

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 ADDED
@@ -0,0 +1,13 @@
1
+ # onesignal-mcp
2
+
3
+ Query the OneSignal API (free tier; use a current v2 Organization API key for ONESIGNAL_USER_KEY and the app REST API key for ONESIGNAL_APP_KEY, Basic auth).
4
+
5
+ ## Tools
6
+
7
+ - `list_apps` — OneSignal apps.
8
+ - `get_app` — App details by ID.
9
+ - `list_notifications` — Recent notifications for an app.
10
+
11
+ ## Source
12
+
13
+ [onesignal-mcp](https://github.com/mrfentmen/premium-mcps/tree/main/servers/onesignal-mcp)
package/dist/api.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ export declare class OneSignalError extends Error {
2
+ constructor(message: string);
3
+ }
4
+ export declare function errorMessage(e: unknown): string;
5
+ export declare function listApps(): Promise<string>;
6
+ export declare function getApp(appId: string): Promise<string>;
7
+ export declare function listNotifications(appId: string, limit?: string): Promise<string>;
package/dist/api.js ADDED
@@ -0,0 +1,47 @@
1
+ export class OneSignalError extends Error {
2
+ constructor(message) {
3
+ super(message);
4
+ this.name = "OneSignalError";
5
+ }
6
+ }
7
+ export function errorMessage(e) {
8
+ return e instanceof Error ? e.message : String(e);
9
+ }
10
+ const UA = { "User-Agent": "awesome-mcps/1.0" };
11
+ const BASE = "https://api.onesignal.com";
12
+ function userHeaders() {
13
+ const k = process.env.ONESIGNAL_USER_KEY;
14
+ if (!k)
15
+ throw new OneSignalError("Set ONESIGNAL_USER_KEY (free OneSignal tier).");
16
+ return { ...UA, Accept: "application/json", Authorization: `Basic ${k}` };
17
+ }
18
+ function appHeaders() {
19
+ const k = process.env.ONESIGNAL_APP_KEY;
20
+ if (!k)
21
+ throw new OneSignalError("Set ONESIGNAL_APP_KEY (OneSignal app REST API key).");
22
+ return { ...UA, Accept: "application/json", Authorization: `Basic ${k}` };
23
+ }
24
+ async function get(path, headers) {
25
+ let res;
26
+ try {
27
+ res = await fetch(BASE + path, { headers });
28
+ }
29
+ catch (e) {
30
+ throw new OneSignalError(`Network error: ${e.message}`);
31
+ }
32
+ if (!res.ok) {
33
+ const body = (await res.text()).slice(0, 300);
34
+ throw new OneSignalError(`HTTP ${res.status}: ${body}`);
35
+ }
36
+ return res.text();
37
+ }
38
+ export function listApps() {
39
+ return get("/apps", userHeaders());
40
+ }
41
+ export function getApp(appId) {
42
+ return get(`/apps/${encodeURIComponent(appId)}`, userHeaders());
43
+ }
44
+ export function listNotifications(appId, limit) {
45
+ const n = Math.min(Number(limit ?? 10) || 10, 50);
46
+ return get(`/notifications?app_id=${encodeURIComponent(appId)}&limit=${n}`, appHeaders());
47
+ }
@@ -0,0 +1 @@
1
+ export {};
package/dist/index.js ADDED
@@ -0,0 +1,12 @@
1
+ import { StdioServerTransport } from "@modelcontextprotocol/sdk/server/stdio.js";
2
+ import { createServer } from "./server.js";
3
+ async function main() {
4
+ const server = createServer();
5
+ const transport = new StdioServerTransport();
6
+ await server.connect(transport);
7
+ console.error("MCP server running on stdio");
8
+ }
9
+ main().catch((err) => {
10
+ console.error("Fatal error:", err);
11
+ process.exit(1);
12
+ });
@@ -0,0 +1,2 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ export declare function createServer(): McpServer;
package/dist/server.js ADDED
@@ -0,0 +1,58 @@
1
+ import { McpServer } from "@modelcontextprotocol/sdk/server/mcp.js";
2
+ import { z } from "zod";
3
+ import { errorMessage, listApps, getApp, listNotifications, } from "./api.js";
4
+ const text = (t) => ({ content: [{ type: "text", text: t }] });
5
+ const textError = (t) => ({ content: [{ type: "text", text: t }], isError: true });
6
+ const READ_ONLY = { readOnlyHint: true, openWorldHint: true };
7
+ const MUTATING = { readOnlyHint: false, openWorldHint: true };
8
+ export function createServer() {
9
+ const server = new McpServer({
10
+ name: "onesignal-mcp",
11
+ version: "1.0.0",
12
+ });
13
+ server.registerTool("list_apps", {
14
+ title: "List apps",
15
+ description: "OneSignal apps.",
16
+ inputSchema: z.object({}),
17
+ annotations: READ_ONLY,
18
+ }, async ({}) => {
19
+ try {
20
+ return text(await listApps());
21
+ }
22
+ catch (e) {
23
+ return textError(errorMessage(e));
24
+ }
25
+ });
26
+ server.registerTool("get_app", {
27
+ title: "Get app",
28
+ description: "App details by ID.",
29
+ inputSchema: z.object({
30
+ app_id: z.string().describe("OneSignal app ID.")
31
+ }),
32
+ annotations: READ_ONLY,
33
+ }, async ({ app_id }) => {
34
+ try {
35
+ return text(await getApp(app_id));
36
+ }
37
+ catch (e) {
38
+ return textError(errorMessage(e));
39
+ }
40
+ });
41
+ server.registerTool("list_notifications", {
42
+ title: "List notifications",
43
+ description: "Recent notifications for an app.",
44
+ inputSchema: z.object({
45
+ app_id: z.string().describe("OneSignal app ID."),
46
+ limit: z.string().describe("Max results (default 10, max 50).").optional()
47
+ }),
48
+ annotations: READ_ONLY,
49
+ }, async ({ app_id, limit }) => {
50
+ try {
51
+ return text(await listNotifications(app_id, limit));
52
+ }
53
+ catch (e) {
54
+ return textError(errorMessage(e));
55
+ }
56
+ });
57
+ return server;
58
+ }
package/package.json ADDED
@@ -0,0 +1,43 @@
1
+ {
2
+ "name": "onesignal-mcp",
3
+ "version": "1.0.0",
4
+ "description": "OneSignal push: apps and notifications. Needs keys.",
5
+ "type": "module",
6
+ "mcpName": "io.github.mrfentmen/onesignal-mcp",
7
+ "repository": {
8
+ "type": "git",
9
+ "url": "https://github.com/mrfentmen/premium-mcps.git"
10
+ },
11
+ "bin": {
12
+ "onesignal-mcp": "./dist/index.js"
13
+ },
14
+ "main": "./dist/index.js",
15
+ "files": [
16
+ "dist"
17
+ ],
18
+ "scripts": {
19
+ "build": "tsc -p tsconfig.json",
20
+ "start": "node dist/index.js",
21
+ "dev": "rm -rf dist && tsc -p tsconfig.json && node dist/index.js",
22
+ "inspect": "npx @modelcontextprotocol/inspector node dist/index.js"
23
+ },
24
+ "keywords": [
25
+ "mcp",
26
+ "onesignal",
27
+ "push",
28
+ "notifications",
29
+ "mobile"
30
+ ],
31
+ "license": "MIT",
32
+ "dependencies": {
33
+ "@modelcontextprotocol/sdk": "^1.0.4",
34
+ "zod": "^3.23.8"
35
+ },
36
+ "devDependencies": {
37
+ "@types/node": "^22.0.0",
38
+ "typescript": "^5.6.0"
39
+ },
40
+ "engines": {
41
+ "node": ">=20"
42
+ }
43
+ }