Skip to main content
Glama
faisalhakim47

Termux Notification List MCP Server

README.md
# Termux Notification List MCP Server

A Model Context Protocol (MCP) server that provides access to Android notifications via Termux, enabling AI agents to monitor and read Android notifications in real-time.

## Features

- **Real-time notification monitoring**: Stream new notifications as they arrive
- **Current notification retrieval**: Get a snapshot of all active notifications
- **Filtering capabilities**: Filter notifications by package name or limit results
- **Clean notification data**: Structured JSON output with all notification metadata

## Prerequisites

- **Android device** with Termux installed
- **Termux API** app installed and configured
- **Node.js 18+** in Termux environment
- Proper permissions for notification access

### Setup Termux Environment

1. Install Termux and Termux:API from F-Droid or Google Play
2. Install required packages in Termux:
   ```bash
   pkg update && pkg upgrade
   pkg install nodejs termux-api
   ```
3. Grant notification access permissions to Termux:API in Android settings

## Installation

```bash
npm install termux-notification-list-mcp
```

Or build from source:

```bash
git clone <repository-url>
cd termux-notification-list-mcp
npm install
npm run build
```

## Usage

### As MCP Server (stdio)

Run the server directly:
```bash
npx termux-notification-list-mcp
```

Or use the built version:
```bash
node dist/stdio.js
```

### As SSE Server

The package can also run as an SSE server for web-based MCP clients:

```bash
npx termux-notification-list-mcp-sse
```

Or use the built version:
```bash
node dist/sse.js
```

The SSE server listens on port 3000 by default, configurable via PORT environment variable.

### Security Configuration

The SSE server includes several security features for remote access:

#### Environment Variables

- `MCP_AUTH_TOKEN`: Bearer token for authentication (required for production)
- `MCP_BASIC_USER`: Username for HTTP Basic Authentication
- `MCP_BASIC_PASS`: Password for HTTP Basic Authentication
- `ALLOWED_ORIGINS`: Comma-separated list of allowed CORS origins (default: `http://localhost:3000`)
- `PORT`: Server port (default: 3000)

#### Authentication

The server supports Bearer token, HTTP Basic Authentication, and query parameter authentication:

**Bearer Token Authentication:**
```bash
curl -H "Authorization: Bearer your-token" https://your-server:3000/sse
```

**Query Parameter Authentication (for EventSource/SSE):**
```bash
curl "https://your-server:3000/sse?token=your-token"
# Or in JavaScript EventSource:
# new EventSource('https://your-server:3000/sse?token=your-token')
```

**HTTP Basic Authentication:**
```bash
curl -u username:password https://your-server:3000/sse
```

Or with explicit header:
```bash
curl -H "Authorization: Basic $(echo -n 'username:password' | base64)" https://your-server:3000/sse
```

**Configuration:**
```bash
# Bearer token
export MCP_AUTH_TOKEN=your-secure-token

# Basic auth
export MCP_BASIC_USER=admin
export MCP_BASIC_PASS=secure-password
```

You can enable both authentication methods simultaneously for maximum compatibility.

#### Security Features

- **Rate Limiting**: 100 requests per 15 minutes per IP
- **CORS Protection**: Configurable allowed origins
- **Input Validation**: JSON payload validation
- **Helmet Security Headers**: XSS protection, HSTS, CSP
- **TLS 1.2+**: Strong cipher suites for HTTPS
- **Error Handling**: Secure error responses without information leakage

### Running as a Background Service in Termux

To run the SSE server indefinitely as a background service using runit:

#### Automated Setup

Run the provided setup script:
```bash
wget https://raw.githubusercontent.com/faisalhakim47/termux-notification-list-mcp/main/setup-service.sh
chmod +x setup-service.sh
./setup-service.sh
```

Note: After running the setup script, restart your Termux session or run `source $PREFIX/etc/profile` to use service management commands.

#### Manual Setup

1. Install termux-services:
   ```bash
   pkg install termux-services
   ```

2. Install the package globally:
   ```bash
   npm install -g termux-notification-list-mcp
   ```

3. Create the service directory:
   ```bash
   mkdir -p $PREFIX/var/service/termux-notification-mcp
   ```

4. Create the run script:
   ```bash
   cat > $PREFIX/var/service/termux-notification-mcp/run << 'EOF'
   #!/bin/sh
   exec termux-notification-list-mcp-sse
   EOF
   chmod +x $PREFIX/var/service/termux-notification-mcp/run
   ```

5. Enable and start the service:
   ```bash
   sv-enable termux-notification-mcp
   ```

The service will now run automatically and restart if it crashes. You can check its status with:
```bash
source $PREFIX/etc/profile  # If not already done
sv status termux-notification-mcp
```

Stop the service with:
```bash
sv down termux-notification-mcp
```

Restart the service with:
```bash
sv restart termux-notification-mcp
```

### Configuration for MCP Clients

Add to your MCP client configuration (e.g., Claude Desktop):

```json
{
  "mcpServers": {
    "termux-notifications": {
      "command": "npx",
      "args": ["termux-notification-list-mcp"]
    }
  }
}
```

For SSE clients, connect to `http://localhost:3000/sse`

## Available Tools

### `waitForNotification`

Start monitoring for new Android notifications. Returns immediately and sends notifications via server events as they arrive.

**Parameters:**
- `timeout` (optional): Number of seconds to monitor before automatically stopping

**Example:**
```typescript
// Monitor indefinitely
await client.callTool({
  name: 'waitForNotification',
  arguments: {}
});

// Monitor for 30 seconds
await client.callTool({
  name: 'waitForNotification',
  arguments: { timeout: 30 }
});
```

### `stopWaitingForNotification`

Stop monitoring for new notifications.

**Parameters:** None

**Example:**
```typescript
await client.callTool({
  name: 'stopWaitingForNotification',
  arguments: {}
});
```

### `getCurrentNotifications`

Retrieve all currently active Android notifications.

**Parameters:**
- `packageName` (optional): Filter notifications by specific app package name
- `limit` (optional): Limit the number of notifications returned (1-100)

**Example:**
```typescript
// Get all notifications
await client.callTool({
  name: 'getCurrentNotifications',
  arguments: {}
});

// Get notifications from a specific app
await client.callTool({
  name: 'getCurrentNotifications',
  arguments: { packageName: 'com.bca.mybca.omni.android' }
});

// Get first 5 notifications
await client.callTool({
  name: 'getCurrentNotifications',
  arguments: { limit: 5 }
});
```

## Notification Data Structure

Each notification contains the following fields:

```typescript
interface Notification {
  id: number;           // Unique notification ID
  tag: string;          // Notification tag
  key: string;          // Unique notification key
  group: string;        // Notification group
  packageName: string;  // App package name that created the notification
  title: string;        // Notification title
  content: string;      // Notification content/body
  when: string;         // Timestamp when notification was created
}
```

## Server Events

The server sends real-time notifications via MCP's notification system:

- **New Notification Event**: Sent when `waitForNotification` is active and a new notification arrives
- **Error Events**: Sent when monitoring encounters errors

## Best Practices

1. **Monitoring Lifecycle**: Always call `stopWaitingForNotification` when done monitoring to free resources
2. **Error Handling**: Handle cases where `termux-notification-list` command is not available
3. **Privacy**: Be mindful that this tool can access all Android notifications - implement appropriate access controls
4. **Performance**: Use `limit` parameter when you only need recent notifications

## Security Considerations

- This server provides access to all Android notifications, which may contain sensitive information
- Ensure proper authentication and authorization when deploying
- Consider implementing filtering or access controls for production use
- Follow the principle of least privilege

## Troubleshooting

### `termux-notification-list` command not found
- Ensure Termux:API is installed
- Verify `termux-api` package is installed: `pkg install termux-api`
- Check that notification permissions are granted in Android settings

### No notifications received
- Verify Termux:API has notification access permissions
- Check that there are active notifications to read
- Ensure the monitoring is actually started with `waitForNotification`

### Permission denied errors
- Grant all requested permissions to Termux:API in Android settings
- Restart Termux after granting permissions

## Development

### Building

```bash
npm run build
```

### Testing

```bash
npm test
```

### Running in Development

```bash
npx tsx app/cli.ts
```

## License

FSL-1.1-MIT - See LICENSE file for details.