MCP server
Let an AI assistant read a school's directory data through the Model Context Protocol. The server wraps the read-only operations of the API as tools.
What it is
A small program your MCP client (Claude Desktop, Claude Code or any other) starts on your own machine. It makes no decisions of its own: every tool call sends one GET request to the API with the access token you give it, and returns the answer unchanged. The assistant therefore sees exactly what that user sees in the product, and nothing more. It cannot create, change or delete anything.
Get access
The server needs the same credentials as the API. Flux issues them, and provides the server package with them: write to flux-support@fluxstudentdirectory.com to ask. Read the guide first for how access works.
Connect your client
Add the server to your MCP client's configuration (for Claude Desktop and Claude Code, an mcpServers block in its settings file):
{
"mcpServers": {
"flux-student-directory": {
"command": "npx",
"args": ["tsx", "/absolute/path/to/mcp-server/src/index.ts"],
"env": {
"FLUX_API_TOKEN": "<the access token issued for your application>",
"FLUX_API_BASE_URL": "https://studentdirectory.app"
}
}
}
}FLUX_API_TOKENis required. Without it the server refuses to start; it never makes an anonymous request.FLUX_API_BASE_URLis the bare site address,https://studentdirectory.app; the server adds/api/v1. It must usehttps(onlylocalhostmay use plainhttp), so the token is never sent unencrypted.- The server speaks MCP over standard input and output; your client starts and stops it.
Authentication
The token is a user's access token, the same credential the API reference describes, and it is sent as Authorization: Bearer on each request. Keep it in your client's local configuration only, never in a repository: it is as sensitive as that user's password. Tokens expire and the server does not refresh them. When calls start returning not_authenticated, supply a fresh token and restart the server (most clients do this when you restart them).
Errors
A refused call comes back as the API's error body, {"error":{"code":"...","message":"..."}}, so the assistant can explain why: for example not_authorized when the user may not see that school, or not_found when a feature is turned off for the school. Tools that take no arguments still expect an explicit empty arguments: {} if you script raw JSON-RPC calls; MCP clients do this for you.
Tools
One tool per operation. Each links to its entry in the API reference, which describes parameters and results. School and student identifiers come from get_me and the list tools.
| Tool | What it returns | API operation |
|---|---|---|
get_me | The signed-in user, the schools they belong to and their role at each. | GET /me |
get_my_contact | The user's own contact information. | GET /me/contact |
list_students | The school roster, optionally filtered by name or graduation year; set full to "true" for the complete payload. | GET /schools/{schoolId}/students |
get_student | One student's detail: contact information, guardians, and the caller's own star and note state. | GET /students/{studentId} |
get_student_note | The caller's own private note on a student. | GET /students/{studentId}/note |
list_map_markers | Map pins for the school, honoring each guardian's profile-visibility choice. | GET /schools/{schoolId}/map-markers |
list_lists | The caller's own custom lists at a school. | GET /schools/{schoolId}/lists |
get_list | One of the caller's lists and its members. | GET /lists/{listId} |
get_student_photo_url | A short-lived (five minute) signed URL for a student's photo. | GET /students/{studentId}/photo/download-url |
get_parent_photo_url | A short-lived (five minute) signed URL for a parent's photo. | GET /parents/{parentId}/photo/download-url |
list_menus | Every menu entry for the school. | GET /schools/{schoolId}/menus |
get_menus_week | One week's menus; start is a Sunday as YYYY-MM-DD. | GET /schools/{schoolId}/menus/week |
get_menus_day | One day's menus, all meal types; date is YYYY-MM-DD. | GET /schools/{schoolId}/menus/day |
list_calendar | Every calendar event of the school. | GET /schools/{schoolId}/calendar |
list_staff | The school's staff directory. | GET /schools/{schoolId}/staff |
list_documents | The Document Library entries visible to the caller. | GET /schools/{schoolId}/documents |
list_notices | The notices currently visible to the caller. | GET /schools/{schoolId}/notices |
get_school_features | Which features the school has turned on. | GET /schools/{schoolId}/features |
