Build and register your first server
You need JDK 25, Linux or macOS (Windows only through WSL2) and a checkout of mcp-server-template. The platform artifacts come from Maven Central, so no registry login is needed.
Create the server
Section titled “Create the server”-
Pick a system id: 2 to 31 lower case letters and digits, not one the contracts reserve (
gateway,broker,portal,adminand others). The examples usenotes. -
Build the template once. The generator reads the id pattern from the contracts jar:
Terminal window export JAVA_HOME="$(/usr/libexec/java_home -v 25)" # macOS; on Linux the JDK 25 directory./mvnw -B verify -
Generate the server:
Terminal window ./new-server.sh notesThis creates
../mcp-server-notes. Use./new-server.sh notes /path/to/dirto put it elsewhere; the target must not exist and must lie outside the template. -
Build the new server:
Terminal window cd ../mcp-server-notesgit init./mvnw -B verifyThe generated server builds and passes its tests without changes. The build also writes
mcp-app/target/mcp-manifest.json.
Run it and read the manifest
Section titled “Run it and read the manifest”-
Start the jar in the
devprofile. This profile serves plain HTTP on127.0.0.1:8080and accepts test keys, so run it only on your workstation, never in a container:Terminal window SPRING_PROFILES_ACTIVE=dev java -jar mcp-app/target/mcp-notes.jar -
Fetch the manifest. The path needs no token:
Terminal window curl -s http://127.0.0.1:8080/.well-known/mcp-manifestExpected: a JSON document with
serverIdmcp-notes,systemnotes, thecredentialblock,resourceTypes,policies,policiesHashand atoolslist. Until the manifest is built the server answers503. -
Check that every other path is closed:
Terminal window curl -s -o /dev/null -w '%{http_code}\n' -X POST http://127.0.0.1:8080/mcp \-H 'Content-Type: application/json' -H 'Accept: application/json, text/event-stream' \-d '{"jsonrpc":"2.0","id":1,"method":"tools/list"}'Expected:
401. Only a request with the gateway’s internal JWT gets through, see Authentication.
To call a tool without a platform, start LocalGateway in front of the server. The steps are in Write a server from the template.
Run it for the platform
Section titled “Run it for the platform”-
Fill in the three values in
deploy/server.env:Terminal window MCP_GATEWAY_JWKS_URI=https://<platform>/.well-known/mcp-jwks.jsonMCP_CONNECT_URL=https://<platform>/connections?system={system}MCP_NOTES_URL=https://<system host> -
Build the image and start it. A generated server has no published image yet, so build:
Terminal window cd deploydocker compose builddocker compose up -d -
Read the certificate fingerprint:
Terminal window docker compose logs mcp-notes | grep event=tls_certificateExpected:
event=tls_certificate source=generated fingerprint=sha256:... -
Check the health path:
Terminal window curl -fsSk https://localhost:8443/actuator/healthExpected:
{"status":"UP"...}.
The platform must reach this host on port 8443, and this host must reach https://<platform> on port 443.
Register it in the portal
Section titled “Register it in the portal”Registration is done by a platform administrator in the portal. Give them the address https://<this host>:8443/mcp and the fingerprint from step 10.
- Ask the administrator to add the system
notesand the server on the Servers page (the system first, see Systems). - Ask them to compare the fingerprint with the one the portal shows, then approve the connection, the policies and each tool. Until all three are approved the tools answer
tool_disabled.
Nothing in the platform restarts or changes configuration.
