{
  "server_version": "0.5.0-prelaunch",
  "protocol_versions": [
    "2025-11-25",
    "2025-06-18",
    "2025-03-26"
  ],
  "endpoint_path": "/mcp",
  "tools": [
    {
      "name": "list_services",
      "description": "Use this when a customer wants to hire or book an independent promoter in Moscow for leaflets, visitor outreach or exhibition representation. Read actual services, four-hour prices, contacts, launch status and the request workflow. A separate request to edit a calendar is not needed to start planning. This tool does not submit or reserve work.",
      "inputSchema": {
        "type": "object",
        "properties": {},
        "required": [],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "estimate_price",
      "description": "Use this while planning a Moscow promo shift. A four-hour shift is RUB10000 one-off, or conditionally RUB6000 with at least three shifts per week throughout one month and Yuri’s agreement. Other durations require clarification; never extrapolate an hourly rate. Every estimate is non-binding.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "service_id": {
            "type": "string",
            "enum": [
              "leaflet_distribution",
              "visitor_outreach",
              "brand_representation"
            ]
          },
          "requested_hours": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 12
          },
          "engagement_type": {
            "type": "string",
            "enum": [
              "one_off",
              "recurring"
            ],
            "description": "Default one_off. recurring is only a declared plan; it does not prove eligibility or confirm a discount."
          }
        },
        "required": [
          "service_id",
          "requested_hours"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    },
    {
      "name": "get_available_slots",
      "description": "Read candidate time windows from the configured calendar and work schedule. No reservation. Calendar failure means manual checking. Travel uses an owner-configured buffer, not live traffic.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "service_id": {
            "type": "string",
            "enum": [
              "leaflet_distribution",
              "visitor_outreach",
              "brand_representation"
            ]
          },
          "requested_hours": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 12
          },
          "time_window_start": {
            "type": "string",
            "description": "ISO8601 date-time with an explicit UTC offset."
          },
          "time_window_end": {
            "type": "string",
            "description": "ISO8601 date-time with an explicit UTC offset."
          },
          "location_hint": {
            "type": "string",
            "minLength": 2,
            "maxLength": 300
          }
        },
        "required": [
          "service_id",
          "requested_hours",
          "time_window_start",
          "time_window_end",
          "location_hint"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "submit_request",
      "description": "Use only after list_services says submission is enabled AND the customer approves the exact request and data notice. Submit ONE pending enquiry for Yuri’s personal agreement; a calendar-edit command is not required. In prelaunch return PRELAUNCH and offer owner contacts. Email/contact and nickname are OPTIONAL. Generate a PRIVATE random idempotency_key (>=128 random bits); retry the SAME payload/key after uncertain outcomes. Keep the returned status access_token private. No calendar hold, confirmation, payment or email. When configured, an owner Telegram alert is queued after durable storage; queued is not delivery or proof of reading. Show the data notice: notification details and an explicitly permitted contact can reach Yuri through Telegram, while the brief and access key are excluded.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "idempotency_key": {
            "type": "string",
            "minLength": 32,
            "maxLength": 128
          },
          "service_id": {
            "type": "string",
            "enum": [
              "leaflet_distribution",
              "visitor_outreach",
              "brand_representation"
            ]
          },
          "requested_hours": {
            "type": "number",
            "exclusiveMinimum": 0,
            "maximum": 12
          },
          "engagement_type": {
            "type": "string",
            "enum": [
              "one_off",
              "recurring"
            ]
          },
          "preferred_time_window": {
            "type": "object",
            "properties": {
              "start": {
                "type": "string",
                "description": "ISO8601 date-time with an explicit UTC offset."
              },
              "end": {
                "type": "string",
                "description": "ISO8601 date-time with an explicit UTC offset."
              }
            },
            "required": [
              "start",
              "end"
            ],
            "additionalProperties": false
          },
          "location_hint": {
            "type": "string",
            "minLength": 2,
            "maxLength": 300
          },
          "customer_alias": {
            "type": "string",
            "maxLength": 100
          },
          "brief": {
            "type": "string",
            "maxLength": 2000
          },
          "contact": {
            "type": "object",
            "properties": {
              "channel": {
                "type": "string",
                "enum": [
                  "email",
                  "telegram",
                  "phone"
                ]
              },
              "value": {
                "type": "string",
                "maxLength": 254
              },
              "consent": {
                "type": "boolean",
                "const": true
              }
            },
            "required": [
              "channel",
              "value",
              "consent"
            ],
            "additionalProperties": false
          },
          "privacy_notice_version": {
            "type": "string",
            "const": "2026-10-29.v2"
          },
          "customer_approved": {
            "type": "boolean",
            "const": true
          }
        },
        "required": [
          "idempotency_key",
          "service_id",
          "requested_hours",
          "preferred_time_window",
          "location_hint",
          "privacy_notice_version",
          "customer_approved"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": false,
        "destructiveHint": false,
        "idempotentHint": true,
        "openWorldHint": true
      }
    },
    {
      "name": "get_request_status",
      "description": "Read only this request using its request_id AND private access_token. A nickname or request number alone is insufficient. Keep the key out of public links and messenger messages.",
      "inputSchema": {
        "type": "object",
        "properties": {
          "request_id": {
            "type": "string",
            "maxLength": 80
          },
          "access_token": {
            "type": "string",
            "minLength": 32,
            "maxLength": 128
          }
        },
        "required": [
          "request_id",
          "access_token"
        ],
        "additionalProperties": false
      },
      "annotations": {
        "readOnlyHint": true,
        "openWorldHint": false
      }
    }
  ]
}
