Use A+ / PLUSSA from an MCP client: courses, deadlines, points, exercises, submissions, feedback, announcements, course material, and downloads. aplus_submit is the only write tool.
Configure this MCP in your MCP client (Claude Code, Windsurf, Cursor, Zed, OpenCode, or any other MCP-capable editor/agent):
mcp add aplus -- npx -y @ink-waffle/aplus-mcp(Assuming mcp is your client's MCP client management CLI — adjust for your editor.)
Ask your agent to run aplus_connect with your A+ site, for example plus2.tuni.fi. Log in if asked; the server stores the API token locally for later calls.
| tool | use it for |
|---|---|
aplus_connect, aplus_status, aplus_disconnect |
connect and manage sites |
aplus_courses, aplus_course |
list courses and see their full structure |
aplus_deadlines, aplus_points |
see due work and grades |
aplus_exercise, aplus_submission |
inspect an exercise or submission |
aplus_material |
read course pages as Markdown |
aplus_news |
read announcements |
aplus_download |
download a course file |
aplus_submit |
submit answers or files |
aplus_call |
make a read-only raw API request |
This MCP is designed to run beside @ink-waffle/moodle-mcp and @ink-waffle/sisu-mcp. All three use the sibling @ink-waffle/study-browser package when browser access is needed.
By default it creates and reuses one isolated Chrome profile:
~/.chrome-profiles-mcp/study-automation-profile
It starts Chrome with a local CDP endpoint when necessary. Sibling MCP processes reuse that browser instead of starting conflicting copies. The browser stays open until you close it.
Works on macOS, Windows, and Linux.
# Run as a persistent service (systemd, Windows Service, launchd, etc.):
npx -y @ink-waffle/aplus-mcp --port 8934# Then configure your MCP client to connect via HTTP:
mcp add --transport http aplus http://127.0.0.1:8934/mcpnpx -y @ink-waffle/aplus-mcp --cdp http://127.0.0.1:9222The MCP only attaches to an explicit CDP endpoint; it never starts or closes that browser. Use APLUS_MCP_CDP instead of --cdp with a service manager.
Tokens and cached data live in ~/.aplus-mcp/. Treat config.json as a password file. Downloads go to ~/.aplus-mcp/files/ unless you pass dest.