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 through pilotage_catalog;
  • the loop member names the loop tools: validate_flow to check, run_flow to execute, and trace_run, the trace fetch door;
  • capabilities closes the feature set: plans exist, test runs exist, idempotency exists, and the fetch door exists (trace_fetch: true);
  • locator fixes the diagnostic dialect, execution: "both" allows immediate and deployed runs, trace: "full" is the richest trace the server can record, and retention: "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:

Request
{"tool":"pilotage_manifest","arguments":{}}
Response
{
  "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.

What this taught

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.