When mcp-server restarts, activeSessions is cleared but Claude.ai may
still hold the old session ID. Previously this fell to a generic 400 error.
Now returns 404 with clear re-initialize message so clients know to
create a fresh session.
Chronicler #89
Claude.ai upgraded to MCP protocol 2025-11-25 (Streamable HTTP) but Trinity Core
only supported the deprecated 2024-11-05 (HTTP+SSE) transport. This caused the
SSE connection to drop after initialize — tools/list never completed.
Changes:
- Add StreamableHTTPServerTransport alongside existing SSEServerTransport
- app.all('/mcp') handler detects protocol via mcp-session-id header
- Legacy SSE still works via GET /mcp (backwards compatible)
- New Streamable HTTP works via POST /mcp with session headers
- Version bump to 2.4.0
Chronicler #89
Arbiter changes:
- POST /api/internal/mcp/log endpoint in api.js
- MCP Logs admin route (/admin/mcp-logs) with filters, stats, pagination
- EJS view with expandable detail rows, server color badges
- Sidebar link under System group
Trinity Core v2.3.0:
- logToArbiter() function POSTs to Arbiter after every command
- Both MCP (Claude.ai) and REST (/exec) paths log with execution timing
- Async logging — doesn't block command response
Database:
- mcp_logs table created on Command Center (indexes on server, time, success)
Architecture:
Trinity Core → command → response + async POST → Arbiter → PostgreSQL → Trinity Console
Chronicler #78 | firefrost-services
- Added services/trinity-core/ with index.js, package.json, .gitignore
- v2.1.0 adds local self-execution (trinity-core can audit itself)
- Added executeLocal() function for localhost commands
- SERVERS object now includes trinity-core with local: true flag
- Version bumped from 2.0.0 to 2.1.0
- Previously lived only on Pi at ~/mcp-server/ with no backup
Deployment: Edit here, push to Gitea, curl raw file to Pi, restart service
Chronicler #78 | firefrost-services