approval-mcpapp
Allows employees to request access to GitHub repositories with roles such as Read, Write, or Admin, and enables managers/IT to approve or reject requests.
Allows employees to request access to Jira projects with roles such as Viewer, Developer, or Project Lead, and enables managers/IT to approve or reject requests.
Allows employees to request access to Salesforce with roles such as Viewer, Editor, or Admin, and enables managers/IT to approve or reject requests.
Allows employees to request access to SAP systems with roles such as Finance Viewer, Finance Editor, or Admin, and enables managers/IT to approve or reject requests.
Click on "Install Server".
Wait a few minutes for the server to deploy. Once ready, it will show a "Started" state.
In the chat, type
@followed by the MCP server name and your instructions, e.g., "@approval-mcpappI need to request access to GitHub"
That's it! The server will respond to your query, and you can continue using it as needed.
Here is a step-by-step guide with screenshots.
Access Request & Approval Workflow — MCP App
An MCP (Model Context Protocol) server that implements a multi-stage employee access request and approval workflow. Employees request system access, and managers and IT admins review and approve or reject requests — all from within an MCP-compatible host like VS Code Copilot Chat.
Features
Multi-stage approval pipeline — Requested → Manager Review → IT Review → Granted/Rejected
Interactive UI panels — Rich React-based forms and dashboards served as MCP app resources
6 supported systems — GitHub, SAP, Production Database, Azure DevOps, Salesforce, Jira
Persistent storage — Azure Table Storage (Azurite emulator for local dev)
Related MCP server: HR Assistant Agent
Architecture
┌──────────────────────────────────────────────────┐
│ MCP Host (e.g. VS Code Copilot Chat) │
│ │
│ ┌─────────────┐ ┌──────────────┐ │
│ │ Request Form │ │ Approval │ │
│ │ (React) │ │ Panel (React)│ │
│ └──────┬───────┘ └──────┬───────┘ │
│ │ │ │
│ └────────┬───────┘ │
│ │ callServerTool │
└──────────────────┼────────────────────────────────┘
▼
┌─────────────────────────────────┐
│ MCP Server (Express) │
│ POST /mcp │
│ │
│ Tools: submit-request │
│ submit-decision │
│ get-request │
└──────────────┬──────────────────┘
│
▼
┌───────────────────┐
│ Azure Table │
│ Storage │
│ (Azurite local) │
└───────────────────┘Prerequisites
Node.js 22 or later
npm 10 or later
Getting Started
1. Install dependencies
npm install2. Start the Azurite storage emulator
In a separate terminal:
npm run start:azuriteThis starts the Azure Table Storage emulator on http://127.0.0.1:10002. Data is stored in the .azurite/ directory.
3. Seed sample data (optional)
npm run seedLoads three sample requests (REQ-001 through REQ-003) from fixtures/ so you can explore the app immediately.
4. Build and run
npm startThe MCP server starts at http://localhost:3001/mcp.
Development
Start the dev server with hot reload for both UI and backend:
npm run devThis runs concurrently:
UI watcher — Rebuilds HTML bundles on file changes in
ui/andsrc/Server watcher — Restarts the MCP server on backend file changes
Available Scripts
Command | Description |
| Full build + start the server |
| Type-check, build UI bundles, compile server TypeScript |
| Run the already-built server |
| Watch mode with hot reload |
| Start Azurite Table Storage emulator |
| Seed sample data into Azurite |
MCP Tools
Frontend Tools (return interactive UI)
request-access
Opens the access request form for employees.
Parameter | Type | Required | Description |
| string | No | Pre-fill the employee name |
| string | No | Pre-fill the employee email |
Example prompt: "I need to request access to GitHub"
approve-access
Opens the approval panel for managers and IT admins to review pending requests.
Parameter | Type | Required | Description |
| string | No | View a specific request, or leave blank to see all pending |
Example prompt: "Show me pending access requests to approve"
Backend Tools (called by UI widgets)
Tool | Parameters | Description |
|
| Creates a new access request |
|
| Records an approval or rejection |
|
| Fetches a single request by ID |
Workflow Stages
Each access request progresses through these stages:
┌───────────┐ ┌────────────────┐ ┌────────────┐ ┌─────────┐
│ Requested │───▶│ Manager Review │───▶│ IT Review │───▶│ Granted │
└───────────┘ └───────┬────────┘ └─────┬──────┘ └─────────┘
│ │
▼ ▼
┌──────────┐ ┌──────────┐
│ Rejected │ │ Rejected │
└──────────┘ └──────────┘Requested — Employee submits the form
Manager Review — Direct manager approves or rejects
IT Review — IT admin performs final review
Granted — Access is provisioned
Rejected — Request denied (can happen at either review stage)
Supported Systems and Roles
System | Available Roles |
GitHub | Read, Write, Admin |
SAP | Finance Viewer, Finance Editor, Admin |
Production Database | Read-Only, Read-Write, DBA |
Azure DevOps | Reader, Contributor, Project Admin |
Salesforce | Viewer, Editor, Admin |
Jira | Viewer, Developer, Project Lead |
Data Model
Access Request
{
"id": "REQ-001",
"employeeName": "Alice Johnson",
"employeeEmail": "alice@contoso.com",
"system": "GitHub",
"role": "Write",
"justification": "Need write access for the frontend repo",
"status": "Manager Review",
"createdAt": "2026-03-31T10:00:00.000Z",
"updatedAt": "2026-03-31T10:00:00.000Z",
"timeline": [
{
"stage": "Requested",
"status": "completed",
"actor": "Alice Johnson",
"timestamp": "2026-03-31T10:00:00.000Z"
},
{
"stage": "Manager Review",
"status": "current",
"timestamp": "2026-03-31T10:00:00.000Z"
}
]
}Environment Variables
Variable | Description | Default |
| HTTP server port |
|
| Azure Table Storage connection string | Azurite local default |
| Set to | — |
Project Structure
├── main.ts # Express app entry point, /mcp endpoint
├── server.ts # MCP server definition, tool/resource registration
├── mock-data/
│ └── requests.ts # Data access layer (Azure Table Storage)
├── src/
│ ├── global.css # Shared styles
│ ├── request-form/
│ │ └── App.tsx # Employee request form UI
│ └── approval-panel/
│ └── App.tsx # Manager/admin approval panel UI
├── ui/
│ ├── request-form.html # Entry HTML for request form
│ └── approval-panel.html # Entry HTML for approval panel
├── fixtures/
│ ├── access-requests.json # Sample request data for seeding
│ └── counters.json # Counter seed data
├── scripts/
│ └── seed-data.ts # Seed script for loading fixtures
├── vite.config.ts # Vite configuration
├── tsconfig.json # TypeScript config (type-checking)
├── tsconfig.server.json # TypeScript config (server compilation)
└── package.jsonTech Stack
Layer | Technology |
MCP Framework |
|
Server | Express 5, TypeScript |
UI | React 19, Fluent UI React v9 |
Storage | Azure Table Storage ( |
Local Emulator | Azurite |
Build | Vite, |
Validation | Zod |
This server cannot be installed
Maintenance
Resources
Unclaimed servers have limited discoverability.
Looking for Admin?
If you are the server author, to access and configure the admin panel.
Latest Blog Posts
- Your AI Chatbot Just Exposed Your CEO's Salary to an InternBy Om-Shree-0709 on .Agent IdentityMCP SecurityOAuth Delegation
- Why MCP Servers Need Execution Sandboxing (And Why Your Current Stack Isn't Enough)By Om-Shree-0709 on .Agentic AiPrompt InjectionWebAssembly
MCP directory API
We provide all the information about MCP servers via our MCP API.
curl -X GET 'https://glama.ai/api/mcp/v1/servers/groveale/approval-mcpapp'
If you have feedback or need assistance with the MCP directory API, please join our Discord server