Feat/ts server cli#135
Open
kartikloops wants to merge 47 commits into
Open
Conversation
…xecution from python
…ave the pty marked alive
…ent double kill and stale exit codes
…r is not discarded
…pe sequences is not reinterpreted
…rtup failure cannot leave a creating zombie
… creates are not lost
…lock all creation
…annot be bypassed via catch/if/foreach or set x [exec ls]
…ion is not leaked
…ches in TerminateSessionTool
…ot silently dropped
…te-transition side effect
… the dead session from the map
…flect post-loop state
…eady empties the map
…s not retried with SIGTERM
… does not produce a silent 256x256 output
… commands are not exempt
…t can map config and interrupt failures to distinct exit codes
…exit timer so a hung graceful shutdown still exits after FORCE_EXIT_DELAY_SECONDS
…wn idempotence, and the force-exit timer
… --transport is http
…host/port validation error
…otations ported from server.py
…shuts down on signal or transport close
…re asserted to enumerate with correct annotations
…ing logging and server so settings validate before any logger is built and the CLI log level applies first
…ncurrent stateless clients do not collide on JSON-RPC request ids
a56fe6b to
3733c8a
Compare
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This PR adds the layer that actually boots the MCP server. The engine and all 10 tools already existed on
feat/ts-tools; this connects them to MCP transports, a CLI, and graceful shutdown so thatnode dist/main.js(and laternpx openroad-mcp) runs as a real server.The work is split across four files.
src/server.tsregisters all 10 tools with their Zod schemas and behavior annotations (ported straight from the Pythonserver.py) and runs them over either stdio or HTTP.src/config/cli.tsparses the command-line flags and rejects--host/--portunless you're on HTTP.src/utils/cleanup.tshandles SIGTERM/SIGINT, signals shutdown, and force-exits if a graceful stop hangs.src/main.tsties it together: parse the CLI, set up logging, run the server, and exit with sensible codes. Tests cover the CLI, the cleanup manager, and an in-memory server boot that confirms all 10 tools show up.HTTP runs in stateless mode with a fresh transport and server per request, because the SDK forbids reusing one transport and two clients numbering their requests from the same id would otherwise collide. Session continuity still works since sessions are keyed by our own
session_id, not the MCP transport. Inmain.ts, logging and server are imported dynamically (not statically) so that a bad env var fails cleanly instead of crashing during module load, and so the CLI log level is applied before any logger is built. Lastly,tsconfig.jsonflipsskipLibCheckto true: the SDK's HTTP transport types don't satisfy our strictexactOptionalPropertyTypes, so lib checking has to be skipped to use it. Our own source stays fully type-checked.Everything is verified: typecheck and lint are clean, all 420 tests pass with 85.7% line coverage, and the server was tested live in Cursor and it boots over stdio, lists all 10 tools, spawns a real OpenROAD process and runs commands, handles concurrent HTTP requests without collisions, and shuts down cleanly on Ctrl-C. A bad env var produces a clear configuration error and exit code 1.
To run it, build with
cd typescript && npm run build, then point your MCP client at it:{
"mcpServers": {
"openroad-mcp": {
"command": "node",
"args": ["/absolute/path/to/typescript/dist/main.js"]
}
}
}