Skip to main content
Glama
HassanGeesey

school-finance-mcp

by HassanGeesey

SchoolFinance MCP Server

A production-grade Model Context Protocol server for SchoolFinance, a single-user desktop school finance application. It exposes the entire school finance domain — students, classes, payments, income/expenses, reports, settings, notifications and a recycle bin — as MCP tools and resources, backed by a local SQLite database.

  • Single administrator (school owner), full access, no authentication

  • Synchronous SQLite via better-sqlite3 — no server, no runtime surprises

  • Zod-validated tool inputs and resource data

  • Structured JSON responses ({ success, data } / { success, error })

  • Soft deletes + recycle bin + audit log

  • CSV and JSON export

Tech stack

Piece

Choice

Language

TypeScript (strict), ESModules

MCP SDK

@modelcontextprotocol/sdk (McpServer)

Transport

stdio (spec-compliant JSON-RPC messages)

Database

SQLite file (schoolfinance.db) + better-sqlite3

Validation

zod v3

Related MCP server: Expense Tracker MCP Server

Getting started

npm install
npm run build        # compile TypeScript to dist/
npm start            # run the compiled server (stdio)

For development you can run the server directly with tsx:

npm run dev

The server speaks MCP over stdio, so it is driven by an MCP client. In an MCP client config:

{
  "mcpServers": {
    "school-finance": {
      "command": "node",
      "args": ["/path/to/school-finance-mcp/dist/index.js"],
      "env": { "DB_PATH": "/path/to/schoolfinance.db" }
    }
  }
}

Configuration

All configuration is via environment variables (see .env.example):

Variable

Default

Description

DB_PATH

./schoolfinance.db

SQLite database file location

BACKUP_DIR

./backups

Where backup_database writes files

LOG_LEVEL

info

debug | info | warn | error

Logs are written to stderr (MCP best practice) so the stdout protocol stream stays clean.

Tools

Dashboard

  • get_dashboard_stats — counts, outstanding balance, monthly revenue/expenses, recent activity

  • get_recent_activity — last 10 audit-log entries

  • get_financial_summary — month income/expenses/balance plus previous-month trend

Students

  • create_student / update_student / delete_student (soft) / restore_student

  • get_student — detail incl. payments + balance

  • search_students / list_students — query, filters, sort, pagination

Classes

  • create_class / update_class / delete_class / assign_student_to_class / list_classes

Payments

  • record_payment / edit_payment / delete_payment (soft)

  • get_payment_history / get_unpaid_students / get_overdue_students / get_student_balance

Income & Expenses

  • add_income / add_expense / update_transaction / delete_transaction

  • get_transaction_history / get_monthly_summary

Reports

  • generate_financial_report / generate_student_balance_report / generate_class_report

  • export_data — CSV or JSON for any resource

Settings

  • update_school_info / manage_payment_templates / set_academic_year

  • backup_database / restore_database

Notifications

  • get_pending_reminders / mark_reminder_completed

Recycle Bin

  • list_deleted_items / restore_deleted_item / permanently_delete_item

Resources

The schoolfinance://* namespace exposes live data:

schoolfinance://dashboard
schoolfinance://students
schoolfinance://classes
schoolfinance://payments
schoolfinance://income
schoolfinance://expenses
schoolfinance://reports
schoolfinance://settings
schoolfinance://notifications
schoolfinance://recycle-bin

Domain rules

  • A student's balance = class fee − total active payments. Balances are recalculated whenever payments or class fees change.

  • Overdue = outstanding balance and enrolment older than 30 days (documented heuristic for this single-user app).

  • Deleting a class with enrolled students is blocked — reassign students first.

  • delete_student, delete_payment and delete_transaction are soft deletes; items appear in the recycle bin.

  • income/expenses carry a deleted_at column (slightly beyond the spec's table list) because they are soft-deletable and recyclable.

Database

Schema is created idempotently on startup. Tables: classes, students, payments, income, expenses, settings, notifications, audit_log. WAL mode is enabled for durability and concurrent access safety.

Testing

npm test          # spawns the server and speaks real MCP over stdio

Tests use a throwaway database in the OS temp directory (see tests/setup.ts).

Project structure

src/
├── index.ts              # entry point
├── server.ts             # McpServer assembly, tool + resource registration
├── config/database.ts    # SQLite connection + schema
├── services/             # business logic (audit, students, classes, payments, ...)
├── schemas/              # Zod schemas for inputs and resource data
├── resources/templates/  # report template
├── utils/                # db, date, export, logging, response helpers
└── tools/                # MCP tool registrations

Connecting to MCP Clients

The server runs as a stdio process — the client spawns it, sends JSON-RPC messages over stdin, and reads responses from stdout. Below are step-by-step instructions for each client.

Prerequisites

Build the server first:

npm install
npm run build          # compiles to dist/index.js

Find the absolute path:

realpath dist/index.js   # e.g. /home/user/mcp-schoolfinance/dist/index.js
realpath schoolfinance.db # (or create a persistent DB path)

Claude Desktop

  1. Edit claude_desktop_config.json:

    • macOS: ~/Library/Application Support/Claude/claude_desktop_config.json

    • Windows: %APPDATA%\Claude\claude_desktop_config.json

    • Linux: ~/.config/Claude/claude_desktop_config.json

  2. Add the server:

{
  "mcpServers": {
    "school-finance": {
      "command": "node",
      "args": ["/absolute/path/to/school-finance-mcp/dist/index.js"],
      "env": {
        "DB_PATH": "/absolute/path/to/school-finance.db"
      }
    }
  }
}
  1. Restart Claude Desktop. The server will appear in Claude's MCP settings.

Claude Code (CLI / VS Code extension)

  1. Edit .opencode.jsonc or .claude.json in your project root:

{
  "mcp": {
    "school-finance": {
      "type": "stdio",
      "command": "node",
      "args": ["/absolute/path/to/school-finance-mcp/dist/index.js"],
      "env": { "DB_PATH": "/absolute/path/to/school-finance.db" }
    }
  }
}
  1. Or add to ~/.config/.opencode/mcp.json for all projects.

Cursor

  1. Open Settings → Cursor SettingsMCP tab (or search "MCP")

  2. Click "Add MCP Server"

  3. Enter:

    • Name: school-finance

    • Type: stdio

    • Command: node /absolute/path/to/school-finance-mcp/dist/index.js

    • Environment Variables: add DB_PATH/absolute/path/to/school-finance.db

ChatGPT (Desktop / web with ChatGPT Pro)

ChatGPT's desktop app supports MCP via mcp_config.json:

  1. Edit ~/.chatgpt/mcp_config.json (or the config path shown in-app)

  2. Add:

{
  "mcpServers": {
    "school-finance": {
      "command": "node",
      "args": ["/absolute/path/to/school-finance-mcp/dist/index.js"],
      "env": { "DB_PATH": "/absolute/path/to/school-finance.db" }
    }
  }
}
  1. Restart the ChatGPT desktop app.

VS Code (with MCP extension)

  1. Install the modelcontextprotocol.mcp extension (or use Claude/Copilot with MCP support)

  2. Edit .vscode/mcp.json:

{
  "servers": {
    "school-finance": {
      "type": "stdio",
      "command": "node",
      "args": ["/absolute/path/to/school-finance-mcp/dist/index.js"],
      "env": { "DB_PATH": "/absolute/path/to/school-finance.db" }
    }
  }
}

Using with OpenCode

Add to your OpenCode configuration to let the agent use SchoolFinance tools:

// ~/.config/opencode/opencode.jsonc
{
  "mcp": [
    {
      "name": "school-finance",
      "command": "node /absolute/path/to/school-finance-mcp/dist/index.js",
      "env": { "DB_PATH": "/absolute/path/to/school-finance.db" }
    }
  ]
}

Available Tools

Once connected, AI assistants can call these tools, for example:

# Create a class and add students
create_class(name="Grade 10A", year_level=10, fee_amount=1200, description="Morning class")
create_student(name="Ahmed Hassan", email="ahmed@example.com", phone="+252612345678", 
  address="Mogadishu, Somalia", class_id=1, enrollment_date="2025-09-01")

# Record a payment
record_payment(student_id=1, amount=500, payment_date="2025-09-15", 
  method="cash", reference="REC-001", notes="Partial payment")

# Check student balance
get_student_balance(student_id=1)

# Generate reports
generate_financial_report(start_date="2025-01-01", end_date="2025-12-31")
export_data(resource="students", format="csv")

Troubleshooting

Problem

Fix

Server doesn't appear

Check absolute paths in config, ensure npm run build was run

Database errors

Ensure DB_PATH points to a writable directory, or omit to use ./schoolfinance.db

"Cannot find module"

Run npm install in the project directory

Logs not visible

MCP clients may suppress stderr; check the client's log viewer

Port/resource conflicts

SQLite is file-based, no port conflicts — ensure the DB file is accessible

License

MIT

F
license - not found
-
quality - not tested
C
maintenance

Maintenance

Maintainers
Response time
Release cycle
Releases (12mo)
Commit activity

Resources

Unclaimed servers have limited discoverability.

Looking for Admin?

If you are the server author, to access and configure the admin panel.

Related MCP Servers

  • F
    license
    -
    quality
    D
    maintenance
    A Model Context Protocol (MCP) server for tracking personal expenses. This server provides tools to add, list, and summarize expenses, utilizing a local SQLite database for storage.
    Last updated
  • F
    license
    -
    quality
    C
    maintenance
    Custom MCP server connected to a read-only SQLite database, exposing a schema resource and a query tool for safe data retrieval.
    Last updated
  • F
    license
    -
    quality
    C
    maintenance
    A lightweight local MCP server for tracking personal or small-team expenses. It lets you add expense entries, list transactions within a date range, and generate simple summaries by category — all backed by a local SQLite database.
    Last updated

View all related MCP servers

Related MCP Connectors

  • Read-only MCP server for ClassQuill, a tutoring-business-management platform.

  • Hosted MCP server for Mini Accountant: invoices, expenses, customers, analytics, tax estimates.

  • MCP server for Zooza — class scheduling, attendance, and booking for activity businesses.

View all MCP Connectors

Latest Blog Posts

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/HassanGeesey/school-finance-mcp'

If you have feedback or need assistance with the MCP directory API, please join our Discord server