1. Connect and discover
The first task is not to guess a device or a tool. It is to shake hands, and to read what the handshake carries.
Initialize the MCP session:
curl -i -X POST https://harborview.pilotagespec.org/mcp \
-H "Content-Type: application/json" \
-d '{
"jsonrpc": "2.0",
"id": 1,
"method": "initialize",
"params": {
"protocolVersion": "2025-11-25",
"capabilities": {
"extensions": {
"io.github.jafarsa0/pilotage": {}
}
},
"clientInfo": {
"name": "harborview-tutorial",
"version": "1.0"
}
}
}'The response carries two things worth reading.
The first is the instruction text, ordinary MCP. Harborview returns this exact sentence:
Harborview is a simulated smart building operable through the Pilotage extension. Call pilotage_manifest first, read the core guide, then follow the loop: catalog → draft → validate_flow → run_flow → trace_run.Useful, but it is prose, and prose is a hint.
The second is the contract. Inside the same response, under _meta and the extension key io.github.jafarsa0/pilotage, sits the manifest: the welcome card of the whole server. This is its genuine value, captured from the live handshake:
{
"manifest": {
"pilotage": "1.1",
"languages": [
{
"name": "buildingflow/1",
"title": "Harborview building flows",
"guides": "pilotage_get_guide",
"catalog": "pilotage_catalog",
"guides_resource": "pilotage://guides/buildingflow%2F1",
"catalog_resource": "pilotage://catalog/buildingflow%2F1",
"loop": {
"validate": "validate_flow",
"execute": "run_flow",
"trace": "trace_run"
},
"capabilities": {
"guides": true,
"catalog": {
"search": true
},
"validate": true,
"plan": true,
"execute": {
"test_run": true,
"idempotency": true
},
"trace_fetch": true
},
"locator": "json-pointer",
"execution": "both",
"trace": "full",
"retention": "session"
}
]
}
}Read the card slowly. Its one member, manifest, is the map of everything ahead:
- one Language exists,
buildingflow/1; - guides are read through
pilotage_get_guide, the catalog throughpilotage_catalog; - the
loopmember names the loop tools:validate_flowto check,run_flowto execute, andtrace_run, the trace fetch door; capabilitiescloses the feature set: plans exist, test runs exist, idempotency exists, and the fetch door exists (trace_fetch: true);locatorfixes the diagnostic dialect,execution: "both"allows immediate and deployed runs,trace: "full"is the richest trace the server can record, andretention: "session"says how long a run's record is kept.
This is the cold-start law: the welcome card arrives with the handshake, so an agent that has never seen this server is oriented before its first tool call. The whole game was known before move one.
The card is not a one-time message. pilotage_manifest, guaranteed on every Pilotage server, is the re-read door:
{"tool":"pilotage_manifest","arguments":{}}{
"pilotage": "1.1",
"languages": [
{
"name": "buildingflow/1",
"title": "Harborview building flows",
"guides": "pilotage_get_guide",
"catalog": "pilotage_catalog",
"guides_resource": "pilotage://guides/buildingflow%2F1",
"catalog_resource": "pilotage://catalog/buildingflow%2F1",
"loop": {
"validate": "validate_flow",
"execute": "run_flow",
"trace": "trace_run"
},
"capabilities": {
"guides": true,
"catalog": {
"search": true
},
"validate": true,
"plan": true,
"execute": {
"test_run": true,
"idempotency": true
},
"trace_fetch": true
},
"locator": "json-pointer",
"execution": "both",
"trace": "full",
"retention": "session"
}
]
}The tool returns the same card without the wrapper. Call it whenever orientation is in doubt.
The manifest is layer one of the loop, and it arrives with the handshake. It names the Language, the access tools, the loop tools, the capabilities, the locator dialect, the execution modes, the trace ceiling, and the retention boundary.
Nothing was guessed.
See Discovery and the manifest, Cold start, and Part III §3.