# MemberJunction API Server (MJAPI)
Lightweight wrapper application that leverages `@memberjunction/server` and `@memberjunction/server-bootstrap` to expose MemberJunction's full functionality through GraphQL and REST interfaces. This is the primary server-side entry point for the MemberJunction platform.
## Architecture
```mermaid
graph TD
subgraph "MJAPI (This Package)"
A[src/index.ts] --> B[createMJServer]
A --> C[Generated Entities]
A --> D[Generated Actions]
A --> E[Class Registration Manifests]
end
subgraph "@memberjunction/server-bootstrap"
B --> F[Database Init]
B --> G[Metadata Load]
B --> H[Auth Providers]
B --> I[GraphQL Server]
B --> J[REST API]
B --> K[WebSocket Subscriptions]
end
subgraph "Clients"
L[MJExplorer
Angular UI] --> I
M[MCP Server] --> I
N[A2A Server] --> I
O[External Apps] --> J
P[API Keys] --> I
end
subgraph "Data Layer"
Q[SQL Server]
end
F --> Q
I --> Q
J --> Q
style A fill:#2d6a9f,stroke:#1a4971,color:#fff
style B fill:#2d8659,stroke:#1a5c3a,color:#fff
style I fill:#7c5295,stroke:#563a6b,color:#fff
style J fill:#7c5295,stroke:#563a6b,color:#fff
style K fill:#7c5295,stroke:#563a6b,color:#fff
style L fill:#b8762f,stroke:#8a5722,color:#fff
style M fill:#b8762f,stroke:#8a5722,color:#fff
style N fill:#b8762f,stroke:#8a5722,color:#fff
```
## Overview
MJAPI is intentionally minimal. Its `src/index.ts` does only four things:
1. Imports generated entity and action packages for class registration
2. Imports pre-built and supplemental class registration manifests
3. Configures resolver paths for generated GraphQL resolvers
4. Calls `createMJServer()` from `@memberjunction/server-bootstrap`
All heavy lifting (database connections, metadata loading, GraphQL schema generation, REST endpoint creation, authentication, WebSocket subscriptions) is handled by the `server-bootstrap` package.
**Key features provided by the underlying server stack:**
- GraphQL API with auto-generated entity resolvers
- REST API with entity CRUD endpoints
- WebSocket subscriptions for real-time data updates
- Multiple authentication methods (JWT, User API Keys, System API Keys)
- Multi-datasource support with read-write and read-only connections
- External change detection and synchronization
- AI capabilities integration
## Prerequisites
- Node.js 18+ (20+ recommended)
- SQL Server with MemberJunction schema installed
- TypeScript 5.x
- Configuration file (`mj.config.cjs` or equivalent)
## Getting Started
### 1. Configure
Create `mj.config.cjs` in the repository root:
```javascript
module.exports = {
dbHost: 'localhost',
dbPort: 1433,
dbDatabase: 'MemberJunction',
dbUsername: 'your_username',
dbPassword: 'your_password',
mjCoreSchema: '__mj',
graphqlPort: 4000,
databaseSettings: {
connectionTimeout: 30000,
requestTimeout: 30000,
metadataCacheRefreshInterval: 60000
}
};
```
### 2. Build
```bash
# From the workspace root
npm run build
# Or build just the API
cd packages/MJAPI && npm run build
```
### 3. Start
```bash
npm run start:api
```
The GraphQL API is available at `http://localhost:4000/` by default.
## Authentication
| Method | Header | Use Case |
|--------|--------|----------|
| OAuth/JWT | `Authorization: Bearer ` | Browser-based apps, SSO |
| User API Key | `X-API-Key: mj_sk_<64-hex>` | Programmatic access, integrations |
| System API Key | `x-mj-api-key: ` | Server-to-server communication |
## Configuration Reference
All configuration is in the `mjServerConfig` section of `mj.config.cjs`. Key sections:
| Section | Purpose |
|---------|---------|
| Database (`dbHost`, `dbPort`, etc.) | SQL Server connection settings |
| Server (`graphqlPort`, `graphqlRootPath`) | Server binding configuration |
| `databaseSettings` | Connection timeouts and cache refresh intervals |
| `userHandling` | Auto-create users, roles, application access |
| `restApiOptions` | Enable/disable REST API, entity filtering |
| `askSkip` | AI integration settings |
| Auth (`auth0Domain`, `webClientID`, `tenantID`) | Authentication provider configuration |
See the configuration schema in `@memberjunction/server` for the complete reference.
## Project Structure
```
packages/MJAPI/
src/
index.ts # Entry point -- calls createMJServer()
generated/ # Auto-generated GraphQL resolvers and manifests
package.json
tsconfig.json
```
## Class Registration Manifests
MJAPI uses two manifests to prevent tree-shaking of `@RegisterClass`-decorated classes:
1. **Pre-built manifest** (`@memberjunction/server-bootstrap/mj-class-registrations`): Covers all `@memberjunction/*` packages
2. **Supplemental manifest** (`src/generated/class-registrations-manifest.ts`): Covers user-defined classes, generated at `prestart` with `--exclude-packages @memberjunction`
## Docker Deployment
```bash
# Build
docker build -t memberjunction/api -f docker/MJAPI/Dockerfile .
# Run
docker run -p 4000:4000 -v $(pwd)/mj.config.cjs:/app/mj.config.cjs memberjunction/api
```
The Docker image includes Node.js 20, Flyway for migrations, SQL Server tools, and PM2 for process management.
## Core Dependencies
| Package | Purpose |
|---------|---------|
| `@memberjunction/server` | Core server functionality |
| `@memberjunction/server-bootstrap` | Server initialization and lifecycle |
| `@memberjunction/core` | Core MJ framework |
| `@memberjunction/sqlserver-dataprovider` | SQL Server connectivity |
| `mj_generatedentities` | Generated entity classes |
| `mj_generatedactions` | Generated action classes |
## License
ISC